hotstaq 0.8.21 → 0.8.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- var HotStaqWeb;(()=>{var __webpack_modules__={230:t=>{t.exports="object"==typeof self?self.FormData:window.FormData},646:function(t){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,s){if("undefined"!=typeof document){"number"==typeof(s=t({},r,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var l in s)s[l]&&(i+="; "+l,!0!==s[l]&&(i+="="+s[l].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+i}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var s=e[o].split("="),i=s.slice(1).join("=");try{var l=decodeURIComponent(s[0]);if(r[l]=n.read(i,l),t===l)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},300:(t,e)=>{"use strict";var n=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==n)return n;throw new Error("unable to locate global object")}();t.exports=e=n.fetch,n.fetch&&(e.default=n.fetch.bind(n)),e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response},507:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Hot=e.DeveloperMode=void 0;const s=n(732),i=n(243),l=n(967),a=o(n(646)),u=o(n(300)),c=n(70);var h;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(h=e.DeveloperMode||(e.DeveloperMode={}));class p{static include(t,e=null){return r(this,void 0,void 0,(function*(){if(!0===i.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hstqserve=nahfam")}p.echo(yield p.getFile(t,e))}))}static includeJS(t,e=null,o=null){return r(this,void 0,void 0,(function*(){const r=yield p.getFile(t,e);return!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g),eval.apply(o,[r])}))}static import(t,e=null,o=null){return r(this,void 0,void 0,(function*(){let r=p.CurrentPage.processor.getModule(t);if(null!=r)return r;const s=`./hotstaq_modules/${t}/index.js`,l=yield p.getFile(s,e);!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g);let a=new Function(l).apply(o);return null!=a.loadHTML&&(yield a.loadHTML()),p.CurrentPage.processor.addModule(t,a),a}))}static runFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=p.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);p.echo(r)}))}static getFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=null;"string"==typeof t?(n=new s.HotFile,n.name=t,!0===i.HotStaq.isWeb?n.url=t:n.localFile=t):n=t;let r=p.CurrentPage.processor.getFile(n.name,!1);return null!=r&&(n=r),yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n=c.HotEventMethod.POST,o={}){return r(this,void 0,void 0,(function*(){let r=null;if(null==p.CurrentPage)throw new Error("Current page is null!");if(null==p.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==p.CurrentPage.processor.api)throw new Error("Current page's processor api is null! Did you forget to set the API name or URL?");return null!=p.CurrentPage.processor.api&&(r=yield p.CurrentPage.processor.api.makeCall(t,e,n,o)),r}))}static getJSON(t){return r(this,void 0,void 0,(function*(){return p.jsonRequest(t,null,c.HotEventMethod.GET)}))}static jsonRequest(t,e=null,n=c.HotEventMethod.POST){return r(this,void 0,void 0,(function*(){try{let r={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};n===c.HotEventMethod.POST&&(r.body=JSON.stringify(e));let o=yield(0,u.default)(t,r);if(!1===o.ok)throw new Error(`${o.status}: ${o.statusText}`);return yield o.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e){return r(this,void 0,void 0,(function*(){return yield(0,u.default)(t,e)}))}static echo(t){p.Output+=t}static displayCSS(){for(let t=0;t<p.CSS.length;t++){let e=p.CSS[t],n=p.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),p.echo(n)}}static displayJSFiles(){for(let t=0;t<p.JSFiles.length;t++){let e=p.JSFiles[t],n=p.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),p.echo(n)}}static displayJSScripts(){for(let t=0;t<p.JSScripts.length;t++){let e=p.JSScripts[t],n=p.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),p.echo(n)}}}e.Hot=p,p.CurrentPage=null,p.Arguments=null,p.DeveloperMode=h,p.HotTestElement=l.HotTestElement,p.Mode=h.Production,p.API=null,p.TesterAPI=null,p.Output="",p.Data={},p.Cookies=a.default,p.PublicKeys={},p.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',p.CSS=[],p.JSFiles=[],p.JSScripts=[],p.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',p.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},233:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const s=o(n(300)),i=o(n(230)),l=n(810),a=n(761),u=n(70);var c;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(c=e.EventExecutionType||(e.EventExecutionType={})),e.HotAPI=class{constructor(t,e,n=null){if(null==e)throw new Error(`No server attached to api with baseUrl: ${t}`);this.connection=e,this.description="",this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=c.HotRoute,this.db=n,this.authCredentials=null,this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";if("string"==typeof t?(r=t,null==this.routes[r]&&(this.routes[r]=new a.HotRoute(this.connection,r)),"string"==typeof e?this.routes[r].addMethod(new u.HotRouteMethod(this.routes[r],e,n)):this.routes[r].addMethod(e)):(r=t.route,this.routes[t.route]=t),this.routes[r].connection=this.connection,!0===this.createFunctions){let t=this[r];null==t&&(t={});for(let e=0;e<this.routes[r].methods.length;e++){let n=this.routes[r],o=this.routes[r].methods[e];t[o.name]=(t,e)=>{let r=o.type,s=o.getRouteUrl(),i=null;if(null!=this.authCredentials&&(i=this.authCredentials),null!=o.authCredentials?i=o.authCredentials:null!=o.route.authCredentials&&(i=o.route.authCredentials),null==i&&"undefined"!=typeof Hot&&null!=Hot&&null!=Hot.API&&null!=Hot.API[n.route]&&null!=Hot.API[n.route].authCredentials&&(i=Hot.API[n.route].authCredentials),null!=i)for(let e in i){let n=i[e];null==t[e]&&(t[e]=n)}let l=[s,t,r,e];return this.makeCall.apply(this,l)}}this[r]=t}}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof l.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n=u.HotEventMethod.POST,o={}){return r(this,void 0,void 0,(function*(){let l=this.baseUrl;const a=n.toUpperCase();if("/"===l[l.length-1]&&(l=l.substr(0,l.length-1)),"/"!==t[0]&&(l+="/"),l+=t,Object.keys(o).length>0){if("POST"!==a)throw new Error("To upload files, you must set the httpMethod to POST.");const r=new i.default;for(let t in o)r.append(t,o[t]);let u=yield(0,s.default)(l,{method:"POST",body:r}),c=yield u.json();return null==e.hotstaq&&(e.hotstaq={}),null==e.hotstaq.uploads&&(e.hotstaq.uploads={}),e.hotstaq.uploads.uploadId=c.hotstaq.uploads.uploadId,yield this.makeCall(t,e,n)}let u={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};return"GET"!==a&&"HEAD"!==a&&(u.body=JSON.stringify(e)),new Promise(((t,e)=>{(0,s.default)(l,u).then((e=>r(this,void 0,void 0,(function*(){e.json().then((e=>{t(e)})).catch((t=>{throw new Error(`${l}: ${t.message}`)}))})))).catch((t=>{throw new Error(`${l}: ${t.message}`)}))}))}))}}},316:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotAsset=void 0,e.HotAsset=class{constructor(t,e=""){this.type=t,this.name=e,this.path="",this.content=""}load(){}output(){if(null==this.path&&null==this.content)throw new Error(`HotAsset ${this.name} of type ${this.type} does not have a path or content set!`);let t="";if(null!=this.path&&""!==this.path&&("js"===this.type&&(t=`<script type = "text/javascript" src = "${this.path}"><\/script>`),"css"===this.type&&(t=`<link href = "${this.path}" rel = "stylesheet" />`),"html"===this.type||"component"===this.type)){if(""===this.name)throw new Error("Loading an HTML or component asset requires a name to be set!");this.path,t={name:this.name,url:this.path}}if(null!=this.content&&""!==this.content){if("js"===this.type)throw new Error("Loading JS assets using content is not supported yet!");if("css"===this.type)throw new Error("Loading CSS assets using content is not supported yet!");if("html"===this.type){if(""===this.name)throw new Error("Loading an HTML asset requires a name to be set!");let e=JSON.stringify(this.content),n=this.path,r="";e=e.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),e=e.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=e,t={name:this.name,url:n,content:e}}}return t}}},957:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(810);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},260:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const r=n(243);e.HotComponent=class{constructor(t,e=null){t instanceof r.HotStaq||null==t?(this.processor=t,this.htmlElements=[],this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.observedAttributes=[],this.type="",this.value=null,this.inner=null,this.events={}):(this.processor=t.processor,this.htmlElements=t.htmlElements||[],this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.observedAttributes=t.observedAttributes||[],this.type=t.type||"",this.value=t.value||null,this.inner=t.inner||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return t}}},732:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const a=s(n(351)),u=l(n(300)),c=n(507);class h{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,u.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield h.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{a.readFile(this.localFile,((e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)}))}))}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,s=2){let i=e.exec(t),l=0,a="";for(;null!=i;){let u=i.index-o,c=e.lastIndex+s,h=t.substr(l,u-l);l=c,a+=r(h),a+=n(i[0]),i=e.exec(t)}return a+=r(t.substr(l)),a}static processNestedContent(t,e,n,r,o,s,i=2,l=1){let a=t.indexOf(e),u=0,c=t.indexOf(r,a),h="";for(;a>-1;){let p=t.indexOf(n,a),d=0;if(""!==r){let e=t.lastIndexOf(r,p-l);for(;e>-1&&e!==c;)e=t.lastIndexOf(r,e-l),d++}if(d>0){let r=t.indexOf(n,p+l),o=r;for(;r>-1&&d>0&&!(o<0)&&!(t.lastIndexOf(e,o-l)>r);)r=o,o=t.indexOf(n,r+l),d--;p=r}h+=s(t.substr(u,a-u)),h+=o(t.substr(a+i,p-(a+i))),a=t.indexOf(e,p+l),c=t.indexOf(r,a),u=p+l}return h+=s(t.substr(u)),h}static parseContent(t,e,n=null){null==n&&(n={outputCommands:!0,allowStringify:!0});let r="JSON.stringify (",o=")";return!1===n.allowStringify&&(r="",o=""),h.processContent(t,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),(t=>`${t=t.substr(2)}`),(t=>{if(""===t)return"";let s=h.processNestedContent(t,"!{","}","{",(t=>`*&&%*%@#@!${t}*&!#%@!@*!`),(t=>t)),i=h.processNestedContent(s,"STR{","}","{",(t=>{let s="";return s=!0===n.outputCommands?`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${e});*&!#%@!@*!`:`*&&%*%@#@!${r}${t}${o}, ${e});*&!#%@!@*!`,s}),(t=>t),4,1),l=h.processNestedContent(i,"${","}","{",(t=>{let r="";var o;return!0===n.outputCommands?(r=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo (\`\\\${${o=t,o.replace(/[`]/g,"\\`")}}\`);}*&!#%@!@*!`,!0===e&&(r=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`)):r=`*&&%*%@#@!${t}*&!#%@!@*!`,r}),(t=>t)),a="";c.Hot.Mode===c.DeveloperMode.Production&&(a=h.processNestedContent(l,"?(",")","(",(t=>""),(t=>t))),c.Hot.Mode===c.DeveloperMode.Development&&(a=h.processNestedContent(l,"?(",")","(",(t=>{let e="";try{JSON.parse(t),e=!0===n.allowStringify?JSON.stringify(t):`${t}`}catch(n){e=`${t}`}let r="";if(!0===n.outputCommands)r=`*&&%*%@#@!{\nconst testElm = createTestElement (${e});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`;else{let t=t=>{let e=null;try{let n=t;if("string"==typeof t&&(n=JSON.parse(t)),"string"==typeof n&&(e=new c.Hot.HotTestElement(n)),n instanceof Array&&(e=new c.Hot.HotTestElement(n[0],n[1],n[2])),null!=n.name&&(e=new c.Hot.HotTestElement(n)),null!=c.Hot.CurrentPage.testElements[e.name])throw new Error(`Test element ${e.name} already exists!`)}catch(e){throw new Error(`Error processing test element ${t} in ${c.Hot.CurrentPage.name}. Error: ${e.message}`)}return e};const n=t(e);r=`*&&%*%@#@!data-test-object-name = "${n.name}" data-test-object-func = "${n.func}" data-test-object-value = "${n.value}"*&!#%@!@*!`}return r}),(t=>t)));let u=h.processNestedContent(a,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",(t=>t),(t=>{let r="";r=!0===n.allowStringify?JSON.stringify(t):t;let o="";return o=!0===n.outputCommands?`echoOutput (${r}, ${e});\n`:r,o}),"*&&%*%@#@!".length,"*&!#%@!@*!".length);return u=u.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),u=u.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),u}),0)}process(t=null){return i(this,void 0,void 0,(function*(){let e=this.content;if(null!=t&&t instanceof Array)throw new Error(`In ${this.name}, the passed arguments received cannot be an array!`);c.Hot.Mode=this.page.processor.mode,c.Hot.Arguments=t,c.Hot.CurrentPage=this.page,c.Hot.PublicKeys=this.page.processor.publicKeys,c.Hot.API=this.page.getAPI(),c.Hot.TesterAPI=this.page.getTesterAPI();let n=h.parseContent(e,this.throwAllErrors),r=null;try{let e="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let n in t){let r="",o=t[n];r=`var ${n} = ${JSON.stringify(o)};\n`,e+=r}let o=this.name;""===o&&(o=this.localFile),""===o&&(o=this.url),e+='\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',e+=n,e+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(e);r=yield s.apply(this,[c.Hot,this])}catch(t){throw SyntaxError,t}c.Hot.Data=r.hot.Data;let o=r.output;return c.Hot.Output="",o}))}}e.HotFile=h},802:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(n=e.HotLogLevel||(e.HotLogLevel={})),e.HotLog=class{constructor(t=n.All){this.logLevel=t}static parse(t){let e=n.All;return"info"===t&&(e=n.Info),"warning"===t&&(e=n.Warning),"error"===t&&(e=n.Error),"verbose"===t&&(e=n.Verbose),"all"===t&&(e=n.All),"none"===t&&(e=n.None),e}log(t,e){this.logLevel===n.Verbose&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t!==n.Info&&t!==n.Verbose||this.info(e)),this.logLevel===n.All&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t===n.Info&&this.info(e)),this.logLevel===n.Error&&t===n.Error&&this.error(e),this.logLevel===n.Warning&&t===n.Warning&&this.warning(e),this.logLevel===n.Info&&t===n.Info&&this.info(e)}verbose(t){this.logLevel===n.Verbose&&("string"==typeof t?console.info(t):console.info(t()))}info(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Info||console.info(t)}warning(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Warning||console.warn(t)}error(t){if(this.logLevel===n.All||this.logLevel===n.Verbose||this.logLevel===n.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},202:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotModule=void 0;const o=n(507),s=n(316);e.HotModule=class{constructor(t){this.name=t,this.import=[],this.html=[],this.css=[],this.js=[],this.componentLibrary="",this.components=[]}outputCSS(t=!0){if(null==this.css)return;let e="";return this.outputAsset("css",this.css,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}outputJS(t=!0){if(null==this.js)return;let e="";return this.outputAsset("js",this.js,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}output(t,e=null){return r(this,void 0,void 0,(function*(){yield o.Hot.include(`${this.name}/${t}.hott`,e)}))}loadHTML(){return r(this,void 0,void 0,(function*(){if(null==this.html)return;let t={};this.outputAsset("html",this.html,(e=>{const n=e.output();if("string"==typeof n)throw new Error("HTML assets cannot be outputted using only a string!");t[n.name]=n})),yield o.Hot.CurrentPage.processor.loadHotFiles(t)}))}outputComponents(t=!0){if(null==this.components)return"";if(this.components.length<1)return"";let e='<script type = "text/javascript">',n="";null!=this.componentLibrary&&""!==this.componentLibrary&&(n=`${this.componentLibrary}.`);for(let t=0;t<this.components.length;t++)e+=`Hot.CurrentPage.processor.addComponent (${n}${this.components[t]});\n`;return e+="<\/script>",!0===t&&o.Hot.echo(e),e}outputAsset(t,e=[],n){for(let r=0;r<e.length;r++){let o=e[r],i=null;i=new s.HotAsset(t),"string"==typeof o?i.path=o:(null!=o.name&&(i.name=o.name),null!=o.path&&(i.path=o.path),null!=o.content&&(i.content=o.content)),n(i)}}}},136:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(507),s=n(243);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="HotTesterMochaSelenium",this.testerMap="",this.route="",this.components={},this.files=[],this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"HotTesterMochaSelenium",this.testerMap=t.testerMap||"",this.route=t.route||"",this.components=t.components||{},this.files=t.files||[],this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},761:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(70);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.description="",this.version="v1",this.prefix="",this.authCredentials=null,this.methods=n,this.errors={not_authorized:o.createError("Not authorized."),no_server_execute_function:o.createError("Missing server execute function.")}}static createError(t){return{error:t}}addMethod(t,e=null,n=r.HotEventMethod.POST,o=null){"string"==typeof t&&(t=new r.HotRouteMethod(this,t,e,n,null,null,null,o)),t instanceof r.HotRouteMethod||(null==t.route&&(t.route=this),t=new r.HotRouteMethod(t)),this.methods.push(t)}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},70:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.ServerRequest=e.HotEventMethod=void 0;const r=n(507),o=n(761),s=n(810);var i;!function(t){t.GET="get",t.POST="post",t.FILE_UPLOAD="file_upload_then_post_json",t.WEBSOCKET_CLIENT_PUB_EVENT="websocket_client_pub_event"}(i=e.HotEventMethod||(e.HotEventMethod={})),e.ServerRequest=class{constructor(t=null){null==t&&(t={}),this.req=t.req||null,this.res=t.res||null,this.wsSocket=t.wsSocket||null,this.authorizedValue=t.authorizedValue||null,this.jsonObj=t.jsonObj||null,this.queryObj=t.queryObj||null,this.files=t.files||null}},e.HotRouteMethod=class{constructor(t,e="",n=null,l=i.POST,a=null,u=null,c=null,h=null){let p=null;if(t instanceof o.HotRoute)p=t;else{if(p=t.route,null!=t.type&&(l=t.type),null!=t.name&&(e=t.name),null!=t.description&&(this.description=t.description),null!=t.returns&&("string"==typeof t.returns?this.returns={type:"string",required:!0,description:t.returns}:this.returns=t.returns),null!=t.parameters){this.parameters={};for(let e in t.parameters){let n=t.parameters[e];"string"==typeof n?this.parameters[e]={type:n,required:!1,description:""}:(null==n.type&&(n.type="string"),this.parameters[e]=n)}}null!=t.authCredentials&&(c=t.authCredentials),null!=t.onServerExecute&&(n=t.onServerExecute),null!=t.onServerAuthorize&&(a=t.onServerAuthorize),null!=t.onRegister&&(u=t.onRegister),null!=t.onPostRegister&&(this.onPostRegister=t.onPostRegister),null!=t.onServerExecute&&(this.onServerExecute=t.onServerExecute),null!=t.onClientExecute&&(this.onClientExecute=t.onClientExecute),null!=t.testCases&&(h=t.testCases)}if(""===e)throw new Error("All route methods must have a name!");if(this.route=p,this.name=e,this.type=l,this.isRegistered=!1,this.executeSetup=!1,this.authCredentials=c,this.onServerAuthorize=a,this.onRegister=u,this.testCases={},this.route.connection.processor.mode===r.DeveloperMode.Development&&null!=h)if(h instanceof Array)for(let t=0;t<h.length;t++){let e=h[t];if("string"==typeof e){const n=e,r=h[t+1];this.addTestCase(n,r),t++}else this.addTestCase(e)}else for(let t in h){let e=h[t];this.addTestCase(e)}this.route.connection instanceof s.HotServer&&(this.onServerExecute=n)}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.route.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}getRouteUrl(){if(null==this.route)throw new Error(`Route method ${this.name} does not have a parent route!`);let t="/";return""!==this.route.version&&(t+=`${this.route.version}/`),""!==this.route.prefix&&(t+=`${this.route.prefix}/`),""!==this.route.route&&(t+=`${this.route.route}/`),t+=this.name,t}}},810:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(243);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets",t[t.Generate=2]="Generate",t[t.WebTesting=3]="WebTesting",t[t.APITesting=4]="APITesting"}(s=e.HotServerType||(e.HotServerType={})),e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:5e3,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:5e3,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},243:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const ppath=__importStar(__webpack_require__(606)),node_fetch_1=__importDefault(__webpack_require__(300)),validate_npm_package_name_1=__importDefault(__webpack_require__(651)),HotPage_1=__webpack_require__(136),HotFile_1=__webpack_require__(732),HotLog_1=__webpack_require__(802),Hot_1=__webpack_require__(507),HotAsset_1=__webpack_require__(316),HotClient_1=__webpack_require__(957),HotTesterAPI_1=__webpack_require__(414),HotTestMap_1=__webpack_require__(985),HotTestDestination_1=__webpack_require__(473),HotStaqRegisterComponent_1=__webpack_require__(638),HotStaqWebStart_1=__webpack_require__(23);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.All),this.startDelay=0,this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.modules=t.modules||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\t{\n\t\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\t\tnewHotClient.api = newapi;\n\t\t\t\tprocessor.api = newapi;\n\t\t\t}",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\tfor (let key in HotStaqWeb)\n\t\t\twindow[key] = HotStaqWeb[key];\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tasync function hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%start_delay%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tprocessor.logger.logLevel = %logging_level%;\n\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.publicKeys={},this.testers={}}static parseBoolean(t){return"true"===(t=t.toLowerCase())||"false"!==t&&("yes"===t||"no"!==t&&"yep"===t)}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static executeError(t){if(null!=HotStaq.errors[t]){let e=HotStaq.errors[t].redirectToUrl;if(null!=e&&""!==e)return void(window.location.href=e);let n=HotStaq.errors[t].func;null!=n&&n(t)}}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addModule(t,e){this.modules[t]=e}getModule(t){return this.modules[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t,e=!0){if(null==this.files[t]){let n=t.indexOf("?hstqserve="),r=t;if(n>-1&&(r=t.substring(0,n)),null!=this.files[r])return this.files[r];if(!0===e)throw new Error(`Unable to find file ${t}`);return null}return this.files[t]}static keepContext(t,e,n){return function(){var r=Array.prototype.slice.call(arguments);return null!=n&&r.push(n),null==e?t.apply(this,r):t.apply(e,r)}}addComponent(t,e=null,n){let r=this.api;null!=e&&(r=e);let o=new t(this,r);if(null!=this.components[o.tag])throw new Error(`Component ${o.tag} already exists!`);this.components[o.tag]={componentType:t,processor:this,api:r},HotStaqRegisterComponent_1.registerComponent.call(this,o.tag,n)}static fixHTML(t){const e=t.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>"),n=(new DOMParser).parseFromString(`<xml>${e}</xml>`,"text/xml");let r="";if(n.documentElement.children.length>0){const e=n.documentElement.children[0].tagName.toLowerCase();"tr"===e&&(t=`<table>${t}</table>`,r="tbody"),"th"===e&&(t=`<table>${t}</table>`,r=e)}return{fixedStr:t,querySelector:r}}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=HotStaq.fixHTML(e),r=(new DOMParser).parseFromString(t.fixedStr,"text/html"),o=null;o=""===t.querySelector?r.body.children:r.querySelector(t.querySelector).children;let s=[];for(let t=0;t<o.length;t++){let e=o[t];s.push(n.appendChild(e))}return s}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t),r=!0;if(!1===n.validForNewPackages&&(r=!1),null!=n.errors&&n.errors.length>0&&(r=!1),!1===r&&!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`);return r}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}processHotSite(tester=null){return __awaiter(this,void 0,void 0,(function*(){HotStaq.checkHotSiteName(this.hotSite.name,!0);let routes=this.hotSite.routes;if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestDestination_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestDestination_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestDestination_1.HotTestDestination(n))}null!=tester?tester.testMaps[n]=r:this.logger.warning("A tester was not created first! You must specify one in the CLI.")}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,node_fetch_1.default)(componentUrl),ComponentClass=eval(res);this.addComponent(ComponentClass)}null==this.hotSite.routes&&(this.hotSite.routes={});let disableFileLoading=!1;null!=this.hotSite.disableFileLoading&&(disableFileLoading=this.hotSite.disableFileLoading),!1===disableFileLoading?yield this.loadHotFiles(this.hotSite.files,!1,!1):this.logger.verbose("Hotsite has file loading disabled..."),null!=tester&&this.addTester(tester),this.logger.verbose(`Processed HotSite ${this.hotSite.name}`)}))}loadHotSite(path){return __awaiter(this,void 0,void 0,(function*(){let jsonStr="";const ext=ppath.extname(path).toLowerCase();if(!0===HotStaq.isWeb){this.logger.verbose(`Downloading HotSite ${path}`);let t=yield(0,node_fetch_1.default)(path);this.logger.verbose(`Downloaded site ${path}`),jsonStr=t.text()}else{path=ppath.normalize(path),this.logger.verbose(`Accessing HotSite ${path}`);let HotIO=eval("require")("./HotIO").HotIO;jsonStr=yield HotIO.readTextFile(path),this.logger.verbose(`Accessed site ${path}`)}if(".yaml"===ext||".yml"===ext){if(!0===HotStaq.isWeb)throw new Error("YAML support for HotSites is not available on the web yet!");let yaml=eval("require")("yaml");this.hotSite=yaml.parse(jsonStr)}else this.hotSite=JSON.parse(jsonStr);if(null==this.hotSite)throw new Error(`HotSite ${path} cannot be null!`);this.hotSite.hotsitePath=path}))}saveHotSite(path){return __awaiter(this,void 0,void 0,(function*(){if(!0===HotStaq.isWeb)throw new Error("Cannot save a HotSite on the web!");const hotsiteStr=JSON.stringify(this.hotSite,null,2);let HotIO=eval("require")("./HotIO").HotIO;yield HotIO.writeTextFile(path,hotsiteStr),this.logger.verbose(`Saved site ${path}`)}))}loadHotFiles(t,e=!1,n=!0){return __awaiter(this,void 0,void 0,(function*(){this.logger.verbose("Loading Hott files...");for(let r in t){let o=t[r],s=null;HotStaq.isWeb,s=new HotFile_1.HotFile({name:r}),null!=o.url&&(!0===HotStaq.isWeb?s.url=`${o.url}?hstqserve=nahfam`:s.url=o.url),!1===HotStaq.isWeb&&null!=o.localFile&&(s.localFile=o.localFile);let i=!0;null!=o.content&&(s.content=o.content,i=!1),!0===e&&(i=!0),!1===n&&""!==s.url&&(i=!1),!0===i&&(this.logger.verbose(`Loading Hott file: ${s.url}`),yield s.load(),this.logger.verbose(`Finished loading Hott file: ${s.url}`)),this.addFile(s)}this.logger.verbose("Finished loading Hott files...")}))}generateContent(t,e="",n="./",r="./js/HotStaq.min.js",o=!0,s=null){return __awaiter(this,void 0,void 0,(function*(){let i="",l="",a="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=t.url&&(e=`"${t.url}"`),null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),l+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error(`Unable to find API ${e.api}`);if(e.api!==this.hotSite.server.globalApi){let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=t.url&&(n=`"${t.url}"`),null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),l+=r}}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicKeys)for(let t in this.hotSite.publicKeys){let e,n=this.hotSite.publicKeys[t];if("string"==typeof n)e=JSON.stringify(n);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=n.passSecretFromAPI&&(e=JSON.stringify(r.secrets[t]))}if(null!=n.env){const t=n.env;e=JSON.stringify(process.env[t])}}a+=`processor.publicKeys["${t}"] = ${e};\n`}}let u=this.pageContent;return u=yield(u=>__awaiter(this,void 0,void 0,(function*(){let c="",h="";this.mode===Hot_1.DeveloperMode.Development&&(c="tempMode = HotStaqWeb.DeveloperMode.Development;",null!=this.hotSite&&null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(h=this.testerApiContent,null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),h=h.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=new HotAsset_1.HotAsset("html",t);""!==e.localFile&&(n.path=e.localFile),""!==e.url&&(n.path=e.url),""!==e.content&&(n.path="",n.content=e.content);let r=yield n.output();if("string"==typeof r)throw new Error("During initial load, HTML assets cannot be outputted using only a string!");let o="",s="";null!=r.url&&(o=`"url": "${r.url}", `),null!=r.content&&(s=`"content": ${r.content}`),p+=`\t\t\tfiles["${r.name}"] = { ${o}${s} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}u=u.replace(/\%title\%/g,e),!0===o&&(u=u.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(u=u.replace(/\%args\%/g,JSON.stringify(s)));let d=t,f="",m="",g="HotTesterMochaSelenium";for(let t in this.testers){g=t;break}null!=this.hotSite&&(null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(f=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(m=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])&&(d=this.hotSite.routes[t].name);let _="";return 0!==this.startDelay&&(_=`await HotStaq.wait (${this.startDelay});`),u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=u.replace(/\%start\_delay\%/g,_)).replace(/\%logging\_level\%/g,`HotLogLevel.${HotLog_1.HotLogLevel[this.logger.logLevel]}`)).replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,c)).replace(/\%tester\_api\%/g,h)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,l)).replace(/\%public\_secrets\%/g,a)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${f}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${m}"`)})))(u),u}))}createExpressRoutes(t,e="./js/HotStaq.min.js"){return __awaiter(this,void 0,void 0,(function*(){for(let n in this.pages){let r=this.pages[n];const o=yield this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,((t,e)=>{this.logger.verbose("Sending custom Express content."),e.status(200).send(o)}))}}))}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite&&null!=this.hotSite.routes)for(let n in this.hotSite.routes)if(this.hotSite.routes[n].name===t){e=n;break}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);this.logger.verbose((()=>`Executing all API tests for tester ${t}. Maps: ${JSON.stringify(e)}`));for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let s=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(s),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({content:t.content});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e]});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static onReady(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t)}static useOutput(t){return __awaiter(this,void 0,void 0,(function*(){let e=(new DOMParser).parseFromString(t,"text/html");document.getElementsByTagName("html")[0].innerHTML=e.getElementsByTagName("html")[0].innerHTML;let n=document.getElementsByTagName("script");if(n.length>0){let t=[];for(let e=0;e<n.length;e++)t.push(n[e]);for(let e=0;e<t.length;e++){let n=document.createElement("script");t[e].parentNode.appendChild(n),t[e].parentNode.removeChild(t[e]),yield new Promise(((r,o)=>{n.onload=()=>{r()};let s=!1;null!=t[e].getAttribute("src")&&""!==t[e].getAttribute("src")&&(n.setAttribute("src",t[e].getAttribute("src")),s=!0),null!=t[e].getAttribute("type")&&""!==t[e].getAttribute("type")&&n.setAttribute("type",t[e].getAttribute("type")),n.innerHTML=t[e].innerHTML,!1===s&&r()}))}}}))}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static setupTesters(t,e){if(t.mode===Hot_1.DeveloperMode.Development&&null==t.testerAPI){null==e.testerAPIBaseUrl&&(e.testerAPIBaseUrl=""),""===e.testerAPIBaseUrl&&(e.testerAPIBaseUrl="http://127.0.0.1:8182");let n=new HotClient_1.HotClient(t),r=new HotTesterAPI_1.HotTesterAPI(e.testerAPIBaseUrl,n);r.connection.api=r,t.testerAPI=r}}static setupClientTesters(t){let e="";return t.mode===Hot_1.DeveloperMode.Development&&(e+='<script type = "text/javascript">\nfunction hotstaq_isDocumentReady ()\n{\nif (window["Hot"] != null)\n{\nif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n{\nlet func = function ()\n\t{\n\t\tif (Hot.TesterAPI != null)\n\t\t{\n\t\t\tlet testPaths = {};\n\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t{\n\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t}\n\n\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\ttesterMap: Hot.CurrentPage.testerMap,\n\t\t\t\t\tpageName: Hot.CurrentPage.name,\n\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t}).then (function (resp)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t});\n\t\t}\n\t};\n\nif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\tfunc ();\nelse\n\tdocument.addEventListener ("DOMContentLoaded", func);\n}\n}\n}\n\nhotstaq_isDocumentReady ();\n<\/script>'),e}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r,s.url.indexOf("hstqserve")<0&&(s.url+="?hstqserve=nahfam");let i=yield HotStaq.processUrl(s);i+=HotStaq.setupClientTesters(n),yield HotStaq.useOutput(i),o(n)}))))}))}))}static displayContent(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={content:""};s.name=null==e?"string"==typeof t?"":t.name:e,""===s.name&&(s.name="string"==typeof t?"":t.name),"string"==typeof t?s.content=t:(s.content=t.content,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r;let i=yield HotStaq.processContent(s);yield HotStaq.useOutput(i),o(n)}))))}))}))}}exports.HotStaq=HotStaq,HotStaq.version="0.8.21",HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null,HotStaq.errors={},"undefined"!=typeof document&&window.addEventListener("load",HotStaqWebStart_1.hotStaqWebStart)},638:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerComponent=void 0;const r=n(732),o=n(260),s=n(243),i=n(507);e.registerComponent=function(t,e){if(null==t||""===t)throw new Error("All components must have a tag!");if(void 0!==customElements.get(t))return;let n=this.components;customElements.define(t,class extends HTMLElement{constructor(){super();let e=n[t];if(this.component=new e.componentType(e.processor,e.api),this.hotComponent=this.component,this.component.htmlElements=[this],this.component.inner=this.innerHTML,null!=this.component.handleAttributes)this.component.handleAttributes(this.attributes);else for(let t=0;t<this.attributes.length;t++){const e=this.attributes[t],n=e.name.toLowerCase(),r=e.value;if("id"===n&&(this.component.name=r),"name"===n&&(this.component.name=r),"value"===n&&(this.component.value=r),n.indexOf("hot-")>-1){const t=n.substring(4);this.component[t]=r}}if(null!=this.component.onPreOutput&&!1===this.component.onPreOutput())return;let l=this.component.output();null!=this.component.onPostOutput&&(l=this.component.onPostOutput(l));let a=[];"string"==typeof l?a.push({html:l}):a=l instanceof Array?l:[l];for(let t=0;t<a.length;t++){let e=a[t],n=e.html,l="";null!=e.addFunctionsTo&&(l=e.addFunctionsTo);let u=r.HotFile.parseContent(n,!0,{outputCommands:!1});null!=this.component.onParsed&&(u=this.component.onParsed(u));let c={fixedStr:"",querySelector:""};c=null!=this.component.onFixHTML?this.component.onFixHTML(u):s.HotStaq.fixHTML(u);let h=[];for(let t=this.children.length-1;t>-1;t--){let e=this.children[t];h.push(this.removeChild(e))}let p=null,d=null;if(p=null!=this.component.onParseDOM?this.component.onParseDOM(c.fixedStr):(new DOMParser).parseFromString(c.fixedStr,"text/html"),p.body.children.length<1)throw new Error(`No component output from ${this.component.name} with tag ${this.component.tag}`);if(p.body.children.length>1){let t=!0;for(let e=0;e<p.body.children.length;e++){let n=p.body.children[e];if(n instanceof HTMLElement&&"parsererror"===n.tagName.toLowerCase()){d=n,t=!1;break}}if(!0===t)throw new Error(`Only a single html element can come from component ${this.component.name}, multiple elements were detected.`)}d=""===c.querySelector?p.body.children[0]:p.querySelector(c.querySelector),this.replaceWith(d),null!=this.component.click&&d.addEventListener("click",this.component.click.bind(this.component));for(let t in this.component.events){let e=this.component.events[t];d.addEventListener(e.type,e.func,e.options)}let f=Object.getOwnPropertyNames(this.component.constructor.prototype);for(let t=0;t<f.length;t++){let e=f[t];if("constructor"!==e&&"function"==typeof this.component[e]){let t=!0;for(let n in o.HotComponent.prototype)if(e===n){t=!1;break}!0===t&&(d[e]=s.HotStaq.keepContext(this.component[e],this.component),""!==l)&&(document.querySelector(l)[e]=s.HotStaq.keepContext(this.component[e],this.component))}}null!=this.component.onPrePlace&&(d=this.component.onPrePlace(d));let m=this.component.onCreated(d);if(null!=this.component.onParentPlace&&(m.onParentPlace=this.component.onParentPlace),m.hotComponent=this.component,this.component.htmlElements.push(m),null!=e.closestSelector){let t=m;for(;t;){let n=t.querySelector(e.closestSelector);if(null!=n){t=n;break}t=t.parentElement}if(null==t)throw new Error(`Unable to find closest node with selector '${e.closestSelector}'`);m.parentElement.removeChild(m),t.appendChild(m),null!=m.onParentPlace&&m.hotComponent.onParentPlace(parentNode,m)}if(null!=e.documentSelector){let t=document.querySelector(e.documentSelector);if(null==t)throw new Error(`Unable to find document node with selector '${e.documentSelector}'`);m.parentElement.removeChild(m),t.appendChild(m),null!=m.onParentPlace&&m.hotComponent.onParentPlace(t,m)}let g=(t,e,n)=>{let r=0;for(;r<10&&null!=t&&!(t instanceof HTMLHtmlElement);){let o=t.querySelectorAll(`hot-place-here[name="${e}"]`);if(o.length>0){let t=o[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}if(o.length<1){let r=t.querySelectorAll(`[hot-place-here="${e}"]`);if(r.length>0){let t=r[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}}t=t.parentNode,r++}return t};if(null!=e.placeHereParent){let t=m.parentNode;if(t=g(t,e.placeHereParent,m),null==t)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`)}for(let t=0;t<h.length;t++){const n=h[t];let r=!1;if(void 0!==n.getAttribute){let t=n.getAttribute("hot-place-parent");if(null!=t&&""!==t){let o=m;if(o=g(o,t,n),null==o)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`);r=!0}}!1===r&&m.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(m,n)}if(null!=this.component.onPostPlace){let t=this.component.onPostPlace(m.parentElement,m);null!=t&&(m=t)}if(void 0!==i.Hot&&null!=i.Hot.CurrentPage){let t="";null!=this.component.name&&(t=this.component.name),null!=t&&""!==t||(t=this.id),""!==t&&(i.Hot.CurrentPage.components[t]=this.component)}}}looseParseFromString(t,e){e=e.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>");const n=t.parseFromString("<xml>"+e+"</xml>","text/xml"),r=t.parseFromString("","text/html");for(let t of Array.from(n.documentElement.children))r.body.appendChild(t);for(let t of Array.from(r.querySelectorAll("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")))t.outerHTML="<"+t.outerHTML.slice(1).split("<")[0];return r}get observedAttributes(){return this.component.observedAttributes}},e)}},23:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.hotStaqWebStart=void 0;const Hot_1=__webpack_require__(507),HotClient_1=__webpack_require__(957),HotLog_1=__webpack_require__(802),HotStaq_1=__webpack_require__(243);function hotStaqWebStart(){let hotstaqElms=document.getElementsByTagName("hotstaq");if(HotStaq_1.HotStaq.isWeb=!0,void 0!==HotStaqWeb)for(let t in HotStaqWeb)window[t]=HotStaqWeb[t];if(hotstaqElms.length>0){let hotstaqElm=hotstaqElms[0];setTimeout((function(){return __awaiter(this,void 0,void 0,(function*(){let getAttr=(t,e)=>{for(let n=0;n<e.length;n++){let r=e[n];if(null!=t.getAttribute(r))return t.getAttribute(r);if(null!=t.getAttribute(`data-${r}`))return t.getAttribute(`data-${r}`)}},loadPage=getAttr(hotstaqElm,["load-page","loadPage","src"])||"",loggingLevel=getAttr(hotstaqElm,["logging-level","loggingLevel"])||null,startDelay=getAttr(hotstaqElm,["start-delay","startDelay"])||null,router=getAttr(hotstaqElm,["router"])||"",name=getAttr(hotstaqElm,["name"])||"default",args=getAttr(hotstaqElm,["args"])||null,apiLibrary=getAttr(hotstaqElm,["api-library","apiLibrary"])||null,apiName=getAttr(hotstaqElm,["api-name","apiName"])||null,apiUrl=getAttr(hotstaqElm,["api-url","apiUrl"])||null,testerName=getAttr(hotstaqElm,["tester-name","testerName"])||"HotTesterMochaSelenium",testerMap=getAttr(hotstaqElm,["tester-map","testerMap"])||null,testerApiBaseUrl=getAttr(hotstaqElm,["tester-api-base-url","testerApiBaseUrl"])||null,testerLaunchpadUrl=getAttr(hotstaqElm,["tester-launchpad-url","testerLaunchpadUrl"])||null,dontReuseProcessor=!1,passRawUrl=!1,htmlSource=hotstaqElm.innerHTML||"",routerManager={},routerWildcards=[],search=new URLSearchParams(window.location.search);null!=startDelay&&(yield HotStaq_1.HotStaq.wait(parseInt(startDelay))),null!=getAttr(hotstaqElm,["src"])&&(loadPage=getAttr(hotstaqElm,["src"])),null!=getAttr(hotstaqElm,["passRawUrl"])&&(passRawUrl=!0),null!=getAttr(hotstaqElm,["dont-reuse-processor","dontReuseProcessor"])&&(dontReuseProcessor=!0);let hstqbaseredirect=search.get("hstqbaseredirect");null!=hstqbaseredirect&&(hstqbaseredirect=decodeURI(hstqbaseredirect),window.history.replaceState("","",hstqbaseredirect),loadPage=hstqbaseredirect);let hotstaqErrors=document.getElementsByTagName("hotstaq-error");for(let t=0;t<hotstaqErrors.length;t++){let e=hotstaqErrors[t],n=getAttr(e,["status"]),r=getAttr(e,["unsupported-browser-redirect"]);null!=r?HotStaq_1.HotStaq.errors.unsupportedBrowser={redirectToUrl:r}:HotStaq_1.HotStaq.errors[`${n}`]={redirectToUrl:r}}try{eval("async () => {}")}catch(t){HotStaq_1.HotStaq.executeError("unsupportedBrowser")}if(""!==router){let t=document.getElementsByTagName("hotstaq-router");for(let e=0;e<t.length;e++){let n=t[e],r=getAttr(n,["name"]),o=getAttr(n,["serve-local","serveLocally"]);if(r===router){for(let t=0;t<n.childNodes.length;t++){let e=n.childNodes[t];if(e instanceof HTMLElement&&"ROUTE"===e.tagName.toUpperCase()){let t=getAttr(e,["path"]),n=getAttr(e,["redirect"]),r=getAttr(e,["base-redirect","baseRedirect"]),o=getAttr(e,["base"]),s=getAttr(e,["src"]);t.indexOf("*")>-1&&routerWildcards.push(t),routerManager[t]={redirect:n||void 0,baseRedirect:r||void 0,base:o||void 0,src:s||void 0}}}let t=window.location.pathname,e=window.location.pathname;if(null!=o){const n=o.toLowerCase();if("true"===n||"yes"===n||"1"===n){const n=t.lastIndexOf("/");n>-1&&(t=t.substring(n),e=e.substring(n))}}if(routerWildcards.length>0)for(let e=0;e<routerWildcards.length;e++){let n=routerWildcards[e],r=n.replace("*","");if(t.indexOf(r)>-1){t=n;break}}if(null!=routerManager[t]){if(null!=routerManager[t].redirect)return void(window.location.href=routerManager[t].redirect);if(null!=routerManager[t].baseRedirect){const n=window.location.search;let r="";return""!==n&&"?"!==n&&(r=`&${n.substring(1)}`),void(window.location.href=`${routerManager[t].baseRedirect}?hstqbaseredirect=${encodeURI(e+n)}${r}`)}null!=routerManager[t].src&&(loadPage=routerManager[t].src)}break}}}args=null!=args?JSON.parse(args):Hot_1.Hot.Arguments;let hasHtmlSource=!1;if(""!==htmlSource){const t=htmlSource.replace(/\s/g,"");""!==t&&(hasHtmlSource=!0)}let tempMode=0;null!=window.Hot&&(tempMode=Hot_1.Hot.Mode);let processor=null;!1===dontReuseProcessor&&void 0!==Hot_1.Hot&&null!=Hot_1.Hot.CurrentPage&&null!=Hot_1.Hot.CurrentPage.processor&&(processor=Hot_1.Hot.CurrentPage.processor),null==processor&&(processor=new HotStaq_1.HotStaq),null!=loggingLevel&&(processor.logger.logLevel=HotLog_1.HotLog.parse(loggingLevel)),processor.mode=tempMode;let options={name,processor,args};if(""!==loadPage&&(!1===passRawUrl&&loadPage.indexOf("hstqserve")<0&&(loadPage+="?hstqserve=nahfam"),options.url=loadPage),null!=testerMap&&(options.testerMap=testerMap,options.testerName=testerName),null!=testerName&&(options.testerName=testerName),null!=testerApiBaseUrl&&(options.testerAPIBaseUrl=testerApiBaseUrl),null!=testerLaunchpadUrl&&(options.testerLaunchpadUrl=testerLaunchpadUrl),null!=apiName){let t=new HotClient_1.HotClient(processor);if(""===apiUrl)throw new Error("api-url was not set!");let e=window;null!=apiLibrary&&(e=window[apiLibrary]);let n=new e[apiName](apiUrl,t);n.connection.api=n,processor.api=n}if(!1===hasHtmlSource){if(""===loadPage)throw new Error("The hotstaq tag must have a src, HTML contents inside it, or a router set.");HotStaq_1.HotStaq.displayUrl(options)}else HotStaq_1.HotStaq.displayContent(options)}))}),50)}}exports.hotStaqWebStart=hotStaqWebStart},473:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDestination=void 0;class n{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof n?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=n},628:function(t,e){"use strict";var n=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0,e.HotTestDriver=class{constructor(t,e=null){this.processor=t,this.page=e,this.commandDelay=20,this.persistentData={}}parseTestObject(t){let e=t.indexOf("*"),n="";e>-1&&(t=t.replace(/\*/,""),n="*");let r=`[data-test-object-name${n}='${t}']`;return e=t.indexOf(">"),e>-1&&(r=t=t.replace(/\>/,"")),r}wait(t){return n(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}print(t){return n(this,void 0,void 0,(function*(){process.stdout.write(t)}))}println(t){return n(this,void 0,void 0,(function*(){yield this.print(`${t}\n`)}))}destroy(){return n(this,void 0,void 0,(function*(){}))}assert(t,e=""){return n(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}}},967:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0,e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}},e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},985:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=void 0;const r=n(473);e.HotTestMap=class{constructor(t=[],e={},n=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let n=t[e];this.destinations.push(new r.HotTestDestination(n))}}else{this.destinations={};for(let e in t){let n=t[e];this.destinations[e]=new r.HotTestDestination(n)}}this.destinationOrder=n,this.pages=e}}},677:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(243);class s{constructor(t,e,n,r,o={}){if(null==o)throw new Error("The testMaps parameter can be an empty object, but cannot be null! It is set to null.");this.processor=t,this.name=e,this.timeout=1e4,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1}setup(t,e,n){return r(this,void 0,void 0,(function*(){}))}destroy(){return r(this,void 0,void 0,(function*(){}))}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}getTestPage(t){return this.testMaps[t.mapName].pages[t.page]}getTestPath(t,e){return this.testMaps[t.mapName].pages[t.page].testPaths[e]}static interpretDestination(t,e){let n={mapName:t,page:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0];if(o.length<2)return null;if("/"===o[0]&&"/"===o[1])return null;let s=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.page=s(o,"page:"),n.api=s(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=s(e,"dest:"),o.cmd=s(e,"cmd:"),o.path=s(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,s=!1){return r(this,void 0,void 0,(function*(){let r=!0;if(null==e)throw new Error(`Trying to access null method on destination map ${t.mapName}.`);!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: API Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,s=n.getMethod(o),i=t.paths[r+1].path;if(null==s)throw new Error(`Unable to find method related to path ${o} in map ${t.mapName}`);let l=yield this.executeTestAPIPath(t,s,i);e.push(l)}return e}))}executeTestPagePath(t,e,n=!1,o=!1){return r(this,void 0,void 0,(function*(){let r=!0,s=this.testMaps[t.mapName];if(null==s)throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);let i=s.pages[t.page];if(null==i)throw new Error(`HotTester: Page ${t.page} does not exist!`);this.driver.page=i;let l=e.path,a=i.testPaths[l];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,i,e,o));let u=null;if(!0===r){if(null==a)throw new Error(`HotTester: Test path ${l} does not have a function!`);u=yield a(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,a,u,o)),u}))}executeCommand(t,e,n,s){return r(this,void 0,void 0,(function*(){let i=(t,e,r)=>{let o=!1;n.cmd===e&&(o=!0);const s=n.cmd.indexOf("(");return s>-1&&n.cmd.substr(0,s)===e&&(o=!0),o},l=t=>{let e=[],n=t.match(/(?=\()(.*?)(?=\))/g);if(null!=n){let t=n[0];t=t.substr(2,t.length),e.push(t)}if(e.length<1)throw new Error(`HotTester: Command ${t} requires arguments, but none were supplied.`);return e},a=null,u=null,c=[];if("undefined"!=typeof HotTesterMochaSelenium&&this instanceof HotTesterMochaSelenium&&(a=this),null!=a&&(!0===i(n.cmd,"url")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield a.driver.navigateToUrl(e)}))),!0===i(n.cmd,"waitForTestObject")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=JSON.parse(t[0]);yield a.driver.waitForTestElement(e)})))),!0===i(n.cmd,"waitForTesterAPIData")&&(u=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===i(n.cmd,"wait")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===i(n.cmd,"print")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===i(n.cmd,"println")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),null==u)throw new Error(`HotTester: Command ${n.cmd} does not exist!`);yield this.onCommand(t,e,n,s,c,u)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let i=t.paths[o],l=null,a=r.pages[t.page];if(null==a)throw new Error(`HotTester: Page ${t.page} does not exist!`);if(""!==i.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[i.dest],n=s.interpretDestination(t.mapName,e);null!=n&&(l=yield this.executeTestPagePaths(n))}""!==i.cmd&&(yield this.executeCommand(t,a,i,i.cmd)),""!==i.path&&(l=yield this.executeTestPagePath(t,i,!1,e)),n.push(l)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);this.processor.logger.verbose(`HotTester: Executing map ${t}...`);let n=this.processor.getRouteKeyFromName(t),o="";this.baseUrl,""!==n&&(o=`${this.baseUrl}${n}`);let i=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1!==e.autoStart)try{this.processor.logger.verbose((()=>`HotTester: Executing ${t} destination ${JSON.stringify(e)}...`));let r=s.interpretDestination(t,e),i=!1,l=!0;""!==r.page&&(i=!0),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(i,o,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(l=yield this.onTestStart(r,o,n)),!0===l&&(""!==r.page&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}catch(t){throw t}}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let n=e.destinations[t];yield i(n)}else if(e.destinationOrder.length>0){let t=[];for(let n=0;n<e.destinationOrder.length;n++){let r=e.destinationOrder[n],o=e.destinations[r];if(null==o)throw new Error(`HotTester: Destination ${r} does not exist!`);t.push(r),yield i(o,r)}for(let n in e.destinations){let r=!0;for(let e=0;e<t.length;e++)if(t[e]===n){r=!1;break}if(!0===r){let t=e.destinations[n];yield i(t,n)}}}else for(let t in e.destinations){let n=e.destinations[t];yield i(n,t)}}))}}e.HotTester=s},414:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(233),HotRoute_1=__webpack_require__(761),HotRouteMethod_1=__webpack_require__(70);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod({name:"pageLoaded",onServerExecute:this.pageLoaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"string",description:"The tester map executing the test."},pageName:{required:!0,type:"string",description:"The name of the page executing the test."},testElements:{required:!0,type:"array",description:"The test elements on the page."},testPaths:{required:!0,type:"array",description:"The test paths on the page."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"executeTests",onServerExecute:this.executeTests,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"object",description:"The tester map to execute."}},returns:"Returns true when tests are complete."}),r.addMethod({name:"heartbeat",type:HotRouteMethod_1.HotEventMethod.GET,onServerExecute:this.heartbeat,returns:"Returns true as an acknowledgement."}),this.addRoute(r)}pageLoaded(request){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:request.jsonObj.testerName,testerMap:request.jsonObj.testerMap,pageName:request.jsonObj.pageName,testElements:request.jsonObj.testElements,testPathsStrs:request.jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testerMap&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerName} does not exist!`);let testMap=tester.testMaps[testerObj.testerMap];if(null==testMap)throw new Error(`TesterAPI: Tester map ${testerObj.testerMap} does not exist!`);return testMap.pages[testerObj.pageName]={testElements:{},testPaths:{}},testMap.pages[testerObj.pageName].testElements=testerObj.testElements,testMap.pages[testerObj.pageName].testPaths=testPaths,tester.finishedLoading=!0,null!=tester.onFinishedLoading&&(yield tester.onFinishedLoading()),!0}))}executeTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=t.jsonObj.testerName,n=t.jsonObj.testerMap;if(null==e||null==n)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===e||""===n)throw new Error("TesterAPI: Not all required json objects were passed.");let r=this.connection;return null!=r.executeTests&&(yield r.executeTests(e,n)),!0}))}heartbeat(t){return __awaiter(this,void 0,void 0,(function*(){return!0}))}}exports.HotTesterAPI=HotTesterAPI},651:t=>{"use strict";t.exports={}},351:()=>{},606:()=>{}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(n.exports,n,n.exports,__webpack_require__),n.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var __webpack_exports__={};(()=>{"use strict";var t=__webpack_exports__;Object.defineProperty(t,"__esModule",{value:!0}),t.HotTestDriver=t.HotTestElementOptions=t.HotTestElement=t.HotTestDestination=t.HotTestMap=t.HotTesterAPI=t.HotTester=t.HotClient=t.HotServerType=t.HotServer=t.ServerRequest=t.HotEventMethod=t.HotRouteMethod=t.HotRoute=t.HotPage=t.HotLogLevel=t.HotLog=t.HotFile=t.EventExecutionType=t.HotAPI=t.HotComponent=t.DeveloperMode=t.HotAsset=t.HotModule=t.Hot=t.HotStaq=void 0;const e=__webpack_require__(243);Object.defineProperty(t,"HotStaq",{enumerable:!0,get:function(){return e.HotStaq}});const n=__webpack_require__(507);Object.defineProperty(t,"Hot",{enumerable:!0,get:function(){return n.Hot}}),Object.defineProperty(t,"DeveloperMode",{enumerable:!0,get:function(){return n.DeveloperMode}});const r=__webpack_require__(316);Object.defineProperty(t,"HotAsset",{enumerable:!0,get:function(){return r.HotAsset}});const o=__webpack_require__(202);Object.defineProperty(t,"HotModule",{enumerable:!0,get:function(){return o.HotModule}});const s=__webpack_require__(260);Object.defineProperty(t,"HotComponent",{enumerable:!0,get:function(){return s.HotComponent}});const i=__webpack_require__(732);Object.defineProperty(t,"HotFile",{enumerable:!0,get:function(){return i.HotFile}});const l=__webpack_require__(802);Object.defineProperty(t,"HotLog",{enumerable:!0,get:function(){return l.HotLog}}),Object.defineProperty(t,"HotLogLevel",{enumerable:!0,get:function(){return l.HotLogLevel}});const a=__webpack_require__(136);Object.defineProperty(t,"HotPage",{enumerable:!0,get:function(){return a.HotPage}});const u=__webpack_require__(233);Object.defineProperty(t,"HotAPI",{enumerable:!0,get:function(){return u.HotAPI}}),Object.defineProperty(t,"EventExecutionType",{enumerable:!0,get:function(){return u.EventExecutionType}});const c=__webpack_require__(761);Object.defineProperty(t,"HotRoute",{enumerable:!0,get:function(){return c.HotRoute}});const h=__webpack_require__(70);Object.defineProperty(t,"HotRouteMethod",{enumerable:!0,get:function(){return h.HotRouteMethod}}),Object.defineProperty(t,"HotEventMethod",{enumerable:!0,get:function(){return h.HotEventMethod}}),Object.defineProperty(t,"ServerRequest",{enumerable:!0,get:function(){return h.ServerRequest}});const p=__webpack_require__(810);Object.defineProperty(t,"HotServer",{enumerable:!0,get:function(){return p.HotServer}}),Object.defineProperty(t,"HotServerType",{enumerable:!0,get:function(){return p.HotServerType}});const d=__webpack_require__(957);Object.defineProperty(t,"HotClient",{enumerable:!0,get:function(){return d.HotClient}});const f=__webpack_require__(628);Object.defineProperty(t,"HotTestDriver",{enumerable:!0,get:function(){return f.HotTestDriver}});const m=__webpack_require__(967);Object.defineProperty(t,"HotTestElement",{enumerable:!0,get:function(){return m.HotTestElement}}),Object.defineProperty(t,"HotTestElementOptions",{enumerable:!0,get:function(){return m.HotTestElementOptions}});const g=__webpack_require__(677);Object.defineProperty(t,"HotTester",{enumerable:!0,get:function(){return g.HotTester}});const _=__webpack_require__(414);Object.defineProperty(t,"HotTesterAPI",{enumerable:!0,get:function(){return _.HotTesterAPI}});const v=__webpack_require__(985);Object.defineProperty(t,"HotTestMap",{enumerable:!0,get:function(){return v.HotTestMap}});const w=__webpack_require__(473);Object.defineProperty(t,"HotTestDestination",{enumerable:!0,get:function(){return w.HotTestDestination}}),e.HotStaq.isWeb=!0})(),HotStaqWeb=__webpack_exports__})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QXFDUiw2RUFyQ1UsRUFBQUQsYUFBYSxJQUMzQixpQ0FtQ0ksd0VBbkNLLEVBQUFzUSxRQUFRLElBQ2pCLGlDQWlDSSx5RUFqQ0ssRUFBQTRiLFNBQVMsSUFDbEIsaUNBbUNJLDRFQW5DSyxFQUFBeEwsWUFBWSxJQUNyQixpQ0FxQ0ksdUVBckNLLEVBQUEzZSxPQUFPLElBQ2hCLGlDQXFDSSxzRUFyQ0ssRUFBQThSLE1BQU0sSUFzQ1gsMkVBdENhLEVBQUEzRixXQUFXLElBQzVCLGlDQXNDSSx1RUF0Q0ssRUFBQTBKLE9BQU8sSUFHaEIsaUNBOEJJLHNFQTlCSyxFQUFBdVQsTUFBTSxJQStCWCxrRkEvQmEsRUFBQWptQixrQkFBa0IsSUFDbkMsaUNBbUNJLHdFQW5DSyxFQUFBUSxRQUFRLElBQ2pCLGdDQW1DSSw4RUFuQ0ssRUFBQWUsY0FBYyxJQW9DbkIsOEVBcENxQixFQUFBakUsY0FBYyxJQXFDbkMsNkVBckNxQyxFQUFBMnBCLGFBQWEsSUFDdEQsaUNBcUNJLHlFQXJDSyxFQUFBaGxCLFNBQVMsSUFzQ2QsNkVBdENnQixFQUFBd0IsYUFBYSxJQUNqQyxpQ0FzQ0kseUVBdENLLEVBQUF1VixTQUFTLElBR2xCLGlDQTBDSSw2RUExQ0ssRUFBQWtPLGFBQWEsSUFDdEIsaUNBdUNJLDhFQXZDc0IsRUFBQTFuQixjQUFjLElBd0NwQyxxRkF4Q3NDLEVBQUEybkIscUJBQXFCLElBQy9ELGlDQWtDSSx5RUFsQ0ssRUFBQWpGLFNBQVMsSUFLbEIsaUNBOEJJLDRFQTlCSyxFQUFBakosWUFBWSxJQUNyQixpQ0E4QkksMEVBOUJLLEVBQUFsRyxVQUFVLElBQ25CLGlDQThCSSxrRkE5QkssRUFBQUcsa0JBQWtCLElBRzNCLEVBQUEvWCxRQUFRQyxPQUFRLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEFQSS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEFzc2V0LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q2xpZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90RmlsZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdExvZy50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdE1vZHVsZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFBhZ2UudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RSb3V0ZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlTWV0aG9kLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U2VydmVyLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFN0YXFSZWdpc3RlckNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFN0YXFXZWJTdGFydC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3REZXN0aW5hdGlvbi50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3REcml2ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0RWxlbWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RNYXAudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0ZXJBUEkudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi9leHRlcm5hbCB2YXIgXCJ7fVwiIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvYXBpLXdlYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwiLyohIGpzLWNvb2tpZSB2My4wLjEgfCBNSVQgKi9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gZ2xvYmFsLkNvb2tpZXM7XG4gICAgdmFyIGV4cG9ydHMgPSBnbG9iYWwuQ29va2llcyA9IGZhY3RvcnkoKTtcbiAgICBleHBvcnRzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7IGdsb2JhbC5Db29raWVzID0gY3VycmVudDsgcmV0dXJuIGV4cG9ydHM7IH07XG4gIH0oKSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIGZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuICB2YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4gIGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgICBmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAgIC8vIC4uLlxuICAgICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgICAvLyAuLi5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgICBrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChrZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgICB2YXIgamFyID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgIGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xuXG4gICAgICAgICAgaWYgKGtleSA9PT0gZm91bmRLZXkpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXJcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2V0OiBzZXQsXG4gICAgICAgIGdldDogZ2V0LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgdmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgcmV0dXJuIGFwaTtcblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHtcblx0Ly8gdGhlIG9ubHkgcmVsaWFibGUgbWVhbnMgdG8gZ2V0IHRoZSBnbG9iYWwgb2JqZWN0IGlzXG5cdC8vIGBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpYFxuXHQvLyBIb3dldmVyLCB0aGlzIGNhdXNlcyBDU1AgdmlvbGF0aW9ucyBpbiBDaHJvbWUgYXBwcy5cblx0aWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgeyByZXR1cm4gc2VsZjsgfVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIHdpbmRvdzsgfVxuXHRpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGdsb2JhbDsgfVxuXHR0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdCcpO1xufVxuXG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGdsb2JhbC5mZXRjaDtcblxuLy8gTmVlZGVkIGZvciBUeXBlU2NyaXB0IGFuZCBXZWJwYWNrLlxuaWYgKGdsb2JhbC5mZXRjaCkge1xuXHRleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuZmV0Y2guYmluZChnbG9iYWwpO1xufVxuXG5leHBvcnRzLkhlYWRlcnMgPSBnbG9iYWwuSGVhZGVycztcbmV4cG9ydHMuUmVxdWVzdCA9IGdsb2JhbC5SZXF1ZXN0O1xuZXhwb3J0cy5SZXNwb25zZSA9IGdsb2JhbC5SZXNwb25zZTsiLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgeyBIb3RFdmVudE1ldGhvZCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdE1vZHVsZSB9IGZyb20gXCIuL0hvdE1vZHVsZVwiO1xuXG4vKipcbiAqIFRoZSBhdmFpbGFibGUgZGV2ZWxvcGVyIG1vZGVzLlxuICovXG5leHBvcnQgZW51bSBEZXZlbG9wZXJNb2RlXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCBkZXZlbG9wZXIgbW9kZS4gTm8gdGVzdHMgd2lsbCBiZSBleGVjdXRlZCBhbmQgXG5cdCAqIGFueSB0ZXN0IHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRQcm9kdWN0aW9uLFxuXHQvKipcblx0ICogRm9yIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBBbGwgdGVzdCBkYXRhIHdpbGwgXG5cdCAqIGJlIGNvbGxlY3RlZCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0RGV2ZWxvcG1lbnRcbn1cblxuLyoqXG4gKiBBIENTUyBvYmplY3QgdG8gZW1iZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBDU1MgZmlsZSB0byBlbWJlZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGludGVncml0eSBoYXNoIHRvIGdlbmVyYXRlIGR1cmluZyBpbml0aWFsIGNvbXBpbGF0aW9uLlxuXHQgKi9cblx0aW50ZWdyaXR5SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhcGkgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnRseSBnZW5lcmF0ZWQgcGFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEN1cnJlbnRQYWdlOiBIb3RQYWdlID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBhcmd1bWVudHMgcGFzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFyZ3VtZW50czogYW55ID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIEhvdFRlc3RFbGVtZW50ID0gSG90VGVzdEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIE1vZGU6IERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdC8qKlxuXHQgKlRoZSBjdXJyZW50IEFQSSB1c2VkIG9uIHRoaXMgcGFnZS4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIEFQSSBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRzdGF0aWMgVGVzdGVyQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIGJ1ZmZlciB0byBvdXRwdXQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIE91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhIHRvIHNoYXJlIGFjcm9zcyBhbGwgdGhlIGRpZmZlcmVudCBmaWxlcyBhbmQgcGFnZXMuIFRoaXMgZGF0YSB3aWxsIGJlIHB1YmxpYy5cblx0ICovXG5cdHN0YXRpYyBEYXRhOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBjb29raWVzIHRvIHVzZSBiZXR3ZWVuIHBhZ2VzLlxuXHQgKi9cblx0c3RhdGljIENvb2tpZXM6IENvb2tpZXMuQ29va2llc1N0YXRpYyA9IENvb2tpZXM7XG5cdC8qKlxuXHQgKiBBbnkgcHVibGljIGtleXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLiBUaGVzZSBjYW4gYmUgcGFzc2VkIGZyb20gSG90U2l0ZS5qc29uLlxuXHQgKi9cblx0c3RhdGljIFB1YmxpY0tleXM6IGFueSA9IHt9O1xuXHQvKipcblx0ICogVGhlIENTUyBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIENTUyBmaWxlcy5cblx0ICovXG5cdHN0YXRpYyBjc3NTdHI6IHN0cmluZyA9IGA8bGluayByZWwgPSBcInN0eWxlc2hlZXRcIiBocmVmID0gXCIlQ1NTX0ZJTEUlXCIgLz5gO1xuXHQvKipcblx0ICogVGhlIENTUyBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IENTU09iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIENTUzogc3RyaW5nW10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGZpbGVzIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICogXG5cdCAqIEB0b2RvIE1ha2UgdGhpcyBhIFwic3RyaW5nIHwgSlNGaWxlT2JqZWN0XCIgZGF0YSB0eXBlIHNvIGl0IGNhbiBhbHNvIGluY2x1ZGUgXG5cdCAqIHRoZSBpbnRlZ3JpdHkgaGFzaGVzIGFzIHdlbGwuXG5cdCAqL1xuXHRzdGF0aWMgSlNGaWxlczogYW55W10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGlubGluZSBjb2RlIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBKU1NjcmlwdHM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNGaWxlU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVKU19GSUxFJVwiPjwvc2NyaXB0PmA7XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNTY3JpcHRzU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj4lSlNfQ09ERSU8L3NjcmlwdD5gO1xuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW5jbHVkZSAoZmlsZTogSG90RmlsZSB8IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAoZmlsZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGxvd2VyRmlsZTogc3RyaW5nID0gZmlsZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCBkb2VzIG5vdCBoYXZlIGEgbmFoZmFtLCBhZGQgaXQuIFRoaXMgXG5cdFx0XHRcdC8vIHdpbGwgZW5zdXJlIHRoZSBzZXJ2ZXIgc2VuZHMgb25seSB0aGUgZmlsZSBjb250ZW50LlxuXHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwiLmhvdHRcIikgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChsb3dlckZpbGUuaW5kZXhPZiAoXCJuYWhmYW1cIikgPCAwKVxuXHRcdFx0XHRcdFx0ZmlsZSArPSBcIj9oc3Rxc2VydmU9bmFoZmFtXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRIb3QuZWNobyAoYXdhaXQgSG90LmdldEZpbGUgKGZpbGUsIGFyZ3MpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgZm9yIHVzZSB3aGVuIHJ1bm5pbmcgdGhlIHByZXByb2Nlc3Nvci5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBpbmNsdWRlSlMgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCwgcGFyZW50T2JqZWN0OiBhbnkgPSBudWxsKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRjb25zdCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdC5nZXRGaWxlIChmaWxlLCBhcmdzKTtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0cGFyZW50T2JqZWN0ID0gd2luZG93O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKHBhcmVudE9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHRwYXJlbnRPYmplY3QgPSBnbG9iYWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChldmFsLmFwcGx5IChwYXJlbnRPYmplY3QsIFtvdXRwdXRdKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGltcG9ydCAobW9kdWxlTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwsIHBhcmVudE9iamVjdDogYW55ID0gbnVsbCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IGZvdW5kTW9kdWxlOiBIb3RNb2R1bGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldE1vZHVsZSAobW9kdWxlTmFtZSk7XG5cblx0XHRpZiAoZm91bmRNb2R1bGUgIT0gbnVsbClcblx0XHRcdHJldHVybiAoZm91bmRNb2R1bGUpO1xuXG5cdFx0Y29uc3QgZmlsZTogc3RyaW5nID0gYC4vaG90c3RhcV9tb2R1bGVzLyR7bW9kdWxlTmFtZX0vaW5kZXguanNgO1xuXHRcdGNvbnN0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgSG90LmdldEZpbGUgKGZpbGUsIGFyZ3MpO1xuXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHBhcmVudE9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHRwYXJlbnRPYmplY3QgPSB3aW5kb3c7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAocGFyZW50T2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHBhcmVudE9iamVjdCA9IGdsb2JhbDtcblx0XHR9XG5cblx0XHRsZXQgbmV3TW9kdWxlID0gbmV3IEZ1bmN0aW9uIChvdXRwdXQpLmFwcGx5IChwYXJlbnRPYmplY3QpO1xuXG5cdFx0aWYgKG5ld01vZHVsZS5sb2FkSFRNTCAhPSBudWxsKVxuXHRcdFx0YXdhaXQgbmV3TW9kdWxlLmxvYWRIVE1MICgpO1xuXG5cdFx0SG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hZGRNb2R1bGUgKG1vZHVsZU5hbWUsIG5ld01vZHVsZSk7XG5cblx0XHRyZXR1cm4gKG5ld01vZHVsZSk7XG5cdH1cblxuXHQvKipcblx0ICogUnVuIGFuIGFscmVhZHkgbG9hZGVkIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcnVuRmlsZSAoZmlsZU5hbWU6IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldEZpbGUgKGZpbGVOYW1lKTtcblx0XHQvLy8gQGZpeG1lIERvZXMgdGhlIGZpbGUgbmVlZCB0byBiZSBkZWVwIGNsb25lZCBmaXJzdD9cblx0XHQvL2xldCBjbG9uZWRGaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKE9iamVjdC5hc3NpZ24gKHt9LCBmaWxlKSk7XG5cdFx0bGV0IHRlbXBGaWxlOiBIb3RGaWxlID0gZmlsZTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdEhvdC5lY2hvIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGdldEZpbGUgKHBhdGg6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHRlbXBGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKHBhdGgpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRlbXBGaWxlID0gbmV3IEhvdEZpbGUgKCk7XG5cdFx0XHR0ZW1wRmlsZS5uYW1lID0gcGF0aDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHRcdHRlbXBGaWxlLnVybCA9IHBhdGg7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRlbXBGaWxlLmxvY2FsRmlsZSA9IHBhdGg7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRlbXBGaWxlID0gcGF0aDtcblxuXHRcdGxldCBjaGVja0ZpbGU6IEhvdEZpbGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldEZpbGUgKHRlbXBGaWxlLm5hbWUsIGZhbHNlKTtcblxuXHRcdGlmIChjaGVja0ZpbGUgIT0gbnVsbClcblx0XHRcdHRlbXBGaWxlID0gY2hlY2tGaWxlO1xuXG5cdFx0YXdhaXQgdGVtcEZpbGUubG9hZCAoKTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhbiBhcGkgY2FsbC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBhcGlDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBcblx0XHRodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiQ3VycmVudCBwYWdlJ3MgcHJvY2Vzc29yIGlzIG51bGwhXCIpO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiQ3VycmVudCBwYWdlJ3MgcHJvY2Vzc29yIGFwaSBpcyBudWxsISBEaWQgeW91IGZvcmdldCB0byBzZXQgdGhlIEFQSSBuYW1lIG9yIFVSTD9cIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRyZXN1bHQgPSBhd2FpdCBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaS5tYWtlQ2FsbCAocm91dGUsIFxuXHRcdFx0XHRcdFx0XHRkYXRhLCBodHRwTWV0aG9kLCBmaWxlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIEhUVFAgSlNPTiBmaWxlIG9yIHJlcXVlc3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGdldEpTT04gKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRyZXR1cm4gKEhvdC5qc29uUmVxdWVzdCAodXJsLCBudWxsLCBIb3RFdmVudE1ldGhvZC5HRVQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCBKU09OIHJlcXVlc3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIEpTT04uc3RyaW5naWZ5IGFuZCBzZW5kLlxuXHQgKiBAcGFyYW0gaHR0cE1ldGhvZCBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIHRvIHNlbmQgdGhlIGRhdGEuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGpzb25SZXF1ZXN0ICh1cmw6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgaHR0cE1ldGhvZDogSG90RXZlbnRNZXRob2QgPSBIb3RFdmVudE1ldGhvZC5QT1NUKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZmV0Y2hPYmogPSB7XG5cdFx0XHRcdFwibWV0aG9kXCI6IGh0dHBNZXRob2QsXG5cdFx0XHRcdFwiaGVhZGVyc1wiOiB7XG5cdFx0XHRcdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaHR0cE1ldGhvZCA9PT0gSG90RXZlbnRNZXRob2QuUE9TVClcblx0XHRcdHtcblx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgcmVzID0gYXdhaXQgZmV0Y2ggKHVybCwgZmV0Y2hPYmopO1xuXG5cdFx0XHRpZiAocmVzLm9rID09PSBmYWxzZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHtyZXMuc3RhdHVzfTogJHtyZXMuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHJldHVybiAoSlNPTi5zdHJpbmdpZnkgKHsgXCJlcnJvclwiOiBgJHtleC5tZXNzYWdlfSAtIENvdWxkIG5vdCBmZXRjaCAke3VybH1gIH0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgcmVxdWVzdC4gVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHdyYXBwZXIgZm9yIGZldGNoLlxuXHQgKiBcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0ge1JlcXVlc3RJbml0fSByZXF1ZXN0SW5pdCBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIHNlbmQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgSFRUUCByZXNwb25zZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwUmVxdWVzdCAodXJsOiBzdHJpbmcsIHJlcXVlc3RJbml0OiBhbnkgPSB1bmRlZmluZWQpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsLCByZXF1ZXN0SW5pdCk7XG5cblx0XHRyZXR1cm4gKHJlcyk7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgc29tZSBvdXRwdXQuXG5cdCAqL1xuXHRzdGF0aWMgZWNobyAobWVzc2FnZTogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0SG90Lk91dHB1dCArPSBtZXNzYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBDU1MgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlDU1MgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkNTUy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgY3NzRmlsZTogc3RyaW5nID0gSG90LkNTU1tpSWR4XTtcblx0XHRcdGxldCBjc3NPdXQ6IHN0cmluZyA9IEhvdC5jc3NTdHI7XG5cblx0XHRcdGNzc091dCA9IGNzc091dC5yZXBsYWNlICgvXFwlQ1NTX0ZJTEVcXCUvZywgY3NzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChjc3NPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgZmlsZXMgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlKU0ZpbGVzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU0ZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc0ZpbGU6IHN0cmluZyA9IEhvdC5KU0ZpbGVzW2lJZHhdO1xuXHRcdFx0bGV0IGpzRmlsZU91dDogc3RyaW5nID0gSG90LmpzRmlsZVN0cjtcblxuXHRcdFx0anNGaWxlT3V0ID0ganNGaWxlT3V0LnJlcGxhY2UgKC9cXCVKU19GSUxFXFwlL2csIGpzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChqc0ZpbGVPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgc2NyaXB0cyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTU2NyaXB0cyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuSlNTY3JpcHRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc1NjcmlwdDogc3RyaW5nID0gSG90LkpTU2NyaXB0c1tpSWR4XTtcblx0XHRcdGxldCBqc1NjcmlwdE91dDogc3RyaW5nID0gSG90LmpzU2NyaXB0c1N0cjtcblxuXHRcdFx0anNTY3JpcHRPdXQgPSBqc1NjcmlwdE91dC5yZXBsYWNlICgvXFwlSlNfQ09ERVxcJS9nLCBqc1NjcmlwdCk7XG5cblx0XHRcdEhvdC5lY2hvIChqc1NjcmlwdE91dCk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuXG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90RXZlbnRNZXRob2QsIEhvdFJvdXRlTWV0aG9kLCBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90REIgfSBmcm9tIFwiLi9Ib3REQlwiO1xuXG5pbXBvcnQgeyBIb3REQlNjaGVtYSB9IGZyb20gXCIuL3NjaGVtYXMvSG90REJTY2hlbWFcIjtcbmltcG9ydCB7IEhvdFdlYlNvY2tldFNlcnZlciB9IGZyb20gXCIuL0hvdFdlYlNvY2tldFNlcnZlclwiO1xuaW1wb3J0IHsgSG90SFRUUFNlcnZlciB9IGZyb20gXCIuL0hvdEhUVFBTZXJ2ZXJcIjtcblxuLyoqXG4gKiBUaGUgQVBJIHRvIGxvYWQuXG4gKi9cbmV4cG9ydCB0eXBlIEFQSXRvTG9hZCA9IHtcblx0LyoqXG5cdCAqIFRoZSBpbXBvcnRlZCBjbGFzcyB0byBsb2FkLlxuXHQgKi9cblx0aW1wb3J0ZWRBUElDbGFzczogYW55O1xuXHQvKipcblx0ICogVGhlIGV4cG9ydGVkIGNsYXNzIG5hbWUgdG8gaW1wb3J0IGFuZCBpbnN0YW50aWF0ZS5cblx0ICovXG5cdGV4cG9ydGVkQ2xhc3NOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgSG90QVBJIGNsYXNzIHRvIGxvYWQuXG5cdCAqL1xuXHRwYXRoOiBzdHJpbmc7XG4gfTtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBvYmplY3QgdG8gdXNlIGR1cmluZyBldmVudCBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZW51bSBFdmVudEV4ZWN1dGlvblR5cGVcbntcblx0SG90Um91dGUsXG5cdEhvdE1ldGhvZCxcblx0SG90QVBJXG59XG5cbi8qKlxuICogVGhlIEFQSSB0byB1c2UuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RBUElcbntcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgY29ubmVjdGlvbi5cblx0ICovXG5cdGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudDtcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVBJLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHNlcnZlci5cblx0ICovXG5cdGJhc2VVcmw6IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCwgdGhpcyB3aWxsIGNyZWF0ZSB0aGUgcm91dGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZm9yIFxuXHQgKiBlYXN5IGNsaWVudC9zZXJ2ZXIgY2FsbGluZy5cblx0ICovXG5cdGNyZWF0ZUZ1bmN0aW9uczogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0ZXhlY3V0ZUV2ZW50c1VzaW5nOiBFdmVudEV4ZWN1dGlvblR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGRiOiBIb3REQjtcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRoZSBjbGllbnQgdXNlcyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi4gSWYgdXNpbmcgXG5cdCAqIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGZvciBIVFRQIHJlcXVlc3RzLCBiZSBzdXJlIHRvIG92ZXJyaWRlIHRoZSBcblx0ICogYHRvQXV0aG9yaXphdGlvbkhlYWRlclN0cmluZ2AgaW4gdGhpcyBvYmplY3QuXG5cdCAqIFxuXHQgKiBFeGFtcGxlIG9mIHRoaXMgb2JqZWN0OlxuXHQgKiBgYGB0c1xuXHQgKiB0aGlzLmF1dGhDcmVkZW50aWFscyA9IHtcblx0ICogXHRcdHVzZXI6IFwidXNlcm5hbWVcIixcblx0ICogXHRcdHBhc3N3b3JkOiBcInBhc3N3b3JkXCIsXG5cdCAqIFx0XHR0b0F1dGhvcml6YXRpb25IZWFkZXJTdHJpbmc6IGZ1bmN0aW9uICgpXG5cdCAqIFx0XHRcdHtcblx0ICogXHRcdFx0XHRyZXR1cm4gKGJ0b2EgKHRoaXMudXNlciArIFwiOlwiICsgdGhpcy5wYXNzd29yZCkpO1xuXHQgKiBcdFx0XHR9XG5cdCAqIFx0fTtcblx0ICogYGBgXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB1c2VkIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuXHQgKi9cblx0dXNlckF1dGg6IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0cm91dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RSb3V0ZSB9O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGUgQVBJIGlzIGFib3V0IHRvIHN0YXJ0IHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaGFzIGZpbmlzaGVkIHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdGNvbnN0cnVjdG9yIChiYXNlVXJsOiBzdHJpbmcsIGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCwgZGI6IEhvdERCID0gbnVsbClcblx0e1xuXHRcdGlmIChjb25uZWN0aW9uID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBzZXJ2ZXIgYXR0YWNoZWQgdG8gYXBpIHdpdGggYmFzZVVybDogJHtiYXNlVXJsfWApO1xuXG5cdFx0dGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdHRoaXMuY3JlYXRlRnVuY3Rpb25zID0gdHJ1ZTtcblx0XHR0aGlzLmV4ZWN1dGVFdmVudHNVc2luZyA9IEV2ZW50RXhlY3V0aW9uVHlwZS5Ib3RSb3V0ZTtcblx0XHR0aGlzLmRiID0gZGI7XG5cdFx0dGhpcy5hdXRoQ3JlZGVudGlhbHMgPSBudWxsO1xuXHRcdHRoaXMudXNlckF1dGggPSBudWxsO1xuXHRcdHRoaXMucm91dGVzID0ge307XG5cdFx0dGhpcy5vblByZVJlZ2lzdGVyID0gbnVsbDtcblx0XHR0aGlzLm9uUG9zdFJlZ2lzdGVyID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgdXNlLlxuXHQgKi9cblx0c2V0REJTY2hlbWEgKHNjaGVtYTogSG90REJTY2hlbWEpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gQVBJIGhhcyBiZWVuIHNldCFgKTtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHRoaXMuY29ubmVjdGlvbi5hcGkuZGIuc2NoZW1hID0gc2NoZW1hO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZGF0YWJhc2UgYmVpbmcgdXNlZC5cblx0ICovXG5cdGdldERCICgpOiBIb3REQlxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGFiYXNlIHNjaGVtYSBiZWluZyB1c2VkLlxuXHQgKi9cblx0Z2V0REJTY2hlbWEgKCk6IEhvdERCU2NoZW1hXG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIuc2NoZW1hKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSByb3V0ZS4gSWYgdGhpcy5jcmVhdGVGdW5jdGlvbnMgaXMgc2V0IHRvIHRydWUgKHdoaWNoIGlzIGRlZmF1bHQpLCB0aGlzIHdpbGwgdGFrZSB0aGUgaW5jb21pbmcgXG5cdCAqIHJvdXRlIGFuZCBjcmVhdGUgYW4gb2JqZWN0IGluIHRoaXMgSG90QVBJIG9iamVjdCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgcm91dGUuIElmIHRoZXJlJ3MgXG5cdCAqIGFueSBIb3RSb3V0ZU1ldGhvZHMgaW5zaWRlIG9mIHRoZSBpbmNvbWluZyBIb3RSb3V0ZSwgaXQgd2lsbCBjcmVhdGUgdGhlIG1ldGhvZHMgXG5cdCAqIGFuZCBhdHRhY2ggdGhlbSB0byB0aGUgbmV3bHkgY3JlYXRlZCBIb3RSb3V0ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGB0c1xuXHQgKiBpbXBvcnQgeyBIb3RBUEksIEhvdFJvdXRlIH0gZnJvbSBcImhvdHN0YXFcIjtcblx0ICogXG5cdCAqIGNsYXNzIEFwcEFQSSBleHRlbmRzIEhvdEFQSVxuXHQgKiB7XG5cdCAqIFx0XHRjb25zdHJ1Y3RvciAoYmFzZVVybDogc3RyaW5nLCBjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQgPSBudWxsLCBkYjogYW55ID0gbnVsbClcblx0ICogXHRcdHtcblx0ICogXHRcdFx0c3VwZXIoYmFzZVVybCwgY29ubmVjdGlvbiwgZGIpO1xuXHQgKiBcblx0ICogXHRcdFx0Ly8gQ3JlYXRlcyB0aGUgcm91dGUgaHR0cDovLzEyNy4wLjAuMTo4MDgwL3YxL2hlbGxvX3dvcmxkL1xuXHQgKiBcdFx0XHR0aGlzLmFkZFJvdXRlIChuZXcgRXhhbXBsZVJvdXRlICh0aGlzKSk7XG5cdCAqIFx0XHR9XG5cdCAqIH1cblx0ICogXG5cdCAqIGNsYXNzIEV4YW1wbGVSb3V0ZSBleHRlbmRzIEhvdFJvdXRlXG5cdCAqIHtcblx0ICogXHRcdGNvbnN0cnVjdG9yIChhcGk6IEFwcEFQSSlcblx0ICogXHRcdHtcblx0ICogXHRcdFx0c3VwZXIgKGFwaS5jb25uZWN0aW9uLCBcImhlbGxvX3dvcmxkXCIpO1xuXHQgKiBcblx0ICogXHRcdFx0Ly8gQ3JlYXRlcyB0aGUgSFRUUCBHRVQgZW5kcG9pbnQ6IGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC92MS9oZWxsb193b3JsZC9oaVxuXHQgKiBcdFx0XHQvLyBXaGVuIHRoaXMgZW5kcG9pbnQgaXMgYWNjZXNzZWQsIHRoZSBKU09OIHJlc3BvbnNlIHdpbGwgcmV0dXJuIFwiaGVsbG9cIlxuXHQgKiBcdFx0XHR0aGlzLmFkZE1ldGhvZCAoXCJoaVwiLCBhc3luYyAoKSA9PlxuXHQgKiBcdFx0XHR7XG5cdCAqIFx0XHRcdFx0cmV0dXJuIChcImhlbGxvXCIpO1xuXHQgKiBcdFx0XHR9KTtcblx0ICogXHRcdH1cblx0ICogfVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIEluIHRoZSBjbGllbnQgYnJvd3NlciwgdGhpcyB3b3VsZCBiZSB1c2VkIGxpa2Ugc286XG5cdCAqIGBgYFxuXHQgKiBhd2FpdCBIb3QuQVBJLmhlbGxvX3dvcmxkLmhpICgpO1xuXHQgKiBgYGBcblx0ICogXG5cdCAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gYWRkLiBDYW4gYmUgZWl0aGVyIGEgZnVsbCBIb3RSb3V0ZSBvYmplY3QsIG9yIGp1c3QgXG5cdCAqIHRoZSByb3V0ZSdzIG5hbWUuIElmIGEgSG90Um91dGUgb2JqZWN0IGlzIHN1cHBsaWVkLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBcblx0ICogd2lsbCBiZSBpZ25vcmVkLlxuXHQgKiBAcGFyYW0gcm91dGVNZXRob2QgVGhlIHJvdXRlJ3MgbWV0aG9kIHRvIGFkZC4gSWYgdGhlIHJvdXRlIHBhcmFtZXRlciBpcyBhIHN0cmluZywgXG5cdCAqIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIHJvdXRlJ3MgbmFtZSwgYW5kIHRoaXMgd2lsbCBiZSB0aGUgbWV0aG9kIGFkZGVkIHRvIFxuXHQgKiB0aGUgbmV3IHJvdXRlLlxuXHQgKiBAcGFyYW0gZXhlY3V0ZUZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gcm91dGVNZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBBUEkuXG5cdCAqL1xuXHRhZGRSb3V0ZSAoXG5cdFx0cm91dGU6IEhvdFJvdXRlIHwgc3RyaW5nLFxuXHRcdHJvdXRlTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCB8IHN0cmluZyA9IG51bGwsXG5cdFx0ZXhlY3V0ZUZ1bmN0aW9uOiAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KSA9PiBQcm9taXNlPGFueT4gPSBudWxsXG5cdFx0KTogdm9pZFxuXHR7XG5cdFx0bGV0IHJvdXRlTmFtZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0eXBlb2YgKHJvdXRlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRyb3V0ZU5hbWUgPSByb3V0ZTtcblxuXHRcdFx0aWYgKHRoaXMucm91dGVzW3JvdXRlTmFtZV0gPT0gbnVsbClcblx0XHRcdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXSA9IG5ldyBIb3RSb3V0ZSAodGhpcy5jb25uZWN0aW9uLCByb3V0ZU5hbWUpO1xuXG5cdFx0XHRpZiAodHlwZW9mIChyb3V0ZU1ldGhvZCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChuZXcgSG90Um91dGVNZXRob2QgKFxuXHRcdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0sIHJvdXRlTWV0aG9kLCBleGVjdXRlRnVuY3Rpb24pKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5hZGRNZXRob2QgKHJvdXRlTWV0aG9kKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHJvdXRlTmFtZSA9IHJvdXRlLnJvdXRlO1xuXHRcdFx0dGhpcy5yb3V0ZXNbcm91dGUucm91dGVdID0gcm91dGU7XG5cdFx0fVxuXG5cdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5jb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSByb3V0ZSBmdW5jdGlvbnMgZm9yIHRoZSBzZXJ2ZXIvY2xpZW50LlxuXHRcdGlmICh0aGlzLmNyZWF0ZUZ1bmN0aW9ucyA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgbmV3Um91dGU6IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB0aGlzW3JvdXRlTmFtZV07XG5cblx0XHRcdGlmIChuZXdSb3V0ZSA9PSBudWxsKVxuXHRcdFx0XHRuZXdSb3V0ZSA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMucm91dGVzW3JvdXRlTmFtZV0ubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGN1cnJlbnRSb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdO1xuXHRcdFx0XHRsZXQgbmV3Um91dGVNZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gdGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5tZXRob2RzW2lJZHhdO1xuXG5cdFx0XHRcdC8qXG5cdFx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyBBIEhUVFAgY2FsbCBpcyBtdWNoIG1vcmUgcHJlZmVyYWJsZSwgXG5cdFx0XHRcdC8vLyBlc3BlY2lhbGx5IGZvciBhY2NydWF0ZSB0ZXN0aW5nLlxuXHRcdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uIGluc3RhbmNlb2YgSG90U2VydmVyKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vblNlcnZlckV4ZWN1dGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSovXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdC8vLyBAZml4bWUgSXMgb25DbGllbnRFeGVjdXRlIG5lY2Vzc2FyeT8gSSdtIHRoaW5raW5nIHRoZSBkZXYgY2FuIGp1c3Qgc2ltcGx5IGNyZWF0ZSBcblx0XHRcdFx0XHQvLy8gdGhlaXIgb3duIGZ1bmN0aW9uIHRvIGNhbGwuXG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vbkNsaWVudEV4ZWN1dGU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHsqL1xuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSAoZGF0YTogYW55LCBmaWxlczogYW55KTogYW55ID0+XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaHR0cE1ldGhvZDogc3RyaW5nID0gbmV3Um91dGVNZXRob2QudHlwZTtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25zdHJ1Y3QgdGhlIHVybCBoZXJlLiBCYXNlICsgcm91dGUgKyByb3V0ZSBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVTdHI6IHN0cmluZyA9IG5ld1JvdXRlTWV0aG9kLmdldFJvdXRlVXJsICgpO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhdXRoQ3JlZGVudGlhbHM6IGFueSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBHZXR0aW5nIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIGZyb20gdGhlIEFQSSBpcyB0aGUgbG93ZXN0IFxuXHRcdFx0XHRcdFx0XHRcdC8vIHByaW9yaXR5IGZvciBnZXR0aW5nIGNyZWRlbnRpYWxzLiBUaGUgcHJpb3JpdGllcyBhcmUgaW4gdGhpcyBvcmRlcjogXG5cdFx0XHRcdFx0XHRcdFx0Ly8gMS4gSG90Um91dGVNZXRob2Rcblx0XHRcdFx0XHRcdFx0XHQvLyAyLiBIb3RSb3V0ZVxuXHRcdFx0XHRcdFx0XHRcdC8vIDMuIEhvdEFQSVxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gdGhpcy5hdXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzLiBQcmlvcml0aXplIHRoZW0gd2hlbiB0aGV5J3JlIFxuXHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBtZXRob2QuIE9ubHkgYWRkIHRoZSBvbmVzIGZyb20gdGhlIHJvdXRlIGlmIHRoZSBvbmVzIGZyb20gXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIG1ldGhvZCBhcmUgbWlzc2luZy5cblx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSBuZXdSb3V0ZU1ldGhvZC5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5yb3V0ZS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gbmV3Um91dGVNZXRob2Qucm91dGUuYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhdXRoQ3JlZGVudGlhbHMgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChIb3QpICE9PSBcInVuZGVmaW5lZFwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QuQVBJW2N1cnJlbnRSb3V0ZS5yb3V0ZV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSVtjdXJyZW50Um91dGUucm91dGVdLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IEhvdC5BUElbY3VycmVudFJvdXRlLnJvdXRlXS5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIHRoZSBkYXRhIGJlaW5nIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gYXV0aENyZWRlbnRpYWxzKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYXV0aENyZWRlbnRpYWw6IGFueSA9IGF1dGhDcmVkZW50aWFsc1trZXldO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERvIG5vdCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGtleXMgaW4gdGhlIGRhdGEgYWJvdXQgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRvIGJlIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhW2tleV0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW2tleV0gPSBhdXRoQ3JlZGVudGlhbDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgYXJnczogYW55W10gPSBbcm91dGVTdHIsIGRhdGEsIGh0dHBNZXRob2QsIGZpbGVzXTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAodGhpcy5tYWtlQ2FsbC5hcHBseSAodGhpcywgYXJncykpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdC8vfVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHRoaXNbcm91dGVOYW1lXSA9IG5ld1JvdXRlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIHJvdXRlIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGUgKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVnaXN0ZXJSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGFsbCByb3V0ZXMgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZXMgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnJvdXRlcylcblx0XHR7XG5cdFx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5yb3V0ZXNba2V5XTtcblxuXHRcdFx0YXdhaXQgdGhpcy5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBjYWxsIHRvIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBtYWtlQ2FsbCAocm91dGU6IHN0cmluZywgZGF0YTogYW55LCBodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRjb25zdCBodHRwTWV0aG9kU3RyOiBzdHJpbmcgPSBodHRwTWV0aG9kLnRvVXBwZXJDYXNlICgpO1xuXG5cdFx0aWYgKHVybFsodXJsLmxlbmd0aCAtIDEpXSA9PT0gXCIvXCIpXG5cdFx0XHR1cmwgPSB1cmwuc3Vic3RyICgwLCAodXJsLmxlbmd0aCAtIDEpKTtcblxuXHRcdGlmIChyb3V0ZVswXSAhPT0gXCIvXCIpXG5cdFx0XHR1cmwgKz0gXCIvXCI7XG5cblx0XHR1cmwgKz0gcm91dGU7XG5cblx0XHRjb25zdCBudW1GaWxlczogbnVtYmVyID0gT2JqZWN0LmtleXMgKGZpbGVzKS5sZW5ndGg7XG5cblx0XHRpZiAobnVtRmlsZXMgPiAwKVxuXHRcdHtcblx0XHRcdGlmIChodHRwTWV0aG9kU3RyICE9PSBcIlBPU1RcIilcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVG8gdXBsb2FkIGZpbGVzLCB5b3UgbXVzdCBzZXQgdGhlIGh0dHBNZXRob2QgdG8gUE9TVC5gKTtcblxuXHRcdFx0Y29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhICgpO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gZmlsZXMpXG5cdFx0XHRcdGZvcm1EYXRhLmFwcGVuZCAoa2V5LCBmaWxlc1trZXldKTtcblxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRib2R5OiBmb3JtRGF0YVxuXHRcdFx0XHR9KTtcblx0XHRcdGxldCBqc29uUmVzOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0aWYgKGRhdGFbXCJob3RzdGFxXCJdID09IG51bGwpXG5cdFx0XHRcdGRhdGFbXCJob3RzdGFxXCJdID0ge307XG5cblx0XHRcdGlmIChkYXRhW1wiaG90c3RhcVwiXVtcInVwbG9hZHNcIl0gPT0gbnVsbClcblx0XHRcdFx0ZGF0YVtcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdID0ge307XG5cblx0XHRcdGRhdGFbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXVtcInVwbG9hZElkXCJdID0gXG5cdFx0XHRcdFx0anNvblJlc1tcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdW1widXBsb2FkSWRcIl07XG5cblx0XHRcdC8vIEFmdGVyIHRoZSB1cGxvYWQsIG1ha2UgdGhlIGFjdHVhbCBKU09OIGNhbGwuIERvIG5vdCBwYXNzIGZpbGVzIGFnYWluLlxuXHRcdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLm1ha2VDYWxsIChyb3V0ZSwgZGF0YSwgaHR0cE1ldGhvZCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRsZXQgZmV0Y2hPYmo6IGFueSA9IHtcblx0XHRcdFx0bWV0aG9kOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICgoaHR0cE1ldGhvZFN0ciAhPT0gXCJHRVRcIikgJiYgXG5cdFx0XHQoaHR0cE1ldGhvZFN0ciAhPT0gXCJIRUFEXCIpKVxuXHRcdHtcblx0XHRcdGZldGNoT2JqW1wiYm9keVwiXSA9IEpTT04uc3RyaW5naWZ5IChkYXRhKTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PiBcblx0XHRcdHtcblx0XHRcdFx0ZmV0Y2ggKHVybCwgZmV0Y2hPYmopLnRoZW4gKGFzeW5jIChyZXMpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmVzLmpzb24gKCkudGhlbiAoKGpzb25PYmo6IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUgKGpzb25PYmopO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2ggKChyZWFzb246IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7dXJsfTogJHtyZWFzb24ubWVzc2FnZX1gKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2ggKChyZWFzb246IGFueSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3VybH06ICR7cmVhc29uLm1lc3NhZ2V9YCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocHJvbWlzZSk7XG5cdH1cbn1cbiIsIi8qKlxuICogQW4gYXNzZXQgdG8gbG9hZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdEFzc2V0XG57XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBhc3NldC4gQ2FuIGJlOlxuXHQgKiAqIGpzXG5cdCAqICogY3NzXG5cdCAqICogaHRtbFxuXHQgKiAqIGNvbXBvbmVudFxuXHQgKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGFzc2V0IHRvIGxvYWQuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGFzc2V0cyB0byBsb2FkLlxuXHQgKi9cblx0cGF0aD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwcmVsb2FkZWQgY29udGVudCB0byBsb2FkLiBSZXF1aXJlcyBuYW1lIHRvIGJlIHNldC5cblx0ICovXG5cdGNvbnRlbnQ/OiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nID0gXCJcIilcblx0e1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLnBhdGggPSBcIlwiO1xuXHRcdHRoaXMuY29udGVudCA9IFwiXCI7XG5cdH1cblxuXHRsb2FkICgpOiB2b2lkXG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHRoZSBhc3NldC5cblx0ICovXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgeyBuYW1lOiBzdHJpbmc7IHVybD86IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgfVxuXHR7XG5cdFx0aWYgKCh0aGlzLnBhdGggPT0gbnVsbCkgJiYgKHRoaXMuY29udGVudCA9PSBudWxsKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdEFzc2V0ICR7dGhpcy5uYW1lfSBvZiB0eXBlICR7dGhpcy50eXBlfSBkb2VzIG5vdCBoYXZlIGEgcGF0aCBvciBjb250ZW50IHNldCFgKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyB1cmw/OiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IH0gPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMucGF0aCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLnBhdGggIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwianNcIilcblx0XHRcdFx0XHRvdXRwdXQgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7dGhpcy5wYXRofVwiPjwvc2NyaXB0PmA7XG5cblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJjc3NcIilcblx0XHRcdFx0XHRvdXRwdXQgPSBgPGxpbmsgaHJlZiA9IFwiJHt0aGlzLnBhdGh9XCIgcmVsID0gXCJzdHlsZXNoZWV0XCIgLz5gO1xuXG5cdFx0XHRcdGlmICgodGhpcy50eXBlID09PSBcImh0bWxcIikgfHwgXG5cdFx0XHRcdFx0KHRoaXMudHlwZSA9PT0gXCJjb21wb25lbnRcIikpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBhbiBIVE1MIG9yIGNvbXBvbmVudCBhc3NldCByZXF1aXJlcyBhIG5hbWUgdG8gYmUgc2V0IWApO1xuXG5cdFx0XHRcdFx0bGV0IGZpbGVVcmw6IHN0cmluZyA9IGBcIiR7dGhpcy5wYXRofVwiYDtcblx0XHRcdFx0XHRvdXRwdXQgPSB7IG5hbWU6IHRoaXMubmFtZSwgdXJsOiB0aGlzLnBhdGggfTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbnRlbnQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb250ZW50ICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImpzXCIpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBKUyBhc3NldHMgdXNpbmcgY29udGVudCBpcyBub3Qgc3VwcG9ydGVkIHlldCFgKTtcblxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNzc1wiKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYExvYWRpbmcgQ1NTIGFzc2V0cyB1c2luZyBjb250ZW50IGlzIG5vdCBzdXBwb3J0ZWQgeWV0IWApO1xuXG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiaHRtbFwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYExvYWRpbmcgYW4gSFRNTCBhc3NldCByZXF1aXJlcyBhIG5hbWUgdG8gYmUgc2V0IWApO1xuXG5cdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAodGhpcy5jb250ZW50KTtcblx0XHRcdFx0XHRsZXQgZmlsZVVybDogc3RyaW5nID0gdGhpcy5wYXRoO1xuXHRcdFx0XHRcdGxldCBmaWxlQ29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdC8vIEZpbmQgYW55IHNjcmlwdCB0YWdzIGFuZCBpbnRlcnJ1cHQgdGhlbSBzbyB0aGUgSFRNTCBwYXJzZXJzIFxuXHRcdFx0XHRcdC8vIGRvbid0IGdldCBjb25mdXNlZC5cblx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKFwiXFxcXDxzY3JpcHRcIiwgXCJnbWlcIiksIFwiPHNjclxcXCIgKyBcXFwiaXB0XCIpO1xuXHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoXCJcXFxcPFxcXFwvc2NyaXB0XCIsIFwiZ21pXCIpLCBcIjwvc2NyXFxcIiArIFxcXCJpcHRcIik7XG5cblx0XHRcdFx0XHRmaWxlQ29udGVudCA9IGVzY2FwZWRDb250ZW50O1xuXG5cdFx0XHRcdFx0b3V0cHV0ID0geyBuYW1lOiB0aGlzLm5hbWUsIHVybDogZmlsZVVybCwgY29udGVudDogZXNjYXBlZENvbnRlbnQgfTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxufSIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFNlcnZlclR5cGUgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIEEgY2xpZW50IGNvbm5lY3RlZCB0byBhIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdENsaWVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBBUEkgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyQVBJOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG5cdCAqL1xuXHR0eXBlOiBIb3RTZXJ2ZXJUeXBlO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXG5cdGNvbnN0cnVjdG9yIChwcm9jZXNzb3I6IEhvdFN0YXEpXG5cdHtcblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0dGhpcy50ZXN0ZXJBUEkgPSBudWxsO1xuXHRcdHRoaXMudHlwZSA9IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90Q29tcG9uZW50T3V0cHV0XG57XG5cdC8qKlxuXHQgKiBUaGUgSFRNTCB0byBvdXRwdXQuXG5cdCAqL1xuXHRodG1sOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcXVlcnkgc2VsZWN0b3IgdG8gYWRkIHRoaXMgY29tcG9uZW50J3MgZnVuY3Rpb25zIHRvLlxuXHQgKiBcblx0ICogQGV4YW1wbGUgI29iamVjdElkXG5cdCAqL1xuXHRhZGRGdW5jdGlvbnNUbz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwbGFjZSBoZXJlIHBhcmVudCBuYW1lIHRvIGF0dGFjaCB0aGlzIGh0bWwgdG8uXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSB0b3Bcblx0ICovXG5cdHBsYWNlSGVyZVBhcmVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIEFwcGVuZCB0aGUgb3V0cHV0IHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IgdGhhdCBpcyBcblx0ICogdGhlIGNsb3Nlc3QuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSBkaXYgLnRlc3RDbGFzc1xuXHQgKi9cblx0Y2xvc2VzdFNlbGVjdG9yPzogc3RyaW5nO1xuXHQvKipcblx0ICogQXBwZW5kIHRoZSBvdXRwdXQgdG8gYW4gZXhpc3RpbmcgZWxlbWVudCBzb21ld2hlcmUgb24gdGhlIGRvY3VtZW50LlxuXHQgKiBcblx0ICogQGV4YW1wbGUgZGl2IC50ZXN0Q2xhc3Ncblx0ICovXG5cdGRvY3VtZW50U2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIEhUTUxFbGVtZW50cy5cblx0ICovXG5cdGh0bWxFbGVtZW50cz86IEhUTUxFbGVtZW50W107XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGFnLlxuXHQgKi9cblx0dGFnPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbm5lY3RlZCBBUEkuXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9ucz86IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucztcblx0LyoqXG5cdCAqIEFueSBleHRyYSBhdHRyaWJ1dGVzIHRvIHJlZ2lzdGVyLlxuXHQgKi9cblx0b2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBjb21wb25lbnQuXG5cdCAqL1xuXHR0eXBlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZT86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBpbm5lciBIVE1MIG9yIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRpbm5lcjogYW55O1xuXHQvKipcblx0ICogVGhlIGV2ZW50cyB0byB0cmlnZ2VyLlxuXHQgKi9cblx0ZXZlbnRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0dHlwZTogc3RyaW5nO1xuXHRcdFx0XHRmdW5jOiBGdW5jdGlvbjtcblx0XHRcdFx0b3B0aW9ucz86IGFueTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBvdXRwdXQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBJZiBzZXQgdG8gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlT3V0cHV0PzogKCkgPT4gYm9vbGVhbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgZ2V0dGluZyB0aGUgb3V0cHV0LCBidXQgYmVmb3JlIHRoZSBET00gcGFyc2luZy5cblx0ICogXG5cdCAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgbGFzdCB0aW1lIHByaW9yIHRvIFxuXHQgKiBiZWluZyBwYXJzZWQgaW50byBhIERPTSBlbGVtZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIG91dHB1dCB0byBiZSBwYXJzZWQgYXMgYSBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUG9zdE91dHB1dD86IChvdXRwdXQ6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSkpID0+IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSk7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHdoZW4gaXRzIHRpbWUgdG8gZml4IHRoZSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIHdpbGwgc2tpcCB0aGUgSG90U3RhcSBkZWZhdWx0IGZpeGluZy5cblx0ICovXG5cdG9uRml4SFRNTD86IChvdXRwdXQ6IHN0cmluZykgPT4geyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgY3VzdG9tIERPTSBwYXJzZXIuXG5cdCAqL1xuXHRvblBhcnNlRE9NPzogKG91dHB1dDogc3RyaW5nKSA9PiBEb2N1bWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBwYXJzZWQgYW5kIGlzIHJlYWR5IHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBET00uXG5cdCAqL1xuXHRvblBhcnNlZD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblByZVBsYWNlPzogKGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBmaW5hbCB0aW1lIHByaW9yIHRvIGJlaW5nIHJlbmRlcmVkLlxuXHQgKi9cblx0b25Qb3N0UGxhY2U/OiAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBET00gZWxlbWVudCBvbnRvIHRoZSBuZXdseSBjcmVhdGVkIHBhcmVudC5cblx0ICovXG5cdG9uUGFyZW50UGxhY2U/OiAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdENvbXBvbmVudCBpbXBsZW1lbnRzIElIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgSFRNTEVsZW1lbnRzLlxuXHQgKi9cblx0aHRtbEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcuXG5cdCAqL1xuXHR0YWc6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb25uZWN0ZWQgQVBJLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zO1xuXHQvKipcblx0ICogQW55IGV4dHJhIGF0dHJpYnV0ZXMgdG8gcmVnaXN0ZXIuXG5cdCAqL1xuXHRvYnNlcnZlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgY29tcG9uZW50LlxuXHQgKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXHQvKipcblx0ICogVGhlIGlubmVyIEhUTUwgb3IgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdGlubmVyOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXZlbnRzIHRvIHRyaWdnZXIuXG5cdCAqL1xuXHRldmVudHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHR0eXBlOiBzdHJpbmc7XG5cdFx0XHRcdGZ1bmM6IEZ1bmN0aW9uO1xuXHRcdFx0XHRvcHRpb25zOiBhbnk7XG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gb3V0cHV0LlxuXHQgKiBcblx0ICogQHJldHVybnMgSWYgc2V0IHRvIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZU91dHB1dD8gKCk6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIGdldHRpbmcgdGhlIG91dHB1dCwgYnV0IGJlZm9yZSB0aGUgRE9NIHBhcnNpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyLiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGxhc3QgdGltZSBwcmlvciB0byBcblx0ICogYmVpbmcgcGFyc2VkIGludG8gYSBET00gZWxlbWVudC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBmaW5hbCBvdXRwdXQgdG8gYmUgcGFyc2VkIGFzIGEgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblBvc3RPdXRwdXQ/IChvdXRwdXQ6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSkpOiAoc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W10pO1xuXHQvKipcblx0ICogRXhlY3V0ZSB3aGVuIGl0cyB0aW1lIHRvIGZpeCB0aGUgSFRNTCBwcmlvciB0byBET00gcGFyc2luZy4gVGhpcyB3aWxsIHNraXAgdGhlIEhvdFN0YXEgZGVmYXVsdCBmaXhpbmcuXG5cdCAqL1xuXHRvbkZpeEhUTUw/IChvdXRwdXQ6IHN0cmluZyk6IHsgZml4ZWRTdHI6IHN0cmluZywgcXVlcnlTZWxlY3Rvcjogc3RyaW5nOyB9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhIGN1c3RvbSBET00gcGFyc2VyLlxuXHQgKi9cblx0b25QYXJzZURPTT8gKG91dHB1dDogc3RyaW5nKTogRG9jdW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHRoZSBvdXRwdXQgaGFzIGJlZW4gcGFyc2VkIGFuZCBpcyByZWFkeSB0byBiZSBwbGFjZWQgaW50byB0aGUgRE9NLlxuXHQgKi9cblx0b25QYXJzZWQ/IChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZztcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25QcmVQbGFjZT8gKGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgZmluYWwgdGltZSBwcmlvciB0byBiZWluZyByZW5kZXJlZC5cblx0ICovXG5cdG9uUG9zdFBsYWNlPyAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgRE9NIGVsZW1lbnQgb250byB0aGUgbmV3bHkgY3JlYXRlZCBwYXJlbnQuXG5cdCAqL1xuXHRvblBhcmVudFBsYWNlPyAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKChjb3B5IGluc3RhbmNlb2YgSG90U3RhcSkgfHwgKGNvcHkgPT0gbnVsbCkpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5odG1sRWxlbWVudHMgPSBbXTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRhZyA9IFwiXCI7XG5cdFx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0XHR0aGlzLmVsZW1lbnRPcHRpb25zID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXMgPSBbXTtcblx0XHRcdHRoaXMudHlwZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHRoaXMuaW5uZXIgPSBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weS5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLmh0bWxFbGVtZW50cyA9IGNvcHkuaHRtbEVsZW1lbnRzIHx8IFtdO1xuXHRcdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRhZyA9IGNvcHkudGFnIHx8IHRoaXMubmFtZTtcblx0XHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHRcdHRoaXMuZWxlbWVudE9wdGlvbnMgPSBjb3B5LmVsZW1lbnRPcHRpb25zIHx8IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMub2JzZXJ2ZWRBdHRyaWJ1dGVzID0gY29weS5vYnNlcnZlZEF0dHJpYnV0ZXMgfHwgW107XG5cdFx0XHR0aGlzLnR5cGUgPSBjb3B5LnR5cGUgfHwgXCJcIjtcblx0XHRcdHRoaXMudmFsdWUgPSBjb3B5LnZhbHVlIHx8IG51bGw7XG5cdFx0XHR0aGlzLmlubmVyID0gY29weS5pbm5lciB8fCBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoYXBpICE9IG51bGwpXG5cdFx0XHR0aGlzLmFwaSA9IGFwaTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudCB0aGF0J3MgY2FsbGVkIHdoZW4gdGhpcyBjb21wb25lbnQncyBET00gZWxlbWVudCBoYXMgYmVlbiBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25DcmVhdGVkIChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueVxuXHR7XG5cdFx0cmV0dXJuIChlbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgdGhlIGF0dHJpYnV0ZXMgbWFudWFsbHkuXG5cdCAqL1xuXHRoYW5kbGVBdHRyaWJ1dGVzPyAoYXR0cmlidXRlczogTmFtZWROb2RlTWFwKTogdm9pZDtcblxuXHQvKipcblx0ICogSGFuZGxlIGEgY2xpY2sgZXZlbnQuXG5cdCAqL1xuXHRjbGljaz8gKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0YWJzdHJhY3Qgb3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXTtcbn0iLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5cbmltcG9ydCB7IERldmVsb3Blck1vZGUsIEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuLyoqXG4gKiBBIGZpbGUgdG8gcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90RmlsZVxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCBwYWdlLlxuXHQgKi9cblx0cGFnZT86IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIGdldC5cblx0ICovXG5cdGxvY2FsRmlsZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9ycz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyc2VyIG9wdGlvbnMgZm9yIHdoZW4gcHJvY2Vzc2luZyBhIHN0cmluZyBvciBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlck9wdGlvbnNcbntcblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGZyb20gcHJvY2Vzc2luZy4gRGVmYXVsdDogdHJ1ZVxuXHQgKi9cblx0b3V0cHV0Q29tbWFuZHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogQWxsb3cgSlNPTi5zdHJpbmdpZnkgdG8gYmUgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy4gRGVmYXVsdDogdHJ1ZVxuXHQgKi9cblx0YWxsb3dTdHJpbmdpZnk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgZmlsZSB0byBwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgSG90RmlsZSBpbXBsZW1lbnRzIElIb3RGaWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0bG9jYWxGaWxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Y29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9yczogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdEZpbGUgPSB7fSlcblx0e1xuXHRcdHRoaXMucGFnZSA9IGNvcHkucGFnZSB8fCBudWxsO1xuXHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdHRoaXMudXJsID0gY29weS51cmwgfHwgXCJcIjtcblx0XHR0aGlzLmxvY2FsRmlsZSA9IGNvcHkubG9jYWxGaWxlIHx8IFwiXCI7XG5cdFx0dGhpcy5jb250ZW50ID0gY29weS5jb250ZW50IHx8IFwiXCI7XG5cdFx0dGhpcy50aHJvd0FsbEVycm9ycyA9IGNvcHkudGhyb3dBbGxFcnJvcnMgfHwgZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdHNldENvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWRcblx0e1xuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdGdldENvbnRlbnQgKCk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuICh0aGlzLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIGdldCByZXF1ZXN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGh0dHBHZXQgKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgcmVzID0gYXdhaXQgZmV0Y2ggKHVybCk7XG5cblx0XHRcdGlmIChyZXMub2sgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG5cdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgcmVzLnRleHQgKCk7XG5cblx0XHRcdHJldHVybiAoY29udGVudCk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRyZXR1cm4gKEpTT04uc3RyaW5naWZ5ICh7IFwiZXJyb3JcIjogYCR7ZXgubWVzc2FnZX0gLSBDb3VsZCBub3QgZmV0Y2ggJHt1cmx9YCB9KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgY29udGVudCBmcm9tIGEgdXJsLlxuXHQgKi9cblx0YXN5bmMgbG9hZFVybCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0aGlzLmNvbnRlbnQgPSBhd2FpdCBIb3RGaWxlLmh0dHBHZXQgKHRoaXMudXJsKTtcblxuXHRcdHJldHVybiAodGhpcy5jb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGNvbnRlbnQgZnJvbSBhIGxvY2FsIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkTG9jYWxGaWxlICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBuZXcgUHJvbWlzZSAoXG5cdFx0XHQocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSk6IHZvaWQgPT5cblx0XHRcdHtcblx0XHRcdFx0ZnMucmVhZEZpbGUgKHRoaXMubG9jYWxGaWxlLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24sIGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZXJyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IGVycjtcblxuXHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcgKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXNvbHZlICh0aGlzLmNvbnRlbnQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gKHByb21pc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLnVybCAhPT0gXCJcIilcblx0XHRcdGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRVcmwgKCk7XG5cblx0XHRpZiAodGhpcy5sb2NhbEZpbGUgIT09IFwiXCIpXG5cdFx0XHRjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkTG9jYWxGaWxlICgpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHN0cmluZyBjb250ZW50LiBUaGlzIHdpbGwgdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gY29udGVudFJlZ2V4IFRoZSByZWdleCB0byB1c2UgdG8gcGFyc2UgdGhlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBjb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIGluc2lkZSB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBvZmZDb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIFxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tRW5kIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIFxuXHQgKiB0aGUgZm91bmQgY29udGVudC5cblx0ICovXG5cdHN0YXRpYyBwcm9jZXNzQ29udGVudCAoY29udGVudDogc3RyaW5nLCBjb250ZW50UmVnZXg6IFJlZ0V4cCxcblx0XHRjb250ZW50UHJvY2Vzc29yOiAocmVnZXhGb3VuZDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0b2ZmQ29udGVudFByb2Nlc3NvcjogKG9mZkNvbnRlbnQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG51bVJlbW92ZUZyb21CZWdpbm5pbmc6IG51bWJlciA9IDIsXG5cdFx0bnVtUmVtb3ZlRnJvbUVuZDogbnVtYmVyID0gMik6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHJlc3VsdDogUmVnRXhwRXhlY0FycmF5ID0gY29udGVudFJlZ2V4LmV4ZWMgKGNvbnRlbnQpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR3aGlsZSAocmVzdWx0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHN0YXJ0OiBudW1iZXIgPSByZXN1bHQuaW5kZXggLSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nO1xuXHRcdFx0bGV0IGVuZDogbnVtYmVyID0gY29udGVudFJlZ2V4Lmxhc3RJbmRleCArIG51bVJlbW92ZUZyb21FbmQ7XG5cblx0XHRcdC8vIEdldCB0aGUgcHJldmlvdXMgc2VjdGlvbi5cblx0XHRcdGxldCBwcmV2Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChzdGFydCAtIHByZXZpb3VzSW5kZXgpKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQ7XG5cblx0XHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChwcmV2Q29udGVudCk7XG5cblx0XHRcdC8vIFByb2Nlc3MgdGhlIGNvbnRlbnQgZm91bmQgZnJvbSB0aGUgcmVnZXhcblx0XHRcdGxldCBjb250ZW50Rm91bmQ6IHN0cmluZyA9IHJlc3VsdFswXTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChjb250ZW50Rm91bmQpO1xuXG5cdFx0XHQvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IHNlY3Rpb24gdG8gcGFyc2UuXG5cdFx0XHRyZXN1bHQgPSBjb250ZW50UmVnZXguZXhlYyAoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwZW5kIHdoYXRldmVyIGVsc2UgaXMgYWZ0ZXIgdGhlIGxhc3QgcGFyc2VkIHNlY3Rpb24uXG5cdFx0bGV0IGxhc3RDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCk7XG5cblx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAobGFzdENvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW55IGNvbnRlbnQgdGhhdCBjb3VsZCBoYXZlIG5lc3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBcblx0ICogdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBmaXhtZSBOZWVkcyB0byBiZSBhYmxlIHRvIGlnbm9yZSBhbnkgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUgY29tbWVudHMgXG5cdCAqIG9yIGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBpcyB1c2VkIGBgYCR7XCJUZXN0IH1cIn1gYGAgSXQgXG5cdCAqIHdpbGwgZXJyb3Igb3V0LlxuXHQgKiBcblx0ICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gcGFyc2UuXG5cdCAqIEBwYXJhbSBjb250ZW50UmVnZXggVGhlIHJlZ2V4IHRvIHVzZSB0byBwYXJzZSB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NOZXN0ZWRDb250ZW50IChjb250ZW50OiBzdHJpbmcsIHN0YXJ0Q2hhcnM6IHN0cmluZywgZW5kQ2hhcnM6IHN0cmluZywgXG5cdFx0dHJpZ2dlckNoYXI6IHN0cmluZywgY29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG9mZkNvbnRlbnRQcm9jZXNzb3I6IChvZmZDb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRudW1SZW1vdmVGcm9tQmVnaW5uaW5nOiBudW1iZXIgPSAyLFxuXHRcdG51bVJlbW92ZUZyb21FbmQ6IG51bWJlciA9IDEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoc3RhcnRDaGFycyk7XG5cdFx0bGV0IHByZXZpb3VzSW5kZXg6IG51bWJlciA9IDA7XG5cdFx0bGV0IHN0YXJ0VHJpZ2dlclBvczogbnVtYmVyID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0d2hpbGUgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdGxldCBlbmQ6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIHBvcyk7XG5cdFx0XHRsZXQgbmVzdGVkQ291bnRlcjogbnVtYmVyID0gMDtcblxuXHRcdFx0aWYgKHRyaWdnZXJDaGFyICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXZlcnNlIHNlYXJjaCB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFxuXHRcdFx0XHQvLyBvY2N1cnJlbmNlcy5cblx0XHRcdFx0bGV0IHJwb3M6IG51bWJlciA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBlbmQgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHR3aGlsZSAocnBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHJwb3MgPT09IHN0YXJ0VHJpZ2dlclBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0cnBvcyA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBycG9zIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlcisrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbmVzdGVkIHRyaWdnZXIgY2hhcmFjdGVycywgZ2V0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXG5cdFx0XHQvLyB0aGUgZW5kIGNoYXJhY3Rlci5cblx0XHRcdGlmIChuZXN0ZWRDb3VudGVyID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGVwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRsZXQgdGVtcGVwb3M6IG51bWJlciA9IGVwb3M7XG5cblx0XHRcdFx0d2hpbGUgKChlcG9zID4gLTEpICYmIChuZXN0ZWRDb3VudGVyID4gMCkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGVtcGVwb3MgPCAwKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGRpc2NvdmVyaW5nIGVuZENoYXJzIHRoYXQgd2Ugc2hvdWxkbid0IGJlLlxuXHRcdFx0XHRcdGxldCBwb3NPdXRzaWRlT2ZDb250ZW50OiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mIChzdGFydENoYXJzLCB0ZW1wZXBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXG5cdFx0XHRcdFx0aWYgKHBvc091dHNpZGVPZkNvbnRlbnQgPiBlcG9zKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRlcG9zID0gdGVtcGVwb3M7XG5cblx0XHRcdFx0XHR0ZW1wZXBvcyA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVwb3MgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0XHRuZXN0ZWRDb3VudGVyLS07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlbmQgPSBlcG9zO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb2ZmQ29udGVudFN0cjogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChwb3MgLSBwcmV2aW91c0luZGV4KSk7XG5cdFx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAob2ZmQ29udGVudFN0cik7XG5cblx0XHRcdGxldCBmb3VuZENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChcblx0XHRcdFx0cG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZywgKGVuZCAtIChwb3MgKyBudW1SZW1vdmVGcm9tQmVnaW5uaW5nKSkpO1xuXHRcdFx0b3V0cHV0ICs9IGNvbnRlbnRQcm9jZXNzb3IgKGZvdW5kQ29udGVudCk7XG5cblx0XHRcdC8vIEdldCB0aGUgbmV4dCBjb250ZW50XG5cdFx0XHRwb3MgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0c3RhcnRUcmlnZ2VyUG9zID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQgKyBudW1SZW1vdmVGcm9tRW5kO1xuXHRcdH1cblxuXHRcdC8vIEFwcGVuZCB3aGF0ZXZlciBlbHNlIGlzIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBzZWN0aW9uLlxuXHRcdGxldCBsYXN0Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgpO1xuXG5cdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKGxhc3RDb250ZW50KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBjb250ZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRoaXNDb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gdGhyb3dBbGxFcnJvcnMgSWYgc2V0IHRvIHRydWUsIGFueSBlcnJvciB0aGF0IG9jY3VycyB3aWxsIGJlIHRocm93biBhcyBhbiBleGNlcHRpb24uXG5cdCAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgdGhlIGNvbnRlbnQuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VDb250ZW50ICh0aGlzQ29udGVudDogc3RyaW5nLCB0aHJvd0FsbEVycm9yczogYm9vbGVhbiwgcGFyc2VyT3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGlmIChwYXJzZXJPcHRpb25zID09IG51bGwpXG5cdFx0e1xuXHRcdFx0cGFyc2VyT3B0aW9ucyA9IHtcblx0XHRcdFx0XHRvdXRwdXRDb21tYW5kczogdHJ1ZSxcblx0XHRcdFx0XHRhbGxvd1N0cmluZ2lmeTogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGxldCBTVFJJTkdJRllfU1RBUlQ6IHN0cmluZyA9IFwiSlNPTi5zdHJpbmdpZnkgKFwiO1xuXHRcdGxldCBTVFJJTkdJRllfRU5EOiBzdHJpbmcgPSBcIilcIjtcblxuXHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRTVFJJTkdJRllfU1RBUlQgPSBcIlwiO1xuXHRcdFx0U1RSSU5HSUZZX0VORCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQXNzZW1ibGUgdGhlIEpTIHRvIGV2YWx1YXRlLiBUaGlzIHdpbGwgdGFrZSBhbGwgY29udGVudCBvdXRzaWRlIG9mIFxuXHRcdC8vIDwqIGFuZCAqPiBhbmQgd3JhcCBhIEhvdC5lY2hvIGFyb3VuZCBpdC4gQW55IEpTIGZvdW5kIGluc2lkZSBvZiB0aGUgXG5cdFx0Ly8gPCogYW5kICo+IHdpbGwgYmUgZXhlY3V0ZWQgYXMgaXMuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzQ29udGVudCAodGhpc0NvbnRlbnQsIFxuXHRcdFx0bmV3IFJlZ0V4cCAoXCIoPz1cXFxcPFxcXFwqKShbXFxcXHNcXFxcU10qPykoPz1cXFxcKlxcXFw+KVwiLCBcImdcIiksIFxuXHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBIGxpdHRsZSBoYWNrLCBzaW5jZSBJIHN1Y2sgYXQgUmVnZXggOihcblx0XHRcdFx0cmVnZXhGb3VuZCA9IHJlZ2V4Rm91bmQuc3Vic3RyICgyKTtcblxuXHRcdFx0XHRyZXR1cm4gKGAke3JlZ2V4Rm91bmR9YCk7XG5cdFx0XHR9LCBcblx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKG9mZkNvbnRlbnQgPT09IFwiXCIpXG5cdFx0XHRcdFx0cmV0dXJuIChcIlwiKTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0b2ZmQ29udGVudCwgXCIhe1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQyOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0LCBcIlNUUntcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWVjaG9PdXRwdXQgKEpTT04uc3RyaW5naWZ5KCR7cmVnZXhGb3VuZDJ9KSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAISR7U1RSSU5HSUZZX1NUQVJUfSR7cmVnZXhGb3VuZDJ9JHtTVFJJTkdJRllfRU5EfSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9LCA0LCAxKTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQzOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0MiwgXCIke1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBlc2NhcGVPdXRwdXQgPSAoY29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChjb250ZW50LnJlcGxhY2UoL1tgXS9nLCAnXFxcXGAnKSk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIXRyeSB7IEhvdC5lY2hvICgke3JlZ2V4Rm91bmQyfSk7IH1jYXRjaCAoZXgpe0hvdC5lY2hvIChcXGBcXFxcXFwkeyR7ZXNjYXBlT3V0cHV0IChyZWdleEZvdW5kMil9fVxcYCk7fSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aHJvd0FsbEVycm9ycyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIUhvdC5lY2hvICgke3JlZ2V4Rm91bmQyfSk7KiYhIyVAIUAqIWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhJHtyZWdleEZvdW5kMn0qJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHQvKmxldCBlc2NhcGVkQ29udGVudDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke2VzY2FwZWRDb250ZW50fSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0NDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHQvLyBBbnkgPygpIHdpbGwgYmUgaWdub3JlZCBpbiBwcm9kdWN0aW9uIG1vZGUuXG5cdFx0XHRcdGlmIChIb3QuTW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVtcE91dHB1dDQgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIj8oXCIsIFwiKVwiLCBcIihcIiwgXG5cdFx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFwiXCIpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoSG90Lk1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NCA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDMsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBmb3VuZFN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCBiZSBwYXJzZWQuIElmIHNvLCBzdHJpbmdpZnkgaXQuXG5cdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZSAocmVnZXhGb3VuZDIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMuYWxsb3dTdHJpbmdpZnkgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IEpTT04uc3RyaW5naWZ5IChyZWdleEZvdW5kMik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBgJHtyZWdleEZvdW5kMn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIElmIHZhbGlkIEpTT04gaXMgbm90IHJlY2VpdmVkLCBkb24ndCB3b3JyeSBhYm91dCBpdCwgcGFzcyBpdCBcblx0XHRcdFx0XHRcdFx0XHQvLyBhbG9uZyB0byB0aGUgZnVuY3Rpb24gYmVsb3cgZm9yIGl0IHRvIGJlIHBhcnNlZCBpbiB0aGUgcGFnZS5cblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gdGhlcmUgaW5zdGVhZC5cblx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IGAke3JlZ2V4Rm91bmQyfWA7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIE1ha2UgdGhpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIGFuZCBwYXNzIGZvdW5kU3RyLCBldGMuXG5cdFx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIXtcbmNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoJHtmb3VuZFN0cn0pO1xuSG90LmVjaG8gKFxcYGRhdGEtdGVzdC1vYmplY3QtbmFtZSA9IFwiXFwke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIlxcJHt0ZXN0RWxtLmZ1bmN9XCIgZGF0YS10ZXN0LW9iamVjdC12YWx1ZSA9IFwiXFwke3Rlc3RFbG0udmFsdWV9XCJcXGApO1xufSomISMlQCFAKiFcXG5gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBjcmVhdGVUZXN0RWxlbWVudCA9IChmb3VuZFN0cjI6IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdGVzdEVsbSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb2JqID0gZm91bmRTdHIyO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGZvdW5kU3RyMikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIyKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50c1t0ZXN0RWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7dGVzdEVsbS5uYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3IgcHJvY2Vzc2luZyB0ZXN0IGVsZW1lbnQgJHtmb3VuZFN0cjJ9IGluICR7SG90LkN1cnJlbnRQYWdlLm5hbWV9LiBFcnJvcjogJHtleC5tZXNzYWdlfWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKHRlc3RFbG0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoZm91bmRTdHIpO1xuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhZGF0YS10ZXN0LW9iamVjdC1uYW1lID0gXCIke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIiR7dGVzdEVsbS5mdW5jfVwiIGRhdGEtdGVzdC1vYmplY3QtdmFsdWUgPSBcIiR7dGVzdEVsbS52YWx1ZX1cIiomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDU6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQ0LCBcIiomJiUqJUAjQCFcIiwgXCIqJiEjJUAhQCohXCIsIFwiKiYmJSolQCNAIVwiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChyZWdleEZvdW5kKTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudCk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gb2ZmQ29udGVudDtcblxuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdG91dCA9IGBlY2hvT3V0cHV0ICgke2VzY2FwZWRDb250ZW50fSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG91dCA9IGVzY2FwZWRDb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XCIqJiYlKiVAI0AhXCIubGVuZ3RoLCBcIiomISMlQCFAKiFcIi5sZW5ndGgpO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgVGVtcG9yYXJ5IGhhY2suIFRoZXNlIGRlbGltaXRlcnMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0ZW1wT3V0cHV0IHdoZW4gXG5cdFx0XHRcdC8vLyBleGVjdXRpbmcgcHJvY2Vzc05lc3RlZENvbnRlbnQuXG5cdFx0XHRcdHRlbXBPdXRwdXQ1ID0gdGVtcE91dHB1dDUucmVwbGFjZSAoL1xcKlxcJlxcJlxcJVxcKlxcJVxcQFxcI1xcQFxcIS9nLCBcIlwiKTtcblx0XHRcdFx0dGVtcE91dHB1dDUgPSB0ZW1wT3V0cHV0NS5yZXBsYWNlICgvXFwqXFwmXFwhXFwjXFwlXFxAXFwhXFxAXFwqXFwhL2csIFwiXCIpO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcE91dHB1dDUpO1xuXHRcdFx0fSwgMCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyB0aGUgY29udGVudCBpbiB0aGlzIGZpbGUuIFRoaXMgdHJlYXRzIGVhY2ggZmlsZSBhcyBvbmUgbGFyZ2UgSmF2YVNjcmlwdFxuXHQgKiBmaWxlLiBBbnkgdGV4dCBvdXRzaWRlIG9mIHRoZSA8KiAqPiBhcmVhcyB3aWxsIGJlIHRyZWF0ZWQgYXM6XG5cdCAqIFxuXHQgKiBcdFx0SG90LmVjaG8gKFwidGV4dFwiKTtcblx0ICogXG5cdCAqIEBmaXhtZSBUaGUgcmVnZXgncyBpbiB0aGUgb2ZmQ29udGVudCBmdW5jdGlvbnMgbmVlZCB0byBiZSBmaXhlZC4gVGhlcmUncyBzZXZlcmFsIFxuXHQgKiB0ZXN0IGNhc2VzIHdoZXJlIHRoZXkgd2lsbCBmYWlsLlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHRoaXNDb250ZW50OiBzdHJpbmcgPSB0aGlzLmNvbnRlbnQ7XG5cblx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChhcmdzIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEluICR7dGhpcy5uYW1lfSwgdGhlIHBhc3NlZCBhcmd1bWVudHMgcmVjZWl2ZWQgY2Fubm90IGJlIGFuIGFycmF5IWApO1xuXHRcdH1cblxuXHRcdEhvdC5Nb2RlID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5tb2RlO1xuXHRcdEhvdC5Bcmd1bWVudHMgPSBhcmdzO1xuXHRcdEhvdC5DdXJyZW50UGFnZSA9IHRoaXMucGFnZTtcblx0XHRIb3QuUHVibGljS2V5cyA9IHRoaXMucGFnZS5wcm9jZXNzb3IucHVibGljS2V5cztcblx0XHRIb3QuQVBJID0gdGhpcy5wYWdlLmdldEFQSSAoKTtcblx0XHRIb3QuVGVzdGVyQVBJID0gdGhpcy5wYWdlLmdldFRlc3RlckFQSSAoKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucGFyc2VDb250ZW50ICh0aGlzQ29udGVudCwgdGhpcy50aHJvd0FsbEVycm9ycyk7XG5cblx0XHQvLyBFeGVjdXRlIHRoZSBhc3NlbWJsZWQgSlMgZmlsZS5cblx0XHRsZXQgcmV0dXJuZWRPdXRwdXQ6IGFueSA9IG51bGw7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uQ29udGVudDogc3RyaW5nID0gYFxuXHRcdFx0dmFyIEhvdCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHZhciBQYXNzZWRIb3RGaWxlID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0XHRgO1xuXG5cdFx0XHQvLyBPdXRwdXQgdGhlIGFyZ3VtZW50cyBzbyBpdCdzIHVzYWJsZSBpbiB0aGUgZW50aXJlIGRvY3VtZW50LlxuXHRcdFx0aWYgKHR5cGVvZiAoYXJncykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRoZSBwYXNzaW5nIGFyZ3VtZW50cyBjYW5ub3QgYmUgYSBzdHJpbmchYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBhcmdzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmV3VmFyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgbmV3VmFyVmFsdWU6IGFueSA9IGFyZ3Nba2V5XTtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAobmV3VmFyVmFsdWUpO1xuXG5cdFx0XHRcdG5ld1ZhciA9IGB2YXIgJHtrZXl9ID0gJHtuZXdWYXJWYWx1ZVN0cn07XFxuYDtcblxuXHRcdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG5ld1Zhcjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGNvbnRlbnROYW1lOiBzdHJpbmcgPSB0aGlzLm5hbWU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLmxvY2FsRmlsZTtcblxuXHRcdFx0aWYgKGNvbnRlbnROYW1lID09PSBcIlwiKVxuXHRcdFx0XHRjb250ZW50TmFtZSA9IHRoaXMudXJsO1xuXG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IGBcblx0XHRcdGZ1bmN0aW9uIGVjaG9PdXRwdXQgKGNvbnRlbnQsIHRocm93RXJyb3JzKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFcnJvcnMgPT0gbnVsbClcblx0XHRcdFx0XHR0aHJvd0Vycm9ycyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGNyZWF0ZVRlc3RFbGVtZW50IChmb3VuZFN0cilcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRlc3RFbG0gPSBudWxsO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG9iaiA9IGZvdW5kU3RyO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoZm91bmRTdHIpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xuXG5cdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHNbdGVzdEVsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcXGBUZXN0IGVsZW1lbnQgXFwke3Rlc3RFbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhXFxgKTtcblxuXHRcdFx0XHRcdEhvdC5DdXJyZW50UGFnZS5hZGRUZXN0RWxlbWVudCAodGVzdEVsbSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFxcYEVycm9yIHByb2Nlc3NpbmcgdGVzdCBlbGVtZW50IFxcJHtmb3VuZFN0cn0gaW4gXFwke0hvdC5DdXJyZW50UGFnZS5uYW1lfS4gRXJyb3I6IFxcJHtleC5tZXNzYWdlfVxcYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodGVzdEVsbSk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbnRlbnQgKEN1cnJlbnRIb3RGaWxlKVxuXHRcdFx0e1xcbmA7XG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG91dHB1dDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gYFxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJ1bkNvbnRlbnQgKFBhc3NlZEhvdEZpbGUpLnRoZW4gKCgpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiAoe1xuXHRcdFx0XHRcdFx0aG90OiBIb3QsXG5cdFx0XHRcdFx0XHRvdXRwdXQ6IEhvdC5PdXRwdXQsXG5cdFx0XHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeSAoSG90LkRhdGEpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7YDtcblxuXHRcdFx0Ly8vIEBmaXhtZSBQcmlvciB0byBleGVjdXRpb24gY29tcGlsZSBhbnkgVHlwZVNjcmlwdCBhbmQgbWFrZSBpdCBFUzUgY29tcGF0aWJsZS5cblx0XHRcdGxldCBmdW5jOiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbiAoZXhlY3V0aW9uQ29udGVudCk7XG5cdFx0XHRyZXR1cm5lZE91dHB1dCA9IGF3YWl0IGZ1bmMuYXBwbHkgKHRoaXMsIFtIb3QsIHRoaXNdKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdGlmIChleCBpbnN0YW5jZW9mIFN5bnRheEVycm9yKVxuXHRcdFx0e1xuXHRcdFx0XHQvLy8gQGZpeG1lIFB1dCB3aGF0J3MgaW4gdGhlIGNvbnRlbnQgdmFyaWFibGUgaW50byBhIHByZXYgY29udGVudCB2YXJpYWJsZT9cblx0XHRcdFx0Ly8vIFRoZW4gb25jZSB0aGVyZSdzIG5vIGxvbmdlciBhbnkgc3ludGF4IGVycm9ycyBiZWluZyB0aHJvd24sIGV4ZWN1dGUgdGhlIFxuXHRcdFx0XHQvLy8gY29kZT8gVGhpcyB3b3VsZCBhbHNvIHJlcXVpcmUgc2F2aW5nIGFueSBIVE1MIG91dHNpZGUgb2YgdGhlICo+IGFuZCA8KiBcblx0XHRcdFx0Ly8vIHRoZW4gZWNob2luZyBpdCBvdXQuIFRoZSB0aHJvdyBiZWxvdyB3b3VsZCBoYXZlIHRvIGJlIHJlbW92ZWQgYXMgd2VsbC5cblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRocm93IGV4O1xuXHRcdH1cblxuXHRcdEhvdC5EYXRhID0gcmV0dXJuZWRPdXRwdXQuaG90LkRhdGE7XG5cdFx0bGV0IGZpbmFsT3V0cHV0OiBzdHJpbmcgPSByZXR1cm5lZE91dHB1dC5vdXRwdXQ7XG5cdFx0SG90Lk91dHB1dCA9IFwiXCI7XG5cblx0XHRyZXR1cm4gKGZpbmFsT3V0cHV0KTtcblx0fVxufSIsIi8qKlxuICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdExvZ0xldmVsXG57XG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBpbmZvIG1lc3NhZ2VzLlxuXHQgKi9cblx0SW5mbyxcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IHdhcm5pbmcgbWVzc2FnZXMuXG5cdCAqL1xuXHRXYXJuaW5nLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgZXJyb3IgbWVzc2FnZXMuXG5cdCAqL1xuXHRFcnJvcixcblx0LyoqXG5cdCAqIFByaW50cyBhbGwgbWVzc2FnZXMuXG5cdCAqL1xuXHRWZXJib3NlLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcywgZXhjZXB0IHZlcmJvc2UuXG5cdCAqL1xuXHRBbGwsXG5cdC8qKlxuXHQgKiBEb2Vzbid0IHByaW50IGFueSBtZXNzYWdlLlxuXHQgKi9cblx0Tm9uZVxufVxuXG4vKipcbiAqIFRoZSBsb2dnZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RMb2dcbntcblx0LyoqXG5cdCAqIFRoZSBsb2dnaW5nIGxldmVsLlxuXHQgKi9cblx0bG9nTGV2ZWw6IEhvdExvZ0xldmVsO1xuXG5cdGNvbnN0cnVjdG9yIChsb2dMZXZlbDogSG90TG9nTGV2ZWwgPSBIb3RMb2dMZXZlbC5BbGwpXG5cdHtcblx0XHR0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgdGhlIGxvZ2dpbmcgbGV2ZWwuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2UgKGxvZ0xldmVsOiBzdHJpbmcpOiBIb3RMb2dMZXZlbFxuXHR7XG5cdFx0bGV0IGxldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbDtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJpbmZvXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkluZm87XG5cblx0XHRpZiAobG9nTGV2ZWwgPT09IFwid2FybmluZ1wiKVxuXHRcdFx0bGV2ZWwgPSBIb3RMb2dMZXZlbC5XYXJuaW5nO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcImVycm9yXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkVycm9yO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcInZlcmJvc2VcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuVmVyYm9zZTtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJhbGxcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuQWxsO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcIm5vbmVcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuTm9uZTtcblxuXHRcdHJldHVybiAobGV2ZWwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRsb2cgKGxldmVsOiBIb3RMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykgfHwgXG5cdFx0XHRcdChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbClcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHZlcmJvc2UgbWVzc2FnZS5cblx0ICovXG5cdHZlcmJvc2UgKG1lc3NhZ2U6IHN0cmluZyB8IEZ1bmN0aW9uKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSAoKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRpbmZvIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5pbmZvIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgd2FybmluZy5cblx0ICovXG5cdHdhcm5pbmcgKG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKSlcblx0XHR7XG5cdFx0XHRjb25zb2xlLndhcm4gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGVycm9yIChtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcilcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcikpXG5cdFx0e1xuXHRcdFx0bGV0IG1zZzogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdG1zZyA9IG1lc3NhZ2U7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChtZXNzYWdlLm1lc3NhZ2UgIT0gbnVsbClcblx0XHRcdFx0XHRtc2cgPSBtZXNzYWdlLm1lc3NhZ2U7XG5cblx0XHRcdFx0aWYgKG1lc3NhZ2Uuc3RhY2sgIT0gbnVsbClcblx0XHRcdFx0XHRtc2cgPSBtZXNzYWdlLnN0YWNrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zb2xlLmVycm9yIChtc2cpO1xuXHRcdH1cblx0fVxufSIsImltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RBc3NldCB9IGZyb20gXCIuL0hvdEFzc2V0XCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogTG9hZCBhIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBhc3NldHMgdG8gbG9hZCBmb3IgdGhlIGZyb250ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgSG90TW9kdWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGxpc3Qgb2YgTlBNIG1vZHVsZXMgdG8gaW1wb3J0LlxuXHQgKi9cblx0aW1wb3J0Pzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgSFRNTCBmaWxlcyB0byBsb2FkLlxuXHQgKi9cblx0aHRtbD86IChzdHJpbmcgfCBIb3RBc3NldClbXTtcblx0LyoqXG5cdCAqIFRoZSBDU1MgZmlsZXMgdG8gbG9hZC5cblx0ICovXG5cdGNzcz86IChzdHJpbmcgfCBIb3RBc3NldClbXTtcblx0LyoqXG5cdCAqIFRoZSBKUyBmaWxlcyB0byBsb2FkLlxuXHQgKi9cblx0anM/OiAoc3RyaW5nIHwgSG90QXNzZXQpW107XG5cdC8qKlxuXHQgKiBUaGUgZXhwb3J0ZWQgY29tcG9uZW50IGxpYnJhcnkgdGhhdCBjb250YWlucyBhbGwgdGhlIGNvbXBvbmVudHMgdG8gbG9hZC5cblx0ICovXG5cdGNvbXBvbmVudExpYnJhcnk/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0byBsb2FkLlxuXHQgKi9cblx0Y29tcG9uZW50cz86IChuZXcgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk/OiBIb3RBUEkpID0+IEhvdENvbXBvbmVudClbXTtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nKVxuXHR7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLmltcG9ydCA9IFtdO1xuXHRcdHRoaXMuaHRtbCA9IFtdO1xuXHRcdHRoaXMuY3NzID0gW107XG5cdFx0dGhpcy5qcyA9IFtdO1xuXHRcdHRoaXMuY29tcG9uZW50TGlicmFyeSA9IFwiXCI7XG5cdFx0dGhpcy5jb21wb25lbnRzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogT3V0cHV0IENTUy5cblx0ICovXG5cdG91dHB1dENTUyAoZWNob091dDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLmNzcyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHRoaXMub3V0cHV0QXNzZXQgKFwiY3NzXCIsIHRoaXMuY3NzLCAoYXNzZXQ6IEhvdEFzc2V0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBjb250ZW50OiBzdHJpbmcgfCBhbnkgPSBhc3NldC5vdXRwdXQgKCk7XG5cdFx0XHRcdG91dHB1dCArPSBgJHtjb250ZW50fVxcbmA7XG5cdFx0XHR9KTtcblxuXHRcdGlmIChlY2hvT3V0ID09PSB0cnVlKVxuXHRcdFx0SG90LmVjaG8gKG91dHB1dCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogT3V0cHV0IEpTLlxuXHQgKi9cblx0b3V0cHV0SlMgKGVjaG9PdXQ6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nXG5cdHtcblx0XHRpZiAodGhpcy5qcyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHRoaXMub3V0cHV0QXNzZXQgKFwianNcIiwgdGhpcy5qcywgKGFzc2V0OiBIb3RBc3NldCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgY29udGVudDogc3RyaW5nIHwgYW55ID0gYXNzZXQub3V0cHV0ICgpO1xuXHRcdFx0XHRvdXRwdXQgKz0gYCR7Y29udGVudH1cXG5gO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAoZWNob091dCA9PT0gdHJ1ZSlcblx0XHRcdEhvdC5lY2hvIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBhIGxvYWRlZCBIVE1MIGFzc2V0LlxuXHQgKi9cblx0YXN5bmMgb3V0cHV0IChhc3NldE5hbWU6IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0YXdhaXQgSG90LmluY2x1ZGUgKGAke3RoaXMubmFtZX0vJHthc3NldE5hbWV9LmhvdHRgLCBhcmdzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIEhUTUwgYXNzZXRzLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhUTUwgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLmh0bWwgPT0gbnVsbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBmaWxlczogYW55ID0ge307XG5cblx0XHR0aGlzLm91dHB1dEFzc2V0IChcImh0bWxcIiwgdGhpcy5odG1sLCAoYXNzZXQ6IEhvdEFzc2V0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBmaWxlID0gYXNzZXQub3V0cHV0ICgpO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhUTUwgYXNzZXRzIGNhbm5vdCBiZSBvdXRwdXR0ZWQgdXNpbmcgb25seSBhIHN0cmluZyFgKTtcblxuXHRcdFx0XHRmaWxlc1tmaWxlLm5hbWVdID0gZmlsZTtcblx0XHRcdH0pO1xuXG5cdFx0YXdhaXQgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5sb2FkSG90RmlsZXMgKGZpbGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgY29tcG9uZW50cyBhc3NldHMuXG5cdCAqL1xuXHRvdXRwdXRDb21wb25lbnRzIChlY2hvT3V0OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMuY29tcG9uZW50cyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChcIlwiKTtcblxuXHRcdGlmICh0aGlzLmNvbXBvbmVudHMubGVuZ3RoIDwgMSlcblx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5gO1xuXHRcdGxldCBjb21wb25lbnRMaWJyYXJ5OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMuY29tcG9uZW50TGlicmFyeSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmNvbXBvbmVudExpYnJhcnkgIT09IFwiXCIpXG5cdFx0XHRcdGNvbXBvbmVudExpYnJhcnkgPSBgJHt0aGlzLmNvbXBvbmVudExpYnJhcnl9LmA7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpSWR4XTtcblxuXHRcdFx0b3V0cHV0ICs9IGBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFkZENvbXBvbmVudCAoJHtjb21wb25lbnRMaWJyYXJ5fSR7Y29tcG9uZW50fSk7XFxuYDtcblx0XHR9XG5cblx0XHRvdXRwdXQgKz0gYDwvc2NyaXB0PmA7XG5cblx0XHRpZiAoZWNob091dCA9PT0gdHJ1ZSlcblx0XHRcdEhvdC5lY2hvIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBhbiBhc3NldCB0byBIVE1MLlxuXHQgKi9cblx0cHJvdGVjdGVkIG91dHB1dEFzc2V0IChhc3NldFR5cGU6IHN0cmluZywgYXNzZXRzOiAoc3RyaW5nIHwgSG90QXNzZXQpW10gPSBbXSwgXG5cdFx0Y2FsbGJhY2s6IChhc3NldDogSG90QXNzZXQpID0+IHZvaWQpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFzc2V0cy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgYXNzZXQ6IHN0cmluZyB8IEhvdEFzc2V0ID0gYXNzZXRzW2lJZHhdO1xuXHRcdFx0bGV0IGxvYWRBc3NldDogSG90QXNzZXQgPSBudWxsO1xuXHRcdFx0bG9hZEFzc2V0ID0gbmV3IEhvdEFzc2V0IChhc3NldFR5cGUpO1xuXG5cdFx0XHRpZiAodHlwZW9mIChhc3NldCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdGxvYWRBc3NldC5wYXRoID0gYXNzZXQ7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChhc3NldC5uYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZEFzc2V0Lm5hbWUgPSBhc3NldC5uYW1lO1xuXG5cdFx0XHRcdGlmIChhc3NldC5wYXRoICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZEFzc2V0LnBhdGggPSBhc3NldC5wYXRoO1xuXG5cdFx0XHRcdGlmIChhc3NldC5jb250ZW50ICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZEFzc2V0LmNvbnRlbnQgPSBhc3NldC5jb250ZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRjYWxsYmFjayAobG9hZEFzc2V0KTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdENvbXBvbmVudCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuXG4vKipcbiAqIEEgcGFnZSB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIGFkZGVkIHRvIHRoaXMgcGFnZS5cblx0ICovXG5cdGNvbXBvbmVudHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RDb21wb25lbnQgfTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLiBGaWxlIG9yZGVyaW5nIG1hdHRlcnMgaGVyZS5cblx0ICogRXZlcnkgZmlsZSBpcyBwcm9jZXNzZWQgaW5jcmVtZW50YWxseS5cblx0ICovXG5cdGZpbGVzPzogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50cyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RFbGVtZW50cz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFBhZ2UgaW1wbGVtZW50cyBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgYWRkZWQgdG8gdGhpcyBwYWdlLlxuXHQgKi9cblx0Y29tcG9uZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlczogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbWFwLlxuXHQgKi9cblx0dGVzdGVyTWFwOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0RWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYXRoOyB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90UGFnZSB8IEhvdFN0YXEpXG5cdHtcblx0XHRpZiAoY29weSBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGVzdGVyTmFtZSA9IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IFwiXCI7XG5cdFx0XHR0aGlzLmNvbXBvbmVudHMgPSB7fTtcblx0XHRcdHRoaXMuZmlsZXMgPSBbXTtcblx0XHRcdHRoaXMudGVzdEVsZW1lbnRzID0ge307XG5cdFx0XHR0aGlzLnRlc3RQYXRocyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJOYW1lID0gY29weS50ZXN0ZXJOYW1lIHx8IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBjb3B5LnRlc3Rlck1hcCB8fCBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IGNvcHkucm91dGUgfHwgXCJcIjtcblx0XHRcdHRoaXMuY29tcG9uZW50cyA9IGNvcHkuY29tcG9uZW50cyB8fCB7fTtcblx0XHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IFtdO1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSBjb3B5LnRlc3RFbGVtZW50cyB8fCB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0gY29weS50ZXN0UGF0aHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUgdG8gcHJvY2Vzcy4gSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBcblx0ICogYWRkaW5nIGl0IHRvIGEgcGFnZSBpZiBpdCdzIGFib3V0IHRvIGJlIHVzZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdHRoaXMuZmlsZXMucHVzaCAoZmlsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldEFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLmFwaSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB0ZXN0ZXIgQVBJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0ZXJBUEkgKCk6IEhvdEFQSVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnByb2Nlc3Nvci50ZXN0ZXJBUEkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHBhZ2UuIENvdWxkIGRlY3JlYXNlIHBhZ2UgbG9hZGluZyBwZXJmb3JtYW5jZS5cblx0ICogSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBhZGRpbmcgaXQgdG8gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoZmlsZTogSG90RmlsZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXHRcdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdFx0b3V0cHV0ICs9IGF3YWl0IGZpbGUucHJvY2VzcyAoYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGFkZFRlc3RFbGVtZW50IChlbG06IEhvdFRlc3RFbGVtZW50KTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW2VsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7ZWxtLm5hbWV9IGFscmVhZHkgZXhpc3RzIWApO1xuXG5cdFx0dGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdID0gZWxtO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGdldFRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcpOiBIb3RUZXN0RWxlbWVudFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtuYW1lfSBkb2VzdCBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSB0ZXN0IHBhdGguXG5cdCAqL1xuXHRjcmVhdGVUZXN0UGF0aCAocGF0aE5hbWU6IHN0cmluZywgZHJpdmVyRnVuYzogSG90VGVzdFBhdGgpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0UGF0aHNbcGF0aE5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IHBhdGggJHtwYXRoTmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gPSBkcml2ZXJGdW5jO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgSG90RXZlbnRNZXRob2QsIElIb3RSb3V0ZU1ldGhvZCwgXG5cdFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uLCBUZXN0Q2FzZUZ1bmN0aW9uLCBUZXN0Q2FzZU9iamVjdCwgU2VydmVyUmVxdWVzdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIFRoZSByb3V0ZSB0byB1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciB0aGF0IG1haW50YWlucyB0aGUgY29ubmVjdGlvbnMuXG5cdCAqL1xuXHRjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZS5cblx0ICovXG5cdHJvdXRlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2ZXJzaW9uLlxuXHQgKi9cblx0dmVyc2lvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdXRlIG1ldGhvZC5cblx0ICovXG5cdHByZWZpeDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUuXG5cdCAqL1xuXHRtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdO1xuXHQvKipcblx0ICogVGhlIGVycm9ycyBhbmQgdGhlaXIgSlNPTiB0aGF0IGNhbiBiZSB0aHJvd24uIENhbiBiZTpcblx0ICogKiBub3RfYXV0aG9yaXplZFxuXHQgKiAqIG5vX3NlcnZlcl9leGVjdXRlX2Z1bmN0aW9uXG5cdCAqL1xuXHRlcnJvcnM6IHsgW2Vycm9yOiBzdHJpbmddOiBhbnkgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCByb3V0ZTogc3RyaW5nLCBtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdID0gW10pXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMubG9nZ2VyID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmxvZ2dlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IubG9nZ2VyO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGUgPSByb3V0ZTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLnZlcnNpb24gPSBcInYxXCI7XG5cdFx0dGhpcy5wcmVmaXggPSBcIlwiO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gbnVsbDtcblx0XHR0aGlzLm1ldGhvZHMgPSBtZXRob2RzO1xuXHRcdHRoaXMuZXJyb3JzID0ge1xuXHRcdFx0XHRcIm5vdF9hdXRob3JpemVkXCI6IEhvdFJvdXRlLmNyZWF0ZUVycm9yIChcIk5vdCBhdXRob3JpemVkLlwiKSxcblx0XHRcdFx0XCJub19zZXJ2ZXJfZXhlY3V0ZV9mdW5jdGlvblwiOiBIb3RSb3V0ZS5jcmVhdGVFcnJvciAoXCJNaXNzaW5nIHNlcnZlciBleGVjdXRlIGZ1bmN0aW9uLlwiKSxcblx0XHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGVycm9yIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUVycm9yIChtZXNzYWdlOiBzdHJpbmcpOiBhbnlcblx0e1xuXHRcdHJldHVybiAoeyBlcnJvcjogbWVzc2FnZSB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gQVBJIG1ldGhvZCB0byB0aGlzIHJvdXRlLlxuXHQgKiBcblx0ICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGFkZC4gSWYgYSBIb3RSb3V0ZU1ldGhvZCBpcyBzdXBwbGllZCwgdGhlIFxuXHQgKiByZXN0IG9mIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgd2lsbCBiZSBpZ25vcmVkLlxuXHQgKi9cblx0YWRkTWV0aG9kIChcblx0XHRtZXRob2Q6IEhvdFJvdXRlTWV0aG9kIHwgSUhvdFJvdXRlTWV0aG9kIHwgc3RyaW5nLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLFxuXHRcdHR5cGU6IEhvdEV2ZW50TWV0aG9kID0gSG90RXZlbnRNZXRob2QuUE9TVCxcblx0XHR0ZXN0Q2FzZXM6IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXSA9IG51bGxcblx0XHQpOiB2b2lkXG5cdHtcblx0XHRpZiAodHlwZW9mIChtZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bWV0aG9kID0gbmV3IEhvdFJvdXRlTWV0aG9kICh0aGlzLCBtZXRob2QsIGV4ZWN1dGVGdW5jdGlvbiwgdHlwZSwgbnVsbCwgbnVsbCwgbnVsbCwgdGVzdENhc2VzKTtcblxuXHRcdGlmIChtZXRob2QgaW5zdGFuY2VvZiBIb3RSb3V0ZU1ldGhvZClcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoIChtZXRob2QpO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAobWV0aG9kLnJvdXRlID09IG51bGwpXG5cdFx0XHRcdG1ldGhvZC5yb3V0ZSA9IHRoaXM7XG5cblx0XHRcdG1ldGhvZCA9IG5ldyBIb3RSb3V0ZU1ldGhvZCAobWV0aG9kKTtcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoICgoPEhvdFJvdXRlTWV0aG9kPm1ldGhvZCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBtZXRob2QgYnkgaXQncyBuYW1lLlxuXHQgKi9cblx0Z2V0TWV0aG9kIChuYW1lOiBzdHJpbmcpOiBIb3RSb3V0ZU1ldGhvZFxuXHR7XG5cdFx0bGV0IGZvdW5kTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHRoaXMubWV0aG9kc1tpSWR4XTtcblxuXHRcdFx0aWYgKG1ldGhvZC5uYW1lID09PSBuYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3VuZE1ldGhvZCA9IG1ldGhvZDtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kTWV0aG9kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIHJvdXRlIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvdXRlIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uRXhlY3V0ZSBpbiB0aGUgXG5cdCAqIGNhbGxlZCBIb3RSb3V0ZU1ldGhvZC4gVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIFxuXHQgKiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqL1xuXHRvbkF1dGhvcml6ZVVzZXI6IChyZXE6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55PiA9IG51bGw7XG59IiwiaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgSG90V2ViU29ja2V0Q2xpZW50IH0gZnJvbSBcIi4vSG90V2ViU29ja2V0Q2xpZW50XCI7XG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBldmVudCBtZXRob2RzLlxuICovXG5leHBvcnQgZW51bSBIb3RFdmVudE1ldGhvZFxue1xuXHQvKipcblx0ICogQSBIVFRQIEdFVCByZXF1ZXN0LlxuXHQgKi9cblx0R0VUID0gXCJnZXRcIixcblx0LyoqXG5cdCAqIEEgSFRUUCBQT1NUIHJlcXVlc3QuXG5cdCAqL1xuXHRQT1NUID0gXCJwb3N0XCIsXG5cdC8qKlxuXHQgKiBUaGlzIHdpbGwgdXBsb2FkIGEgZmlsZSwgdGhlbiBwb3N0IHRoZSBqc29uIHJlcXVlc3QgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdEZJTEVfVVBMT0FEID0gXCJmaWxlX3VwbG9hZF90aGVuX3Bvc3RfanNvblwiLFxuXHQvKipcblx0ICogQSB3ZWJzb2NrZXQgZXZlbnQuXG5cdCAqL1xuXHRXRUJTT0NLRVRfQ0xJRU5UX1BVQl9FVkVOVCA9IFwid2Vic29ja2V0X2NsaWVudF9wdWJfZXZlbnRcIlxufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHRoYXQgY2FtZSBmcm9tIGEgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJSZXF1ZXN0XG57XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXE/OiBleHByZXNzLlJlcXVlc3Q7XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXNwb25zZSB0byBzZW5kIHRvIHRoZSBjbGllbnQuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIHdlYnNvY2tldCBjb25uZWN0aW9uLlxuXHQgKi9cblx0cmVzPzogZXhwcmVzcy5SZXNwb25zZTtcblx0LyoqXG5cdCAqIFRoZSBjbGllbnQgd2Vic29ja2V0IHRoYXQgd2FzIHVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZS4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgSFRUUCBjb25uZWN0aW9uLlxuXHQgKi9cblx0d3NTb2NrZXQ/OiBIb3RXZWJTb2NrZXRDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBhdXRob3JpemluZyBhIGNsaWVudC4gQ2FuIGJlIGEgSldUIHRva2VuLCBhcGkga2V5LCBldGMuXG5cdCAqIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdGF1dGhvcml6ZWRWYWx1ZT86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBKU09OIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC5cblx0ICovXG5cdGpzb25PYmo/OiBhbnk7XG5cdC8qKlxuXHQgKiBBbnkgcXVlcnkgdmFyaWFibGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBudWxsIGlmIHRoaXMgcmVxdWVzdCB3YXMgXG5cdCAqIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdHF1ZXJ5T2JqPzogYW55O1xuXHQvKipcblx0ICogQW55IGZpbGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBudWxsIGlmIG5vIGZpbGVzIHdlcmUgc2VudC5cblx0ICogT25jZSBhIGZpbGUgaXMgdXBsb2FkZWQsIHlvdSBjYW4gYWNjZXNzIGl0IGF0IHRoZSB0ZW1wb3JhcnkgcGF0aCBmb3VuZCBpbjogXG5cdCAqIGZpbGVzW3VwbG9hZElkXS5wYXRoXG5cdCAqL1xuXHRmaWxlcz86IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHRzaXplOiBudW1iZXI7XG5cdFx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHRoYXQgY2FtZSBmcm9tIGEgY2xpZW50LlxuICovXG5leHBvcnQgY2xhc3MgU2VydmVyUmVxdWVzdCBpbXBsZW1lbnRzIElTZXJ2ZXJSZXF1ZXN0XG57XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXE6IGV4cHJlc3MuUmVxdWVzdDtcblx0LyoqXG5cdCAqIFRoZSBleHByZXNzIHJlc3BvbnNlIHRvIHNlbmQgdG8gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXM6IGV4cHJlc3MuUmVzcG9uc2U7XG5cdC8qKlxuXHQgKiBUaGUgY2xpZW50IHdlYnNvY2tldCB0aGF0IHdhcyB1c2VkIHRvIHNlbmQgdGhlIG1lc3NhZ2UuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIEhUVFAgY29ubmVjdGlvbi5cblx0ICovXG5cdHdzU29ja2V0OiBIb3RXZWJTb2NrZXRDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBhdXRob3JpemluZyBhIGNsaWVudC4gQ2FuIGJlIGEgSldUIHRva2VuLCBhcGkga2V5LCBldGMuXG5cdCAqIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdGF1dGhvcml6ZWRWYWx1ZTogYW55O1xuXHQvKipcblx0ICogVGhlIEpTT04gcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LlxuXHQgKi9cblx0anNvbk9iajogYW55O1xuXHQvKipcblx0ICogQW55IHF1ZXJ5IHZhcmlhYmxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIFxuXHQgKiByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRxdWVyeU9iajogYW55O1xuXHQvKipcblx0ICogQW55IGZpbGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBudWxsIGlmIG5vIGZpbGVzIHdlcmUgc2VudC5cblx0ICogT25jZSBhIGZpbGUgaXMgdXBsb2FkZWQsIHlvdSBjYW4gYWNjZXNzIGl0IGF0IHRoZSB0ZW1wb3JhcnkgcGF0aCBmb3VuZCBpbjogXG5cdCAqIGZpbGVzW3VwbG9hZElkXS5wYXRoXG5cdCAqL1xuXHRmaWxlczoge1xuXHRcdFtrZXk6IHN0cmluZ106IHtcblx0XHRcdG5hbWU6IHN0cmluZztcblx0XHRcdHNpemU6IG51bWJlcjtcblx0XHRcdHBhdGg6IHN0cmluZztcblx0XHR9XG5cdH07XG5cblx0Y29uc3RydWN0b3IgKG9iajogSVNlcnZlclJlcXVlc3QgPSBudWxsKVxuXHR7XG5cdFx0aWYgKG9iaiA9PSBudWxsKVxuXHRcdFx0b2JqID0ge307XG5cblx0XHR0aGlzLnJlcSA9IG9iai5yZXEgfHwgbnVsbDtcblx0XHR0aGlzLnJlcyA9IG9iai5yZXMgfHwgbnVsbDtcblx0XHR0aGlzLndzU29ja2V0ID0gb2JqLndzU29ja2V0IHx8IG51bGw7XG5cdFx0dGhpcy5hdXRob3JpemVkVmFsdWUgPSBvYmouYXV0aG9yaXplZFZhbHVlIHx8IG51bGw7XG5cdFx0dGhpcy5qc29uT2JqID0gb2JqLmpzb25PYmogfHwgbnVsbDtcblx0XHR0aGlzLnF1ZXJ5T2JqID0gb2JqLnF1ZXJ5T2JqIHx8IG51bGw7XG5cdFx0dGhpcy5maWxlcyA9IG9iai5maWxlcyB8fCBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlciB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHdpdGggRXhwcmVzcy5cbiAqIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhpcyByb3V0ZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb24gPSAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiA9IChyZXF1ZXN0OiBTZXJ2ZXJSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCB0eXBlIENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIgZm9yIGF1dGhvcml6YXRpb24uIEFueSB2YWx1ZSBcbiAqIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24uXG4gKiBJZiBhbiB1bmRlZmluZWQgdmFsdWUgaXMgcmV0dXJuZWQsIHRoaXMgaW5kaWNhdGVzIHRoZSBzZXJ2ZXIgd2FzIG5vdCBhYmxlIFxuICogdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCBzbyB0aGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gd2lsbCBub3QgYmUgXG4gKiBleGVjdXRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uID0gKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogVGhlIHRlc3QgY2FzZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICovXG5leHBvcnQgdHlwZSBUZXN0Q2FzZUZ1bmN0aW9uID0gKChkcml2ZXI6IEhvdFRlc3REcml2ZXIpID0+IFByb21pc2U8YW55PikgfCAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gYW55KTtcbi8qKlxuICogVGhlIHRlc3QgY2FzZSBvYmplY3QgdG8gcGFzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZU9iamVjdFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuXHQgKi9cblx0ZnVuYzogVGVzdENhc2VGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBIG1ldGhvZCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90Um91dGVNZXRob2RQYXJhbWV0ZXJcbntcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHBhcmFtZXRlci4gRGVmYXVsdDogc3RyaW5nXG5cdCAqIENhbiBiZTpcblx0ICogKiBzdHJpbmdcblx0ICogKiBpbnRlZ2VyXG5cdCAqICogbnVtYmVyXG5cdCAqICogYm9vbGVhblxuXHQgKiAqIGFycmF5XG5cdCAqICogb2JqZWN0XG5cdCAqL1xuXHR0eXBlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuIERlZmF1bHQ6IFwiXCJcblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogSXMgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZWQ/IERlZmF1bHQ6IGZhbHNlXG5cdCAqL1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgb2JqZWN0LlxuXHQgKi9cblx0cGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9O1xufVxuXG4vKipcbiAqIEFuIEFQSSBtZXRob2QgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90Um91dGVNZXRob2Rcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcm91dGUuXG5cdCAqL1xuXHRyb3V0ZT86IEhvdFJvdXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHJldHVybnMgZnJvbSB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHJldHVybnM/OiBzdHJpbmcgfCBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjtcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlPzogSG90RXZlbnRNZXRob2Q7XG5cdC8qKlxuXHQgKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgXG5cdCAqIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXV0aENyZWRlbnRpYWxzPzogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0O1xuXHRcdH0gfCAoc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbilbXSB8IFRlc3RDYXNlRnVuY3Rpb25bXSB8IFRlc3RDYXNlT2JqZWN0W107XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIG1ldGhvZCB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI/OiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZCBcblx0ICogaXMgc2V0LCB0aGlzIHdpbGwgbm90IGNhbGwgb25BdXRob3JpemUgZm9yIHRoZSBwYXJlbnQgSG90Um91dGUuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlLiBcblx0ICogVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICogXG5cdCAqIEN1cnJlbnRseSB0aGlzIGhhcyBubyBlZmZlY3Qgd2hlbiB1c2luZyB3ZWJzb2NrZXRzLlxuXHQgKi9cblx0b25TZXJ2ZXJBdXRob3JpemU/OiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBbiBBUEkgbWV0aG9kIHRvIG1ha2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZU1ldGhvZCBpbXBsZW1lbnRzIElIb3RSb3V0ZU1ldGhvZFxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCByb3V0ZS5cblx0ICovXG5cdHJvdXRlOiBIb3RSb3V0ZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHJldHVybnMgZnJvbSB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHJldHVybnM6IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyO1xuXHQvKipcblx0ICogVGhlIHBhcmFtZXRlcnMgaW4gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRwYXJhbWV0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjsgfTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0dHlwZTogSG90RXZlbnRNZXRob2Q7XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyBtZXRob2QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZlcj8gVGhpcyBcblx0ICogcHJldmVudHMgdGhlIG1ldGhvZCBmcm9tIGJlaW5nIHJlcmVnaXN0ZXJlZC5cblx0ICovXG5cdGlzUmVnaXN0ZXJlZDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIG1ldGhvZCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmVyPyBUaGlzIFxuXHQgKiBwcmV2ZW50cyB0aGUgbWV0aG9kIGZyb20gYmVpbmcgcmVyZWdpc3RlcmVkLlxuXHQgKi9cblx0ZXhlY3V0ZVNldHVwOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgbWV0aG9kIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3Rlcj86IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuIElmIHRoaXMgbWV0aG9kIFxuXHQgKiBpcyBzZXQsIHRoaXMgd2lsbCBub3QgY2FsbCBvbkF1dGhvcml6ZSBmb3IgdGhlIHBhcmVudCBIb3RSb3V0ZS5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvblNlcnZlckV4ZWN1dGUuIFxuXHQgKiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBjbGllbnQgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJBdXRob3JpemU/OiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcblxuXHRjb25zdHJ1Y3RvciAocm91dGU6IEhvdFJvdXRlIHwgSUhvdFJvdXRlTWV0aG9kLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCBcblx0XHRvbkV4ZWN1dGU6IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIHwgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHR0eXBlOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIG9uU2VydmVyQXV0aG9yaXplOiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHRvblJlZ2lzdGVyOiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9IG51bGwsIGF1dGhDcmVkZW50aWFsczogYW55ID0gbnVsbCwgXG5cdFx0dGVzdENhc2VzOiB7IFtuYW1lOiBzdHJpbmddOiBUZXN0Q2FzZU9iamVjdDsgfSB8IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXSA9IG51bGwpXG5cdHtcblx0XHRsZXQgbmV3Um91dGU6IEhvdFJvdXRlID0gbnVsbDtcblxuXHRcdGlmIChyb3V0ZSBpbnN0YW5jZW9mIEhvdFJvdXRlKVxuXHRcdFx0bmV3Um91dGUgPSByb3V0ZTtcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0bmV3Um91dGUgPSByb3V0ZS5yb3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLnR5cGUgIT0gbnVsbClcblx0XHRcdFx0dHlwZSA9IHJvdXRlLnR5cGU7XG5cblx0XHRcdGlmIChyb3V0ZS5uYW1lICE9IG51bGwpXG5cdFx0XHRcdG5hbWUgPSByb3V0ZS5uYW1lO1xuXG5cdFx0XHRpZiAocm91dGUuZGVzY3JpcHRpb24gIT0gbnVsbClcblx0XHRcdFx0dGhpcy5kZXNjcmlwdGlvbiA9IHJvdXRlLmRlc2NyaXB0aW9uO1xuXG5cdFx0XHRpZiAocm91dGUucmV0dXJucyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodHlwZW9mIChyb3V0ZS5yZXR1cm5zKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMucmV0dXJucyA9IHtcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiByb3V0ZS5yZXR1cm5zXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLnJldHVybnMgPSByb3V0ZS5yZXR1cm5zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm91dGUucGFyYW1ldGVycyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7fTtcblxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGUucGFyYW1ldGVycylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBwYXJhbSA9IHJvdXRlLnBhcmFtZXRlcnNba2V5XTtcblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKHBhcmFtKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aGlzLnBhcmFtZXRlcnNba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcInR5cGVcIjogcGFyYW0sXG5cdFx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChwYXJhbS50eXBlID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHBhcmFtLnR5cGUgPSBcInN0cmluZ1wiO1xuXG5cdFx0XHRcdFx0XHR0aGlzLnBhcmFtZXRlcnNba2V5XSA9IHBhcmFtO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm91dGUuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IHJvdXRlLmF1dGhDcmVkZW50aWFscztcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRvbkV4ZWN1dGUgPSByb3V0ZS5vblNlcnZlckV4ZWN1dGU7XG5cblx0XHRcdGlmIChyb3V0ZS5vblNlcnZlckF1dGhvcml6ZSAhPSBudWxsKVxuXHRcdFx0XHRvblNlcnZlckF1dGhvcml6ZSA9IHJvdXRlLm9uU2VydmVyQXV0aG9yaXplO1xuXG5cdFx0XHRpZiAocm91dGUub25SZWdpc3RlciAhPSBudWxsKVxuXHRcdFx0XHRvblJlZ2lzdGVyID0gcm91dGUub25SZWdpc3RlcjtcblxuXHRcdFx0aWYgKHJvdXRlLm9uUG9zdFJlZ2lzdGVyICE9IG51bGwpXG5cdFx0XHRcdHRoaXMub25Qb3N0UmVnaXN0ZXIgPSByb3V0ZS5vblBvc3RSZWdpc3RlcjtcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IHJvdXRlLm9uU2VydmVyRXhlY3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLm9uQ2xpZW50RXhlY3V0ZSA9IHJvdXRlLm9uQ2xpZW50RXhlY3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLnRlc3RDYXNlcyAhPSBudWxsKVxuXHRcdFx0XHR0ZXN0Q2FzZXMgPSByb3V0ZS50ZXN0Q2FzZXM7XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBBbGwgcm91dGUgbWV0aG9kcyBtdXN0IGhhdmUgYSBuYW1lIWApO1xuXG5cdFx0dGhpcy5yb3V0ZSA9IG5ld1JvdXRlO1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHR0aGlzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZXhlY3V0ZVNldHVwID0gZmFsc2U7XG5cdFx0dGhpcy5hdXRoQ3JlZGVudGlhbHMgPSBhdXRoQ3JlZGVudGlhbHM7XG5cdFx0dGhpcy5vblNlcnZlckF1dGhvcml6ZSA9IG9uU2VydmVyQXV0aG9yaXplO1xuXHRcdHRoaXMub25SZWdpc3RlciA9IG9uUmVnaXN0ZXI7XG5cdFx0dGhpcy50ZXN0Q2FzZXMgPSB7fTtcblxuXHRcdGlmICh0aGlzLnJvdXRlLmNvbm5lY3Rpb24ucHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RDYXNlcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdENhc2VzIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRlc3RDYXNlcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqID0gdGVzdENhc2VzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0ZXN0Q2FzZU5hbWU6IHN0cmluZyA9IG9iajtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZnVuYzogVGVzdENhc2VGdW5jdGlvbiA9ICg8VGVzdENhc2VGdW5jdGlvbj50ZXN0Q2FzZXNbaUlkeCArIDFdKTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlICh0ZXN0Q2FzZU5hbWUsIGZ1bmMpO1xuXHRcdFx0XHRcdFx0XHRpSWR4Kys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMuYWRkVGVzdENhc2UgKG9iaik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0ZXN0Q2FzZXMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9iaiA9IHRlc3RDYXNlc1trZXldO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlIChvYmopO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnJvdXRlLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IG9uRXhlY3V0ZTtcblx0XHQvL2Vsc2Vcblx0XHRcdC8vdGhpcy5vbkNsaWVudEV4ZWN1dGUgPSBvbkV4ZWN1dGU7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgbmV3IHRlc3QgY2FzZS5cblx0ICovXG5cdGFkZFRlc3RDYXNlIChuZXdUZXN0Q2FzZTogVGVzdENhc2VPYmplY3QgfCBzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uLCBcblx0XHRcdHRlc3RDYXNlRnVuY3Rpb246IFRlc3RDYXNlRnVuY3Rpb24gPSBudWxsKTogdm9pZFxuXHR7XG5cdFx0aWYgKHR5cGVvZiAobmV3VGVzdENhc2UpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IG5ld1Rlc3RDYXNlO1xuXHRcdFx0Y29uc3QgZnVuYzogVGVzdENhc2VGdW5jdGlvbiA9IHRlc3RDYXNlRnVuY3Rpb247XG5cblx0XHRcdHRoaXMudGVzdENhc2VzW25hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdFx0ZnVuYzogZnVuY1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiAobmV3VGVzdENhc2UpID09PSBcImZ1bmN0aW9uXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgdGVzdENhc2VJZDogbnVtYmVyID0gT2JqZWN0LmtleXMgKHRoaXMudGVzdENhc2VzKS5sZW5ndGg7XG5cdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJvdXRlLnJvdXRlfS8ke3RoaXMubmFtZX0gdGVzdCBjYXNlICR7dGVzdENhc2VJZH1gO1xuXHRcdFx0Y29uc3QgZnVuYzogVGVzdENhc2VGdW5jdGlvbiA9ICg8VGVzdENhc2VGdW5jdGlvbj5uZXdUZXN0Q2FzZSk7XG5cblx0XHRcdHRoaXMudGVzdENhc2VzW25hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdFx0ZnVuYzogZnVuY1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGVzdENhc2U6IFRlc3RDYXNlT2JqZWN0ID0gKDxUZXN0Q2FzZU9iamVjdD5uZXdUZXN0Q2FzZSk7XG5cdFx0dGhpcy50ZXN0Q2FzZXNbdGVzdENhc2UubmFtZV0gPSB0ZXN0Q2FzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlbGF0aXZlIHVybCBmcm9tIHRoaXMgbWV0aG9kIGFuZCBpdHMgcm91dGUuXG5cdCAqL1xuXHRnZXRSb3V0ZVVybCAoKTogc3RyaW5nXG5cdHtcblx0XHRpZiAodGhpcy5yb3V0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgUm91dGUgbWV0aG9kICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IHJvdXRlIWApO1xuXG5cdFx0bGV0IG1ldGhvZE5hbWU6IHN0cmluZyA9IFwiL1wiO1xuXG5cdFx0aWYgKHRoaXMucm91dGUudmVyc2lvbiAhPT0gXCJcIilcblx0XHRcdG1ldGhvZE5hbWUgKz0gYCR7dGhpcy5yb3V0ZS52ZXJzaW9ufS9gO1xuXG5cdFx0aWYgKHRoaXMucm91dGUucHJlZml4ICE9PSBcIlwiKVxuXHRcdFx0bWV0aG9kTmFtZSArPSBgJHt0aGlzLnJvdXRlLnByZWZpeH0vYDtcblxuXHRcdGlmICh0aGlzLnJvdXRlLnJvdXRlICE9PSBcIlwiKVxuXHRcdFx0bWV0aG9kTmFtZSArPSBgJHt0aGlzLnJvdXRlLnJvdXRlfS9gO1xuXG5cdFx0bWV0aG9kTmFtZSArPSB0aGlzLm5hbWU7XG5cblx0XHRyZXR1cm4gKG1ldGhvZE5hbWUpO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5cbi8qKlxuICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuICovXG5leHBvcnQgZW51bSBIb3RTZXJ2ZXJUeXBlXG57XG5cdEhUVFAsXG5cdFdlYlNvY2tldHMsXG5cdEdlbmVyYXRlLFxuXHRXZWJUZXN0aW5nLFxuXHRBUElUZXN0aW5nXG59XG5cbi8qKlxuICogVGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90U2VydmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdHlwZS5cblx0ICovXG5cdHNlcnZlclR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgbmV0d29yayBhZGRyZXNzIHRvIGxpc3RlbiBvbi5cblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90U2VydmVyIGltcGxlbWVudHMgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqL1xuXHRsaXN0ZW5BZGRyZXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcG9ydHMgdG8gdXNlLlxuXHQgKi9cblx0cG9ydHM6IHtcblx0XHRcdGh0dHA6IG51bWJlcjtcblx0XHRcdGh0dHBzOiBudW1iZXI7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFNTTCBzZXR0aW5ncy5cblx0ICovXG5cdHNzbDoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2VydDogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIGtleSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGtleTogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIENBIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2E6IHN0cmluZztcblx0XHR9O1xuXHQvKipcblx0ICogUmVkaXJlY3QgSFRUUCB0cmFmZmljIHRvIEhUVFBTLlxuXHQgKi9cblx0cmVkaXJlY3RIVFRQdG9IVFRQUzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuXG5cdCAqL1xuXHRzZWNyZXRzOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSB8IEhvdFNlcnZlcilcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5zZXJ2ZXJUeXBlID0gXCJTZXJ2ZXJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHtcblx0XHRcdFx0XHRodHRwOiA1MDAwLFxuXHRcdFx0XHRcdGh0dHBzOiA0NDNcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMuc3NsID0ge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvci5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLnNlcnZlclR5cGUgPSBwcm9jZXNzb3Iuc2VydmVyVHlwZSB8fCBcIlNlcnZlclwiO1xuXHRcdFx0dGhpcy5hcGkgPSBwcm9jZXNzb3IuYXBpIHx8IG51bGw7XG5cdFx0XHR0aGlzLmxpc3RlbkFkZHJlc3MgPSBwcm9jZXNzb3IubGlzdGVuQWRkcmVzcyB8fCBcIjAuMC4wLjBcIjtcblx0XHRcdHRoaXMucG9ydHMgPSBwcm9jZXNzb3IucG9ydHMgfHwge1xuXHRcdFx0XHRcdGh0dHA6IDUwMDAsXG5cdFx0XHRcdFx0aHR0cHM6IDQ0M1xuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5zc2wgPSBwcm9jZXNzb3Iuc3NsIHx8IHtcblx0XHRcdFx0XHRjZXJ0OiBcIlwiLFxuXHRcdFx0XHRcdGtleTogXCJcIixcblx0XHRcdFx0XHRjYTogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWRpcmVjdEhUVFB0b0hUVFBTID0gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgIT0gbnVsbCA/IHByb2Nlc3Nvci5yZWRpcmVjdEhUVFB0b0hUVFBTIDogdHJ1ZTtcblx0XHRcdHRoaXMudHlwZSA9IHByb2Nlc3Nvci50eXBlIHx8IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0XHRcdHRoaXMuc2VjcmV0cyA9IHByb2Nlc3Nvci5zZWNyZXRzIHx8IHt9O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgYW4gQVBJIHRvIHRoaXMgc2VydmVyLiBUaGlzIHdpbGwgYWxzbyBzZXQgdGhlIGFzc29jaWF0ZWQgXG5cdCAqIHByb2Nlc3NvciB0byB0aGlzIEFQSSBhcyB3ZWxsLlxuXHQgKi9cblx0YXN5bmMgc2V0QVBJIChhcGk6IEhvdEFQSSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yLmFwaSA9IGFwaTtcblx0XHR0aGlzLmFwaSA9IGFwaTtcblxuXHRcdC8vaWYgKHJlZ2lzdGVyUm91dGVzID09PSB0cnVlKVxuXHRcdFx0Ly9hd2FpdCB0aGlzLmFwaS5yZWdpc3RlclJvdXRlcyAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIHJvdXRlIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGU/IChyb3V0ZTogSG90Um91dGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIHJlcXVlc3RzLlxuXHQgKi9cblx0YXN5bmMgbGlzdGVuPyAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogU2h1dGRvd24gdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHNodXRkb3duPyAoKTogUHJvbWlzZTx2b2lkPjtcbn0iLCJpbXBvcnQgKiBhcyBwcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZHVsZU5hbWUgZnJvbSBcInZhbGlkYXRlLW5wbS1wYWNrYWdlLW5hbWVcIjtcblxuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5cbmltcG9ydCB7IEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0LCBJSG90Q29tcG9uZW50IH0gZnJvbSBcIi4vSG90Q29tcG9uZW50XCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90QXNzZXQgfSBmcm9tIFwiLi9Ib3RBc3NldFwiO1xuaW1wb3J0IHsgSG90TW9kdWxlIH0gZnJvbSBcIi4vSG90TW9kdWxlXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcblxuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9ufSBmcm9tIFwiLi9Ib3RUZXN0RGVzdGluYXRpb25cIjtcblxuaW1wb3J0IHsgSG90U2l0ZSwgSG90U2l0ZVJvdXRlIH0gZnJvbSBcIi4vSG90U2l0ZVwiO1xuXG5pbXBvcnQgeyByZWdpc3RlckNvbXBvbmVudCB9IGZyb20gXCIuL0hvdFN0YXFSZWdpc3RlckNvbXBvbmVudFwiO1xuaW1wb3J0IHsgaG90U3RhcVdlYlN0YXJ0IH0gZnJvbSBcIi4vSG90U3RhcVdlYlN0YXJ0XCI7XG5cbnZhciBIb3RUZXN0ZXJNb2NoYTogYW55ID0gbnVsbDtcbnZhciBIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3RTZWxlbml1bURyaXZlcjogYW55ID0gbnVsbDtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBzdGFydGluZyBhIHBhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U3RhcnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBUaGUgSG90dCBzaXRlIHRvIGxvYWQuXG5cdCAqL1xuXHR1cmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCB0byBkaXNwbGF5LlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlIHRvIGxvYWQuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UgdG8gbG9hZCB0aGUgcGFnZS5cblx0ICovXG5cdHByb2Nlc3Nvcj86IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBBbnkgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG5ldyBwYWdlLlxuXHQgKi9cblx0YXJncz86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgbWFwIHRvIHVzZS5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHRlc3RlciBhcGkuXG5cdCAqL1xuXHR0ZXN0ZXJBUElCYXNlVXJsPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGUgdGhhdCdzIFxuXHQgKiBwb2ludGVkIGF0IHRoZSB1cmwgYWJvdmUuXG5cdCAqL1xuXHR0ZXN0ZXJMYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJPzogSG90QVBJO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU/OiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgaW1wb3J0ZWQgbW9kdWxlcy5cblx0ICovXG5cdG1vZHVsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RNb2R1bGUgfTtcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKiBcblx0ICogQGZpeG1lIFJlbmFtZSB0aGlzIHRvIGNvbXBvbmVudFRhZ3MuXG5cdCAqL1xuXHRjb21wb25lbnRzPzoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RGaWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgbG9hZGVkIGhvdHNpdGUuXG5cdCAqL1xuXHRob3RTaXRlPzogSG90U2l0ZTtcbn1cblxuLyoqXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IGhhbmRsZXMgYWxsIEhUTUwgcHJlcHJvY2Vzc2luZywgdGhlbiBvdXRwdXRzIHRoZSBcbiAqIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RTdGFxIGltcGxlbWVudHMgSUhvdFN0YXFcbntcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgSG90U3RhcS5cblx0ICovXG5cdHN0YXRpYyB2ZXJzaW9uOiBzdHJpbmcgPSBcIjAuOC4yMVwiO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSB3ZWIgYnVpbGQuXG5cdCAqL1xuXHRzdGF0aWMgaXNXZWI6IGJvb2xlYW4gPSBmYWxzZTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGlzIGlzIHJlYWR5IGZvciB0ZXN0aW5nLlxuXHQgKi9cblx0c3RhdGljIGlzUmVhZHlGb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGlzIGV2ZW50IHdoZW4gdGhpcyBwYWdlIGlzIHJlYWR5IGZvciB0ZXN0aW5nLlxuXHQgKi9cblx0c3RhdGljIG9uUmVhZHlGb3JUZXN0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEVycm9ycyB0byBleGVjdXRlIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuXG5cdCAqL1xuXHRzdGF0aWMgZXJyb3JzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHJlZGlyZWN0VG9Vcmw/OiBzdHJpbmc7IGZ1bmM/OiAoZXJyVHlwZTogc3RyaW5nKSA9PiB2b2lkOyB9OyB9ID0ge307XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGV4ZWN1dGlvbiB0aGlzIGlzLlxuXHQgKi9cblx0bW9kZTogRGV2ZWxvcGVyTW9kZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdHRlc3RlckFQSTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFBhZ2UgfTtcblx0LyoqXG5cdCAqIFRoZSBpbXBvcnRlZCBtb2R1bGVzLlxuXHQgKi9cblx0bW9kdWxlczogeyBbbmFtZTogc3RyaW5nXTogSG90TW9kdWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICogXG5cdCAqIEBmaXhtZSBSZW5hbWUgdGhpcyB0byBjb21wb25lbnRUYWdzLlxuXHQgKi9cblx0Y29tcG9uZW50czoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU6IEhvdFNpdGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0YXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHR0ZXN0ZXJBcGlDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdHBhZ2VDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBZGQgYSBzdGFydCBkZWxheSBiZWZvcmUgc3RhcnRpbmcuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBtb3N0bHkuXG5cdCAqL1xuXHRzdGFydERlbGF5OiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgcHVibGljIGtleXMgdG8gYmUgZXhwb3NlZC5cblx0ICovXG5cdHB1YmxpY0tleXM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0ZXIgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFN0YXEgPSB7fSlcblx0e1xuXHRcdHRoaXMubG9nZ2VyID0gbmV3IEhvdExvZyAoSG90TG9nTGV2ZWwuQWxsKTtcblx0XHR0aGlzLnN0YXJ0RGVsYXkgPSAwO1xuXHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IGNvcHkudGVzdGVyQVBJIHx8IG51bGw7XG5cdFx0dGhpcy5tb2RlID0gY29weS5tb2RlIHx8IERldmVsb3Blck1vZGUuUHJvZHVjdGlvbjtcblx0XHR0aGlzLnBhZ2VzID0gY29weS5wYWdlcyB8fCB7fTtcblx0XHR0aGlzLm1vZHVsZXMgPSBjb3B5Lm1vZHVsZXMgfHwge307XG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IHt9O1xuXHRcdHRoaXMuaG90U2l0ZSA9IGNvcHkuaG90U2l0ZSB8fCBudWxsO1xuXHRcdHRoaXMuYXBpQ29udGVudCA9IGBcblx0XHRcdHtcblx0XHRcdFx0dmFyICVhcGlfbmFtZSUgPSAlYXBpX2V4cG9ydGVkX25hbWUlLiVhcGlfbmFtZSU7XG5cdFx0XHRcdHZhciBuZXdIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0XHR2YXIgbmV3YXBpID0gbmV3ICVhcGlfbmFtZSUgKCViYXNlX3VybCUsIG5ld0hvdENsaWVudCk7XG5cdFx0XHRcdG5ld0hvdENsaWVudC5hcGkgPSBuZXdhcGk7XG5cdFx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdhcGk7XG5cdFx0XHR9YDtcblx0XHR0aGlzLnRlc3RlckFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgSG90VGVzdGVyQVBJID0gSG90U3RhcVdlYi5Ib3RUZXN0ZXJBUEk7XG5cdFx0XHR2YXIgbmV3SG90VGVzdGVyQ2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXd0ZXN0ZXJhcGkgPSBuZXcgSG90VGVzdGVyQVBJICglYmFzZV90ZXN0ZXJfdXJsJSwgbmV3SG90VGVzdGVyQ2xpZW50KTtcblx0XHRcdG5ld0hvdFRlc3RlckNsaWVudC50ZXN0ZXJBUEkgPSBuZXd0ZXN0ZXJhcGk7XG5cdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO2A7XG5cdFx0dGhpcy5wYWdlQ29udGVudCA9IFxuYDwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG5cbjxoZWFkPlxuXHQ8dGl0bGU+JXRpdGxlJTwvdGl0bGU+XG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVob3RzdGFxX2pzX3NyYyVcIj48L3NjcmlwdD5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cblx0XHRmb3IgKGxldCBrZXkgaW4gSG90U3RhcVdlYilcblx0XHRcdHdpbmRvd1trZXldID0gSG90U3RhcVdlYltrZXldO1xuXHQ8L3NjcmlwdD5cblxuJWFwaXNfdG9fbG9hZCVcblxuXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuXHRcdGFzeW5jIGZ1bmN0aW9uIGhvdHN0YXFfc3RhcnRBcHAgKClcblx0XHR7XG5cdFx0XHRsZXQgdGVtcE1vZGUgPSAwO1xuXG5cdFx0XHRpZiAod2luZG93W1wiSG90XCJdICE9IG51bGwpXG5cdFx0XHRcdHRlbXBNb2RlID0gSG90Lk1vZGU7XG5cblx0XHRcdCVzdGFydF9kZWxheSVcblxuXHRcdFx0dmFyIHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXHRcdFx0cHJvY2Vzc29yLmxvZ2dlci5sb2dMZXZlbCA9ICVsb2dnaW5nX2xldmVsJTtcblxuXHRcdFx0dmFyIHByb21pc2VzID0gW107XG5cdFx0XHQlZGV2ZWxvcGVyX21vZGUlXG5cblx0XHRcdCVhcGlfY29kZSVcblxuXHRcdFx0JXB1YmxpY19zZWNyZXRzJVxuXHRcdFx0JXRlc3Rlcl9hcGklXG5cdFx0XHQlbG9hZF9maWxlcyVcblxuXHRcdFx0cHJvY2Vzc29yLm1vZGUgPSB0ZW1wTW9kZTtcblxuXHRcdFx0UHJvbWlzZS5hbGwgKHByb21pc2VzKS50aGVuIChmdW5jdGlvbiAoKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5VXJsICh7XG5cdFx0XHRcdFx0XHRcdHVybDogXCIldXJsJVwiLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiBcIiV0aXRsZSVcIixcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRcdGFyZ3M6ICVhcmdzJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZTogJXRlc3Rlcl9uYW1lJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTWFwOiAldGVzdGVyX21hcCUsXG5cdFx0XHRcdFx0XHRcdHRlc3RlckFQSUJhc2VVcmw6ICV0ZXN0ZXJfYXBpX2Jhc2VfdXJsJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTGF1bmNocGFkVXJsOiAldGVzdGVyX2xhdW5jaHBhZF91cmwlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aG90c3RhcV9zdGFydEFwcCAoKTtcblx0PC9zY3JpcHQ+XG48L2hlYWQ+XG5cbjxib2R5PlxuPC9ib2R5PlxuXG48L2h0bWw+YDtcblx0XHR0aGlzLnB1YmxpY0tleXMgPSB7fTtcblx0XHR0aGlzLnRlc3RlcnMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBhIGJvb2xlYW4gdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VCb29sZWFuICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhblxuXHR7XG5cdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcImZhbHNlXCIpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ5ZXNcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwibm9cIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllcFwiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJuYWhcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSByZXF1aXJlZCBwYXJhbWV0ZXIgZXhpc3RzIGluc2lkZSBhbiBvYmplY3QuIElmIGl0IGV4aXN0cywgcmV0dXJuIHRoZSB2YWx1ZS5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbSAobmFtZTogc3RyaW5nLCBvYmpXaXRoUGFyYW06IGFueSwgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlLCB0aHJvd0V4Y2VwdGlvbjogYm9vbGVhbiA9IHRydWUpOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gb2JqV2l0aFBhcmFtW25hbWVdO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHJlcXVpcmVkID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFeGNlcHRpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJHtuYW1lfS5gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0aWYgKHJlcXVpcmVkID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodmFsdWUgPT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhyb3dFeGNlcHRpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAke25hbWV9LmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSByZXF1aXJlZCBwYXJhbWV0ZXIgZXhpc3RzIGluc2lkZSBhbiBvYmplY3QuIElmIGl0IGV4aXN0cywgcmV0dXJuIHRoZSB2YWx1ZS5cblx0ICogSWYgaXQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbURlZmF1bHQgKG5hbWU6IHN0cmluZywgb2JqV2l0aFBhcmFtOiBhbnksIGRlZmF1bHRWYWx1ZTogYW55KTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG9ialdpdGhQYXJhbVtuYW1lXTtcblxuXHRcdGlmICh2YWx1ZSA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChkZWZhdWx0VmFsdWUpO1xuXG5cdFx0aWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gXCJcIilcblx0XHRcdFx0cmV0dXJuIChkZWZhdWx0VmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYW4gZXJyb3IuIFRoaXMgY2Fubm90IGJlIGFuIGFzeW5jIGZ1bmN0aW9uIGR1ZSB0byB0aGUgbmF0dXJlIG9mIGhvdyB0aGlzIHdvcmtzLlxuXHQgKi9cblx0c3RhdGljIGV4ZWN1dGVFcnJvciAoZXJyVHlwZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKEhvdFN0YXEuZXJyb3JzW2VyclR5cGVdICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHVybDogc3RyaW5nID0gSG90U3RhcS5lcnJvcnNbZXJyVHlwZV0ucmVkaXJlY3RUb1VybDtcblxuXHRcdFx0aWYgKHVybCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXJsICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bGV0IGZ1bmMgPSBIb3RTdGFxLmVycm9yc1tlcnJUeXBlXS5mdW5jO1xuXG5cdFx0XHRpZiAoZnVuYyAhPSBudWxsKVxuXHRcdFx0XHRmdW5jIChlcnJUeXBlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXQgKG51bU1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cmV0dXJuIChhd2FpdCBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0c2V0VGltZW91dCAoKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlICgpO1xuXHRcdFx0XHRcdH0sIG51bU1pbGxpc2Vjb25kcyk7XG5cdFx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcGFnZS5cblx0ICovXG5cdGFkZFBhZ2UgKHBhZ2U6IEhvdFBhZ2UpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnBhZ2VzW3BhZ2UubmFtZV0gPSBwYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHBhZ2UgdG8gcHJvY2Vzcy5cblx0ICovXG5cdGdldFBhZ2UgKHBhZ2VOYW1lOiBzdHJpbmcpOiBIb3RQYWdlXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucGFnZXNbcGFnZU5hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gaW1wb3J0ZWQgbW9kdWxlLlxuXHQgKi9cblx0YWRkTW9kdWxlIChuYW1lOiBzdHJpbmcsIG1vZHVsZTogSG90TW9kdWxlKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5tb2R1bGVzW25hbWVdID0gbW9kdWxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbiBpbXBvcnRlZCBtb2R1bGUuXG5cdCAqL1xuXHRnZXRNb2R1bGUgKG5hbWU6IHN0cmluZyk6IEhvdE1vZHVsZVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLm1vZHVsZXNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUuXG5cdCAqL1xuXHRhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogdm9pZFxuXHR7XG5cdFx0bGV0IG5hbWU6IHN0cmluZyA9IGZpbGUubmFtZTtcblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0bmFtZSA9IGZpbGUubG9jYWxGaWxlO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS51cmw7XG5cblx0XHR0aGlzLmZpbGVzW25hbWVdID0gZmlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBmaWxlLlxuXHQgKi9cblx0Z2V0RmlsZSAobmFtZTogc3RyaW5nLCB0aHJvd0V4OiBib29sZWFuID0gdHJ1ZSk6IEhvdEZpbGVcblx0e1xuXHRcdGlmICh0aGlzLmZpbGVzW25hbWVdID09IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHBvczogbnVtYmVyID0gbmFtZS5pbmRleE9mIChcIj9oc3Rxc2VydmU9XCIpO1xuXHRcdFx0bGV0IHRlbXBOYW1lOiBzdHJpbmcgPSBuYW1lO1xuXG5cdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHRlbXBOYW1lID0gbmFtZS5zdWJzdHJpbmcgKDAsIHBvcyk7XG5cblx0XHRcdGlmICh0aGlzLmZpbGVzW3RlbXBOYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRyZXR1cm4gKHRoaXMuZmlsZXNbdGVtcE5hbWVdKTtcblxuXHRcdFx0aWYgKHRocm93RXggPT09IHRydWUpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGZpbGUgJHtuYW1lfWApO1xuXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXHRcdH1cblxuXHRcdHJldHVybiAodGhpcy5maWxlc1tuYW1lXSk7XG5cdH1cblxuXHQvKiogXG5cdCAqIEtlZXAgdGhlIGNvbnRleHQgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgaW4uXG5cdCAqIFxuXHQgKiBAcGFyYW0gZnVuYyBUaGUgZG9jdW1lbnQgZWxlbWVudCdzIGlkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgb2JqZWN0IHRvIHJlbWFpbiBpbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gW3ZhbD11bmRlZmluZWRdIEFuIGFkZGl0aW9uYWwgdmFsdWUgdG8gcGFzcyB0byB0aGUgY29udGV4dC5cblx0ICogQHJldHVybiBUaGUgcmV0dXJuZWQgcmVzdWx0IGZyb20gdGhlIGZ1bmN0aW9uIGZ1bmMuXG5cdCAqL1xuXHRzdGF0aWMga2VlcENvbnRleHQoZnVuYzogRnVuY3Rpb24sIGNvbnRleHQ6IGFueSwgdmFsPzogYW55KTogYW55XG5cdHtcblx0XHR2YXIgb2JqUmV0dXJuID0gZnVuY3Rpb24oKVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgYXJ5QXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cblx0XHRcdFx0aWYgKHZhbCAhPSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0YXJ5QXJncy5wdXNoKHZhbCk7XG5cblx0XHRcdFx0aWYgKGNvbnRleHQgPT0gbnVsbClcblx0XHRcdFx0XHRyZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcnlBcmdzKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyeUFyZ3MpO1xuXHRcdFx0fTtcblxuXHRcdHJldHVybiBvYmpSZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFuZCByZWdpc3RlciBhIGNvbXBvbmVudC5cblx0ICovXG5cdGFkZENvbXBvbmVudCAoQ29tcG9uZW50VHlwZTogKG5ldyAoY29weTogSUhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaT86IEhvdEFQSSkgPT4gSG90Q29tcG9uZW50KSwgYXBpOiBIb3RBUEkgPSBudWxsLCBcblx0XHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zID0gdW5kZWZpbmVkKTogdm9pZFxuXHR7XG5cdFx0bGV0IHRlbXBBcGkgPSB0aGlzLmFwaVxuXG5cdFx0aWYgKGFwaSAhPSBudWxsKVxuXHRcdFx0dGVtcEFwaSA9IGFwaTtcblxuXHRcdGxldCB0ZW1wQ29tcG9uZW50T2JqID0gbmV3IENvbXBvbmVudFR5cGUgKHRoaXMsIHRlbXBBcGkpO1xuXG5cdFx0aWYgKHRoaXMuY29tcG9uZW50c1t0ZW1wQ29tcG9uZW50T2JqLnRhZ10gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYENvbXBvbmVudCAke3RlbXBDb21wb25lbnRPYmoudGFnfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMuY29tcG9uZW50c1t0ZW1wQ29tcG9uZW50T2JqLnRhZ10gPSB7IGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUsIHByb2Nlc3NvcjogdGhpcywgYXBpOiB0ZW1wQXBpIH07XG5cdFx0cmVnaXN0ZXJDb21wb25lbnQuY2FsbCAodGhpcywgdGVtcENvbXBvbmVudE9iai50YWcsIGVsZW1lbnRPcHRpb25zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0IGFueSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIG9ubHkgYWNjb3VudHMgZm9yIDx0cj4gY3VycmVudGx5LlxuXHQgKi9cblx0c3RhdGljIGZpeEhUTUwgKHN0cjogc3RyaW5nKTogeyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH1cblx0e1xuXHRcdC8vIFRha2UgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gWE1MIGFuZCBIVE1MLlxuXHRcdGNvbnN0IHRlbXBTdHI6IHN0cmluZyA9IHN0ci5yZXBsYWNlKC8gXFwvPi9nLCAnPicpLnJlcGxhY2UoXG5cdFx0XHQvKDwoYXJlYXxiYXNlfGJyfGNvbHxjb21tYW5kfGVtYmVkfGhyfGltZ3xpbnB1dHxrZXlnZW58bGlua3xtZXRhfHBhcmFtfHNvdXJjZXx0cmFja3x3YnIpLio/PikvZywgJyQxPC8kMj4nKTtcblx0XHRjb25zdCBwYXJzZWRYTUwgPSBuZXcgRE9NUGFyc2VyICgpLnBhcnNlRnJvbVN0cmluZyAoYDx4bWw+JHt0ZW1wU3RyfTwveG1sPmAsIFwidGV4dC94bWxcIik7XG5cdFx0bGV0IHF1ZXJ5U2VsZWN0b3I6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocGFyc2VkWE1MLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRhZ05hbWU6IHN0cmluZyA9IHBhcnNlZFhNTC5kb2N1bWVudEVsZW1lbnQuY2hpbGRyZW5bMF0udGFnTmFtZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwidHJcIilcblx0XHRcdHtcblx0XHRcdFx0c3RyID0gYDx0YWJsZT4ke3N0cn08L3RhYmxlPmA7XG5cdFx0XHRcdHF1ZXJ5U2VsZWN0b3IgPSBcInRib2R5XCI7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0YWdOYW1lID09PSBcInRoXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHN0ciA9IGA8dGFibGU+JHtzdHJ9PC90YWJsZT5gO1xuXHRcdFx0XHRxdWVyeVNlbGVjdG9yID0gdGFnTmFtZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHsgZml4ZWRTdHI6IHN0ciwgcXVlcnlTZWxlY3RvcjogcXVlcnlTZWxlY3RvciB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBuZXcgSFRNTCBlbGVtZW50KHMpIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LlxuXHQgKi9cblx0c3RhdGljIGFkZEh0bWwgKHBhcmVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGh0bWw6IHN0cmluZyB8IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBIVE1MRWxlbWVudFtdXG5cdHtcblx0XHRsZXQgZm91bmRQYXJlbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKHBhcmVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRmb3VuZFBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKHBhcmVudCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm91bmRQYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHRpZiAoZm91bmRQYXJlbnQgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCAke3BhcmVudH0hYCk7XG5cblx0XHRsZXQgcmVzdWx0OiBIVE1MRWxlbWVudCA9IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIChodG1sKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRsZXQgaHRtbEhhbmRsZXIgPSBIb3RTdGFxLmZpeEhUTUwgKGh0bWwpO1xuXHRcdFx0bGV0IG5ld0RPTTogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyICgpLnBhcnNlRnJvbVN0cmluZyAoaHRtbEhhbmRsZXIuZml4ZWRTdHIsIFwidGV4dC9odG1sXCIpO1xuXHRcdFx0bGV0IGNoaWxkcmVuOiBhbnkgPSBudWxsO1xuXG5cdFx0XHRpZiAoaHRtbEhhbmRsZXIucXVlcnlTZWxlY3RvciA9PT0gXCJcIilcblx0XHRcdFx0Y2hpbGRyZW4gPSBuZXdET00uYm9keS5jaGlsZHJlbjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2hpbGRyZW4gPSBuZXdET00ucXVlcnlTZWxlY3RvciAoaHRtbEhhbmRsZXIucXVlcnlTZWxlY3RvcikuY2hpbGRyZW47XG5cblx0XHRcdGxldCByZXN1bHRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmNoaWxkcmVuW2lJZHhdKTtcblxuXHRcdFx0XHRyZXN1bHRzLnB1c2ggKGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChjaGlsZCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRyZXN1bHQgPSBmb3VuZFBhcmVudC5hcHBlbmRDaGlsZCAoaHRtbCk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBIb3RTaXRlJ3MgbmFtZSBpcyB2YWxpZC5cblx0ICovXG5cdHN0YXRpYyBjaGVja0hvdFNpdGVOYW1lIChob3RzaXRlTmFtZTogc3RyaW5nLCB0aHJvd0V4Y2VwdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhblxuXHR7XG5cdFx0bGV0IHJlc3VsdHMgPSB2YWxpZGF0ZU1vZHVsZU5hbWUgKGhvdHNpdGVOYW1lKTtcblx0XHRsZXQgaXNWYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRpZiAocmVzdWx0cy52YWxpZEZvck5ld1BhY2thZ2VzID09PSBmYWxzZSlcblx0XHRcdGlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdGlmIChyZXN1bHRzLmVycm9ycyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChyZXN1bHRzLmVycm9ycy5sZW5ndGggPiAwKVxuXHRcdFx0XHRpc1ZhbGlkID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGlzVmFsaWQgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90U2l0ZSAke2hvdHNpdGVOYW1lfSBoYXMgYW4gaW52YWxpZCBuYW1lISBUaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkgYW5kIG11c3QgaGF2ZSBhIHZhbGlkIE5QTSBtb2R1bGUgbmFtZS5gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGlzVmFsaWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluIHRoZSBzdXBwbGllZCBjb250ZW50LCByZXBsYWNlIGEga2V5IGluIGEgJHtLRVl9IHdpdGggYSB2YWx1ZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZW50IHdpdGggdGhlIGNvcnJlY3QgdmFsdWVzLlxuXHQgKi9cblx0c3RhdGljIHJlcGxhY2VLZXkgKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGNvbnN0IGZpbmFsU3RyOiBzdHJpbmcgPSBjb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKGBcXFxcJFxcXFx7JHtrZXl9XFxcXH1gLCBcImdcIiksIHZhbHVlKTtcblxuXHRcdHJldHVybiAoZmluYWxTdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHZhbHVlIGZyb20gYSBIb3RTaXRlIG9iamVjdC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIGZyb20gdGhlIGhvdHNpdGUgb2JqZWN0LiBSZXR1cm5zIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHN0YXRpYyBnZXRWYWx1ZUZyb21Ib3RTaXRlT2JqIChob3RzaXRlOiBIb3RTaXRlLCBwYXJhbXM6IHN0cmluZ1tdKTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG51bGw7XG5cblx0XHRpZiAoaG90c2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBwcmV2VmFsdWU6IGFueSA9IGhvdHNpdGU7XG5cblx0XHRcdC8vIEdvIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBhbmQgXG5cdFx0XHQvLyBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaW5hbCBwYXJhbWV0ZXIuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHBhcmFtcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhcmFtOiBzdHJpbmcgPSBwYXJhbXNbaUlkeF07XG5cblx0XHRcdFx0aWYgKHByZXZWYWx1ZVtwYXJhbV0gPT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHByZXZWYWx1ZSA9IG51bGw7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZXZWYWx1ZSA9IHByZXZWYWx1ZVtwYXJhbV07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmV2VmFsdWUgIT0gbnVsbClcblx0XHRcdFx0dmFsdWUgPSBwcmV2VmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzSG90U2l0ZSAodGVzdGVyOiBIb3RUZXN0ZXIgPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0SG90U3RhcS5jaGVja0hvdFNpdGVOYW1lICh0aGlzLmhvdFNpdGUubmFtZSwgdHJ1ZSk7XG5cblx0XHRsZXQgcm91dGVzID0gdGhpcy5ob3RTaXRlLnJvdXRlcztcblxuXHRcdGlmIChyb3V0ZXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGVzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcm91dGU6IEhvdFNpdGVSb3V0ZSA9IHJvdXRlc1trZXldO1xuXHRcdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlIChyb3V0ZSk7XG5cdFx0XHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcyxcblx0XHRcdFx0XHRcdG5hbWU6IHJvdXRlLm5hbWUgfHwgXCJcIixcblx0XHRcdFx0XHRcdHJvdXRlOiBrZXksXG5cdFx0XHRcdFx0XHRmaWxlczogW2ZpbGVdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0gcm91dGUubmFtZTtcblx0XHRcdFx0XHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLm1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChyb3V0ZS5tYXApID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IG1hcCAke3JvdXRlLm1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0gPSB0ZXN0ZXIudGVzdE1hcHNbcm91dGUubWFwXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0ZXN0TWFwID0gbmV3IEhvdFRlc3RNYXAgKCk7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGRlc3RpbmF0aW9uczogSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RGVzdGluYXRpb24gfSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGUubWFwIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zID0gW107XG5cblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgcm91dGUubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdCA9IHJvdXRlLm1hcFtpSWR4XTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zID0ge307XG5cblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gcm91dGUubWFwKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdCA9IHJvdXRlLm1hcFtrZXkyXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnNba2V5Ml0gPSBuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucyA9IGRlc3RpbmF0aW9ucztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChyb3V0ZS5kZXN0aW5hdGlvbk9yZGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXS5kZXN0aW5hdGlvbk9yZGVyID0gcm91dGUuZGVzdGluYXRpb25PcmRlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUuYXBpcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUuYXBpcylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW2tleV07XG5cblx0XHRcdFx0aWYgKGFwaS5tYXAgPT0gbnVsbClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gZmFsc2UpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBrZXk7XG5cdFx0XHRcdFx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IG5ldyBIb3RUZXN0TWFwICgpO1xuXG5cdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFwaS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBtYXA6IHN0cmluZyA9IGFwaS5tYXBbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAobWFwKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoXCJBIHRlc3RlciB3YXMgbm90IGNyZWF0ZWQgZmlyc3QhIFlvdSBtdXN0IHNwZWNpZnkgb25lIGluIHRoZSBDTEkuXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vLyBAZml4bWUgQWxsb3cgdGhpcyB0byB3b3JrIGZvciBzZXJ2ZXItc2lkZSBhcyB3ZWxsLi4uXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5jb21wb25lbnRzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY29tcG9uZW50ID0gdGhpcy5ob3RTaXRlLmNvbXBvbmVudHNba2V5XTtcblx0XHRcdFx0bGV0IGNvbXBvbmVudFVybDogc3RyaW5nID0gY29tcG9uZW50LnVybDtcblxuXHRcdFx0XHQvLy8gQGZpeG1lIENyZWF0ZSB1bml0IHRlc3QgZm9yIGZldGNoaW5nLCBsb2FkaW5nLCBhbmQgcmVnaXN0ZXJpbmcuXG5cdFx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChjb21wb25lbnRVcmwpO1xuXHRcdFx0XHRsZXQgQ29tcG9uZW50Q2xhc3MgPSBldmFsIChyZXMpO1xuXG5cdFx0XHRcdHRoaXMuYWRkQ29tcG9uZW50IChDb21wb25lbnRDbGFzcyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgPT0gbnVsbClcblx0XHRcdHRoaXMuaG90U2l0ZS5yb3V0ZXMgPSB7fTtcblxuXHRcdGxldCBkaXNhYmxlRmlsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUuZGlzYWJsZUZpbGVMb2FkaW5nICE9IG51bGwpXG5cdFx0XHRkaXNhYmxlRmlsZUxvYWRpbmcgPSB0aGlzLmhvdFNpdGUuZGlzYWJsZUZpbGVMb2FkaW5nO1xuXG5cdFx0aWYgKGRpc2FibGVGaWxlTG9hZGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCB0aGlzLmxvYWRIb3RGaWxlcyAodGhpcy5ob3RTaXRlLmZpbGVzLCBmYWxzZSwgZmFsc2UpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBIb3RzaXRlIGhhcyBmaWxlIGxvYWRpbmcgZGlzYWJsZWQuLi5gKTtcblxuXHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdHRoaXMuYWRkVGVzdGVyICh0ZXN0ZXIpO1xuXG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYFByb2Nlc3NlZCBIb3RTaXRlICR7dGhpcy5ob3RTaXRlLm5hbWV9YCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBmcm9tIGEgSG90U2l0ZS5qc29uIGZpbGUuIEJlIHN1cmUgdG8gbG9hZCBhbmQgYXR0YWNoIGFueSB0ZXN0ZXJzIGJlZm9yZSBcblx0ICogbG9hZGluZyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGpzb25TdHI6IHN0cmluZyA9IFwiXCI7XG5cdFx0Y29uc3QgZXh0OiBzdHJpbmcgPSBwcGF0aC5leHRuYW1lIChwYXRoKS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBEb3dubG9hZGluZyBIb3RTaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0bGV0IHJlczogYW55ID0gYXdhaXQgZmV0Y2ggKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRG93bmxvYWRlZCBzaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0anNvblN0ciA9IHJlcy50ZXh0ICgpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cGF0aCA9IHBwYXRoLm5vcm1hbGl6ZSAocGF0aCk7XG5cblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBBY2Nlc3NpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGxldCBIb3RJTyA9IGV2YWwgKFwicmVxdWlyZVwiKShcIi4vSG90SU9cIikuSG90SU87IC8vIEhhY2sgdG8gZ2V0IGFyb3VuZCBXZWJwYWNrLlxuXHRcdFx0anNvblN0ciA9IGF3YWl0IEhvdElPLnJlYWRUZXh0RmlsZSAocGF0aCk7XG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgQWNjZXNzZWQgc2l0ZSAke3BhdGh9YCk7XG5cdFx0fVxuXG5cdFx0aWYgKChleHQgPT09IFwiLnlhbWxcIikgfHwgKGV4dCA9PT0gXCIueW1sXCIpKVxuXHRcdHtcblx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBZQU1MIHN1cHBvcnQgZm9yIEhvdFNpdGVzIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIHdlYiB5ZXQhYCk7XG5cblx0XHRcdGxldCB5YW1sID0gZXZhbCAoXCJyZXF1aXJlXCIpKFwieWFtbFwiKTsgLy8gSGFjayB0byBnZXQgYXJvdW5kIFdlYnBhY2suXG5cdFx0XHR0aGlzLmhvdFNpdGUgPSB5YW1sLnBhcnNlIChqc29uU3RyKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5ob3RTaXRlID0gSlNPTi5wYXJzZSAoanNvblN0cik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7cGF0aH0gY2Fubm90IGJlIG51bGwhYCk7XG5cblx0XHR0aGlzLmhvdFNpdGUuaG90c2l0ZVBhdGggPSBwYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmUgdGhlIGN1cnJlbnQgSG90U2l0ZSB0byBhIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBzYXZlSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDYW5ub3Qgc2F2ZSBhIEhvdFNpdGUgb24gdGhlIHdlYiFgKTtcblxuXHRcdGNvbnN0IGhvdHNpdGVTdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5ICh0aGlzLmhvdFNpdGUsIG51bGwsIDIpO1xuXG5cdFx0bGV0IEhvdElPID0gZXZhbCAoXCJyZXF1aXJlXCIpKFwiLi9Ib3RJT1wiKS5Ib3RJTzsgLy8gSGFjayB0byBnZXQgYXJvdW5kIFdlYnBhY2suXG5cdFx0YXdhaXQgSG90SU8ud3JpdGVUZXh0RmlsZSAocGF0aCwgaG90c2l0ZVN0cik7XG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYFNhdmVkIHNpdGUgJHtwYXRofWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgYW4gYXJyYXkgb2YgZmlsZXMuIElmIGEgZmlsZSBhbHJlYWR5IGhhcyBjb250ZW50LCBpdCB3aWxsIG5vdCBiZSByZWxvYWRlZCBcblx0ICogdW5sZXNzIGZvcmNlQ29udGVudExvYWRpbmcgaXMgc2V0IHRvIHRydWUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90RmlsZXMgKGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHVybD86IHN0cmluZzsgbG9jYWxGaWxlPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9IH0sIFxuXHRcdFx0Zm9yY2VDb250ZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlLCBsb2FkVXJsQ29udGVudDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgTG9hZGluZyBIb3R0IGZpbGVzLi4uYCk7XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gZmlsZXMpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGUgPSBmaWxlc1trZXldO1xuXHRcdFx0bGV0IG5ld0ZpbGU6IEhvdEZpbGUgPSBudWxsO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0bmV3RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcdFx0XHRcIm5hbWVcIjoga2V5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmlsZS51cmwgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHRcdFx0bmV3RmlsZS51cmwgPSBgJHtmaWxlLnVybH0/aHN0cXNlcnZlPW5haGZhbWA7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRuZXdGaWxlLnVybCA9IGZpbGUudXJsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gZmFsc2UpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChmaWxlLmxvY2FsRmlsZSAhPSBudWxsKVxuXHRcdFx0XHRcdG5ld0ZpbGUubG9jYWxGaWxlID0gZmlsZS5sb2NhbEZpbGU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBsb2FkQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdGlmIChmaWxlLmNvbnRlbnQgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0bmV3RmlsZS5jb250ZW50ID0gZmlsZS5jb250ZW50O1xuXHRcdFx0XHRsb2FkQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZm9yY2VDb250ZW50TG9hZGluZyA9PT0gdHJ1ZSlcblx0XHRcdFx0bG9hZENvbnRlbnQgPSB0cnVlO1xuXG5cdFx0XHRpZiAobG9hZFVybENvbnRlbnQgPT09IGZhbHNlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAobmV3RmlsZS51cmwgIT09IFwiXCIpXG5cdFx0XHRcdFx0bG9hZENvbnRlbnQgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxvYWRDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgTG9hZGluZyBIb3R0IGZpbGU6ICR7bmV3RmlsZS51cmx9YCk7XG5cdFx0XHRcdGF3YWl0IG5ld0ZpbGUubG9hZCAoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYEZpbmlzaGVkIGxvYWRpbmcgSG90dCBmaWxlOiAke25ld0ZpbGUudXJsfWApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmFkZEZpbGUgKG5ld0ZpbGUpO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBGaW5pc2hlZCBsb2FkaW5nIEhvdHQgZmlsZXMuLi5gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZSB0aGUgY29udGVudCB0byBzZW5kIHRvIGEgY2xpZW50LlxuXHQgKi9cblx0YXN5bmMgZ2VuZXJhdGVDb250ZW50IChyb3V0ZUtleTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCB1cmw6IHN0cmluZyA9IFwiLi9cIixcblx0XHRcdGpzU3JjUGF0aDogc3RyaW5nID0gXCIuL2pzL0hvdFN0YXEubWluLmpzXCIsIHBhc3NBcmdzOiBib29sZWFuID0gdHJ1ZSwgXG5cdFx0XHRhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgYXBpU2NyaXB0czogc3RyaW5nID0gXCJcIjtcblx0XHRsZXQgYXBpQ29kZTogc3RyaW5nID0gXCJcIjtcblx0XHRsZXQgcHVibGljS2V5czogc3RyaW5nID0gXCJcIjtcblxuXHRcdC8vLyBAdG9kbyBPcHRpbWl6ZSB0aGlzIGZ1bmN0aW9uIGFzIG11Y2ggYXMgcG9zc2libGUuXG5cblx0XHQvLyBMb2FkIHRoZSBBUEkgc3RyaW5nLlxuXHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgZ2xvYmFsQXBpID0gdGhpcy5ob3RTaXRlLmFwaXNbdGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGldO1xuXG5cdFx0XHRcdFx0aWYgKGdsb2JhbEFwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBleGlzdCFgKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHNlbmRKU0NvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLmpzYXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEganNhcGkgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEgbGlicmFyeU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLmFwaU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBhcGlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHNlbmRKU0NvbnRlbnQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFwaVNjcmlwdHMgKz0gYFxcdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIke2dsb2JhbEFwaS5qc2FwaX1cIj48L3NjcmlwdD5cXG5gO1xuXG5cdFx0XHRcdFx0XHRcdGxldCBiYXNlVXJsOiBzdHJpbmcgPSBcIlxcXCJcXFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS51cmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke2dsb2JhbEFwaS51cmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHt0aGlzLmFwaS5iYXNlVXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdGxldCB0ZW1wQVBJQ29udGVudDogc3RyaW5nID0gdGhpcy5hcGlDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9uYW1lXFwlL2csIGdsb2JhbEFwaS5hcGlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfZXhwb3J0ZWRcXF9uYW1lXFwlL2csIGdsb2JhbEFwaS5saWJyYXJ5TmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWJhc2VcXF91cmxcXCUvZywgYmFzZVVybCk7XG5cblx0XHRcdFx0XHRcdFx0YXBpQ29kZSArPSB0ZW1wQVBJQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5hcGlzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldO1xuXG5cdFx0XHRcdGlmIChyb3V0ZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHJvdXRlLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBhcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1tyb3V0ZS5hcGldO1xuXG5cdFx0XHRcdFx0XHRpZiAoYXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIEFQSSAke3JvdXRlLmFwaX1gKTtcblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLmFwaSAhPT0gdGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBzZW5kSlNDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoYXBpLmpzYXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGpzYXBpIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcGkubGlicmFyeU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEgbGlicmFyeU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlbmRKU0NvbnRlbnQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQganNhcGlwYXRoID0gYXBpLmpzYXBpO1xuXHRcdFx0XHRcdFx0XHRcdGFwaVNjcmlwdHMgKz0gYFxcdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIke2pzYXBpcGF0aH1cIj48L3NjcmlwdD5cXG5gO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhcGkudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke2FwaS51cmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7dGhpcy5hcGkuYmFzZVVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCB0ZW1wQVBJQ29udGVudDogc3RyaW5nID0gdGhpcy5hcGlDb250ZW50O1xuXHRcdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgYXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2V4cG9ydGVkXFxfbmFtZVxcJS9nLCBhcGkubGlicmFyeU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWJhc2VcXF91cmxcXCUvZywgYmFzZVVybCk7XG5cblx0XHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aCAhPSBudWxsKVxuXHRcdFx0XHRcdGpzU3JjUGF0aCA9IHRoaXMuaG90U2l0ZS5zZXJ2ZXIuanNTcmNQYXRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnB1YmxpY0tleXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHNlY3JldCA9IHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzW2tleV07XG5cdFx0XHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChzZWNyZXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VjcmV0KTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaS5jb25uZWN0aW9uID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDYW5ub3QgcGFzcyBzZWNyZXRzIGZyb20gdGhlIEFQSSBpZiB0aGVyZSdzIG5vIGNvbm5lY3Rpb24hYCk7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgc2VydmVyQ29ubjogSG90U2VydmVyID0gKDxIb3RTZXJ2ZXI+dGhpcy5hcGkuY29ubmVjdGlvbik7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoc2VjcmV0LnBhc3NTZWNyZXRGcm9tQVBJICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5IChzZXJ2ZXJDb25uLnNlY3JldHNba2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoc2VjcmV0LmVudiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBAc2VjdnVsIElzIHRoaXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5PyBOZWVkIHRvIHZlcmlmeSB0aGF0IFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBvbmx5IHRoZSBzZXJ2ZXIgaGFzIGFjY2VzcyB0byB0aGlzLiBBdCB0aGlzIHBvaW50LCBJIHRoaW5rIG9ubHkgdGhlIFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBzZXJ2ZXIgaGFzIGFjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBlbnZLZXk6IHN0cmluZyA9IHNlY3JldC5lbnY7XG5cblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5IChwcm9jZXNzLmVudltlbnZLZXldKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHB1YmxpY0tleXMgKz0gYHByb2Nlc3Nvci5wdWJsaWNLZXlzW1wiJHtrZXl9XCJdID0gJHt2YWx1ZX07XFxuYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSB0aGlzLnBhZ2VDb250ZW50O1xuXHRcdGxldCBmaXhDb250ZW50ID0gYXN5bmMgKHRlbXBDb250ZW50OiBzdHJpbmcpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXZlbG9wZXJNb2RlU3RyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyQVBJU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkZXZlbG9wZXJNb2RlU3RyID0gYHRlbXBNb2RlID0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50O2A7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRoaXMudGVzdGVyQXBpQ29udGVudDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRlc3RlckFQSVN0ci5yZXBsYWNlICgvXFwlYmFzZVxcX3Rlc3RlclxcX3VybFxcJS9nLCBgXFxcIiR7dGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybH1cXFwiYCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgbG9hZEZpbGVzOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyAodGhpcy5maWxlcykubGVuZ3RoID4gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgdmFyIGZpbGVzID0ge307XFxuXFxuYDtcblxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmZpbGVzKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBmaWxlID0gdGhpcy5maWxlc1trZXldO1xuXHRcdFx0XHRcdFx0bGV0IGFzc2V0OiBIb3RBc3NldCA9IG5ldyBIb3RBc3NldCAoXCJodG1sXCIsIGtleSk7XG5cblx0XHRcdFx0XHRcdGlmIChmaWxlLmxvY2FsRmlsZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXNzZXQucGF0aCA9IGZpbGUubG9jYWxGaWxlO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlsZS51cmwgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdGFzc2V0LnBhdGggPSBmaWxlLnVybDtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbGUuY29udGVudCAhPT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXNzZXQucGF0aCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGFzc2V0LmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQgPSBhd2FpdCBhc3NldC5vdXRwdXQgKCk7XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG91dHB1dCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYER1cmluZyBpbml0aWFsIGxvYWQsIEhUTUwgYXNzZXRzIGNhbm5vdCBiZSBvdXRwdXR0ZWQgdXNpbmcgb25seSBhIHN0cmluZyFgKTtcblxuXHRcdFx0XHRcdFx0bGV0IGZpbGVVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZUNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChvdXRwdXQudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGZpbGVVcmwgPSBgXCJ1cmxcIjogXCIke291dHB1dC51cmx9XCIsIGA7XG5cblx0XHRcdFx0XHRcdGlmIChvdXRwdXQuY29udGVudCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRmaWxlQ29udGVudCA9IGBcImNvbnRlbnRcIjogJHtvdXRwdXQuY29udGVudH1gOyAvLyBNYXkgaGF2ZSB0byBlc2NhcGUgdGhlIGNvbnRlbnQ/XG5cblx0XHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgXFx0XFx0XFx0ZmlsZXNbXCIke291dHB1dC5uYW1lfVwiXSA9IHsgJHtmaWxlVXJsfSR7ZmlsZUNvbnRlbnR9IH07XFxuYDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYFxcdFxcdFxcdHByb21pc2VzLnB1c2ggKHByb2Nlc3Nvci5sb2FkSG90RmlsZXMgKGZpbGVzKSk7XFxuYDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRpdGxlXFwlL2csIG5hbWUpO1xuXG5cdFx0XHRcdGlmIChwYXNzQXJncyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIFwiSG90LkFyZ3VtZW50c1wiKTtcblxuXHRcdFx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWFyZ3NcXCUvZywgSlNPTi5zdHJpbmdpZnkgKGFyZ3MpKTtcblxuXHRcdFx0XHRsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSByb3V0ZUtleTtcblx0XHRcdFx0bGV0IHRlc3RlclVybDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckxhdW5jaHBhZFVybDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnRlc3RlcnMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0ga2V5O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubGF1bmNocGFkVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTGF1bmNocGFkVXJsID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlcyAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgcm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XTtcblx0XHRcdFx0XHRcdFx0dGVzdGVyTWFwID0gcm91dGUubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgc3RhcnREZWxheVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5zdGFydERlbGF5ICE9PSAwKVxuXHRcdFx0XHRcdHN0YXJ0RGVsYXlTdHIgPSBgYXdhaXQgSG90U3RhcS53YWl0ICgke3RoaXMuc3RhcnREZWxheX0pO2A7XG5cblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlc3RhcnRcXF9kZWxheVxcJS9nLCBzdGFydERlbGF5U3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9nZ2luZ1xcX2xldmVsXFwlL2csIGBIb3RMb2dMZXZlbC4ke0hvdExvZ0xldmVsW3RoaXMubG9nZ2VyLmxvZ0xldmVsXX1gKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlaG90c3RhcVxcX2pzXFxfc3JjXFwlL2csIGpzU3JjUGF0aCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWRldmVsb3BlclxcX21vZGVcXCUvZywgZGV2ZWxvcGVyTW9kZVN0cik7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2FwaVxcJS9nLCB0ZXN0ZXJBUElTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlzXFxfdG9cXF9sb2FkXFwlL2csIGFwaVNjcmlwdHMpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVsb2FkXFxfZmlsZXNcXCUvZywgbG9hZEZpbGVzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfY29kZVxcJS9nLCBhcGlDb2RlKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlcHVibGljXFxfc2VjcmV0c1xcJS9nLCBwdWJsaWNLZXlzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldXJsXFwlL2csIHVybCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX25hbWVcXCUvZywgYFwiJHt0ZXN0ZXJOYW1lfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX21hcFxcJS9nLCBgXCIke3Rlc3Rlck1hcH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXF9iYXNlXFxfdXJsXFwlL2csIGBcIiR7dGVzdGVyVXJsfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2xhdW5jaHBhZFxcX3VybFxcJS9nLCBgXCIke3Rlc3RlckxhdW5jaHBhZFVybH1cImApO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcENvbnRlbnQpO1xuXHRcdFx0fTtcblx0XHRjb250ZW50ID0gYXdhaXQgZml4Q29udGVudCAoY29udGVudCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgRXhwcmVzcyByb3V0ZXMgZnJvbSB0aGUgZ2l2ZW4gcGFnZXMuIEJlIHN1cmUgdG8gbG9hZCB0aGUgXG5cdCAqIHBhZ2VzIGZpcnN0IGJlZm9yZSBkb2luZyB0aGlzLiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBcblx0ICogY3VzdG9taXplZCBFeHByZXNzIGFwcGxpY2F0aW9ucy4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsb2FkZWQgcm91dGVzIFxuXHQgKiBmcm9tIHRoaXMgSG90U3RhcSBvYmplY3Qgd2l0aCBIb3RIVFRQU2VydmVyLCBiZSBzdXJlIHRvIHVzZSBcblx0ICogdGhlIGxvYWRIb3RTaXRlIG1ldGhvZCBpbiBIb3RIVFRQU2VydmVyLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXhwcmVzc1JvdXRlcyAoZXhwcmVzc0FwcDogYW55LCBqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLm1pbi5qc1wiKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucGFnZXMpXG5cdFx0e1xuXHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLnBhZ2VzW2tleV07XG5cdFx0XHRjb25zdCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQ29udGVudCAocGFnZS5yb3V0ZSwgcGFnZS5uYW1lLCBwYWdlLmZpbGVzWzBdLnVybCwganNTcmNQYXRoKTtcblxuXHRcdFx0ZXhwcmVzc0FwcC5nZXQgKHBhZ2Uucm91dGUsIChyZXE6IGFueSwgcmVzOiBhbnkpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgU2VuZGluZyBjdXN0b20gRXhwcmVzcyBjb250ZW50LmApO1xuXHRcdFx0XHRcdHJlcy5zdGF0dXMgKDIwMCkuc2VuZCAoY29udGVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSB0ZXN0ZXIgZm9yIHVzZSBsYXRlci5cblx0ICovXG5cdGFkZFRlc3RlciAodGVzdGVyOiBIb3RUZXN0ZXIpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnRlc3RlcnNbdGVzdGVyLm5hbWVdID0gdGVzdGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBtYXBzIGZvciB0ZXN0aW5nIGZyb20gdGhlIEhvdFNpdGUuXG5cdCAqL1xuXHRnZXRXZWJUZXN0aW5nTWFwcyAoKTogc3RyaW5nW11cblx0e1xuXHRcdGlmICh0aGlzLmhvdFNpdGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJObyBIb3RTaXRlIHdhcyBsb2FkZWQhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyB3ZWIgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIHRlc3Rpbmcgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG1hcHMhXCIpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubWFwcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIG1hcHMgZm9yIHRlc3RpbmcgZnJvbSB0aGUgSG90U2l0ZS5cblx0ICovXG5cdGdldEFQSVRlc3RpbmdNYXBzICgpOiBzdHJpbmdbXVxuXHR7XG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIk5vIEhvdFNpdGUgd2FzIGxvYWRlZCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIGFwaSBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaS5tYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgdGVzdGluZyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgbWFwcyFcIik7XG5cblx0XHRyZXR1cm4gKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaS5tYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSByb3V0ZSdzIGtleSBmcm9tIGEgcm91dGUncyBuYW1lLlxuXHQgKi9cblx0Z2V0Um91dGVLZXlGcm9tTmFtZSAobmFtZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgZm91bmRLZXk6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5yb3V0ZXMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgcm91dGU6IEhvdFNpdGVSb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNba2V5XTtcblxuXHRcdFx0XHRcdGlmIChyb3V0ZS5uYW1lID09PSBuYW1lKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGZvdW5kS2V5ID0ga2V5O1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSByb3V0ZSBmcm9tIGEgcm91dGUncyBuYW1lLlxuXHQgKi9cblx0Z2V0Um91dGVGcm9tTmFtZSAobmFtZTogc3RyaW5nKTogSG90U2l0ZVJvdXRlXG5cdHtcblx0XHRsZXQgZm91bmRSb3V0ZTogSG90U2l0ZVJvdXRlID0gbnVsbDtcblx0XHRsZXQgZm91bmRLZXk6IHN0cmluZyA9IHRoaXMuZ2V0Um91dGVLZXlGcm9tTmFtZSAobmFtZSk7XG5cblx0XHRpZiAoZm91bmRLZXkgIT09IFwiXCIpXG5cdFx0XHRmb3VuZFJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tmb3VuZEtleV07XG5cblx0XHRyZXR1cm4gKGZvdW5kUm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGVzdHMuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKiBAcGFyYW0gbWFwTmFtZSBUaGUgbWFwIG9yIG1hcHMgdG8gdXNlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZywgbWFwTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuICh0ZXN0ZXIuZXhlY3V0ZSAobWFwTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHdlYiB0ZXN0cyBmcm9tIHRoZSBIb3RTaXRlIHRlc3Rpbmcgd2ViIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQWxsV2ViVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBtYXBzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0V2ViVGVzdGluZ01hcHMgKCk7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXBzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBtYXBzW2lJZHhdO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgbWFwTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIGFwaSB0ZXN0cyBmcm9tIHRoZSBIb3RTaXRlIHRlc3RpbmcgYXBpIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQWxsQVBJVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBtYXBzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0QVBJVGVzdGluZ01hcHMgKCk7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoKCkgPT4gYEV4ZWN1dGluZyBhbGwgQVBJIHRlc3RzIGZvciB0ZXN0ZXIgJHt0ZXN0ZXJOYW1lfS4gTWFwczogJHtKU09OLnN0cmluZ2lmeSAobWFwcyl9YCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAocGFnZU5hbWU6IHN0cmluZywgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLmdldFBhZ2UgKHBhZ2VOYW1lKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwYWdlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBsb2NhbCBmaWxlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBwcm9jZXNzTG9jYWxGaWxlIChsb2NhbEZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IGxvY2FsRmlsZXBhdGgsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcImxvY2FsRmlsZVwiOiBsb2NhbEZpbGVwYXRoXG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHVybCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc1VybCAob3B0aW9uczogSG90U3RhcnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcInVybFwiOiBvcHRpb25zLnVybFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogb3B0aW9ucy5wcm9jZXNzb3IsXG5cdFx0XHRcdFwibmFtZVwiOiBvcHRpb25zLm5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdLFxuXHRcdFx0XHRcInRlc3Rlck5hbWVcIjogb3B0aW9ucy50ZXN0ZXJOYW1lLFxuXHRcdFx0XHRcInRlc3Rlck1hcFwiOiBvcHRpb25zLnRlc3Rlck1hcFxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29udGVudCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0NvbnRlbnQgKG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJjb250ZW50XCI6IG9wdGlvbnMuY29udGVudFxuXHRcdH0pO1xuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IG9wdGlvbnMucHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogb3B0aW9ucy5uYW1lLFxuXHRcdFx0XHRcImZpbGVzXCI6IFtmaWxlXVxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHdpbmRvdyBoYXMgZmluaXNoZWQgbG9hZGluZywgZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIG9uUmVhZHkgKHJlYWR5RnVuYzogKCkgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdGlmICgoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiKSlcblx0XHRcdHJlYWR5RnVuYyAoKTtcblx0XHRlbHNlXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAoXCJsb2FkXCIsIHJlYWR5RnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZSB0aGUgY3VycmVudCBIVE1MIHBhZ2Ugd2l0aCB0aGUgb3V0cHV0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyB1c2VPdXRwdXQgKG91dHB1dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IHBhcnNlciA9IG5ldyBET01QYXJzZXIgKCk7XG5cdFx0bGV0IGNoaWxkID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyAob3V0cHV0LCBcInRleHQvaHRtbFwiKTtcblx0XHRsZXQgaHRtbE9iajogSFRNTEh0bWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTtcblxuXHRcdGh0bWxPYmouaW5uZXJIVE1MID0gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5pbm5lckhUTUw7XG5cblx0XHQvLyBUaGFua3MgdG8gbmV3ZnVybml0dXJleSBhdDogXG5cdFx0Ly8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjI5NDU4ODQvZG9tcGFyc2VyLWFwcGVuZGluZy1zY3JpcHQtdGFncy10by1oZWFkLWJvZHktYnV0LW5vdC1leGVjdXRpbmdcblx0XHRsZXQgdG1wU2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcblx0XHRpZiAodG1wU2NyaXB0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBwdXNoIGFsbCBvZiB0aGUgZG9jdW1lbnQncyBzY3JpcHQgdGFncyBpbnRvIGFuIGFycmF5XG5cdFx0XHQvLyAodG8gcHJldmVudCBkb20gbWFuaXB1bGF0aW9uIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGRvbSBub2Rlcylcblx0XHRcdGxldCBzY3JpcHRzOiBIVE1MU2NyaXB0RWxlbWVudFtdID0gW107XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRtcFNjcmlwdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0c2NyaXB0cy5wdXNoKHRtcFNjcmlwdHNbaV0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIHNjcmlwdCB0YWdzIGFuZCBjcmVhdGUgZHVwbGljYXRlIHRhZ3MgZm9yIGVhY2hcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgczogSFRNTFNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuXHRcdFx0XHQvLyBhZGQgdGhlIG5ldyBub2RlIHRvIHRoZSBwYWdlXG5cdFx0XHRcdHNjcmlwdHNbaV0ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzKTtcblxuXHRcdFx0XHQvLyByZW1vdmUgdGhlIG9yaWdpbmFsIChub24tZXhlY3V0aW5nKSBub2RlIGZyb20gdGhlIHBhZ2Vcblx0XHRcdFx0c2NyaXB0c1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdHNbaV0pO1xuXG5cdFx0XHRcdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+ICgocmVzb2x2ZTIsIHJlamVjdDIpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cy5vbmxvYWQgPSAoKSA9PlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZTIgKCk7XG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGxldCBoYXNTcmM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwic3JjXCIpICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cy5zZXRBdHRyaWJ1dGUgKFwic3JjXCIsIHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSk7XG5cdFx0XHRcdFx0XHRcdFx0aGFzU3JjID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRzLnNldEF0dHJpYnV0ZSAoXCJ0eXBlXCIsIHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzLmlubmVySFRNTCA9IHNjcmlwdHNbaV0uaW5uZXJIVE1MO1xuXG5cdFx0XHRcdFx0XHRpZiAoaGFzU3JjID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZTIgKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIHRlc3RlcnMgdG8gbG9hZC5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIGRvZXMgbm90IHdhaXQgZm9yIEFMTCB0ZXN0ZXJzIHRvIGZpbmlzaCBsb2FkaW5nLiBPbmx5IFxuXHQgKiB0aGUgZmlyc3Qgb25lLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXRGb3JUZXN0ZXJzICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAoSG90U3RhcS5pc1JlYWR5Rm9yVGVzdGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKDEwKTtcblxuXHRcdGlmIChIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHVwIHRoZSB0ZXN0ZXJzIGFwaSwgaWYgYW55LlxuXHQgKi9cblx0c3RhdGljIHNldHVwVGVzdGVycyAocHJvY2Vzc29yOiBIb3RTdGFxLCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMpXG5cdHtcblx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0aWYgKHByb2Nlc3Nvci50ZXN0ZXJBUEkgPT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9PT0gXCJcIilcblx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBcImh0dHA6Ly8xMjcuMC4wLjE6ODE4MlwiO1xuXG5cdFx0XHRcdGxldCBjbGllbnQ6IEhvdENsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cdFx0XHRcdGxldCB0ZXN0ZXJBUEk6IEhvdFRlc3RlckFQSSA9IG5ldyBIb3RUZXN0ZXJBUEkgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCwgY2xpZW50KTtcblx0XHRcdFx0dGVzdGVyQVBJLmNvbm5lY3Rpb24uYXBpID0gdGVzdGVyQVBJO1xuXHRcdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gdGVzdGVyQVBJO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXR1cCB0aGUgdGVzdGVycyBhcGkgb24gdGhlIGNsaWVudCwgaWYgbmVlZGVkLlxuXHQgKi9cblx0c3RhdGljIHNldHVwQ2xpZW50VGVzdGVycyAocHJvY2Vzc29yOiBIb3RTdGFxKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdG91dHB1dCArPSBcbmA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuZnVuY3Rpb24gaG90c3RhcV9pc0RvY3VtZW50UmVhZHkgKClcbntcbmlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcbntcbmlmIChIb3QuTW9kZSA9PT0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxue1xubGV0IGZ1bmMgPSBmdW5jdGlvbiAoKVxuXHR7XG5cdFx0aWYgKEhvdC5UZXN0ZXJBUEkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGhzID0ge307XG5cdFx0XHRsZXQgdGVzdEVsZW1lbnRzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHMpO1xuXHRcdFx0bGV0IHRlc3RNYXBzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0TWFwcyk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdFBhdGggPSBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzW2tleV07XG5cblx0XHRcdFx0dGVzdFBhdGhzW2tleV0gPSB0ZXN0UGF0aC50b1N0cmluZyAoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHRlc3RQYXRoc1N0ciA9IEpTT04uc3RyaW5naWZ5ICh0ZXN0UGF0aHMpO1xuXG5cdFx0XHRIb3QuVGVzdGVyQVBJLnRlc3Rlci5wYWdlTG9hZGVkICh7XG5cdFx0XHRcdFx0dGVzdGVyTmFtZTogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck5hbWUsXG5cdFx0XHRcdFx0dGVzdGVyTWFwOiBIb3QuQ3VycmVudFBhZ2UudGVzdGVyTWFwLFxuXHRcdFx0XHRcdHBhZ2VOYW1lOiBIb3QuQ3VycmVudFBhZ2UubmFtZSxcblx0XHRcdFx0XHR0ZXN0RWxlbWVudHM6IHRlc3RFbGVtZW50cyxcblx0XHRcdFx0XHR0ZXN0UGF0aHM6IHRlc3RQYXRoc1N0clxuXHRcdFx0XHR9KS50aGVuIChmdW5jdGlvbiAocmVzcClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKHJlc3AuZXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRIb3RTdGFxV2ViLkhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuaWYgKChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHx8IChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImludGVyYWN0aXZlXCIpKVxuXHRmdW5jICgpO1xuZWxzZVxuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyIChcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuYyk7XG59XG59XG59XG5cbmhvdHN0YXFfaXNEb2N1bWVudFJlYWR5ICgpO1xuPC9zY3JpcHQ+YDtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhbmQgcmVwbGFjZSB0aGUgY3VycmVudCBIVE1MIHBhZ2Ugd2l0aCB0aGUgaG90dCBzY3JpcHQgZnJvbSB0aGUgZ2l2ZW4gdXJsLlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBkaXNwbGF5VXJsICh1cmw6IHN0cmluZyB8IEhvdFN0YXJ0T3B0aW9ucywgbmFtZTogc3RyaW5nID0gbnVsbCwgXG5cdFx0cHJvY2Vzc29yOiBIb3RTdGFxID0gbnVsbCwgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8SG90U3RhcT5cblx0e1xuXHRcdHJldHVybiAobmV3IFByb21pc2U8SG90U3RhcT4gKChyZXNvbHZlLCByZWplY3QpID0+XG5cdFx0XHR7XG5cdFx0XHRcdEhvdFN0YXEub25SZWFkeSAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidXJsXCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0aWYgKG5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gbmFtZTtcblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgPSB1cmw7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsLnVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gdXJsLnByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcmdzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSB1cmwuYXJncztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSB1cmwudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IHVybC50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IHVybC50ZXN0ZXJBUElCYXNlVXJsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG5cdFx0XHRcdFx0XHRIb3RTdGFxLnNldHVwVGVzdGVycyAocHJvY2Vzc29yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy51cmwuaW5kZXhPZiAoXCJoc3Rxc2VydmVcIikgPCAwKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCArPSBcIj9oc3Rxc2VydmU9bmFoZmFtXCI7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc1VybCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG91dHB1dCArPSBIb3RTdGFxLnNldHVwQ2xpZW50VGVzdGVycyAocHJvY2Vzc29yKTtcblxuXHRcdFx0XHRcdFx0YXdhaXQgSG90U3RhcS51c2VPdXRwdXQgKG91dHB1dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChwcm9jZXNzb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBkaXNwbGF5Q29udGVudCAoY29udGVudDogc3RyaW5nIHwgSG90U3RhcnRPcHRpb25zLCBuYW1lOiBzdHJpbmcgPSBudWxsLCBcblx0XHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uUmVhZHkgKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcImNvbnRlbnRcIjogXCJcIlxuXHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRpZiAobmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChjb250ZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gY29udGVudC5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBuYW1lO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChjb250ZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBcIlwiOyAvLy8gQGZpeG1lIElzIHRoaXMgb2sgdG8gZG8/XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBjb250ZW50Lm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmNvbnRlbnQgPSBjb250ZW50LmNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQucHJvY2Vzc29yICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBjb250ZW50LnByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcmdzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC5hcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gY29udGVudC5hcmdzO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQudGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSBjb250ZW50LnRlc3Rlck1hcDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC50ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJOYW1lID0gY29udGVudC50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnRlc3RlckFQSUJhc2VVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBjb250ZW50LnRlc3RlckFQSUJhc2VVcmw7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEuc2V0dXBUZXN0ZXJzIChwcm9jZXNzb3IsIG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRvcHRpb25zLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdG9wdGlvbnMuYXJncyA9IGFyZ3M7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc0NvbnRlbnQgKG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRhd2FpdCBIb3RTdGFxLnVzZU91dHB1dCAob3V0cHV0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUgKHByb2Nlc3Nvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7XG5cdH1cbn1cblxuaWYgKHR5cGVvZiAoZG9jdW1lbnQpICE9PSBcInVuZGVmaW5lZFwiKVxuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAoXCJsb2FkXCIsIGhvdFN0YXFXZWJTdGFydCk7XG4iLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcblxuLyoqXG4gKiBSZWdpc3RlciBhIGNvbXBvbmVudCBmb3IgdXNlIGFzIGEgSFRNTCB0YWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudCAodGFnOiBzdHJpbmcsIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnMgPSB1bmRlZmluZWQpOiB2b2lkXG57XG5cdGlmICgodGFnID09IG51bGwpIHx8ICh0YWcgPT09IFwiXCIpKVxuXHRcdHRocm93IG5ldyBFcnJvciAoYEFsbCBjb21wb25lbnRzIG11c3QgaGF2ZSBhIHRhZyFgKTtcblxuXHRpZiAoY3VzdG9tRWxlbWVudHMuZ2V0ICh0YWcpICE9PSB1bmRlZmluZWQpXG5cdHtcblx0XHQvLy8gQGZpeG1lIFRoaXMgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIFNob3VsZCB0aGlzIHRocm93IGFuIGVycm9yIG9yIHdhcm5pbmc/IEkgZG9uJ3QgdGhpbmsgaXQgc2hvdWxkLi4uXG5cblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgcHJvY2Vzc29yQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cztcblxuXHRjdXN0b21FbGVtZW50cy5kZWZpbmUgKHRhZywgY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudFxuXHRcdHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGNvbm5lY3RlZCBIb3RDb21wb25lbnQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbXBvbmVudDogSG90Q29tcG9uZW50O1xuXHRcdFxuXHRcdFx0Y29uc3RydWN0b3IgKClcblx0XHRcdHtcblx0XHRcdFx0c3VwZXIgKCk7XG5cblx0XHRcdFx0bGV0IGNvbXBvbmVudEluZm8gPSBwcm9jZXNzb3JDb21wb25lbnRzW3RhZ107XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50ID0gbmV3IGNvbXBvbmVudEluZm8uY29tcG9uZW50VHlwZSAoY29tcG9uZW50SW5mby5wcm9jZXNzb3IsIGNvbXBvbmVudEluZm8uYXBpKTtcblxuXHRcdFx0XHRsZXQgY29tcEh0bWxFbGVtZW50ID0gdGhpcztcblx0XHRcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRjb21wSHRtbEVsZW1lbnQuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50Lmh0bWxFbGVtZW50cyA9IFtjb21wSHRtbEVsZW1lbnRdO1xuXHRcdFx0XHR0aGlzLmNvbXBvbmVudC5pbm5lciA9IHRoaXMuaW5uZXJIVE1MO1xuXHRcdFxuXHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQuaGFuZGxlQXR0cmlidXRlcyAhPSBudWxsKVxuXHRcdFx0XHRcdHRoaXMuY29tcG9uZW50LmhhbmRsZUF0dHJpYnV0ZXMgKHRoaXMuYXR0cmlidXRlcyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dHI6IEF0dHIgPSB0aGlzLmF0dHJpYnV0ZXNbaUlkeF07XG5cdFx0XHRcdFx0XHRjb25zdCBhdHRyTmFtZTogc3RyaW5nID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlICgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0clZhbHVlOiBzdHJpbmcgPSBhdHRyLnZhbHVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcImlkXCIpXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwibmFtZVwiKVxuXHRcdFx0XHRcdFx0XHR0aGlzLmNvbXBvbmVudC5uYW1lID0gYXR0clZhbHVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcInZhbHVlXCIpXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50LnZhbHVlID0gYXR0clZhbHVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lLmluZGV4T2YgKFwiaG90LVwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyVGVtcE5hbWU6IHN0cmluZyA9IGF0dHJOYW1lLnN1YnN0cmluZyAoNCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50W2F0dHJUZW1wTmFtZV0gPSBhdHRyVmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblByZU91dHB1dCAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlT3V0cHV0ICgpID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBvdXRwdXRzID0gdGhpcy5jb21wb25lbnQub3V0cHV0ICgpO1xuXHRcdFxuXHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25Qb3N0T3V0cHV0ICE9IG51bGwpXG5cdFx0XHRcdFx0b3V0cHV0cyA9IHRoaXMuY29tcG9uZW50Lm9uUG9zdE91dHB1dCAob3V0cHV0cyk7XG5cdFx0XG5cdFx0XHRcdGxldCBjb21wb25lbnRPdXRwdXRzOiBIb3RDb21wb25lbnRPdXRwdXRbXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRpZiAodHlwZW9mIChvdXRwdXRzKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRjb21wb25lbnRPdXRwdXRzLnB1c2ggKHsgaHRtbDogb3V0cHV0cyB9KTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKG91dHB1dHMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMgPSBvdXRwdXRzO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMgPSBbb3V0cHV0c107XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0Zm9yIChsZXQgaUtkeCA9IDA7IGlLZHggPCBjb21wb25lbnRPdXRwdXRzLmxlbmd0aDsgaUtkeCsrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG91dHB1dCA9IGNvbXBvbmVudE91dHB1dHNbaUtkeF07XG5cdFx0XHRcdFx0bGV0IGh0bWxTdHI6IHN0cmluZyA9IG91dHB1dC5odG1sO1xuXHRcdFx0XHRcdGxldCBhZGRGdW5jdGlvbnNUbzogc3RyaW5nID0gXCJcIjtcblx0XHRcblx0XHRcdFx0XHRpZiAob3V0cHV0LmFkZEZ1bmN0aW9uc1RvICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhZGRGdW5jdGlvbnNUbyA9IG91dHB1dC5hZGRGdW5jdGlvbnNUbztcblx0XHRcblx0XHRcdFx0XHRsZXQgc3RyOiBzdHJpbmcgPSBIb3RGaWxlLnBhcnNlQ29udGVudCAoaHRtbFN0ciwgdHJ1ZSwgeyBcIm91dHB1dENvbW1hbmRzXCI6IGZhbHNlIH0pO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcnNlZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0c3RyID0gdGhpcy5jb21wb25lbnQub25QYXJzZWQgKHN0cik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGh0bWxIYW5kbGVyOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfSA9IHsgZml4ZWRTdHI6IFwiXCIsIHF1ZXJ5U2VsZWN0b3I6IFwiXCIgfTtcblx0XHRcblx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25GaXhIVE1MICE9IG51bGwpXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IHRoaXMuY29tcG9uZW50Lm9uRml4SFRNTCAoc3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoc3RyKTtcblxuXHRcdFx0XHRcdGxldCBjaGlsZHJlblRvUmVhZGQ6IE5vZGVbXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRcdC8vIFNhdmUgdGhlIGNoaWxkcmVuIGZyb20gYmVpbmcgcmVwbGFjZWQuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9ICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpOyBpSWR4ID4gLTE7IGlJZHgtLSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGQ6IE5vZGUgPSB0aGlzLmNoaWxkcmVuW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y2hpbGRyZW5Ub1JlYWRkLnB1c2ggKHRoaXMucmVtb3ZlQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbnVsbDtcblx0XHRcdFx0XHRsZXQgbmV3T2JqOiBIVE1MRWxlbWVudCA9IG51bGw7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld0RPTSA9IHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gKGh0bWxIYW5kbGVyLmZpeGVkU3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdC8vbmV3RE9NID0gdGhpcy5sb29zZVBhcnNlRnJvbVN0cmluZyAobmV3IERPTVBhcnNlciAoKSwgc3RyKTtcblx0XHRcdFx0XHRcdG5ld0RPTSA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aCA8IDEpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBjb21wb25lbnQgb3V0cHV0IGZyb20gJHt0aGlzLmNvbXBvbmVudC5uYW1lfSB3aXRoIHRhZyAke3RoaXMuY29tcG9uZW50LnRhZ31gKTtcblxuXHRcdFx0XHRcdGlmIChuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0aHJvd0VycjogYm9vbGVhbiA9IHRydWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY2hpbGQgPSBuZXdET00uYm9keS5jaGlsZHJlbltpSWR4XTtcblx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSAoKSA9PT0gXCJwYXJzZXJlcnJvclwiKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld09iaiA9IGNoaWxkO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3dFcnIgPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRocm93RXJyID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBPbmx5IGEgc2luZ2xlIGh0bWwgZWxlbWVudCBjYW4gY29tZSBmcm9tIGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50Lm5hbWV9LCBtdWx0aXBsZSBlbGVtZW50cyB3ZXJlIGRldGVjdGVkLmApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gKDxIVE1MRWxlbWVudD5uZXdET00uYm9keS5jaGlsZHJlblswXSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gbmV3RE9NLnF1ZXJ5U2VsZWN0b3IgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IpO1xuXHRcdFxuXHRcdFx0XHRcdHRoaXMucmVwbGFjZVdpdGggKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50LmNsaWNrICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCB0aGlzLmNvbXBvbmVudC5jbGljay5iaW5kICh0aGlzLmNvbXBvbmVudCkpO1xuXHRcdFxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmNvbXBvbmVudC5ldmVudHMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGV2ZW50ID0gdGhpcy5jb21wb25lbnQuZXZlbnRzW2tleV07XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoZXZlbnQudHlwZSwgZXZlbnQuZnVuYywgZXZlbnQub3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBvYmplY3RGdW5jdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgKHRoaXMuY29tcG9uZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQXNzb2NpYXRlIGFueSBmdW5jdGlvbnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG9iamVjdEZ1bmN0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqRnVuYzogc3RyaW5nID0gb2JqZWN0RnVuY3Rpb25zW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKG9iakZ1bmMgPT09IFwiY29uc3RydWN0b3JcIilcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRsZXQgcHJvcCA9IHRoaXMuY29tcG9uZW50W29iakZ1bmNdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAocHJvcCkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGlzTmV3RnVuY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBHbyB0aHJvdWdoIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGJhc2UgSG90Q29tcG9uZW50IGFuZCBzZWUgXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlJ3MgYW55IG1hdGNoZXMuIElmIHRoZXJlJ3MgYSBtYXRjaCwgdGhhdCBtZWFucyBcblx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgdHJ5aW5nIHRvIGFkZCBhbiBleGlzdGluZyBmdW5jdGlvbiwgYW5kIHdlIGRvbid0XG5cdFx0XHRcdFx0XHRcdC8vIHdhbm5hIGRvIHRoYXQuIFNraXAgaXQuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gSG90Q29tcG9uZW50LnByb3RvdHlwZSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvYmpGdW5jID09PSBrZXkyKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlzTmV3RnVuY3Rpb24gPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChpc05ld0Z1bmN0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdG5ld09ialtvYmpGdW5jXSA9IEhvdFN0YXEua2VlcENvbnRleHQgKHRoaXMuY29tcG9uZW50W29iakZ1bmNdLCB0aGlzLmNvbXBvbmVudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYWRkRnVuY3Rpb25zVG8gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHF1ZXJ5OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKGFkZEZ1bmN0aW9uc1RvKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdHF1ZXJ5W29iakZ1bmNdID0gSG90U3RhcS5rZWVwQ29udGV4dCAodGhpcy5jb21wb25lbnRbb2JqRnVuY10sIHRoaXMuY29tcG9uZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld09iaiA9IHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGNvbXBIdG1sRWxlbWVudDI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25DcmVhdGVkIChuZXdPYmopO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlID0gdGhpcy5jb21wb25lbnQub25QYXJlbnRQbGFjZTtcblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzLnB1c2ggKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuY2xvc2VzdFNlbGVjdG9yICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHBhcmVudEVsbTogSFRNTEVsZW1lbnQgPSBjb21wSHRtbEVsZW1lbnQyO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50RWxtKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmROb2RlOiBOb2RlID0gcGFyZW50RWxtLnF1ZXJ5U2VsZWN0b3IgKG91dHB1dC5jbG9zZXN0U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChmb3VuZE5vZGUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9ICg8SFRNTEVsZW1lbnQ+Zm91bmROb2RlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9IHBhcmVudEVsbS5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50RWxtID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGNsb3Nlc3Qgbm9kZSB3aXRoIHNlbGVjdG9yICcke291dHB1dC5jbG9zZXN0U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudEVsbS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRpZiAoY29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGFyZW50Tm9kZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuZG9jdW1lbnRTZWxlY3RvciAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlOiBOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAob3V0cHV0LmRvY3VtZW50U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50Tm9kZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBkb2N1bWVudCBub2RlIHdpdGggc2VsZWN0b3IgJyR7b3V0cHV0LmRvY3VtZW50U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0aWYgKGNvbXBIdG1sRWxlbWVudDIub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKHBhcmVudE5vZGUsIGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBwbGFjZUVsbUluUGFyZW50ID0gKHBhcmVudE5vZGVUb0NoZWNrOiBQYXJlbnROb2RlLCBwbGFjZUhlcmVQYXJlbnQ6IHN0cmluZywgY2hpbGRUb1BsYWNlOiBOb2RlKTogUGFyZW50Tm9kZSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlQ2hlY2tDb3VudGVyOiBudW1iZXIgPSAwO1xuXHRcdFxuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudE5vZGVDaGVja0NvdW50ZXIgPCAxMCkgLy8vIEB0b2RvIE1ha2UgdGhpcyBjb250cm9sbGFibGUgd2l0aCBhIHZhcmlhYmxlIGZyb20gdGhlIGNvbXBvbmVudC5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayBpbnN0YW5jZW9mIEhUTUxIdG1sRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGhvdC1wbGFjZS1oZXJlIGV4aXN0cywgcGxhY2UgdGhlIGNoaWxkcmVuIHRoZXJlLiBJZiBub3QsIHBsYWNlIGl0IHVuZGVyIHRoZSBcblx0XHRcdFx0XHRcdFx0Ly8gbmV3IGVsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBcnJheSA9IHBhcmVudE5vZGVUb0NoZWNrLnF1ZXJ5U2VsZWN0b3JBbGwgKGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRwbGFjZUhlcmUuYXBwZW5kQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2Uub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdGNoaWxkVG9QbGFjZS5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGxhY2VIZXJlLCBjaGlsZFRvUGxhY2UpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoIDwgMSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBdHRyQXJyYXkgPSBwYXJlbnROb2RlVG9DaGVjay5xdWVyeVNlbGVjdG9yQWxsIChgW2hvdC1wbGFjZS1oZXJlPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBsYWNlSGVyZUF0dHJBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBdHRyQXJyYXlbMF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGlsZFRvUGxhY2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCAoY2hpbGRUb1BsYWNlKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChjaGlsZFRvUGxhY2UpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkVG9QbGFjZS5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLmhvdENvbXBvbmVudC5vblBhcmVudFBsYWNlIChwbGFjZUhlcmUsIGNoaWxkVG9QbGFjZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwYXJlbnROb2RlVG9DaGVjay5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlQ2hlY2tDb3VudGVyKys7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAocGFyZW50Tm9kZVRvQ2hlY2spO1xuXHRcdFx0XHRcdH07XG5cdFx0XG5cdFx0XHRcdFx0aWYgKG91dHB1dC5wbGFjZUhlcmVQYXJlbnQgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZVRvQ2hlY2sgPSBjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRwYXJlbnROb2RlVG9DaGVjayA9IHBsYWNlRWxtSW5QYXJlbnQgKHBhcmVudE5vZGVUb0NoZWNrLCBvdXRwdXQucGxhY2VIZXJlUGFyZW50LCBjb21wSHRtbEVsZW1lbnQyKTtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCBub2RlIHdpdGggaG90LXBsYWNlLWhlcmUgYXR0cmlidXRlICcke291dHB1dC5wbGFjZUhlcmVQYXJlbnR9J2ApO1xuXHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHQvLyBBcHBlbmQgdGhlIGNoaWxkcmVuIHRvIHRoZSBuZXdseSBjcmVhdGVkIEhUTUwgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoaWxkcmVuVG9SZWFkZC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmNoaWxkcmVuVG9SZWFkZFtpSWR4XSk7XG5cdFx0XHRcdFx0XHRsZXQgcGxhY2VkQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBhdHRyaWJ1dGUgaG90LXBsYWNlLXBhcmVudCBpbiBjaGlsZC5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNoaWxkLmdldEF0dHJpYnV0ZSkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVQYXJlbnRBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlIChcImhvdC1wbGFjZS1wYXJlbnRcIik7XG5cblx0XHRcdFx0XHRcdFx0aWYgKChwbGFjZUhlcmVQYXJlbnRBdHRyICE9IG51bGwpICYmIChwbGFjZUhlcmVQYXJlbnRBdHRyICE9PSBcIlwiKSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlVG9DaGVjazogUGFyZW50Tm9kZSA9IGNvbXBIdG1sRWxlbWVudDI7XG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwbGFjZUVsbUluUGFyZW50IChwYXJlbnROb2RlVG9DaGVjaywgcGxhY2VIZXJlUGFyZW50QXR0ciwgY2hpbGQpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50IG5vZGUgd2l0aCBob3QtcGxhY2UtaGVyZSBhdHRyaWJ1dGUgJyR7b3V0cHV0LnBsYWNlSGVyZVBhcmVudH0nYCk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VkQ2hpbGQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAocGxhY2VkQ2hpbGQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLmFwcGVuZENoaWxkIChjaGlsZCk7XG5cblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGlmIChjaGlsZC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y2hpbGQuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIsIGNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUG9zdFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlbXA6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25Qb3N0UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIucGFyZW50RWxlbWVudCwgY29tcEh0bWxFbGVtZW50Mik7XG5cblx0XHRcdFx0XHRcdGlmICh0ZW1wICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIgPSB0ZW1wO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKEhvdCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50TmFtZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudE5hbWUgPSB0aGlzLmNvbXBvbmVudC5uYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICgoY29tcG9uZW50TmFtZSA9PSBudWxsKSB8fCAoY29tcG9uZW50TmFtZSA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50TmFtZSA9IHRoaXMuaWQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudE5hbWUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmNvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhpcyBoZWxwcyBwYXJzZSA8dHI+IGFuZCBvdGhlciB0YWdzIHRoYXQgZG8gbm90IGhhdmUgYSBwYXJlbnQuXG5cdFx0XHQgKiBcblx0XHRcdCAqIFRoYW5rcyBCcmFuZG9uIE1jQ29ubmVsbCFcblx0XHRcdCAqIFxuXHRcdFx0ICogRnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjczMTM0NzkvbWFrZS1wYXJzZWZyb21zdHJpbmctcGFyc2Utd2l0aG91dC12YWxpZGF0aW9uXG5cdFx0XHQgKiBcblx0XHRcdCAqIEB0b2RvIE1heSByZW1vdmUgdGhpcyBhcyBpdCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2VsbCBpbiBhIGxvdCBvZiBlZGdlIGNhc2VzLlxuXHRcdFx0ICovXG5cdFx0XHRwcm90ZWN0ZWQgbG9vc2VQYXJzZUZyb21TdHJpbmcgKHBhcnNlcjogRE9NUGFyc2VyLCBzdHI6IHN0cmluZykge1xuXHRcdFx0XHRzdHIgPSBzdHIucmVwbGFjZSgvIFxcLz4vZywgJz4nKS5yZXBsYWNlKC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdFx0XHRjb25zdCB4ZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnPHhtbD4nK3N0cisnPC94bWw+JywgJ3RleHQveG1sJyk7XG5cdFx0XHRcdGNvbnN0IGhkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCcnLCAndGV4dC9odG1sJyk7XG5cdFx0XHRcdGZvciAobGV0IGVsZW0gb2YgQXJyYXkuZnJvbSh4ZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlbikpIHtcblx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGhkb20uYm9keS5hcHBlbmRDaGlsZChlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBlbGVtIG9mIEFycmF5LmZyb20oaGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdhcmVhLGJhc2UsYnIsY29sLGNvbW1hbmQsZW1iZWQsaHIsaW1nLGlucHV0LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicpKSkge1xuXHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0ZWxlbS5vdXRlckhUTUwgPSAnPCcrZWxlbS5vdXRlckhUTUwuc2xpY2UoMSkuc3BsaXQoJzwnKVswXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaGRvbTtcblx0XHRcdH1cblxuXHRcdFx0Z2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSAvLy8gQGZpeG1lIERvZXMgdGhpcyBSRUFMTFkgaGF2ZSB0byBiZSBzdGF0aWM/IEF3ZnVsIGlmIGl0IGRvZXMuLi5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmNvbXBvbmVudC5vYnNlcnZlZEF0dHJpYnV0ZXMpO1xuXHRcdFx0fVxuXHRcdH0sIGVsZW1lbnRPcHRpb25zKTtcbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RTdGFxLCBIb3RTdGFydE9wdGlvbnMgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogSWYgcnVubmluZyBpbiBhIGJyb3dzZXIsIHRoaXMgd2lsbCBzdGFydCBIb3RTdGFxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG90U3RhcVdlYlN0YXJ0ICgpXG57XG4gICAgbGV0IGhvdHN0YXFFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcVwiKTtcblxuICAgIC8vIFNldCB0aGlzIHRvIHRydWUsIGp1c3QgaW4gY2FzZS4uLlxuICAgIEhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgKEhvdFN0YXFXZWIpICE9PSBcInVuZGVmaW5lZFwiKVxuICAgIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuXHRcdGZvciAobGV0IGtleSBpbiBIb3RTdGFxV2ViKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3dba2V5XSA9IEhvdFN0YXFXZWJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChob3RzdGFxRWxtcy5sZW5ndGggPiAwKVxuICAgIHtcbiAgICAgICAgbGV0IGhvdHN0YXFFbG06IEhUTUxFbGVtZW50ID0gKDxIVE1MRWxlbWVudD5ob3RzdGFxRWxtc1swXSk7XG5cbiAgICAgICAgc2V0VGltZW91dCAoYXN5bmMgZnVuY3Rpb24gKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgZ2V0QXR0ciA9IChlbG06IEhUTUxFbGVtZW50LCBhdHRyTmFtZXM6IHN0cmluZ1tdKSA9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dHJOYW1lcy5sZW5ndGg7IGlJZHgrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWU6IHN0cmluZyA9IGF0dHJOYW1lc1tpSWR4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbG0uZ2V0QXR0cmlidXRlIChhdHRyTmFtZSkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbG0uZ2V0QXR0cmlidXRlIChhdHRyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsbS5nZXRBdHRyaWJ1dGUgKGBkYXRhLSR7YXR0ck5hbWV9YCkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbG0uZ2V0QXR0cmlidXRlIChgZGF0YS0ke2F0dHJOYW1lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IGxvYWRQYWdlOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJsb2FkLXBhZ2VcIiwgXCJsb2FkUGFnZVwiLCBcInNyY1wiXSkgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgbG9nZ2luZ0xldmVsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJsb2dnaW5nLWxldmVsXCIsIFwibG9nZ2luZ0xldmVsXCJdKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydERlbGF5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzdGFydC1kZWxheVwiLCBcInN0YXJ0RGVsYXlcIl0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlcjogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wicm91dGVyXCJdKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJuYW1lXCJdKSB8fCBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgICAgICBsZXQgYXJnczogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXJnc1wiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgYXBpTGlicmFyeTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXBpLWxpYnJhcnlcIiwgXCJhcGlMaWJyYXJ5XCJdKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBhcGlOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbmFtZVwiLCBcImFwaU5hbWVcIl0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGFwaVVybDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXBpLXVybFwiLCBcImFwaVVybFwiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLW5hbWVcIiwgXCJ0ZXN0ZXJOYW1lXCJdKSB8fCBcIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIjtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbWFwXCIsIFwidGVzdGVyTWFwXCJdKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0ZXJBcGlCYXNlVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItYXBpLWJhc2UtdXJsXCIsIFwidGVzdGVyQXBpQmFzZVVybFwiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdGVyTGF1bmNocGFkVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbGF1bmNocGFkLXVybFwiLCBcInRlc3RlckxhdW5jaHBhZFVybFwiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgZG9udFJldXNlUHJvY2Vzc29yOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IHBhc3NSYXdVcmw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgaHRtbFNvdXJjZTogc3RyaW5nID0gaG90c3RhcUVsbS5pbm5lckhUTUwgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVyTWFuYWdlcjogeyBbcGF0aDogc3RyaW5nXTogeyByZWRpcmVjdDogc3RyaW5nOyBiYXNlUmVkaXJlY3Q6IHN0cmluZzsgYmFzZTogc3RyaW5nOyBzcmM6IHN0cmluZzsgfSB9ID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlcldpbGRjYXJkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VhcmNoOiBVUkxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzdGFydERlbGF5ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IEhvdFN0YXEud2FpdCAocGFyc2VJbnQgKHN0YXJ0RGVsYXkpKTtcblxuICAgICAgICAgICAgICAgIGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYWdlID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wic3JjXCJdKTtcblxuICAgICAgICAgICAgICAgIGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJwYXNzUmF3VXJsXCJdKSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBwYXNzUmF3VXJsID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJkb250LXJldXNlLXByb2Nlc3NvclwiLCBcImRvbnRSZXVzZVByb2Nlc3NvclwiXSkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgZG9udFJldXNlUHJvY2Vzc29yID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGxldCBoc3RxYmFzZXJlZGlyZWN0OiBzdHJpbmcgPSBzZWFyY2guZ2V0IChcImhzdHFiYXNlcmVkaXJlY3RcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaHN0cWJhc2VyZWRpcmVjdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaHN0cWJhc2VyZWRpcmVjdCA9IGRlY29kZVVSSSAoaHN0cWJhc2VyZWRpcmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSAoXCJcIiwgXCJcIiwgaHN0cWJhc2VyZWRpcmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYWdlID0gaHN0cWJhc2VyZWRpcmVjdDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgaG90c3RhcUVycm9ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcImhvdHN0YXEtZXJyb3JcIik7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFFcnJvcnMubGVuZ3RoOyBpSWR4KyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxldCBob3RzdGFxRXJyb3JFbG06IEhUTUxFbGVtZW50ID0gaG90c3RhcUVycm9yc1tpSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhdHVzOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRXJyb3JFbG0sIFtcInN0YXR1c1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bnN1cHBvcnRlZEJyb3dzZXI6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFcnJvckVsbSwgW1widW5zdXBwb3J0ZWQtYnJvd3Nlci1yZWRpcmVjdFwiXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkQnJvd3NlciAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgSG90U3RhcS5lcnJvcnNbXCJ1bnN1cHBvcnRlZEJyb3dzZXJcIl0gPSB7IHJlZGlyZWN0VG9Vcmw6IHVuc3VwcG9ydGVkQnJvd3NlciB9O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBIb3RTdGFxLmVycm9yc1tgJHtlcnJvclN0YXR1c31gXSA9IHsgcmVkaXJlY3RUb1VybDogdW5zdXBwb3J0ZWRCcm93c2VyIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYXN5bmMvYXdhaXQgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIHRyeVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZhbCAoXCJhc3luYyAoKSA9PiB7fVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGV4KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgSG90U3RhcS5leGVjdXRlRXJyb3IgKFwidW5zdXBwb3J0ZWRCcm93c2VyXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgIT09IFwiXCIpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG90c3RhcVJvdXRlckVsbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJob3RzdGFxLXJvdXRlclwiKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFSb3V0ZXJFbG1zLmxlbmd0aDsgaUlkeCsrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG90c3RhcVJvdXRlckVsbTogSFRNTEVsZW1lbnQgPSBob3RzdGFxUm91dGVyRWxtc1tpSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZXJOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxUm91dGVyRWxtLCBbXCJuYW1lXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFSb3V0ZXJFbG0sIFtcInNlcnZlLWxvY2FsXCIsIFwic2VydmVMb2NhbGx5XCJdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlck5hbWUgPT09IHJvdXRlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGFsbCByb3V0ZXMgZnJvbSB0aGUgcm91dGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlKZHggPSAwOyBpSmR4IDwgaG90c3RhcVJvdXRlckVsbS5jaGlsZE5vZGVzLmxlbmd0aDsgaUpkeCsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG0uY2hpbGROb2Rlc1tpSmR4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVyRWxtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJFbG0udGFnTmFtZS50b1VwcGVyQ2FzZSAoKSA9PT0gXCJST1VURVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZXJQYXRoOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInBhdGhcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJyZWRpcmVjdFwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VSZWRpcmVjdDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJiYXNlLXJlZGlyZWN0XCIsIFwiYmFzZVJlZGlyZWN0XCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZTogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJiYXNlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVyU3JjOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInNyY1wiXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVyUGF0aC5pbmRleE9mIChcIipcIikgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyV2lsZGNhcmRzLnB1c2ggKHJvdXRlclBhdGgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyTWFuYWdlcltyb3V0ZXJQYXRoXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiByZWRpcmVjdCB8fCB1bmRlZmluZWQsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVJlZGlyZWN0OiBiYXNlUmVkaXJlY3QgfHwgdW5kZWZpbmVkLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6IGJhc2UgfHwgdW5kZWZpbmVkLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcm91dGVyU3JjIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrUGF0aDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnb3RvUGF0aDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlTG9jYWxseSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93ZXJTZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IHNlcnZlTG9jYWxseS50b0xvd2VyQ2FzZSAoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxvd2VyU2VydmVMb2NhbGx5ID09PSBcInRydWVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb3dlclNlcnZlTG9jYWxseSA9PT0gXCJ5ZXNcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb3dlclNlcnZlTG9jYWxseSA9PT0gXCIxXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hQb3M6IG51bWJlciA9IGNoZWNrUGF0aC5sYXN0SW5kZXhPZiAoXCIvXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoUG9zID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXRoID0gY2hlY2tQYXRoLnN1YnN0cmluZyAobGFzdFNsYXNoUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvUGF0aCA9IGdvdG9QYXRoLnN1YnN0cmluZyAobGFzdFNsYXNoUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJXaWxkY2FyZHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlIGxvY2FsbHkgZG9lc24ndCByZWFsbHkgd29yayB3aXRoIHdpbGRjYXJkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gQGZpeG1lIFRoaXMgaXNuJ3QgYWN0dWFsbHkgd29ya2luZyBsaWtlIGEgd2lsZGNhcmQgc2hvdWxkLiBUaGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpSmR4ID0gMDsgaUpkeCA8IHJvdXRlcldpbGRjYXJkcy5sZW5ndGg7IGlKZHgrKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlV2lsZGNhcmQ6IHN0cmluZyA9IHJvdXRlcldpbGRjYXJkc1tpSmR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wUm91dGVXaWxkY2FyZDogc3RyaW5nID0gcm91dGVXaWxkY2FyZC5yZXBsYWNlIChcIipcIiwgXCJcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja1BhdGguaW5kZXhPZiAodGVtcFJvdXRlV2lsZGNhcmQpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaW1wbHkgcmV0dXJucyB0aGUga2V5IGluIHRoZSByb3V0ZXJNYW5hZ2VyIHRvIGFjY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1BhdGggPSByb3V0ZVdpbGRjYXJkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZWN0IHJvdXRlIGFuZCBsb2FkIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0gIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0ucmVkaXJlY3QgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0ucmVkaXJlY3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uYmFzZVJlZGlyZWN0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRTZWFyY2hQYXJhbXMgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlYXJjaFBhcmFtcyAhPT0gXCJcIikgJiYgKHNlYXJjaFBhcmFtcyAhPT0gXCI/XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkU2VhcmNoUGFyYW1zID0gYCYke3NlYXJjaFBhcmFtcy5zdWJzdHJpbmcgKDEpfWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7cm91dGVyTWFuYWdlcltjaGVja1BhdGhdLmJhc2VSZWRpcmVjdH0/aHN0cWJhc2VyZWRpcmVjdD0ke2VuY29kZVVSSSAoZ290b1BhdGggKyBzZWFyY2hQYXJhbXMpfSR7bW9kaWZpZWRTZWFyY2hQYXJhbXN9YDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5zcmMgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRQYWdlID0gcm91dGVyTWFuYWdlcltjaGVja1BhdGhdLnNyYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBKU09OLnBhcnNlIChhcmdzKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBIb3QuQXJndW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0h0bWxTb3VyY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmIChodG1sU291cmNlICE9PSBcIlwiKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbFNvdXJjZUNoZWNrOiBzdHJpbmcgPSBodG1sU291cmNlLnJlcGxhY2UgKC9cXHMvZywnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxTb3VyY2VDaGVjayAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0h0bWxTb3VyY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0ZW1wTW9kZSA9IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICB0ZW1wTW9kZSA9IEhvdC5Nb2RlO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc29yOiBIb3RTdGFxID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChkb250UmV1c2VQcm9jZXNzb3IgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoSG90KSAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc29yID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmdMZXZlbCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IubG9nZ2VyLmxvZ0xldmVsID0gSG90TG9nLnBhcnNlIChsb2dnaW5nTGV2ZWwpO1xuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc29yLm1vZGUgPSB0ZW1wTW9kZTtcblxuICAgICAgICAgICAgICAgIGxldCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yOiBwcm9jZXNzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAobG9hZFBhZ2UgIT09IFwiXCIpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc1Jhd1VybCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUGFnZS5pbmRleE9mIChcImhzdHFzZXJ2ZVwiKSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFBhZ2UgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBsb2FkUGFnZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyTWFwICE9IG51bGwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3Rlck1hcCA9IHRlc3Rlck1hcDtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0ZXJOYW1lID0gdGVzdGVyTmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyTmFtZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RlckFwaUJhc2VVcmwgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gdGVzdGVyQXBpQmFzZVVybDtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXN0ZXJMYXVuY2hwYWRVcmwgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0ZXN0ZXJMYXVuY2hwYWRVcmw7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXBpTmFtZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwaVVybCA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoYGFwaS11cmwgd2FzIG5vdCBzZXQhYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudExpYjogYW55ID0gd2luZG93O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcGlMaWJyYXJ5ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpYiA9IHdpbmRvd1thcGlMaWJyYXJ5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdBUEkgPSBuZXcgcGFyZW50TGliW2FwaU5hbWVdIChhcGlVcmwsIGNsaWVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0FQSS5jb25uZWN0aW9uLmFwaSA9IG5ld0FQSTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLmFwaSA9IG5ld0FQSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzSHRtbFNvdXJjZSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFBhZ2UgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKGBUaGUgaG90c3RhcSB0YWcgbXVzdCBoYXZlIGEgc3JjLCBIVE1MIGNvbnRlbnRzIGluc2lkZSBpdCwgb3IgYSByb3V0ZXIgc2V0LmApO1xuXG4gICAgICAgICAgICAgICAgICAgIEhvdFN0YXEuZGlzcGxheVVybCAob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEhvdFN0YXEuZGlzcGxheUNvbnRlbnQgKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIHRvIHRha2UgaW4gYSBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlLlxuXHQgKi9cblx0ZGVzdGluYXRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBleGVjdXRpbmcgaXQncyBcblx0ICogdGVzdHMgd2hlbiBpdCdzIHRpbWUuXG5cdCAqL1xuXHRhdXRvU3RhcnQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGRlc3RpbmF0aW9uOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb24gfCBIb3RTaXRlTWFwUGF0aCA9IFwiXCIsIGF1dG9TdGFydDogYm9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRpZiAodHlwZW9mIChkZXN0aW5hdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuXHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBIb3RUZXN0RGVzdGluYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5kZXN0aW5hdGlvbjtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5wYXRoO1xuXHRcdFx0XHR0aGlzLmF1dG9TdGFydCA9IGRlc3RpbmF0aW9uLmF1dG9TdGFydDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQsIEhvdFRlc3RFbGVtZW50T3B0aW9ucyB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RQYWdlXCI7XG5cbi8qKlxuICogVGhpcyBhY3R1YWxseSBleGVjdXRlcyB0aGUgdGVzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RHJpdmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFRlc3RQYWdlO1xuXHQvKipcblx0ICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGVhY2ggZXhlY3V0ZWQgY29tbWFuZC5cblx0ICovXG5cdGNvbW1hbmREZWxheTogbnVtYmVyO1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBzYXZlZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdGVzdGluZyBydW5zLlxuXHQgKi9cblx0cGVyc2lzdGVudERhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBwYWdlOiBIb3RUZXN0UGFnZSB8IG51bGwgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5wYWdlID0gcGFnZTtcblx0XHR0aGlzLmNvbW1hbmREZWxheSA9IDIwO1xuXHRcdHRoaXMucGVyc2lzdGVudERhdGEgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IG9iamVjdCBieSBpdCdzIG5hbWUuIElmIGEgKiBpcyB1c2VkLCBpdCB3aWxsIGJlIHVzZWQgYXMgYSBcblx0ICogd2lsZGNhcmQgZm9yIHRoZSBvYmplY3QncyBuYW1lLiBJZiBhID4gaXMgdXNlZCwgdGhlbiB0aGUgbmFtZSB3aWxsIFxuXHQgKiBiZSB0cmVhdGVkIGFzIGEgQ1NTIHNlbGVjdG9yLlxuXHQgKi9cblx0cGFyc2VUZXN0T2JqZWN0IChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IG5hbWUuaW5kZXhPZiAoXCIqXCIpO1xuXHRcdGxldCB3aWxkY2FyZDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFwqLywgXCJcIik7XG5cdFx0XHR3aWxkY2FyZCA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdGxldCBzZWxlY3Rvcjogc3RyaW5nID0gYFtkYXRhLXRlc3Qtb2JqZWN0LW5hbWUke3dpbGRjYXJkfT0nJHtuYW1lfSddYDtcblx0XHRwb3MgPSBuYW1lLmluZGV4T2YgKFwiPlwiKTtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFw+LywgXCJcIik7XG5cdFx0XHRzZWxlY3RvciA9IG5hbWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChzZWxlY3Rvcik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0YXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKGF3YWl0IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRhc3luYyBwcmludCAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUgKG1lc3NhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByaW50IGEgbWVzc2FnZSBsaW5lLlxuXHQgKi9cblx0YXN5bmMgcHJpbnRsbiAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0YXdhaXQgdGhpcy5wcmludCAoYCR7bWVzc2FnZX1cXG5gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoaXMgc2VydmVyIG9yIGRlc3Ryb3kgYW55dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSG90VGVzdERyaXZlci5cblx0ICovXG5cdGFzeW5jIGRlc3Ryb3kgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIEFuIGV4cHJlc3Npb24gdG8gdGVzdC5cblx0ICovXG5cdGFzeW5jIGFzc2VydCAodmFsdWU6IGFueSwgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRpZiAoISAodmFsdWUpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChlcnJvck1lc3NhZ2UpO1xuXHR9XG59IiwiLyoqXG4gKiBIb3QgdGVzdCBlbGVtZW50IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFRlc3RFbGVtZW50T3B0aW9uc1xue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3QgZWxlbWVudCBtdXN0IGJlIHZpc2libGUgaW4gXG5cdCAqIG9yZGVyIHRvIHNlbGVjdCBpdC5cblx0ICovXG5cdG11c3RCZVZpc2libGU/OiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgdGhlIHRlc3QgZWxlbWVudCBpcyBtaXNzaW5nLCBpZ25vcmUgdGhlIGVycm9yLiBUaGlzIFxuXHQgKiB3aWxsIGNhdXNlIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaW1tZWRpYXRlbHkgXG5cdCAqIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duLlxuXHQgKi9cblx0aWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG90IHRlc3QgZWxlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdEVsZW1lbnRPcHRpb25zIGltcGxlbWVudHMgSUhvdFRlc3RFbGVtZW50T3B0aW9uc1xue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3QgZWxlbWVudCBtdXN0IGJlIHZpc2libGUgaW4gXG5cdCAqIG9yZGVyIHRvIHNlbGVjdCBpdC5cblx0ICovXG5cdG11c3RCZVZpc2libGU6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBJZiB0aGUgdGVzdCBlbGVtZW50IGlzIG1pc3NpbmcsIGlnbm9yZSB0aGUgZXJyb3IuIFRoaXMgXG5cdCAqIHdpbGwgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBpbW1lZGlhdGVseSBcblx0ICogd2l0aG91dCBhbnkgZXhjZXB0aW9ucyBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90VGVzdEVsZW1lbnRPcHRpb25zID0ge30pXG5cdHtcblx0XHR0aGlzLm11c3RCZVZpc2libGUgPSBjb3B5Lm11c3RCZVZpc2libGUgfHwgdHJ1ZTtcblx0XHR0aGlzLmlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IgPSBjb3B5Lmlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IgfHwgZmFsc2U7XG5cdH1cbn1cblxuLyoqXG4gKiBBIHRlc3QgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90VGVzdEVsZW1lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgXG5cdCAqIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdC5cblx0ICovXG5cdGZ1bmM/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgdG8gdXNlLlxuXHQgKi9cblx0dmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSB0ZXN0IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RWxlbWVudCBpbXBsZW1lbnRzIElIb3RUZXN0RWxlbWVudFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBcblx0ICogd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0LlxuXHQgKi9cblx0ZnVuYzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIHRvIHVzZS5cblx0ICovXG5cdHZhbHVlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZyB8IElIb3RUZXN0RWxlbWVudCwgZnVuYzogc3RyaW5nID0gXCJcIiwgdmFsdWU6IGFueSA9IG51bGwpXG5cdHtcblx0XHRpZiAodHlwZW9mIChuYW1lKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdFx0dGhpcy5mdW5jID0gZnVuYztcblx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMubmFtZSA9IG5hbWUubmFtZTtcblx0XHRcdHRoaXMuZnVuYyA9IG5hbWUuZnVuYyB8fCBmdW5jO1xuXHRcdFx0dGhpcy52YWx1ZSA9IG5hbWUudmFsdWUgfHwgdmFsdWU7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3REZXN0aW5hdGlvbiB9IGZyb20gXCIuL0hvdFRlc3REZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0UGFnZVwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHRlc3QgcGF0aCBmb3IgbGF0ZXIgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIb3RUZXN0UGF0aCA9IChkcml2ZXI6IEhvdFRlc3REcml2ZXIpID0+IFByb21pc2U8YW55PjtcblxuLyoqXG4gKiBNYXBzIHRoZSBwYXRocyB0aGF0IGFyZSB0YWtlbiB0byBjb21wbGV0ZSBhIHRlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0TWFwXG57XG5cdC8qKlxuXHQgKiBUaGUgb3JkZXIgaW4gd2hpY2ggcGF0aHMgYXJlIHRvIGJlIHRha2VuLiBFYWNoIGRlc3RpbmF0aW9uIGlzIGEgc3RyaW5nIFxuXHQgKiBpbiBhIHR5cGUgLT4gcGF0aCBvcmRlci4gVGhlIHR5cGUgY291bGQgYmUgZWl0aGVyIGEgcGFnZSBvciBhcGkgcm91dGUuIFxuXHQgKiBGb3IgZXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIFtcblx0ICogICAgICBcInBhZ2U6c2lnbmluX3BhZ2UgLT4gc2lnbmluX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV91c2VybmFtZV9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfcGFzc3dvcmRfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX25hbWVfcGF0aCAtPiBjaGFuZ2VfYWRkcmVzc19wYXRoXCIsXG5cdCAqIFx0XHRcInBhZ2U6YWNjb3VudF9wYWdlIC0+IHNpZ25vdXRfcGF0aFwiLFxuXHQgKiBcdFx0XCJhcGk6YWNjb3VudF9hcGlfcm91dGUgLT4gc2lnbm91dF9yb3V0ZV9tZXRob2QgLT4gc2lnbm91dF90ZXN0X3BhdGhcIlxuXHQgKiBdXG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhlIGZpcnN0IHN0cmluZyB0byB0aGUgbGVmdCBvZiB0aGUgLT4gd2lsbCBhbHdheXMgYmUgdGhlIHR5cGUsIHN1Y2ggYXMgYSBcblx0ICogcGFnZSBvciBhbiBhcGkgcm91dGUuIEFueSBzdHJpbmdzIHRvIHRoZSByaWdodCBvZiB0aGUgLT4gd2lsbCBiZSBhIHBhdGgsIGV2ZW4gXG5cdCAqIHdoZW4gY2hhaW5pbmcgYWRkdGlvbmFsIC0+J3MuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbnM6IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdERlc3RpbmF0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIGRlc3RpbmF0aW9ucyBhcmUgc3VwcG9zZWQgdG8gZXhlY3V0ZS4gVGhpcyBpcyBcblx0ICogaWdub3JlZCBpZiB0aGUgZGVzdGluYXRpb25zIGFyZSBhbiBhcnJheS5cblx0ICovXG5cdGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGFnZXMgdG8gZXhlY3V0ZS5cblx0ICovXG5cdHBhZ2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhZ2Vcblx0XHR9O1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbnM6IHN0cmluZ1tdIHwgSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb247IH0gPSBbXSwgXG5cdFx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlIH0gPSB7fSwgZGVzdGluYXRpb25PcmRlcjogc3RyaW5nW10gPSBbXSlcblx0e1xuXHRcdC8vIEdvIHRocm91Z2ggYW5kIGNvbnZlcnQgYW55IHN0cmluZ3MgaW50byBIb3RUZXN0RGVzdGluYXRpb25zLlxuXHRcdGlmIChkZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGRlc3RpbmF0aW9ucylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNba2V5XTtcblxuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uc1trZXldID0gbmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXN0aW5hdGlvbk9yZGVyID0gZGVzdGluYXRpb25PcmRlcjtcblx0XHR0aGlzLnBhZ2VzID0gcGFnZXM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIFRlc3RDYXNlT2JqZWN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdFRlc3REZXN0aW5hdGlvbiB9IGZyb20gXCIuL0hvdFRlc3REZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0UGFnZVwiO1xuaW1wb3J0IHsgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3REZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgSG90VGVzdFN0b3AgfSBmcm9tIFwiLi9Ib3RUZXN0U3RvcFwiO1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdGVyXG57XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGltZW91dCBmb3IgZWFjaCB0ZXN0LlxuXHQgKi9cblx0dGltZW91dDogbnVtYmVyO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRoYXQgd2lsbCBjb25zdHJ1Y3QgZnV0dXJlIHVybHMuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBwcm9jZXNzb3IuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBtYXBzIHRvIHRlc3QuXG5cdCAqL1xuXHR0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfTtcblx0LyoqXG5cdCAqIFRoZSBkcml2ZXIgdG8gdXNlIHdoZW4gcnVubmluZyB0ZXN0cy5cblx0ICovXG5cdGRyaXZlcjogSG90VGVzdERyaXZlcjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBsb2FkaW5nP1xuXHQgKi9cblx0ZmluaXNoZWRMb2FkaW5nOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgZmluaXNoZWQgc2V0dGluZyB1cD9cblx0ICovXG5cdGhhc0JlZW5EZXN0cm95ZWQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSwgbmFtZTogc3RyaW5nLCBiYXNlVXJsOiBzdHJpbmcsIFxuXHRcdGRyaXZlcjogSG90VGVzdERyaXZlciwgdGVzdE1hcHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RNYXA7IH0gPSB7fSlcblx0e1xuXHRcdGlmICh0ZXN0TWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGhlIHRlc3RNYXBzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0LCBidXQgY2Fubm90IGJlIG51bGwhIEl0IGlzIHNldCB0byBudWxsLmApO1xuXG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gMTAwMDA7XG5cdFx0dGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0XHR0aGlzLnRlc3RNYXBzID0gdGVzdE1hcHM7XG5cdFx0dGhpcy5kcml2ZXIgPSBkcml2ZXI7XG5cdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IGZhbHNlO1xuXHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gc2V0dGluZyB1cCB0aGUgdGVzdGVyLlxuXHQgKi9cblx0YXN5bmMgc2V0dXAgKGlzV2ViUm91dGU6IGJvb2xlYW4sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gZGVzdHJveWluZyB1cCB0aGUgdGVzdGVyLlxuXHQgKi9cblx0YXN5bmMgZGVzdHJveSAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0ZXN0cyBhcmUgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIHRydWUsIGl0IHdpbGwgXG5cdCAqIGNvbnRpbnVlIGFuZCBleGVjdXRlIGFsbCB0ZXN0IHBhdGhzLiBJZiB0aGlzIHJldHVybnMgaXQgd2lsbCBcblx0ICogc2tpcCBhbGwgdGVzdCBwYXRocyBhbmQgZXhlY3V0ZSBvblRlc3RFbmQgaW5zdGVhZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCB1cmw6IHN0cmluZywgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIFxuXHQgKiB0aGUgdGVzdFBhdGggd2lsbCBub3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhTdGFydD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYW4gQVBJIHRlc3QgcGF0aCBoYXMgZW5kZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RBUElQYXRoRW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCByZXN1bHQ6IGFueSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gcGFnZSB0ZXN0cyBhcmUgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdGVzdFBhdGggd2lsbCBub3QgYmUgXG5cdCAqIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIGFmdGVyd2FyZHMuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RQYWdlUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgXG5cdFx0c3RvcDogSG90VGVzdFN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGEgcGFnZSB0ZXN0IGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoRW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCB0ZXN0UGF0aDogSG90VGVzdFBhdGgsIFxuXHRcdHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRhc3luYyBvbkNvbW1hbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhZ2U6IEhvdFRlc3RQYWdlLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0Y21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjbWRGdW5jOiAoKGNtZEFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+KSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBmaW5pc2hlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGJlZW4gZXhlY3V0ZWQgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25FeGVjdXRlPyAoKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIGxvYWRpbmcgYWxsIGRhdGEgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25GaW5pc2hlZExvYWRpbmc/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBmaW5pc2ggbG9hZGluZyBhbGwgZGF0YS5cblx0ICovXG5cdGFzeW5jIHdhaXRGb3JEYXRhICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAodGhpcy5maW5pc2hlZExvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICgxMCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBwYWdlLlxuXHQgKi9cblx0Z2V0VGVzdFBhZ2UgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IEhvdFRlc3RQYWdlXG5cdHtcblx0XHRsZXQgcGFnZSA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV0ucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRyZXR1cm4gKHBhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGdldFRlc3RQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhdGhOYW1lOiBzdHJpbmcpOiBIb3RUZXN0UGF0aFxuXHR7XG5cdFx0bGV0IHBhZ2UgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXG5cdFx0cmV0dXJuIChwYWdlLnRlc3RQYXRoc1twYXRoTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGRlc3RpbmF0aW9uIEpTT04gb2JqZWN0IHRvIHVzZS5cblx0ICovXG5cdHN0YXRpYyBpbnRlcnByZXREZXN0aW5hdGlvbiAobWFwTmFtZTogc3RyaW5nLCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uKTogSG90RGVzdGluYXRpb25cblx0e1xuXHRcdGxldCBkZXN0aW5hdGlvbjogc3RyaW5nID0gdGVzdERlc3QuZGVzdGluYXRpb247XG5cdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IHtcblx0XHRcdFx0bWFwTmFtZTogbWFwTmFtZSxcblx0XHRcdFx0cGFnZTogXCJcIixcblx0XHRcdFx0YXBpOiBcIlwiLFxuXHRcdFx0XHRwYXRoczogW11cblx0XHRcdH07XG5cdFx0bGV0IHN0cnM6IHN0cmluZ1tdID0gZGVzdGluYXRpb24uc3BsaXQgKC9cXC1cXD4vZyk7XG5cdFx0bGV0IHR5cGU6IHN0cmluZyA9IHN0cnNbMF07XG5cblx0XHRpZiAodHlwZS5sZW5ndGggPCAyKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdGlmICgodHlwZVswXSA9PT0gXCIvXCIpICYmICh0eXBlWzFdID09PSBcIi9cIikpXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXG5cdFx0bGV0IGdldFR5cGU6ICh0eXBlU3RyOiBzdHJpbmcsIHR5cGVEZWxpbWl0ZXI6IHN0cmluZykgPT4gc3RyaW5nID0gXG5cdFx0XHQodHlwZVN0cjogc3RyaW5nLCB0eXBlRGVsaW1pdGVyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHBvczogbnVtYmVyID0gdHlwZVN0ci5pbmRleE9mICh0eXBlRGVsaW1pdGVyKTtcblx0XHRcdFx0bGV0IHR5cGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcblx0XHRcblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZVZhbHVlID0gdHlwZVN0ci5zdWJzdHIgKHBvcyArIHR5cGVEZWxpbWl0ZXIubGVuZ3RoKTtcblx0XHRcdFx0XHR0eXBlVmFsdWUgPSB0eXBlVmFsdWUudHJpbSAoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodHlwZVZhbHVlKTtcblx0XHRcdH07XG5cblx0XHRuZXdEZXN0aW5hdGlvbi5wYWdlID0gZ2V0VHlwZSAodHlwZSwgXCJwYWdlOlwiKTtcblx0XHRuZXdEZXN0aW5hdGlvbi5hcGkgPSBnZXRUeXBlICh0eXBlLCBcImFwaTpcIik7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMTsgaUlkeCA8IHN0cnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG5ld1BhdGhTdHI6IHN0cmluZyA9IHN0cnNbaUlkeF07XG5cdFx0XHRsZXQgbmV3UGF0aDogSG90VGVzdFN0b3AgPSB7XG5cdFx0XHRcdFx0Y21kOiBcIlwiLFxuXHRcdFx0XHRcdGRlc3Q6IFwiXCIsXG5cdFx0XHRcdFx0cGF0aDogXCJcIlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRuZXdQYXRoU3RyID0gbmV3UGF0aFN0ci50cmltICgpO1xuXHRcdFx0bmV3UGF0aC5kZXN0ID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJkZXN0OlwiKTtcblx0XHRcdG5ld1BhdGguY21kID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJjbWQ6XCIpO1xuXHRcdFx0bmV3UGF0aC5wYXRoID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJwYXRoOlwiKTtcblxuXHRcdFx0aWYgKChuZXdQYXRoLmRlc3QgPT0gXCJcIikgJiYgKG5ld1BhdGguY21kID09IFwiXCIpICYmIChuZXdQYXRoLnBhdGggPT0gXCJcIikpXG5cdFx0XHRcdG5ld1BhdGgucGF0aCA9IG5ld1BhdGhTdHI7XG5cblx0XHRcdG5ld0Rlc3RpbmF0aW9uLnBhdGhzLnB1c2ggKG5ld1BhdGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobmV3RGVzdGluYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYW4gQVBJJ3MgdGVzdCBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RBUElQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHNraXBFdmVudENhbGxzOiBib29sZWFuID0gZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCBydW5UZXN0UGF0aDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRpZiAobWV0aG9kID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUcnlpbmcgdG8gYWNjZXNzIG51bGwgbWV0aG9kIG9uIGRlc3RpbmF0aW9uIG1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9LmApO1xuXG5cdFx0Ly8gQSBkdW1iIGhhY2sgdG8gcHJldmVudCBhbnkgcmVjdXJzaW9uIHRoYXQgY291bGQgb2NjdXIuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RBUElQYXRoU3RhcnQgIT0gbnVsbClcblx0XHRcdFx0cnVuVGVzdFBhdGggPSBhd2FpdCB0aGlzLm9uVGVzdEFQSVBhdGhTdGFydCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKHJ1blRlc3RQYXRoID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGxldCB0ZXN0Q2FzZU9iamVjdDogVGVzdENhc2VPYmplY3QgPSBtZXRob2QudGVzdENhc2VzW3Rlc3ROYW1lXTtcblxuXHRcdFx0aWYgKHRlc3RDYXNlT2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogVGVzdCBjYXNlIG9iamVjdCAke3Rlc3ROYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0cmVzdWx0ID0gYXdhaXQgdGVzdENhc2VPYmplY3QuZnVuYyAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0QVBJUGF0aEVuZCAhPSBudWxsKVxuXHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEFQSVBhdGhFbmQgKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgdGVzdCBwYXRocyBpbiBhbiBBUEkgcm91dGUuXG5cdCAqIFxuXHQgKiBAZml4bWUgVGhpcyBuZWVkcyBhIGJldHRlciBpbXBsZW1lbnRhdGlvbi4uLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RBUElQYXRocyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXTtcblxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFQSSBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGlmICh0aGlzLnByb2Nlc3Nvci5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQXNzb2NpYXRlZCBwcm9jZXNzb3IgZG9lcyBub3QgaGF2ZSBhbiBBUEkhYCk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5wcm9jZXNzb3IuYXBpLnJvdXRlc1tkZXN0aW5hdGlvbi5hcGldO1xuXG5cdFx0aWYgKHJvdXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFQSSBkb2VzIG5vdCBoYXZlIHJvdXRlICR7ZGVzdGluYXRpb24uYXBpfSFgKTtcblxuXHRcdC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHBhdGggaW4gdGhlIGRlc3RpbmF0aW9uIHVudGlsIGNvbXBsZXRlLlxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZGVzdGluYXRpb24ucGF0aHMubGVuZ3RoOyBpSWR4ICs9IDIpXG5cdFx0e1xuXHRcdFx0bGV0IHN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeF07XG5cdFx0XHRsZXQgcGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRcdGxldCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gcm91dGUuZ2V0TWV0aG9kIChwYXRoTmFtZSk7XG5cdFx0XHRsZXQgbmV4dFN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeCArIDFdO1xuXHRcdFx0bGV0IHRlc3ROYW1lOiBzdHJpbmcgPSBuZXh0U3RvcC5wYXRoO1xuXG5cdFx0XHRpZiAobWV0aG9kID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIG1ldGhvZCByZWxhdGVkIHRvIHBhdGggJHtwYXRoTmFtZX0gaW4gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIHRlc3QgcGFnZSBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0c2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdlYiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRpZiAocGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLmRyaXZlci5wYWdlID0gcGFnZTtcblxuXHRcdGxldCB0ZXN0UGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRsZXQgdGVzdFBhdGg6IEhvdFRlc3RQYXRoID0gcGFnZS50ZXN0UGF0aHNbdGVzdFBhdGhOYW1lXTtcblxuXHRcdC8vIEEgZHVtYiBoYWNrIHRvIHByZXZlbnQgYW55IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIG9jY3VyLlxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKHJ1blRlc3RQYXRoID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0UGF0aCA9PSBudWxsKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgcGF0aCAke3Rlc3RQYXRoTmFtZX0gZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIWApO1xuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0UGF0aCAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aEVuZCAoZGVzdGluYXRpb24sIHRlc3RQYXRoLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgc3RvcDogSG90VGVzdFN0b3AsIGNtZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0LyoqXG5cdFx0ICogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbW1hbmQgbWF0Y2hlcy5cblx0XHQgKi9cblx0XHRsZXQgaGFzQ21kOiAoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbikgPT4gYm9vbGVhbiA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcsIGNtZDogc3RyaW5nLCBoYXNBcmd1bWVudHM6IGJvb2xlYW4pOiBib29sZWFuID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoc3RvcC5jbWQgPT09IGNtZClcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHBvczogbnVtYmVyID0gc3RvcC5jbWQuaW5kZXhPZiAoXCIoXCIpO1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlJ3MgcGFyZW50aGVzaXMsIGdldCB0aGUgaW5jb21pbmcgY29tbWFuZC5cblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0Q21kOiBzdHJpbmcgPSBzdG9wLmNtZC5zdWJzdHIgKDAsIHBvcyk7XG5cblx0XHRcdFx0XHRpZiAoaW5wdXRDbWQgPT09IGNtZClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIEdldCB0aGUgYXJndW1lbnRzIGluIGEgY29tbWFuZC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGEgXG5cdFx0ICogc2luZ2xlIGFyZ3VtZW50IGZvciBub3cuXG5cdFx0ICogXG5cdFx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhcmd1bWVudHMuXG5cdFx0ICovXG5cdFx0bGV0IGdldENtZEFyZ3M6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdbXSA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaCAoLyg/PVxcKCkoLio/KSg/PVxcKSkvZyk7XG5cblx0XHRcdFx0aWYgKG1hdGNoZXMgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZW1wTWF0Y2ggPSBtYXRjaGVzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdFx0dGVtcE1hdGNoID0gdGVtcE1hdGNoLnN1YnN0ciAoMiwgdGVtcE1hdGNoLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRyZXN1bHRzLnB1c2ggKHRlbXBNYXRjaCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0cy5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke2lucHV0fSByZXF1aXJlcyBhcmd1bWVudHMsIGJ1dCBub25lIHdlcmUgc3VwcGxpZWQuYCk7XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0XHRcdH07XG5cblx0XHRsZXQgc2VsZW5pdW1UZXN0ZXI6IGFueSA9IG51bGw7XG5cdFx0bGV0IGNtZEZ1bmM6ICgoY21kQXJnczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4pID0gbnVsbDtcblx0XHRsZXQgYXJnczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodHlwZW9mIChIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtKSAhPSBcInVuZGVmaW5lZFwiKVxuXHRcdHsvLyBAdHMtaWdub3JlXG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gSGFjayB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbXBvcnRpbmcuXG5cdFx0XHRpZiAodGhpcyBpbnN0YW5jZW9mIEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0pXG5cdFx0XHRcdHNlbGVuaXVtVGVzdGVyID0gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoc2VsZW5pdW1UZXN0ZXIgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ1cmxcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRcdGF3YWl0IHNlbGVuaXVtVGVzdGVyLmRyaXZlci5uYXZpZ2F0ZVRvVXJsIChpbnB1dCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RPYmplY3RcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cdFxuXHRcdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0ZXN0T2JqZWN0OiBzdHJpbmcgPSBKU09OLnBhcnNlIChjbWRBcmdzWzBdKTtcblx0XG5cdFx0XHRcdFx0XHRhd2FpdCBzZWxlbml1bVRlc3Rlci5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50ICh0ZXN0T2JqZWN0KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRGb3JUZXN0ZXJBUElEYXRhXCIsIGZhbHNlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JEYXRhICgpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBudW1NaWxsaXNlY29uZHM6IG51bWJlciA9IHBhcnNlSW50IChjbWRBcmdzWzBdKTtcblxuXHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAobnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIucHJpbnQgKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludGxuXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludGxuIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGNtZEZ1bmMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke3N0b3AuY21kfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGF3YWl0IHRoaXMub25Db21tYW5kIChkZXN0aW5hdGlvbiwgcGFnZSwgc3RvcCwgY21kLCBhcmdzLCBjbWRGdW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB0ZXN0IHBhdGhzIGluIGEgcGFnZS5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0UGFnZVBhdGhzIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueVtdPlxuXHR7XG5cdFx0bGV0IHJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0Ly8vIEBmaXhtZSBGb3Igc29tZSByZWFzb24gdGhlIGVycm9ycyBiZWluZyB0aHJvd24gaGVyZSBhcmUgbm90IGJlaW5nIHRocm93bi5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBXZWIgTWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHQvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXRoIGluIHRoZSBkZXN0aW5hdGlvbiB1bnRpbCBjb21wbGV0ZS5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9uLnBhdGhzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBzdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHhdO1xuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblx0XHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cdFxuXHRcdFx0aWYgKHBhZ2UgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdGlmIChzdG9wLmRlc3QgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0TWFwLmRlc3RpbmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2hlbiB1c2luZyB0eXBlICdkZXN0JyBpbiBhIGRlc3RpbmF0aW9uIHN0cmluZywgYWxsIGRlc3RpbmF0aW9ucyBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBtdXN0IGJlIG5hbWVkLmApO1xuXG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gdGVzdE1hcC5kZXN0aW5hdGlvbnNbc3RvcC5kZXN0XTtcblx0XHRcdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IEhvdFRlc3Rlci5pbnRlcnByZXREZXN0aW5hdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uLm1hcE5hbWUsIHRlc3REZXN0KTtcblxuXHRcdFx0XHRpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbClcblx0XHRcdFx0XHRyZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0UGFnZVBhdGhzIChuZXdEZXN0aW5hdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdG9wLmNtZCAhPT0gXCJcIilcblx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIHN0b3AuY21kKTtcblxuXHRcdFx0aWYgKHN0b3AucGF0aCAhPT0gXCJcIilcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbiwgc3RvcCwgZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlIChtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1ttYXBOYW1lXTtcblxuXHRcdGlmIChtYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7bWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLnByb2Nlc3Nvci5sb2dnZXIudmVyYm9zZSAoYEhvdFRlc3RlcjogRXhlY3V0aW5nIG1hcCAke21hcE5hbWV9Li4uYCk7XG5cblx0XHQvLyBQcm9jZXNzIHJvdXRlcyB0ZXN0aW5nIGZpcnN0LlxuXHRcdGxldCByb3V0ZUtleTogc3RyaW5nID0gdGhpcy5wcm9jZXNzb3IuZ2V0Um91dGVLZXlGcm9tTmFtZSAobWFwTmFtZSk7XG5cdFx0bGV0IHVybDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmJhc2VVcmwgPT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYgKHJvdXRlS2V5ICE9PSBcIlwiKVxuXHRcdFx0dXJsID0gYCR7dGhpcy5iYXNlVXJsfSR7cm91dGVLZXl9YDtcblxuXHRcdGxldCBleGVjdXRlRGVzdGluYXRpb246ICh0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbktleT86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPiA9IFxuXHRcdFx0YXN5bmMgKHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24sIGRlc3RpbmF0aW9uS2V5OiBzdHJpbmcgPSBcIlwiKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdERlc3QuYXV0b1N0YXJ0ID09PSBmYWxzZSlcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnByb2Nlc3Nvci5sb2dnZXIudmVyYm9zZSAoKCkgPT4gYEhvdFRlc3RlcjogRXhlY3V0aW5nICR7bWFwTmFtZX0gZGVzdGluYXRpb24gJHtKU09OLnN0cmluZ2lmeSAodGVzdERlc3QpfS4uLmApO1xuXHRcdFx0XHRcdGxldCBkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSBIb3RUZXN0ZXIuaW50ZXJwcmV0RGVzdGluYXRpb24gKG1hcE5hbWUsIHRlc3REZXN0KTtcblx0XHRcdFx0XHRsZXQgaXNXZWJSb3V0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBydW5UZXN0UGF0aHM6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLnBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRpc1dlYlJvdXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHVwICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaGFzQmVlblNldHVwID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zZXR1cCAoaXNXZWJSb3V0ZSwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5oYXNCZWVuRGVzdHJveWVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLm9uVGVzdFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRydW5UZXN0UGF0aHMgPSBhd2FpdCB0aGlzLm9uVGVzdFN0YXJ0IChkZXN0aW5hdGlvbiwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHJ1blRlc3RQYXRocyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24ucGFnZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLmFwaSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEVuZCAoZGVzdGluYXRpb24pO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVzdHJveSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmRlc3Ryb3kgKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRocm93IGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIG1hcCBkZXN0aW5hdGlvbnMgYXJlIGluIGFuIGFycmF5LCBqdXN0IGV4ZWN1dGUgdGhvc2UgaW4gb3JkZXIuXG5cdFx0aWYgKG1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcC5kZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tpSWR4XTtcblxuXHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBkZXN0aW5hdGlvbiBvcmRlciwgdXNlIHRoYXQuXG5cdFx0XHRpZiAobWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGhhc0V4ZWN1dGVkS2V5czogc3RyaW5nW10gPSBbXTtcblxuXHRcdFx0XHQvLyBHbyB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbiBvcmRlciBhbmQgZXhlY3V0ZSBlYWNoIG9uZS5cblx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25PcmRlci5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvcmRlcktleTogc3RyaW5nID0gbWFwLmRlc3RpbmF0aW9uT3JkZXJbaUlkeF07XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW29yZGVyS2V5XTtcblxuXHRcdFx0XHRcdGlmICh0ZXN0RGVzdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEZXN0aW5hdGlvbiAke29yZGVyS2V5fSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdGhhc0V4ZWN1dGVkS2V5cy5wdXNoIChvcmRlcktleSk7XG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwgb3JkZXJLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCB5ZXQuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4ZWN1dGVEZXN0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaGFzRXhlY3V0ZWRLZXlzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBleGVjdXRlZEtleTogc3RyaW5nID0gaGFzRXhlY3V0ZWRLZXlzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZXhlY3V0ZWRLZXkgPT09IGtleSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZXhlY3V0ZURlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0ZURlc3QgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGRlc3RpbmF0aW9ucyBpbiBhbnkgb3JkZXIuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgRXZlbnRFeGVjdXRpb25UeXBlLCBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdEV2ZW50TWV0aG9kLCBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcblxuZXhwb3J0IGNsYXNzIEhvdFRlc3RlckFQSSBleHRlbmRzIEhvdEFQSVxue1xuXHRjb25zdHJ1Y3RvciAoYmFzZVVybDogc3RyaW5nLCBjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQgPSBudWxsLCBkYjogYW55ID0gbnVsbClcblx0e1xuXHRcdHN1cGVyKGJhc2VVcmwsIGNvbm5lY3Rpb24sIGRiKTtcblxuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdEFQSTtcblxuXHRcdGxldCByb3V0ZTogSG90Um91dGUgPSBuZXcgSG90Um91dGUgKGNvbm5lY3Rpb24sIFwidGVzdGVyXCIpO1xuXHRcdHJvdXRlLmFkZE1ldGhvZCAoe1xuXHRcdFx0XHRcIm5hbWVcIjogXCJwYWdlTG9hZGVkXCIsIFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLnBhZ2VMb2FkZWQsXG5cdFx0XHRcdFwicGFyYW1ldGVyc1wiOiB7XG5cdFx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3Rlck1hcFwiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgdGVzdGVyIG1hcCBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInBhZ2VOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSBwYWdlIGV4ZWN1dGluZyB0aGUgdGVzdC5cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwidGVzdEVsZW1lbnRzXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJhcnJheVwiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3QgZWxlbWVudHMgb24gdGhlIHBhZ2UuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3RQYXRoc1wiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwiYXJyYXlcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0IHBhdGhzIG9uIHRoZSBwYWdlLlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImV4ZWN1dGVUZXN0c1wiLFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmV4ZWN1dGVUZXN0cyxcblx0XHRcdFx0XCJwYXJhbWV0ZXJzXCI6IHtcblx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwidGVzdGVyTWFwXCI6IHtcblx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0ZXIgbWFwIHRvIGV4ZWN1dGUuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSB3aGVuIHRlc3RzIGFyZSBjb21wbGV0ZS5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImhlYXJ0YmVhdFwiLFxuXHRcdFx0XHRcInR5cGVcIjogSG90RXZlbnRNZXRob2QuR0VULFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmhlYXJ0YmVhdCxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0dGhpcy5hZGRSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cblx0ICovXG5cdGFzeW5jIHBhZ2VMb2FkZWQgKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJPYmo6IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHRcdFx0XHR0ZXN0ZXJNYXA6IHN0cmluZztcblx0XHRcdFx0cGFnZU5hbWU6IHN0cmluZztcblx0XHRcdFx0dGVzdEVsZW1lbnRzOiBhbnk7XG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IGFueTtcblx0XHRcdH0gPSB7XG5cdFx0XHRcdHRlc3Rlck5hbWU6IHJlcXVlc3QuanNvbk9ialtcInRlc3Rlck5hbWVcIl0sXG5cdFx0XHRcdHRlc3Rlck1hcDogcmVxdWVzdC5qc29uT2JqW1widGVzdGVyTWFwXCJdLFxuXHRcdFx0XHRwYWdlTmFtZTogcmVxdWVzdC5qc29uT2JqW1wicGFnZU5hbWVcIl0sXG5cdFx0XHRcdHRlc3RFbGVtZW50czogcmVxdWVzdC5qc29uT2JqW1widGVzdEVsZW1lbnRzXCJdLFxuXHRcdFx0XHR0ZXN0UGF0aHNTdHJzOiByZXF1ZXN0Lmpzb25PYmpbXCJ0ZXN0UGF0aHNcIl1cblx0XHRcdH07XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gdGVzdGVyT2JqKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGxldCB0ZXN0T2JqOiBhbnkgPSB0ZXN0ZXJPYmpba2V5XTtcblx0XHRcdGxldCB0aHJvd0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdGlmICh0ZXN0T2JqID09IG51bGwpXG5cdFx0XHRcdHRocm93RXJyb3IgPSB0cnVlO1xuXG5cdFx0XHRpZiAoKHRlc3Rlck9iai50ZXN0ZXJOYW1lID09IFwiXCIpIHx8IFxuXHRcdFx0XHQodGVzdGVyT2JqLnRlc3Rlck1hcCA9PT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID09PSBcIlwiKSlcblx0XHRcdHtcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aHJvd0Vycm9yID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IE9iamVjdCAke2tleX0gd2FzIG5vdCBwYXNzZWQuYCk7XG5cdFx0fVxuXG5cdFx0dGVzdGVyT2JqLnRlc3RFbGVtZW50cyA9IEpTT04ucGFyc2UgKHRlc3Rlck9iai50ZXN0RWxlbWVudHMpO1xuXHRcdHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMpO1xuXG5cdFx0bGV0IHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH0gPSB7fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycylcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGg6IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gXG5cdFx0XHRcdGV2YWwgKHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzW2tleV0pO1xuXG5cdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoO1xuXHRcdH1cblxuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IudGVzdGVyc1t0ZXN0ZXJPYmoudGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciAke3Rlc3Rlck9iai50ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGVzdGVyLnRlc3RNYXBzW3Rlc3Rlck9iai50ZXN0ZXJNYXBdO1xuXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlckFQSTogVGVzdGVyIG1hcCAke3Rlc3Rlck9iai50ZXN0ZXJNYXB9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0dGVzdE1hcC5wYWdlc1t0ZXN0ZXJPYmoucGFnZU5hbWVdID0ge1xuXHRcdFx0XHRcInRlc3RFbGVtZW50c1wiOiB7fSxcblx0XHRcdFx0XCJ0ZXN0UGF0aHNcIjoge31cblx0XHRcdH07XG5cdFx0dGVzdE1hcC5wYWdlc1t0ZXN0ZXJPYmoucGFnZU5hbWVdLnRlc3RFbGVtZW50cyA9IHRlc3Rlck9iai50ZXN0RWxlbWVudHM7XG5cdFx0dGVzdE1hcC5wYWdlc1t0ZXN0ZXJPYmoucGFnZU5hbWVdLnRlc3RQYXRocyA9IHRlc3RQYXRocztcblxuXHRcdHRlc3Rlci5maW5pc2hlZExvYWRpbmcgPSB0cnVlO1xuXG5cdFx0aWYgKHRlc3Rlci5vbkZpbmlzaGVkTG9hZGluZyAhPSBudWxsKVxuXHRcdFx0YXdhaXQgdGVzdGVyLm9uRmluaXNoZWRMb2FkaW5nICgpO1xuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRoZSB0ZXN0cyBmb3IgYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RzIChyZXE6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSByZXEuanNvbk9ialtcInRlc3Rlck5hbWVcIl07XG5cdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gcmVxLmpzb25PYmpbXCJ0ZXN0ZXJNYXBcIl07XG5cblx0XHRpZiAoKHRlc3Rlck5hbWUgPT0gbnVsbCkgfHwgKHRlc3Rlck1hcCA9PSBudWxsKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUZXN0ZXJBUEk6IE5vdCBhbGwgcmVxdWlyZWQganNvbiBvYmplY3RzIHdlcmUgcGFzc2VkLlwiKTtcblxuXHRcdGlmICgodGVzdGVyTmFtZSA9PT0gXCJcIikgfHwgKHRlc3Rlck1hcCA9PT0gXCJcIikpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGVzdGVyQVBJOiBOb3QgYWxsIHJlcXVpcmVkIGpzb24gb2JqZWN0cyB3ZXJlIHBhc3NlZC5cIik7XG5cblx0XHRsZXQgc2VydmVyOiBIb3RTZXJ2ZXIgPSAoPEhvdFNlcnZlcj50aGlzLmNvbm5lY3Rpb24pO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmIChzZXJ2ZXIuZXhlY3V0ZVRlc3RzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0YXdhaXQgc2VydmVyLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgdGVzdGVyTWFwKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3BvbmRzIHdpdGggdHJ1ZSB0byBoZWFydGJlYXQgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBoZWFydGJlYXQgKHJlcTogU2VydmVyUmVxdWVzdCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxufSIsIm1vZHVsZS5leHBvcnRzID0ge307IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zLCBJSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFNpdGUsIEhvdFNpdGVSb3V0ZSwgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5pbXBvcnQgeyBIb3QsIERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEFzc2V0IH0gZnJvbSBcIi4vSG90QXNzZXRcIjtcbmltcG9ydCB7IEhvdE1vZHVsZSB9IGZyb20gXCIuL0hvdE1vZHVsZVwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vLyBTZXJ2ZXIgc3R1ZmZcbmltcG9ydCB7IEhvdEFQSSwgRXZlbnRFeGVjdXRpb25UeXBlLCBBUEl0b0xvYWQgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIb3RFdmVudE1ldGhvZCwgU2VydmVyUmVxdWVzdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIsIEhvdFNlcnZlclR5cGUgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuXG4vLyBUZXN0aW5nIHN0dWZmXG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zLCBJSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdFN0b3AgfSBmcm9tIFwiLi9Ib3RUZXN0U3RvcFwiO1xuaW1wb3J0IHsgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3REZXN0aW5hdGlvblwiO1xuLy9pbXBvcnQgeyBIb3RUZXN0ZXJNb2NoYSB9IGZyb20gXCIuL0hvdFRlc3Rlck1vY2hhXCI7XG4vL2ltcG9ydCB7IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gfSBmcm9tIFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90VGVzdERlc3RpbmF0aW9uXCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RQYWdlXCI7XG5cbkhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4vLyBDYW4ndCBleHBvcnQgaW50ZXJmYWNlcyBmcm9tIGhlcmUgOihcblxuZXhwb3J0IHtcbiAgICBIb3RTdGFxLFxuICAgIEhvdCxcbiAgICBIb3RNb2R1bGUsXG4gICAgSG90QXNzZXQsXG4gICAgRGV2ZWxvcGVyTW9kZSxcbiAgICBIb3RDb21wb25lbnQsXG4gICAgSG90QVBJLFxuICAgIEV2ZW50RXhlY3V0aW9uVHlwZSxcbiAgICBIb3RGaWxlLFxuICAgIEhvdExvZyxcbiAgICBIb3RMb2dMZXZlbCxcbiAgICBIb3RQYWdlLFxuICAgIEhvdFJvdXRlLFxuICAgIEhvdFJvdXRlTWV0aG9kLFxuICAgIEhvdEV2ZW50TWV0aG9kLFxuICAgIFNlcnZlclJlcXVlc3QsXG4gICAgSG90U2VydmVyLFxuICAgIEhvdFNlcnZlclR5cGUsXG4gICAgSG90Q2xpZW50LFxuICAgIEhvdFRlc3RlcixcbiAgICBIb3RUZXN0ZXJBUEksXG4gICAgSG90VGVzdE1hcCxcbiAgICBIb3RUZXN0RGVzdGluYXRpb24sXG4gICAgSG90VGVzdEVsZW1lbnQsXG4gICAgSG90VGVzdEVsZW1lbnRPcHRpb25zLFxuICAgIEhvdFRlc3REcml2ZXJcbn07Il0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJzZWxmIiwiRm9ybURhdGEiLCJ3aW5kb3ciLCJhc3NpZ24iLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiaW5pdCIsImNvbnZlcnRlciIsImRlZmF1bHRBdHRyaWJ1dGVzIiwic2V0IiwidmFsdWUiLCJhdHRyaWJ1dGVzIiwiZG9jdW1lbnQiLCJleHBpcmVzIiwiRGF0ZSIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInN0cmluZ2lmaWVkQXR0cmlidXRlcyIsImF0dHJpYnV0ZU5hbWUiLCJzcGxpdCIsImNvb2tpZSIsIndyaXRlIiwiT2JqZWN0IiwiY3JlYXRlIiwiZ2V0IiwiY29va2llcyIsImphciIsInBhcnRzIiwic2xpY2UiLCJqb2luIiwiZm91bmRLZXkiLCJyZWFkIiwiZSIsInJlbW92ZSIsIndpdGhBdHRyaWJ1dGVzIiwidGhpcyIsIndpdGhDb252ZXJ0ZXIiLCJmcmVlemUiLCJwYXRoIiwiZmFjdG9yeSIsImdsb2JhbCIsIkVycm9yIiwiZ2V0R2xvYmFsIiwiZmV0Y2giLCJiaW5kIiwiSGVhZGVycyIsIlJlcXVlc3QiLCJSZXNwb25zZSIsIkRldmVsb3Blck1vZGUiLCJIb3QiLCJzdGF0aWMiLCJmaWxlIiwiYXJncyIsIkhvdFN0YXEiLCJpc1dlYiIsImxvd2VyRmlsZSIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImVjaG8iLCJnZXRGaWxlIiwicGFyZW50T2JqZWN0Iiwib3V0cHV0IiwiZyIsImV2YWwiLCJhcHBseSIsIm1vZHVsZU5hbWUiLCJmb3VuZE1vZHVsZSIsIkN1cnJlbnRQYWdlIiwicHJvY2Vzc29yIiwiZ2V0TW9kdWxlIiwibmV3TW9kdWxlIiwiRnVuY3Rpb24iLCJsb2FkSFRNTCIsImFkZE1vZHVsZSIsImZpbGVOYW1lIiwidGVtcEZpbGUiLCJwYWdlIiwiY29udGVudCIsInByb2Nlc3MiLCJIb3RGaWxlIiwibmFtZSIsInVybCIsImxvY2FsRmlsZSIsImNoZWNrRmlsZSIsImxvYWQiLCJyb3V0ZSIsImRhdGEiLCJodHRwTWV0aG9kIiwiSG90RXZlbnRNZXRob2QiLCJQT1NUIiwiZmlsZXMiLCJyZXN1bHQiLCJhcGkiLCJtYWtlQ2FsbCIsImpzb25SZXF1ZXN0IiwiR0VUIiwiZmV0Y2hPYmoiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwianNvbiIsImV4IiwibWVzc2FnZSIsInJlcXVlc3RJbml0IiwiT3V0cHV0IiwiaUlkeCIsIkNTUyIsImNzc0ZpbGUiLCJjc3NPdXQiLCJjc3NTdHIiLCJKU0ZpbGVzIiwianNGaWxlIiwianNGaWxlT3V0IiwianNGaWxlU3RyIiwiSlNTY3JpcHRzIiwianNTY3JpcHQiLCJqc1NjcmlwdE91dCIsImpzU2NyaXB0c1N0ciIsIkFyZ3VtZW50cyIsIkhvdFRlc3RFbGVtZW50IiwiTW9kZSIsIlByb2R1Y3Rpb24iLCJBUEkiLCJUZXN0ZXJBUEkiLCJEYXRhIiwiQ29va2llcyIsIlB1YmxpY0tleXMiLCJFdmVudEV4ZWN1dGlvblR5cGUiLCJjb25zdHJ1Y3RvciIsImJhc2VVcmwiLCJjb25uZWN0aW9uIiwiZGIiLCJkZXNjcmlwdGlvbiIsImNyZWF0ZUZ1bmN0aW9ucyIsImV4ZWN1dGVFdmVudHNVc2luZyIsIkhvdFJvdXRlIiwiYXV0aENyZWRlbnRpYWxzIiwidXNlckF1dGgiLCJyb3V0ZXMiLCJvblByZVJlZ2lzdGVyIiwib25Qb3N0UmVnaXN0ZXIiLCJzZXREQlNjaGVtYSIsInNjaGVtYSIsImdldERCIiwiZ2V0REJTY2hlbWEiLCJhZGRSb3V0ZSIsInJvdXRlTWV0aG9kIiwiZXhlY3V0ZUZ1bmN0aW9uIiwicm91dGVOYW1lIiwiYWRkTWV0aG9kIiwiSG90Um91dGVNZXRob2QiLCJuZXdSb3V0ZSIsIm1ldGhvZHMiLCJjdXJyZW50Um91dGUiLCJuZXdSb3V0ZU1ldGhvZCIsInR5cGUiLCJyb3V0ZVN0ciIsImdldFJvdXRlVXJsIiwiYXV0aENyZWRlbnRpYWwiLCJyZWdpc3RlclJvdXRlIiwiSG90U2VydmVyIiwicmVnaXN0ZXJSb3V0ZXMiLCJodHRwTWV0aG9kU3RyIiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJrZXlzIiwiZm9ybURhdGEiLCJhcHBlbmQiLCJtZXRob2QiLCJib2R5IiwianNvblJlcyIsImhlYWRlcnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInRoZW4iLCJqc29uT2JqIiwiY2F0Y2giLCJyZWFzb24iLCJlc2NhcGVkQ29udGVudCIsImZpbGVVcmwiLCJmaWxlQ29udGVudCIsIlJlZ0V4cCIsInRlc3RlckFQSSIsIkhvdFNlcnZlclR5cGUiLCJIVFRQIiwibG9nZ2VyIiwiY29weSIsImh0bWxFbGVtZW50cyIsInRhZyIsImVsZW1lbnRPcHRpb25zIiwidW5kZWZpbmVkIiwib2JzZXJ2ZWRBdHRyaWJ1dGVzIiwiaW5uZXIiLCJldmVudHMiLCJvbkNyZWF0ZWQiLCJlbGVtZW50IiwidGhyb3dBbGxFcnJvcnMiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsInRleHQiLCJsb2FkVXJsIiwiaHR0cEdldCIsImxvYWRMb2NhbEZpbGUiLCJmcyIsInJlYWRGaWxlIiwiZXJyIiwidG9TdHJpbmciLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwiZXhlYyIsInByZXZpb3VzSW5kZXgiLCJzdGFydCIsImluZGV4IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJzdGFydENoYXJzIiwiZW5kQ2hhcnMiLCJ0cmlnZ2VyQ2hhciIsInBvcyIsInN0YXJ0VHJpZ2dlclBvcyIsIm5lc3RlZENvdW50ZXIiLCJycG9zIiwibGFzdEluZGV4T2YiLCJlcG9zIiwidGVtcGVwb3MiLCJ0aGlzQ29udGVudCIsInBhcnNlck9wdGlvbnMiLCJvdXRwdXRDb21tYW5kcyIsImFsbG93U3RyaW5naWZ5IiwiU1RSSU5HSUZZX1NUQVJUIiwiU1RSSU5HSUZZX0VORCIsInByb2Nlc3NDb250ZW50IiwicmVnZXhGb3VuZCIsIm9mZkNvbnRlbnQiLCJ0ZW1wT3V0cHV0IiwicHJvY2Vzc05lc3RlZENvbnRlbnQiLCJyZWdleEZvdW5kMiIsIm9mZkNvbnRlbnQzIiwidGVtcE91dHB1dDIiLCJvdXQiLCJ0ZW1wT3V0cHV0MyIsInRlbXBPdXRwdXQ0IiwiRGV2ZWxvcG1lbnQiLCJmb3VuZFN0ciIsInBhcnNlIiwiY3JlYXRlVGVzdEVsZW1lbnQiLCJmb3VuZFN0cjIiLCJ0ZXN0RWxtIiwib2JqIiwiQXJyYXkiLCJ0ZXN0RWxlbWVudHMiLCJmdW5jIiwidGVtcE91dHB1dDUiLCJtb2RlIiwicHVibGljS2V5cyIsImdldEFQSSIsImdldFRlc3RlckFQSSIsInBhcnNlQ29udGVudCIsInJldHVybmVkT3V0cHV0IiwiZXhlY3V0aW9uQ29udGVudCIsIm5ld1ZhciIsIm5ld1ZhclZhbHVlIiwiY29udGVudE5hbWUiLCJTeW50YXhFcnJvciIsImhvdCIsImZpbmFsT3V0cHV0IiwiSG90TG9nTGV2ZWwiLCJsb2dMZXZlbCIsIkFsbCIsImxldmVsIiwiSW5mbyIsIldhcm5pbmciLCJWZXJib3NlIiwiTm9uZSIsImxvZyIsImVycm9yIiwid2FybmluZyIsImluZm8iLCJ2ZXJib3NlIiwiY29uc29sZSIsIndhcm4iLCJtc2ciLCJzdGFjayIsImltcG9ydCIsImh0bWwiLCJjc3MiLCJqcyIsImNvbXBvbmVudExpYnJhcnkiLCJjb21wb25lbnRzIiwib3V0cHV0Q1NTIiwiZWNob091dCIsIm91dHB1dEFzc2V0IiwiYXNzZXQiLCJvdXRwdXRKUyIsImFzc2V0TmFtZSIsImluY2x1ZGUiLCJsb2FkSG90RmlsZXMiLCJvdXRwdXRDb21wb25lbnRzIiwiYXNzZXRUeXBlIiwiYXNzZXRzIiwiY2FsbGJhY2siLCJsb2FkQXNzZXQiLCJIb3RBc3NldCIsInRlc3Rlck5hbWUiLCJ0ZXN0ZXJNYXAiLCJ0ZXN0UGF0aHMiLCJhZGRGaWxlIiwicHVzaCIsImFkZFRlc3RFbGVtZW50IiwiZWxtIiwiZ2V0VGVzdEVsZW1lbnQiLCJjcmVhdGVUZXN0UGF0aCIsInBhdGhOYW1lIiwiZHJpdmVyRnVuYyIsIm9uUmVnaXN0ZXIiLCJvbkF1dGhvcml6ZVVzZXIiLCJ2ZXJzaW9uIiwicHJlZml4IiwiZXJyb3JzIiwiY3JlYXRlRXJyb3IiLCJ0ZXN0Q2FzZXMiLCJnZXRNZXRob2QiLCJmb3VuZE1ldGhvZCIsInJlcSIsIndzU29ja2V0IiwiYXV0aG9yaXplZFZhbHVlIiwicXVlcnlPYmoiLCJvbkV4ZWN1dGUiLCJvblNlcnZlckF1dGhvcml6ZSIsInJldHVybnMiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJvblNlcnZlckV4ZWN1dGUiLCJvbkNsaWVudEV4ZWN1dGUiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJ0ZXN0Q2FzZU5hbWUiLCJhZGRUZXN0Q2FzZSIsIm5ld1Rlc3RDYXNlIiwidGVzdENhc2VGdW5jdGlvbiIsInRlc3RDYXNlSWQiLCJ0ZXN0Q2FzZSIsIm1ldGhvZE5hbWUiLCJzZXJ2ZXJUeXBlIiwibGlzdGVuQWRkcmVzcyIsInBvcnRzIiwiaHR0cCIsImh0dHBzIiwic3NsIiwiY2VydCIsImNhIiwicmVkaXJlY3RIVFRQdG9IVFRQUyIsInNlY3JldHMiLCJzZXRBUEkiLCJIb3RUZXN0ZXJNb2NoYSIsIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW0iLCJIb3RUZXN0U2VsZW5pdW1Ecml2ZXIiLCJIb3RMb2ciLCJzdGFydERlbGF5IiwicGFnZXMiLCJtb2R1bGVzIiwiaG90U2l0ZSIsImFwaUNvbnRlbnQiLCJ0ZXN0ZXJBcGlDb250ZW50IiwicGFnZUNvbnRlbnQiLCJ0ZXN0ZXJzIiwib2JqV2l0aFBhcmFtIiwicmVxdWlyZWQiLCJ0aHJvd0V4Y2VwdGlvbiIsImRlZmF1bHRWYWx1ZSIsImVyclR5cGUiLCJyZWRpcmVjdFRvVXJsIiwibG9jYXRpb24iLCJocmVmIiwibnVtTWlsbGlzZWNvbmRzIiwic2V0VGltZW91dCIsImFkZFBhZ2UiLCJnZXRQYWdlIiwicGFnZU5hbWUiLCJ0aHJvd0V4IiwidGVtcE5hbWUiLCJzdWJzdHJpbmciLCJjb250ZXh0IiwidmFsIiwiYXJ5QXJncyIsInByb3RvdHlwZSIsImNhbGwiLCJhZGRDb21wb25lbnQiLCJDb21wb25lbnRUeXBlIiwidGVtcEFwaSIsInRlbXBDb21wb25lbnRPYmoiLCJjb21wb25lbnRUeXBlIiwicmVnaXN0ZXJDb21wb25lbnQiLCJzdHIiLCJ0ZW1wU3RyIiwicGFyc2VkWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicXVlcnlTZWxlY3RvciIsImRvY3VtZW50RWxlbWVudCIsImNoaWxkcmVuIiwidGFnTmFtZSIsImZpeGVkU3RyIiwicGFyZW50IiwiZm91bmRQYXJlbnQiLCJodG1sSGFuZGxlciIsImZpeEhUTUwiLCJuZXdET00iLCJyZXN1bHRzIiwiY2hpbGQiLCJhcHBlbmRDaGlsZCIsImhvdHNpdGVOYW1lIiwiaXNWYWxpZCIsInZhbGlkRm9yTmV3UGFja2FnZXMiLCJob3RzaXRlIiwicGFyYW1zIiwicHJldlZhbHVlIiwicHJvY2Vzc0hvdFNpdGUiLCJ0ZXN0ZXIiLCJjaGVja0hvdFNpdGVOYW1lIiwiSG90UGFnZSIsIm1hcE5hbWUiLCJ0ZXN0TWFwIiwibWFwIiwidGVzdE1hcHMiLCJIb3RUZXN0TWFwIiwiZGVzdGluYXRpb25zIiwiZGVzdCIsIkhvdFRlc3REZXN0aW5hdGlvbiIsImtleTIiLCJkZXN0aW5hdGlvbk9yZGVyIiwiYXBpcyIsImNvbXBvbmVudCIsImNvbXBvbmVudFVybCIsIkNvbXBvbmVudENsYXNzIiwiZGlzYWJsZUZpbGVMb2FkaW5nIiwiYWRkVGVzdGVyIiwibG9hZEhvdFNpdGUiLCJqc29uU3RyIiwiZXh0IiwicHBhdGgiLCJleHRuYW1lIiwibm9ybWFsaXplIiwiSG90SU8iLCJyZWFkVGV4dEZpbGUiLCJ5YW1sIiwiaG90c2l0ZVBhdGgiLCJzYXZlSG90U2l0ZSIsImhvdHNpdGVTdHIiLCJ3cml0ZVRleHRGaWxlIiwiZm9yY2VDb250ZW50TG9hZGluZyIsImxvYWRVcmxDb250ZW50IiwibmV3RmlsZSIsImxvYWRDb250ZW50IiwiZ2VuZXJhdGVDb250ZW50Iiwicm91dGVLZXkiLCJqc1NyY1BhdGgiLCJwYXNzQXJncyIsImFwaVNjcmlwdHMiLCJhcGlDb2RlIiwic2VydmVyIiwiZ2xvYmFsQXBpIiwic2VuZEpTQ29udGVudCIsImpzYXBpIiwibGlicmFyeU5hbWUiLCJhcGlOYW1lIiwidGVtcEFQSUNvbnRlbnQiLCJqc2FwaXBhdGgiLCJzZWNyZXQiLCJzZXJ2ZXJDb25uIiwicGFzc1NlY3JldEZyb21BUEkiLCJlbnYiLCJlbnZLZXkiLCJ0ZW1wQ29udGVudCIsImRldmVsb3Blck1vZGVTdHIiLCJ0ZXN0ZXJBUElTdHIiLCJ0ZXN0aW5nIiwid2ViIiwidGVzdGVyQVBJVXJsIiwibG9hZEZpbGVzIiwidGVzdGVyVXJsIiwidGVzdGVyTGF1bmNocGFkVXJsIiwibGF1bmNocGFkVXJsIiwic3RhcnREZWxheVN0ciIsImZpeENvbnRlbnQiLCJjcmVhdGVFeHByZXNzUm91dGVzIiwiZXhwcmVzc0FwcCIsInNlbmQiLCJnZXRXZWJUZXN0aW5nTWFwcyIsIm1hcHMiLCJnZXRBUElUZXN0aW5nTWFwcyIsImdldFJvdXRlS2V5RnJvbU5hbWUiLCJnZXRSb3V0ZUZyb21OYW1lIiwiZm91bmRSb3V0ZSIsImV4ZWN1dGVUZXN0cyIsImV4ZWN1dGUiLCJleGVjdXRlQWxsV2ViVGVzdHMiLCJleGVjdXRlQWxsQVBJVGVzdHMiLCJsb2NhbEZpbGVwYXRoIiwib3B0aW9ucyIsInJlYWR5RnVuYyIsInJlYWR5U3RhdGUiLCJhZGRFdmVudExpc3RlbmVyIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbm5lckhUTUwiLCJ0bXBTY3JpcHRzIiwic2NyaXB0cyIsInMiLCJjcmVhdGVFbGVtZW50IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVzb2x2ZTIiLCJyZWplY3QyIiwib25sb2FkIiwiaGFzU3JjIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiaXNSZWFkeUZvclRlc3RpbmciLCJ3YWl0Iiwib25SZWFkeUZvclRlc3RpbmciLCJ0ZXN0ZXJBUElCYXNlVXJsIiwiY2xpZW50IiwiSG90Q2xpZW50IiwiSG90VGVzdGVyQVBJIiwib25SZWFkeSIsInNldHVwVGVzdGVycyIsInByb2Nlc3NVcmwiLCJzZXR1cENsaWVudFRlc3RlcnMiLCJ1c2VPdXRwdXQiLCJob3RTdGFxV2ViU3RhcnQiLCJjdXN0b21FbGVtZW50cyIsInByb2Nlc3NvckNvbXBvbmVudHMiLCJkZWZpbmUiLCJIVE1MRWxlbWVudCIsInN1cGVyIiwiY29tcG9uZW50SW5mbyIsImhvdENvbXBvbmVudCIsImhhbmRsZUF0dHJpYnV0ZXMiLCJhdHRyIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJhdHRyVGVtcE5hbWUiLCJvblByZU91dHB1dCIsIm91dHB1dHMiLCJvblBvc3RPdXRwdXQiLCJjb21wb25lbnRPdXRwdXRzIiwiaUtkeCIsImh0bWxTdHIiLCJhZGRGdW5jdGlvbnNUbyIsIm9uUGFyc2VkIiwib25GaXhIVE1MIiwiY2hpbGRyZW5Ub1JlYWRkIiwibmV3T2JqIiwib25QYXJzZURPTSIsInRocm93RXJyIiwicmVwbGFjZVdpdGgiLCJjbGljayIsImV2ZW50Iiwib2JqZWN0RnVuY3Rpb25zIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsIm9iakZ1bmMiLCJpc05ld0Z1bmN0aW9uIiwiSG90Q29tcG9uZW50Iiwia2VlcENvbnRleHQiLCJvblByZVBsYWNlIiwiY29tcEh0bWxFbGVtZW50MiIsIm9uUGFyZW50UGxhY2UiLCJjbG9zZXN0U2VsZWN0b3IiLCJwYXJlbnRFbG0iLCJmb3VuZE5vZGUiLCJwYXJlbnRFbGVtZW50IiwiZG9jdW1lbnRTZWxlY3RvciIsInBsYWNlRWxtSW5QYXJlbnQiLCJwYXJlbnROb2RlVG9DaGVjayIsInBsYWNlSGVyZVBhcmVudCIsImNoaWxkVG9QbGFjZSIsInBhcmVudE5vZGVDaGVja0NvdW50ZXIiLCJIVE1MSHRtbEVsZW1lbnQiLCJwbGFjZUhlcmVBcnJheSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJwbGFjZUhlcmUiLCJwbGFjZUhlcmVBdHRyQXJyYXkiLCJwbGFjZWRDaGlsZCIsInBsYWNlSGVyZVBhcmVudEF0dHIiLCJvblBvc3RQbGFjZSIsInRlbXAiLCJjb21wb25lbnROYW1lIiwiaWQiLCJsb29zZVBhcnNlRnJvbVN0cmluZyIsInBhcnNlciIsInhkb20iLCJoZG9tIiwiZWxlbSIsImZyb20iLCJvdXRlckhUTUwiLCJob3RzdGFxRWxtcyIsIkhvdFN0YXFXZWIiLCJob3RzdGFxRWxtIiwiZ2V0QXR0ciIsImF0dHJOYW1lcyIsImxvYWRQYWdlIiwibG9nZ2luZ0xldmVsIiwicm91dGVyIiwiYXBpTGlicmFyeSIsImFwaVVybCIsInRlc3RlckFwaUJhc2VVcmwiLCJkb250UmV1c2VQcm9jZXNzb3IiLCJwYXNzUmF3VXJsIiwiaHRtbFNvdXJjZSIsInJvdXRlck1hbmFnZXIiLCJyb3V0ZXJXaWxkY2FyZHMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJwYXJzZUludCIsImhzdHFiYXNlcmVkaXJlY3QiLCJkZWNvZGVVUkkiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwiaG90c3RhcUVycm9ycyIsImhvdHN0YXFFcnJvckVsbSIsImVycm9yU3RhdHVzIiwidW5zdXBwb3J0ZWRCcm93c2VyIiwiZXhlY3V0ZUVycm9yIiwiaG90c3RhcVJvdXRlckVsbXMiLCJob3RzdGFxUm91dGVyRWxtIiwicm91dGVyTmFtZSIsInNlcnZlTG9jYWxseSIsImlKZHgiLCJjaGlsZE5vZGVzIiwicm91dGVyRWxtIiwicm91dGVyUGF0aCIsInJlZGlyZWN0IiwiYmFzZVJlZGlyZWN0IiwiYmFzZSIsInJvdXRlclNyYyIsInNyYyIsImNoZWNrUGF0aCIsInBhdGhuYW1lIiwiZ290b1BhdGgiLCJsb3dlclNlcnZlTG9jYWxseSIsImxhc3RTbGFzaFBvcyIsInJvdXRlV2lsZGNhcmQiLCJ0ZW1wUm91dGVXaWxkY2FyZCIsInNlYXJjaFBhcmFtcyIsIm1vZGlmaWVkU2VhcmNoUGFyYW1zIiwiZW5jb2RlVVJJIiwiaGFzSHRtbFNvdXJjZSIsImh0bWxTb3VyY2VDaGVjayIsInRlbXBNb2RlIiwicGFyZW50TGliIiwibmV3QVBJIiwiZGlzcGxheVVybCIsImRpc3BsYXlDb250ZW50IiwiZGVzdGluYXRpb24iLCJhdXRvU3RhcnQiLCJjb21tYW5kRGVsYXkiLCJwZXJzaXN0ZW50RGF0YSIsInBhcnNlVGVzdE9iamVjdCIsIndpbGRjYXJkIiwic2VsZWN0b3IiLCJwcmludCIsInN0ZG91dCIsInByaW50bG4iLCJkZXN0cm95IiwiYXNzZXJ0IiwiZXJyb3JNZXNzYWdlIiwibXVzdEJlVmlzaWJsZSIsImlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IiLCJIb3RUZXN0ZXIiLCJkcml2ZXIiLCJ0aW1lb3V0IiwiZmluaXNoZWRMb2FkaW5nIiwiaGFzQmVlblNldHVwIiwiaGFzQmVlbkRlc3Ryb3llZCIsInNldHVwIiwiaXNXZWJSb3V0ZSIsImRlc3RpbmF0aW9uS2V5Iiwid2FpdEZvckRhdGEiLCJnZXRUZXN0UGFnZSIsImdldFRlc3RQYXRoIiwidGVzdERlc3QiLCJuZXdEZXN0aW5hdGlvbiIsInBhdGhzIiwic3RycyIsImdldFR5cGUiLCJ0eXBlU3RyIiwidHlwZURlbGltaXRlciIsInR5cGVWYWx1ZSIsInRyaW0iLCJuZXdQYXRoU3RyIiwibmV3UGF0aCIsImNtZCIsImV4ZWN1dGVUZXN0QVBJUGF0aCIsInRlc3ROYW1lIiwic2tpcEV2ZW50Q2FsbHMiLCJjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSIsInJ1blRlc3RQYXRoIiwib25UZXN0QVBJUGF0aFN0YXJ0IiwidGVzdENhc2VPYmplY3QiLCJvblRlc3RBUElQYXRoRW5kIiwiZXhlY3V0ZVRlc3RBUElQYXRocyIsImV4ZWN1dGVUZXN0UGFnZVBhdGgiLCJzdG9wIiwidGVzdFBhdGhOYW1lIiwidGVzdFBhdGgiLCJvblRlc3RQYWdlUGF0aFN0YXJ0Iiwib25UZXN0UGFnZVBhdGhFbmQiLCJleGVjdXRlQ29tbWFuZCIsImhhc0NtZCIsImlucHV0IiwiaGFzQXJndW1lbnRzIiwiZ2V0Q21kQXJncyIsIm1hdGNoZXMiLCJtYXRjaCIsInRlbXBNYXRjaCIsInNlbGVuaXVtVGVzdGVyIiwiY21kRnVuYyIsImNtZEFyZ3MiLCJuYXZpZ2F0ZVRvVXJsIiwidGVzdE9iamVjdCIsIndhaXRGb3JUZXN0RWxlbWVudCIsIm9uQ29tbWFuZCIsImV4ZWN1dGVUZXN0UGFnZVBhdGhzIiwiaW50ZXJwcmV0RGVzdGluYXRpb24iLCJleGVjdXRlRGVzdGluYXRpb24iLCJydW5UZXN0UGF0aHMiLCJvblRlc3RTdGFydCIsIm9uVGVzdEVuZCIsImhhc0V4ZWN1dGVkS2V5cyIsIm9yZGVyS2V5IiwiZXhlY3V0ZURlc3QiLCJIb3RBUEkiLCJwYWdlTG9hZGVkIiwiaGVhcnRiZWF0IiwicmVxdWVzdCIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsIm9uRmluaXNoZWRMb2FkaW5nIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImdsb2JhbFRoaXMiLCJIb3RNb2R1bGUiLCJTZXJ2ZXJSZXF1ZXN0IiwiSG90VGVzdERyaXZlciIsIkhvdFRlc3RFbGVtZW50T3B0aW9ucyJdLCJzb3VyY2VSb290IjoiIn0=
1
+ var HotStaqWeb;(()=>{var __webpack_modules__={230:t=>{t.exports="object"==typeof self?self.FormData:window.FormData},646:function(t){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,s){if("undefined"!=typeof document){"number"==typeof(s=t({},r,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var l in s)s[l]&&(i+="; "+l,!0!==s[l]&&(i+="="+s[l].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+i}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var s=e[o].split("="),i=s.slice(1).join("=");try{var l=decodeURIComponent(s[0]);if(r[l]=n.read(i,l),t===l)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},300:(t,e)=>{"use strict";var n=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==n)return n;throw new Error("unable to locate global object")}();t.exports=e=n.fetch,n.fetch&&(e.default=n.fetch.bind(n)),e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response},507:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Hot=e.DeveloperMode=void 0;const s=n(732),i=n(243),l=n(967),a=o(n(646)),u=o(n(300)),c=n(70);var h;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(h=e.DeveloperMode||(e.DeveloperMode={}));class p{static include(t,e=null){return r(this,void 0,void 0,(function*(){if(!0===i.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hstqserve=nahfam")}p.echo(yield p.getFile(t,e))}))}static includeJS(t,e=null,o=null){return r(this,void 0,void 0,(function*(){const r=yield p.getFile(t,e);return!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g),eval.apply(o,[r])}))}static import(t,e=null,o=null){return r(this,void 0,void 0,(function*(){let r=p.CurrentPage.processor.getModule(t);if(null!=r)return r;const s=`./hotstaq_modules/${t}/index.js`,l=yield p.getFile(s,e);!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g);let a=new Function(l).apply(o);return null!=a.loadHTML&&(yield a.loadHTML()),p.CurrentPage.processor.addModule(t,a),a}))}static runFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=p.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);p.echo(r)}))}static getFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=null;"string"==typeof t?(n=new s.HotFile,n.name=t,!0===i.HotStaq.isWeb?n.url=t:n.localFile=t):n=t;let r=p.CurrentPage.processor.getFile(n.name,!1);return null!=r&&(n=r),yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n=c.HotEventMethod.POST,o={}){return r(this,void 0,void 0,(function*(){let r=null;if(null==p.CurrentPage)throw new Error("Current page is null!");if(null==p.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==p.CurrentPage.processor.api)throw new Error("Current page's processor api is null! Did you forget to set the API name or URL?");return null!=p.CurrentPage.processor.api&&(r=yield p.CurrentPage.processor.api.makeCall(t,e,n,o)),r}))}static getJSON(t){return r(this,void 0,void 0,(function*(){return p.jsonRequest(t,null,c.HotEventMethod.GET)}))}static jsonRequest(t,e=null,n=c.HotEventMethod.POST){return r(this,void 0,void 0,(function*(){try{let r={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};n===c.HotEventMethod.POST&&(r.body=JSON.stringify(e));let o=yield(0,u.default)(t,r);if(!1===o.ok)throw new Error(`${o.status}: ${o.statusText}`);return yield o.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e){return r(this,void 0,void 0,(function*(){return yield(0,u.default)(t,e)}))}static echo(t){p.Output+=t}static displayCSS(){for(let t=0;t<p.CSS.length;t++){let e=p.CSS[t],n=p.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),p.echo(n)}}static displayJSFiles(){for(let t=0;t<p.JSFiles.length;t++){let e=p.JSFiles[t],n=p.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),p.echo(n)}}static displayJSScripts(){for(let t=0;t<p.JSScripts.length;t++){let e=p.JSScripts[t],n=p.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),p.echo(n)}}}e.Hot=p,p.CurrentPage=null,p.Arguments=null,p.DeveloperMode=h,p.HotTestElement=l.HotTestElement,p.Mode=h.Production,p.API=null,p.TesterAPI=null,p.Output="",p.Data={},p.Cookies=a.default,p.PublicKeys={},p.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',p.CSS=[],p.JSFiles=[],p.JSScripts=[],p.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',p.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},233:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const s=o(n(300)),i=o(n(230)),l=n(810),a=n(761),u=n(70);var c;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(c=e.EventExecutionType||(e.EventExecutionType={})),e.HotAPI=class{constructor(t,e,n=null){if(null==e)throw new Error(`No server attached to api with baseUrl: ${t}`);this.connection=e,this.description="",this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=c.HotRoute,this.db=n,this.authCredentials=null,this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";if("string"==typeof t?(r=t,null==this.routes[r]&&(this.routes[r]=new a.HotRoute(this.connection,r)),"string"==typeof e?this.routes[r].addMethod(new u.HotRouteMethod(this.routes[r],e,n)):this.routes[r].addMethod(e)):(r=t.route,this.routes[t.route]=t),this.routes[r].connection=this.connection,!0===this.createFunctions){let t=this[r];null==t&&(t={});for(let e=0;e<this.routes[r].methods.length;e++){let n=this.routes[r],o=this.routes[r].methods[e];t[o.name]=(t,e)=>{let r=o.type,s=o.getRouteUrl(),i=null;if(null!=this.authCredentials&&(i=this.authCredentials),null!=o.authCredentials?i=o.authCredentials:null!=o.route.authCredentials&&(i=o.route.authCredentials),null==i&&"undefined"!=typeof Hot&&null!=Hot&&null!=Hot.API&&null!=Hot.API[n.route]&&null!=Hot.API[n.route].authCredentials&&(i=Hot.API[n.route].authCredentials),null!=i)for(let e in i){let n=i[e];null==t[e]&&(t[e]=n)}let l=[s,t,r,e];return this.makeCall.apply(this,l)}}this[r]=t}}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof l.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n=u.HotEventMethod.POST,o={}){return r(this,void 0,void 0,(function*(){let l=this.baseUrl;const a=n.toUpperCase();if("/"===l[l.length-1]&&(l=l.substr(0,l.length-1)),"/"!==t[0]&&(l+="/"),l+=t,Object.keys(o).length>0){if("POST"!==a)throw new Error("To upload files, you must set the httpMethod to POST.");const r=new i.default;for(let t in o)r.append(t,o[t]);let u=yield(0,s.default)(l,{method:"POST",body:r}),c=yield u.json();return null==e.hotstaq&&(e.hotstaq={}),null==e.hotstaq.uploads&&(e.hotstaq.uploads={}),e.hotstaq.uploads.uploadId=c.hotstaq.uploads.uploadId,yield this.makeCall(t,e,n)}let u={method:n,headers:{Accept:"application/json","Content-Type":"application/json"}};return"GET"!==a&&"HEAD"!==a&&(u.body=JSON.stringify(e)),new Promise(((t,e)=>{(0,s.default)(l,u).then((e=>r(this,void 0,void 0,(function*(){e.json().then((e=>{t(e)})).catch((t=>{throw new Error(`${l}: ${t.message}`)}))})))).catch((t=>{throw new Error(`${l}: ${t.message}`)}))}))}))}}},316:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotAsset=void 0,e.HotAsset=class{constructor(t,e=""){this.type=t,this.name=e,this.path="",this.content=""}load(){}output(){if(null==this.path&&null==this.content)throw new Error(`HotAsset ${this.name} of type ${this.type} does not have a path or content set!`);let t="";if(null!=this.path&&""!==this.path&&("js"===this.type&&(t=`<script type = "text/javascript" src = "${this.path}"><\/script>`),"css"===this.type&&(t=`<link href = "${this.path}" rel = "stylesheet" />`),"html"===this.type||"component"===this.type)){if(""===this.name)throw new Error("Loading an HTML or component asset requires a name to be set!");this.path,t={name:this.name,url:this.path}}if(null!=this.content&&""!==this.content){if("js"===this.type)throw new Error("Loading JS assets using content is not supported yet!");if("css"===this.type)throw new Error("Loading CSS assets using content is not supported yet!");if("html"===this.type){if(""===this.name)throw new Error("Loading an HTML asset requires a name to be set!");let e=JSON.stringify(this.content),n=this.path,r="";e=e.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),e=e.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=e,t={name:this.name,url:n,content:e}}}return t}}},957:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(810);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},260:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const r=n(243);e.HotComponent=class{constructor(t,e=null){t instanceof r.HotStaq||null==t?(this.processor=t,this.htmlElements=[],this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.observedAttributes=[],this.type="",this.value=null,this.inner=null,this.events={}):(this.processor=t.processor,this.htmlElements=t.htmlElements||[],this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.observedAttributes=t.observedAttributes||[],this.type=t.type||"",this.value=t.value||null,this.inner=t.inner||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return t}}},732:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const a=s(n(351)),u=l(n(300)),c=n(507);class h{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,u.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield h.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{a.readFile(this.localFile,((e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)}))}))}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,s=2){let i=e.exec(t),l=0,a="";for(;null!=i;){let u=i.index-o,c=e.lastIndex+s,h=t.substr(l,u-l);l=c,a+=r(h),a+=n(i[0]),i=e.exec(t)}return a+=r(t.substr(l)),a}static processNestedContent(t,e,n,r,o,s,i=2,l=1){let a=t.indexOf(e),u=0,c=t.indexOf(r,a),h="";for(;a>-1;){let p=t.indexOf(n,a),d=0;if(""!==r){let e=t.lastIndexOf(r,p-l);for(;e>-1&&e!==c;)e=t.lastIndexOf(r,e-l),d++}if(d>0){let r=t.indexOf(n,p+l),o=r;for(;r>-1&&d>0&&!(o<0)&&!(t.lastIndexOf(e,o-l)>r);)r=o,o=t.indexOf(n,r+l),d--;p=r}h+=s(t.substr(u,a-u)),h+=o(t.substr(a+i,p-(a+i))),a=t.indexOf(e,p+l),c=t.indexOf(r,a),u=p+l}return h+=s(t.substr(u)),h}static parseContent(t,e,n=null){null==n&&(n={outputCommands:!0,allowStringify:!0});let r="JSON.stringify (",o=")";return!1===n.allowStringify&&(r="",o=""),h.processContent(t,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),(t=>`${t=t.substr(2)}`),(t=>{if(""===t)return"";let s=h.processNestedContent(t,"!{","}","{",(t=>`*&&%*%@#@!${t}*&!#%@!@*!`),(t=>t)),i=h.processNestedContent(s,"STR{","}","{",(t=>{let s="";return s=!0===n.outputCommands?`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${e});*&!#%@!@*!`:`*&&%*%@#@!${r}${t}${o}, ${e});*&!#%@!@*!`,s}),(t=>t),4,1),l=h.processNestedContent(i,"${","}","{",(t=>{let r="";var o;return!0===n.outputCommands?(r=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo (\`\\\${${o=t,o.replace(/[`]/g,"\\`")}}\`);}*&!#%@!@*!`,!0===e&&(r=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`)):r=`*&&%*%@#@!${t}*&!#%@!@*!`,r}),(t=>t)),a="";c.Hot.Mode===c.DeveloperMode.Production&&(a=h.processNestedContent(l,"?(",")","(",(t=>""),(t=>t))),c.Hot.Mode===c.DeveloperMode.Development&&(a=h.processNestedContent(l,"?(",")","(",(t=>{let e="";try{JSON.parse(t),e=!0===n.allowStringify?JSON.stringify(t):`${t}`}catch(n){e=`${t}`}let r="";if(!0===n.outputCommands)r=`*&&%*%@#@!{\nconst testElm = createTestElement (${e});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`;else{let t=t=>{let e=null;try{let n=t;if("string"==typeof t&&(n=JSON.parse(t)),"string"==typeof n&&(e=new c.Hot.HotTestElement(n)),n instanceof Array&&(e=new c.Hot.HotTestElement(n[0],n[1],n[2])),null!=n.name&&(e=new c.Hot.HotTestElement(n)),null!=c.Hot.CurrentPage.testElements[e.name])throw new Error(`Test element ${e.name} already exists!`)}catch(e){throw new Error(`Error processing test element ${t} in ${c.Hot.CurrentPage.name}. Error: ${e.message}`)}return e};const n=t(e);r=`*&&%*%@#@!data-test-object-name = "${n.name}" data-test-object-func = "${n.func}" data-test-object-value = "${n.value}"*&!#%@!@*!`}return r}),(t=>t)));let u=h.processNestedContent(a,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",(t=>t),(t=>{let r="";r=!0===n.allowStringify?JSON.stringify(t):t;let o="";return o=!0===n.outputCommands?`echoOutput (${r}, ${e});\n`:r,o}),"*&&%*%@#@!".length,"*&!#%@!@*!".length);return u=u.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),u=u.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),u}),0)}process(t=null){return i(this,void 0,void 0,(function*(){let e=this.content;if(null!=t&&t instanceof Array)throw new Error(`In ${this.name}, the passed arguments received cannot be an array!`);c.Hot.Mode=this.page.processor.mode,c.Hot.Arguments=t,c.Hot.CurrentPage=this.page,c.Hot.PublicKeys=this.page.processor.publicKeys,c.Hot.API=this.page.getAPI(),c.Hot.TesterAPI=this.page.getTesterAPI();let n=h.parseContent(e,this.throwAllErrors),r=null;try{let e="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let n in t){let r="",o=t[n];r=`var ${n} = ${JSON.stringify(o)};\n`,e+=r}let o=this.name;""===o&&(o=this.localFile),""===o&&(o=this.url),e+='\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',e+=n,e+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(e);r=yield s.apply(this,[c.Hot,this])}catch(t){throw SyntaxError,t}c.Hot.Data=r.hot.Data;let o=r.output;return c.Hot.Output="",o}))}}e.HotFile=h},802:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(n=e.HotLogLevel||(e.HotLogLevel={})),e.HotLog=class{constructor(t=n.All){this.logLevel=t}static parse(t){let e=n.All;return"info"===t&&(e=n.Info),"warning"===t&&(e=n.Warning),"error"===t&&(e=n.Error),"verbose"===t&&(e=n.Verbose),"all"===t&&(e=n.All),"none"===t&&(e=n.None),e}log(t,e){this.logLevel===n.Verbose&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t!==n.Info&&t!==n.Verbose||this.info(e)),this.logLevel===n.All&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t===n.Info&&this.info(e)),this.logLevel===n.Error&&t===n.Error&&this.error(e),this.logLevel===n.Warning&&t===n.Warning&&this.warning(e),this.logLevel===n.Info&&t===n.Info&&this.info(e)}verbose(t){this.logLevel===n.Verbose&&("string"==typeof t?console.info(t):console.info(t()))}info(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Info||console.info(t)}warning(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Warning||console.warn(t)}error(t){if(this.logLevel===n.All||this.logLevel===n.Verbose||this.logLevel===n.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},202:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotModule=void 0;const o=n(507),s=n(316);e.HotModule=class{constructor(t){this.name=t,this.import=[],this.html=[],this.css=[],this.js=[],this.componentLibrary="",this.components=[]}outputCSS(t=!0){if(null==this.css)return;let e="";return this.outputAsset("css",this.css,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}outputJS(t=!0){if(null==this.js)return;let e="";return this.outputAsset("js",this.js,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}output(t,e=null){return r(this,void 0,void 0,(function*(){yield o.Hot.include(`${this.name}/${t}.hott`,e)}))}loadHTML(){return r(this,void 0,void 0,(function*(){if(null==this.html)return;let t={};this.outputAsset("html",this.html,(e=>{const n=e.output();if("string"==typeof n)throw new Error("HTML assets cannot be outputted using only a string!");t[n.name]=n})),yield o.Hot.CurrentPage.processor.loadHotFiles(t)}))}outputComponents(t=!0){if(null==this.components)return"";if(this.components.length<1)return"";let e='<script type = "text/javascript">',n="";null!=this.componentLibrary&&""!==this.componentLibrary&&(n=`${this.componentLibrary}.`);for(let t=0;t<this.components.length;t++)e+=`Hot.CurrentPage.processor.addComponent (${n}${this.components[t]});\n`;return e+="<\/script>",!0===t&&o.Hot.echo(e),e}outputAsset(t,e=[],n){for(let r=0;r<e.length;r++){let o=e[r],i=null;i=new s.HotAsset(t),"string"==typeof o?i.path=o:(null!=o.name&&(i.name=o.name),null!=o.path&&(i.path=o.path),null!=o.content&&(i.content=o.content)),n(i)}}}},136:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(507),s=n(243);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="HotTesterMochaSelenium",this.testerMap="",this.route="",this.components={},this.files=[],this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"HotTesterMochaSelenium",this.testerMap=t.testerMap||"",this.route=t.route||"",this.components=t.components||{},this.files=t.files||[],this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},761:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(70);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.description="",this.version="v1",this.prefix="",this.authCredentials=null,this.methods=n,this.errors={not_authorized:o.createError("Not authorized."),no_server_execute_function:o.createError("Missing server execute function.")}}static createError(t){return{error:t}}addMethod(t,e=null,n=r.HotEventMethod.POST,o=null){"string"==typeof t&&(t=new r.HotRouteMethod(this,t,e,n,null,null,null,o)),t instanceof r.HotRouteMethod||(null==t.route&&(t.route=this),t=new r.HotRouteMethod(t)),this.methods.push(t)}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},70:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.ServerRequest=e.HotEventMethod=void 0;const r=n(507),o=n(761),s=n(810);var i;!function(t){t.GET="get",t.POST="post",t.FILE_UPLOAD="file_upload_then_post_json",t.WEBSOCKET_CLIENT_PUB_EVENT="websocket_client_pub_event"}(i=e.HotEventMethod||(e.HotEventMethod={})),e.ServerRequest=class{constructor(t=null){null==t&&(t={}),this.req=t.req||null,this.res=t.res||null,this.wsSocket=t.wsSocket||null,this.authorizedValue=t.authorizedValue||null,this.jsonObj=t.jsonObj||null,this.queryObj=t.queryObj||null,this.files=t.files||null}},e.HotRouteMethod=class{constructor(t,e="",n=null,l=i.POST,a=null,u=null,c=null,h=null){let p=null;if(t instanceof o.HotRoute)p=t;else{if(p=t.route,null!=t.type&&(l=t.type),null!=t.name&&(e=t.name),null!=t.description&&(this.description=t.description),null!=t.returns&&("string"==typeof t.returns?this.returns={type:"string",required:!0,description:t.returns}:this.returns=t.returns),null!=t.parameters){this.parameters={};for(let e in t.parameters){let n=t.parameters[e];"string"==typeof n?this.parameters[e]={type:n,required:!1,description:""}:(null==n.type&&(n.type="string"),this.parameters[e]=n)}}null!=t.authCredentials&&(c=t.authCredentials),null!=t.onServerExecute&&(n=t.onServerExecute),null!=t.onServerAuthorize&&(a=t.onServerAuthorize),null!=t.onRegister&&(u=t.onRegister),null!=t.onPostRegister&&(this.onPostRegister=t.onPostRegister),null!=t.onServerExecute&&(this.onServerExecute=t.onServerExecute),null!=t.onClientExecute&&(this.onClientExecute=t.onClientExecute),null!=t.testCases&&(h=t.testCases)}if(""===e)throw new Error("All route methods must have a name!");if(this.route=p,this.name=e,this.type=l,this.isRegistered=!1,this.executeSetup=!1,this.authCredentials=c,this.onServerAuthorize=a,this.onRegister=u,this.testCases={},this.route.connection.processor.mode===r.DeveloperMode.Development&&null!=h)if(h instanceof Array)for(let t=0;t<h.length;t++){let e=h[t];if("string"==typeof e){const n=e,r=h[t+1];this.addTestCase(n,r),t++}else this.addTestCase(e)}else for(let t in h){let e=h[t];this.addTestCase(e)}this.route.connection instanceof s.HotServer&&(this.onServerExecute=n)}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.route.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}getRouteUrl(){if(null==this.route)throw new Error(`Route method ${this.name} does not have a parent route!`);let t="/";return""!==this.route.version&&(t+=`${this.route.version}/`),""!==this.route.prefix&&(t+=`${this.route.prefix}/`),""!==this.route.route&&(t+=`${this.route.route}/`),t+=this.name,t}}},810:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(243);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets",t[t.Generate=2]="Generate",t[t.WebTesting=3]="WebTesting",t[t.APITesting=4]="APITesting"}(s=e.HotServerType||(e.HotServerType={})),e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:5e3,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:5e3,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},243:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const ppath=__importStar(__webpack_require__(606)),node_fetch_1=__importDefault(__webpack_require__(300)),validate_npm_package_name_1=__importDefault(__webpack_require__(651)),HotPage_1=__webpack_require__(136),HotFile_1=__webpack_require__(732),HotLog_1=__webpack_require__(802),Hot_1=__webpack_require__(507),HotAsset_1=__webpack_require__(316),HotClient_1=__webpack_require__(957),HotTesterAPI_1=__webpack_require__(414),HotTestMap_1=__webpack_require__(985),HotTestDestination_1=__webpack_require__(473),HotStaqRegisterComponent_1=__webpack_require__(638),HotStaqWebStart_1=__webpack_require__(23);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.All),this.startDelay=0,this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.modules=t.modules||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\t{\n\t\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\t\tnewHotClient.api = newapi;\n\t\t\t\tprocessor.api = newapi;\n\t\t\t}",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\tfor (let key in HotStaqWeb)\n\t\t\twindow[key] = HotStaqWeb[key];\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tasync function hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%start_delay%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tprocessor.logger.logLevel = %logging_level%;\n\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.publicKeys={},this.testers={}}static parseBoolean(t){return"true"===(t=t.toLowerCase())||"false"!==t&&("yes"===t||"no"!==t&&"yep"===t)}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static executeError(t){if(null!=HotStaq.errors[t]){let e=HotStaq.errors[t].redirectToUrl;if(null!=e&&""!==e)return void(window.location.href=e);let n=HotStaq.errors[t].func;null!=n&&n(t)}}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addModule(t,e){this.modules[t]=e}getModule(t){return this.modules[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t,e=!0){if(null==this.files[t]){let n=t.indexOf("?hstqserve="),r=t;if(n>-1&&(r=t.substring(0,n)),null!=this.files[r])return this.files[r];if(!0===e)throw new Error(`Unable to find file ${t}`);return null}return this.files[t]}static keepContext(t,e,n){return function(){var r=Array.prototype.slice.call(arguments);return null!=n&&r.push(n),null==e?t.apply(this,r):t.apply(e,r)}}addComponent(t,e=null,n){let r=this.api;null!=e&&(r=e);let o=new t(this,r);if(null!=this.components[o.tag])throw new Error(`Component ${o.tag} already exists!`);this.components[o.tag]={componentType:t,processor:this,api:r},HotStaqRegisterComponent_1.registerComponent.call(this,o.tag,n)}static fixHTML(t){const e=t.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>"),n=(new DOMParser).parseFromString(`<xml>${e}</xml>`,"text/xml");let r="";if(n.documentElement.children.length>0){const e=n.documentElement.children[0].tagName.toLowerCase();"tr"===e&&(t=`<table>${t}</table>`,r="tbody"),"th"===e&&(t=`<table>${t}</table>`,r=e)}return{fixedStr:t,querySelector:r}}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=HotStaq.fixHTML(e),r=(new DOMParser).parseFromString(t.fixedStr,"text/html"),o=null;o=""===t.querySelector?r.body.children:r.querySelector(t.querySelector).children;let s=[];for(let t=0;t<o.length;t++){let e=o[t];s.push(n.appendChild(e))}return s}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t),r=!0;if(!1===n.validForNewPackages&&(r=!1),null!=n.errors&&n.errors.length>0&&(r=!1),!1===r&&!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`);return r}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}processHotSite(tester=null){return __awaiter(this,void 0,void 0,(function*(){HotStaq.checkHotSiteName(this.hotSite.name,!0);let routes=this.hotSite.routes;if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestDestination_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestDestination_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestDestination_1.HotTestDestination(n))}null!=tester?tester.testMaps[n]=r:this.logger.warning("A tester was not created first! You must specify one in the CLI.")}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,node_fetch_1.default)(componentUrl),ComponentClass=eval(res);this.addComponent(ComponentClass)}null==this.hotSite.routes&&(this.hotSite.routes={});let disableFileLoading=!1;null!=this.hotSite.disableFileLoading&&(disableFileLoading=this.hotSite.disableFileLoading),!1===disableFileLoading?yield this.loadHotFiles(this.hotSite.files,!1,!1):this.logger.verbose("Hotsite has file loading disabled..."),null!=tester&&this.addTester(tester),this.logger.verbose(`Processed HotSite ${this.hotSite.name}`)}))}loadHotSite(path){return __awaiter(this,void 0,void 0,(function*(){let jsonStr="";const ext=ppath.extname(path).toLowerCase();if(!0===HotStaq.isWeb){this.logger.verbose(`Downloading HotSite ${path}`);let t=yield(0,node_fetch_1.default)(path);this.logger.verbose(`Downloaded site ${path}`),jsonStr=t.text()}else{path=ppath.normalize(path),this.logger.verbose(`Accessing HotSite ${path}`);let HotIO=eval("require")("./HotIO").HotIO;jsonStr=yield HotIO.readTextFile(path),this.logger.verbose(`Accessed site ${path}`)}if(".yaml"===ext||".yml"===ext){if(!0===HotStaq.isWeb)throw new Error("YAML support for HotSites is not available on the web yet!");let yaml=eval("require")("yaml");this.hotSite=yaml.parse(jsonStr)}else this.hotSite=JSON.parse(jsonStr);if(null==this.hotSite)throw new Error(`HotSite ${path} cannot be null!`);this.hotSite.hotsitePath=path}))}saveHotSite(path){return __awaiter(this,void 0,void 0,(function*(){if(!0===HotStaq.isWeb)throw new Error("Cannot save a HotSite on the web!");const hotsiteStr=JSON.stringify(this.hotSite,null,2);let HotIO=eval("require")("./HotIO").HotIO;yield HotIO.writeTextFile(path,hotsiteStr),this.logger.verbose(`Saved site ${path}`)}))}loadHotFiles(t,e=!1,n=!0){return __awaiter(this,void 0,void 0,(function*(){this.logger.verbose("Loading Hott files...");for(let r in t){let o=t[r],s=null;HotStaq.isWeb,s=new HotFile_1.HotFile({name:r}),null!=o.url&&(!0===HotStaq.isWeb?s.url=`${o.url}?hstqserve=nahfam`:s.url=o.url),!1===HotStaq.isWeb&&null!=o.localFile&&(s.localFile=o.localFile);let i=!0;null!=o.content&&(s.content=o.content,i=!1),!0===e&&(i=!0),!1===n&&""!==s.url&&(i=!1),!0===i&&(this.logger.verbose(`Loading Hott file: ${s.url}`),yield s.load(),this.logger.verbose(`Finished loading Hott file: ${s.url}`)),this.addFile(s)}this.logger.verbose("Finished loading Hott files...")}))}generateContent(t,e="",n="./",r="./js/HotStaq.min.js",o=!0,s=null){return __awaiter(this,void 0,void 0,(function*(){let i="",l="",a="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=t.url&&(e=`"${t.url}"`),null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),l+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error(`Unable to find API ${e.api}`);if(e.api!==this.hotSite.server.globalApi){let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=t.url&&(n=`"${t.url}"`),null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),l+=r}}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicKeys)for(let t in this.hotSite.publicKeys){let e,n=this.hotSite.publicKeys[t];if("string"==typeof n)e=JSON.stringify(n);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=n.passSecretFromAPI&&(e=JSON.stringify(r.secrets[t]))}if(null!=n.env){const t=n.env;e=JSON.stringify(process.env[t])}}a+=`processor.publicKeys["${t}"] = ${e};\n`}}let u=this.pageContent;return u=yield(u=>__awaiter(this,void 0,void 0,(function*(){let c="",h="";this.mode===Hot_1.DeveloperMode.Development&&(c="tempMode = HotStaqWeb.DeveloperMode.Development;",null!=this.hotSite&&null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(h=this.testerApiContent,null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),h=h.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=new HotAsset_1.HotAsset("html",t);""!==e.localFile&&(n.path=e.localFile),""!==e.url&&(n.path=e.url),""!==e.content&&(n.path="",n.content=e.content);let r=yield n.output();if("string"==typeof r)throw new Error("During initial load, HTML assets cannot be outputted using only a string!");let o="",s="";null!=r.url&&(o=`"url": "${r.url}", `),null!=r.content&&(s=`"content": ${r.content}`),p+=`\t\t\tfiles["${r.name}"] = { ${o}${s} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}u=u.replace(/\%title\%/g,e),!0===o&&(u=u.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(u=u.replace(/\%args\%/g,JSON.stringify(s)));let d=t,f="",m="",g="HotTesterMochaSelenium";for(let t in this.testers){g=t;break}null!=this.hotSite&&(null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(f=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(m=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])&&(d=this.hotSite.routes[t].name);let _="";return 0!==this.startDelay&&(_=`await HotStaq.wait (${this.startDelay});`),u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=u.replace(/\%start\_delay\%/g,_)).replace(/\%logging\_level\%/g,`HotLogLevel.${HotLog_1.HotLogLevel[this.logger.logLevel]}`)).replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,c)).replace(/\%tester\_api\%/g,h)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,l)).replace(/\%public\_secrets\%/g,a)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${f}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${m}"`)})))(u),u}))}createExpressRoutes(t,e="./js/HotStaq.min.js"){return __awaiter(this,void 0,void 0,(function*(){for(let n in this.pages){let r=this.pages[n];const o=yield this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,((t,e)=>{this.logger.verbose("Sending custom Express content."),e.status(200).send(o)}))}}))}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite&&null!=this.hotSite.routes)for(let n in this.hotSite.routes)if(this.hotSite.routes[n].name===t){e=n;break}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);this.logger.verbose((()=>`Executing all API tests for tester ${t}. Maps: ${JSON.stringify(e)}`));for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let s=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(s),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({content:t.content});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e]});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static onReady(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t)}static useOutput(t){return __awaiter(this,void 0,void 0,(function*(){let e=(new DOMParser).parseFromString(t,"text/html");document.getElementsByTagName("html")[0].innerHTML=e.getElementsByTagName("html")[0].innerHTML;let n=document.getElementsByTagName("script");if(n.length>0){let t=[];for(let e=0;e<n.length;e++)t.push(n[e]);for(let e=0;e<t.length;e++){let n=document.createElement("script");t[e].parentNode.appendChild(n),t[e].parentNode.removeChild(t[e]),yield new Promise(((r,o)=>{n.onload=()=>{r()};let s=!1;null!=t[e].getAttribute("src")&&""!==t[e].getAttribute("src")&&(n.setAttribute("src",t[e].getAttribute("src")),s=!0),null!=t[e].getAttribute("type")&&""!==t[e].getAttribute("type")&&n.setAttribute("type",t[e].getAttribute("type")),n.innerHTML=t[e].innerHTML,!1===s&&r()}))}}}))}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static setupTesters(t,e){if(t.mode===Hot_1.DeveloperMode.Development&&null==t.testerAPI){null==e.testerAPIBaseUrl&&(e.testerAPIBaseUrl=""),""===e.testerAPIBaseUrl&&(e.testerAPIBaseUrl="http://127.0.0.1:8182");let n=new HotClient_1.HotClient(t),r=new HotTesterAPI_1.HotTesterAPI(e.testerAPIBaseUrl,n);r.connection.api=r,t.testerAPI=r}}static setupClientTesters(t){let e="";return t.mode===Hot_1.DeveloperMode.Development&&(e+='<script type = "text/javascript">\nfunction hotstaq_isDocumentReady ()\n{\nif (window["Hot"] != null)\n{\nif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n{\nlet func = function ()\n\t{\n\t\tif (Hot.TesterAPI != null)\n\t\t{\n\t\t\tlet testPaths = {};\n\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t{\n\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t}\n\n\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\ttesterMap: Hot.CurrentPage.testerMap,\n\t\t\t\t\tpageName: Hot.CurrentPage.name,\n\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t}).then (function (resp)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t});\n\t\t}\n\t};\n\nif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\tfunc ();\nelse\n\tdocument.addEventListener ("DOMContentLoaded", func);\n}\n}\n}\n\nhotstaq_isDocumentReady ();\n<\/script>'),e}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r,s.url.indexOf("hstqserve")<0&&(s.url+="?hstqserve=nahfam");let i=yield HotStaq.processUrl(s);i+=HotStaq.setupClientTesters(n),yield HotStaq.useOutput(i),o(n)}))))}))}))}static displayContent(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onReady((()=>__awaiter(this,void 0,void 0,(function*(){let s={content:""};s.name=null==e?"string"==typeof t?"":t.name:e,""===s.name&&(s.name="string"==typeof t?"":t.name),"string"==typeof t?s.content=t:(s.content=t.content,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r;let i=yield HotStaq.processContent(s);yield HotStaq.useOutput(i),o(n)}))))}))}))}}exports.HotStaq=HotStaq,HotStaq.version="0.8.23",HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null,HotStaq.errors={},"undefined"!=typeof document&&window.addEventListener("load",HotStaqWebStart_1.hotStaqWebStart)},638:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerComponent=void 0;const r=n(732),o=n(260),s=n(243),i=n(507);e.registerComponent=function(t,e){if(null==t||""===t)throw new Error("All components must have a tag!");if(void 0!==customElements.get(t))return;let n=this.components;customElements.define(t,class extends HTMLElement{constructor(){super();let e=n[t];if(this.component=new e.componentType(e.processor,e.api),this.hotComponent=this.component,this.component.htmlElements=[this],this.component.inner=this.innerHTML,null!=this.component.handleAttributes)this.component.handleAttributes(this.attributes);else for(let t=0;t<this.attributes.length;t++){const e=this.attributes[t],n=e.name.toLowerCase(),r=e.value;if("id"===n&&(this.component.name=r),"name"===n&&(this.component.name=r),"value"===n&&(this.component.value=r),n.indexOf("hot-")>-1){const t=n.substring(4);this.component[t]=r}}if(null!=this.component.onPreOutput&&!1===this.component.onPreOutput())return;let l=this.component.output();null!=this.component.onPostOutput&&(l=this.component.onPostOutput(l));let a=[];"string"==typeof l?a.push({html:l}):a=l instanceof Array?l:[l];for(let t=0;t<a.length;t++){let e=a[t],n=e.html,l="";null!=e.addFunctionsTo&&(l=e.addFunctionsTo);let u=r.HotFile.parseContent(n,!0,{outputCommands:!1});null!=this.component.onParsed&&(u=this.component.onParsed(u));let c={fixedStr:"",querySelector:""};c=null!=this.component.onFixHTML?this.component.onFixHTML(u):s.HotStaq.fixHTML(u);let h=[];for(let t=this.children.length-1;t>-1;t--){let e=this.children[t];h.push(this.removeChild(e))}let p=null,d=null;if(p=null!=this.component.onParseDOM?this.component.onParseDOM(c.fixedStr):(new DOMParser).parseFromString(c.fixedStr,"text/html"),p.body.children.length<1)throw new Error(`No component output from ${this.component.name} with tag ${this.component.tag}`);if(p.body.children.length>1){let t=!0;for(let e=0;e<p.body.children.length;e++){let n=p.body.children[e];if(n instanceof HTMLElement&&"parsererror"===n.tagName.toLowerCase()){d=n,t=!1;break}}if(!0===t)throw new Error(`Only a single html element can come from component ${this.component.name}, multiple elements were detected.`)}d=""===c.querySelector?p.body.children[0]:p.querySelector(c.querySelector),this.replaceWith(d),null!=this.component.click&&d.addEventListener("click",this.component.click.bind(this.component));for(let t in this.component.events){let e=this.component.events[t];d.addEventListener(e.type,e.func,e.options)}let f=Object.getOwnPropertyNames(this.component.constructor.prototype);for(let t=0;t<f.length;t++){let e=f[t];if("constructor"!==e&&"function"==typeof this.component[e]){let t=!0;for(let n in o.HotComponent.prototype)if(e===n){t=!1;break}!0===t&&(d[e]=s.HotStaq.keepContext(this.component[e],this.component),""!==l)&&(document.querySelector(l)[e]=s.HotStaq.keepContext(this.component[e],this.component))}}null!=this.component.onPrePlace&&(d=this.component.onPrePlace(d));let m=this.component.onCreated(d);if(null!=this.component.onParentPlace&&(m.onParentPlace=this.component.onParentPlace),m.hotComponent=this.component,this.component.htmlElements.push(m),null!=e.closestSelector){let t=m;for(;t;){let n=t.querySelector(e.closestSelector);if(null!=n){t=n;break}t=t.parentElement}if(null==t)throw new Error(`Unable to find closest node with selector '${e.closestSelector}'`);m.parentElement.removeChild(m),t.appendChild(m),null!=m.onParentPlace&&m.hotComponent.onParentPlace(parentNode,m)}if(null!=e.documentSelector){let t=document.querySelector(e.documentSelector);if(null==t)throw new Error(`Unable to find document node with selector '${e.documentSelector}'`);m.parentElement.removeChild(m),t.appendChild(m),null!=m.onParentPlace&&m.hotComponent.onParentPlace(t,m)}let g=(t,e,n)=>{let r=0;for(;r<10&&null!=t&&!(t instanceof HTMLHtmlElement);){let o=t.querySelectorAll(`hot-place-here[name="${e}"]`);if(o.length>0){let t=o[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}if(o.length<1){let r=t.querySelectorAll(`[hot-place-here="${e}"]`);if(r.length>0){let t=r[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}}t=t.parentNode,r++}return t};if(null!=e.placeHereParent){let t=m.parentNode;if(t=g(t,e.placeHereParent,m),null==t)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`)}for(let t=0;t<h.length;t++){const n=h[t];let r=!1;if(void 0!==n.getAttribute){let t=n.getAttribute("hot-place-parent");if(null!=t&&""!==t){let o=m;if(o=g(o,t,n),null==o)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`);r=!0}}!1===r&&m.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(m,n)}if(null!=this.component.onPostPlace){let t=this.component.onPostPlace(m.parentElement,m);null!=t&&(m=t)}if(void 0!==i.Hot&&null!=i.Hot.CurrentPage){let t="";null!=this.component.name&&(t=this.component.name),null!=t&&""!==t||(t=this.id),""!==t&&(i.Hot.CurrentPage.components[t]=this.component)}}}looseParseFromString(t,e){e=e.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>");const n=t.parseFromString("<xml>"+e+"</xml>","text/xml"),r=t.parseFromString("","text/html");for(let t of Array.from(n.documentElement.children))r.body.appendChild(t);for(let t of Array.from(r.querySelectorAll("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")))t.outerHTML="<"+t.outerHTML.slice(1).split("<")[0];return r}get observedAttributes(){return this.component.observedAttributes}},e)}},23:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.hotStaqWebStart=void 0;const Hot_1=__webpack_require__(507),HotClient_1=__webpack_require__(957),HotLog_1=__webpack_require__(802),HotStaq_1=__webpack_require__(243);function hotStaqWebStart(){let hotstaqElms=document.getElementsByTagName("hotstaq");if(HotStaq_1.HotStaq.isWeb=!0,void 0!==HotStaqWeb)for(let t in HotStaqWeb)window[t]=HotStaqWeb[t];if(hotstaqElms.length>0){let hotstaqElm=hotstaqElms[0];setTimeout((function(){return __awaiter(this,void 0,void 0,(function*(){let getAttr=(t,e)=>{for(let n=0;n<e.length;n++){let r=e[n];if(null!=t.getAttribute(r))return t.getAttribute(r);if(null!=t.getAttribute(`data-${r}`))return t.getAttribute(`data-${r}`)}},loadPage=getAttr(hotstaqElm,["load-page","loadPage","src"])||"",loggingLevel=getAttr(hotstaqElm,["logging-level","loggingLevel"])||null,startDelay=getAttr(hotstaqElm,["start-delay","startDelay"])||null,router=getAttr(hotstaqElm,["router"])||"",name=getAttr(hotstaqElm,["name"])||"default",args=getAttr(hotstaqElm,["args"])||null,apiLibrary=getAttr(hotstaqElm,["api-library","apiLibrary"])||null,apiName=getAttr(hotstaqElm,["api-name","apiName"])||null,apiUrl=getAttr(hotstaqElm,["api-url","apiUrl"])||null,testerName=getAttr(hotstaqElm,["tester-name","testerName"])||"HotTesterMochaSelenium",testerMap=getAttr(hotstaqElm,["tester-map","testerMap"])||null,testerApiBaseUrl=getAttr(hotstaqElm,["tester-api-base-url","testerApiBaseUrl"])||null,testerLaunchpadUrl=getAttr(hotstaqElm,["tester-launchpad-url","testerLaunchpadUrl"])||null,dontReuseProcessor=!1,passRawUrl=!1,htmlSource=hotstaqElm.innerHTML||"",routerManager={},routerWildcards=[],search=new URLSearchParams(window.location.search);null!=startDelay&&(yield HotStaq_1.HotStaq.wait(parseInt(startDelay))),null!=getAttr(hotstaqElm,["src"])&&(loadPage=getAttr(hotstaqElm,["src"])),null!=getAttr(hotstaqElm,["passRawUrl"])&&(passRawUrl=!0),null!=getAttr(hotstaqElm,["dont-reuse-processor","dontReuseProcessor"])&&(dontReuseProcessor=!0);let hstqbaseredirect=search.get("hstqbaseredirect");null!=hstqbaseredirect&&(hstqbaseredirect=decodeURI(hstqbaseredirect),window.history.replaceState("","",hstqbaseredirect),loadPage=hstqbaseredirect);let hotstaqErrors=document.getElementsByTagName("hotstaq-error");for(let t=0;t<hotstaqErrors.length;t++){let e=hotstaqErrors[t],n=getAttr(e,["status"]),r=getAttr(e,["unsupported-browser-redirect"]);null!=r?HotStaq_1.HotStaq.errors.unsupportedBrowser={redirectToUrl:r}:HotStaq_1.HotStaq.errors[`${n}`]={redirectToUrl:r}}try{eval("async () => {}")}catch(t){HotStaq_1.HotStaq.executeError("unsupportedBrowser")}if(""!==router){let t=document.getElementsByTagName("hotstaq-router");for(let e=0;e<t.length;e++){let n=t[e],r=getAttr(n,["name"]),o=getAttr(n,["serve-local","serveLocally"]);if(r===router){for(let t=0;t<n.childNodes.length;t++){let e=n.childNodes[t];if(e instanceof HTMLElement&&"ROUTE"===e.tagName.toUpperCase()){let t=getAttr(e,["path"]),n=getAttr(e,["redirect"]),r=getAttr(e,["base-redirect","baseRedirect"]),o=getAttr(e,["base"]),s=getAttr(e,["src"]);t.indexOf("*")>-1&&routerWildcards.push(t),routerManager[t]={redirect:n||void 0,baseRedirect:r||void 0,base:o||void 0,src:s||void 0}}}let t=window.location.pathname,e=window.location.pathname;if(null!=o){const n=o.toLowerCase();if("true"===n||"yes"===n||"1"===n){const n=t.lastIndexOf("/");n>-1&&(t=t.substring(n),e=e.substring(n))}}if(routerWildcards.length>0)for(let e=0;e<routerWildcards.length;e++){let n=routerWildcards[e],r=n.replace("*","");if(t.indexOf(r)>-1){t=n;break}}if(null!=routerManager[t]){if(null!=routerManager[t].redirect)return void(window.location.href=routerManager[t].redirect);if(null!=routerManager[t].baseRedirect){const n=window.location.search;let r="";return""!==n&&"?"!==n&&(r=`&${n.substring(1)}`),void(window.location.href=`${routerManager[t].baseRedirect}?hstqbaseredirect=${encodeURI(e+n)}${r}`)}null!=routerManager[t].src&&(loadPage=routerManager[t].src)}break}}}args=null!=args?JSON.parse(args):Hot_1.Hot.Arguments;let hasHtmlSource=!1;if(""!==htmlSource){const t=htmlSource.replace(/\s/g,"");""!==t&&(hasHtmlSource=!0)}let tempMode=0;null!=window.Hot&&(tempMode=Hot_1.Hot.Mode);let processor=null;!1===dontReuseProcessor&&void 0!==Hot_1.Hot&&null!=Hot_1.Hot.CurrentPage&&null!=Hot_1.Hot.CurrentPage.processor&&(processor=Hot_1.Hot.CurrentPage.processor),null==processor&&(processor=new HotStaq_1.HotStaq),null!=loggingLevel&&(processor.logger.logLevel=HotLog_1.HotLog.parse(loggingLevel)),processor.mode=tempMode;let options={name,processor,args};if(""!==loadPage&&(!1===passRawUrl&&loadPage.indexOf("hstqserve")<0&&(loadPage+="?hstqserve=nahfam"),options.url=loadPage),null!=testerMap&&(options.testerMap=testerMap,options.testerName=testerName),null!=testerName&&(options.testerName=testerName),null!=testerApiBaseUrl&&(options.testerAPIBaseUrl=testerApiBaseUrl),null!=testerLaunchpadUrl&&(options.testerLaunchpadUrl=testerLaunchpadUrl),null!=apiName){let t=new HotClient_1.HotClient(processor);if(""===apiUrl)throw new Error("api-url was not set!");let e=window;null!=apiLibrary&&(e=window[apiLibrary]);let n=new e[apiName](apiUrl,t);n.connection.api=n,processor.api=n}if(!1===hasHtmlSource){if(""===loadPage)throw new Error("The hotstaq tag must have a src, HTML contents inside it, or a router set.");HotStaq_1.HotStaq.displayUrl(options)}else HotStaq_1.HotStaq.displayContent(options)}))}),50)}}exports.hotStaqWebStart=hotStaqWebStart},473:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDestination=void 0;class n{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof n?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=n},628:function(t,e){"use strict";var n=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0,e.HotTestDriver=class{constructor(t,e=null){this.processor=t,this.page=e,this.commandDelay=20,this.persistentData={}}parseTestObject(t){let e=t.indexOf("*"),n="";e>-1&&(t=t.replace(/\*/,""),n="*");let r=`[data-test-object-name${n}='${t}']`;return e=t.indexOf(">"),e>-1&&(r=t=t.replace(/\>/,"")),r}wait(t){return n(this,void 0,void 0,(function*(){return yield new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}print(t){return n(this,void 0,void 0,(function*(){process.stdout.write(t)}))}println(t){return n(this,void 0,void 0,(function*(){yield this.print(`${t}\n`)}))}destroy(){return n(this,void 0,void 0,(function*(){}))}assert(t,e=""){return n(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}}},967:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0,e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}},e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},985:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=void 0;const r=n(473);e.HotTestMap=class{constructor(t=[],e={},n=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let n=t[e];this.destinations.push(new r.HotTestDestination(n))}}else{this.destinations={};for(let e in t){let n=t[e];this.destinations[e]=new r.HotTestDestination(n)}}this.destinationOrder=n,this.pages=e}}},677:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(243);class s{constructor(t,e,n,r,o={}){if(null==o)throw new Error("The testMaps parameter can be an empty object, but cannot be null! It is set to null.");this.processor=t,this.name=e,this.timeout=1e4,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1}setup(t,e,n){return r(this,void 0,void 0,(function*(){}))}destroy(){return r(this,void 0,void 0,(function*(){}))}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}getTestPage(t){return this.testMaps[t.mapName].pages[t.page]}getTestPath(t,e){return this.testMaps[t.mapName].pages[t.page].testPaths[e]}static interpretDestination(t,e){let n={mapName:t,page:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0];if(o.length<2)return null;if("/"===o[0]&&"/"===o[1])return null;let s=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.page=s(o,"page:"),n.api=s(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=s(e,"dest:"),o.cmd=s(e,"cmd:"),o.path=s(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,s=!1){return r(this,void 0,void 0,(function*(){let r=!0;if(null==e)throw new Error(`Trying to access null method on destination map ${t.mapName}.`);!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: API Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,s=n.getMethod(o),i=t.paths[r+1].path;if(null==s)throw new Error(`Unable to find method related to path ${o} in map ${t.mapName}`);let l=yield this.executeTestAPIPath(t,s,i);e.push(l)}return e}))}executeTestPagePath(t,e,n=!1,o=!1){return r(this,void 0,void 0,(function*(){let r=!0,s=this.testMaps[t.mapName];if(null==s)throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);let i=s.pages[t.page];if(null==i)throw new Error(`HotTester: Page ${t.page} does not exist!`);this.driver.page=i;let l=e.path,a=i.testPaths[l];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,i,e,o));let u=null;if(!0===r){if(null==a)throw new Error(`HotTester: Test path ${l} does not have a function!`);u=yield a(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,a,u,o)),u}))}executeCommand(t,e,n,s){return r(this,void 0,void 0,(function*(){let i=(t,e,r)=>{let o=!1;n.cmd===e&&(o=!0);const s=n.cmd.indexOf("(");return s>-1&&n.cmd.substr(0,s)===e&&(o=!0),o},l=t=>{let e=[],n=t.match(/(?=\()(.*?)(?=\))/g);if(null!=n){let t=n[0];t=t.substr(2,t.length),e.push(t)}if(e.length<1)throw new Error(`HotTester: Command ${t} requires arguments, but none were supplied.`);return e},a=null,u=null,c=[];if("undefined"!=typeof HotTesterMochaSelenium&&this instanceof HotTesterMochaSelenium&&(a=this),null!=a&&(!0===i(n.cmd,"url")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield a.driver.navigateToUrl(e)}))),!0===i(n.cmd,"waitForTestObject")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=JSON.parse(t[0]);yield a.driver.waitForTestElement(e)})))),!0===i(n.cmd,"waitForTesterAPIData")&&(u=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===i(n.cmd,"wait")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===i(n.cmd,"print")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===i(n.cmd,"println")&&(c=l(n.cmd),u=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),null==u)throw new Error(`HotTester: Command ${n.cmd} does not exist!`);yield this.onCommand(t,e,n,s,c,u)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let i=t.paths[o],l=null,a=r.pages[t.page];if(null==a)throw new Error(`HotTester: Page ${t.page} does not exist!`);if(""!==i.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[i.dest],n=s.interpretDestination(t.mapName,e);null!=n&&(l=yield this.executeTestPagePaths(n))}""!==i.cmd&&(yield this.executeCommand(t,a,i,i.cmd)),""!==i.path&&(l=yield this.executeTestPagePath(t,i,!1,e)),n.push(l)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);this.processor.logger.verbose(`HotTester: Executing map ${t}...`);let n=this.processor.getRouteKeyFromName(t),o="";this.baseUrl,""!==n&&(o=`${this.baseUrl}${n}`);let i=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1!==e.autoStart)try{this.processor.logger.verbose((()=>`HotTester: Executing ${t} destination ${JSON.stringify(e)}...`));let r=s.interpretDestination(t,e),i=!1,l=!0;""!==r.page&&(i=!0),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(i,o,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(l=yield this.onTestStart(r,o,n)),!0===l&&(""!==r.page&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}catch(t){throw t}}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let n=e.destinations[t];yield i(n)}else if(e.destinationOrder.length>0){let t=[];for(let n=0;n<e.destinationOrder.length;n++){let r=e.destinationOrder[n],o=e.destinations[r];if(null==o)throw new Error(`HotTester: Destination ${r} does not exist!`);t.push(r),yield i(o,r)}for(let n in e.destinations){let r=!0;for(let e=0;e<t.length;e++)if(t[e]===n){r=!1;break}if(!0===r){let t=e.destinations[n];yield i(t,n)}}}else for(let t in e.destinations){let n=e.destinations[t];yield i(n,t)}}))}}e.HotTester=s},414:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{a(r.next(t))}catch(t){s(t)}}function l(t){try{a(r.throw(t))}catch(t){s(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}a((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(233),HotRoute_1=__webpack_require__(761),HotRouteMethod_1=__webpack_require__(70);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod({name:"pageLoaded",onServerExecute:this.pageLoaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"string",description:"The tester map executing the test."},pageName:{required:!0,type:"string",description:"The name of the page executing the test."},testElements:{required:!0,type:"array",description:"The test elements on the page."},testPaths:{required:!0,type:"array",description:"The test paths on the page."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"executeTests",onServerExecute:this.executeTests,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"object",description:"The tester map to execute."}},returns:"Returns true when tests are complete."}),r.addMethod({name:"heartbeat",type:HotRouteMethod_1.HotEventMethod.GET,onServerExecute:this.heartbeat,returns:"Returns true as an acknowledgement."}),this.addRoute(r)}pageLoaded(request){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:request.jsonObj.testerName,testerMap:request.jsonObj.testerMap,pageName:request.jsonObj.pageName,testElements:request.jsonObj.testElements,testPathsStrs:request.jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testerMap&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerName} does not exist!`);let testMap=tester.testMaps[testerObj.testerMap];if(null==testMap)throw new Error(`TesterAPI: Tester map ${testerObj.testerMap} does not exist!`);return testMap.pages[testerObj.pageName]={testElements:{},testPaths:{}},testMap.pages[testerObj.pageName].testElements=testerObj.testElements,testMap.pages[testerObj.pageName].testPaths=testPaths,tester.finishedLoading=!0,null!=tester.onFinishedLoading&&(yield tester.onFinishedLoading()),!0}))}executeTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=t.jsonObj.testerName,n=t.jsonObj.testerMap;if(null==e||null==n)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===e||""===n)throw new Error("TesterAPI: Not all required json objects were passed.");let r=this.connection;return null!=r.executeTests&&(yield r.executeTests(e,n)),!0}))}heartbeat(t){return __awaiter(this,void 0,void 0,(function*(){return!0}))}}exports.HotTesterAPI=HotTesterAPI},651:t=>{"use strict";t.exports={}},351:()=>{},606:()=>{}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(n.exports,n,n.exports,__webpack_require__),n.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var __webpack_exports__={};(()=>{"use strict";var t=__webpack_exports__;Object.defineProperty(t,"__esModule",{value:!0}),t.HotTestDriver=t.HotTestElementOptions=t.HotTestElement=t.HotTestDestination=t.HotTestMap=t.HotTesterAPI=t.HotTester=t.HotClient=t.HotServerType=t.HotServer=t.ServerRequest=t.HotEventMethod=t.HotRouteMethod=t.HotRoute=t.HotPage=t.HotLogLevel=t.HotLog=t.HotFile=t.EventExecutionType=t.HotAPI=t.HotComponent=t.DeveloperMode=t.HotAsset=t.HotModule=t.Hot=t.HotStaq=void 0;const e=__webpack_require__(243);Object.defineProperty(t,"HotStaq",{enumerable:!0,get:function(){return e.HotStaq}});const n=__webpack_require__(507);Object.defineProperty(t,"Hot",{enumerable:!0,get:function(){return n.Hot}}),Object.defineProperty(t,"DeveloperMode",{enumerable:!0,get:function(){return n.DeveloperMode}});const r=__webpack_require__(316);Object.defineProperty(t,"HotAsset",{enumerable:!0,get:function(){return r.HotAsset}});const o=__webpack_require__(202);Object.defineProperty(t,"HotModule",{enumerable:!0,get:function(){return o.HotModule}});const s=__webpack_require__(260);Object.defineProperty(t,"HotComponent",{enumerable:!0,get:function(){return s.HotComponent}});const i=__webpack_require__(732);Object.defineProperty(t,"HotFile",{enumerable:!0,get:function(){return i.HotFile}});const l=__webpack_require__(802);Object.defineProperty(t,"HotLog",{enumerable:!0,get:function(){return l.HotLog}}),Object.defineProperty(t,"HotLogLevel",{enumerable:!0,get:function(){return l.HotLogLevel}});const a=__webpack_require__(136);Object.defineProperty(t,"HotPage",{enumerable:!0,get:function(){return a.HotPage}});const u=__webpack_require__(233);Object.defineProperty(t,"HotAPI",{enumerable:!0,get:function(){return u.HotAPI}}),Object.defineProperty(t,"EventExecutionType",{enumerable:!0,get:function(){return u.EventExecutionType}});const c=__webpack_require__(761);Object.defineProperty(t,"HotRoute",{enumerable:!0,get:function(){return c.HotRoute}});const h=__webpack_require__(70);Object.defineProperty(t,"HotRouteMethod",{enumerable:!0,get:function(){return h.HotRouteMethod}}),Object.defineProperty(t,"HotEventMethod",{enumerable:!0,get:function(){return h.HotEventMethod}}),Object.defineProperty(t,"ServerRequest",{enumerable:!0,get:function(){return h.ServerRequest}});const p=__webpack_require__(810);Object.defineProperty(t,"HotServer",{enumerable:!0,get:function(){return p.HotServer}}),Object.defineProperty(t,"HotServerType",{enumerable:!0,get:function(){return p.HotServerType}});const d=__webpack_require__(957);Object.defineProperty(t,"HotClient",{enumerable:!0,get:function(){return d.HotClient}});const f=__webpack_require__(628);Object.defineProperty(t,"HotTestDriver",{enumerable:!0,get:function(){return f.HotTestDriver}});const m=__webpack_require__(967);Object.defineProperty(t,"HotTestElement",{enumerable:!0,get:function(){return m.HotTestElement}}),Object.defineProperty(t,"HotTestElementOptions",{enumerable:!0,get:function(){return m.HotTestElementOptions}});const g=__webpack_require__(677);Object.defineProperty(t,"HotTester",{enumerable:!0,get:function(){return g.HotTester}});const _=__webpack_require__(414);Object.defineProperty(t,"HotTesterAPI",{enumerable:!0,get:function(){return _.HotTesterAPI}});const v=__webpack_require__(985);Object.defineProperty(t,"HotTestMap",{enumerable:!0,get:function(){return v.HotTestMap}});const w=__webpack_require__(473);Object.defineProperty(t,"HotTestDestination",{enumerable:!0,get:function(){return w.HotTestDestination}}),e.HotStaq.isWeb=!0})(),HotStaqWeb=__webpack_exports__})();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QXFDUiw2RUFyQ1UsRUFBQUQsYUFBYSxJQUMzQixpQ0FtQ0ksd0VBbkNLLEVBQUFzUSxRQUFRLElBQ2pCLGlDQWlDSSx5RUFqQ0ssRUFBQTRiLFNBQVMsSUFDbEIsaUNBbUNJLDRFQW5DSyxFQUFBeEwsWUFBWSxJQUNyQixpQ0FxQ0ksdUVBckNLLEVBQUEzZSxPQUFPLElBQ2hCLGlDQXFDSSxzRUFyQ0ssRUFBQThSLE1BQU0sSUFzQ1gsMkVBdENhLEVBQUEzRixXQUFXLElBQzVCLGlDQXNDSSx1RUF0Q0ssRUFBQTBKLE9BQU8sSUFHaEIsaUNBOEJJLHNFQTlCSyxFQUFBdVQsTUFBTSxJQStCWCxrRkEvQmEsRUFBQWptQixrQkFBa0IsSUFDbkMsaUNBbUNJLHdFQW5DSyxFQUFBUSxRQUFRLElBQ2pCLGdDQW1DSSw4RUFuQ0ssRUFBQWUsY0FBYyxJQW9DbkIsOEVBcENxQixFQUFBakUsY0FBYyxJQXFDbkMsNkVBckNxQyxFQUFBMnBCLGFBQWEsSUFDdEQsaUNBcUNJLHlFQXJDSyxFQUFBaGxCLFNBQVMsSUFzQ2QsNkVBdENnQixFQUFBd0IsYUFBYSxJQUNqQyxpQ0FzQ0kseUVBdENLLEVBQUF1VixTQUFTLElBR2xCLGlDQTBDSSw2RUExQ0ssRUFBQWtPLGFBQWEsSUFDdEIsaUNBdUNJLDhFQXZDc0IsRUFBQTFuQixjQUFjLElBd0NwQyxxRkF4Q3NDLEVBQUEybkIscUJBQXFCLElBQy9ELGlDQWtDSSx5RUFsQ0ssRUFBQWpGLFNBQVMsSUFLbEIsaUNBOEJJLDRFQTlCSyxFQUFBakosWUFBWSxJQUNyQixpQ0E4QkksMEVBOUJLLEVBQUFsRyxVQUFVLElBQ25CLGlDQThCSSxrRkE5QkssRUFBQUcsa0JBQWtCLElBRzNCLEVBQUEvWCxRQUFRQyxPQUFRLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEFQSS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEFzc2V0LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q2xpZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90RmlsZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdExvZy50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdE1vZHVsZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFBhZ2UudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RSb3V0ZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlTWV0aG9kLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U2VydmVyLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFN0YXFSZWdpc3RlckNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFN0YXFXZWJTdGFydC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3REZXN0aW5hdGlvbi50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3REcml2ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0RWxlbWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RNYXAudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0ZXJBUEkudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi9leHRlcm5hbCB2YXIgXCJ7fVwiIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvYXBpLXdlYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwiLyohIGpzLWNvb2tpZSB2My4wLjEgfCBNSVQgKi9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gZ2xvYmFsLkNvb2tpZXM7XG4gICAgdmFyIGV4cG9ydHMgPSBnbG9iYWwuQ29va2llcyA9IGZhY3RvcnkoKTtcbiAgICBleHBvcnRzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7IGdsb2JhbC5Db29raWVzID0gY3VycmVudDsgcmV0dXJuIGV4cG9ydHM7IH07XG4gIH0oKSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIGZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuICB2YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4gIGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgICBmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAgIC8vIC4uLlxuICAgICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgICAvLyAuLi5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgICBrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChrZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgICB2YXIgamFyID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgIGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xuXG4gICAgICAgICAgaWYgKGtleSA9PT0gZm91bmRLZXkpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXJcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2V0OiBzZXQsXG4gICAgICAgIGdldDogZ2V0LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgdmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgcmV0dXJuIGFwaTtcblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHtcblx0Ly8gdGhlIG9ubHkgcmVsaWFibGUgbWVhbnMgdG8gZ2V0IHRoZSBnbG9iYWwgb2JqZWN0IGlzXG5cdC8vIGBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpYFxuXHQvLyBIb3dldmVyLCB0aGlzIGNhdXNlcyBDU1AgdmlvbGF0aW9ucyBpbiBDaHJvbWUgYXBwcy5cblx0aWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgeyByZXR1cm4gc2VsZjsgfVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIHdpbmRvdzsgfVxuXHRpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGdsb2JhbDsgfVxuXHR0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdCcpO1xufVxuXG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGdsb2JhbC5mZXRjaDtcblxuLy8gTmVlZGVkIGZvciBUeXBlU2NyaXB0IGFuZCBXZWJwYWNrLlxuaWYgKGdsb2JhbC5mZXRjaCkge1xuXHRleHBvcnRzLmRlZmF1bHQgPSBnbG9iYWwuZmV0Y2guYmluZChnbG9iYWwpO1xufVxuXG5leHBvcnRzLkhlYWRlcnMgPSBnbG9iYWwuSGVhZGVycztcbmV4cG9ydHMuUmVxdWVzdCA9IGdsb2JhbC5SZXF1ZXN0O1xuZXhwb3J0cy5SZXNwb25zZSA9IGdsb2JhbC5SZXNwb25zZTsiLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgeyBIb3RFdmVudE1ldGhvZCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdE1vZHVsZSB9IGZyb20gXCIuL0hvdE1vZHVsZVwiO1xuXG4vKipcbiAqIFRoZSBhdmFpbGFibGUgZGV2ZWxvcGVyIG1vZGVzLlxuICovXG5leHBvcnQgZW51bSBEZXZlbG9wZXJNb2RlXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCBkZXZlbG9wZXIgbW9kZS4gTm8gdGVzdHMgd2lsbCBiZSBleGVjdXRlZCBhbmQgXG5cdCAqIGFueSB0ZXN0IHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRQcm9kdWN0aW9uLFxuXHQvKipcblx0ICogRm9yIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBBbGwgdGVzdCBkYXRhIHdpbGwgXG5cdCAqIGJlIGNvbGxlY3RlZCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0RGV2ZWxvcG1lbnRcbn1cblxuLyoqXG4gKiBBIENTUyBvYmplY3QgdG8gZW1iZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBDU1MgZmlsZSB0byBlbWJlZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGludGVncml0eSBoYXNoIHRvIGdlbmVyYXRlIGR1cmluZyBpbml0aWFsIGNvbXBpbGF0aW9uLlxuXHQgKi9cblx0aW50ZWdyaXR5SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhcGkgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnRseSBnZW5lcmF0ZWQgcGFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEN1cnJlbnRQYWdlOiBIb3RQYWdlID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBhcmd1bWVudHMgcGFzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFyZ3VtZW50czogYW55ID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIEhvdFRlc3RFbGVtZW50ID0gSG90VGVzdEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIE1vZGU6IERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdC8qKlxuXHQgKlRoZSBjdXJyZW50IEFQSSB1c2VkIG9uIHRoaXMgcGFnZS4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIEFQSSBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRzdGF0aWMgVGVzdGVyQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIGJ1ZmZlciB0byBvdXRwdXQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIE91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhIHRvIHNoYXJlIGFjcm9zcyBhbGwgdGhlIGRpZmZlcmVudCBmaWxlcyBhbmQgcGFnZXMuIFRoaXMgZGF0YSB3aWxsIGJlIHB1YmxpYy5cblx0ICovXG5cdHN0YXRpYyBEYXRhOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBjb29raWVzIHRvIHVzZSBiZXR3ZWVuIHBhZ2VzLlxuXHQgKi9cblx0c3RhdGljIENvb2tpZXM6IENvb2tpZXMuQ29va2llc1N0YXRpYyA9IENvb2tpZXM7XG5cdC8qKlxuXHQgKiBBbnkgcHVibGljIGtleXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLiBUaGVzZSBjYW4gYmUgcGFzc2VkIGZyb20gSG90U2l0ZS5qc29uLlxuXHQgKi9cblx0c3RhdGljIFB1YmxpY0tleXM6IGFueSA9IHt9O1xuXHQvKipcblx0ICogVGhlIENTUyBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIENTUyBmaWxlcy5cblx0ICovXG5cdHN0YXRpYyBjc3NTdHI6IHN0cmluZyA9IGA8bGluayByZWwgPSBcInN0eWxlc2hlZXRcIiBocmVmID0gXCIlQ1NTX0ZJTEUlXCIgLz5gO1xuXHQvKipcblx0ICogVGhlIENTUyBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IENTU09iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIENTUzogc3RyaW5nW10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGZpbGVzIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICogXG5cdCAqIEB0b2RvIE1ha2UgdGhpcyBhIFwic3RyaW5nIHwgSlNGaWxlT2JqZWN0XCIgZGF0YSB0eXBlIHNvIGl0IGNhbiBhbHNvIGluY2x1ZGUgXG5cdCAqIHRoZSBpbnRlZ3JpdHkgaGFzaGVzIGFzIHdlbGwuXG5cdCAqL1xuXHRzdGF0aWMgSlNGaWxlczogYW55W10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGlubGluZSBjb2RlIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBKU1NjcmlwdHM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNGaWxlU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVKU19GSUxFJVwiPjwvc2NyaXB0PmA7XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNTY3JpcHRzU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj4lSlNfQ09ERSU8L3NjcmlwdD5gO1xuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW5jbHVkZSAoZmlsZTogSG90RmlsZSB8IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAoZmlsZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGxvd2VyRmlsZTogc3RyaW5nID0gZmlsZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCBkb2VzIG5vdCBoYXZlIGEgbmFoZmFtLCBhZGQgaXQuIFRoaXMgXG5cdFx0XHRcdC8vIHdpbGwgZW5zdXJlIHRoZSBzZXJ2ZXIgc2VuZHMgb25seSB0aGUgZmlsZSBjb250ZW50LlxuXHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwiLmhvdHRcIikgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChsb3dlckZpbGUuaW5kZXhPZiAoXCJuYWhmYW1cIikgPCAwKVxuXHRcdFx0XHRcdFx0ZmlsZSArPSBcIj9oc3Rxc2VydmU9bmFoZmFtXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRIb3QuZWNobyAoYXdhaXQgSG90LmdldEZpbGUgKGZpbGUsIGFyZ3MpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgZm9yIHVzZSB3aGVuIHJ1bm5pbmcgdGhlIHByZXByb2Nlc3Nvci5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBpbmNsdWRlSlMgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCwgcGFyZW50T2JqZWN0OiBhbnkgPSBudWxsKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRjb25zdCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdC5nZXRGaWxlIChmaWxlLCBhcmdzKTtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0cGFyZW50T2JqZWN0ID0gd2luZG93O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKHBhcmVudE9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHRwYXJlbnRPYmplY3QgPSBnbG9iYWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChldmFsLmFwcGx5IChwYXJlbnRPYmplY3QsIFtvdXRwdXRdKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGltcG9ydCAobW9kdWxlTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwsIHBhcmVudE9iamVjdDogYW55ID0gbnVsbCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IGZvdW5kTW9kdWxlOiBIb3RNb2R1bGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldE1vZHVsZSAobW9kdWxlTmFtZSk7XG5cblx0XHRpZiAoZm91bmRNb2R1bGUgIT0gbnVsbClcblx0XHRcdHJldHVybiAoZm91bmRNb2R1bGUpO1xuXG5cdFx0Y29uc3QgZmlsZTogc3RyaW5nID0gYC4vaG90c3RhcV9tb2R1bGVzLyR7bW9kdWxlTmFtZX0vaW5kZXguanNgO1xuXHRcdGNvbnN0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgSG90LmdldEZpbGUgKGZpbGUsIGFyZ3MpO1xuXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHBhcmVudE9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHRwYXJlbnRPYmplY3QgPSB3aW5kb3c7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAocGFyZW50T2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHBhcmVudE9iamVjdCA9IGdsb2JhbDtcblx0XHR9XG5cblx0XHRsZXQgbmV3TW9kdWxlID0gbmV3IEZ1bmN0aW9uIChvdXRwdXQpLmFwcGx5IChwYXJlbnRPYmplY3QpO1xuXG5cdFx0aWYgKG5ld01vZHVsZS5sb2FkSFRNTCAhPSBudWxsKVxuXHRcdFx0YXdhaXQgbmV3TW9kdWxlLmxvYWRIVE1MICgpO1xuXG5cdFx0SG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hZGRNb2R1bGUgKG1vZHVsZU5hbWUsIG5ld01vZHVsZSk7XG5cblx0XHRyZXR1cm4gKG5ld01vZHVsZSk7XG5cdH1cblxuXHQvKipcblx0ICogUnVuIGFuIGFscmVhZHkgbG9hZGVkIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcnVuRmlsZSAoZmlsZU5hbWU6IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldEZpbGUgKGZpbGVOYW1lKTtcblx0XHQvLy8gQGZpeG1lIERvZXMgdGhlIGZpbGUgbmVlZCB0byBiZSBkZWVwIGNsb25lZCBmaXJzdD9cblx0XHQvL2xldCBjbG9uZWRGaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKE9iamVjdC5hc3NpZ24gKHt9LCBmaWxlKSk7XG5cdFx0bGV0IHRlbXBGaWxlOiBIb3RGaWxlID0gZmlsZTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdEhvdC5lY2hvIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGdldEZpbGUgKHBhdGg6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHRlbXBGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKHBhdGgpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRlbXBGaWxlID0gbmV3IEhvdEZpbGUgKCk7XG5cdFx0XHR0ZW1wRmlsZS5uYW1lID0gcGF0aDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHRcdHRlbXBGaWxlLnVybCA9IHBhdGg7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRlbXBGaWxlLmxvY2FsRmlsZSA9IHBhdGg7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRlbXBGaWxlID0gcGF0aDtcblxuXHRcdGxldCBjaGVja0ZpbGU6IEhvdEZpbGUgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmdldEZpbGUgKHRlbXBGaWxlLm5hbWUsIGZhbHNlKTtcblxuXHRcdGlmIChjaGVja0ZpbGUgIT0gbnVsbClcblx0XHRcdHRlbXBGaWxlID0gY2hlY2tGaWxlO1xuXG5cdFx0YXdhaXQgdGVtcEZpbGUubG9hZCAoKTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhbiBhcGkgY2FsbC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBhcGlDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBcblx0XHRodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiQ3VycmVudCBwYWdlJ3MgcHJvY2Vzc29yIGlzIG51bGwhXCIpO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiQ3VycmVudCBwYWdlJ3MgcHJvY2Vzc29yIGFwaSBpcyBudWxsISBEaWQgeW91IGZvcmdldCB0byBzZXQgdGhlIEFQSSBuYW1lIG9yIFVSTD9cIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRyZXN1bHQgPSBhd2FpdCBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaS5tYWtlQ2FsbCAocm91dGUsIFxuXHRcdFx0XHRcdFx0XHRkYXRhLCBodHRwTWV0aG9kLCBmaWxlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIEhUVFAgSlNPTiBmaWxlIG9yIHJlcXVlc3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGdldEpTT04gKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRyZXR1cm4gKEhvdC5qc29uUmVxdWVzdCAodXJsLCBudWxsLCBIb3RFdmVudE1ldGhvZC5HRVQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGEgSFRUUCBKU09OIHJlcXVlc3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXJsIFRoZSBmdWxsIHVybCB0byBtYWtlIHRoZSBIVFRQIGNhbGwuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIEpTT04uc3RyaW5naWZ5IGFuZCBzZW5kLlxuXHQgKiBAcGFyYW0gaHR0cE1ldGhvZCBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIHRvIHNlbmQgdGhlIGRhdGEuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGpzb25SZXF1ZXN0ICh1cmw6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgaHR0cE1ldGhvZDogSG90RXZlbnRNZXRob2QgPSBIb3RFdmVudE1ldGhvZC5QT1NUKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZmV0Y2hPYmogPSB7XG5cdFx0XHRcdFwibWV0aG9kXCI6IGh0dHBNZXRob2QsXG5cdFx0XHRcdFwiaGVhZGVyc1wiOiB7XG5cdFx0XHRcdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaHR0cE1ldGhvZCA9PT0gSG90RXZlbnRNZXRob2QuUE9TVClcblx0XHRcdHtcblx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgcmVzID0gYXdhaXQgZmV0Y2ggKHVybCwgZmV0Y2hPYmopO1xuXG5cdFx0XHRpZiAocmVzLm9rID09PSBmYWxzZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHtyZXMuc3RhdHVzfTogJHtyZXMuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHJldHVybiAoSlNPTi5zdHJpbmdpZnkgKHsgXCJlcnJvclwiOiBgJHtleC5tZXNzYWdlfSAtIENvdWxkIG5vdCBmZXRjaCAke3VybH1gIH0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgcmVxdWVzdC4gVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHdyYXBwZXIgZm9yIGZldGNoLlxuXHQgKiBcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0ge1JlcXVlc3RJbml0fSByZXF1ZXN0SW5pdCBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIHNlbmQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgSFRUUCByZXNwb25zZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwUmVxdWVzdCAodXJsOiBzdHJpbmcsIHJlcXVlc3RJbml0OiBhbnkgPSB1bmRlZmluZWQpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsLCByZXF1ZXN0SW5pdCk7XG5cblx0XHRyZXR1cm4gKHJlcyk7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgc29tZSBvdXRwdXQuXG5cdCAqL1xuXHRzdGF0aWMgZWNobyAobWVzc2FnZTogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0SG90Lk91dHB1dCArPSBtZXNzYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBDU1MgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlDU1MgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkNTUy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgY3NzRmlsZTogc3RyaW5nID0gSG90LkNTU1tpSWR4XTtcblx0XHRcdGxldCBjc3NPdXQ6IHN0cmluZyA9IEhvdC5jc3NTdHI7XG5cblx0XHRcdGNzc091dCA9IGNzc091dC5yZXBsYWNlICgvXFwlQ1NTX0ZJTEVcXCUvZywgY3NzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChjc3NPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgZmlsZXMgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlKU0ZpbGVzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU0ZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc0ZpbGU6IHN0cmluZyA9IEhvdC5KU0ZpbGVzW2lJZHhdO1xuXHRcdFx0bGV0IGpzRmlsZU91dDogc3RyaW5nID0gSG90LmpzRmlsZVN0cjtcblxuXHRcdFx0anNGaWxlT3V0ID0ganNGaWxlT3V0LnJlcGxhY2UgKC9cXCVKU19GSUxFXFwlL2csIGpzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChqc0ZpbGVPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgc2NyaXB0cyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTU2NyaXB0cyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuSlNTY3JpcHRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc1NjcmlwdDogc3RyaW5nID0gSG90LkpTU2NyaXB0c1tpSWR4XTtcblx0XHRcdGxldCBqc1NjcmlwdE91dDogc3RyaW5nID0gSG90LmpzU2NyaXB0c1N0cjtcblxuXHRcdFx0anNTY3JpcHRPdXQgPSBqc1NjcmlwdE91dC5yZXBsYWNlICgvXFwlSlNfQ09ERVxcJS9nLCBqc1NjcmlwdCk7XG5cblx0XHRcdEhvdC5lY2hvIChqc1NjcmlwdE91dCk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuXG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90RXZlbnRNZXRob2QsIEhvdFJvdXRlTWV0aG9kLCBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90REIgfSBmcm9tIFwiLi9Ib3REQlwiO1xuXG5pbXBvcnQgeyBIb3REQlNjaGVtYSB9IGZyb20gXCIuL3NjaGVtYXMvSG90REJTY2hlbWFcIjtcbmltcG9ydCB7IEhvdFdlYlNvY2tldFNlcnZlciB9IGZyb20gXCIuL0hvdFdlYlNvY2tldFNlcnZlclwiO1xuaW1wb3J0IHsgSG90SFRUUFNlcnZlciB9IGZyb20gXCIuL0hvdEhUVFBTZXJ2ZXJcIjtcblxuLyoqXG4gKiBUaGUgQVBJIHRvIGxvYWQuXG4gKi9cbmV4cG9ydCB0eXBlIEFQSXRvTG9hZCA9IHtcblx0LyoqXG5cdCAqIFRoZSBpbXBvcnRlZCBjbGFzcyB0byBsb2FkLlxuXHQgKi9cblx0aW1wb3J0ZWRBUElDbGFzczogYW55O1xuXHQvKipcblx0ICogVGhlIGV4cG9ydGVkIGNsYXNzIG5hbWUgdG8gaW1wb3J0IGFuZCBpbnN0YW50aWF0ZS5cblx0ICovXG5cdGV4cG9ydGVkQ2xhc3NOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgSG90QVBJIGNsYXNzIHRvIGxvYWQuXG5cdCAqL1xuXHRwYXRoOiBzdHJpbmc7XG4gfTtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBvYmplY3QgdG8gdXNlIGR1cmluZyBldmVudCBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZW51bSBFdmVudEV4ZWN1dGlvblR5cGVcbntcblx0SG90Um91dGUsXG5cdEhvdE1ldGhvZCxcblx0SG90QVBJXG59XG5cbi8qKlxuICogVGhlIEFQSSB0byB1c2UuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RBUElcbntcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgY29ubmVjdGlvbi5cblx0ICovXG5cdGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudDtcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVBJLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHNlcnZlci5cblx0ICovXG5cdGJhc2VVcmw6IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCwgdGhpcyB3aWxsIGNyZWF0ZSB0aGUgcm91dGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZm9yIFxuXHQgKiBlYXN5IGNsaWVudC9zZXJ2ZXIgY2FsbGluZy5cblx0ICovXG5cdGNyZWF0ZUZ1bmN0aW9uczogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0ZXhlY3V0ZUV2ZW50c1VzaW5nOiBFdmVudEV4ZWN1dGlvblR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGRiOiBIb3REQjtcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRoZSBjbGllbnQgdXNlcyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi4gSWYgdXNpbmcgXG5cdCAqIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGZvciBIVFRQIHJlcXVlc3RzLCBiZSBzdXJlIHRvIG92ZXJyaWRlIHRoZSBcblx0ICogYHRvQXV0aG9yaXphdGlvbkhlYWRlclN0cmluZ2AgaW4gdGhpcyBvYmplY3QuXG5cdCAqIFxuXHQgKiBFeGFtcGxlIG9mIHRoaXMgb2JqZWN0OlxuXHQgKiBgYGB0c1xuXHQgKiB0aGlzLmF1dGhDcmVkZW50aWFscyA9IHtcblx0ICogXHRcdHVzZXI6IFwidXNlcm5hbWVcIixcblx0ICogXHRcdHBhc3N3b3JkOiBcInBhc3N3b3JkXCIsXG5cdCAqIFx0XHR0b0F1dGhvcml6YXRpb25IZWFkZXJTdHJpbmc6IGZ1bmN0aW9uICgpXG5cdCAqIFx0XHRcdHtcblx0ICogXHRcdFx0XHRyZXR1cm4gKGJ0b2EgKHRoaXMudXNlciArIFwiOlwiICsgdGhpcy5wYXNzd29yZCkpO1xuXHQgKiBcdFx0XHR9XG5cdCAqIFx0fTtcblx0ICogYGBgXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB1c2VkIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuXHQgKi9cblx0dXNlckF1dGg6IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0cm91dGVzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RSb3V0ZSB9O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0aGUgQVBJIGlzIGFib3V0IHRvIHN0YXJ0IHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaGFzIGZpbmlzaGVkIHJlZ2lzdGVyaW5nIHJvdXRlcy4gSWYgXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHNlcnZlciB3aWxsIG5vdCBzdGFydC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdGNvbnN0cnVjdG9yIChiYXNlVXJsOiBzdHJpbmcsIGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCwgZGI6IEhvdERCID0gbnVsbClcblx0e1xuXHRcdGlmIChjb25uZWN0aW9uID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBzZXJ2ZXIgYXR0YWNoZWQgdG8gYXBpIHdpdGggYmFzZVVybDogJHtiYXNlVXJsfWApO1xuXG5cdFx0dGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdHRoaXMuY3JlYXRlRnVuY3Rpb25zID0gdHJ1ZTtcblx0XHR0aGlzLmV4ZWN1dGVFdmVudHNVc2luZyA9IEV2ZW50RXhlY3V0aW9uVHlwZS5Ib3RSb3V0ZTtcblx0XHR0aGlzLmRiID0gZGI7XG5cdFx0dGhpcy5hdXRoQ3JlZGVudGlhbHMgPSBudWxsO1xuXHRcdHRoaXMudXNlckF1dGggPSBudWxsO1xuXHRcdHRoaXMucm91dGVzID0ge307XG5cdFx0dGhpcy5vblByZVJlZ2lzdGVyID0gbnVsbDtcblx0XHR0aGlzLm9uUG9zdFJlZ2lzdGVyID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgdXNlLlxuXHQgKi9cblx0c2V0REJTY2hlbWEgKHNjaGVtYTogSG90REJTY2hlbWEpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gQVBJIGhhcyBiZWVuIHNldCFgKTtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHRoaXMuY29ubmVjdGlvbi5hcGkuZGIuc2NoZW1hID0gc2NoZW1hO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgZGF0YWJhc2UgYmVpbmcgdXNlZC5cblx0ICovXG5cdGdldERCICgpOiBIb3REQlxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGFiYXNlIHNjaGVtYSBiZWluZyB1c2VkLlxuXHQgKi9cblx0Z2V0REJTY2hlbWEgKCk6IEhvdERCU2NoZW1hXG5cdHtcblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIuc2NoZW1hKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSByb3V0ZS4gSWYgdGhpcy5jcmVhdGVGdW5jdGlvbnMgaXMgc2V0IHRvIHRydWUgKHdoaWNoIGlzIGRlZmF1bHQpLCB0aGlzIHdpbGwgdGFrZSB0aGUgaW5jb21pbmcgXG5cdCAqIHJvdXRlIGFuZCBjcmVhdGUgYW4gb2JqZWN0IGluIHRoaXMgSG90QVBJIG9iamVjdCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgcm91dGUuIElmIHRoZXJlJ3MgXG5cdCAqIGFueSBIb3RSb3V0ZU1ldGhvZHMgaW5zaWRlIG9mIHRoZSBpbmNvbWluZyBIb3RSb3V0ZSwgaXQgd2lsbCBjcmVhdGUgdGhlIG1ldGhvZHMgXG5cdCAqIGFuZCBhdHRhY2ggdGhlbSB0byB0aGUgbmV3bHkgY3JlYXRlZCBIb3RSb3V0ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGB0c1xuXHQgKiBpbXBvcnQgeyBIb3RBUEksIEhvdFJvdXRlIH0gZnJvbSBcImhvdHN0YXFcIjtcblx0ICogXG5cdCAqIGNsYXNzIEFwcEFQSSBleHRlbmRzIEhvdEFQSVxuXHQgKiB7XG5cdCAqIFx0XHRjb25zdHJ1Y3RvciAoYmFzZVVybDogc3RyaW5nLCBjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQgPSBudWxsLCBkYjogYW55ID0gbnVsbClcblx0ICogXHRcdHtcblx0ICogXHRcdFx0c3VwZXIoYmFzZVVybCwgY29ubmVjdGlvbiwgZGIpO1xuXHQgKiBcblx0ICogXHRcdFx0Ly8gQ3JlYXRlcyB0aGUgcm91dGUgaHR0cDovLzEyNy4wLjAuMTo4MDgwL3YxL2hlbGxvX3dvcmxkL1xuXHQgKiBcdFx0XHR0aGlzLmFkZFJvdXRlIChuZXcgRXhhbXBsZVJvdXRlICh0aGlzKSk7XG5cdCAqIFx0XHR9XG5cdCAqIH1cblx0ICogXG5cdCAqIGNsYXNzIEV4YW1wbGVSb3V0ZSBleHRlbmRzIEhvdFJvdXRlXG5cdCAqIHtcblx0ICogXHRcdGNvbnN0cnVjdG9yIChhcGk6IEFwcEFQSSlcblx0ICogXHRcdHtcblx0ICogXHRcdFx0c3VwZXIgKGFwaS5jb25uZWN0aW9uLCBcImhlbGxvX3dvcmxkXCIpO1xuXHQgKiBcblx0ICogXHRcdFx0Ly8gQ3JlYXRlcyB0aGUgSFRUUCBHRVQgZW5kcG9pbnQ6IGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC92MS9oZWxsb193b3JsZC9oaVxuXHQgKiBcdFx0XHQvLyBXaGVuIHRoaXMgZW5kcG9pbnQgaXMgYWNjZXNzZWQsIHRoZSBKU09OIHJlc3BvbnNlIHdpbGwgcmV0dXJuIFwiaGVsbG9cIlxuXHQgKiBcdFx0XHR0aGlzLmFkZE1ldGhvZCAoXCJoaVwiLCBhc3luYyAoKSA9PlxuXHQgKiBcdFx0XHR7XG5cdCAqIFx0XHRcdFx0cmV0dXJuIChcImhlbGxvXCIpO1xuXHQgKiBcdFx0XHR9KTtcblx0ICogXHRcdH1cblx0ICogfVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIEluIHRoZSBjbGllbnQgYnJvd3NlciwgdGhpcyB3b3VsZCBiZSB1c2VkIGxpa2Ugc286XG5cdCAqIGBgYFxuXHQgKiBhd2FpdCBIb3QuQVBJLmhlbGxvX3dvcmxkLmhpICgpO1xuXHQgKiBgYGBcblx0ICogXG5cdCAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gYWRkLiBDYW4gYmUgZWl0aGVyIGEgZnVsbCBIb3RSb3V0ZSBvYmplY3QsIG9yIGp1c3QgXG5cdCAqIHRoZSByb3V0ZSdzIG5hbWUuIElmIGEgSG90Um91dGUgb2JqZWN0IGlzIHN1cHBsaWVkLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBcblx0ICogd2lsbCBiZSBpZ25vcmVkLlxuXHQgKiBAcGFyYW0gcm91dGVNZXRob2QgVGhlIHJvdXRlJ3MgbWV0aG9kIHRvIGFkZC4gSWYgdGhlIHJvdXRlIHBhcmFtZXRlciBpcyBhIHN0cmluZywgXG5cdCAqIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIHJvdXRlJ3MgbmFtZSwgYW5kIHRoaXMgd2lsbCBiZSB0aGUgbWV0aG9kIGFkZGVkIHRvIFxuXHQgKiB0aGUgbmV3IHJvdXRlLlxuXHQgKiBAcGFyYW0gZXhlY3V0ZUZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gcm91dGVNZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBBUEkuXG5cdCAqL1xuXHRhZGRSb3V0ZSAoXG5cdFx0cm91dGU6IEhvdFJvdXRlIHwgc3RyaW5nLFxuXHRcdHJvdXRlTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCB8IHN0cmluZyA9IG51bGwsXG5cdFx0ZXhlY3V0ZUZ1bmN0aW9uOiAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KSA9PiBQcm9taXNlPGFueT4gPSBudWxsXG5cdFx0KTogdm9pZFxuXHR7XG5cdFx0bGV0IHJvdXRlTmFtZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0eXBlb2YgKHJvdXRlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRyb3V0ZU5hbWUgPSByb3V0ZTtcblxuXHRcdFx0aWYgKHRoaXMucm91dGVzW3JvdXRlTmFtZV0gPT0gbnVsbClcblx0XHRcdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXSA9IG5ldyBIb3RSb3V0ZSAodGhpcy5jb25uZWN0aW9uLCByb3V0ZU5hbWUpO1xuXG5cdFx0XHRpZiAodHlwZW9mIChyb3V0ZU1ldGhvZCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChuZXcgSG90Um91dGVNZXRob2QgKFxuXHRcdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0sIHJvdXRlTWV0aG9kLCBleGVjdXRlRnVuY3Rpb24pKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5hZGRNZXRob2QgKHJvdXRlTWV0aG9kKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHJvdXRlTmFtZSA9IHJvdXRlLnJvdXRlO1xuXHRcdFx0dGhpcy5yb3V0ZXNbcm91dGUucm91dGVdID0gcm91dGU7XG5cdFx0fVxuXG5cdFx0dGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5jb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSByb3V0ZSBmdW5jdGlvbnMgZm9yIHRoZSBzZXJ2ZXIvY2xpZW50LlxuXHRcdGlmICh0aGlzLmNyZWF0ZUZ1bmN0aW9ucyA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRsZXQgbmV3Um91dGU6IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB0aGlzW3JvdXRlTmFtZV07XG5cblx0XHRcdGlmIChuZXdSb3V0ZSA9PSBudWxsKVxuXHRcdFx0XHRuZXdSb3V0ZSA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMucm91dGVzW3JvdXRlTmFtZV0ubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGN1cnJlbnRSb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdO1xuXHRcdFx0XHRsZXQgbmV3Um91dGVNZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gdGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5tZXRob2RzW2lJZHhdO1xuXG5cdFx0XHRcdC8qXG5cdFx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyBBIEhUVFAgY2FsbCBpcyBtdWNoIG1vcmUgcHJlZmVyYWJsZSwgXG5cdFx0XHRcdC8vLyBlc3BlY2lhbGx5IGZvciBhY2NydWF0ZSB0ZXN0aW5nLlxuXHRcdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uIGluc3RhbmNlb2YgSG90U2VydmVyKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vblNlcnZlckV4ZWN1dGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSovXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdC8vLyBAZml4bWUgSXMgb25DbGllbnRFeGVjdXRlIG5lY2Vzc2FyeT8gSSdtIHRoaW5raW5nIHRoZSBkZXYgY2FuIGp1c3Qgc2ltcGx5IGNyZWF0ZSBcblx0XHRcdFx0XHQvLy8gdGhlaXIgb3duIGZ1bmN0aW9uIHRvIGNhbGwuXG5cdFx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSBuZXdSb3V0ZU1ldGhvZC5vbkNsaWVudEV4ZWN1dGU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHsqL1xuXHRcdFx0XHRcdFx0bmV3Um91dGVbbmV3Um91dGVNZXRob2QubmFtZV0gPSAoZGF0YTogYW55LCBmaWxlczogYW55KTogYW55ID0+XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaHR0cE1ldGhvZDogc3RyaW5nID0gbmV3Um91dGVNZXRob2QudHlwZTtcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25zdHJ1Y3QgdGhlIHVybCBoZXJlLiBCYXNlICsgcm91dGUgKyByb3V0ZSBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVTdHI6IHN0cmluZyA9IG5ld1JvdXRlTWV0aG9kLmdldFJvdXRlVXJsICgpO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhdXRoQ3JlZGVudGlhbHM6IGFueSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBHZXR0aW5nIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIGZyb20gdGhlIEFQSSBpcyB0aGUgbG93ZXN0IFxuXHRcdFx0XHRcdFx0XHRcdC8vIHByaW9yaXR5IGZvciBnZXR0aW5nIGNyZWRlbnRpYWxzLiBUaGUgcHJpb3JpdGllcyBhcmUgaW4gdGhpcyBvcmRlcjogXG5cdFx0XHRcdFx0XHRcdFx0Ly8gMS4gSG90Um91dGVNZXRob2Rcblx0XHRcdFx0XHRcdFx0XHQvLyAyLiBIb3RSb3V0ZVxuXHRcdFx0XHRcdFx0XHRcdC8vIDMuIEhvdEFQSVxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gdGhpcy5hdXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzLiBQcmlvcml0aXplIHRoZW0gd2hlbiB0aGV5J3JlIFxuXHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBtZXRob2QuIE9ubHkgYWRkIHRoZSBvbmVzIGZyb20gdGhlIHJvdXRlIGlmIHRoZSBvbmVzIGZyb20gXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIG1ldGhvZCBhcmUgbWlzc2luZy5cblx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSBuZXdSb3V0ZU1ldGhvZC5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5yb3V0ZS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gbmV3Um91dGVNZXRob2Qucm91dGUuYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhdXRoQ3JlZGVudGlhbHMgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChIb3QpICE9PSBcInVuZGVmaW5lZFwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QuQVBJW2N1cnJlbnRSb3V0ZS5yb3V0ZV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSVtjdXJyZW50Um91dGUucm91dGVdLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IEhvdC5BUElbY3VycmVudFJvdXRlLnJvdXRlXS5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIHRoZSBkYXRhIGJlaW5nIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gYXV0aENyZWRlbnRpYWxzKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYXV0aENyZWRlbnRpYWw6IGFueSA9IGF1dGhDcmVkZW50aWFsc1trZXldO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERvIG5vdCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGtleXMgaW4gdGhlIGRhdGEgYWJvdXQgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRvIGJlIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhW2tleV0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW2tleV0gPSBhdXRoQ3JlZGVudGlhbDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgYXJnczogYW55W10gPSBbcm91dGVTdHIsIGRhdGEsIGh0dHBNZXRob2QsIGZpbGVzXTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAodGhpcy5tYWtlQ2FsbC5hcHBseSAodGhpcywgYXJncykpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdC8vfVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHRoaXNbcm91dGVOYW1lXSA9IG5ld1JvdXRlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIHJvdXRlIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGUgKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVnaXN0ZXJSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGFsbCByb3V0ZXMgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZXMgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnJvdXRlcylcblx0XHR7XG5cdFx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5yb3V0ZXNba2V5XTtcblxuXHRcdFx0YXdhaXQgdGhpcy5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBjYWxsIHRvIHRoZSBBUEkuXG5cdCAqL1xuXHRhc3luYyBtYWtlQ2FsbCAocm91dGU6IHN0cmluZywgZGF0YTogYW55LCBodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRjb25zdCBodHRwTWV0aG9kU3RyOiBzdHJpbmcgPSBodHRwTWV0aG9kLnRvVXBwZXJDYXNlICgpO1xuXG5cdFx0aWYgKHVybFsodXJsLmxlbmd0aCAtIDEpXSA9PT0gXCIvXCIpXG5cdFx0XHR1cmwgPSB1cmwuc3Vic3RyICgwLCAodXJsLmxlbmd0aCAtIDEpKTtcblxuXHRcdGlmIChyb3V0ZVswXSAhPT0gXCIvXCIpXG5cdFx0XHR1cmwgKz0gXCIvXCI7XG5cblx0XHR1cmwgKz0gcm91dGU7XG5cblx0XHRjb25zdCBudW1GaWxlczogbnVtYmVyID0gT2JqZWN0LmtleXMgKGZpbGVzKS5sZW5ndGg7XG5cblx0XHRpZiAobnVtRmlsZXMgPiAwKVxuXHRcdHtcblx0XHRcdGlmIChodHRwTWV0aG9kU3RyICE9PSBcIlBPU1RcIilcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVG8gdXBsb2FkIGZpbGVzLCB5b3UgbXVzdCBzZXQgdGhlIGh0dHBNZXRob2QgdG8gUE9TVC5gKTtcblxuXHRcdFx0Y29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhICgpO1xuXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gZmlsZXMpXG5cdFx0XHRcdGZvcm1EYXRhLmFwcGVuZCAoa2V5LCBmaWxlc1trZXldKTtcblxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRib2R5OiBmb3JtRGF0YVxuXHRcdFx0XHR9KTtcblx0XHRcdGxldCBqc29uUmVzOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0aWYgKGRhdGFbXCJob3RzdGFxXCJdID09IG51bGwpXG5cdFx0XHRcdGRhdGFbXCJob3RzdGFxXCJdID0ge307XG5cblx0XHRcdGlmIChkYXRhW1wiaG90c3RhcVwiXVtcInVwbG9hZHNcIl0gPT0gbnVsbClcblx0XHRcdFx0ZGF0YVtcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdID0ge307XG5cblx0XHRcdGRhdGFbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXVtcInVwbG9hZElkXCJdID0gXG5cdFx0XHRcdFx0anNvblJlc1tcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdW1widXBsb2FkSWRcIl07XG5cblx0XHRcdC8vIEFmdGVyIHRoZSB1cGxvYWQsIG1ha2UgdGhlIGFjdHVhbCBKU09OIGNhbGwuIERvIG5vdCBwYXNzIGZpbGVzIGFnYWluLlxuXHRcdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLm1ha2VDYWxsIChyb3V0ZSwgZGF0YSwgaHR0cE1ldGhvZCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRsZXQgZmV0Y2hPYmo6IGFueSA9IHtcblx0XHRcdFx0bWV0aG9kOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICgoaHR0cE1ldGhvZFN0ciAhPT0gXCJHRVRcIikgJiYgXG5cdFx0XHQoaHR0cE1ldGhvZFN0ciAhPT0gXCJIRUFEXCIpKVxuXHRcdHtcblx0XHRcdGZldGNoT2JqW1wiYm9keVwiXSA9IEpTT04uc3RyaW5naWZ5IChkYXRhKTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PiBcblx0XHRcdHtcblx0XHRcdFx0ZmV0Y2ggKHVybCwgZmV0Y2hPYmopLnRoZW4gKGFzeW5jIChyZXMpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmVzLmpzb24gKCkudGhlbiAoKGpzb25PYmo6IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUgKGpzb25PYmopO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2ggKChyZWFzb246IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7dXJsfTogJHtyZWFzb24ubWVzc2FnZX1gKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2ggKChyZWFzb246IGFueSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3VybH06ICR7cmVhc29uLm1lc3NhZ2V9YCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocHJvbWlzZSk7XG5cdH1cbn1cbiIsIi8qKlxuICogQW4gYXNzZXQgdG8gbG9hZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdEFzc2V0XG57XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBhc3NldC4gQ2FuIGJlOlxuXHQgKiAqIGpzXG5cdCAqICogY3NzXG5cdCAqICogaHRtbFxuXHQgKiAqIGNvbXBvbmVudFxuXHQgKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGFzc2V0IHRvIGxvYWQuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGFzc2V0cyB0byBsb2FkLlxuXHQgKi9cblx0cGF0aD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwcmVsb2FkZWQgY29udGVudCB0byBsb2FkLiBSZXF1aXJlcyBuYW1lIHRvIGJlIHNldC5cblx0ICovXG5cdGNvbnRlbnQ/OiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nID0gXCJcIilcblx0e1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLnBhdGggPSBcIlwiO1xuXHRcdHRoaXMuY29udGVudCA9IFwiXCI7XG5cdH1cblxuXHRsb2FkICgpOiB2b2lkXG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHRoZSBhc3NldC5cblx0ICovXG5cdG91dHB1dCAoKTogc3RyaW5nIHwgeyBuYW1lOiBzdHJpbmc7IHVybD86IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgfVxuXHR7XG5cdFx0aWYgKCh0aGlzLnBhdGggPT0gbnVsbCkgJiYgKHRoaXMuY29udGVudCA9PSBudWxsKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdEFzc2V0ICR7dGhpcy5uYW1lfSBvZiB0eXBlICR7dGhpcy50eXBlfSBkb2VzIG5vdCBoYXZlIGEgcGF0aCBvciBjb250ZW50IHNldCFgKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyB1cmw/OiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IH0gPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMucGF0aCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLnBhdGggIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwianNcIilcblx0XHRcdFx0XHRvdXRwdXQgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7dGhpcy5wYXRofVwiPjwvc2NyaXB0PmA7XG5cblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJjc3NcIilcblx0XHRcdFx0XHRvdXRwdXQgPSBgPGxpbmsgaHJlZiA9IFwiJHt0aGlzLnBhdGh9XCIgcmVsID0gXCJzdHlsZXNoZWV0XCIgLz5gO1xuXG5cdFx0XHRcdGlmICgodGhpcy50eXBlID09PSBcImh0bWxcIikgfHwgXG5cdFx0XHRcdFx0KHRoaXMudHlwZSA9PT0gXCJjb21wb25lbnRcIikpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBhbiBIVE1MIG9yIGNvbXBvbmVudCBhc3NldCByZXF1aXJlcyBhIG5hbWUgdG8gYmUgc2V0IWApO1xuXG5cdFx0XHRcdFx0bGV0IGZpbGVVcmw6IHN0cmluZyA9IGBcIiR7dGhpcy5wYXRofVwiYDtcblx0XHRcdFx0XHRvdXRwdXQgPSB7IG5hbWU6IHRoaXMubmFtZSwgdXJsOiB0aGlzLnBhdGggfTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbnRlbnQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb250ZW50ICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImpzXCIpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBKUyBhc3NldHMgdXNpbmcgY29udGVudCBpcyBub3Qgc3VwcG9ydGVkIHlldCFgKTtcblxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNzc1wiKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYExvYWRpbmcgQ1NTIGFzc2V0cyB1c2luZyBjb250ZW50IGlzIG5vdCBzdXBwb3J0ZWQgeWV0IWApO1xuXG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiaHRtbFwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYExvYWRpbmcgYW4gSFRNTCBhc3NldCByZXF1aXJlcyBhIG5hbWUgdG8gYmUgc2V0IWApO1xuXG5cdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAodGhpcy5jb250ZW50KTtcblx0XHRcdFx0XHRsZXQgZmlsZVVybDogc3RyaW5nID0gdGhpcy5wYXRoO1xuXHRcdFx0XHRcdGxldCBmaWxlQ29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdC8vIEZpbmQgYW55IHNjcmlwdCB0YWdzIGFuZCBpbnRlcnJ1cHQgdGhlbSBzbyB0aGUgSFRNTCBwYXJzZXJzIFxuXHRcdFx0XHRcdC8vIGRvbid0IGdldCBjb25mdXNlZC5cblx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKFwiXFxcXDxzY3JpcHRcIiwgXCJnbWlcIiksIFwiPHNjclxcXCIgKyBcXFwiaXB0XCIpO1xuXHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoXCJcXFxcPFxcXFwvc2NyaXB0XCIsIFwiZ21pXCIpLCBcIjwvc2NyXFxcIiArIFxcXCJpcHRcIik7XG5cblx0XHRcdFx0XHRmaWxlQ29udGVudCA9IGVzY2FwZWRDb250ZW50O1xuXG5cdFx0XHRcdFx0b3V0cHV0ID0geyBuYW1lOiB0aGlzLm5hbWUsIHVybDogZmlsZVVybCwgY29udGVudDogZXNjYXBlZENvbnRlbnQgfTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxufSIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFNlcnZlclR5cGUgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIEEgY2xpZW50IGNvbm5lY3RlZCB0byBhIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdENsaWVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBBUEkgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyQVBJOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG5cdCAqL1xuXHR0eXBlOiBIb3RTZXJ2ZXJUeXBlO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXG5cdGNvbnN0cnVjdG9yIChwcm9jZXNzb3I6IEhvdFN0YXEpXG5cdHtcblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0dGhpcy50ZXN0ZXJBUEkgPSBudWxsO1xuXHRcdHRoaXMudHlwZSA9IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90Q29tcG9uZW50T3V0cHV0XG57XG5cdC8qKlxuXHQgKiBUaGUgSFRNTCB0byBvdXRwdXQuXG5cdCAqL1xuXHRodG1sOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcXVlcnkgc2VsZWN0b3IgdG8gYWRkIHRoaXMgY29tcG9uZW50J3MgZnVuY3Rpb25zIHRvLlxuXHQgKiBcblx0ICogQGV4YW1wbGUgI29iamVjdElkXG5cdCAqL1xuXHRhZGRGdW5jdGlvbnNUbz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwbGFjZSBoZXJlIHBhcmVudCBuYW1lIHRvIGF0dGFjaCB0aGlzIGh0bWwgdG8uXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSB0b3Bcblx0ICovXG5cdHBsYWNlSGVyZVBhcmVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIEFwcGVuZCB0aGUgb3V0cHV0IHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IgdGhhdCBpcyBcblx0ICogdGhlIGNsb3Nlc3QuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSBkaXYgLnRlc3RDbGFzc1xuXHQgKi9cblx0Y2xvc2VzdFNlbGVjdG9yPzogc3RyaW5nO1xuXHQvKipcblx0ICogQXBwZW5kIHRoZSBvdXRwdXQgdG8gYW4gZXhpc3RpbmcgZWxlbWVudCBzb21ld2hlcmUgb24gdGhlIGRvY3VtZW50LlxuXHQgKiBcblx0ICogQGV4YW1wbGUgZGl2IC50ZXN0Q2xhc3Ncblx0ICovXG5cdGRvY3VtZW50U2VsZWN0b3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIEhUTUxFbGVtZW50cy5cblx0ICovXG5cdGh0bWxFbGVtZW50cz86IEhUTUxFbGVtZW50W107XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGFnLlxuXHQgKi9cblx0dGFnPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbm5lY3RlZCBBUEkuXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9ucz86IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucztcblx0LyoqXG5cdCAqIEFueSBleHRyYSBhdHRyaWJ1dGVzIHRvIHJlZ2lzdGVyLlxuXHQgKi9cblx0b2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBjb21wb25lbnQuXG5cdCAqL1xuXHR0eXBlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZT86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBpbm5lciBIVE1MIG9yIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRpbm5lcjogYW55O1xuXHQvKipcblx0ICogVGhlIGV2ZW50cyB0byB0cmlnZ2VyLlxuXHQgKi9cblx0ZXZlbnRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0dHlwZTogc3RyaW5nO1xuXHRcdFx0XHRmdW5jOiBGdW5jdGlvbjtcblx0XHRcdFx0b3B0aW9ucz86IGFueTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBvdXRwdXQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBJZiBzZXQgdG8gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlT3V0cHV0PzogKCkgPT4gYm9vbGVhbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgZ2V0dGluZyB0aGUgb3V0cHV0LCBidXQgYmVmb3JlIHRoZSBET00gcGFyc2luZy5cblx0ICogXG5cdCAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgbGFzdCB0aW1lIHByaW9yIHRvIFxuXHQgKiBiZWluZyBwYXJzZWQgaW50byBhIERPTSBlbGVtZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIG91dHB1dCB0byBiZSBwYXJzZWQgYXMgYSBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUG9zdE91dHB1dD86IChvdXRwdXQ6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSkpID0+IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSk7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHdoZW4gaXRzIHRpbWUgdG8gZml4IHRoZSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIHdpbGwgc2tpcCB0aGUgSG90U3RhcSBkZWZhdWx0IGZpeGluZy5cblx0ICovXG5cdG9uRml4SFRNTD86IChvdXRwdXQ6IHN0cmluZykgPT4geyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgY3VzdG9tIERPTSBwYXJzZXIuXG5cdCAqL1xuXHRvblBhcnNlRE9NPzogKG91dHB1dDogc3RyaW5nKSA9PiBEb2N1bWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBwYXJzZWQgYW5kIGlzIHJlYWR5IHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBET00uXG5cdCAqL1xuXHRvblBhcnNlZD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblByZVBsYWNlPzogKGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBmaW5hbCB0aW1lIHByaW9yIHRvIGJlaW5nIHJlbmRlcmVkLlxuXHQgKi9cblx0b25Qb3N0UGxhY2U/OiAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBET00gZWxlbWVudCBvbnRvIHRoZSBuZXdseSBjcmVhdGVkIHBhcmVudC5cblx0ICovXG5cdG9uUGFyZW50UGxhY2U/OiAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdENvbXBvbmVudCBpbXBsZW1lbnRzIElIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgSFRNTEVsZW1lbnRzLlxuXHQgKi9cblx0aHRtbEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcuXG5cdCAqL1xuXHR0YWc6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb25uZWN0ZWQgQVBJLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zO1xuXHQvKipcblx0ICogQW55IGV4dHJhIGF0dHJpYnV0ZXMgdG8gcmVnaXN0ZXIuXG5cdCAqL1xuXHRvYnNlcnZlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgY29tcG9uZW50LlxuXHQgKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXHQvKipcblx0ICogVGhlIGlubmVyIEhUTUwgb3IgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdGlubmVyOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXZlbnRzIHRvIHRyaWdnZXIuXG5cdCAqL1xuXHRldmVudHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHR0eXBlOiBzdHJpbmc7XG5cdFx0XHRcdGZ1bmM6IEZ1bmN0aW9uO1xuXHRcdFx0XHRvcHRpb25zOiBhbnk7XG5cdFx0XHR9XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gb3V0cHV0LlxuXHQgKiBcblx0ICogQHJldHVybnMgSWYgc2V0IHRvIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZU91dHB1dD8gKCk6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIGdldHRpbmcgdGhlIG91dHB1dCwgYnV0IGJlZm9yZSB0aGUgRE9NIHBhcnNpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyLiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGxhc3QgdGltZSBwcmlvciB0byBcblx0ICogYmVpbmcgcGFyc2VkIGludG8gYSBET00gZWxlbWVudC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBmaW5hbCBvdXRwdXQgdG8gYmUgcGFyc2VkIGFzIGEgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblBvc3RPdXRwdXQ/IChvdXRwdXQ6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSkpOiAoc3RyaW5nIHwgSG90Q29tcG9uZW50T3V0cHV0W10pO1xuXHQvKipcblx0ICogRXhlY3V0ZSB3aGVuIGl0cyB0aW1lIHRvIGZpeCB0aGUgSFRNTCBwcmlvciB0byBET00gcGFyc2luZy4gVGhpcyB3aWxsIHNraXAgdGhlIEhvdFN0YXEgZGVmYXVsdCBmaXhpbmcuXG5cdCAqL1xuXHRvbkZpeEhUTUw/IChvdXRwdXQ6IHN0cmluZyk6IHsgZml4ZWRTdHI6IHN0cmluZywgcXVlcnlTZWxlY3Rvcjogc3RyaW5nOyB9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhIGN1c3RvbSBET00gcGFyc2VyLlxuXHQgKi9cblx0b25QYXJzZURPTT8gKG91dHB1dDogc3RyaW5nKTogRG9jdW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHRoZSBvdXRwdXQgaGFzIGJlZW4gcGFyc2VkIGFuZCBpcyByZWFkeSB0byBiZSBwbGFjZWQgaW50byB0aGUgRE9NLlxuXHQgKi9cblx0b25QYXJzZWQ/IChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZztcblx0LyoqXG5cdCAqIEV4ZWN1dGUgcHJpb3IgdG8gcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25QcmVQbGFjZT8gKGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgZmluYWwgdGltZSBwcmlvciB0byBiZWluZyByZW5kZXJlZC5cblx0ICovXG5cdG9uUG9zdFBsYWNlPyAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgRE9NIGVsZW1lbnQgb250byB0aGUgbmV3bHkgY3JlYXRlZCBwYXJlbnQuXG5cdCAqL1xuXHRvblBhcmVudFBsYWNlPyAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKChjb3B5IGluc3RhbmNlb2YgSG90U3RhcSkgfHwgKGNvcHkgPT0gbnVsbCkpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5odG1sRWxlbWVudHMgPSBbXTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRhZyA9IFwiXCI7XG5cdFx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0XHR0aGlzLmVsZW1lbnRPcHRpb25zID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXMgPSBbXTtcblx0XHRcdHRoaXMudHlwZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHRoaXMuaW5uZXIgPSBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weS5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLmh0bWxFbGVtZW50cyA9IGNvcHkuaHRtbEVsZW1lbnRzIHx8IFtdO1xuXHRcdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRhZyA9IGNvcHkudGFnIHx8IHRoaXMubmFtZTtcblx0XHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHRcdHRoaXMuZWxlbWVudE9wdGlvbnMgPSBjb3B5LmVsZW1lbnRPcHRpb25zIHx8IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMub2JzZXJ2ZWRBdHRyaWJ1dGVzID0gY29weS5vYnNlcnZlZEF0dHJpYnV0ZXMgfHwgW107XG5cdFx0XHR0aGlzLnR5cGUgPSBjb3B5LnR5cGUgfHwgXCJcIjtcblx0XHRcdHRoaXMudmFsdWUgPSBjb3B5LnZhbHVlIHx8IG51bGw7XG5cdFx0XHR0aGlzLmlubmVyID0gY29weS5pbm5lciB8fCBudWxsO1xuXHRcdFx0dGhpcy5ldmVudHMgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoYXBpICE9IG51bGwpXG5cdFx0XHR0aGlzLmFwaSA9IGFwaTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmVudCB0aGF0J3MgY2FsbGVkIHdoZW4gdGhpcyBjb21wb25lbnQncyBET00gZWxlbWVudCBoYXMgYmVlbiBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25DcmVhdGVkIChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueVxuXHR7XG5cdFx0cmV0dXJuIChlbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgdGhlIGF0dHJpYnV0ZXMgbWFudWFsbHkuXG5cdCAqL1xuXHRoYW5kbGVBdHRyaWJ1dGVzPyAoYXR0cmlidXRlczogTmFtZWROb2RlTWFwKTogdm9pZDtcblxuXHQvKipcblx0ICogSGFuZGxlIGEgY2xpY2sgZXZlbnQuXG5cdCAqL1xuXHRjbGljaz8gKCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0YWJzdHJhY3Qgb3V0cHV0ICgpOiBzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXTtcbn0iLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5cbmltcG9ydCB7IERldmVsb3Blck1vZGUsIEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcblxuLyoqXG4gKiBBIGZpbGUgdG8gcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90RmlsZVxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCBwYWdlLlxuXHQgKi9cblx0cGFnZT86IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIGdldC5cblx0ICovXG5cdGxvY2FsRmlsZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9ycz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyc2VyIG9wdGlvbnMgZm9yIHdoZW4gcHJvY2Vzc2luZyBhIHN0cmluZyBvciBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlck9wdGlvbnNcbntcblx0LyoqXG5cdCAqIE91dHB1dCB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGZyb20gcHJvY2Vzc2luZy4gRGVmYXVsdDogdHJ1ZVxuXHQgKi9cblx0b3V0cHV0Q29tbWFuZHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogQWxsb3cgSlNPTi5zdHJpbmdpZnkgdG8gYmUgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy4gRGVmYXVsdDogdHJ1ZVxuXHQgKi9cblx0YWxsb3dTdHJpbmdpZnk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgZmlsZSB0byBwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgSG90RmlsZSBpbXBsZW1lbnRzIElIb3RGaWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0bG9jYWxGaWxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Y29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9yczogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdEZpbGUgPSB7fSlcblx0e1xuXHRcdHRoaXMucGFnZSA9IGNvcHkucGFnZSB8fCBudWxsO1xuXHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdHRoaXMudXJsID0gY29weS51cmwgfHwgXCJcIjtcblx0XHR0aGlzLmxvY2FsRmlsZSA9IGNvcHkubG9jYWxGaWxlIHx8IFwiXCI7XG5cdFx0dGhpcy5jb250ZW50ID0gY29weS5jb250ZW50IHx8IFwiXCI7XG5cdFx0dGhpcy50aHJvd0FsbEVycm9ycyA9IGNvcHkudGhyb3dBbGxFcnJvcnMgfHwgZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdHNldENvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWRcblx0e1xuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdGdldENvbnRlbnQgKCk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuICh0aGlzLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIGdldCByZXF1ZXN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGh0dHBHZXQgKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgcmVzID0gYXdhaXQgZmV0Y2ggKHVybCk7XG5cblx0XHRcdGlmIChyZXMub2sgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGAke3Jlcy5zdGF0dXN9OiAke3Jlcy5zdGF0dXNUZXh0fWApO1xuXG5cdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgcmVzLnRleHQgKCk7XG5cblx0XHRcdHJldHVybiAoY29udGVudCk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRyZXR1cm4gKEpTT04uc3RyaW5naWZ5ICh7IFwiZXJyb3JcIjogYCR7ZXgubWVzc2FnZX0gLSBDb3VsZCBub3QgZmV0Y2ggJHt1cmx9YCB9KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgY29udGVudCBmcm9tIGEgdXJsLlxuXHQgKi9cblx0YXN5bmMgbG9hZFVybCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0aGlzLmNvbnRlbnQgPSBhd2FpdCBIb3RGaWxlLmh0dHBHZXQgKHRoaXMudXJsKTtcblxuXHRcdHJldHVybiAodGhpcy5jb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGNvbnRlbnQgZnJvbSBhIGxvY2FsIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkTG9jYWxGaWxlICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBuZXcgUHJvbWlzZSAoXG5cdFx0XHQocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSk6IHZvaWQgPT5cblx0XHRcdHtcblx0XHRcdFx0ZnMucmVhZEZpbGUgKHRoaXMubG9jYWxGaWxlLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24sIGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZXJyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IGVycjtcblxuXHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcgKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXNvbHZlICh0aGlzLmNvbnRlbnQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gKHByb21pc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLnVybCAhPT0gXCJcIilcblx0XHRcdGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRVcmwgKCk7XG5cblx0XHRpZiAodGhpcy5sb2NhbEZpbGUgIT09IFwiXCIpXG5cdFx0XHRjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkTG9jYWxGaWxlICgpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHN0cmluZyBjb250ZW50LiBUaGlzIHdpbGwgdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gY29udGVudFJlZ2V4IFRoZSByZWdleCB0byB1c2UgdG8gcGFyc2UgdGhlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBjb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIGluc2lkZSB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBvZmZDb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIFxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tRW5kIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIFxuXHQgKiB0aGUgZm91bmQgY29udGVudC5cblx0ICovXG5cdHN0YXRpYyBwcm9jZXNzQ29udGVudCAoY29udGVudDogc3RyaW5nLCBjb250ZW50UmVnZXg6IFJlZ0V4cCxcblx0XHRjb250ZW50UHJvY2Vzc29yOiAocmVnZXhGb3VuZDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0b2ZmQ29udGVudFByb2Nlc3NvcjogKG9mZkNvbnRlbnQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG51bVJlbW92ZUZyb21CZWdpbm5pbmc6IG51bWJlciA9IDIsXG5cdFx0bnVtUmVtb3ZlRnJvbUVuZDogbnVtYmVyID0gMik6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHJlc3VsdDogUmVnRXhwRXhlY0FycmF5ID0gY29udGVudFJlZ2V4LmV4ZWMgKGNvbnRlbnQpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR3aGlsZSAocmVzdWx0ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHN0YXJ0OiBudW1iZXIgPSByZXN1bHQuaW5kZXggLSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nO1xuXHRcdFx0bGV0IGVuZDogbnVtYmVyID0gY29udGVudFJlZ2V4Lmxhc3RJbmRleCArIG51bVJlbW92ZUZyb21FbmQ7XG5cblx0XHRcdC8vIEdldCB0aGUgcHJldmlvdXMgc2VjdGlvbi5cblx0XHRcdGxldCBwcmV2Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChzdGFydCAtIHByZXZpb3VzSW5kZXgpKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQ7XG5cblx0XHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChwcmV2Q29udGVudCk7XG5cblx0XHRcdC8vIFByb2Nlc3MgdGhlIGNvbnRlbnQgZm91bmQgZnJvbSB0aGUgcmVnZXhcblx0XHRcdGxldCBjb250ZW50Rm91bmQ6IHN0cmluZyA9IHJlc3VsdFswXTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChjb250ZW50Rm91bmQpO1xuXG5cdFx0XHQvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IHNlY3Rpb24gdG8gcGFyc2UuXG5cdFx0XHRyZXN1bHQgPSBjb250ZW50UmVnZXguZXhlYyAoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwZW5kIHdoYXRldmVyIGVsc2UgaXMgYWZ0ZXIgdGhlIGxhc3QgcGFyc2VkIHNlY3Rpb24uXG5cdFx0bGV0IGxhc3RDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCk7XG5cblx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAobGFzdENvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW55IGNvbnRlbnQgdGhhdCBjb3VsZCBoYXZlIG5lc3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBcblx0ICogdGFrZSBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgXG5cdCAqIHBhcnNlIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSByZWdleC4gV2hlbiB0aGUgcmVnZXggY29udGVudCBpcyBmb3VuZCBcblx0ICogY29udGVudFByb2Nlc3NvciB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHJlZ2V4IGNvbnRlbnQgZm91bmQuIFdoZW4gXG5cdCAqIHRoZSByZWdleCBjb250ZW50IGlzIG5vdCBmb3VuZCwgb2ZmQ29udGVudFByb2Nlc3NvciB3aWxsIGJlIGNhbGxlZCB3aXRoIFxuXHQgKiB0aGUgY29udGVudCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogXG5cdCAqIEBmaXhtZSBOZWVkcyB0byBiZSBhYmxlIHRvIGlnbm9yZSBhbnkgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUgY29tbWVudHMgXG5cdCAqIG9yIGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBpcyB1c2VkIGBgYCR7XCJUZXN0IH1cIn1gYGAgSXQgXG5cdCAqIHdpbGwgZXJyb3Igb3V0LlxuXHQgKiBcblx0ICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gcGFyc2UuXG5cdCAqIEBwYXJhbSBjb250ZW50UmVnZXggVGhlIHJlZ2V4IHRvIHVzZSB0byBwYXJzZSB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NOZXN0ZWRDb250ZW50IChjb250ZW50OiBzdHJpbmcsIHN0YXJ0Q2hhcnM6IHN0cmluZywgZW5kQ2hhcnM6IHN0cmluZywgXG5cdFx0dHJpZ2dlckNoYXI6IHN0cmluZywgY29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG9mZkNvbnRlbnRQcm9jZXNzb3I6IChvZmZDb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRudW1SZW1vdmVGcm9tQmVnaW5uaW5nOiBudW1iZXIgPSAyLFxuXHRcdG51bVJlbW92ZUZyb21FbmQ6IG51bWJlciA9IDEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoc3RhcnRDaGFycyk7XG5cdFx0bGV0IHByZXZpb3VzSW5kZXg6IG51bWJlciA9IDA7XG5cdFx0bGV0IHN0YXJ0VHJpZ2dlclBvczogbnVtYmVyID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0d2hpbGUgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdGxldCBlbmQ6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIHBvcyk7XG5cdFx0XHRsZXQgbmVzdGVkQ291bnRlcjogbnVtYmVyID0gMDtcblxuXHRcdFx0aWYgKHRyaWdnZXJDaGFyICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXZlcnNlIHNlYXJjaCB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFxuXHRcdFx0XHQvLyBvY2N1cnJlbmNlcy5cblx0XHRcdFx0bGV0IHJwb3M6IG51bWJlciA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBlbmQgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHR3aGlsZSAocnBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHJwb3MgPT09IHN0YXJ0VHJpZ2dlclBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0cnBvcyA9IGNvbnRlbnQubGFzdEluZGV4T2YgKHRyaWdnZXJDaGFyLCBycG9zIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlcisrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbmVzdGVkIHRyaWdnZXIgY2hhcmFjdGVycywgZ2V0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXG5cdFx0XHQvLyB0aGUgZW5kIGNoYXJhY3Rlci5cblx0XHRcdGlmIChuZXN0ZWRDb3VudGVyID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGVwb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRsZXQgdGVtcGVwb3M6IG51bWJlciA9IGVwb3M7XG5cblx0XHRcdFx0d2hpbGUgKChlcG9zID4gLTEpICYmIChuZXN0ZWRDb3VudGVyID4gMCkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGVtcGVwb3MgPCAwKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGRpc2NvdmVyaW5nIGVuZENoYXJzIHRoYXQgd2Ugc2hvdWxkbid0IGJlLlxuXHRcdFx0XHRcdGxldCBwb3NPdXRzaWRlT2ZDb250ZW50OiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mIChzdGFydENoYXJzLCB0ZW1wZXBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXG5cdFx0XHRcdFx0aWYgKHBvc091dHNpZGVPZkNvbnRlbnQgPiBlcG9zKVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRlcG9zID0gdGVtcGVwb3M7XG5cblx0XHRcdFx0XHR0ZW1wZXBvcyA9IGNvbnRlbnQuaW5kZXhPZiAoZW5kQ2hhcnMsIGVwb3MgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0XHRuZXN0ZWRDb3VudGVyLS07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlbmQgPSBlcG9zO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb2ZmQ29udGVudFN0cjogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgsIChwb3MgLSBwcmV2aW91c0luZGV4KSk7XG5cdFx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAob2ZmQ29udGVudFN0cik7XG5cblx0XHRcdGxldCBmb3VuZENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChcblx0XHRcdFx0cG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZywgKGVuZCAtIChwb3MgKyBudW1SZW1vdmVGcm9tQmVnaW5uaW5nKSkpO1xuXHRcdFx0b3V0cHV0ICs9IGNvbnRlbnRQcm9jZXNzb3IgKGZvdW5kQ29udGVudCk7XG5cblx0XHRcdC8vIEdldCB0aGUgbmV4dCBjb250ZW50XG5cdFx0XHRwb3MgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMsIGVuZCArIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0c3RhcnRUcmlnZ2VyUG9zID0gY29udGVudC5pbmRleE9mICh0cmlnZ2VyQ2hhciwgcG9zKTtcblx0XHRcdHByZXZpb3VzSW5kZXggPSBlbmQgKyBudW1SZW1vdmVGcm9tRW5kO1xuXHRcdH1cblxuXHRcdC8vIEFwcGVuZCB3aGF0ZXZlciBlbHNlIGlzIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBzZWN0aW9uLlxuXHRcdGxldCBsYXN0Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgpO1xuXG5cdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKGxhc3RDb250ZW50KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBjb250ZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRoaXNDb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gdGhyb3dBbGxFcnJvcnMgSWYgc2V0IHRvIHRydWUsIGFueSBlcnJvciB0aGF0IG9jY3VycyB3aWxsIGJlIHRocm93biBhcyBhbiBleGNlcHRpb24uXG5cdCAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIHBhcnNpbmcgdGhlIGNvbnRlbnQuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VDb250ZW50ICh0aGlzQ29udGVudDogc3RyaW5nLCB0aHJvd0FsbEVycm9yczogYm9vbGVhbiwgcGFyc2VyT3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGlmIChwYXJzZXJPcHRpb25zID09IG51bGwpXG5cdFx0e1xuXHRcdFx0cGFyc2VyT3B0aW9ucyA9IHtcblx0XHRcdFx0XHRvdXRwdXRDb21tYW5kczogdHJ1ZSxcblx0XHRcdFx0XHRhbGxvd1N0cmluZ2lmeTogdHJ1ZVxuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGxldCBTVFJJTkdJRllfU1RBUlQ6IHN0cmluZyA9IFwiSlNPTi5zdHJpbmdpZnkgKFwiO1xuXHRcdGxldCBTVFJJTkdJRllfRU5EOiBzdHJpbmcgPSBcIilcIjtcblxuXHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRTVFJJTkdJRllfU1RBUlQgPSBcIlwiO1xuXHRcdFx0U1RSSU5HSUZZX0VORCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQXNzZW1ibGUgdGhlIEpTIHRvIGV2YWx1YXRlLiBUaGlzIHdpbGwgdGFrZSBhbGwgY29udGVudCBvdXRzaWRlIG9mIFxuXHRcdC8vIDwqIGFuZCAqPiBhbmQgd3JhcCBhIEhvdC5lY2hvIGFyb3VuZCBpdC4gQW55IEpTIGZvdW5kIGluc2lkZSBvZiB0aGUgXG5cdFx0Ly8gPCogYW5kICo+IHdpbGwgYmUgZXhlY3V0ZWQgYXMgaXMuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzQ29udGVudCAodGhpc0NvbnRlbnQsIFxuXHRcdFx0bmV3IFJlZ0V4cCAoXCIoPz1cXFxcPFxcXFwqKShbXFxcXHNcXFxcU10qPykoPz1cXFxcKlxcXFw+KVwiLCBcImdcIiksIFxuXHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0e1xuXHRcdFx0XHQvLyBBIGxpdHRsZSBoYWNrLCBzaW5jZSBJIHN1Y2sgYXQgUmVnZXggOihcblx0XHRcdFx0cmVnZXhGb3VuZCA9IHJlZ2V4Rm91bmQuc3Vic3RyICgyKTtcblxuXHRcdFx0XHRyZXR1cm4gKGAke3JlZ2V4Rm91bmR9YCk7XG5cdFx0XHR9LCBcblx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKG9mZkNvbnRlbnQgPT09IFwiXCIpXG5cdFx0XHRcdFx0cmV0dXJuIChcIlwiKTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0b2ZmQ29udGVudCwgXCIhe1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQyOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0LCBcIlNUUntcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWVjaG9PdXRwdXQgKEpTT04uc3RyaW5naWZ5KCR7cmVnZXhGb3VuZDJ9KSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAISR7U1RSSU5HSUZZX1NUQVJUfSR7cmVnZXhGb3VuZDJ9JHtTVFJJTkdJRllfRU5EfSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9LCA0LCAxKTtcblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQzOiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0MiwgXCIke1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBlc2NhcGVPdXRwdXQgPSAoY29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChjb250ZW50LnJlcGxhY2UoL1tgXS9nLCAnXFxcXGAnKSk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIXRyeSB7IEhvdC5lY2hvICgke3JlZ2V4Rm91bmQyfSk7IH1jYXRjaCAoZXgpe0hvdC5lY2hvIChcXGBcXFxcXFwkeyR7ZXNjYXBlT3V0cHV0IChyZWdleEZvdW5kMil9fVxcYCk7fSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aHJvd0FsbEVycm9ycyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIUhvdC5lY2hvICgke3JlZ2V4Rm91bmQyfSk7KiYhIyVAIUAqIWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhJHtyZWdleEZvdW5kMn0qJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHQvKmxldCBlc2NhcGVkQ29udGVudDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke2VzY2FwZWRDb250ZW50fSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0NDogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHQvLyBBbnkgPygpIHdpbGwgYmUgaWdub3JlZCBpbiBwcm9kdWN0aW9uIG1vZGUuXG5cdFx0XHRcdGlmIChIb3QuTW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVtcE91dHB1dDQgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIj8oXCIsIFwiKVwiLCBcIihcIiwgXG5cdFx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFwiXCIpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoSG90Lk1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NCA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDMsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBmb3VuZFN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCBiZSBwYXJzZWQuIElmIHNvLCBzdHJpbmdpZnkgaXQuXG5cdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZSAocmVnZXhGb3VuZDIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMuYWxsb3dTdHJpbmdpZnkgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IEpTT04uc3RyaW5naWZ5IChyZWdleEZvdW5kMik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBgJHtyZWdleEZvdW5kMn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIElmIHZhbGlkIEpTT04gaXMgbm90IHJlY2VpdmVkLCBkb24ndCB3b3JyeSBhYm91dCBpdCwgcGFzcyBpdCBcblx0XHRcdFx0XHRcdFx0XHQvLyBhbG9uZyB0byB0aGUgZnVuY3Rpb24gYmVsb3cgZm9yIGl0IHRvIGJlIHBhcnNlZCBpbiB0aGUgcGFnZS5cblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gdGhlcmUgaW5zdGVhZC5cblx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IGAke3JlZ2V4Rm91bmQyfWA7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIE1ha2UgdGhpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIGFuZCBwYXNzIGZvdW5kU3RyLCBldGMuXG5cdFx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIXtcbmNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoJHtmb3VuZFN0cn0pO1xuSG90LmVjaG8gKFxcYGRhdGEtdGVzdC1vYmplY3QtbmFtZSA9IFwiXFwke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIlxcJHt0ZXN0RWxtLmZ1bmN9XCIgZGF0YS10ZXN0LW9iamVjdC12YWx1ZSA9IFwiXFwke3Rlc3RFbG0udmFsdWV9XCJcXGApO1xufSomISMlQCFAKiFcXG5gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBjcmVhdGVUZXN0RWxlbWVudCA9IChmb3VuZFN0cjI6IGFueSkgPT5cblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdGVzdEVsbSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgb2JqID0gZm91bmRTdHIyO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGZvdW5kU3RyMikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIyKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50c1t0ZXN0RWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7dGVzdEVsbS5uYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3IgcHJvY2Vzc2luZyB0ZXN0IGVsZW1lbnQgJHtmb3VuZFN0cjJ9IGluICR7SG90LkN1cnJlbnRQYWdlLm5hbWV9LiBFcnJvcjogJHtleC5tZXNzYWdlfWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKHRlc3RFbG0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRlc3RFbG0gPSBjcmVhdGVUZXN0RWxlbWVudCAoZm91bmRTdHIpO1xuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhZGF0YS10ZXN0LW9iamVjdC1uYW1lID0gXCIke3Rlc3RFbG0ubmFtZX1cIiBkYXRhLXRlc3Qtb2JqZWN0LWZ1bmMgPSBcIiR7dGVzdEVsbS5mdW5jfVwiIGRhdGEtdGVzdC1vYmplY3QtdmFsdWUgPSBcIiR7dGVzdEVsbS52YWx1ZX1cIiomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDU6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQ0LCBcIiomJiUqJUAjQCFcIiwgXCIqJiEjJUAhQCohXCIsIFwiKiYmJSolQCNAIVwiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChyZWdleEZvdW5kKTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudCk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gb2ZmQ29udGVudDtcblxuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0aWYgKHBhcnNlck9wdGlvbnMub3V0cHV0Q29tbWFuZHMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdG91dCA9IGBlY2hvT3V0cHV0ICgke2VzY2FwZWRDb250ZW50fSwgJHt0aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG91dCA9IGVzY2FwZWRDb250ZW50O1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XCIqJiYlKiVAI0AhXCIubGVuZ3RoLCBcIiomISMlQCFAKiFcIi5sZW5ndGgpO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgVGVtcG9yYXJ5IGhhY2suIFRoZXNlIGRlbGltaXRlcnMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0ZW1wT3V0cHV0IHdoZW4gXG5cdFx0XHRcdC8vLyBleGVjdXRpbmcgcHJvY2Vzc05lc3RlZENvbnRlbnQuXG5cdFx0XHRcdHRlbXBPdXRwdXQ1ID0gdGVtcE91dHB1dDUucmVwbGFjZSAoL1xcKlxcJlxcJlxcJVxcKlxcJVxcQFxcI1xcQFxcIS9nLCBcIlwiKTtcblx0XHRcdFx0dGVtcE91dHB1dDUgPSB0ZW1wT3V0cHV0NS5yZXBsYWNlICgvXFwqXFwmXFwhXFwjXFwlXFxAXFwhXFxAXFwqXFwhL2csIFwiXCIpO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcE91dHB1dDUpO1xuXHRcdFx0fSwgMCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyB0aGUgY29udGVudCBpbiB0aGlzIGZpbGUuIFRoaXMgdHJlYXRzIGVhY2ggZmlsZSBhcyBvbmUgbGFyZ2UgSmF2YVNjcmlwdFxuXHQgKiBmaWxlLiBBbnkgdGV4dCBvdXRzaWRlIG9mIHRoZSA8KiAqPiBhcmVhcyB3aWxsIGJlIHRyZWF0ZWQgYXM6XG5cdCAqIFxuXHQgKiBcdFx0SG90LmVjaG8gKFwidGV4dFwiKTtcblx0ICogXG5cdCAqIEBmaXhtZSBUaGUgcmVnZXgncyBpbiB0aGUgb2ZmQ29udGVudCBmdW5jdGlvbnMgbmVlZCB0byBiZSBmaXhlZC4gVGhlcmUncyBzZXZlcmFsIFxuXHQgKiB0ZXN0IGNhc2VzIHdoZXJlIHRoZXkgd2lsbCBmYWlsLlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHRoaXNDb250ZW50OiBzdHJpbmcgPSB0aGlzLmNvbnRlbnQ7XG5cblx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChhcmdzIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEluICR7dGhpcy5uYW1lfSwgdGhlIHBhc3NlZCBhcmd1bWVudHMgcmVjZWl2ZWQgY2Fubm90IGJlIGFuIGFycmF5IWApO1xuXHRcdH1cblxuXHRcdEhvdC5Nb2RlID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5tb2RlO1xuXHRcdEhvdC5Bcmd1bWVudHMgPSBhcmdzO1xuXHRcdEhvdC5DdXJyZW50UGFnZSA9IHRoaXMucGFnZTtcblx0XHRIb3QuUHVibGljS2V5cyA9IHRoaXMucGFnZS5wcm9jZXNzb3IucHVibGljS2V5cztcblx0XHRIb3QuQVBJID0gdGhpcy5wYWdlLmdldEFQSSAoKTtcblx0XHRIb3QuVGVzdGVyQVBJID0gdGhpcy5wYWdlLmdldFRlc3RlckFQSSAoKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucGFyc2VDb250ZW50ICh0aGlzQ29udGVudCwgdGhpcy50aHJvd0FsbEVycm9ycyk7XG5cblx0XHQvLyBFeGVjdXRlIHRoZSBhc3NlbWJsZWQgSlMgZmlsZS5cblx0XHRsZXQgcmV0dXJuZWRPdXRwdXQ6IGFueSA9IG51bGw7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uQ29udGVudDogc3RyaW5nID0gYFxuXHRcdFx0dmFyIEhvdCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHZhciBQYXNzZWRIb3RGaWxlID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0XHRgO1xuXG5cdFx0XHQvLyBPdXRwdXQgdGhlIGFyZ3VtZW50cyBzbyBpdCdzIHVzYWJsZSBpbiB0aGUgZW50aXJlIGRvY3VtZW50LlxuXHRcdFx0aWYgKHR5cGVvZiAoYXJncykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRoZSBwYXNzaW5nIGFyZ3VtZW50cyBjYW5ub3QgYmUgYSBzdHJpbmchYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBhcmdzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmV3VmFyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgbmV3VmFyVmFsdWU6IGFueSA9IGFyZ3Nba2V5XTtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAobmV3VmFyVmFsdWUpO1xuXG5cdFx0XHRcdG5ld1ZhciA9IGB2YXIgJHtrZXl9ID0gJHtuZXdWYXJWYWx1ZVN0cn07XFxuYDtcblxuXHRcdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG5ld1Zhcjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGNvbnRlbnROYW1lOiBzdHJpbmcgPSB0aGlzLm5hbWU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLmxvY2FsRmlsZTtcblxuXHRcdFx0aWYgKGNvbnRlbnROYW1lID09PSBcIlwiKVxuXHRcdFx0XHRjb250ZW50TmFtZSA9IHRoaXMudXJsO1xuXG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IGBcblx0XHRcdGZ1bmN0aW9uIGVjaG9PdXRwdXQgKGNvbnRlbnQsIHRocm93RXJyb3JzKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFcnJvcnMgPT0gbnVsbClcblx0XHRcdFx0XHR0aHJvd0Vycm9ycyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGNyZWF0ZVRlc3RFbGVtZW50IChmb3VuZFN0cilcblx0XHRcdHtcblx0XHRcdFx0bGV0IHRlc3RFbG0gPSBudWxsO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG9iaiA9IGZvdW5kU3RyO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoZm91bmRTdHIpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0b2JqID0gSlNPTi5wYXJzZSAoZm91bmRTdHIpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xuXG5cdFx0XHRcdFx0aWYgKG9ialtcIm5hbWVcIl0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmopO1xuXG5cdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHNbdGVzdEVsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcXGBUZXN0IGVsZW1lbnQgXFwke3Rlc3RFbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhXFxgKTtcblxuXHRcdFx0XHRcdEhvdC5DdXJyZW50UGFnZS5hZGRUZXN0RWxlbWVudCAodGVzdEVsbSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGV4KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChcblx0XHRcdFxcYEVycm9yIHByb2Nlc3NpbmcgdGVzdCBlbGVtZW50IFxcJHtmb3VuZFN0cn0gaW4gXFwke0hvdC5DdXJyZW50UGFnZS5uYW1lfS4gRXJyb3I6IFxcJHtleC5tZXNzYWdlfVxcYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodGVzdEVsbSk7XG5cdFx0XHR9XG5cblx0XHRcdGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbnRlbnQgKEN1cnJlbnRIb3RGaWxlKVxuXHRcdFx0e1xcbmA7XG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG91dHB1dDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gYFxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJ1bkNvbnRlbnQgKFBhc3NlZEhvdEZpbGUpLnRoZW4gKCgpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiAoe1xuXHRcdFx0XHRcdFx0aG90OiBIb3QsXG5cdFx0XHRcdFx0XHRvdXRwdXQ6IEhvdC5PdXRwdXQsXG5cdFx0XHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeSAoSG90LkRhdGEpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7YDtcblxuXHRcdFx0Ly8vIEBmaXhtZSBQcmlvciB0byBleGVjdXRpb24gY29tcGlsZSBhbnkgVHlwZVNjcmlwdCBhbmQgbWFrZSBpdCBFUzUgY29tcGF0aWJsZS5cblx0XHRcdGxldCBmdW5jOiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbiAoZXhlY3V0aW9uQ29udGVudCk7XG5cdFx0XHRyZXR1cm5lZE91dHB1dCA9IGF3YWl0IGZ1bmMuYXBwbHkgKHRoaXMsIFtIb3QsIHRoaXNdKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdGlmIChleCBpbnN0YW5jZW9mIFN5bnRheEVycm9yKVxuXHRcdFx0e1xuXHRcdFx0XHQvLy8gQGZpeG1lIFB1dCB3aGF0J3MgaW4gdGhlIGNvbnRlbnQgdmFyaWFibGUgaW50byBhIHByZXYgY29udGVudCB2YXJpYWJsZT9cblx0XHRcdFx0Ly8vIFRoZW4gb25jZSB0aGVyZSdzIG5vIGxvbmdlciBhbnkgc3ludGF4IGVycm9ycyBiZWluZyB0aHJvd24sIGV4ZWN1dGUgdGhlIFxuXHRcdFx0XHQvLy8gY29kZT8gVGhpcyB3b3VsZCBhbHNvIHJlcXVpcmUgc2F2aW5nIGFueSBIVE1MIG91dHNpZGUgb2YgdGhlICo+IGFuZCA8KiBcblx0XHRcdFx0Ly8vIHRoZW4gZWNob2luZyBpdCBvdXQuIFRoZSB0aHJvdyBiZWxvdyB3b3VsZCBoYXZlIHRvIGJlIHJlbW92ZWQgYXMgd2VsbC5cblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRocm93IGV4O1xuXHRcdH1cblxuXHRcdEhvdC5EYXRhID0gcmV0dXJuZWRPdXRwdXQuaG90LkRhdGE7XG5cdFx0bGV0IGZpbmFsT3V0cHV0OiBzdHJpbmcgPSByZXR1cm5lZE91dHB1dC5vdXRwdXQ7XG5cdFx0SG90Lk91dHB1dCA9IFwiXCI7XG5cblx0XHRyZXR1cm4gKGZpbmFsT3V0cHV0KTtcblx0fVxufSIsIi8qKlxuICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdExvZ0xldmVsXG57XG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBpbmZvIG1lc3NhZ2VzLlxuXHQgKi9cblx0SW5mbyxcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IHdhcm5pbmcgbWVzc2FnZXMuXG5cdCAqL1xuXHRXYXJuaW5nLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgZXJyb3IgbWVzc2FnZXMuXG5cdCAqL1xuXHRFcnJvcixcblx0LyoqXG5cdCAqIFByaW50cyBhbGwgbWVzc2FnZXMuXG5cdCAqL1xuXHRWZXJib3NlLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcywgZXhjZXB0IHZlcmJvc2UuXG5cdCAqL1xuXHRBbGwsXG5cdC8qKlxuXHQgKiBEb2Vzbid0IHByaW50IGFueSBtZXNzYWdlLlxuXHQgKi9cblx0Tm9uZVxufVxuXG4vKipcbiAqIFRoZSBsb2dnZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RMb2dcbntcblx0LyoqXG5cdCAqIFRoZSBsb2dnaW5nIGxldmVsLlxuXHQgKi9cblx0bG9nTGV2ZWw6IEhvdExvZ0xldmVsO1xuXG5cdGNvbnN0cnVjdG9yIChsb2dMZXZlbDogSG90TG9nTGV2ZWwgPSBIb3RMb2dMZXZlbC5BbGwpXG5cdHtcblx0XHR0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgdGhlIGxvZ2dpbmcgbGV2ZWwuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2UgKGxvZ0xldmVsOiBzdHJpbmcpOiBIb3RMb2dMZXZlbFxuXHR7XG5cdFx0bGV0IGxldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbDtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJpbmZvXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkluZm87XG5cblx0XHRpZiAobG9nTGV2ZWwgPT09IFwid2FybmluZ1wiKVxuXHRcdFx0bGV2ZWwgPSBIb3RMb2dMZXZlbC5XYXJuaW5nO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcImVycm9yXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkVycm9yO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcInZlcmJvc2VcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuVmVyYm9zZTtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJhbGxcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuQWxsO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcIm5vbmVcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuTm9uZTtcblxuXHRcdHJldHVybiAobGV2ZWwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRsb2cgKGxldmVsOiBIb3RMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykgfHwgXG5cdFx0XHRcdChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbClcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHZlcmJvc2UgbWVzc2FnZS5cblx0ICovXG5cdHZlcmJvc2UgKG1lc3NhZ2U6IHN0cmluZyB8IEZ1bmN0aW9uKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSAoKSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRpbmZvIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5pbmZvIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgd2FybmluZy5cblx0ICovXG5cdHdhcm5pbmcgKG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKSlcblx0XHR7XG5cdFx0XHRjb25zb2xlLndhcm4gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGVycm9yIChtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcilcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcikpXG5cdFx0e1xuXHRcdFx0bGV0IG1zZzogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdG1zZyA9IG1lc3NhZ2U7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChtZXNzYWdlLm1lc3NhZ2UgIT0gbnVsbClcblx0XHRcdFx0XHRtc2cgPSBtZXNzYWdlLm1lc3NhZ2U7XG5cblx0XHRcdFx0aWYgKG1lc3NhZ2Uuc3RhY2sgIT0gbnVsbClcblx0XHRcdFx0XHRtc2cgPSBtZXNzYWdlLnN0YWNrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zb2xlLmVycm9yIChtc2cpO1xuXHRcdH1cblx0fVxufSIsImltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RBc3NldCB9IGZyb20gXCIuL0hvdEFzc2V0XCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogTG9hZCBhIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBhc3NldHMgdG8gbG9hZCBmb3IgdGhlIGZyb250ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgSG90TW9kdWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGxpc3Qgb2YgTlBNIG1vZHVsZXMgdG8gaW1wb3J0LlxuXHQgKi9cblx0aW1wb3J0Pzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgSFRNTCBmaWxlcyB0byBsb2FkLlxuXHQgKi9cblx0aHRtbD86IChzdHJpbmcgfCBIb3RBc3NldClbXTtcblx0LyoqXG5cdCAqIFRoZSBDU1MgZmlsZXMgdG8gbG9hZC5cblx0ICovXG5cdGNzcz86IChzdHJpbmcgfCBIb3RBc3NldClbXTtcblx0LyoqXG5cdCAqIFRoZSBKUyBmaWxlcyB0byBsb2FkLlxuXHQgKi9cblx0anM/OiAoc3RyaW5nIHwgSG90QXNzZXQpW107XG5cdC8qKlxuXHQgKiBUaGUgZXhwb3J0ZWQgY29tcG9uZW50IGxpYnJhcnkgdGhhdCBjb250YWlucyBhbGwgdGhlIGNvbXBvbmVudHMgdG8gbG9hZC5cblx0ICovXG5cdGNvbXBvbmVudExpYnJhcnk/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0byBsb2FkLlxuXHQgKi9cblx0Y29tcG9uZW50cz86IChuZXcgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk/OiBIb3RBUEkpID0+IEhvdENvbXBvbmVudClbXTtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nKVxuXHR7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLmltcG9ydCA9IFtdO1xuXHRcdHRoaXMuaHRtbCA9IFtdO1xuXHRcdHRoaXMuY3NzID0gW107XG5cdFx0dGhpcy5qcyA9IFtdO1xuXHRcdHRoaXMuY29tcG9uZW50TGlicmFyeSA9IFwiXCI7XG5cdFx0dGhpcy5jb21wb25lbnRzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogT3V0cHV0IENTUy5cblx0ICovXG5cdG91dHB1dENTUyAoZWNob091dDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLmNzcyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHRoaXMub3V0cHV0QXNzZXQgKFwiY3NzXCIsIHRoaXMuY3NzLCAoYXNzZXQ6IEhvdEFzc2V0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBjb250ZW50OiBzdHJpbmcgfCBhbnkgPSBhc3NldC5vdXRwdXQgKCk7XG5cdFx0XHRcdG91dHB1dCArPSBgJHtjb250ZW50fVxcbmA7XG5cdFx0XHR9KTtcblxuXHRcdGlmIChlY2hvT3V0ID09PSB0cnVlKVxuXHRcdFx0SG90LmVjaG8gKG91dHB1dCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogT3V0cHV0IEpTLlxuXHQgKi9cblx0b3V0cHV0SlMgKGVjaG9PdXQ6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nXG5cdHtcblx0XHRpZiAodGhpcy5qcyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHRoaXMub3V0cHV0QXNzZXQgKFwianNcIiwgdGhpcy5qcywgKGFzc2V0OiBIb3RBc3NldCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgY29udGVudDogc3RyaW5nIHwgYW55ID0gYXNzZXQub3V0cHV0ICgpO1xuXHRcdFx0XHRvdXRwdXQgKz0gYCR7Y29udGVudH1cXG5gO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAoZWNob091dCA9PT0gdHJ1ZSlcblx0XHRcdEhvdC5lY2hvIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBhIGxvYWRlZCBIVE1MIGFzc2V0LlxuXHQgKi9cblx0YXN5bmMgb3V0cHV0IChhc3NldE5hbWU6IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0YXdhaXQgSG90LmluY2x1ZGUgKGAke3RoaXMubmFtZX0vJHthc3NldE5hbWV9LmhvdHRgLCBhcmdzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIEhUTUwgYXNzZXRzLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhUTUwgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmICh0aGlzLmh0bWwgPT0gbnVsbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBmaWxlczogYW55ID0ge307XG5cblx0XHR0aGlzLm91dHB1dEFzc2V0IChcImh0bWxcIiwgdGhpcy5odG1sLCAoYXNzZXQ6IEhvdEFzc2V0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBmaWxlID0gYXNzZXQub3V0cHV0ICgpO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhUTUwgYXNzZXRzIGNhbm5vdCBiZSBvdXRwdXR0ZWQgdXNpbmcgb25seSBhIHN0cmluZyFgKTtcblxuXHRcdFx0XHRmaWxlc1tmaWxlLm5hbWVdID0gZmlsZTtcblx0XHRcdH0pO1xuXG5cdFx0YXdhaXQgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5sb2FkSG90RmlsZXMgKGZpbGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgY29tcG9uZW50cyBhc3NldHMuXG5cdCAqL1xuXHRvdXRwdXRDb21wb25lbnRzIChlY2hvT3V0OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMuY29tcG9uZW50cyA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChcIlwiKTtcblxuXHRcdGlmICh0aGlzLmNvbXBvbmVudHMubGVuZ3RoIDwgMSlcblx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5gO1xuXHRcdGxldCBjb21wb25lbnRMaWJyYXJ5OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMuY29tcG9uZW50TGlicmFyeSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmNvbXBvbmVudExpYnJhcnkgIT09IFwiXCIpXG5cdFx0XHRcdGNvbXBvbmVudExpYnJhcnkgPSBgJHt0aGlzLmNvbXBvbmVudExpYnJhcnl9LmA7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpSWR4XTtcblxuXHRcdFx0b3V0cHV0ICs9IGBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFkZENvbXBvbmVudCAoJHtjb21wb25lbnRMaWJyYXJ5fSR7Y29tcG9uZW50fSk7XFxuYDtcblx0XHR9XG5cblx0XHRvdXRwdXQgKz0gYDwvc2NyaXB0PmA7XG5cblx0XHRpZiAoZWNob091dCA9PT0gdHJ1ZSlcblx0XHRcdEhvdC5lY2hvIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBhbiBhc3NldCB0byBIVE1MLlxuXHQgKi9cblx0cHJvdGVjdGVkIG91dHB1dEFzc2V0IChhc3NldFR5cGU6IHN0cmluZywgYXNzZXRzOiAoc3RyaW5nIHwgSG90QXNzZXQpW10gPSBbXSwgXG5cdFx0Y2FsbGJhY2s6IChhc3NldDogSG90QXNzZXQpID0+IHZvaWQpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFzc2V0cy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgYXNzZXQ6IHN0cmluZyB8IEhvdEFzc2V0ID0gYXNzZXRzW2lJZHhdO1xuXHRcdFx0bGV0IGxvYWRBc3NldDogSG90QXNzZXQgPSBudWxsO1xuXHRcdFx0bG9hZEFzc2V0ID0gbmV3IEhvdEFzc2V0IChhc3NldFR5cGUpO1xuXG5cdFx0XHRpZiAodHlwZW9mIChhc3NldCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdGxvYWRBc3NldC5wYXRoID0gYXNzZXQ7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChhc3NldC5uYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZEFzc2V0Lm5hbWUgPSBhc3NldC5uYW1lO1xuXG5cdFx0XHRcdGlmIChhc3NldC5wYXRoICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZEFzc2V0LnBhdGggPSBhc3NldC5wYXRoO1xuXG5cdFx0XHRcdGlmIChhc3NldC5jb250ZW50ICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZEFzc2V0LmNvbnRlbnQgPSBhc3NldC5jb250ZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRjYWxsYmFjayAobG9hZEFzc2V0KTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdENvbXBvbmVudCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuXG4vKipcbiAqIEEgcGFnZSB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIGFkZGVkIHRvIHRoaXMgcGFnZS5cblx0ICovXG5cdGNvbXBvbmVudHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RDb21wb25lbnQgfTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLiBGaWxlIG9yZGVyaW5nIG1hdHRlcnMgaGVyZS5cblx0ICogRXZlcnkgZmlsZSBpcyBwcm9jZXNzZWQgaW5jcmVtZW50YWxseS5cblx0ICovXG5cdGZpbGVzPzogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50cyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RFbGVtZW50cz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFBhZ2UgaW1wbGVtZW50cyBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgYWRkZWQgdG8gdGhpcyBwYWdlLlxuXHQgKi9cblx0Y29tcG9uZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlczogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCB0ZXN0ZXIgbWFwLlxuXHQgKi9cblx0dGVzdGVyTWFwOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0RWxlbWVudHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYXRoOyB9O1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90UGFnZSB8IEhvdFN0YXEpXG5cdHtcblx0XHRpZiAoY29weSBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGVzdGVyTmFtZSA9IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IFwiXCI7XG5cdFx0XHR0aGlzLmNvbXBvbmVudHMgPSB7fTtcblx0XHRcdHRoaXMuZmlsZXMgPSBbXTtcblx0XHRcdHRoaXMudGVzdEVsZW1lbnRzID0ge307XG5cdFx0XHR0aGlzLnRlc3RQYXRocyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJOYW1lID0gY29weS50ZXN0ZXJOYW1lIHx8IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBjb3B5LnRlc3Rlck1hcCB8fCBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IGNvcHkucm91dGUgfHwgXCJcIjtcblx0XHRcdHRoaXMuY29tcG9uZW50cyA9IGNvcHkuY29tcG9uZW50cyB8fCB7fTtcblx0XHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IFtdO1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSBjb3B5LnRlc3RFbGVtZW50cyB8fCB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0gY29weS50ZXN0UGF0aHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUgdG8gcHJvY2Vzcy4gSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBcblx0ICogYWRkaW5nIGl0IHRvIGEgcGFnZSBpZiBpdCdzIGFib3V0IHRvIGJlIHVzZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdHRoaXMuZmlsZXMucHVzaCAoZmlsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldEFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLmFwaSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB0ZXN0ZXIgQVBJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0ZXJBUEkgKCk6IEhvdEFQSVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnByb2Nlc3Nvci50ZXN0ZXJBUEkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHBhZ2UuIENvdWxkIGRlY3JlYXNlIHBhZ2UgbG9hZGluZyBwZXJmb3JtYW5jZS5cblx0ICogSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBhZGRpbmcgaXQgdG8gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoZmlsZTogSG90RmlsZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXHRcdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdFx0b3V0cHV0ICs9IGF3YWl0IGZpbGUucHJvY2VzcyAoYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGFkZFRlc3RFbGVtZW50IChlbG06IEhvdFRlc3RFbGVtZW50KTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW2VsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7ZWxtLm5hbWV9IGFscmVhZHkgZXhpc3RzIWApO1xuXG5cdFx0dGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdID0gZWxtO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGdldFRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcpOiBIb3RUZXN0RWxlbWVudFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtuYW1lfSBkb2VzdCBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSB0ZXN0IHBhdGguXG5cdCAqL1xuXHRjcmVhdGVUZXN0UGF0aCAocGF0aE5hbWU6IHN0cmluZywgZHJpdmVyRnVuYzogSG90VGVzdFBhdGgpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0UGF0aHNbcGF0aE5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IHBhdGggJHtwYXRoTmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gPSBkcml2ZXJGdW5jO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgSG90RXZlbnRNZXRob2QsIElIb3RSb3V0ZU1ldGhvZCwgXG5cdFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uLCBUZXN0Q2FzZUZ1bmN0aW9uLCBUZXN0Q2FzZU9iamVjdCwgU2VydmVyUmVxdWVzdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuXG4vKipcbiAqIFRoZSByb3V0ZSB0byB1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciB0aGF0IG1haW50YWlucyB0aGUgY29ubmVjdGlvbnMuXG5cdCAqL1xuXHRjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZS5cblx0ICovXG5cdHJvdXRlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2ZXJzaW9uLlxuXHQgKi9cblx0dmVyc2lvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdXRlIG1ldGhvZC5cblx0ICovXG5cdHByZWZpeDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUuXG5cdCAqL1xuXHRtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdO1xuXHQvKipcblx0ICogVGhlIGVycm9ycyBhbmQgdGhlaXIgSlNPTiB0aGF0IGNhbiBiZSB0aHJvd24uIENhbiBiZTpcblx0ICogKiBub3RfYXV0aG9yaXplZFxuXHQgKiAqIG5vX3NlcnZlcl9leGVjdXRlX2Z1bmN0aW9uXG5cdCAqL1xuXHRlcnJvcnM6IHsgW2Vycm9yOiBzdHJpbmddOiBhbnkgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCByb3V0ZTogc3RyaW5nLCBtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdID0gW10pXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMubG9nZ2VyID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmxvZ2dlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IubG9nZ2VyO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGUgPSByb3V0ZTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLnZlcnNpb24gPSBcInYxXCI7XG5cdFx0dGhpcy5wcmVmaXggPSBcIlwiO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gbnVsbDtcblx0XHR0aGlzLm1ldGhvZHMgPSBtZXRob2RzO1xuXHRcdHRoaXMuZXJyb3JzID0ge1xuXHRcdFx0XHRcIm5vdF9hdXRob3JpemVkXCI6IEhvdFJvdXRlLmNyZWF0ZUVycm9yIChcIk5vdCBhdXRob3JpemVkLlwiKSxcblx0XHRcdFx0XCJub19zZXJ2ZXJfZXhlY3V0ZV9mdW5jdGlvblwiOiBIb3RSb3V0ZS5jcmVhdGVFcnJvciAoXCJNaXNzaW5nIHNlcnZlciBleGVjdXRlIGZ1bmN0aW9uLlwiKSxcblx0XHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGVycm9yIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUVycm9yIChtZXNzYWdlOiBzdHJpbmcpOiBhbnlcblx0e1xuXHRcdHJldHVybiAoeyBlcnJvcjogbWVzc2FnZSB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gQVBJIG1ldGhvZCB0byB0aGlzIHJvdXRlLlxuXHQgKiBcblx0ICogQHBhcmFtIG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGFkZC4gSWYgYSBIb3RSb3V0ZU1ldGhvZCBpcyBzdXBwbGllZCwgdGhlIFxuXHQgKiByZXN0IG9mIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgd2lsbCBiZSBpZ25vcmVkLlxuXHQgKi9cblx0YWRkTWV0aG9kIChcblx0XHRtZXRob2Q6IEhvdFJvdXRlTWV0aG9kIHwgSUhvdFJvdXRlTWV0aG9kIHwgc3RyaW5nLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLFxuXHRcdHR5cGU6IEhvdEV2ZW50TWV0aG9kID0gSG90RXZlbnRNZXRob2QuUE9TVCxcblx0XHR0ZXN0Q2FzZXM6IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXSA9IG51bGxcblx0XHQpOiB2b2lkXG5cdHtcblx0XHRpZiAodHlwZW9mIChtZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bWV0aG9kID0gbmV3IEhvdFJvdXRlTWV0aG9kICh0aGlzLCBtZXRob2QsIGV4ZWN1dGVGdW5jdGlvbiwgdHlwZSwgbnVsbCwgbnVsbCwgbnVsbCwgdGVzdENhc2VzKTtcblxuXHRcdGlmIChtZXRob2QgaW5zdGFuY2VvZiBIb3RSb3V0ZU1ldGhvZClcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoIChtZXRob2QpO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAobWV0aG9kLnJvdXRlID09IG51bGwpXG5cdFx0XHRcdG1ldGhvZC5yb3V0ZSA9IHRoaXM7XG5cblx0XHRcdG1ldGhvZCA9IG5ldyBIb3RSb3V0ZU1ldGhvZCAobWV0aG9kKTtcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoICgoPEhvdFJvdXRlTWV0aG9kPm1ldGhvZCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBtZXRob2QgYnkgaXQncyBuYW1lLlxuXHQgKi9cblx0Z2V0TWV0aG9kIChuYW1lOiBzdHJpbmcpOiBIb3RSb3V0ZU1ldGhvZFxuXHR7XG5cdFx0bGV0IGZvdW5kTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHRoaXMubWV0aG9kc1tpSWR4XTtcblxuXHRcdFx0aWYgKG1ldGhvZC5uYW1lID09PSBuYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3VuZE1ldGhvZCA9IG1ldGhvZDtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kTWV0aG9kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIHJvdXRlIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvdXRlIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uRXhlY3V0ZSBpbiB0aGUgXG5cdCAqIGNhbGxlZCBIb3RSb3V0ZU1ldGhvZC4gVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIFxuXHQgKiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqL1xuXHRvbkF1dGhvcml6ZVVzZXI6IChyZXE6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55PiA9IG51bGw7XG59IiwiaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgSG90V2ViU29ja2V0Q2xpZW50IH0gZnJvbSBcIi4vSG90V2ViU29ja2V0Q2xpZW50XCI7XG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBldmVudCBtZXRob2RzLlxuICovXG5leHBvcnQgZW51bSBIb3RFdmVudE1ldGhvZFxue1xuXHQvKipcblx0ICogQSBIVFRQIEdFVCByZXF1ZXN0LlxuXHQgKi9cblx0R0VUID0gXCJnZXRcIixcblx0LyoqXG5cdCAqIEEgSFRUUCBQT1NUIHJlcXVlc3QuXG5cdCAqL1xuXHRQT1NUID0gXCJwb3N0XCIsXG5cdC8qKlxuXHQgKiBUaGlzIHdpbGwgdXBsb2FkIGEgZmlsZSwgdGhlbiBwb3N0IHRoZSBqc29uIHJlcXVlc3QgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdEZJTEVfVVBMT0FEID0gXCJmaWxlX3VwbG9hZF90aGVuX3Bvc3RfanNvblwiLFxuXHQvKipcblx0ICogQSB3ZWJzb2NrZXQgZXZlbnQuXG5cdCAqL1xuXHRXRUJTT0NLRVRfQ0xJRU5UX1BVQl9FVkVOVCA9IFwid2Vic29ja2V0X2NsaWVudF9wdWJfZXZlbnRcIlxufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHRoYXQgY2FtZSBmcm9tIGEgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJSZXF1ZXN0XG57XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXE/OiBleHByZXNzLlJlcXVlc3Q7XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXNwb25zZSB0byBzZW5kIHRvIHRoZSBjbGllbnQuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIHdlYnNvY2tldCBjb25uZWN0aW9uLlxuXHQgKi9cblx0cmVzPzogZXhwcmVzcy5SZXNwb25zZTtcblx0LyoqXG5cdCAqIFRoZSBjbGllbnQgd2Vic29ja2V0IHRoYXQgd2FzIHVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZS4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgSFRUUCBjb25uZWN0aW9uLlxuXHQgKi9cblx0d3NTb2NrZXQ/OiBIb3RXZWJTb2NrZXRDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBhdXRob3JpemluZyBhIGNsaWVudC4gQ2FuIGJlIGEgSldUIHRva2VuLCBhcGkga2V5LCBldGMuXG5cdCAqIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdGF1dGhvcml6ZWRWYWx1ZT86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBKU09OIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC5cblx0ICovXG5cdGpzb25PYmo/OiBhbnk7XG5cdC8qKlxuXHQgKiBBbnkgcXVlcnkgdmFyaWFibGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBudWxsIGlmIHRoaXMgcmVxdWVzdCB3YXMgXG5cdCAqIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdHF1ZXJ5T2JqPzogYW55O1xuXHQvKipcblx0ICogQW55IGZpbGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBudWxsIGlmIG5vIGZpbGVzIHdlcmUgc2VudC5cblx0ICogT25jZSBhIGZpbGUgaXMgdXBsb2FkZWQsIHlvdSBjYW4gYWNjZXNzIGl0IGF0IHRoZSB0ZW1wb3JhcnkgcGF0aCBmb3VuZCBpbjogXG5cdCAqIGZpbGVzW3VwbG9hZElkXS5wYXRoXG5cdCAqL1xuXHRmaWxlcz86IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHRzaXplOiBudW1iZXI7XG5cdFx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHRoYXQgY2FtZSBmcm9tIGEgY2xpZW50LlxuICovXG5leHBvcnQgY2xhc3MgU2VydmVyUmVxdWVzdCBpbXBsZW1lbnRzIElTZXJ2ZXJSZXF1ZXN0XG57XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXE6IGV4cHJlc3MuUmVxdWVzdDtcblx0LyoqXG5cdCAqIFRoZSBleHByZXNzIHJlc3BvbnNlIHRvIHNlbmQgdG8gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXM6IGV4cHJlc3MuUmVzcG9uc2U7XG5cdC8qKlxuXHQgKiBUaGUgY2xpZW50IHdlYnNvY2tldCB0aGF0IHdhcyB1c2VkIHRvIHNlbmQgdGhlIG1lc3NhZ2UuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIEhUVFAgY29ubmVjdGlvbi5cblx0ICovXG5cdHdzU29ja2V0OiBIb3RXZWJTb2NrZXRDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBhdXRob3JpemluZyBhIGNsaWVudC4gQ2FuIGJlIGEgSldUIHRva2VuLCBhcGkga2V5LCBldGMuXG5cdCAqIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdGF1dGhvcml6ZWRWYWx1ZTogYW55O1xuXHQvKipcblx0ICogVGhlIEpTT04gcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LlxuXHQgKi9cblx0anNvbk9iajogYW55O1xuXHQvKipcblx0ICogQW55IHF1ZXJ5IHZhcmlhYmxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIFxuXHQgKiByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRxdWVyeU9iajogYW55O1xuXHQvKipcblx0ICogQW55IGZpbGVzIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBudWxsIGlmIG5vIGZpbGVzIHdlcmUgc2VudC5cblx0ICogT25jZSBhIGZpbGUgaXMgdXBsb2FkZWQsIHlvdSBjYW4gYWNjZXNzIGl0IGF0IHRoZSB0ZW1wb3JhcnkgcGF0aCBmb3VuZCBpbjogXG5cdCAqIGZpbGVzW3VwbG9hZElkXS5wYXRoXG5cdCAqL1xuXHRmaWxlczoge1xuXHRcdFtrZXk6IHN0cmluZ106IHtcblx0XHRcdG5hbWU6IHN0cmluZztcblx0XHRcdHNpemU6IG51bWJlcjtcblx0XHRcdHBhdGg6IHN0cmluZztcblx0XHR9XG5cdH07XG5cblx0Y29uc3RydWN0b3IgKG9iajogSVNlcnZlclJlcXVlc3QgPSBudWxsKVxuXHR7XG5cdFx0aWYgKG9iaiA9PSBudWxsKVxuXHRcdFx0b2JqID0ge307XG5cblx0XHR0aGlzLnJlcSA9IG9iai5yZXEgfHwgbnVsbDtcblx0XHR0aGlzLnJlcyA9IG9iai5yZXMgfHwgbnVsbDtcblx0XHR0aGlzLndzU29ja2V0ID0gb2JqLndzU29ja2V0IHx8IG51bGw7XG5cdFx0dGhpcy5hdXRob3JpemVkVmFsdWUgPSBvYmouYXV0aG9yaXplZFZhbHVlIHx8IG51bGw7XG5cdFx0dGhpcy5qc29uT2JqID0gb2JqLmpzb25PYmogfHwgbnVsbDtcblx0XHR0aGlzLnF1ZXJ5T2JqID0gb2JqLnF1ZXJ5T2JqIHx8IG51bGw7XG5cdFx0dGhpcy5maWxlcyA9IG9iai5maWxlcyB8fCBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlciB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHdpdGggRXhwcmVzcy5cbiAqIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhpcyByb3V0ZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb24gPSAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiA9IChyZXF1ZXN0OiBTZXJ2ZXJSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCB0eXBlIENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIgZm9yIGF1dGhvcml6YXRpb24uIEFueSB2YWx1ZSBcbiAqIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24uXG4gKiBJZiBhbiB1bmRlZmluZWQgdmFsdWUgaXMgcmV0dXJuZWQsIHRoaXMgaW5kaWNhdGVzIHRoZSBzZXJ2ZXIgd2FzIG5vdCBhYmxlIFxuICogdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCBzbyB0aGUgU2VydmVyRXhlY3V0aW9uRnVuY3Rpb24gd2lsbCBub3QgYmUgXG4gKiBleGVjdXRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uID0gKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogVGhlIHRlc3QgY2FzZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICovXG5leHBvcnQgdHlwZSBUZXN0Q2FzZUZ1bmN0aW9uID0gKChkcml2ZXI6IEhvdFRlc3REcml2ZXIpID0+IFByb21pc2U8YW55PikgfCAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gYW55KTtcbi8qKlxuICogVGhlIHRlc3QgY2FzZSBvYmplY3QgdG8gcGFzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZU9iamVjdFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuXHQgKi9cblx0ZnVuYzogVGVzdENhc2VGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBIG1ldGhvZCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90Um91dGVNZXRob2RQYXJhbWV0ZXJcbntcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHBhcmFtZXRlci4gRGVmYXVsdDogc3RyaW5nXG5cdCAqIENhbiBiZTpcblx0ICogKiBzdHJpbmdcblx0ICogKiBpbnRlZ2VyXG5cdCAqICogbnVtYmVyXG5cdCAqICogYm9vbGVhblxuXHQgKiAqIGFycmF5XG5cdCAqICogb2JqZWN0XG5cdCAqL1xuXHR0eXBlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuIERlZmF1bHQ6IFwiXCJcblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogSXMgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZWQ/IERlZmF1bHQ6IGZhbHNlXG5cdCAqL1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgb2JqZWN0LlxuXHQgKi9cblx0cGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9O1xufVxuXG4vKipcbiAqIEFuIEFQSSBtZXRob2QgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90Um91dGVNZXRob2Rcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcm91dGUuXG5cdCAqL1xuXHRyb3V0ZT86IEhvdFJvdXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHJldHVybnMgZnJvbSB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHJldHVybnM/OiBzdHJpbmcgfCBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjtcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlPzogSG90RXZlbnRNZXRob2Q7XG5cdC8qKlxuXHQgKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgXG5cdCAqIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXV0aENyZWRlbnRpYWxzPzogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0O1xuXHRcdH0gfCAoc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbilbXSB8IFRlc3RDYXNlRnVuY3Rpb25bXSB8IFRlc3RDYXNlT2JqZWN0W107XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIG1ldGhvZCB3aXRoIEV4cHJlc3MuIElmIFxuXHQgKiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBtZXRob2Qgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI/OiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZCBcblx0ICogaXMgc2V0LCB0aGlzIHdpbGwgbm90IGNhbGwgb25BdXRob3JpemUgZm9yIHRoZSBwYXJlbnQgSG90Um91dGUuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlLiBcblx0ICogVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICogXG5cdCAqIEN1cnJlbnRseSB0aGlzIGhhcyBubyBlZmZlY3Qgd2hlbiB1c2luZyB3ZWJzb2NrZXRzLlxuXHQgKi9cblx0b25TZXJ2ZXJBdXRob3JpemU/OiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBbiBBUEkgbWV0aG9kIHRvIG1ha2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZU1ldGhvZCBpbXBsZW1lbnRzIElIb3RSb3V0ZU1ldGhvZFxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCByb3V0ZS5cblx0ICovXG5cdHJvdXRlOiBIb3RSb3V0ZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHJldHVybnMgZnJvbSB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHJldHVybnM6IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyO1xuXHQvKipcblx0ICogVGhlIHBhcmFtZXRlcnMgaW4gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRwYXJhbWV0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcjsgfTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0dHlwZTogSG90RXZlbnRNZXRob2Q7XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyBtZXRob2QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZlcj8gVGhpcyBcblx0ICogcHJldmVudHMgdGhlIG1ldGhvZCBmcm9tIGJlaW5nIHJlcmVnaXN0ZXJlZC5cblx0ICovXG5cdGlzUmVnaXN0ZXJlZDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIG1ldGhvZCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmVyPyBUaGlzIFxuXHQgKiBwcmV2ZW50cyB0aGUgbWV0aG9kIGZyb20gYmVpbmcgcmVyZWdpc3RlcmVkLlxuXHQgKi9cblx0ZXhlY3V0ZVNldHVwOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gYmUgdXNlZCBieSB0aGUgY2xpZW50IFxuXHQgKiB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIHRlc3QgY2FzZSBvYmplY3RzIHRvIGV4ZWN1dGUgZHVyaW5nIHRlc3RzLlxuXHQgKi9cblx0dGVzdENhc2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7XG5cdFx0fTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgbWV0aG9kIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3Rlcj86IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuIElmIHRoaXMgbWV0aG9kIFxuXHQgKiBpcyBzZXQsIHRoaXMgd2lsbCBub3QgY2FsbCBvbkF1dGhvcml6ZSBmb3IgdGhlIHBhcmVudCBIb3RSb3V0ZS5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvblNlcnZlckV4ZWN1dGUuIFxuXHQgKiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBjbGllbnQgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJBdXRob3JpemU/OiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcblxuXHRjb25zdHJ1Y3RvciAocm91dGU6IEhvdFJvdXRlIHwgSUhvdFJvdXRlTWV0aG9kLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCBcblx0XHRvbkV4ZWN1dGU6IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIHwgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHR0eXBlOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIG9uU2VydmVyQXV0aG9yaXplOiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHRvblJlZ2lzdGVyOiBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9IG51bGwsIGF1dGhDcmVkZW50aWFsczogYW55ID0gbnVsbCwgXG5cdFx0dGVzdENhc2VzOiB7IFtuYW1lOiBzdHJpbmddOiBUZXN0Q2FzZU9iamVjdDsgfSB8IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXSA9IG51bGwpXG5cdHtcblx0XHRsZXQgbmV3Um91dGU6IEhvdFJvdXRlID0gbnVsbDtcblxuXHRcdGlmIChyb3V0ZSBpbnN0YW5jZW9mIEhvdFJvdXRlKVxuXHRcdFx0bmV3Um91dGUgPSByb3V0ZTtcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0bmV3Um91dGUgPSByb3V0ZS5yb3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLnR5cGUgIT0gbnVsbClcblx0XHRcdFx0dHlwZSA9IHJvdXRlLnR5cGU7XG5cblx0XHRcdGlmIChyb3V0ZS5uYW1lICE9IG51bGwpXG5cdFx0XHRcdG5hbWUgPSByb3V0ZS5uYW1lO1xuXG5cdFx0XHRpZiAocm91dGUuZGVzY3JpcHRpb24gIT0gbnVsbClcblx0XHRcdFx0dGhpcy5kZXNjcmlwdGlvbiA9IHJvdXRlLmRlc2NyaXB0aW9uO1xuXG5cdFx0XHRpZiAocm91dGUucmV0dXJucyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodHlwZW9mIChyb3V0ZS5yZXR1cm5zKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMucmV0dXJucyA9IHtcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiByb3V0ZS5yZXR1cm5zXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLnJldHVybnMgPSByb3V0ZS5yZXR1cm5zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm91dGUucGFyYW1ldGVycyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7fTtcblxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGUucGFyYW1ldGVycylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBwYXJhbSA9IHJvdXRlLnBhcmFtZXRlcnNba2V5XTtcblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKHBhcmFtKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0aGlzLnBhcmFtZXRlcnNba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcInR5cGVcIjogcGFyYW0sXG5cdFx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChwYXJhbS50eXBlID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHBhcmFtLnR5cGUgPSBcInN0cmluZ1wiO1xuXG5cdFx0XHRcdFx0XHR0aGlzLnBhcmFtZXRlcnNba2V5XSA9IHBhcmFtO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm91dGUuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IHJvdXRlLmF1dGhDcmVkZW50aWFscztcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRvbkV4ZWN1dGUgPSByb3V0ZS5vblNlcnZlckV4ZWN1dGU7XG5cblx0XHRcdGlmIChyb3V0ZS5vblNlcnZlckF1dGhvcml6ZSAhPSBudWxsKVxuXHRcdFx0XHRvblNlcnZlckF1dGhvcml6ZSA9IHJvdXRlLm9uU2VydmVyQXV0aG9yaXplO1xuXG5cdFx0XHRpZiAocm91dGUub25SZWdpc3RlciAhPSBudWxsKVxuXHRcdFx0XHRvblJlZ2lzdGVyID0gcm91dGUub25SZWdpc3RlcjtcblxuXHRcdFx0aWYgKHJvdXRlLm9uUG9zdFJlZ2lzdGVyICE9IG51bGwpXG5cdFx0XHRcdHRoaXMub25Qb3N0UmVnaXN0ZXIgPSByb3V0ZS5vblBvc3RSZWdpc3RlcjtcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IHJvdXRlLm9uU2VydmVyRXhlY3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLm9uQ2xpZW50RXhlY3V0ZSA9IHJvdXRlLm9uQ2xpZW50RXhlY3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLnRlc3RDYXNlcyAhPSBudWxsKVxuXHRcdFx0XHR0ZXN0Q2FzZXMgPSByb3V0ZS50ZXN0Q2FzZXM7XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBBbGwgcm91dGUgbWV0aG9kcyBtdXN0IGhhdmUgYSBuYW1lIWApO1xuXG5cdFx0dGhpcy5yb3V0ZSA9IG5ld1JvdXRlO1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHR0aGlzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZXhlY3V0ZVNldHVwID0gZmFsc2U7XG5cdFx0dGhpcy5hdXRoQ3JlZGVudGlhbHMgPSBhdXRoQ3JlZGVudGlhbHM7XG5cdFx0dGhpcy5vblNlcnZlckF1dGhvcml6ZSA9IG9uU2VydmVyQXV0aG9yaXplO1xuXHRcdHRoaXMub25SZWdpc3RlciA9IG9uUmVnaXN0ZXI7XG5cdFx0dGhpcy50ZXN0Q2FzZXMgPSB7fTtcblxuXHRcdGlmICh0aGlzLnJvdXRlLmNvbm5lY3Rpb24ucHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RDYXNlcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdENhc2VzIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRlc3RDYXNlcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqID0gdGVzdENhc2VzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0ZXN0Q2FzZU5hbWU6IHN0cmluZyA9IG9iajtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZnVuYzogVGVzdENhc2VGdW5jdGlvbiA9ICg8VGVzdENhc2VGdW5jdGlvbj50ZXN0Q2FzZXNbaUlkeCArIDFdKTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlICh0ZXN0Q2FzZU5hbWUsIGZ1bmMpO1xuXHRcdFx0XHRcdFx0XHRpSWR4Kys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMuYWRkVGVzdENhc2UgKG9iaik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0ZXN0Q2FzZXMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9iaiA9IHRlc3RDYXNlc1trZXldO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlIChvYmopO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnJvdXRlLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IG9uRXhlY3V0ZTtcblx0XHQvL2Vsc2Vcblx0XHRcdC8vdGhpcy5vbkNsaWVudEV4ZWN1dGUgPSBvbkV4ZWN1dGU7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgbmV3IHRlc3QgY2FzZS5cblx0ICovXG5cdGFkZFRlc3RDYXNlIChuZXdUZXN0Q2FzZTogVGVzdENhc2VPYmplY3QgfCBzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uLCBcblx0XHRcdHRlc3RDYXNlRnVuY3Rpb246IFRlc3RDYXNlRnVuY3Rpb24gPSBudWxsKTogdm9pZFxuXHR7XG5cdFx0aWYgKHR5cGVvZiAobmV3VGVzdENhc2UpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IG5ld1Rlc3RDYXNlO1xuXHRcdFx0Y29uc3QgZnVuYzogVGVzdENhc2VGdW5jdGlvbiA9IHRlc3RDYXNlRnVuY3Rpb247XG5cblx0XHRcdHRoaXMudGVzdENhc2VzW25hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdFx0ZnVuYzogZnVuY1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiAobmV3VGVzdENhc2UpID09PSBcImZ1bmN0aW9uXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgdGVzdENhc2VJZDogbnVtYmVyID0gT2JqZWN0LmtleXMgKHRoaXMudGVzdENhc2VzKS5sZW5ndGg7XG5cdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJvdXRlLnJvdXRlfS8ke3RoaXMubmFtZX0gdGVzdCBjYXNlICR7dGVzdENhc2VJZH1gO1xuXHRcdFx0Y29uc3QgZnVuYzogVGVzdENhc2VGdW5jdGlvbiA9ICg8VGVzdENhc2VGdW5jdGlvbj5uZXdUZXN0Q2FzZSk7XG5cblx0XHRcdHRoaXMudGVzdENhc2VzW25hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdFx0ZnVuYzogZnVuY1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGVzdENhc2U6IFRlc3RDYXNlT2JqZWN0ID0gKDxUZXN0Q2FzZU9iamVjdD5uZXdUZXN0Q2FzZSk7XG5cdFx0dGhpcy50ZXN0Q2FzZXNbdGVzdENhc2UubmFtZV0gPSB0ZXN0Q2FzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlbGF0aXZlIHVybCBmcm9tIHRoaXMgbWV0aG9kIGFuZCBpdHMgcm91dGUuXG5cdCAqL1xuXHRnZXRSb3V0ZVVybCAoKTogc3RyaW5nXG5cdHtcblx0XHRpZiAodGhpcy5yb3V0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgUm91dGUgbWV0aG9kICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IHJvdXRlIWApO1xuXG5cdFx0bGV0IG1ldGhvZE5hbWU6IHN0cmluZyA9IFwiL1wiO1xuXG5cdFx0aWYgKHRoaXMucm91dGUudmVyc2lvbiAhPT0gXCJcIilcblx0XHRcdG1ldGhvZE5hbWUgKz0gYCR7dGhpcy5yb3V0ZS52ZXJzaW9ufS9gO1xuXG5cdFx0aWYgKHRoaXMucm91dGUucHJlZml4ICE9PSBcIlwiKVxuXHRcdFx0bWV0aG9kTmFtZSArPSBgJHt0aGlzLnJvdXRlLnByZWZpeH0vYDtcblxuXHRcdGlmICh0aGlzLnJvdXRlLnJvdXRlICE9PSBcIlwiKVxuXHRcdFx0bWV0aG9kTmFtZSArPSBgJHt0aGlzLnJvdXRlLnJvdXRlfS9gO1xuXG5cdFx0bWV0aG9kTmFtZSArPSB0aGlzLm5hbWU7XG5cblx0XHRyZXR1cm4gKG1ldGhvZE5hbWUpO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5cbi8qKlxuICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuICovXG5leHBvcnQgZW51bSBIb3RTZXJ2ZXJUeXBlXG57XG5cdEhUVFAsXG5cdFdlYlNvY2tldHMsXG5cdEdlbmVyYXRlLFxuXHRXZWJUZXN0aW5nLFxuXHRBUElUZXN0aW5nXG59XG5cbi8qKlxuICogVGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90U2VydmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdHlwZS5cblx0ICovXG5cdHNlcnZlclR5cGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgbmV0d29yayBhZGRyZXNzIHRvIGxpc3RlbiBvbi5cblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90U2VydmVyIGltcGxlbWVudHMgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqL1xuXHRsaXN0ZW5BZGRyZXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcG9ydHMgdG8gdXNlLlxuXHQgKi9cblx0cG9ydHM6IHtcblx0XHRcdGh0dHA6IG51bWJlcjtcblx0XHRcdGh0dHBzOiBudW1iZXI7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFNTTCBzZXR0aW5ncy5cblx0ICovXG5cdHNzbDoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2VydDogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIGtleSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGtleTogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIENBIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2E6IHN0cmluZztcblx0XHR9O1xuXHQvKipcblx0ICogUmVkaXJlY3QgSFRUUCB0cmFmZmljIHRvIEhUVFBTLlxuXHQgKi9cblx0cmVkaXJlY3RIVFRQdG9IVFRQUzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuXG5cdCAqL1xuXHRzZWNyZXRzOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSB8IEhvdFNlcnZlcilcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5zZXJ2ZXJUeXBlID0gXCJTZXJ2ZXJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHtcblx0XHRcdFx0XHRodHRwOiA1MDAwLFxuXHRcdFx0XHRcdGh0dHBzOiA0NDNcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMuc3NsID0ge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvci5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLnNlcnZlclR5cGUgPSBwcm9jZXNzb3Iuc2VydmVyVHlwZSB8fCBcIlNlcnZlclwiO1xuXHRcdFx0dGhpcy5hcGkgPSBwcm9jZXNzb3IuYXBpIHx8IG51bGw7XG5cdFx0XHR0aGlzLmxpc3RlbkFkZHJlc3MgPSBwcm9jZXNzb3IubGlzdGVuQWRkcmVzcyB8fCBcIjAuMC4wLjBcIjtcblx0XHRcdHRoaXMucG9ydHMgPSBwcm9jZXNzb3IucG9ydHMgfHwge1xuXHRcdFx0XHRcdGh0dHA6IDUwMDAsXG5cdFx0XHRcdFx0aHR0cHM6IDQ0M1xuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5zc2wgPSBwcm9jZXNzb3Iuc3NsIHx8IHtcblx0XHRcdFx0XHRjZXJ0OiBcIlwiLFxuXHRcdFx0XHRcdGtleTogXCJcIixcblx0XHRcdFx0XHRjYTogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWRpcmVjdEhUVFB0b0hUVFBTID0gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgIT0gbnVsbCA/IHByb2Nlc3Nvci5yZWRpcmVjdEhUVFB0b0hUVFBTIDogdHJ1ZTtcblx0XHRcdHRoaXMudHlwZSA9IHByb2Nlc3Nvci50eXBlIHx8IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0XHRcdHRoaXMuc2VjcmV0cyA9IHByb2Nlc3Nvci5zZWNyZXRzIHx8IHt9O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgYW4gQVBJIHRvIHRoaXMgc2VydmVyLiBUaGlzIHdpbGwgYWxzbyBzZXQgdGhlIGFzc29jaWF0ZWQgXG5cdCAqIHByb2Nlc3NvciB0byB0aGlzIEFQSSBhcyB3ZWxsLlxuXHQgKi9cblx0YXN5bmMgc2V0QVBJIChhcGk6IEhvdEFQSSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yLmFwaSA9IGFwaTtcblx0XHR0aGlzLmFwaSA9IGFwaTtcblxuXHRcdC8vaWYgKHJlZ2lzdGVyUm91dGVzID09PSB0cnVlKVxuXHRcdFx0Ly9hd2FpdCB0aGlzLmFwaS5yZWdpc3RlclJvdXRlcyAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIHJvdXRlIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGU/IChyb3V0ZTogSG90Um91dGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIHJlcXVlc3RzLlxuXHQgKi9cblx0YXN5bmMgbGlzdGVuPyAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogU2h1dGRvd24gdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHNodXRkb3duPyAoKTogUHJvbWlzZTx2b2lkPjtcbn0iLCJpbXBvcnQgKiBhcyBwcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZHVsZU5hbWUgZnJvbSBcInZhbGlkYXRlLW5wbS1wYWNrYWdlLW5hbWVcIjtcblxuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5cbmltcG9ydCB7IEhvdENvbXBvbmVudCwgSG90Q29tcG9uZW50T3V0cHV0LCBJSG90Q29tcG9uZW50IH0gZnJvbSBcIi4vSG90Q29tcG9uZW50XCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90QXNzZXQgfSBmcm9tIFwiLi9Ib3RBc3NldFwiO1xuaW1wb3J0IHsgSG90TW9kdWxlIH0gZnJvbSBcIi4vSG90TW9kdWxlXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcblxuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9ufSBmcm9tIFwiLi9Ib3RUZXN0RGVzdGluYXRpb25cIjtcblxuaW1wb3J0IHsgSG90U2l0ZSwgSG90U2l0ZVJvdXRlIH0gZnJvbSBcIi4vSG90U2l0ZVwiO1xuXG5pbXBvcnQgeyByZWdpc3RlckNvbXBvbmVudCB9IGZyb20gXCIuL0hvdFN0YXFSZWdpc3RlckNvbXBvbmVudFwiO1xuaW1wb3J0IHsgaG90U3RhcVdlYlN0YXJ0IH0gZnJvbSBcIi4vSG90U3RhcVdlYlN0YXJ0XCI7XG5cbnZhciBIb3RUZXN0ZXJNb2NoYTogYW55ID0gbnVsbDtcbnZhciBIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3RTZWxlbml1bURyaXZlcjogYW55ID0gbnVsbDtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBzdGFydGluZyBhIHBhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U3RhcnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBUaGUgSG90dCBzaXRlIHRvIGxvYWQuXG5cdCAqL1xuXHR1cmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCB0byBkaXNwbGF5LlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlIHRvIGxvYWQuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UgdG8gbG9hZCB0aGUgcGFnZS5cblx0ICovXG5cdHByb2Nlc3Nvcj86IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBBbnkgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG5ldyBwYWdlLlxuXHQgKi9cblx0YXJncz86IGFueTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgbWFwIHRvIHVzZS5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHRlc3RlciBhcGkuXG5cdCAqL1xuXHR0ZXN0ZXJBUElCYXNlVXJsPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGUgdGhhdCdzIFxuXHQgKiBwb2ludGVkIGF0IHRoZSB1cmwgYWJvdmUuXG5cdCAqL1xuXHR0ZXN0ZXJMYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJPzogSG90QVBJO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU/OiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgaW1wb3J0ZWQgbW9kdWxlcy5cblx0ICovXG5cdG1vZHVsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RNb2R1bGUgfTtcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKiBcblx0ICogQGZpeG1lIFJlbmFtZSB0aGlzIHRvIGNvbXBvbmVudFRhZ3MuXG5cdCAqL1xuXHRjb21wb25lbnRzPzoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RGaWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgbG9hZGVkIGhvdHNpdGUuXG5cdCAqL1xuXHRob3RTaXRlPzogSG90U2l0ZTtcbn1cblxuLyoqXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IGhhbmRsZXMgYWxsIEhUTUwgcHJlcHJvY2Vzc2luZywgdGhlbiBvdXRwdXRzIHRoZSBcbiAqIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RTdGFxIGltcGxlbWVudHMgSUhvdFN0YXFcbntcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgSG90U3RhcS5cblx0ICovXG5cdHN0YXRpYyB2ZXJzaW9uOiBzdHJpbmcgPSBcIjAuOC4yM1wiO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSB3ZWIgYnVpbGQuXG5cdCAqL1xuXHRzdGF0aWMgaXNXZWI6IGJvb2xlYW4gPSBmYWxzZTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGlzIGlzIHJlYWR5IGZvciB0ZXN0aW5nLlxuXHQgKi9cblx0c3RhdGljIGlzUmVhZHlGb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGlzIGV2ZW50IHdoZW4gdGhpcyBwYWdlIGlzIHJlYWR5IGZvciB0ZXN0aW5nLlxuXHQgKi9cblx0c3RhdGljIG9uUmVhZHlGb3JUZXN0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEVycm9ycyB0byBleGVjdXRlIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuXG5cdCAqL1xuXHRzdGF0aWMgZXJyb3JzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHJlZGlyZWN0VG9Vcmw/OiBzdHJpbmc7IGZ1bmM/OiAoZXJyVHlwZTogc3RyaW5nKSA9PiB2b2lkOyB9OyB9ID0ge307XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGV4ZWN1dGlvbiB0aGlzIGlzLlxuXHQgKi9cblx0bW9kZTogRGV2ZWxvcGVyTW9kZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdHRlc3RlckFQSTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFBhZ2UgfTtcblx0LyoqXG5cdCAqIFRoZSBpbXBvcnRlZCBtb2R1bGVzLlxuXHQgKi9cblx0bW9kdWxlczogeyBbbmFtZTogc3RyaW5nXTogSG90TW9kdWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICogXG5cdCAqIEBmaXhtZSBSZW5hbWUgdGhpcyB0byBjb21wb25lbnRUYWdzLlxuXHQgKi9cblx0Y29tcG9uZW50czoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU6IEhvdFNpdGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0YXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHR0ZXN0ZXJBcGlDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdHBhZ2VDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBZGQgYSBzdGFydCBkZWxheSBiZWZvcmUgc3RhcnRpbmcuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBtb3N0bHkuXG5cdCAqL1xuXHRzdGFydERlbGF5OiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgcHVibGljIGtleXMgdG8gYmUgZXhwb3NlZC5cblx0ICovXG5cdHB1YmxpY0tleXM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0ZXIgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFN0YXEgPSB7fSlcblx0e1xuXHRcdHRoaXMubG9nZ2VyID0gbmV3IEhvdExvZyAoSG90TG9nTGV2ZWwuQWxsKTtcblx0XHR0aGlzLnN0YXJ0RGVsYXkgPSAwO1xuXHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IGNvcHkudGVzdGVyQVBJIHx8IG51bGw7XG5cdFx0dGhpcy5tb2RlID0gY29weS5tb2RlIHx8IERldmVsb3Blck1vZGUuUHJvZHVjdGlvbjtcblx0XHR0aGlzLnBhZ2VzID0gY29weS5wYWdlcyB8fCB7fTtcblx0XHR0aGlzLm1vZHVsZXMgPSBjb3B5Lm1vZHVsZXMgfHwge307XG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IHt9O1xuXHRcdHRoaXMuaG90U2l0ZSA9IGNvcHkuaG90U2l0ZSB8fCBudWxsO1xuXHRcdHRoaXMuYXBpQ29udGVudCA9IGBcblx0XHRcdHtcblx0XHRcdFx0dmFyICVhcGlfbmFtZSUgPSAlYXBpX2V4cG9ydGVkX25hbWUlLiVhcGlfbmFtZSU7XG5cdFx0XHRcdHZhciBuZXdIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0XHR2YXIgbmV3YXBpID0gbmV3ICVhcGlfbmFtZSUgKCViYXNlX3VybCUsIG5ld0hvdENsaWVudCk7XG5cdFx0XHRcdG5ld0hvdENsaWVudC5hcGkgPSBuZXdhcGk7XG5cdFx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdhcGk7XG5cdFx0XHR9YDtcblx0XHR0aGlzLnRlc3RlckFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgSG90VGVzdGVyQVBJID0gSG90U3RhcVdlYi5Ib3RUZXN0ZXJBUEk7XG5cdFx0XHR2YXIgbmV3SG90VGVzdGVyQ2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXd0ZXN0ZXJhcGkgPSBuZXcgSG90VGVzdGVyQVBJICglYmFzZV90ZXN0ZXJfdXJsJSwgbmV3SG90VGVzdGVyQ2xpZW50KTtcblx0XHRcdG5ld0hvdFRlc3RlckNsaWVudC50ZXN0ZXJBUEkgPSBuZXd0ZXN0ZXJhcGk7XG5cdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO2A7XG5cdFx0dGhpcy5wYWdlQ29udGVudCA9IFxuYDwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG5cbjxoZWFkPlxuXHQ8dGl0bGU+JXRpdGxlJTwvdGl0bGU+XG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVob3RzdGFxX2pzX3NyYyVcIj48L3NjcmlwdD5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cblx0XHRmb3IgKGxldCBrZXkgaW4gSG90U3RhcVdlYilcblx0XHRcdHdpbmRvd1trZXldID0gSG90U3RhcVdlYltrZXldO1xuXHQ8L3NjcmlwdD5cblxuJWFwaXNfdG9fbG9hZCVcblxuXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuXHRcdGFzeW5jIGZ1bmN0aW9uIGhvdHN0YXFfc3RhcnRBcHAgKClcblx0XHR7XG5cdFx0XHRsZXQgdGVtcE1vZGUgPSAwO1xuXG5cdFx0XHRpZiAod2luZG93W1wiSG90XCJdICE9IG51bGwpXG5cdFx0XHRcdHRlbXBNb2RlID0gSG90Lk1vZGU7XG5cblx0XHRcdCVzdGFydF9kZWxheSVcblxuXHRcdFx0dmFyIHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXHRcdFx0cHJvY2Vzc29yLmxvZ2dlci5sb2dMZXZlbCA9ICVsb2dnaW5nX2xldmVsJTtcblxuXHRcdFx0dmFyIHByb21pc2VzID0gW107XG5cdFx0XHQlZGV2ZWxvcGVyX21vZGUlXG5cblx0XHRcdCVhcGlfY29kZSVcblxuXHRcdFx0JXB1YmxpY19zZWNyZXRzJVxuXHRcdFx0JXRlc3Rlcl9hcGklXG5cdFx0XHQlbG9hZF9maWxlcyVcblxuXHRcdFx0cHJvY2Vzc29yLm1vZGUgPSB0ZW1wTW9kZTtcblxuXHRcdFx0UHJvbWlzZS5hbGwgKHByb21pc2VzKS50aGVuIChmdW5jdGlvbiAoKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5VXJsICh7XG5cdFx0XHRcdFx0XHRcdHVybDogXCIldXJsJVwiLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiBcIiV0aXRsZSVcIixcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRcdGFyZ3M6ICVhcmdzJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZTogJXRlc3Rlcl9uYW1lJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTWFwOiAldGVzdGVyX21hcCUsXG5cdFx0XHRcdFx0XHRcdHRlc3RlckFQSUJhc2VVcmw6ICV0ZXN0ZXJfYXBpX2Jhc2VfdXJsJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyTGF1bmNocGFkVXJsOiAldGVzdGVyX2xhdW5jaHBhZF91cmwlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aG90c3RhcV9zdGFydEFwcCAoKTtcblx0PC9zY3JpcHQ+XG48L2hlYWQ+XG5cbjxib2R5PlxuPC9ib2R5PlxuXG48L2h0bWw+YDtcblx0XHR0aGlzLnB1YmxpY0tleXMgPSB7fTtcblx0XHR0aGlzLnRlc3RlcnMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBhIGJvb2xlYW4gdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VCb29sZWFuICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhblxuXHR7XG5cdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcImZhbHNlXCIpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ5ZXNcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwibm9cIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllcFwiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJuYWhcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSByZXF1aXJlZCBwYXJhbWV0ZXIgZXhpc3RzIGluc2lkZSBhbiBvYmplY3QuIElmIGl0IGV4aXN0cywgcmV0dXJuIHRoZSB2YWx1ZS5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbSAobmFtZTogc3RyaW5nLCBvYmpXaXRoUGFyYW06IGFueSwgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlLCB0aHJvd0V4Y2VwdGlvbjogYm9vbGVhbiA9IHRydWUpOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gb2JqV2l0aFBhcmFtW25hbWVdO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHJlcXVpcmVkID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhyb3dFeGNlcHRpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJHtuYW1lfS5gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0aWYgKHJlcXVpcmVkID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodmFsdWUgPT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhyb3dFeGNlcHRpb24gPT09IHRydWUpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAke25hbWV9LmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSByZXF1aXJlZCBwYXJhbWV0ZXIgZXhpc3RzIGluc2lkZSBhbiBvYmplY3QuIElmIGl0IGV4aXN0cywgcmV0dXJuIHRoZSB2YWx1ZS5cblx0ICogSWYgaXQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbURlZmF1bHQgKG5hbWU6IHN0cmluZywgb2JqV2l0aFBhcmFtOiBhbnksIGRlZmF1bHRWYWx1ZTogYW55KTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG9ialdpdGhQYXJhbVtuYW1lXTtcblxuXHRcdGlmICh2YWx1ZSA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChkZWZhdWx0VmFsdWUpO1xuXG5cdFx0aWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gXCJcIilcblx0XHRcdFx0cmV0dXJuIChkZWZhdWx0VmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYW4gZXJyb3IuIFRoaXMgY2Fubm90IGJlIGFuIGFzeW5jIGZ1bmN0aW9uIGR1ZSB0byB0aGUgbmF0dXJlIG9mIGhvdyB0aGlzIHdvcmtzLlxuXHQgKi9cblx0c3RhdGljIGV4ZWN1dGVFcnJvciAoZXJyVHlwZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKEhvdFN0YXEuZXJyb3JzW2VyclR5cGVdICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHVybDogc3RyaW5nID0gSG90U3RhcS5lcnJvcnNbZXJyVHlwZV0ucmVkaXJlY3RUb1VybDtcblxuXHRcdFx0aWYgKHVybCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXJsICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bGV0IGZ1bmMgPSBIb3RTdGFxLmVycm9yc1tlcnJUeXBlXS5mdW5jO1xuXG5cdFx0XHRpZiAoZnVuYyAhPSBudWxsKVxuXHRcdFx0XHRmdW5jIChlcnJUeXBlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXQgKG51bU1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cmV0dXJuIChhd2FpdCBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0c2V0VGltZW91dCAoKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlICgpO1xuXHRcdFx0XHRcdH0sIG51bU1pbGxpc2Vjb25kcyk7XG5cdFx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcGFnZS5cblx0ICovXG5cdGFkZFBhZ2UgKHBhZ2U6IEhvdFBhZ2UpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnBhZ2VzW3BhZ2UubmFtZV0gPSBwYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHBhZ2UgdG8gcHJvY2Vzcy5cblx0ICovXG5cdGdldFBhZ2UgKHBhZ2VOYW1lOiBzdHJpbmcpOiBIb3RQYWdlXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucGFnZXNbcGFnZU5hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gaW1wb3J0ZWQgbW9kdWxlLlxuXHQgKi9cblx0YWRkTW9kdWxlIChuYW1lOiBzdHJpbmcsIG1vZHVsZTogSG90TW9kdWxlKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5tb2R1bGVzW25hbWVdID0gbW9kdWxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbiBpbXBvcnRlZCBtb2R1bGUuXG5cdCAqL1xuXHRnZXRNb2R1bGUgKG5hbWU6IHN0cmluZyk6IEhvdE1vZHVsZVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLm1vZHVsZXNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUuXG5cdCAqL1xuXHRhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogdm9pZFxuXHR7XG5cdFx0bGV0IG5hbWU6IHN0cmluZyA9IGZpbGUubmFtZTtcblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0bmFtZSA9IGZpbGUubG9jYWxGaWxlO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS51cmw7XG5cblx0XHR0aGlzLmZpbGVzW25hbWVdID0gZmlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBmaWxlLlxuXHQgKi9cblx0Z2V0RmlsZSAobmFtZTogc3RyaW5nLCB0aHJvd0V4OiBib29sZWFuID0gdHJ1ZSk6IEhvdEZpbGVcblx0e1xuXHRcdGlmICh0aGlzLmZpbGVzW25hbWVdID09IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHBvczogbnVtYmVyID0gbmFtZS5pbmRleE9mIChcIj9oc3Rxc2VydmU9XCIpO1xuXHRcdFx0bGV0IHRlbXBOYW1lOiBzdHJpbmcgPSBuYW1lO1xuXG5cdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHRlbXBOYW1lID0gbmFtZS5zdWJzdHJpbmcgKDAsIHBvcyk7XG5cblx0XHRcdGlmICh0aGlzLmZpbGVzW3RlbXBOYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRyZXR1cm4gKHRoaXMuZmlsZXNbdGVtcE5hbWVdKTtcblxuXHRcdFx0aWYgKHRocm93RXggPT09IHRydWUpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGZpbGUgJHtuYW1lfWApO1xuXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXHRcdH1cblxuXHRcdHJldHVybiAodGhpcy5maWxlc1tuYW1lXSk7XG5cdH1cblxuXHQvKiogXG5cdCAqIEtlZXAgdGhlIGNvbnRleHQgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgaW4uXG5cdCAqIFxuXHQgKiBAcGFyYW0gZnVuYyBUaGUgZG9jdW1lbnQgZWxlbWVudCdzIGlkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgb2JqZWN0IHRvIHJlbWFpbiBpbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gW3ZhbD11bmRlZmluZWRdIEFuIGFkZGl0aW9uYWwgdmFsdWUgdG8gcGFzcyB0byB0aGUgY29udGV4dC5cblx0ICogQHJldHVybiBUaGUgcmV0dXJuZWQgcmVzdWx0IGZyb20gdGhlIGZ1bmN0aW9uIGZ1bmMuXG5cdCAqL1xuXHRzdGF0aWMga2VlcENvbnRleHQoZnVuYzogRnVuY3Rpb24sIGNvbnRleHQ6IGFueSwgdmFsPzogYW55KTogYW55XG5cdHtcblx0XHR2YXIgb2JqUmV0dXJuID0gZnVuY3Rpb24oKVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgYXJ5QXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cblx0XHRcdFx0aWYgKHZhbCAhPSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0YXJ5QXJncy5wdXNoKHZhbCk7XG5cblx0XHRcdFx0aWYgKGNvbnRleHQgPT0gbnVsbClcblx0XHRcdFx0XHRyZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcnlBcmdzKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyeUFyZ3MpO1xuXHRcdFx0fTtcblxuXHRcdHJldHVybiBvYmpSZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFuZCByZWdpc3RlciBhIGNvbXBvbmVudC5cblx0ICovXG5cdGFkZENvbXBvbmVudCAoQ29tcG9uZW50VHlwZTogKG5ldyAoY29weTogSUhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaT86IEhvdEFQSSkgPT4gSG90Q29tcG9uZW50KSwgYXBpOiBIb3RBUEkgPSBudWxsLCBcblx0XHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zID0gdW5kZWZpbmVkKTogdm9pZFxuXHR7XG5cdFx0bGV0IHRlbXBBcGkgPSB0aGlzLmFwaVxuXG5cdFx0aWYgKGFwaSAhPSBudWxsKVxuXHRcdFx0dGVtcEFwaSA9IGFwaTtcblxuXHRcdGxldCB0ZW1wQ29tcG9uZW50T2JqID0gbmV3IENvbXBvbmVudFR5cGUgKHRoaXMsIHRlbXBBcGkpO1xuXG5cdFx0aWYgKHRoaXMuY29tcG9uZW50c1t0ZW1wQ29tcG9uZW50T2JqLnRhZ10gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYENvbXBvbmVudCAke3RlbXBDb21wb25lbnRPYmoudGFnfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMuY29tcG9uZW50c1t0ZW1wQ29tcG9uZW50T2JqLnRhZ10gPSB7IGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUsIHByb2Nlc3NvcjogdGhpcywgYXBpOiB0ZW1wQXBpIH07XG5cdFx0cmVnaXN0ZXJDb21wb25lbnQuY2FsbCAodGhpcywgdGVtcENvbXBvbmVudE9iai50YWcsIGVsZW1lbnRPcHRpb25zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0IGFueSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIG9ubHkgYWNjb3VudHMgZm9yIDx0cj4gY3VycmVudGx5LlxuXHQgKi9cblx0c3RhdGljIGZpeEhUTUwgKHN0cjogc3RyaW5nKTogeyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH1cblx0e1xuXHRcdC8vIFRha2UgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gWE1MIGFuZCBIVE1MLlxuXHRcdGNvbnN0IHRlbXBTdHI6IHN0cmluZyA9IHN0ci5yZXBsYWNlKC8gXFwvPi9nLCAnPicpLnJlcGxhY2UoXG5cdFx0XHQvKDwoYXJlYXxiYXNlfGJyfGNvbHxjb21tYW5kfGVtYmVkfGhyfGltZ3xpbnB1dHxrZXlnZW58bGlua3xtZXRhfHBhcmFtfHNvdXJjZXx0cmFja3x3YnIpLio/PikvZywgJyQxPC8kMj4nKTtcblx0XHRjb25zdCBwYXJzZWRYTUwgPSBuZXcgRE9NUGFyc2VyICgpLnBhcnNlRnJvbVN0cmluZyAoYDx4bWw+JHt0ZW1wU3RyfTwveG1sPmAsIFwidGV4dC94bWxcIik7XG5cdFx0bGV0IHF1ZXJ5U2VsZWN0b3I6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocGFyc2VkWE1MLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRhZ05hbWU6IHN0cmluZyA9IHBhcnNlZFhNTC5kb2N1bWVudEVsZW1lbnQuY2hpbGRyZW5bMF0udGFnTmFtZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwidHJcIilcblx0XHRcdHtcblx0XHRcdFx0c3RyID0gYDx0YWJsZT4ke3N0cn08L3RhYmxlPmA7XG5cdFx0XHRcdHF1ZXJ5U2VsZWN0b3IgPSBcInRib2R5XCI7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0YWdOYW1lID09PSBcInRoXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHN0ciA9IGA8dGFibGU+JHtzdHJ9PC90YWJsZT5gO1xuXHRcdFx0XHRxdWVyeVNlbGVjdG9yID0gdGFnTmFtZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHsgZml4ZWRTdHI6IHN0ciwgcXVlcnlTZWxlY3RvcjogcXVlcnlTZWxlY3RvciB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBuZXcgSFRNTCBlbGVtZW50KHMpIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LlxuXHQgKi9cblx0c3RhdGljIGFkZEh0bWwgKHBhcmVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGh0bWw6IHN0cmluZyB8IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBIVE1MRWxlbWVudFtdXG5cdHtcblx0XHRsZXQgZm91bmRQYXJlbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKHBhcmVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRmb3VuZFBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKHBhcmVudCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm91bmRQYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHRpZiAoZm91bmRQYXJlbnQgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCAke3BhcmVudH0hYCk7XG5cblx0XHRsZXQgcmVzdWx0OiBIVE1MRWxlbWVudCA9IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIChodG1sKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRsZXQgaHRtbEhhbmRsZXIgPSBIb3RTdGFxLmZpeEhUTUwgKGh0bWwpO1xuXHRcdFx0bGV0IG5ld0RPTTogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyICgpLnBhcnNlRnJvbVN0cmluZyAoaHRtbEhhbmRsZXIuZml4ZWRTdHIsIFwidGV4dC9odG1sXCIpO1xuXHRcdFx0bGV0IGNoaWxkcmVuOiBhbnkgPSBudWxsO1xuXG5cdFx0XHRpZiAoaHRtbEhhbmRsZXIucXVlcnlTZWxlY3RvciA9PT0gXCJcIilcblx0XHRcdFx0Y2hpbGRyZW4gPSBuZXdET00uYm9keS5jaGlsZHJlbjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2hpbGRyZW4gPSBuZXdET00ucXVlcnlTZWxlY3RvciAoaHRtbEhhbmRsZXIucXVlcnlTZWxlY3RvcikuY2hpbGRyZW47XG5cblx0XHRcdGxldCByZXN1bHRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmNoaWxkcmVuW2lJZHhdKTtcblxuXHRcdFx0XHRyZXN1bHRzLnB1c2ggKGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChjaGlsZCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRyZXN1bHQgPSBmb3VuZFBhcmVudC5hcHBlbmRDaGlsZCAoaHRtbCk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBIb3RTaXRlJ3MgbmFtZSBpcyB2YWxpZC5cblx0ICovXG5cdHN0YXRpYyBjaGVja0hvdFNpdGVOYW1lIChob3RzaXRlTmFtZTogc3RyaW5nLCB0aHJvd0V4Y2VwdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhblxuXHR7XG5cdFx0bGV0IHJlc3VsdHMgPSB2YWxpZGF0ZU1vZHVsZU5hbWUgKGhvdHNpdGVOYW1lKTtcblx0XHRsZXQgaXNWYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRpZiAocmVzdWx0cy52YWxpZEZvck5ld1BhY2thZ2VzID09PSBmYWxzZSlcblx0XHRcdGlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdGlmIChyZXN1bHRzLmVycm9ycyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChyZXN1bHRzLmVycm9ycy5sZW5ndGggPiAwKVxuXHRcdFx0XHRpc1ZhbGlkID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGlzVmFsaWQgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90U2l0ZSAke2hvdHNpdGVOYW1lfSBoYXMgYW4gaW52YWxpZCBuYW1lISBUaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkgYW5kIG11c3QgaGF2ZSBhIHZhbGlkIE5QTSBtb2R1bGUgbmFtZS5gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGlzVmFsaWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluIHRoZSBzdXBwbGllZCBjb250ZW50LCByZXBsYWNlIGEga2V5IGluIGEgJHtLRVl9IHdpdGggYSB2YWx1ZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZW50IHdpdGggdGhlIGNvcnJlY3QgdmFsdWVzLlxuXHQgKi9cblx0c3RhdGljIHJlcGxhY2VLZXkgKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGNvbnN0IGZpbmFsU3RyOiBzdHJpbmcgPSBjb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKGBcXFxcJFxcXFx7JHtrZXl9XFxcXH1gLCBcImdcIiksIHZhbHVlKTtcblxuXHRcdHJldHVybiAoZmluYWxTdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHZhbHVlIGZyb20gYSBIb3RTaXRlIG9iamVjdC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIGZyb20gdGhlIGhvdHNpdGUgb2JqZWN0LiBSZXR1cm5zIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHN0YXRpYyBnZXRWYWx1ZUZyb21Ib3RTaXRlT2JqIChob3RzaXRlOiBIb3RTaXRlLCBwYXJhbXM6IHN0cmluZ1tdKTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG51bGw7XG5cblx0XHRpZiAoaG90c2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBwcmV2VmFsdWU6IGFueSA9IGhvdHNpdGU7XG5cblx0XHRcdC8vIEdvIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBhbmQgXG5cdFx0XHQvLyBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaW5hbCBwYXJhbWV0ZXIuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHBhcmFtcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhcmFtOiBzdHJpbmcgPSBwYXJhbXNbaUlkeF07XG5cblx0XHRcdFx0aWYgKHByZXZWYWx1ZVtwYXJhbV0gPT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHByZXZWYWx1ZSA9IG51bGw7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZXZWYWx1ZSA9IHByZXZWYWx1ZVtwYXJhbV07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmV2VmFsdWUgIT0gbnVsbClcblx0XHRcdFx0dmFsdWUgPSBwcmV2VmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzSG90U2l0ZSAodGVzdGVyOiBIb3RUZXN0ZXIgPSBudWxsKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0SG90U3RhcS5jaGVja0hvdFNpdGVOYW1lICh0aGlzLmhvdFNpdGUubmFtZSwgdHJ1ZSk7XG5cblx0XHRsZXQgcm91dGVzID0gdGhpcy5ob3RTaXRlLnJvdXRlcztcblxuXHRcdGlmIChyb3V0ZXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGVzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcm91dGU6IEhvdFNpdGVSb3V0ZSA9IHJvdXRlc1trZXldO1xuXHRcdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlIChyb3V0ZSk7XG5cdFx0XHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcyxcblx0XHRcdFx0XHRcdG5hbWU6IHJvdXRlLm5hbWUgfHwgXCJcIixcblx0XHRcdFx0XHRcdHJvdXRlOiBrZXksXG5cdFx0XHRcdFx0XHRmaWxlczogW2ZpbGVdXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0gcm91dGUubmFtZTtcblx0XHRcdFx0XHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLm1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChyb3V0ZS5tYXApID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IG1hcCAke3JvdXRlLm1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0gPSB0ZXN0ZXIudGVzdE1hcHNbcm91dGUubWFwXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0ZXN0TWFwID0gbmV3IEhvdFRlc3RNYXAgKCk7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGRlc3RpbmF0aW9uczogSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RGVzdGluYXRpb24gfSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGUubWFwIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zID0gW107XG5cblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgcm91dGUubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdCA9IHJvdXRlLm1hcFtpSWR4XTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzdGluYXRpb25zID0ge307XG5cblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gcm91dGUubWFwKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdCA9IHJvdXRlLm1hcFtrZXkyXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnNba2V5Ml0gPSBuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucyA9IGRlc3RpbmF0aW9ucztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChyb3V0ZS5kZXN0aW5hdGlvbk9yZGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXS5kZXN0aW5hdGlvbk9yZGVyID0gcm91dGUuZGVzdGluYXRpb25PcmRlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUuYXBpcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUuYXBpcylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW2tleV07XG5cblx0XHRcdFx0aWYgKGFwaS5tYXAgPT0gbnVsbClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gZmFsc2UpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBrZXk7XG5cdFx0XHRcdFx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IG5ldyBIb3RUZXN0TWFwICgpO1xuXG5cdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFwaS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBtYXA6IHN0cmluZyA9IGFwaS5tYXBbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAobWFwKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoXCJBIHRlc3RlciB3YXMgbm90IGNyZWF0ZWQgZmlyc3QhIFlvdSBtdXN0IHNwZWNpZnkgb25lIGluIHRoZSBDTEkuXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vLyBAZml4bWUgQWxsb3cgdGhpcyB0byB3b3JrIGZvciBzZXJ2ZXItc2lkZSBhcyB3ZWxsLi4uXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5jb21wb25lbnRzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY29tcG9uZW50ID0gdGhpcy5ob3RTaXRlLmNvbXBvbmVudHNba2V5XTtcblx0XHRcdFx0bGV0IGNvbXBvbmVudFVybDogc3RyaW5nID0gY29tcG9uZW50LnVybDtcblxuXHRcdFx0XHQvLy8gQGZpeG1lIENyZWF0ZSB1bml0IHRlc3QgZm9yIGZldGNoaW5nLCBsb2FkaW5nLCBhbmQgcmVnaXN0ZXJpbmcuXG5cdFx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChjb21wb25lbnRVcmwpO1xuXHRcdFx0XHRsZXQgQ29tcG9uZW50Q2xhc3MgPSBldmFsIChyZXMpO1xuXG5cdFx0XHRcdHRoaXMuYWRkQ29tcG9uZW50IChDb21wb25lbnRDbGFzcyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgPT0gbnVsbClcblx0XHRcdHRoaXMuaG90U2l0ZS5yb3V0ZXMgPSB7fTtcblxuXHRcdGxldCBkaXNhYmxlRmlsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUuZGlzYWJsZUZpbGVMb2FkaW5nICE9IG51bGwpXG5cdFx0XHRkaXNhYmxlRmlsZUxvYWRpbmcgPSB0aGlzLmhvdFNpdGUuZGlzYWJsZUZpbGVMb2FkaW5nO1xuXG5cdFx0aWYgKGRpc2FibGVGaWxlTG9hZGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCB0aGlzLmxvYWRIb3RGaWxlcyAodGhpcy5ob3RTaXRlLmZpbGVzLCBmYWxzZSwgZmFsc2UpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBIb3RzaXRlIGhhcyBmaWxlIGxvYWRpbmcgZGlzYWJsZWQuLi5gKTtcblxuXHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdHRoaXMuYWRkVGVzdGVyICh0ZXN0ZXIpO1xuXG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYFByb2Nlc3NlZCBIb3RTaXRlICR7dGhpcy5ob3RTaXRlLm5hbWV9YCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBmcm9tIGEgSG90U2l0ZS5qc29uIGZpbGUuIEJlIHN1cmUgdG8gbG9hZCBhbmQgYXR0YWNoIGFueSB0ZXN0ZXJzIGJlZm9yZSBcblx0ICogbG9hZGluZyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGpzb25TdHI6IHN0cmluZyA9IFwiXCI7XG5cdFx0Y29uc3QgZXh0OiBzdHJpbmcgPSBwcGF0aC5leHRuYW1lIChwYXRoKS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBEb3dubG9hZGluZyBIb3RTaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0bGV0IHJlczogYW55ID0gYXdhaXQgZmV0Y2ggKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRG93bmxvYWRlZCBzaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0anNvblN0ciA9IHJlcy50ZXh0ICgpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cGF0aCA9IHBwYXRoLm5vcm1hbGl6ZSAocGF0aCk7XG5cblx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBBY2Nlc3NpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGxldCBIb3RJTyA9IGV2YWwgKFwicmVxdWlyZVwiKShcIi4vSG90SU9cIikuSG90SU87IC8vIEhhY2sgdG8gZ2V0IGFyb3VuZCBXZWJwYWNrLlxuXHRcdFx0anNvblN0ciA9IGF3YWl0IEhvdElPLnJlYWRUZXh0RmlsZSAocGF0aCk7XG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgQWNjZXNzZWQgc2l0ZSAke3BhdGh9YCk7XG5cdFx0fVxuXG5cdFx0aWYgKChleHQgPT09IFwiLnlhbWxcIikgfHwgKGV4dCA9PT0gXCIueW1sXCIpKVxuXHRcdHtcblx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBZQU1MIHN1cHBvcnQgZm9yIEhvdFNpdGVzIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIHdlYiB5ZXQhYCk7XG5cblx0XHRcdGxldCB5YW1sID0gZXZhbCAoXCJyZXF1aXJlXCIpKFwieWFtbFwiKTsgLy8gSGFjayB0byBnZXQgYXJvdW5kIFdlYnBhY2suXG5cdFx0XHR0aGlzLmhvdFNpdGUgPSB5YW1sLnBhcnNlIChqc29uU3RyKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5ob3RTaXRlID0gSlNPTi5wYXJzZSAoanNvblN0cik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7cGF0aH0gY2Fubm90IGJlIG51bGwhYCk7XG5cblx0XHR0aGlzLmhvdFNpdGUuaG90c2l0ZVBhdGggPSBwYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmUgdGhlIGN1cnJlbnQgSG90U2l0ZSB0byBhIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBzYXZlSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDYW5ub3Qgc2F2ZSBhIEhvdFNpdGUgb24gdGhlIHdlYiFgKTtcblxuXHRcdGNvbnN0IGhvdHNpdGVTdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5ICh0aGlzLmhvdFNpdGUsIG51bGwsIDIpO1xuXG5cdFx0bGV0IEhvdElPID0gZXZhbCAoXCJyZXF1aXJlXCIpKFwiLi9Ib3RJT1wiKS5Ib3RJTzsgLy8gSGFjayB0byBnZXQgYXJvdW5kIFdlYnBhY2suXG5cdFx0YXdhaXQgSG90SU8ud3JpdGVUZXh0RmlsZSAocGF0aCwgaG90c2l0ZVN0cik7XG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYFNhdmVkIHNpdGUgJHtwYXRofWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgYW4gYXJyYXkgb2YgZmlsZXMuIElmIGEgZmlsZSBhbHJlYWR5IGhhcyBjb250ZW50LCBpdCB3aWxsIG5vdCBiZSByZWxvYWRlZCBcblx0ICogdW5sZXNzIGZvcmNlQ29udGVudExvYWRpbmcgaXMgc2V0IHRvIHRydWUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90RmlsZXMgKGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHVybD86IHN0cmluZzsgbG9jYWxGaWxlPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9IH0sIFxuXHRcdFx0Zm9yY2VDb250ZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlLCBsb2FkVXJsQ29udGVudDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgTG9hZGluZyBIb3R0IGZpbGVzLi4uYCk7XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gZmlsZXMpXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGUgPSBmaWxlc1trZXldO1xuXHRcdFx0bGV0IG5ld0ZpbGU6IEhvdEZpbGUgPSBudWxsO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0bmV3RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcdFx0XHRcIm5hbWVcIjoga2V5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmlsZS51cmwgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHRcdFx0bmV3RmlsZS51cmwgPSBgJHtmaWxlLnVybH0/aHN0cXNlcnZlPW5haGZhbWA7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRuZXdGaWxlLnVybCA9IGZpbGUudXJsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gZmFsc2UpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChmaWxlLmxvY2FsRmlsZSAhPSBudWxsKVxuXHRcdFx0XHRcdG5ld0ZpbGUubG9jYWxGaWxlID0gZmlsZS5sb2NhbEZpbGU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBsb2FkQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdGlmIChmaWxlLmNvbnRlbnQgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0bmV3RmlsZS5jb250ZW50ID0gZmlsZS5jb250ZW50O1xuXHRcdFx0XHRsb2FkQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZm9yY2VDb250ZW50TG9hZGluZyA9PT0gdHJ1ZSlcblx0XHRcdFx0bG9hZENvbnRlbnQgPSB0cnVlO1xuXG5cdFx0XHRpZiAobG9hZFVybENvbnRlbnQgPT09IGZhbHNlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAobmV3RmlsZS51cmwgIT09IFwiXCIpXG5cdFx0XHRcdFx0bG9hZENvbnRlbnQgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxvYWRDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgTG9hZGluZyBIb3R0IGZpbGU6ICR7bmV3RmlsZS51cmx9YCk7XG5cdFx0XHRcdGF3YWl0IG5ld0ZpbGUubG9hZCAoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYEZpbmlzaGVkIGxvYWRpbmcgSG90dCBmaWxlOiAke25ld0ZpbGUudXJsfWApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmFkZEZpbGUgKG5ld0ZpbGUpO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBGaW5pc2hlZCBsb2FkaW5nIEhvdHQgZmlsZXMuLi5gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZSB0aGUgY29udGVudCB0byBzZW5kIHRvIGEgY2xpZW50LlxuXHQgKi9cblx0YXN5bmMgZ2VuZXJhdGVDb250ZW50IChyb3V0ZUtleTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCB1cmw6IHN0cmluZyA9IFwiLi9cIixcblx0XHRcdGpzU3JjUGF0aDogc3RyaW5nID0gXCIuL2pzL0hvdFN0YXEubWluLmpzXCIsIHBhc3NBcmdzOiBib29sZWFuID0gdHJ1ZSwgXG5cdFx0XHRhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgYXBpU2NyaXB0czogc3RyaW5nID0gXCJcIjtcblx0XHRsZXQgYXBpQ29kZTogc3RyaW5nID0gXCJcIjtcblx0XHRsZXQgcHVibGljS2V5czogc3RyaW5nID0gXCJcIjtcblxuXHRcdC8vLyBAdG9kbyBPcHRpbWl6ZSB0aGlzIGZ1bmN0aW9uIGFzIG11Y2ggYXMgcG9zc2libGUuXG5cblx0XHQvLyBMb2FkIHRoZSBBUEkgc3RyaW5nLlxuXHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgZ2xvYmFsQXBpID0gdGhpcy5ob3RTaXRlLmFwaXNbdGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGldO1xuXG5cdFx0XHRcdFx0aWYgKGdsb2JhbEFwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBleGlzdCFgKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHNlbmRKU0NvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLmpzYXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEganNhcGkgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEgbGlicmFyeU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpLmFwaU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBhcGlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHNlbmRKU0NvbnRlbnQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFwaVNjcmlwdHMgKz0gYFxcdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIke2dsb2JhbEFwaS5qc2FwaX1cIj48L3NjcmlwdD5cXG5gO1xuXG5cdFx0XHRcdFx0XHRcdGxldCBiYXNlVXJsOiBzdHJpbmcgPSBcIlxcXCJcXFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS51cmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke2dsb2JhbEFwaS51cmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHt0aGlzLmFwaS5iYXNlVXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdGxldCB0ZW1wQVBJQ29udGVudDogc3RyaW5nID0gdGhpcy5hcGlDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9uYW1lXFwlL2csIGdsb2JhbEFwaS5hcGlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfZXhwb3J0ZWRcXF9uYW1lXFwlL2csIGdsb2JhbEFwaS5saWJyYXJ5TmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWJhc2VcXF91cmxcXCUvZywgYmFzZVVybCk7XG5cblx0XHRcdFx0XHRcdFx0YXBpQ29kZSArPSB0ZW1wQVBJQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5hcGlzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldO1xuXG5cdFx0XHRcdGlmIChyb3V0ZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHJvdXRlLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBhcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1tyb3V0ZS5hcGldO1xuXG5cdFx0XHRcdFx0XHRpZiAoYXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIEFQSSAke3JvdXRlLmFwaX1gKTtcblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLmFwaSAhPT0gdGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBzZW5kSlNDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoYXBpLmpzYXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGpzYXBpIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcGkubGlicmFyeU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEgbGlicmFyeU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlbmRKU0NvbnRlbnQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQganNhcGlwYXRoID0gYXBpLmpzYXBpO1xuXHRcdFx0XHRcdFx0XHRcdGFwaVNjcmlwdHMgKz0gYFxcdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIke2pzYXBpcGF0aH1cIj48L3NjcmlwdD5cXG5gO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhcGkudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke2FwaS51cmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7dGhpcy5hcGkuYmFzZVVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCB0ZW1wQVBJQ29udGVudDogc3RyaW5nID0gdGhpcy5hcGlDb250ZW50O1xuXHRcdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgYXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2V4cG9ydGVkXFxfbmFtZVxcJS9nLCBhcGkubGlicmFyeU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWJhc2VcXF91cmxcXCUvZywgYmFzZVVybCk7XG5cblx0XHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aCAhPSBudWxsKVxuXHRcdFx0XHRcdGpzU3JjUGF0aCA9IHRoaXMuaG90U2l0ZS5zZXJ2ZXIuanNTcmNQYXRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnB1YmxpY0tleXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHNlY3JldCA9IHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzW2tleV07XG5cdFx0XHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChzZWNyZXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VjcmV0KTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaS5jb25uZWN0aW9uID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDYW5ub3QgcGFzcyBzZWNyZXRzIGZyb20gdGhlIEFQSSBpZiB0aGVyZSdzIG5vIGNvbm5lY3Rpb24hYCk7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgc2VydmVyQ29ubjogSG90U2VydmVyID0gKDxIb3RTZXJ2ZXI+dGhpcy5hcGkuY29ubmVjdGlvbik7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoc2VjcmV0LnBhc3NTZWNyZXRGcm9tQVBJICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5IChzZXJ2ZXJDb25uLnNlY3JldHNba2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoc2VjcmV0LmVudiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBAc2VjdnVsIElzIHRoaXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5PyBOZWVkIHRvIHZlcmlmeSB0aGF0IFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBvbmx5IHRoZSBzZXJ2ZXIgaGFzIGFjY2VzcyB0byB0aGlzLiBBdCB0aGlzIHBvaW50LCBJIHRoaW5rIG9ubHkgdGhlIFxuXHRcdFx0XHRcdFx0XHRcdC8vLyBzZXJ2ZXIgaGFzIGFjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBlbnZLZXk6IHN0cmluZyA9IHNlY3JldC5lbnY7XG5cblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5IChwcm9jZXNzLmVudltlbnZLZXldKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHB1YmxpY0tleXMgKz0gYHByb2Nlc3Nvci5wdWJsaWNLZXlzW1wiJHtrZXl9XCJdID0gJHt2YWx1ZX07XFxuYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSB0aGlzLnBhZ2VDb250ZW50O1xuXHRcdGxldCBmaXhDb250ZW50ID0gYXN5bmMgKHRlbXBDb250ZW50OiBzdHJpbmcpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXZlbG9wZXJNb2RlU3RyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyQVBJU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkZXZlbG9wZXJNb2RlU3RyID0gYHRlbXBNb2RlID0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50O2A7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRoaXMudGVzdGVyQXBpQ29udGVudDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRlc3RlckFQSVN0ci5yZXBsYWNlICgvXFwlYmFzZVxcX3Rlc3RlclxcX3VybFxcJS9nLCBgXFxcIiR7dGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybH1cXFwiYCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgbG9hZEZpbGVzOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyAodGhpcy5maWxlcykubGVuZ3RoID4gMClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgdmFyIGZpbGVzID0ge307XFxuXFxuYDtcblxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmZpbGVzKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBmaWxlID0gdGhpcy5maWxlc1trZXldO1xuXHRcdFx0XHRcdFx0bGV0IGFzc2V0OiBIb3RBc3NldCA9IG5ldyBIb3RBc3NldCAoXCJodG1sXCIsIGtleSk7XG5cblx0XHRcdFx0XHRcdGlmIChmaWxlLmxvY2FsRmlsZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXNzZXQucGF0aCA9IGZpbGUubG9jYWxGaWxlO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlsZS51cmwgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdGFzc2V0LnBhdGggPSBmaWxlLnVybDtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbGUuY29udGVudCAhPT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXNzZXQucGF0aCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGFzc2V0LmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQgPSBhd2FpdCBhc3NldC5vdXRwdXQgKCk7XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKG91dHB1dCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYER1cmluZyBpbml0aWFsIGxvYWQsIEhUTUwgYXNzZXRzIGNhbm5vdCBiZSBvdXRwdXR0ZWQgdXNpbmcgb25seSBhIHN0cmluZyFgKTtcblxuXHRcdFx0XHRcdFx0bGV0IGZpbGVVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZUNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChvdXRwdXQudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGZpbGVVcmwgPSBgXCJ1cmxcIjogXCIke291dHB1dC51cmx9XCIsIGA7XG5cblx0XHRcdFx0XHRcdGlmIChvdXRwdXQuY29udGVudCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRmaWxlQ29udGVudCA9IGBcImNvbnRlbnRcIjogJHtvdXRwdXQuY29udGVudH1gOyAvLyBNYXkgaGF2ZSB0byBlc2NhcGUgdGhlIGNvbnRlbnQ/XG5cblx0XHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgXFx0XFx0XFx0ZmlsZXNbXCIke291dHB1dC5uYW1lfVwiXSA9IHsgJHtmaWxlVXJsfSR7ZmlsZUNvbnRlbnR9IH07XFxuYDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYFxcdFxcdFxcdHByb21pc2VzLnB1c2ggKHByb2Nlc3Nvci5sb2FkSG90RmlsZXMgKGZpbGVzKSk7XFxuYDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRpdGxlXFwlL2csIG5hbWUpO1xuXG5cdFx0XHRcdGlmIChwYXNzQXJncyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIFwiSG90LkFyZ3VtZW50c1wiKTtcblxuXHRcdFx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWFyZ3NcXCUvZywgSlNPTi5zdHJpbmdpZnkgKGFyZ3MpKTtcblxuXHRcdFx0XHRsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSByb3V0ZUtleTtcblx0XHRcdFx0bGV0IHRlc3RlclVybDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckxhdW5jaHBhZFVybDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnRlc3RlcnMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0ga2V5O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubGF1bmNocGFkVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTGF1bmNocGFkVXJsID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlcyAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgcm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XTtcblx0XHRcdFx0XHRcdFx0dGVzdGVyTWFwID0gcm91dGUubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgc3RhcnREZWxheVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5zdGFydERlbGF5ICE9PSAwKVxuXHRcdFx0XHRcdHN0YXJ0RGVsYXlTdHIgPSBgYXdhaXQgSG90U3RhcS53YWl0ICgke3RoaXMuc3RhcnREZWxheX0pO2A7XG5cblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlc3RhcnRcXF9kZWxheVxcJS9nLCBzdGFydERlbGF5U3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9nZ2luZ1xcX2xldmVsXFwlL2csIGBIb3RMb2dMZXZlbC4ke0hvdExvZ0xldmVsW3RoaXMubG9nZ2VyLmxvZ0xldmVsXX1gKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlaG90c3RhcVxcX2pzXFxfc3JjXFwlL2csIGpzU3JjUGF0aCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWRldmVsb3BlclxcX21vZGVcXCUvZywgZGV2ZWxvcGVyTW9kZVN0cik7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2FwaVxcJS9nLCB0ZXN0ZXJBUElTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlzXFxfdG9cXF9sb2FkXFwlL2csIGFwaVNjcmlwdHMpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVsb2FkXFxfZmlsZXNcXCUvZywgbG9hZEZpbGVzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfY29kZVxcJS9nLCBhcGlDb2RlKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlcHVibGljXFxfc2VjcmV0c1xcJS9nLCBwdWJsaWNLZXlzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldXJsXFwlL2csIHVybCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX25hbWVcXCUvZywgYFwiJHt0ZXN0ZXJOYW1lfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX21hcFxcJS9nLCBgXCIke3Rlc3Rlck1hcH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXF9iYXNlXFxfdXJsXFwlL2csIGBcIiR7dGVzdGVyVXJsfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2xhdW5jaHBhZFxcX3VybFxcJS9nLCBgXCIke3Rlc3RlckxhdW5jaHBhZFVybH1cImApO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcENvbnRlbnQpO1xuXHRcdFx0fTtcblx0XHRjb250ZW50ID0gYXdhaXQgZml4Q29udGVudCAoY29udGVudCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgRXhwcmVzcyByb3V0ZXMgZnJvbSB0aGUgZ2l2ZW4gcGFnZXMuIEJlIHN1cmUgdG8gbG9hZCB0aGUgXG5cdCAqIHBhZ2VzIGZpcnN0IGJlZm9yZSBkb2luZyB0aGlzLiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBcblx0ICogY3VzdG9taXplZCBFeHByZXNzIGFwcGxpY2F0aW9ucy4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsb2FkZWQgcm91dGVzIFxuXHQgKiBmcm9tIHRoaXMgSG90U3RhcSBvYmplY3Qgd2l0aCBIb3RIVFRQU2VydmVyLCBiZSBzdXJlIHRvIHVzZSBcblx0ICogdGhlIGxvYWRIb3RTaXRlIG1ldGhvZCBpbiBIb3RIVFRQU2VydmVyLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRXhwcmVzc1JvdXRlcyAoZXhwcmVzc0FwcDogYW55LCBqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLm1pbi5qc1wiKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucGFnZXMpXG5cdFx0e1xuXHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLnBhZ2VzW2tleV07XG5cdFx0XHRjb25zdCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQ29udGVudCAocGFnZS5yb3V0ZSwgcGFnZS5uYW1lLCBwYWdlLmZpbGVzWzBdLnVybCwganNTcmNQYXRoKTtcblxuXHRcdFx0ZXhwcmVzc0FwcC5nZXQgKHBhZ2Uucm91dGUsIChyZXE6IGFueSwgcmVzOiBhbnkpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgU2VuZGluZyBjdXN0b20gRXhwcmVzcyBjb250ZW50LmApO1xuXHRcdFx0XHRcdHJlcy5zdGF0dXMgKDIwMCkuc2VuZCAoY29udGVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSB0ZXN0ZXIgZm9yIHVzZSBsYXRlci5cblx0ICovXG5cdGFkZFRlc3RlciAodGVzdGVyOiBIb3RUZXN0ZXIpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnRlc3RlcnNbdGVzdGVyLm5hbWVdID0gdGVzdGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBtYXBzIGZvciB0ZXN0aW5nIGZyb20gdGhlIEhvdFNpdGUuXG5cdCAqL1xuXHRnZXRXZWJUZXN0aW5nTWFwcyAoKTogc3RyaW5nW11cblx0e1xuXHRcdGlmICh0aGlzLmhvdFNpdGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJObyBIb3RTaXRlIHdhcyBsb2FkZWQhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyB3ZWIgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIHRlc3Rpbmcgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG1hcHMhXCIpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubWFwcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIG1hcHMgZm9yIHRlc3RpbmcgZnJvbSB0aGUgSG90U2l0ZS5cblx0ICovXG5cdGdldEFQSVRlc3RpbmdNYXBzICgpOiBzdHJpbmdbXVxuXHR7XG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIk5vIEhvdFNpdGUgd2FzIGxvYWRlZCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIGFwaSBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaS5tYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgdGVzdGluZyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgbWFwcyFcIik7XG5cblx0XHRyZXR1cm4gKHRoaXMuaG90U2l0ZS50ZXN0aW5nLmFwaS5tYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSByb3V0ZSdzIGtleSBmcm9tIGEgcm91dGUncyBuYW1lLlxuXHQgKi9cblx0Z2V0Um91dGVLZXlGcm9tTmFtZSAobmFtZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgZm91bmRLZXk6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5yb3V0ZXMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgcm91dGU6IEhvdFNpdGVSb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNba2V5XTtcblxuXHRcdFx0XHRcdGlmIChyb3V0ZS5uYW1lID09PSBuYW1lKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGZvdW5kS2V5ID0ga2V5O1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSByb3V0ZSBmcm9tIGEgcm91dGUncyBuYW1lLlxuXHQgKi9cblx0Z2V0Um91dGVGcm9tTmFtZSAobmFtZTogc3RyaW5nKTogSG90U2l0ZVJvdXRlXG5cdHtcblx0XHRsZXQgZm91bmRSb3V0ZTogSG90U2l0ZVJvdXRlID0gbnVsbDtcblx0XHRsZXQgZm91bmRLZXk6IHN0cmluZyA9IHRoaXMuZ2V0Um91dGVLZXlGcm9tTmFtZSAobmFtZSk7XG5cblx0XHRpZiAoZm91bmRLZXkgIT09IFwiXCIpXG5cdFx0XHRmb3VuZFJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tmb3VuZEtleV07XG5cblx0XHRyZXR1cm4gKGZvdW5kUm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGVzdHMuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKiBAcGFyYW0gbWFwTmFtZSBUaGUgbWFwIG9yIG1hcHMgdG8gdXNlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZywgbWFwTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuICh0ZXN0ZXIuZXhlY3V0ZSAobWFwTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHdlYiB0ZXN0cyBmcm9tIHRoZSBIb3RTaXRlIHRlc3Rpbmcgd2ViIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQWxsV2ViVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBtYXBzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0V2ViVGVzdGluZ01hcHMgKCk7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXBzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBtYXBzW2lJZHhdO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgbWFwTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIGFwaSB0ZXN0cyBmcm9tIHRoZSBIb3RTaXRlIHRlc3RpbmcgYXBpIG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQWxsQVBJVGVzdHMgKHRlc3Rlck5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBtYXBzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0QVBJVGVzdGluZ01hcHMgKCk7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGV4ZWN1dGUgdGVzdHMuIFRlc3RlciAke3Rlc3Rlck5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoKCkgPT4gYEV4ZWN1dGluZyBhbGwgQVBJIHRlc3RzIGZvciB0ZXN0ZXIgJHt0ZXN0ZXJOYW1lfS4gTWFwczogJHtKU09OLnN0cmluZ2lmeSAobWFwcyl9YCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAocGFnZU5hbWU6IHN0cmluZywgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLmdldFBhZ2UgKHBhZ2VOYW1lKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwYWdlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBsb2NhbCBmaWxlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBwcm9jZXNzTG9jYWxGaWxlIChsb2NhbEZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IGxvY2FsRmlsZXBhdGgsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcImxvY2FsRmlsZVwiOiBsb2NhbEZpbGVwYXRoXG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHVybCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc1VybCAob3B0aW9uczogSG90U3RhcnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcInVybFwiOiBvcHRpb25zLnVybFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogb3B0aW9ucy5wcm9jZXNzb3IsXG5cdFx0XHRcdFwibmFtZVwiOiBvcHRpb25zLm5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdLFxuXHRcdFx0XHRcInRlc3Rlck5hbWVcIjogb3B0aW9ucy50ZXN0ZXJOYW1lLFxuXHRcdFx0XHRcInRlc3Rlck1hcFwiOiBvcHRpb25zLnRlc3Rlck1hcFxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29udGVudCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0NvbnRlbnQgKG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJjb250ZW50XCI6IG9wdGlvbnMuY29udGVudFxuXHRcdH0pO1xuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IG9wdGlvbnMucHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogb3B0aW9ucy5uYW1lLFxuXHRcdFx0XHRcImZpbGVzXCI6IFtmaWxlXVxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHdpbmRvdyBoYXMgZmluaXNoZWQgbG9hZGluZywgZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIG9uUmVhZHkgKHJlYWR5RnVuYzogKCkgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdGlmICgoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiKSlcblx0XHRcdHJlYWR5RnVuYyAoKTtcblx0XHRlbHNlXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAoXCJsb2FkXCIsIHJlYWR5RnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZSB0aGUgY3VycmVudCBIVE1MIHBhZ2Ugd2l0aCB0aGUgb3V0cHV0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyB1c2VPdXRwdXQgKG91dHB1dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IHBhcnNlciA9IG5ldyBET01QYXJzZXIgKCk7XG5cdFx0bGV0IGNoaWxkID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyAob3V0cHV0LCBcInRleHQvaHRtbFwiKTtcblx0XHRsZXQgaHRtbE9iajogSFRNTEh0bWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTtcblxuXHRcdGh0bWxPYmouaW5uZXJIVE1MID0gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5pbm5lckhUTUw7XG5cblx0XHQvLyBUaGFua3MgdG8gbmV3ZnVybml0dXJleSBhdDogXG5cdFx0Ly8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjI5NDU4ODQvZG9tcGFyc2VyLWFwcGVuZGluZy1zY3JpcHQtdGFncy10by1oZWFkLWJvZHktYnV0LW5vdC1leGVjdXRpbmdcblx0XHRsZXQgdG1wU2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcblx0XHRpZiAodG1wU2NyaXB0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBwdXNoIGFsbCBvZiB0aGUgZG9jdW1lbnQncyBzY3JpcHQgdGFncyBpbnRvIGFuIGFycmF5XG5cdFx0XHQvLyAodG8gcHJldmVudCBkb20gbWFuaXB1bGF0aW9uIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGRvbSBub2Rlcylcblx0XHRcdGxldCBzY3JpcHRzOiBIVE1MU2NyaXB0RWxlbWVudFtdID0gW107XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRtcFNjcmlwdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0c2NyaXB0cy5wdXNoKHRtcFNjcmlwdHNbaV0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIHNjcmlwdCB0YWdzIGFuZCBjcmVhdGUgZHVwbGljYXRlIHRhZ3MgZm9yIGVhY2hcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgczogSFRNTFNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuXHRcdFx0XHQvLyBhZGQgdGhlIG5ldyBub2RlIHRvIHRoZSBwYWdlXG5cdFx0XHRcdHNjcmlwdHNbaV0ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzKTtcblxuXHRcdFx0XHQvLyByZW1vdmUgdGhlIG9yaWdpbmFsIChub24tZXhlY3V0aW5nKSBub2RlIGZyb20gdGhlIHBhZ2Vcblx0XHRcdFx0c2NyaXB0c1tpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdHNbaV0pO1xuXG5cdFx0XHRcdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+ICgocmVzb2x2ZTIsIHJlamVjdDIpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cy5vbmxvYWQgPSAoKSA9PlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZTIgKCk7XG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGxldCBoYXNTcmM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwic3JjXCIpICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cy5zZXRBdHRyaWJ1dGUgKFwic3JjXCIsIHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSk7XG5cdFx0XHRcdFx0XHRcdFx0aGFzU3JjID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUgKFwidHlwZVwiKSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRzLnNldEF0dHJpYnV0ZSAoXCJ0eXBlXCIsIHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzLmlubmVySFRNTCA9IHNjcmlwdHNbaV0uaW5uZXJIVE1MO1xuXG5cdFx0XHRcdFx0XHRpZiAoaGFzU3JjID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZTIgKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIHRlc3RlcnMgdG8gbG9hZC5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIGRvZXMgbm90IHdhaXQgZm9yIEFMTCB0ZXN0ZXJzIHRvIGZpbmlzaCBsb2FkaW5nLiBPbmx5IFxuXHQgKiB0aGUgZmlyc3Qgb25lLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXRGb3JUZXN0ZXJzICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAoSG90U3RhcS5pc1JlYWR5Rm9yVGVzdGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKDEwKTtcblxuXHRcdGlmIChIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHVwIHRoZSB0ZXN0ZXJzIGFwaSwgaWYgYW55LlxuXHQgKi9cblx0c3RhdGljIHNldHVwVGVzdGVycyAocHJvY2Vzc29yOiBIb3RTdGFxLCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMpXG5cdHtcblx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0aWYgKHByb2Nlc3Nvci50ZXN0ZXJBUEkgPT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9PT0gXCJcIilcblx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBcImh0dHA6Ly8xMjcuMC4wLjE6ODE4MlwiO1xuXG5cdFx0XHRcdGxldCBjbGllbnQ6IEhvdENsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cdFx0XHRcdGxldCB0ZXN0ZXJBUEk6IEhvdFRlc3RlckFQSSA9IG5ldyBIb3RUZXN0ZXJBUEkgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCwgY2xpZW50KTtcblx0XHRcdFx0dGVzdGVyQVBJLmNvbm5lY3Rpb24uYXBpID0gdGVzdGVyQVBJO1xuXHRcdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gdGVzdGVyQVBJO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXR1cCB0aGUgdGVzdGVycyBhcGkgb24gdGhlIGNsaWVudCwgaWYgbmVlZGVkLlxuXHQgKi9cblx0c3RhdGljIHNldHVwQ2xpZW50VGVzdGVycyAocHJvY2Vzc29yOiBIb3RTdGFxKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdG91dHB1dCArPSBcbmA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuZnVuY3Rpb24gaG90c3RhcV9pc0RvY3VtZW50UmVhZHkgKClcbntcbmlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcbntcbmlmIChIb3QuTW9kZSA9PT0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxue1xubGV0IGZ1bmMgPSBmdW5jdGlvbiAoKVxuXHR7XG5cdFx0aWYgKEhvdC5UZXN0ZXJBUEkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGhzID0ge307XG5cdFx0XHRsZXQgdGVzdEVsZW1lbnRzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHMpO1xuXHRcdFx0bGV0IHRlc3RNYXBzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0TWFwcyk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdFBhdGggPSBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzW2tleV07XG5cblx0XHRcdFx0dGVzdFBhdGhzW2tleV0gPSB0ZXN0UGF0aC50b1N0cmluZyAoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHRlc3RQYXRoc1N0ciA9IEpTT04uc3RyaW5naWZ5ICh0ZXN0UGF0aHMpO1xuXG5cdFx0XHRIb3QuVGVzdGVyQVBJLnRlc3Rlci5wYWdlTG9hZGVkICh7XG5cdFx0XHRcdFx0dGVzdGVyTmFtZTogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck5hbWUsXG5cdFx0XHRcdFx0dGVzdGVyTWFwOiBIb3QuQ3VycmVudFBhZ2UudGVzdGVyTWFwLFxuXHRcdFx0XHRcdHBhZ2VOYW1lOiBIb3QuQ3VycmVudFBhZ2UubmFtZSxcblx0XHRcdFx0XHR0ZXN0RWxlbWVudHM6IHRlc3RFbGVtZW50cyxcblx0XHRcdFx0XHR0ZXN0UGF0aHM6IHRlc3RQYXRoc1N0clxuXHRcdFx0XHR9KS50aGVuIChmdW5jdGlvbiAocmVzcClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKHJlc3AuZXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRIb3RTdGFxV2ViLkhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuaWYgKChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHx8IChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImludGVyYWN0aXZlXCIpKVxuXHRmdW5jICgpO1xuZWxzZVxuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyIChcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuYyk7XG59XG59XG59XG5cbmhvdHN0YXFfaXNEb2N1bWVudFJlYWR5ICgpO1xuPC9zY3JpcHQ+YDtcblx0XHR9XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhbmQgcmVwbGFjZSB0aGUgY3VycmVudCBIVE1MIHBhZ2Ugd2l0aCB0aGUgaG90dCBzY3JpcHQgZnJvbSB0aGUgZ2l2ZW4gdXJsLlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBkaXNwbGF5VXJsICh1cmw6IHN0cmluZyB8IEhvdFN0YXJ0T3B0aW9ucywgbmFtZTogc3RyaW5nID0gbnVsbCwgXG5cdFx0cHJvY2Vzc29yOiBIb3RTdGFxID0gbnVsbCwgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8SG90U3RhcT5cblx0e1xuXHRcdHJldHVybiAobmV3IFByb21pc2U8SG90U3RhcT4gKChyZXNvbHZlLCByZWplY3QpID0+XG5cdFx0XHR7XG5cdFx0XHRcdEhvdFN0YXEub25SZWFkeSAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidXJsXCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0aWYgKG5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gbmFtZTtcblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgPSB1cmw7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsLnVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gdXJsLnByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcmdzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSB1cmwuYXJncztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSB1cmwudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IHVybC50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IHVybC50ZXN0ZXJBUElCYXNlVXJsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG5cdFx0XHRcdFx0XHRIb3RTdGFxLnNldHVwVGVzdGVycyAocHJvY2Vzc29yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy51cmwuaW5kZXhPZiAoXCJoc3Rxc2VydmVcIikgPCAwKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCArPSBcIj9oc3Rxc2VydmU9bmFoZmFtXCI7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc1VybCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG91dHB1dCArPSBIb3RTdGFxLnNldHVwQ2xpZW50VGVzdGVycyAocHJvY2Vzc29yKTtcblxuXHRcdFx0XHRcdFx0YXdhaXQgSG90U3RhcS51c2VPdXRwdXQgKG91dHB1dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChwcm9jZXNzb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBkaXNwbGF5Q29udGVudCAoY29udGVudDogc3RyaW5nIHwgSG90U3RhcnRPcHRpb25zLCBuYW1lOiBzdHJpbmcgPSBudWxsLCBcblx0XHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uUmVhZHkgKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcImNvbnRlbnRcIjogXCJcIlxuXHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRpZiAobmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChjb250ZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gY29udGVudC5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBuYW1lO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChjb250ZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBcIlwiOyAvLy8gQGZpeG1lIElzIHRoaXMgb2sgdG8gZG8/XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBjb250ZW50Lm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmNvbnRlbnQgPSBjb250ZW50LmNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQucHJvY2Vzc29yICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBjb250ZW50LnByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcmdzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC5hcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gY29udGVudC5hcmdzO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQudGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSBjb250ZW50LnRlc3Rlck1hcDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC50ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJOYW1lID0gY29udGVudC50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnRlc3RlckFQSUJhc2VVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBjb250ZW50LnRlc3RlckFQSUJhc2VVcmw7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEuc2V0dXBUZXN0ZXJzIChwcm9jZXNzb3IsIG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRvcHRpb25zLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdG9wdGlvbnMuYXJncyA9IGFyZ3M7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc0NvbnRlbnQgKG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRhd2FpdCBIb3RTdGFxLnVzZU91dHB1dCAob3V0cHV0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUgKHByb2Nlc3Nvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KSk7XG5cdH1cbn1cblxuaWYgKHR5cGVvZiAoZG9jdW1lbnQpICE9PSBcInVuZGVmaW5lZFwiKVxuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAoXCJsb2FkXCIsIGhvdFN0YXFXZWJTdGFydCk7XG4iLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcblxuLyoqXG4gKiBSZWdpc3RlciBhIGNvbXBvbmVudCBmb3IgdXNlIGFzIGEgSFRNTCB0YWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudCAodGFnOiBzdHJpbmcsIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnMgPSB1bmRlZmluZWQpOiB2b2lkXG57XG5cdGlmICgodGFnID09IG51bGwpIHx8ICh0YWcgPT09IFwiXCIpKVxuXHRcdHRocm93IG5ldyBFcnJvciAoYEFsbCBjb21wb25lbnRzIG11c3QgaGF2ZSBhIHRhZyFgKTtcblxuXHRpZiAoY3VzdG9tRWxlbWVudHMuZ2V0ICh0YWcpICE9PSB1bmRlZmluZWQpXG5cdHtcblx0XHQvLy8gQGZpeG1lIFRoaXMgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIFNob3VsZCB0aGlzIHRocm93IGFuIGVycm9yIG9yIHdhcm5pbmc/IEkgZG9uJ3QgdGhpbmsgaXQgc2hvdWxkLi4uXG5cblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgcHJvY2Vzc29yQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cztcblxuXHRjdXN0b21FbGVtZW50cy5kZWZpbmUgKHRhZywgY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudFxuXHRcdHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGNvbm5lY3RlZCBIb3RDb21wb25lbnQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbXBvbmVudDogSG90Q29tcG9uZW50O1xuXHRcdFxuXHRcdFx0Y29uc3RydWN0b3IgKClcblx0XHRcdHtcblx0XHRcdFx0c3VwZXIgKCk7XG5cblx0XHRcdFx0bGV0IGNvbXBvbmVudEluZm8gPSBwcm9jZXNzb3JDb21wb25lbnRzW3RhZ107XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50ID0gbmV3IGNvbXBvbmVudEluZm8uY29tcG9uZW50VHlwZSAoY29tcG9uZW50SW5mby5wcm9jZXNzb3IsIGNvbXBvbmVudEluZm8uYXBpKTtcblxuXHRcdFx0XHRsZXQgY29tcEh0bWxFbGVtZW50ID0gdGhpcztcblx0XHRcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRjb21wSHRtbEVsZW1lbnQuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50Lmh0bWxFbGVtZW50cyA9IFtjb21wSHRtbEVsZW1lbnRdO1xuXHRcdFx0XHR0aGlzLmNvbXBvbmVudC5pbm5lciA9IHRoaXMuaW5uZXJIVE1MO1xuXHRcdFxuXHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQuaGFuZGxlQXR0cmlidXRlcyAhPSBudWxsKVxuXHRcdFx0XHRcdHRoaXMuY29tcG9uZW50LmhhbmRsZUF0dHJpYnV0ZXMgKHRoaXMuYXR0cmlidXRlcyk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dHI6IEF0dHIgPSB0aGlzLmF0dHJpYnV0ZXNbaUlkeF07XG5cdFx0XHRcdFx0XHRjb25zdCBhdHRyTmFtZTogc3RyaW5nID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlICgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0clZhbHVlOiBzdHJpbmcgPSBhdHRyLnZhbHVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcImlkXCIpXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwibmFtZVwiKVxuXHRcdFx0XHRcdFx0XHR0aGlzLmNvbXBvbmVudC5uYW1lID0gYXR0clZhbHVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcInZhbHVlXCIpXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50LnZhbHVlID0gYXR0clZhbHVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lLmluZGV4T2YgKFwiaG90LVwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhdHRyVGVtcE5hbWU6IHN0cmluZyA9IGF0dHJOYW1lLnN1YnN0cmluZyAoNCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50W2F0dHJUZW1wTmFtZV0gPSBhdHRyVmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblByZU91dHB1dCAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlT3V0cHV0ICgpID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBvdXRwdXRzID0gdGhpcy5jb21wb25lbnQub3V0cHV0ICgpO1xuXHRcdFxuXHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25Qb3N0T3V0cHV0ICE9IG51bGwpXG5cdFx0XHRcdFx0b3V0cHV0cyA9IHRoaXMuY29tcG9uZW50Lm9uUG9zdE91dHB1dCAob3V0cHV0cyk7XG5cdFx0XG5cdFx0XHRcdGxldCBjb21wb25lbnRPdXRwdXRzOiBIb3RDb21wb25lbnRPdXRwdXRbXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRpZiAodHlwZW9mIChvdXRwdXRzKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRjb21wb25lbnRPdXRwdXRzLnB1c2ggKHsgaHRtbDogb3V0cHV0cyB9KTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKG91dHB1dHMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMgPSBvdXRwdXRzO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMgPSBbb3V0cHV0c107XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0Zm9yIChsZXQgaUtkeCA9IDA7IGlLZHggPCBjb21wb25lbnRPdXRwdXRzLmxlbmd0aDsgaUtkeCsrKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG91dHB1dCA9IGNvbXBvbmVudE91dHB1dHNbaUtkeF07XG5cdFx0XHRcdFx0bGV0IGh0bWxTdHI6IHN0cmluZyA9IG91dHB1dC5odG1sO1xuXHRcdFx0XHRcdGxldCBhZGRGdW5jdGlvbnNUbzogc3RyaW5nID0gXCJcIjtcblx0XHRcblx0XHRcdFx0XHRpZiAob3V0cHV0LmFkZEZ1bmN0aW9uc1RvICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhZGRGdW5jdGlvbnNUbyA9IG91dHB1dC5hZGRGdW5jdGlvbnNUbztcblx0XHRcblx0XHRcdFx0XHRsZXQgc3RyOiBzdHJpbmcgPSBIb3RGaWxlLnBhcnNlQ29udGVudCAoaHRtbFN0ciwgdHJ1ZSwgeyBcIm91dHB1dENvbW1hbmRzXCI6IGZhbHNlIH0pO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcnNlZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0c3RyID0gdGhpcy5jb21wb25lbnQub25QYXJzZWQgKHN0cik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGh0bWxIYW5kbGVyOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfSA9IHsgZml4ZWRTdHI6IFwiXCIsIHF1ZXJ5U2VsZWN0b3I6IFwiXCIgfTtcblx0XHRcblx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25GaXhIVE1MICE9IG51bGwpXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IHRoaXMuY29tcG9uZW50Lm9uRml4SFRNTCAoc3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoc3RyKTtcblxuXHRcdFx0XHRcdGxldCBjaGlsZHJlblRvUmVhZGQ6IE5vZGVbXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRcdC8vIFNhdmUgdGhlIGNoaWxkcmVuIGZyb20gYmVpbmcgcmVwbGFjZWQuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9ICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpOyBpSWR4ID4gLTE7IGlJZHgtLSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGQ6IE5vZGUgPSB0aGlzLmNoaWxkcmVuW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y2hpbGRyZW5Ub1JlYWRkLnB1c2ggKHRoaXMucmVtb3ZlQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbnVsbDtcblx0XHRcdFx0XHRsZXQgbmV3T2JqOiBIVE1MRWxlbWVudCA9IG51bGw7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld0RPTSA9IHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gKGh0bWxIYW5kbGVyLmZpeGVkU3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdC8vbmV3RE9NID0gdGhpcy5sb29zZVBhcnNlRnJvbVN0cmluZyAobmV3IERPTVBhcnNlciAoKSwgc3RyKTtcblx0XHRcdFx0XHRcdG5ld0RPTSA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aCA8IDEpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBjb21wb25lbnQgb3V0cHV0IGZyb20gJHt0aGlzLmNvbXBvbmVudC5uYW1lfSB3aXRoIHRhZyAke3RoaXMuY29tcG9uZW50LnRhZ31gKTtcblxuXHRcdFx0XHRcdGlmIChuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0aHJvd0VycjogYm9vbGVhbiA9IHRydWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY2hpbGQgPSBuZXdET00uYm9keS5jaGlsZHJlbltpSWR4XTtcblx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSAoKSA9PT0gXCJwYXJzZXJlcnJvclwiKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld09iaiA9IGNoaWxkO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3dFcnIgPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRocm93RXJyID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBPbmx5IGEgc2luZ2xlIGh0bWwgZWxlbWVudCBjYW4gY29tZSBmcm9tIGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50Lm5hbWV9LCBtdWx0aXBsZSBlbGVtZW50cyB3ZXJlIGRldGVjdGVkLmApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gKDxIVE1MRWxlbWVudD5uZXdET00uYm9keS5jaGlsZHJlblswXSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gbmV3RE9NLnF1ZXJ5U2VsZWN0b3IgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IpO1xuXHRcdFxuXHRcdFx0XHRcdHRoaXMucmVwbGFjZVdpdGggKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50LmNsaWNrICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCB0aGlzLmNvbXBvbmVudC5jbGljay5iaW5kICh0aGlzLmNvbXBvbmVudCkpO1xuXHRcdFxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmNvbXBvbmVudC5ldmVudHMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGV2ZW50ID0gdGhpcy5jb21wb25lbnQuZXZlbnRzW2tleV07XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoZXZlbnQudHlwZSwgZXZlbnQuZnVuYywgZXZlbnQub3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBvYmplY3RGdW5jdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgKHRoaXMuY29tcG9uZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQXNzb2NpYXRlIGFueSBmdW5jdGlvbnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG9iamVjdEZ1bmN0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqRnVuYzogc3RyaW5nID0gb2JqZWN0RnVuY3Rpb25zW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKG9iakZ1bmMgPT09IFwiY29uc3RydWN0b3JcIilcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRsZXQgcHJvcCA9IHRoaXMuY29tcG9uZW50W29iakZ1bmNdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAocHJvcCkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGlzTmV3RnVuY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBHbyB0aHJvdWdoIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGJhc2UgSG90Q29tcG9uZW50IGFuZCBzZWUgXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlJ3MgYW55IG1hdGNoZXMuIElmIHRoZXJlJ3MgYSBtYXRjaCwgdGhhdCBtZWFucyBcblx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgdHJ5aW5nIHRvIGFkZCBhbiBleGlzdGluZyBmdW5jdGlvbiwgYW5kIHdlIGRvbid0XG5cdFx0XHRcdFx0XHRcdC8vIHdhbm5hIGRvIHRoYXQuIFNraXAgaXQuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gSG90Q29tcG9uZW50LnByb3RvdHlwZSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvYmpGdW5jID09PSBrZXkyKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlzTmV3RnVuY3Rpb24gPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChpc05ld0Z1bmN0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdG5ld09ialtvYmpGdW5jXSA9IEhvdFN0YXEua2VlcENvbnRleHQgKHRoaXMuY29tcG9uZW50W29iakZ1bmNdLCB0aGlzLmNvbXBvbmVudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYWRkRnVuY3Rpb25zVG8gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHF1ZXJ5OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKGFkZEZ1bmN0aW9uc1RvKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdHF1ZXJ5W29iakZ1bmNdID0gSG90U3RhcS5rZWVwQ29udGV4dCAodGhpcy5jb21wb25lbnRbb2JqRnVuY10sIHRoaXMuY29tcG9uZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld09iaiA9IHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGNvbXBIdG1sRWxlbWVudDI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25DcmVhdGVkIChuZXdPYmopO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlID0gdGhpcy5jb21wb25lbnQub25QYXJlbnRQbGFjZTtcblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzLnB1c2ggKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuY2xvc2VzdFNlbGVjdG9yICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHBhcmVudEVsbTogSFRNTEVsZW1lbnQgPSBjb21wSHRtbEVsZW1lbnQyO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50RWxtKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmROb2RlOiBOb2RlID0gcGFyZW50RWxtLnF1ZXJ5U2VsZWN0b3IgKG91dHB1dC5jbG9zZXN0U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChmb3VuZE5vZGUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9ICg8SFRNTEVsZW1lbnQ+Zm91bmROb2RlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9IHBhcmVudEVsbS5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50RWxtID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGNsb3Nlc3Qgbm9kZSB3aXRoIHNlbGVjdG9yICcke291dHB1dC5jbG9zZXN0U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudEVsbS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRpZiAoY29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGFyZW50Tm9kZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuZG9jdW1lbnRTZWxlY3RvciAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlOiBOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAob3V0cHV0LmRvY3VtZW50U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50Tm9kZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBkb2N1bWVudCBub2RlIHdpdGggc2VsZWN0b3IgJyR7b3V0cHV0LmRvY3VtZW50U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0aWYgKGNvbXBIdG1sRWxlbWVudDIub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKHBhcmVudE5vZGUsIGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBwbGFjZUVsbUluUGFyZW50ID0gKHBhcmVudE5vZGVUb0NoZWNrOiBQYXJlbnROb2RlLCBwbGFjZUhlcmVQYXJlbnQ6IHN0cmluZywgY2hpbGRUb1BsYWNlOiBOb2RlKTogUGFyZW50Tm9kZSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlQ2hlY2tDb3VudGVyOiBudW1iZXIgPSAwO1xuXHRcdFxuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudE5vZGVDaGVja0NvdW50ZXIgPCAxMCkgLy8vIEB0b2RvIE1ha2UgdGhpcyBjb250cm9sbGFibGUgd2l0aCBhIHZhcmlhYmxlIGZyb20gdGhlIGNvbXBvbmVudC5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayBpbnN0YW5jZW9mIEhUTUxIdG1sRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGhvdC1wbGFjZS1oZXJlIGV4aXN0cywgcGxhY2UgdGhlIGNoaWxkcmVuIHRoZXJlLiBJZiBub3QsIHBsYWNlIGl0IHVuZGVyIHRoZSBcblx0XHRcdFx0XHRcdFx0Ly8gbmV3IGVsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBcnJheSA9IHBhcmVudE5vZGVUb0NoZWNrLnF1ZXJ5U2VsZWN0b3JBbGwgKGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRwbGFjZUhlcmUuYXBwZW5kQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2Uub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdGNoaWxkVG9QbGFjZS5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGxhY2VIZXJlLCBjaGlsZFRvUGxhY2UpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoIDwgMSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBdHRyQXJyYXkgPSBwYXJlbnROb2RlVG9DaGVjay5xdWVyeVNlbGVjdG9yQWxsIChgW2hvdC1wbGFjZS1oZXJlPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBsYWNlSGVyZUF0dHJBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBdHRyQXJyYXlbMF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGlsZFRvUGxhY2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCAoY2hpbGRUb1BsYWNlKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChjaGlsZFRvUGxhY2UpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkVG9QbGFjZS5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLmhvdENvbXBvbmVudC5vblBhcmVudFBsYWNlIChwbGFjZUhlcmUsIGNoaWxkVG9QbGFjZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwYXJlbnROb2RlVG9DaGVjay5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlQ2hlY2tDb3VudGVyKys7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAocGFyZW50Tm9kZVRvQ2hlY2spO1xuXHRcdFx0XHRcdH07XG5cdFx0XG5cdFx0XHRcdFx0aWYgKG91dHB1dC5wbGFjZUhlcmVQYXJlbnQgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZVRvQ2hlY2sgPSBjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRwYXJlbnROb2RlVG9DaGVjayA9IHBsYWNlRWxtSW5QYXJlbnQgKHBhcmVudE5vZGVUb0NoZWNrLCBvdXRwdXQucGxhY2VIZXJlUGFyZW50LCBjb21wSHRtbEVsZW1lbnQyKTtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCBub2RlIHdpdGggaG90LXBsYWNlLWhlcmUgYXR0cmlidXRlICcke291dHB1dC5wbGFjZUhlcmVQYXJlbnR9J2ApO1xuXHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHQvLyBBcHBlbmQgdGhlIGNoaWxkcmVuIHRvIHRoZSBuZXdseSBjcmVhdGVkIEhUTUwgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoaWxkcmVuVG9SZWFkZC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmNoaWxkcmVuVG9SZWFkZFtpSWR4XSk7XG5cdFx0XHRcdFx0XHRsZXQgcGxhY2VkQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBhdHRyaWJ1dGUgaG90LXBsYWNlLXBhcmVudCBpbiBjaGlsZC5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNoaWxkLmdldEF0dHJpYnV0ZSkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVQYXJlbnRBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlIChcImhvdC1wbGFjZS1wYXJlbnRcIik7XG5cblx0XHRcdFx0XHRcdFx0aWYgKChwbGFjZUhlcmVQYXJlbnRBdHRyICE9IG51bGwpICYmIChwbGFjZUhlcmVQYXJlbnRBdHRyICE9PSBcIlwiKSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlVG9DaGVjazogUGFyZW50Tm9kZSA9IGNvbXBIdG1sRWxlbWVudDI7XG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwbGFjZUVsbUluUGFyZW50IChwYXJlbnROb2RlVG9DaGVjaywgcGxhY2VIZXJlUGFyZW50QXR0ciwgY2hpbGQpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50IG5vZGUgd2l0aCBob3QtcGxhY2UtaGVyZSBhdHRyaWJ1dGUgJyR7b3V0cHV0LnBsYWNlSGVyZVBhcmVudH0nYCk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VkQ2hpbGQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAocGxhY2VkQ2hpbGQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLmFwcGVuZENoaWxkIChjaGlsZCk7XG5cblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGlmIChjaGlsZC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y2hpbGQuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIsIGNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUG9zdFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlbXA6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25Qb3N0UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIucGFyZW50RWxlbWVudCwgY29tcEh0bWxFbGVtZW50Mik7XG5cblx0XHRcdFx0XHRcdGlmICh0ZW1wICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIgPSB0ZW1wO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKEhvdCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50TmFtZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudE5hbWUgPSB0aGlzLmNvbXBvbmVudC5uYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICgoY29tcG9uZW50TmFtZSA9PSBudWxsKSB8fCAoY29tcG9uZW50TmFtZSA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50TmFtZSA9IHRoaXMuaWQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudE5hbWUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmNvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhpcyBoZWxwcyBwYXJzZSA8dHI+IGFuZCBvdGhlciB0YWdzIHRoYXQgZG8gbm90IGhhdmUgYSBwYXJlbnQuXG5cdFx0XHQgKiBcblx0XHRcdCAqIFRoYW5rcyBCcmFuZG9uIE1jQ29ubmVsbCFcblx0XHRcdCAqIFxuXHRcdFx0ICogRnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjczMTM0NzkvbWFrZS1wYXJzZWZyb21zdHJpbmctcGFyc2Utd2l0aG91dC12YWxpZGF0aW9uXG5cdFx0XHQgKiBcblx0XHRcdCAqIEB0b2RvIE1heSByZW1vdmUgdGhpcyBhcyBpdCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2VsbCBpbiBhIGxvdCBvZiBlZGdlIGNhc2VzLlxuXHRcdFx0ICovXG5cdFx0XHRwcm90ZWN0ZWQgbG9vc2VQYXJzZUZyb21TdHJpbmcgKHBhcnNlcjogRE9NUGFyc2VyLCBzdHI6IHN0cmluZykge1xuXHRcdFx0XHRzdHIgPSBzdHIucmVwbGFjZSgvIFxcLz4vZywgJz4nKS5yZXBsYWNlKC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdFx0XHRjb25zdCB4ZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnPHhtbD4nK3N0cisnPC94bWw+JywgJ3RleHQveG1sJyk7XG5cdFx0XHRcdGNvbnN0IGhkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCcnLCAndGV4dC9odG1sJyk7XG5cdFx0XHRcdGZvciAobGV0IGVsZW0gb2YgQXJyYXkuZnJvbSh4ZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlbikpIHtcblx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGhkb20uYm9keS5hcHBlbmRDaGlsZChlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBlbGVtIG9mIEFycmF5LmZyb20oaGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdhcmVhLGJhc2UsYnIsY29sLGNvbW1hbmQsZW1iZWQsaHIsaW1nLGlucHV0LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicpKSkge1xuXHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0ZWxlbS5vdXRlckhUTUwgPSAnPCcrZWxlbS5vdXRlckhUTUwuc2xpY2UoMSkuc3BsaXQoJzwnKVswXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaGRvbTtcblx0XHRcdH1cblxuXHRcdFx0Z2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSAvLy8gQGZpeG1lIERvZXMgdGhpcyBSRUFMTFkgaGF2ZSB0byBiZSBzdGF0aWM/IEF3ZnVsIGlmIGl0IGRvZXMuLi5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmNvbXBvbmVudC5vYnNlcnZlZEF0dHJpYnV0ZXMpO1xuXHRcdFx0fVxuXHRcdH0sIGVsZW1lbnRPcHRpb25zKTtcbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RTdGFxLCBIb3RTdGFydE9wdGlvbnMgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogSWYgcnVubmluZyBpbiBhIGJyb3dzZXIsIHRoaXMgd2lsbCBzdGFydCBIb3RTdGFxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG90U3RhcVdlYlN0YXJ0ICgpXG57XG4gICAgbGV0IGhvdHN0YXFFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcVwiKTtcblxuICAgIC8vIFNldCB0aGlzIHRvIHRydWUsIGp1c3QgaW4gY2FzZS4uLlxuICAgIEhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgKEhvdFN0YXFXZWIpICE9PSBcInVuZGVmaW5lZFwiKVxuICAgIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuXHRcdGZvciAobGV0IGtleSBpbiBIb3RTdGFxV2ViKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3dba2V5XSA9IEhvdFN0YXFXZWJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChob3RzdGFxRWxtcy5sZW5ndGggPiAwKVxuICAgIHtcbiAgICAgICAgbGV0IGhvdHN0YXFFbG06IEhUTUxFbGVtZW50ID0gKDxIVE1MRWxlbWVudD5ob3RzdGFxRWxtc1swXSk7XG5cbiAgICAgICAgc2V0VGltZW91dCAoYXN5bmMgZnVuY3Rpb24gKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgZ2V0QXR0ciA9IChlbG06IEhUTUxFbGVtZW50LCBhdHRyTmFtZXM6IHN0cmluZ1tdKSA9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dHJOYW1lcy5sZW5ndGg7IGlJZHgrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWU6IHN0cmluZyA9IGF0dHJOYW1lc1tpSWR4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbG0uZ2V0QXR0cmlidXRlIChhdHRyTmFtZSkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbG0uZ2V0QXR0cmlidXRlIChhdHRyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsbS5nZXRBdHRyaWJ1dGUgKGBkYXRhLSR7YXR0ck5hbWV9YCkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbG0uZ2V0QXR0cmlidXRlIChgZGF0YS0ke2F0dHJOYW1lfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IGxvYWRQYWdlOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJsb2FkLXBhZ2VcIiwgXCJsb2FkUGFnZVwiLCBcInNyY1wiXSkgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgbG9nZ2luZ0xldmVsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJsb2dnaW5nLWxldmVsXCIsIFwibG9nZ2luZ0xldmVsXCJdKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydERlbGF5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzdGFydC1kZWxheVwiLCBcInN0YXJ0RGVsYXlcIl0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlcjogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wicm91dGVyXCJdKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJuYW1lXCJdKSB8fCBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgICAgICBsZXQgYXJnczogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXJnc1wiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgYXBpTGlicmFyeTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXBpLWxpYnJhcnlcIiwgXCJhcGlMaWJyYXJ5XCJdKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBhcGlOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbmFtZVwiLCBcImFwaU5hbWVcIl0pIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGFwaVVybDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXBpLXVybFwiLCBcImFwaVVybFwiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLW5hbWVcIiwgXCJ0ZXN0ZXJOYW1lXCJdKSB8fCBcIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIjtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbWFwXCIsIFwidGVzdGVyTWFwXCJdKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0ZXJBcGlCYXNlVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItYXBpLWJhc2UtdXJsXCIsIFwidGVzdGVyQXBpQmFzZVVybFwiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdGVyTGF1bmNocGFkVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbGF1bmNocGFkLXVybFwiLCBcInRlc3RlckxhdW5jaHBhZFVybFwiXSkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgZG9udFJldXNlUHJvY2Vzc29yOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IHBhc3NSYXdVcmw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgaHRtbFNvdXJjZTogc3RyaW5nID0gaG90c3RhcUVsbS5pbm5lckhUTUwgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVyTWFuYWdlcjogeyBbcGF0aDogc3RyaW5nXTogeyByZWRpcmVjdDogc3RyaW5nOyBiYXNlUmVkaXJlY3Q6IHN0cmluZzsgYmFzZTogc3RyaW5nOyBzcmM6IHN0cmluZzsgfSB9ID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlcldpbGRjYXJkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VhcmNoOiBVUkxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzdGFydERlbGF5ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IEhvdFN0YXEud2FpdCAocGFyc2VJbnQgKHN0YXJ0RGVsYXkpKTtcblxuICAgICAgICAgICAgICAgIGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYWdlID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wic3JjXCJdKTtcblxuICAgICAgICAgICAgICAgIGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJwYXNzUmF3VXJsXCJdKSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBwYXNzUmF3VXJsID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJkb250LXJldXNlLXByb2Nlc3NvclwiLCBcImRvbnRSZXVzZVByb2Nlc3NvclwiXSkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgZG9udFJldXNlUHJvY2Vzc29yID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGxldCBoc3RxYmFzZXJlZGlyZWN0OiBzdHJpbmcgPSBzZWFyY2guZ2V0IChcImhzdHFiYXNlcmVkaXJlY3RcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaHN0cWJhc2VyZWRpcmVjdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaHN0cWJhc2VyZWRpcmVjdCA9IGRlY29kZVVSSSAoaHN0cWJhc2VyZWRpcmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSAoXCJcIiwgXCJcIiwgaHN0cWJhc2VyZWRpcmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRQYWdlID0gaHN0cWJhc2VyZWRpcmVjdDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgaG90c3RhcUVycm9ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lIChcImhvdHN0YXEtZXJyb3JcIik7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFFcnJvcnMubGVuZ3RoOyBpSWR4KyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxldCBob3RzdGFxRXJyb3JFbG06IEhUTUxFbGVtZW50ID0gaG90c3RhcUVycm9yc1tpSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhdHVzOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRXJyb3JFbG0sIFtcInN0YXR1c1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bnN1cHBvcnRlZEJyb3dzZXI6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFcnJvckVsbSwgW1widW5zdXBwb3J0ZWQtYnJvd3Nlci1yZWRpcmVjdFwiXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkQnJvd3NlciAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgSG90U3RhcS5lcnJvcnNbXCJ1bnN1cHBvcnRlZEJyb3dzZXJcIl0gPSB7IHJlZGlyZWN0VG9Vcmw6IHVuc3VwcG9ydGVkQnJvd3NlciB9O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBIb3RTdGFxLmVycm9yc1tgJHtlcnJvclN0YXR1c31gXSA9IHsgcmVkaXJlY3RUb1VybDogdW5zdXBwb3J0ZWRCcm93c2VyIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYXN5bmMvYXdhaXQgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIHRyeVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZhbCAoXCJhc3luYyAoKSA9PiB7fVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGV4KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgSG90U3RhcS5leGVjdXRlRXJyb3IgKFwidW5zdXBwb3J0ZWRCcm93c2VyXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgIT09IFwiXCIpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG90c3RhcVJvdXRlckVsbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJob3RzdGFxLXJvdXRlclwiKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFSb3V0ZXJFbG1zLmxlbmd0aDsgaUlkeCsrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG90c3RhcVJvdXRlckVsbTogSFRNTEVsZW1lbnQgPSBob3RzdGFxUm91dGVyRWxtc1tpSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZXJOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxUm91dGVyRWxtLCBbXCJuYW1lXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFSb3V0ZXJFbG0sIFtcInNlcnZlLWxvY2FsXCIsIFwic2VydmVMb2NhbGx5XCJdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlck5hbWUgPT09IHJvdXRlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGFsbCByb3V0ZXMgZnJvbSB0aGUgcm91dGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlKZHggPSAwOyBpSmR4IDwgaG90c3RhcVJvdXRlckVsbS5jaGlsZE5vZGVzLmxlbmd0aDsgaUpkeCsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG0uY2hpbGROb2Rlc1tpSmR4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVyRWxtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJFbG0udGFnTmFtZS50b1VwcGVyQ2FzZSAoKSA9PT0gXCJST1VURVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZXJQYXRoOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInBhdGhcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJyZWRpcmVjdFwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VSZWRpcmVjdDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJiYXNlLXJlZGlyZWN0XCIsIFwiYmFzZVJlZGlyZWN0XCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZTogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJiYXNlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVyU3JjOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInNyY1wiXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVyUGF0aC5pbmRleE9mIChcIipcIikgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyV2lsZGNhcmRzLnB1c2ggKHJvdXRlclBhdGgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyTWFuYWdlcltyb3V0ZXJQYXRoXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiByZWRpcmVjdCB8fCB1bmRlZmluZWQsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVJlZGlyZWN0OiBiYXNlUmVkaXJlY3QgfHwgdW5kZWZpbmVkLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6IGJhc2UgfHwgdW5kZWZpbmVkLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogcm91dGVyU3JjIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrUGF0aDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnb3RvUGF0aDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlTG9jYWxseSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93ZXJTZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IHNlcnZlTG9jYWxseS50b0xvd2VyQ2FzZSAoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxvd2VyU2VydmVMb2NhbGx5ID09PSBcInRydWVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb3dlclNlcnZlTG9jYWxseSA9PT0gXCJ5ZXNcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb3dlclNlcnZlTG9jYWxseSA9PT0gXCIxXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hQb3M6IG51bWJlciA9IGNoZWNrUGF0aC5sYXN0SW5kZXhPZiAoXCIvXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoUG9zID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXRoID0gY2hlY2tQYXRoLnN1YnN0cmluZyAobGFzdFNsYXNoUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvUGF0aCA9IGdvdG9QYXRoLnN1YnN0cmluZyAobGFzdFNsYXNoUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJXaWxkY2FyZHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlIGxvY2FsbHkgZG9lc24ndCByZWFsbHkgd29yayB3aXRoIHdpbGRjYXJkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gQGZpeG1lIFRoaXMgaXNuJ3QgYWN0dWFsbHkgd29ya2luZyBsaWtlIGEgd2lsZGNhcmQgc2hvdWxkLiBUaGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpSmR4ID0gMDsgaUpkeCA8IHJvdXRlcldpbGRjYXJkcy5sZW5ndGg7IGlKZHgrKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlV2lsZGNhcmQ6IHN0cmluZyA9IHJvdXRlcldpbGRjYXJkc1tpSmR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wUm91dGVXaWxkY2FyZDogc3RyaW5nID0gcm91dGVXaWxkY2FyZC5yZXBsYWNlIChcIipcIiwgXCJcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja1BhdGguaW5kZXhPZiAodGVtcFJvdXRlV2lsZGNhcmQpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaW1wbHkgcmV0dXJucyB0aGUga2V5IGluIHRoZSByb3V0ZXJNYW5hZ2VyIHRvIGFjY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1BhdGggPSByb3V0ZVdpbGRjYXJkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZWN0IHJvdXRlIGFuZCBsb2FkIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0gIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0ucmVkaXJlY3QgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0ucmVkaXJlY3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uYmFzZVJlZGlyZWN0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRTZWFyY2hQYXJhbXMgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlYXJjaFBhcmFtcyAhPT0gXCJcIikgJiYgKHNlYXJjaFBhcmFtcyAhPT0gXCI/XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkU2VhcmNoUGFyYW1zID0gYCYke3NlYXJjaFBhcmFtcy5zdWJzdHJpbmcgKDEpfWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7cm91dGVyTWFuYWdlcltjaGVja1BhdGhdLmJhc2VSZWRpcmVjdH0/aHN0cWJhc2VyZWRpcmVjdD0ke2VuY29kZVVSSSAoZ290b1BhdGggKyBzZWFyY2hQYXJhbXMpfSR7bW9kaWZpZWRTZWFyY2hQYXJhbXN9YDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5zcmMgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRQYWdlID0gcm91dGVyTWFuYWdlcltjaGVja1BhdGhdLnNyYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBKU09OLnBhcnNlIChhcmdzKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBIb3QuQXJndW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0h0bWxTb3VyY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmIChodG1sU291cmNlICE9PSBcIlwiKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbFNvdXJjZUNoZWNrOiBzdHJpbmcgPSBodG1sU291cmNlLnJlcGxhY2UgKC9cXHMvZywnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxTb3VyY2VDaGVjayAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0h0bWxTb3VyY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0ZW1wTW9kZSA9IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICB0ZW1wTW9kZSA9IEhvdC5Nb2RlO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc29yOiBIb3RTdGFxID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChkb250UmV1c2VQcm9jZXNzb3IgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoSG90KSAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc29yID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmdMZXZlbCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IubG9nZ2VyLmxvZ0xldmVsID0gSG90TG9nLnBhcnNlIChsb2dnaW5nTGV2ZWwpO1xuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc29yLm1vZGUgPSB0ZW1wTW9kZTtcblxuICAgICAgICAgICAgICAgIGxldCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yOiBwcm9jZXNzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAobG9hZFBhZ2UgIT09IFwiXCIpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc1Jhd1VybCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUGFnZS5pbmRleE9mIChcImhzdHFzZXJ2ZVwiKSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFBhZ2UgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBsb2FkUGFnZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyTWFwICE9IG51bGwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3Rlck1hcCA9IHRlc3Rlck1hcDtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0ZXJOYW1lID0gdGVzdGVyTmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyTmFtZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RlckFwaUJhc2VVcmwgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gdGVzdGVyQXBpQmFzZVVybDtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXN0ZXJMYXVuY2hwYWRVcmwgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0ZXN0ZXJMYXVuY2hwYWRVcmw7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXBpTmFtZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwaVVybCA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoYGFwaS11cmwgd2FzIG5vdCBzZXQhYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudExpYjogYW55ID0gd2luZG93O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcGlMaWJyYXJ5ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpYiA9IHdpbmRvd1thcGlMaWJyYXJ5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdBUEkgPSBuZXcgcGFyZW50TGliW2FwaU5hbWVdIChhcGlVcmwsIGNsaWVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0FQSS5jb25uZWN0aW9uLmFwaSA9IG5ld0FQSTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLmFwaSA9IG5ld0FQSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzSHRtbFNvdXJjZSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFBhZ2UgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKGBUaGUgaG90c3RhcSB0YWcgbXVzdCBoYXZlIGEgc3JjLCBIVE1MIGNvbnRlbnRzIGluc2lkZSBpdCwgb3IgYSByb3V0ZXIgc2V0LmApO1xuXG4gICAgICAgICAgICAgICAgICAgIEhvdFN0YXEuZGlzcGxheVVybCAob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEhvdFN0YXEuZGlzcGxheUNvbnRlbnQgKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIHRvIHRha2UgaW4gYSBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlLlxuXHQgKi9cblx0ZGVzdGluYXRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBleGVjdXRpbmcgaXQncyBcblx0ICogdGVzdHMgd2hlbiBpdCdzIHRpbWUuXG5cdCAqL1xuXHRhdXRvU3RhcnQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGRlc3RpbmF0aW9uOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb24gfCBIb3RTaXRlTWFwUGF0aCA9IFwiXCIsIGF1dG9TdGFydDogYm9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRpZiAodHlwZW9mIChkZXN0aW5hdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuXHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBIb3RUZXN0RGVzdGluYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5kZXN0aW5hdGlvbjtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5wYXRoO1xuXHRcdFx0XHR0aGlzLmF1dG9TdGFydCA9IGRlc3RpbmF0aW9uLmF1dG9TdGFydDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQsIEhvdFRlc3RFbGVtZW50T3B0aW9ucyB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RQYWdlXCI7XG5cbi8qKlxuICogVGhpcyBhY3R1YWxseSBleGVjdXRlcyB0aGUgdGVzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RHJpdmVyXG57XG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFRlc3RQYWdlO1xuXHQvKipcblx0ICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGVhY2ggZXhlY3V0ZWQgY29tbWFuZC5cblx0ICovXG5cdGNvbW1hbmREZWxheTogbnVtYmVyO1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBzYXZlZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdGVzdGluZyBydW5zLlxuXHQgKi9cblx0cGVyc2lzdGVudERhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBwYWdlOiBIb3RUZXN0UGFnZSB8IG51bGwgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5wYWdlID0gcGFnZTtcblx0XHR0aGlzLmNvbW1hbmREZWxheSA9IDIwO1xuXHRcdHRoaXMucGVyc2lzdGVudERhdGEgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB0ZXN0IG9iamVjdCBieSBpdCdzIG5hbWUuIElmIGEgKiBpcyB1c2VkLCBpdCB3aWxsIGJlIHVzZWQgYXMgYSBcblx0ICogd2lsZGNhcmQgZm9yIHRoZSBvYmplY3QncyBuYW1lLiBJZiBhID4gaXMgdXNlZCwgdGhlbiB0aGUgbmFtZSB3aWxsIFxuXHQgKiBiZSB0cmVhdGVkIGFzIGEgQ1NTIHNlbGVjdG9yLlxuXHQgKi9cblx0cGFyc2VUZXN0T2JqZWN0IChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBwb3M6IG51bWJlciA9IG5hbWUuaW5kZXhPZiAoXCIqXCIpO1xuXHRcdGxldCB3aWxkY2FyZDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFwqLywgXCJcIik7XG5cdFx0XHR3aWxkY2FyZCA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdGxldCBzZWxlY3Rvcjogc3RyaW5nID0gYFtkYXRhLXRlc3Qtb2JqZWN0LW5hbWUke3dpbGRjYXJkfT0nJHtuYW1lfSddYDtcblx0XHRwb3MgPSBuYW1lLmluZGV4T2YgKFwiPlwiKTtcblxuXHRcdGlmIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRuYW1lID0gbmFtZS5yZXBsYWNlICgvXFw+LywgXCJcIik7XG5cdFx0XHRzZWxlY3RvciA9IG5hbWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChzZWxlY3Rvcik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0YXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKGF3YWl0IG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRhc3luYyBwcmludCAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUgKG1lc3NhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByaW50IGEgbWVzc2FnZSBsaW5lLlxuXHQgKi9cblx0YXN5bmMgcHJpbnRsbiAobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0YXdhaXQgdGhpcy5wcmludCAoYCR7bWVzc2FnZX1cXG5gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoaXMgc2VydmVyIG9yIGRlc3Ryb3kgYW55dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSG90VGVzdERyaXZlci5cblx0ICovXG5cdGFzeW5jIGRlc3Ryb3kgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIEFuIGV4cHJlc3Npb24gdG8gdGVzdC5cblx0ICovXG5cdGFzeW5jIGFzc2VydCAodmFsdWU6IGFueSwgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRpZiAoISAodmFsdWUpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChlcnJvck1lc3NhZ2UpO1xuXHR9XG59IiwiLyoqXG4gKiBIb3QgdGVzdCBlbGVtZW50IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFRlc3RFbGVtZW50T3B0aW9uc1xue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3QgZWxlbWVudCBtdXN0IGJlIHZpc2libGUgaW4gXG5cdCAqIG9yZGVyIHRvIHNlbGVjdCBpdC5cblx0ICovXG5cdG11c3RCZVZpc2libGU/OiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgdGhlIHRlc3QgZWxlbWVudCBpcyBtaXNzaW5nLCBpZ25vcmUgdGhlIGVycm9yLiBUaGlzIFxuXHQgKiB3aWxsIGNhdXNlIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaW1tZWRpYXRlbHkgXG5cdCAqIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duLlxuXHQgKi9cblx0aWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG90IHRlc3QgZWxlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdEVsZW1lbnRPcHRpb25zIGltcGxlbWVudHMgSUhvdFRlc3RFbGVtZW50T3B0aW9uc1xue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRlc3QgZWxlbWVudCBtdXN0IGJlIHZpc2libGUgaW4gXG5cdCAqIG9yZGVyIHRvIHNlbGVjdCBpdC5cblx0ICovXG5cdG11c3RCZVZpc2libGU6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBJZiB0aGUgdGVzdCBlbGVtZW50IGlzIG1pc3NpbmcsIGlnbm9yZSB0aGUgZXJyb3IuIFRoaXMgXG5cdCAqIHdpbGwgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBpbW1lZGlhdGVseSBcblx0ICogd2l0aG91dCBhbnkgZXhjZXB0aW9ucyBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90VGVzdEVsZW1lbnRPcHRpb25zID0ge30pXG5cdHtcblx0XHR0aGlzLm11c3RCZVZpc2libGUgPSBjb3B5Lm11c3RCZVZpc2libGUgfHwgdHJ1ZTtcblx0XHR0aGlzLmlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IgPSBjb3B5Lmlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IgfHwgZmFsc2U7XG5cdH1cbn1cblxuLyoqXG4gKiBBIHRlc3QgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90VGVzdEVsZW1lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgXG5cdCAqIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdC5cblx0ICovXG5cdGZ1bmM/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgdG8gdXNlLlxuXHQgKi9cblx0dmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSB0ZXN0IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RWxlbWVudCBpbXBsZW1lbnRzIElIb3RUZXN0RWxlbWVudFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBcblx0ICogd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0LlxuXHQgKi9cblx0ZnVuYzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIHRvIHVzZS5cblx0ICovXG5cdHZhbHVlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZyB8IElIb3RUZXN0RWxlbWVudCwgZnVuYzogc3RyaW5nID0gXCJcIiwgdmFsdWU6IGFueSA9IG51bGwpXG5cdHtcblx0XHRpZiAodHlwZW9mIChuYW1lKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdFx0dGhpcy5mdW5jID0gZnVuYztcblx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMubmFtZSA9IG5hbWUubmFtZTtcblx0XHRcdHRoaXMuZnVuYyA9IG5hbWUuZnVuYyB8fCBmdW5jO1xuXHRcdFx0dGhpcy52YWx1ZSA9IG5hbWUudmFsdWUgfHwgdmFsdWU7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3REZXN0aW5hdGlvbiB9IGZyb20gXCIuL0hvdFRlc3REZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0UGFnZVwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHRlc3QgcGF0aCBmb3IgbGF0ZXIgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIb3RUZXN0UGF0aCA9IChkcml2ZXI6IEhvdFRlc3REcml2ZXIpID0+IFByb21pc2U8YW55PjtcblxuLyoqXG4gKiBNYXBzIHRoZSBwYXRocyB0aGF0IGFyZSB0YWtlbiB0byBjb21wbGV0ZSBhIHRlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0TWFwXG57XG5cdC8qKlxuXHQgKiBUaGUgb3JkZXIgaW4gd2hpY2ggcGF0aHMgYXJlIHRvIGJlIHRha2VuLiBFYWNoIGRlc3RpbmF0aW9uIGlzIGEgc3RyaW5nIFxuXHQgKiBpbiBhIHR5cGUgLT4gcGF0aCBvcmRlci4gVGhlIHR5cGUgY291bGQgYmUgZWl0aGVyIGEgcGFnZSBvciBhcGkgcm91dGUuIFxuXHQgKiBGb3IgZXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIFtcblx0ICogICAgICBcInBhZ2U6c2lnbmluX3BhZ2UgLT4gc2lnbmluX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV91c2VybmFtZV9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfcGFzc3dvcmRfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX25hbWVfcGF0aCAtPiBjaGFuZ2VfYWRkcmVzc19wYXRoXCIsXG5cdCAqIFx0XHRcInBhZ2U6YWNjb3VudF9wYWdlIC0+IHNpZ25vdXRfcGF0aFwiLFxuXHQgKiBcdFx0XCJhcGk6YWNjb3VudF9hcGlfcm91dGUgLT4gc2lnbm91dF9yb3V0ZV9tZXRob2QgLT4gc2lnbm91dF90ZXN0X3BhdGhcIlxuXHQgKiBdXG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhlIGZpcnN0IHN0cmluZyB0byB0aGUgbGVmdCBvZiB0aGUgLT4gd2lsbCBhbHdheXMgYmUgdGhlIHR5cGUsIHN1Y2ggYXMgYSBcblx0ICogcGFnZSBvciBhbiBhcGkgcm91dGUuIEFueSBzdHJpbmdzIHRvIHRoZSByaWdodCBvZiB0aGUgLT4gd2lsbCBiZSBhIHBhdGgsIGV2ZW4gXG5cdCAqIHdoZW4gY2hhaW5pbmcgYWRkdGlvbmFsIC0+J3MuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbnM6IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdERlc3RpbmF0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIGRlc3RpbmF0aW9ucyBhcmUgc3VwcG9zZWQgdG8gZXhlY3V0ZS4gVGhpcyBpcyBcblx0ICogaWdub3JlZCBpZiB0aGUgZGVzdGluYXRpb25zIGFyZSBhbiBhcnJheS5cblx0ICovXG5cdGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGFnZXMgdG8gZXhlY3V0ZS5cblx0ICovXG5cdHBhZ2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhZ2Vcblx0XHR9O1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbnM6IHN0cmluZ1tdIHwgSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb247IH0gPSBbXSwgXG5cdFx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlIH0gPSB7fSwgZGVzdGluYXRpb25PcmRlcjogc3RyaW5nW10gPSBbXSlcblx0e1xuXHRcdC8vIEdvIHRocm91Z2ggYW5kIGNvbnZlcnQgYW55IHN0cmluZ3MgaW50byBIb3RUZXN0RGVzdGluYXRpb25zLlxuXHRcdGlmIChkZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGRlc3RpbmF0aW9ucylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNba2V5XTtcblxuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uc1trZXldID0gbmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXN0aW5hdGlvbk9yZGVyID0gZGVzdGluYXRpb25PcmRlcjtcblx0XHR0aGlzLnBhZ2VzID0gcGFnZXM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIFRlc3RDYXNlT2JqZWN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdFRlc3REZXN0aW5hdGlvbiB9IGZyb20gXCIuL0hvdFRlc3REZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0UGFnZVwiO1xuaW1wb3J0IHsgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3REZXN0aW5hdGlvblwiO1xuaW1wb3J0IHsgSG90VGVzdFN0b3AgfSBmcm9tIFwiLi9Ib3RUZXN0U3RvcFwiO1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdGVyXG57XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGltZW91dCBmb3IgZWFjaCB0ZXN0LlxuXHQgKi9cblx0dGltZW91dDogbnVtYmVyO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRoYXQgd2lsbCBjb25zdHJ1Y3QgZnV0dXJlIHVybHMuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBwcm9jZXNzb3IuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBtYXBzIHRvIHRlc3QuXG5cdCAqL1xuXHR0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfTtcblx0LyoqXG5cdCAqIFRoZSBkcml2ZXIgdG8gdXNlIHdoZW4gcnVubmluZyB0ZXN0cy5cblx0ICovXG5cdGRyaXZlcjogSG90VGVzdERyaXZlcjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBsb2FkaW5nP1xuXHQgKi9cblx0ZmluaXNoZWRMb2FkaW5nOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgZmluaXNoZWQgc2V0dGluZyB1cD9cblx0ICovXG5cdGhhc0JlZW5EZXN0cm95ZWQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSwgbmFtZTogc3RyaW5nLCBiYXNlVXJsOiBzdHJpbmcsIFxuXHRcdGRyaXZlcjogSG90VGVzdERyaXZlciwgdGVzdE1hcHM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RNYXA7IH0gPSB7fSlcblx0e1xuXHRcdGlmICh0ZXN0TWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGhlIHRlc3RNYXBzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0LCBidXQgY2Fubm90IGJlIG51bGwhIEl0IGlzIHNldCB0byBudWxsLmApO1xuXG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gMTAwMDA7XG5cdFx0dGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0XHR0aGlzLnRlc3RNYXBzID0gdGVzdE1hcHM7XG5cdFx0dGhpcy5kcml2ZXIgPSBkcml2ZXI7XG5cdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IGZhbHNlO1xuXHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gc2V0dGluZyB1cCB0aGUgdGVzdGVyLlxuXHQgKi9cblx0YXN5bmMgc2V0dXAgKGlzV2ViUm91dGU6IGJvb2xlYW4sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gZGVzdHJveWluZyB1cCB0aGUgdGVzdGVyLlxuXHQgKi9cblx0YXN5bmMgZGVzdHJveSAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0ZXN0cyBhcmUgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIHRydWUsIGl0IHdpbGwgXG5cdCAqIGNvbnRpbnVlIGFuZCBleGVjdXRlIGFsbCB0ZXN0IHBhdGhzLiBJZiB0aGlzIHJldHVybnMgaXQgd2lsbCBcblx0ICogc2tpcCBhbGwgdGVzdCBwYXRocyBhbmQgZXhlY3V0ZSBvblRlc3RFbmQgaW5zdGVhZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCB1cmw6IHN0cmluZywgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIFxuXHQgKiB0aGUgdGVzdFBhdGggd2lsbCBub3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhTdGFydD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYW4gQVBJIHRlc3QgcGF0aCBoYXMgZW5kZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RBUElQYXRoRW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCByZXN1bHQ6IGFueSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gcGFnZSB0ZXN0cyBhcmUgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdGVzdFBhdGggd2lsbCBub3QgYmUgXG5cdCAqIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIGFmdGVyd2FyZHMuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RQYWdlUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgXG5cdFx0c3RvcDogSG90VGVzdFN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGEgcGFnZSB0ZXN0IGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoRW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCB0ZXN0UGF0aDogSG90VGVzdFBhdGgsIFxuXHRcdHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRhc3luYyBvbkNvbW1hbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhZ2U6IEhvdFRlc3RQYWdlLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0Y21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjbWRGdW5jOiAoKGNtZEFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+KSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBmaW5pc2hlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGJlZW4gZXhlY3V0ZWQgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25FeGVjdXRlPyAoKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIGxvYWRpbmcgYWxsIGRhdGEgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25GaW5pc2hlZExvYWRpbmc/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBmaW5pc2ggbG9hZGluZyBhbGwgZGF0YS5cblx0ICovXG5cdGFzeW5jIHdhaXRGb3JEYXRhICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAodGhpcy5maW5pc2hlZExvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICgxMCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBwYWdlLlxuXHQgKi9cblx0Z2V0VGVzdFBhZ2UgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IEhvdFRlc3RQYWdlXG5cdHtcblx0XHRsZXQgcGFnZSA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV0ucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRyZXR1cm4gKHBhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGdldFRlc3RQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhdGhOYW1lOiBzdHJpbmcpOiBIb3RUZXN0UGF0aFxuXHR7XG5cdFx0bGV0IHBhZ2UgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXG5cdFx0cmV0dXJuIChwYWdlLnRlc3RQYXRoc1twYXRoTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGRlc3RpbmF0aW9uIEpTT04gb2JqZWN0IHRvIHVzZS5cblx0ICovXG5cdHN0YXRpYyBpbnRlcnByZXREZXN0aW5hdGlvbiAobWFwTmFtZTogc3RyaW5nLCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uKTogSG90RGVzdGluYXRpb25cblx0e1xuXHRcdGxldCBkZXN0aW5hdGlvbjogc3RyaW5nID0gdGVzdERlc3QuZGVzdGluYXRpb247XG5cdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IHtcblx0XHRcdFx0bWFwTmFtZTogbWFwTmFtZSxcblx0XHRcdFx0cGFnZTogXCJcIixcblx0XHRcdFx0YXBpOiBcIlwiLFxuXHRcdFx0XHRwYXRoczogW11cblx0XHRcdH07XG5cdFx0bGV0IHN0cnM6IHN0cmluZ1tdID0gZGVzdGluYXRpb24uc3BsaXQgKC9cXC1cXD4vZyk7XG5cdFx0bGV0IHR5cGU6IHN0cmluZyA9IHN0cnNbMF07XG5cblx0XHRpZiAodHlwZS5sZW5ndGggPCAyKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdGlmICgodHlwZVswXSA9PT0gXCIvXCIpICYmICh0eXBlWzFdID09PSBcIi9cIikpXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXG5cdFx0bGV0IGdldFR5cGU6ICh0eXBlU3RyOiBzdHJpbmcsIHR5cGVEZWxpbWl0ZXI6IHN0cmluZykgPT4gc3RyaW5nID0gXG5cdFx0XHQodHlwZVN0cjogc3RyaW5nLCB0eXBlRGVsaW1pdGVyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHBvczogbnVtYmVyID0gdHlwZVN0ci5pbmRleE9mICh0eXBlRGVsaW1pdGVyKTtcblx0XHRcdFx0bGV0IHR5cGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcblx0XHRcblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZVZhbHVlID0gdHlwZVN0ci5zdWJzdHIgKHBvcyArIHR5cGVEZWxpbWl0ZXIubGVuZ3RoKTtcblx0XHRcdFx0XHR0eXBlVmFsdWUgPSB0eXBlVmFsdWUudHJpbSAoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodHlwZVZhbHVlKTtcblx0XHRcdH07XG5cblx0XHRuZXdEZXN0aW5hdGlvbi5wYWdlID0gZ2V0VHlwZSAodHlwZSwgXCJwYWdlOlwiKTtcblx0XHRuZXdEZXN0aW5hdGlvbi5hcGkgPSBnZXRUeXBlICh0eXBlLCBcImFwaTpcIik7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMTsgaUlkeCA8IHN0cnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG5ld1BhdGhTdHI6IHN0cmluZyA9IHN0cnNbaUlkeF07XG5cdFx0XHRsZXQgbmV3UGF0aDogSG90VGVzdFN0b3AgPSB7XG5cdFx0XHRcdFx0Y21kOiBcIlwiLFxuXHRcdFx0XHRcdGRlc3Q6IFwiXCIsXG5cdFx0XHRcdFx0cGF0aDogXCJcIlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRuZXdQYXRoU3RyID0gbmV3UGF0aFN0ci50cmltICgpO1xuXHRcdFx0bmV3UGF0aC5kZXN0ID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJkZXN0OlwiKTtcblx0XHRcdG5ld1BhdGguY21kID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJjbWQ6XCIpO1xuXHRcdFx0bmV3UGF0aC5wYXRoID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJwYXRoOlwiKTtcblxuXHRcdFx0aWYgKChuZXdQYXRoLmRlc3QgPT0gXCJcIikgJiYgKG5ld1BhdGguY21kID09IFwiXCIpICYmIChuZXdQYXRoLnBhdGggPT0gXCJcIikpXG5cdFx0XHRcdG5ld1BhdGgucGF0aCA9IG5ld1BhdGhTdHI7XG5cblx0XHRcdG5ld0Rlc3RpbmF0aW9uLnBhdGhzLnB1c2ggKG5ld1BhdGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobmV3RGVzdGluYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYW4gQVBJJ3MgdGVzdCBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RBUElQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHNraXBFdmVudENhbGxzOiBib29sZWFuID0gZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCBydW5UZXN0UGF0aDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRpZiAobWV0aG9kID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUcnlpbmcgdG8gYWNjZXNzIG51bGwgbWV0aG9kIG9uIGRlc3RpbmF0aW9uIG1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9LmApO1xuXG5cdFx0Ly8gQSBkdW1iIGhhY2sgdG8gcHJldmVudCBhbnkgcmVjdXJzaW9uIHRoYXQgY291bGQgb2NjdXIuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RBUElQYXRoU3RhcnQgIT0gbnVsbClcblx0XHRcdFx0cnVuVGVzdFBhdGggPSBhd2FpdCB0aGlzLm9uVGVzdEFQSVBhdGhTdGFydCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKHJ1blRlc3RQYXRoID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGxldCB0ZXN0Q2FzZU9iamVjdDogVGVzdENhc2VPYmplY3QgPSBtZXRob2QudGVzdENhc2VzW3Rlc3ROYW1lXTtcblxuXHRcdFx0aWYgKHRlc3RDYXNlT2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogVGVzdCBjYXNlIG9iamVjdCAke3Rlc3ROYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0cmVzdWx0ID0gYXdhaXQgdGVzdENhc2VPYmplY3QuZnVuYyAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0QVBJUGF0aEVuZCAhPSBudWxsKVxuXHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEFQSVBhdGhFbmQgKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgdGVzdCBwYXRocyBpbiBhbiBBUEkgcm91dGUuXG5cdCAqIFxuXHQgKiBAZml4bWUgVGhpcyBuZWVkcyBhIGJldHRlciBpbXBsZW1lbnRhdGlvbi4uLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RBUElQYXRocyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXTtcblxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFQSSBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGlmICh0aGlzLnByb2Nlc3Nvci5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQXNzb2NpYXRlZCBwcm9jZXNzb3IgZG9lcyBub3QgaGF2ZSBhbiBBUEkhYCk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gdGhpcy5wcm9jZXNzb3IuYXBpLnJvdXRlc1tkZXN0aW5hdGlvbi5hcGldO1xuXG5cdFx0aWYgKHJvdXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFQSSBkb2VzIG5vdCBoYXZlIHJvdXRlICR7ZGVzdGluYXRpb24uYXBpfSFgKTtcblxuXHRcdC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHBhdGggaW4gdGhlIGRlc3RpbmF0aW9uIHVudGlsIGNvbXBsZXRlLlxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgZGVzdGluYXRpb24ucGF0aHMubGVuZ3RoOyBpSWR4ICs9IDIpXG5cdFx0e1xuXHRcdFx0bGV0IHN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeF07XG5cdFx0XHRsZXQgcGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRcdGxldCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gcm91dGUuZ2V0TWV0aG9kIChwYXRoTmFtZSk7XG5cdFx0XHRsZXQgbmV4dFN0b3A6IEhvdFRlc3RTdG9wID0gZGVzdGluYXRpb24ucGF0aHNbaUlkeCArIDFdO1xuXHRcdFx0bGV0IHRlc3ROYW1lOiBzdHJpbmcgPSBuZXh0U3RvcC5wYXRoO1xuXG5cdFx0XHRpZiAobWV0aG9kID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIG1ldGhvZCByZWxhdGVkIHRvIHBhdGggJHtwYXRoTmFtZX0gaW4gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uLCBtZXRob2QsIHRlc3ROYW1lKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIHRlc3QgcGFnZSBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0c2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdlYiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRpZiAocGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLmRyaXZlci5wYWdlID0gcGFnZTtcblxuXHRcdGxldCB0ZXN0UGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRsZXQgdGVzdFBhdGg6IEhvdFRlc3RQYXRoID0gcGFnZS50ZXN0UGF0aHNbdGVzdFBhdGhOYW1lXTtcblxuXHRcdC8vIEEgZHVtYiBoYWNrIHRvIHByZXZlbnQgYW55IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIG9jY3VyLlxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKHJ1blRlc3RQYXRoID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0UGF0aCA9PSBudWxsKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgcGF0aCAke3Rlc3RQYXRoTmFtZX0gZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIWApO1xuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0UGF0aCAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aEVuZCAoZGVzdGluYXRpb24sIHRlc3RQYXRoLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgc3RvcDogSG90VGVzdFN0b3AsIGNtZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0LyoqXG5cdFx0ICogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbW1hbmQgbWF0Y2hlcy5cblx0XHQgKi9cblx0XHRsZXQgaGFzQ21kOiAoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbikgPT4gYm9vbGVhbiA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcsIGNtZDogc3RyaW5nLCBoYXNBcmd1bWVudHM6IGJvb2xlYW4pOiBib29sZWFuID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoc3RvcC5jbWQgPT09IGNtZClcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHBvczogbnVtYmVyID0gc3RvcC5jbWQuaW5kZXhPZiAoXCIoXCIpO1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlJ3MgcGFyZW50aGVzaXMsIGdldCB0aGUgaW5jb21pbmcgY29tbWFuZC5cblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0Q21kOiBzdHJpbmcgPSBzdG9wLmNtZC5zdWJzdHIgKDAsIHBvcyk7XG5cblx0XHRcdFx0XHRpZiAoaW5wdXRDbWQgPT09IGNtZClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIEdldCB0aGUgYXJndW1lbnRzIGluIGEgY29tbWFuZC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGEgXG5cdFx0ICogc2luZ2xlIGFyZ3VtZW50IGZvciBub3cuXG5cdFx0ICogXG5cdFx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhcmd1bWVudHMuXG5cdFx0ICovXG5cdFx0bGV0IGdldENtZEFyZ3M6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdbXSA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaCAoLyg/PVxcKCkoLio/KSg/PVxcKSkvZyk7XG5cblx0XHRcdFx0aWYgKG1hdGNoZXMgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZW1wTWF0Y2ggPSBtYXRjaGVzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdFx0dGVtcE1hdGNoID0gdGVtcE1hdGNoLnN1YnN0ciAoMiwgdGVtcE1hdGNoLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRyZXN1bHRzLnB1c2ggKHRlbXBNYXRjaCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0cy5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke2lucHV0fSByZXF1aXJlcyBhcmd1bWVudHMsIGJ1dCBub25lIHdlcmUgc3VwcGxpZWQuYCk7XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0XHRcdH07XG5cblx0XHRsZXQgc2VsZW5pdW1UZXN0ZXI6IGFueSA9IG51bGw7XG5cdFx0bGV0IGNtZEZ1bmM6ICgoY21kQXJnczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4pID0gbnVsbDtcblx0XHRsZXQgYXJnczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodHlwZW9mIChIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtKSAhPSBcInVuZGVmaW5lZFwiKVxuXHRcdHsvLyBAdHMtaWdub3JlXG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gSGFjayB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbXBvcnRpbmcuXG5cdFx0XHRpZiAodGhpcyBpbnN0YW5jZW9mIEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0pXG5cdFx0XHRcdHNlbGVuaXVtVGVzdGVyID0gdGhpcztcblx0XHR9XG5cblx0XHRpZiAoc2VsZW5pdW1UZXN0ZXIgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ1cmxcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRcdGF3YWl0IHNlbGVuaXVtVGVzdGVyLmRyaXZlci5uYXZpZ2F0ZVRvVXJsIChpbnB1dCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RPYmplY3RcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cdFxuXHRcdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0ZXN0T2JqZWN0OiBzdHJpbmcgPSBKU09OLnBhcnNlIChjbWRBcmdzWzBdKTtcblx0XG5cdFx0XHRcdFx0XHRhd2FpdCBzZWxlbml1bVRlc3Rlci5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50ICh0ZXN0T2JqZWN0KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRGb3JUZXN0ZXJBUElEYXRhXCIsIGZhbHNlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JEYXRhICgpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBudW1NaWxsaXNlY29uZHM6IG51bWJlciA9IHBhcnNlSW50IChjbWRBcmdzWzBdKTtcblxuXHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAobnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIucHJpbnQgKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludGxuXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludGxuIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGNtZEZ1bmMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke3N0b3AuY21kfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGF3YWl0IHRoaXMub25Db21tYW5kIChkZXN0aW5hdGlvbiwgcGFnZSwgc3RvcCwgY21kLCBhcmdzLCBjbWRGdW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB0ZXN0IHBhdGhzIGluIGEgcGFnZS5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0UGFnZVBhdGhzIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueVtdPlxuXHR7XG5cdFx0bGV0IHJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0Ly8vIEBmaXhtZSBGb3Igc29tZSByZWFzb24gdGhlIGVycm9ycyBiZWluZyB0aHJvd24gaGVyZSBhcmUgbm90IGJlaW5nIHRocm93bi5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBXZWIgTWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHQvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXRoIGluIHRoZSBkZXN0aW5hdGlvbiB1bnRpbCBjb21wbGV0ZS5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9uLnBhdGhzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBzdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHhdO1xuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblx0XHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cdFxuXHRcdFx0aWYgKHBhZ2UgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdGlmIChzdG9wLmRlc3QgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0TWFwLmRlc3RpbmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2hlbiB1c2luZyB0eXBlICdkZXN0JyBpbiBhIGRlc3RpbmF0aW9uIHN0cmluZywgYWxsIGRlc3RpbmF0aW9ucyBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBtdXN0IGJlIG5hbWVkLmApO1xuXG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gdGVzdE1hcC5kZXN0aW5hdGlvbnNbc3RvcC5kZXN0XTtcblx0XHRcdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IEhvdFRlc3Rlci5pbnRlcnByZXREZXN0aW5hdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uLm1hcE5hbWUsIHRlc3REZXN0KTtcblxuXHRcdFx0XHRpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbClcblx0XHRcdFx0XHRyZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0UGFnZVBhdGhzIChuZXdEZXN0aW5hdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdG9wLmNtZCAhPT0gXCJcIilcblx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIHN0b3AuY21kKTtcblxuXHRcdFx0aWYgKHN0b3AucGF0aCAhPT0gXCJcIilcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbiwgc3RvcCwgZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlIChtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1ttYXBOYW1lXTtcblxuXHRcdGlmIChtYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7bWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLnByb2Nlc3Nvci5sb2dnZXIudmVyYm9zZSAoYEhvdFRlc3RlcjogRXhlY3V0aW5nIG1hcCAke21hcE5hbWV9Li4uYCk7XG5cblx0XHQvLyBQcm9jZXNzIHJvdXRlcyB0ZXN0aW5nIGZpcnN0LlxuXHRcdGxldCByb3V0ZUtleTogc3RyaW5nID0gdGhpcy5wcm9jZXNzb3IuZ2V0Um91dGVLZXlGcm9tTmFtZSAobWFwTmFtZSk7XG5cdFx0bGV0IHVybDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmJhc2VVcmwgPT09IFwiXCIpXG5cdFx0e1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYgKHJvdXRlS2V5ICE9PSBcIlwiKVxuXHRcdFx0dXJsID0gYCR7dGhpcy5iYXNlVXJsfSR7cm91dGVLZXl9YDtcblxuXHRcdGxldCBleGVjdXRlRGVzdGluYXRpb246ICh0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbktleT86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPiA9IFxuXHRcdFx0YXN5bmMgKHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24sIGRlc3RpbmF0aW9uS2V5OiBzdHJpbmcgPSBcIlwiKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdERlc3QuYXV0b1N0YXJ0ID09PSBmYWxzZSlcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnByb2Nlc3Nvci5sb2dnZXIudmVyYm9zZSAoKCkgPT4gYEhvdFRlc3RlcjogRXhlY3V0aW5nICR7bWFwTmFtZX0gZGVzdGluYXRpb24gJHtKU09OLnN0cmluZ2lmeSAodGVzdERlc3QpfS4uLmApO1xuXHRcdFx0XHRcdGxldCBkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSBIb3RUZXN0ZXIuaW50ZXJwcmV0RGVzdGluYXRpb24gKG1hcE5hbWUsIHRlc3REZXN0KTtcblx0XHRcdFx0XHRsZXQgaXNXZWJSb3V0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBydW5UZXN0UGF0aHM6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLnBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRpc1dlYlJvdXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHVwICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaGFzQmVlblNldHVwID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zZXR1cCAoaXNXZWJSb3V0ZSwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5oYXNCZWVuRGVzdHJveWVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLm9uVGVzdFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRydW5UZXN0UGF0aHMgPSBhd2FpdCB0aGlzLm9uVGVzdFN0YXJ0IChkZXN0aW5hdGlvbiwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHJ1blRlc3RQYXRocyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24ucGFnZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLmFwaSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEVuZCAoZGVzdGluYXRpb24pO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVzdHJveSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmRlc3Ryb3kgKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRocm93IGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIG1hcCBkZXN0aW5hdGlvbnMgYXJlIGluIGFuIGFycmF5LCBqdXN0IGV4ZWN1dGUgdGhvc2UgaW4gb3JkZXIuXG5cdFx0aWYgKG1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcC5kZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tpSWR4XTtcblxuXHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBkZXN0aW5hdGlvbiBvcmRlciwgdXNlIHRoYXQuXG5cdFx0XHRpZiAobWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGhhc0V4ZWN1dGVkS2V5czogc3RyaW5nW10gPSBbXTtcblxuXHRcdFx0XHQvLyBHbyB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbiBvcmRlciBhbmQgZXhlY3V0ZSBlYWNoIG9uZS5cblx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25PcmRlci5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvcmRlcktleTogc3RyaW5nID0gbWFwLmRlc3RpbmF0aW9uT3JkZXJbaUlkeF07XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW29yZGVyS2V5XTtcblxuXHRcdFx0XHRcdGlmICh0ZXN0RGVzdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEZXN0aW5hdGlvbiAke29yZGVyS2V5fSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdGhhc0V4ZWN1dGVkS2V5cy5wdXNoIChvcmRlcktleSk7XG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwgb3JkZXJLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCB5ZXQuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4ZWN1dGVEZXN0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaGFzRXhlY3V0ZWRLZXlzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBleGVjdXRlZEtleTogc3RyaW5nID0gaGFzRXhlY3V0ZWRLZXlzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZXhlY3V0ZWRLZXkgPT09IGtleSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZXhlY3V0ZURlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0ZURlc3QgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGRlc3RpbmF0aW9ucyBpbiBhbnkgb3JkZXIuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgRXZlbnRFeGVjdXRpb25UeXBlLCBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdEV2ZW50TWV0aG9kLCBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcblxuZXhwb3J0IGNsYXNzIEhvdFRlc3RlckFQSSBleHRlbmRzIEhvdEFQSVxue1xuXHRjb25zdHJ1Y3RvciAoYmFzZVVybDogc3RyaW5nLCBjb25uZWN0aW9uOiBIb3RTZXJ2ZXIgfCBIb3RDbGllbnQgPSBudWxsLCBkYjogYW55ID0gbnVsbClcblx0e1xuXHRcdHN1cGVyKGJhc2VVcmwsIGNvbm5lY3Rpb24sIGRiKTtcblxuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdEFQSTtcblxuXHRcdGxldCByb3V0ZTogSG90Um91dGUgPSBuZXcgSG90Um91dGUgKGNvbm5lY3Rpb24sIFwidGVzdGVyXCIpO1xuXHRcdHJvdXRlLmFkZE1ldGhvZCAoe1xuXHRcdFx0XHRcIm5hbWVcIjogXCJwYWdlTG9hZGVkXCIsIFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLnBhZ2VMb2FkZWQsXG5cdFx0XHRcdFwicGFyYW1ldGVyc1wiOiB7XG5cdFx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3Rlck1hcFwiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgdGVzdGVyIG1hcCBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInBhZ2VOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSBwYWdlIGV4ZWN1dGluZyB0aGUgdGVzdC5cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFwidGVzdEVsZW1lbnRzXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJhcnJheVwiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3QgZWxlbWVudHMgb24gdGhlIHBhZ2UuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3RQYXRoc1wiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwiYXJyYXlcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0IHBhdGhzIG9uIHRoZSBwYWdlLlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImV4ZWN1dGVUZXN0c1wiLFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmV4ZWN1dGVUZXN0cyxcblx0XHRcdFx0XCJwYXJhbWV0ZXJzXCI6IHtcblx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwidGVzdGVyTWFwXCI6IHtcblx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0ZXIgbWFwIHRvIGV4ZWN1dGUuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSB3aGVuIHRlc3RzIGFyZSBjb21wbGV0ZS5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImhlYXJ0YmVhdFwiLFxuXHRcdFx0XHRcInR5cGVcIjogSG90RXZlbnRNZXRob2QuR0VULFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmhlYXJ0YmVhdCxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0dGhpcy5hZGRSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cblx0ICovXG5cdGFzeW5jIHBhZ2VMb2FkZWQgKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJPYmo6IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHRcdFx0XHR0ZXN0ZXJNYXA6IHN0cmluZztcblx0XHRcdFx0cGFnZU5hbWU6IHN0cmluZztcblx0XHRcdFx0dGVzdEVsZW1lbnRzOiBhbnk7XG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IGFueTtcblx0XHRcdH0gPSB7XG5cdFx0XHRcdHRlc3Rlck5hbWU6IHJlcXVlc3QuanNvbk9ialtcInRlc3Rlck5hbWVcIl0sXG5cdFx0XHRcdHRlc3Rlck1hcDogcmVxdWVzdC5qc29uT2JqW1widGVzdGVyTWFwXCJdLFxuXHRcdFx0XHRwYWdlTmFtZTogcmVxdWVzdC5qc29uT2JqW1wicGFnZU5hbWVcIl0sXG5cdFx0XHRcdHRlc3RFbGVtZW50czogcmVxdWVzdC5qc29uT2JqW1widGVzdEVsZW1lbnRzXCJdLFxuXHRcdFx0XHR0ZXN0UGF0aHNTdHJzOiByZXF1ZXN0Lmpzb25PYmpbXCJ0ZXN0UGF0aHNcIl1cblx0XHRcdH07XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gdGVzdGVyT2JqKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGxldCB0ZXN0T2JqOiBhbnkgPSB0ZXN0ZXJPYmpba2V5XTtcblx0XHRcdGxldCB0aHJvd0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdGlmICh0ZXN0T2JqID09IG51bGwpXG5cdFx0XHRcdHRocm93RXJyb3IgPSB0cnVlO1xuXG5cdFx0XHRpZiAoKHRlc3Rlck9iai50ZXN0ZXJOYW1lID09IFwiXCIpIHx8IFxuXHRcdFx0XHQodGVzdGVyT2JqLnRlc3Rlck1hcCA9PT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID09PSBcIlwiKSlcblx0XHRcdHtcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aHJvd0Vycm9yID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IE9iamVjdCAke2tleX0gd2FzIG5vdCBwYXNzZWQuYCk7XG5cdFx0fVxuXG5cdFx0dGVzdGVyT2JqLnRlc3RFbGVtZW50cyA9IEpTT04ucGFyc2UgKHRlc3Rlck9iai50ZXN0RWxlbWVudHMpO1xuXHRcdHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMpO1xuXG5cdFx0bGV0IHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH0gPSB7fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycylcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGg6IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gXG5cdFx0XHRcdGV2YWwgKHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzW2tleV0pO1xuXG5cdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoO1xuXHRcdH1cblxuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IudGVzdGVyc1t0ZXN0ZXJPYmoudGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciAke3Rlc3Rlck9iai50ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGVzdGVyLnRlc3RNYXBzW3Rlc3Rlck9iai50ZXN0ZXJNYXBdO1xuXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3RlckFQSTogVGVzdGVyIG1hcCAke3Rlc3Rlck9iai50ZXN0ZXJNYXB9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0dGVzdE1hcC5wYWdlc1t0ZXN0ZXJPYmoucGFnZU5hbWVdID0ge1xuXHRcdFx0XHRcInRlc3RFbGVtZW50c1wiOiB7fSxcblx0XHRcdFx0XCJ0ZXN0UGF0aHNcIjoge31cblx0XHRcdH07XG5cdFx0dGVzdE1hcC5wYWdlc1t0ZXN0ZXJPYmoucGFnZU5hbWVdLnRlc3RFbGVtZW50cyA9IHRlc3Rlck9iai50ZXN0RWxlbWVudHM7XG5cdFx0dGVzdE1hcC5wYWdlc1t0ZXN0ZXJPYmoucGFnZU5hbWVdLnRlc3RQYXRocyA9IHRlc3RQYXRocztcblxuXHRcdHRlc3Rlci5maW5pc2hlZExvYWRpbmcgPSB0cnVlO1xuXG5cdFx0aWYgKHRlc3Rlci5vbkZpbmlzaGVkTG9hZGluZyAhPSBudWxsKVxuXHRcdFx0YXdhaXQgdGVzdGVyLm9uRmluaXNoZWRMb2FkaW5nICgpO1xuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRoZSB0ZXN0cyBmb3IgYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RzIChyZXE6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSByZXEuanNvbk9ialtcInRlc3Rlck5hbWVcIl07XG5cdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gcmVxLmpzb25PYmpbXCJ0ZXN0ZXJNYXBcIl07XG5cblx0XHRpZiAoKHRlc3Rlck5hbWUgPT0gbnVsbCkgfHwgKHRlc3Rlck1hcCA9PSBudWxsKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUZXN0ZXJBUEk6IE5vdCBhbGwgcmVxdWlyZWQganNvbiBvYmplY3RzIHdlcmUgcGFzc2VkLlwiKTtcblxuXHRcdGlmICgodGVzdGVyTmFtZSA9PT0gXCJcIikgfHwgKHRlc3Rlck1hcCA9PT0gXCJcIikpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGVzdGVyQVBJOiBOb3QgYWxsIHJlcXVpcmVkIGpzb24gb2JqZWN0cyB3ZXJlIHBhc3NlZC5cIik7XG5cblx0XHRsZXQgc2VydmVyOiBIb3RTZXJ2ZXIgPSAoPEhvdFNlcnZlcj50aGlzLmNvbm5lY3Rpb24pO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmIChzZXJ2ZXIuZXhlY3V0ZVRlc3RzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0YXdhaXQgc2VydmVyLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgdGVzdGVyTWFwKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc3BvbmRzIHdpdGggdHJ1ZSB0byBoZWFydGJlYXQgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBoZWFydGJlYXQgKHJlcTogU2VydmVyUmVxdWVzdCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxufSIsIm1vZHVsZS5leHBvcnRzID0ge307IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zLCBJSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFNpdGUsIEhvdFNpdGVSb3V0ZSwgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5pbXBvcnQgeyBIb3QsIERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEFzc2V0IH0gZnJvbSBcIi4vSG90QXNzZXRcIjtcbmltcG9ydCB7IEhvdE1vZHVsZSB9IGZyb20gXCIuL0hvdE1vZHVsZVwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vLyBTZXJ2ZXIgc3R1ZmZcbmltcG9ydCB7IEhvdEFQSSwgRXZlbnRFeGVjdXRpb25UeXBlLCBBUEl0b0xvYWQgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIb3RFdmVudE1ldGhvZCwgU2VydmVyUmVxdWVzdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIsIEhvdFNlcnZlclR5cGUgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuXG4vLyBUZXN0aW5nIHN0dWZmXG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zLCBJSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdFN0b3AgfSBmcm9tIFwiLi9Ib3RUZXN0U3RvcFwiO1xuaW1wb3J0IHsgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3REZXN0aW5hdGlvblwiO1xuLy9pbXBvcnQgeyBIb3RUZXN0ZXJNb2NoYSB9IGZyb20gXCIuL0hvdFRlc3Rlck1vY2hhXCI7XG4vL2ltcG9ydCB7IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gfSBmcm9tIFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90VGVzdERlc3RpbmF0aW9uXCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RQYWdlXCI7XG5cbkhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4vLyBDYW4ndCBleHBvcnQgaW50ZXJmYWNlcyBmcm9tIGhlcmUgOihcblxuZXhwb3J0IHtcbiAgICBIb3RTdGFxLFxuICAgIEhvdCxcbiAgICBIb3RNb2R1bGUsXG4gICAgSG90QXNzZXQsXG4gICAgRGV2ZWxvcGVyTW9kZSxcbiAgICBIb3RDb21wb25lbnQsXG4gICAgSG90QVBJLFxuICAgIEV2ZW50RXhlY3V0aW9uVHlwZSxcbiAgICBIb3RGaWxlLFxuICAgIEhvdExvZyxcbiAgICBIb3RMb2dMZXZlbCxcbiAgICBIb3RQYWdlLFxuICAgIEhvdFJvdXRlLFxuICAgIEhvdFJvdXRlTWV0aG9kLFxuICAgIEhvdEV2ZW50TWV0aG9kLFxuICAgIFNlcnZlclJlcXVlc3QsXG4gICAgSG90U2VydmVyLFxuICAgIEhvdFNlcnZlclR5cGUsXG4gICAgSG90Q2xpZW50LFxuICAgIEhvdFRlc3RlcixcbiAgICBIb3RUZXN0ZXJBUEksXG4gICAgSG90VGVzdE1hcCxcbiAgICBIb3RUZXN0RGVzdGluYXRpb24sXG4gICAgSG90VGVzdEVsZW1lbnQsXG4gICAgSG90VGVzdEVsZW1lbnRPcHRpb25zLFxuICAgIEhvdFRlc3REcml2ZXJcbn07Il0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJzZWxmIiwiRm9ybURhdGEiLCJ3aW5kb3ciLCJhc3NpZ24iLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiaW5pdCIsImNvbnZlcnRlciIsImRlZmF1bHRBdHRyaWJ1dGVzIiwic2V0IiwidmFsdWUiLCJhdHRyaWJ1dGVzIiwiZG9jdW1lbnQiLCJleHBpcmVzIiwiRGF0ZSIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInN0cmluZ2lmaWVkQXR0cmlidXRlcyIsImF0dHJpYnV0ZU5hbWUiLCJzcGxpdCIsImNvb2tpZSIsIndyaXRlIiwiT2JqZWN0IiwiY3JlYXRlIiwiZ2V0IiwiY29va2llcyIsImphciIsInBhcnRzIiwic2xpY2UiLCJqb2luIiwiZm91bmRLZXkiLCJyZWFkIiwiZSIsInJlbW92ZSIsIndpdGhBdHRyaWJ1dGVzIiwidGhpcyIsIndpdGhDb252ZXJ0ZXIiLCJmcmVlemUiLCJwYXRoIiwiZmFjdG9yeSIsImdsb2JhbCIsIkVycm9yIiwiZ2V0R2xvYmFsIiwiZmV0Y2giLCJiaW5kIiwiSGVhZGVycyIsIlJlcXVlc3QiLCJSZXNwb25zZSIsIkRldmVsb3Blck1vZGUiLCJIb3QiLCJzdGF0aWMiLCJmaWxlIiwiYXJncyIsIkhvdFN0YXEiLCJpc1dlYiIsImxvd2VyRmlsZSIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImVjaG8iLCJnZXRGaWxlIiwicGFyZW50T2JqZWN0Iiwib3V0cHV0IiwiZyIsImV2YWwiLCJhcHBseSIsIm1vZHVsZU5hbWUiLCJmb3VuZE1vZHVsZSIsIkN1cnJlbnRQYWdlIiwicHJvY2Vzc29yIiwiZ2V0TW9kdWxlIiwibmV3TW9kdWxlIiwiRnVuY3Rpb24iLCJsb2FkSFRNTCIsImFkZE1vZHVsZSIsImZpbGVOYW1lIiwidGVtcEZpbGUiLCJwYWdlIiwiY29udGVudCIsInByb2Nlc3MiLCJIb3RGaWxlIiwibmFtZSIsInVybCIsImxvY2FsRmlsZSIsImNoZWNrRmlsZSIsImxvYWQiLCJyb3V0ZSIsImRhdGEiLCJodHRwTWV0aG9kIiwiSG90RXZlbnRNZXRob2QiLCJQT1NUIiwiZmlsZXMiLCJyZXN1bHQiLCJhcGkiLCJtYWtlQ2FsbCIsImpzb25SZXF1ZXN0IiwiR0VUIiwiZmV0Y2hPYmoiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwianNvbiIsImV4IiwibWVzc2FnZSIsInJlcXVlc3RJbml0IiwiT3V0cHV0IiwiaUlkeCIsIkNTUyIsImNzc0ZpbGUiLCJjc3NPdXQiLCJjc3NTdHIiLCJKU0ZpbGVzIiwianNGaWxlIiwianNGaWxlT3V0IiwianNGaWxlU3RyIiwiSlNTY3JpcHRzIiwianNTY3JpcHQiLCJqc1NjcmlwdE91dCIsImpzU2NyaXB0c1N0ciIsIkFyZ3VtZW50cyIsIkhvdFRlc3RFbGVtZW50IiwiTW9kZSIsIlByb2R1Y3Rpb24iLCJBUEkiLCJUZXN0ZXJBUEkiLCJEYXRhIiwiQ29va2llcyIsIlB1YmxpY0tleXMiLCJFdmVudEV4ZWN1dGlvblR5cGUiLCJjb25zdHJ1Y3RvciIsImJhc2VVcmwiLCJjb25uZWN0aW9uIiwiZGIiLCJkZXNjcmlwdGlvbiIsImNyZWF0ZUZ1bmN0aW9ucyIsImV4ZWN1dGVFdmVudHNVc2luZyIsIkhvdFJvdXRlIiwiYXV0aENyZWRlbnRpYWxzIiwidXNlckF1dGgiLCJyb3V0ZXMiLCJvblByZVJlZ2lzdGVyIiwib25Qb3N0UmVnaXN0ZXIiLCJzZXREQlNjaGVtYSIsInNjaGVtYSIsImdldERCIiwiZ2V0REJTY2hlbWEiLCJhZGRSb3V0ZSIsInJvdXRlTWV0aG9kIiwiZXhlY3V0ZUZ1bmN0aW9uIiwicm91dGVOYW1lIiwiYWRkTWV0aG9kIiwiSG90Um91dGVNZXRob2QiLCJuZXdSb3V0ZSIsIm1ldGhvZHMiLCJjdXJyZW50Um91dGUiLCJuZXdSb3V0ZU1ldGhvZCIsInR5cGUiLCJyb3V0ZVN0ciIsImdldFJvdXRlVXJsIiwiYXV0aENyZWRlbnRpYWwiLCJyZWdpc3RlclJvdXRlIiwiSG90U2VydmVyIiwicmVnaXN0ZXJSb3V0ZXMiLCJodHRwTWV0aG9kU3RyIiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJrZXlzIiwiZm9ybURhdGEiLCJhcHBlbmQiLCJtZXRob2QiLCJib2R5IiwianNvblJlcyIsImhlYWRlcnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInRoZW4iLCJqc29uT2JqIiwiY2F0Y2giLCJyZWFzb24iLCJlc2NhcGVkQ29udGVudCIsImZpbGVVcmwiLCJmaWxlQ29udGVudCIsIlJlZ0V4cCIsInRlc3RlckFQSSIsIkhvdFNlcnZlclR5cGUiLCJIVFRQIiwibG9nZ2VyIiwiY29weSIsImh0bWxFbGVtZW50cyIsInRhZyIsImVsZW1lbnRPcHRpb25zIiwidW5kZWZpbmVkIiwib2JzZXJ2ZWRBdHRyaWJ1dGVzIiwiaW5uZXIiLCJldmVudHMiLCJvbkNyZWF0ZWQiLCJlbGVtZW50IiwidGhyb3dBbGxFcnJvcnMiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsInRleHQiLCJsb2FkVXJsIiwiaHR0cEdldCIsImxvYWRMb2NhbEZpbGUiLCJmcyIsInJlYWRGaWxlIiwiZXJyIiwidG9TdHJpbmciLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwiZXhlYyIsInByZXZpb3VzSW5kZXgiLCJzdGFydCIsImluZGV4IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJzdGFydENoYXJzIiwiZW5kQ2hhcnMiLCJ0cmlnZ2VyQ2hhciIsInBvcyIsInN0YXJ0VHJpZ2dlclBvcyIsIm5lc3RlZENvdW50ZXIiLCJycG9zIiwibGFzdEluZGV4T2YiLCJlcG9zIiwidGVtcGVwb3MiLCJ0aGlzQ29udGVudCIsInBhcnNlck9wdGlvbnMiLCJvdXRwdXRDb21tYW5kcyIsImFsbG93U3RyaW5naWZ5IiwiU1RSSU5HSUZZX1NUQVJUIiwiU1RSSU5HSUZZX0VORCIsInByb2Nlc3NDb250ZW50IiwicmVnZXhGb3VuZCIsIm9mZkNvbnRlbnQiLCJ0ZW1wT3V0cHV0IiwicHJvY2Vzc05lc3RlZENvbnRlbnQiLCJyZWdleEZvdW5kMiIsIm9mZkNvbnRlbnQzIiwidGVtcE91dHB1dDIiLCJvdXQiLCJ0ZW1wT3V0cHV0MyIsInRlbXBPdXRwdXQ0IiwiRGV2ZWxvcG1lbnQiLCJmb3VuZFN0ciIsInBhcnNlIiwiY3JlYXRlVGVzdEVsZW1lbnQiLCJmb3VuZFN0cjIiLCJ0ZXN0RWxtIiwib2JqIiwiQXJyYXkiLCJ0ZXN0RWxlbWVudHMiLCJmdW5jIiwidGVtcE91dHB1dDUiLCJtb2RlIiwicHVibGljS2V5cyIsImdldEFQSSIsImdldFRlc3RlckFQSSIsInBhcnNlQ29udGVudCIsInJldHVybmVkT3V0cHV0IiwiZXhlY3V0aW9uQ29udGVudCIsIm5ld1ZhciIsIm5ld1ZhclZhbHVlIiwiY29udGVudE5hbWUiLCJTeW50YXhFcnJvciIsImhvdCIsImZpbmFsT3V0cHV0IiwiSG90TG9nTGV2ZWwiLCJsb2dMZXZlbCIsIkFsbCIsImxldmVsIiwiSW5mbyIsIldhcm5pbmciLCJWZXJib3NlIiwiTm9uZSIsImxvZyIsImVycm9yIiwid2FybmluZyIsImluZm8iLCJ2ZXJib3NlIiwiY29uc29sZSIsIndhcm4iLCJtc2ciLCJzdGFjayIsImltcG9ydCIsImh0bWwiLCJjc3MiLCJqcyIsImNvbXBvbmVudExpYnJhcnkiLCJjb21wb25lbnRzIiwib3V0cHV0Q1NTIiwiZWNob091dCIsIm91dHB1dEFzc2V0IiwiYXNzZXQiLCJvdXRwdXRKUyIsImFzc2V0TmFtZSIsImluY2x1ZGUiLCJsb2FkSG90RmlsZXMiLCJvdXRwdXRDb21wb25lbnRzIiwiYXNzZXRUeXBlIiwiYXNzZXRzIiwiY2FsbGJhY2siLCJsb2FkQXNzZXQiLCJIb3RBc3NldCIsInRlc3Rlck5hbWUiLCJ0ZXN0ZXJNYXAiLCJ0ZXN0UGF0aHMiLCJhZGRGaWxlIiwicHVzaCIsImFkZFRlc3RFbGVtZW50IiwiZWxtIiwiZ2V0VGVzdEVsZW1lbnQiLCJjcmVhdGVUZXN0UGF0aCIsInBhdGhOYW1lIiwiZHJpdmVyRnVuYyIsIm9uUmVnaXN0ZXIiLCJvbkF1dGhvcml6ZVVzZXIiLCJ2ZXJzaW9uIiwicHJlZml4IiwiZXJyb3JzIiwiY3JlYXRlRXJyb3IiLCJ0ZXN0Q2FzZXMiLCJnZXRNZXRob2QiLCJmb3VuZE1ldGhvZCIsInJlcSIsIndzU29ja2V0IiwiYXV0aG9yaXplZFZhbHVlIiwicXVlcnlPYmoiLCJvbkV4ZWN1dGUiLCJvblNlcnZlckF1dGhvcml6ZSIsInJldHVybnMiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJvblNlcnZlckV4ZWN1dGUiLCJvbkNsaWVudEV4ZWN1dGUiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJ0ZXN0Q2FzZU5hbWUiLCJhZGRUZXN0Q2FzZSIsIm5ld1Rlc3RDYXNlIiwidGVzdENhc2VGdW5jdGlvbiIsInRlc3RDYXNlSWQiLCJ0ZXN0Q2FzZSIsIm1ldGhvZE5hbWUiLCJzZXJ2ZXJUeXBlIiwibGlzdGVuQWRkcmVzcyIsInBvcnRzIiwiaHR0cCIsImh0dHBzIiwic3NsIiwiY2VydCIsImNhIiwicmVkaXJlY3RIVFRQdG9IVFRQUyIsInNlY3JldHMiLCJzZXRBUEkiLCJIb3RUZXN0ZXJNb2NoYSIsIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW0iLCJIb3RUZXN0U2VsZW5pdW1Ecml2ZXIiLCJIb3RMb2ciLCJzdGFydERlbGF5IiwicGFnZXMiLCJtb2R1bGVzIiwiaG90U2l0ZSIsImFwaUNvbnRlbnQiLCJ0ZXN0ZXJBcGlDb250ZW50IiwicGFnZUNvbnRlbnQiLCJ0ZXN0ZXJzIiwib2JqV2l0aFBhcmFtIiwicmVxdWlyZWQiLCJ0aHJvd0V4Y2VwdGlvbiIsImRlZmF1bHRWYWx1ZSIsImVyclR5cGUiLCJyZWRpcmVjdFRvVXJsIiwibG9jYXRpb24iLCJocmVmIiwibnVtTWlsbGlzZWNvbmRzIiwic2V0VGltZW91dCIsImFkZFBhZ2UiLCJnZXRQYWdlIiwicGFnZU5hbWUiLCJ0aHJvd0V4IiwidGVtcE5hbWUiLCJzdWJzdHJpbmciLCJjb250ZXh0IiwidmFsIiwiYXJ5QXJncyIsInByb3RvdHlwZSIsImNhbGwiLCJhZGRDb21wb25lbnQiLCJDb21wb25lbnRUeXBlIiwidGVtcEFwaSIsInRlbXBDb21wb25lbnRPYmoiLCJjb21wb25lbnRUeXBlIiwicmVnaXN0ZXJDb21wb25lbnQiLCJzdHIiLCJ0ZW1wU3RyIiwicGFyc2VkWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicXVlcnlTZWxlY3RvciIsImRvY3VtZW50RWxlbWVudCIsImNoaWxkcmVuIiwidGFnTmFtZSIsImZpeGVkU3RyIiwicGFyZW50IiwiZm91bmRQYXJlbnQiLCJodG1sSGFuZGxlciIsImZpeEhUTUwiLCJuZXdET00iLCJyZXN1bHRzIiwiY2hpbGQiLCJhcHBlbmRDaGlsZCIsImhvdHNpdGVOYW1lIiwiaXNWYWxpZCIsInZhbGlkRm9yTmV3UGFja2FnZXMiLCJob3RzaXRlIiwicGFyYW1zIiwicHJldlZhbHVlIiwicHJvY2Vzc0hvdFNpdGUiLCJ0ZXN0ZXIiLCJjaGVja0hvdFNpdGVOYW1lIiwiSG90UGFnZSIsIm1hcE5hbWUiLCJ0ZXN0TWFwIiwibWFwIiwidGVzdE1hcHMiLCJIb3RUZXN0TWFwIiwiZGVzdGluYXRpb25zIiwiZGVzdCIsIkhvdFRlc3REZXN0aW5hdGlvbiIsImtleTIiLCJkZXN0aW5hdGlvbk9yZGVyIiwiYXBpcyIsImNvbXBvbmVudCIsImNvbXBvbmVudFVybCIsIkNvbXBvbmVudENsYXNzIiwiZGlzYWJsZUZpbGVMb2FkaW5nIiwiYWRkVGVzdGVyIiwibG9hZEhvdFNpdGUiLCJqc29uU3RyIiwiZXh0IiwicHBhdGgiLCJleHRuYW1lIiwibm9ybWFsaXplIiwiSG90SU8iLCJyZWFkVGV4dEZpbGUiLCJ5YW1sIiwiaG90c2l0ZVBhdGgiLCJzYXZlSG90U2l0ZSIsImhvdHNpdGVTdHIiLCJ3cml0ZVRleHRGaWxlIiwiZm9yY2VDb250ZW50TG9hZGluZyIsImxvYWRVcmxDb250ZW50IiwibmV3RmlsZSIsImxvYWRDb250ZW50IiwiZ2VuZXJhdGVDb250ZW50Iiwicm91dGVLZXkiLCJqc1NyY1BhdGgiLCJwYXNzQXJncyIsImFwaVNjcmlwdHMiLCJhcGlDb2RlIiwic2VydmVyIiwiZ2xvYmFsQXBpIiwic2VuZEpTQ29udGVudCIsImpzYXBpIiwibGlicmFyeU5hbWUiLCJhcGlOYW1lIiwidGVtcEFQSUNvbnRlbnQiLCJqc2FwaXBhdGgiLCJzZWNyZXQiLCJzZXJ2ZXJDb25uIiwicGFzc1NlY3JldEZyb21BUEkiLCJlbnYiLCJlbnZLZXkiLCJ0ZW1wQ29udGVudCIsImRldmVsb3Blck1vZGVTdHIiLCJ0ZXN0ZXJBUElTdHIiLCJ0ZXN0aW5nIiwid2ViIiwidGVzdGVyQVBJVXJsIiwibG9hZEZpbGVzIiwidGVzdGVyVXJsIiwidGVzdGVyTGF1bmNocGFkVXJsIiwibGF1bmNocGFkVXJsIiwic3RhcnREZWxheVN0ciIsImZpeENvbnRlbnQiLCJjcmVhdGVFeHByZXNzUm91dGVzIiwiZXhwcmVzc0FwcCIsInNlbmQiLCJnZXRXZWJUZXN0aW5nTWFwcyIsIm1hcHMiLCJnZXRBUElUZXN0aW5nTWFwcyIsImdldFJvdXRlS2V5RnJvbU5hbWUiLCJnZXRSb3V0ZUZyb21OYW1lIiwiZm91bmRSb3V0ZSIsImV4ZWN1dGVUZXN0cyIsImV4ZWN1dGUiLCJleGVjdXRlQWxsV2ViVGVzdHMiLCJleGVjdXRlQWxsQVBJVGVzdHMiLCJsb2NhbEZpbGVwYXRoIiwib3B0aW9ucyIsInJlYWR5RnVuYyIsInJlYWR5U3RhdGUiLCJhZGRFdmVudExpc3RlbmVyIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbm5lckhUTUwiLCJ0bXBTY3JpcHRzIiwic2NyaXB0cyIsInMiLCJjcmVhdGVFbGVtZW50IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVzb2x2ZTIiLCJyZWplY3QyIiwib25sb2FkIiwiaGFzU3JjIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiaXNSZWFkeUZvclRlc3RpbmciLCJ3YWl0Iiwib25SZWFkeUZvclRlc3RpbmciLCJ0ZXN0ZXJBUElCYXNlVXJsIiwiY2xpZW50IiwiSG90Q2xpZW50IiwiSG90VGVzdGVyQVBJIiwib25SZWFkeSIsInNldHVwVGVzdGVycyIsInByb2Nlc3NVcmwiLCJzZXR1cENsaWVudFRlc3RlcnMiLCJ1c2VPdXRwdXQiLCJob3RTdGFxV2ViU3RhcnQiLCJjdXN0b21FbGVtZW50cyIsInByb2Nlc3NvckNvbXBvbmVudHMiLCJkZWZpbmUiLCJIVE1MRWxlbWVudCIsInN1cGVyIiwiY29tcG9uZW50SW5mbyIsImhvdENvbXBvbmVudCIsImhhbmRsZUF0dHJpYnV0ZXMiLCJhdHRyIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJhdHRyVGVtcE5hbWUiLCJvblByZU91dHB1dCIsIm91dHB1dHMiLCJvblBvc3RPdXRwdXQiLCJjb21wb25lbnRPdXRwdXRzIiwiaUtkeCIsImh0bWxTdHIiLCJhZGRGdW5jdGlvbnNUbyIsIm9uUGFyc2VkIiwib25GaXhIVE1MIiwiY2hpbGRyZW5Ub1JlYWRkIiwibmV3T2JqIiwib25QYXJzZURPTSIsInRocm93RXJyIiwicmVwbGFjZVdpdGgiLCJjbGljayIsImV2ZW50Iiwib2JqZWN0RnVuY3Rpb25zIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsIm9iakZ1bmMiLCJpc05ld0Z1bmN0aW9uIiwiSG90Q29tcG9uZW50Iiwia2VlcENvbnRleHQiLCJvblByZVBsYWNlIiwiY29tcEh0bWxFbGVtZW50MiIsIm9uUGFyZW50UGxhY2UiLCJjbG9zZXN0U2VsZWN0b3IiLCJwYXJlbnRFbG0iLCJmb3VuZE5vZGUiLCJwYXJlbnRFbGVtZW50IiwiZG9jdW1lbnRTZWxlY3RvciIsInBsYWNlRWxtSW5QYXJlbnQiLCJwYXJlbnROb2RlVG9DaGVjayIsInBsYWNlSGVyZVBhcmVudCIsImNoaWxkVG9QbGFjZSIsInBhcmVudE5vZGVDaGVja0NvdW50ZXIiLCJIVE1MSHRtbEVsZW1lbnQiLCJwbGFjZUhlcmVBcnJheSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJwbGFjZUhlcmUiLCJwbGFjZUhlcmVBdHRyQXJyYXkiLCJwbGFjZWRDaGlsZCIsInBsYWNlSGVyZVBhcmVudEF0dHIiLCJvblBvc3RQbGFjZSIsInRlbXAiLCJjb21wb25lbnROYW1lIiwiaWQiLCJsb29zZVBhcnNlRnJvbVN0cmluZyIsInBhcnNlciIsInhkb20iLCJoZG9tIiwiZWxlbSIsImZyb20iLCJvdXRlckhUTUwiLCJob3RzdGFxRWxtcyIsIkhvdFN0YXFXZWIiLCJob3RzdGFxRWxtIiwiZ2V0QXR0ciIsImF0dHJOYW1lcyIsImxvYWRQYWdlIiwibG9nZ2luZ0xldmVsIiwicm91dGVyIiwiYXBpTGlicmFyeSIsImFwaVVybCIsInRlc3RlckFwaUJhc2VVcmwiLCJkb250UmV1c2VQcm9jZXNzb3IiLCJwYXNzUmF3VXJsIiwiaHRtbFNvdXJjZSIsInJvdXRlck1hbmFnZXIiLCJyb3V0ZXJXaWxkY2FyZHMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJwYXJzZUludCIsImhzdHFiYXNlcmVkaXJlY3QiLCJkZWNvZGVVUkkiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwiaG90c3RhcUVycm9ycyIsImhvdHN0YXFFcnJvckVsbSIsImVycm9yU3RhdHVzIiwidW5zdXBwb3J0ZWRCcm93c2VyIiwiZXhlY3V0ZUVycm9yIiwiaG90c3RhcVJvdXRlckVsbXMiLCJob3RzdGFxUm91dGVyRWxtIiwicm91dGVyTmFtZSIsInNlcnZlTG9jYWxseSIsImlKZHgiLCJjaGlsZE5vZGVzIiwicm91dGVyRWxtIiwicm91dGVyUGF0aCIsInJlZGlyZWN0IiwiYmFzZVJlZGlyZWN0IiwiYmFzZSIsInJvdXRlclNyYyIsInNyYyIsImNoZWNrUGF0aCIsInBhdGhuYW1lIiwiZ290b1BhdGgiLCJsb3dlclNlcnZlTG9jYWxseSIsImxhc3RTbGFzaFBvcyIsInJvdXRlV2lsZGNhcmQiLCJ0ZW1wUm91dGVXaWxkY2FyZCIsInNlYXJjaFBhcmFtcyIsIm1vZGlmaWVkU2VhcmNoUGFyYW1zIiwiZW5jb2RlVVJJIiwiaGFzSHRtbFNvdXJjZSIsImh0bWxTb3VyY2VDaGVjayIsInRlbXBNb2RlIiwicGFyZW50TGliIiwibmV3QVBJIiwiZGlzcGxheVVybCIsImRpc3BsYXlDb250ZW50IiwiZGVzdGluYXRpb24iLCJhdXRvU3RhcnQiLCJjb21tYW5kRGVsYXkiLCJwZXJzaXN0ZW50RGF0YSIsInBhcnNlVGVzdE9iamVjdCIsIndpbGRjYXJkIiwic2VsZWN0b3IiLCJwcmludCIsInN0ZG91dCIsInByaW50bG4iLCJkZXN0cm95IiwiYXNzZXJ0IiwiZXJyb3JNZXNzYWdlIiwibXVzdEJlVmlzaWJsZSIsImlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3IiLCJIb3RUZXN0ZXIiLCJkcml2ZXIiLCJ0aW1lb3V0IiwiZmluaXNoZWRMb2FkaW5nIiwiaGFzQmVlblNldHVwIiwiaGFzQmVlbkRlc3Ryb3llZCIsInNldHVwIiwiaXNXZWJSb3V0ZSIsImRlc3RpbmF0aW9uS2V5Iiwid2FpdEZvckRhdGEiLCJnZXRUZXN0UGFnZSIsImdldFRlc3RQYXRoIiwidGVzdERlc3QiLCJuZXdEZXN0aW5hdGlvbiIsInBhdGhzIiwic3RycyIsImdldFR5cGUiLCJ0eXBlU3RyIiwidHlwZURlbGltaXRlciIsInR5cGVWYWx1ZSIsInRyaW0iLCJuZXdQYXRoU3RyIiwibmV3UGF0aCIsImNtZCIsImV4ZWN1dGVUZXN0QVBJUGF0aCIsInRlc3ROYW1lIiwic2tpcEV2ZW50Q2FsbHMiLCJjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSIsInJ1blRlc3RQYXRoIiwib25UZXN0QVBJUGF0aFN0YXJ0IiwidGVzdENhc2VPYmplY3QiLCJvblRlc3RBUElQYXRoRW5kIiwiZXhlY3V0ZVRlc3RBUElQYXRocyIsImV4ZWN1dGVUZXN0UGFnZVBhdGgiLCJzdG9wIiwidGVzdFBhdGhOYW1lIiwidGVzdFBhdGgiLCJvblRlc3RQYWdlUGF0aFN0YXJ0Iiwib25UZXN0UGFnZVBhdGhFbmQiLCJleGVjdXRlQ29tbWFuZCIsImhhc0NtZCIsImlucHV0IiwiaGFzQXJndW1lbnRzIiwiZ2V0Q21kQXJncyIsIm1hdGNoZXMiLCJtYXRjaCIsInRlbXBNYXRjaCIsInNlbGVuaXVtVGVzdGVyIiwiY21kRnVuYyIsImNtZEFyZ3MiLCJuYXZpZ2F0ZVRvVXJsIiwidGVzdE9iamVjdCIsIndhaXRGb3JUZXN0RWxlbWVudCIsIm9uQ29tbWFuZCIsImV4ZWN1dGVUZXN0UGFnZVBhdGhzIiwiaW50ZXJwcmV0RGVzdGluYXRpb24iLCJleGVjdXRlRGVzdGluYXRpb24iLCJydW5UZXN0UGF0aHMiLCJvblRlc3RTdGFydCIsIm9uVGVzdEVuZCIsImhhc0V4ZWN1dGVkS2V5cyIsIm9yZGVyS2V5IiwiZXhlY3V0ZURlc3QiLCJIb3RBUEkiLCJwYWdlTG9hZGVkIiwiaGVhcnRiZWF0IiwicmVxdWVzdCIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsIm9uRmluaXNoZWRMb2FkaW5nIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImdsb2JhbFRoaXMiLCJIb3RNb2R1bGUiLCJTZXJ2ZXJSZXF1ZXN0IiwiSG90VGVzdERyaXZlciIsIkhvdFRlc3RFbGVtZW50T3B0aW9ucyJdLCJzb3VyY2VSb290IjoiIn0=