@serenityjs/plugins 0.8.18 → 0.8.19-beta-20260306215523

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.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var $=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var p=(a,e)=>$(a,"name",{value:e,configurable:!0});var J=(a,e)=>{for(var t in e)$(a,t,{get:e[t],enumerable:!0})},W=(a,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of q(e))!C.call(a,o)&&o!==t&&$(a,o,{get:()=>e[o],enumerable:!(s=M(e,o))||s.enumerable});return a};var K=a=>W($({},"__esModule",{value:!0}),a);var X={};J(X,{DefaultPipelineProperties:()=>N,Pipeline:()=>G,Plugin:()=>Q,PluginFileSystem:()=>k,PluginHeader:()=>w,PluginPriority:()=>I,PluginType:()=>S});module.exports=K(X);var u=require("fs"),n=require("path"),P=require("zlib"),F=require("@serenityjs/logger"),v=require("@serenityjs/core"),B=require("@serenityjs/binarystream");var j=require("path");var R=require("@serenityjs/core");var x=class extends R.CustomEnum{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]},O=class extends R.CustomEnum{static{p(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var Z=p((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.overload({action:O},({action:s})=>{if(s.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let o=[...e.plugins.values()],r=[];for(let i of o)r.push(`\xA7u${i.identifier} v${i.version}\xA7r`);return{message:`\xA77Active Plugins (${o.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),t.overload({action:O,plugin:x},({action:s,plugin:o})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=e.plugins.get(o.result);if(!r)throw new Error(`Plugin ${o.result} is not found.`);if(s.result==="reload")return e.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`};if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${(0,j.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),A=Z;var w=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(w||{});var I=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(I||{});var S=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(S||{});var c=require("fs"),g=require("path");var k=class{static{p(this,"PluginFileSystem")}dataPath;logger;constructor(e,t){this.dataPath=e,this.logger=t}validatePath(e,t){if(!(0,g.isAbsolute)(e))return this.logger.warn(`Attempted to access invalid path: ${e}. Path must be absolute.`),!1;if(!e.startsWith(this.dataPath+g.sep))return this.logger.warn(`Invalid path: ${e}. Path must be within the plugin's data directory.`),!1;let o=/.*\..+/.test(e);return t==="file"&&!o||t==="directory"&&o?(this.logger.warn(`Invalid path: ${e}. Path is not a valid ${t}.`),!1):!0}readFile(e,t){if(!(0,c.existsSync)(this.dataPath))return null;let s=(0,g.resolve)(this.dataPath,e);return!this.validatePath(s,"file")||!(0,c.existsSync)(s)?null:(0,c.readFileSync)(s,t)}writeFile(e,t){(0,c.existsSync)(this.dataPath)||(0,c.mkdirSync)(this.dataPath,{recursive:!0});let s=(0,g.resolve)(this.dataPath,e);if(!this.validatePath(s,"file"))return;let r=s.substring(0,s.lastIndexOf(g.sep));return(0,c.existsSync)(r)||(0,c.mkdirSync)(r,{recursive:!0}),(0,c.writeFileSync)(s,t)}removeFile(e){if(!(0,c.existsSync)(this.dataPath))return;let t=(0,g.resolve)(this.dataPath,e);if(this.validatePath(t,"file")&&(0,c.existsSync)(t))return(0,c.rmSync)(t)}mkdir(e){(0,c.existsSync)(this.dataPath)||(0,c.mkdirSync)(this.dataPath,{recursive:!0});let t=(0,g.resolve)(this.dataPath,e);if(this.validatePath(t))return(0,c.mkdirSync)(t,{recursive:!0})}rmdir(e,t={recursive:!1,force:!1}){if(!(0,c.existsSync)(this.dataPath))return;let s=(0,g.resolve)(this.dataPath,e);if(this.validatePath(s,"directory")&&(0,c.existsSync)(s))return(0,c.rmSync)(s,t)}readDir(e){if(!(0,c.existsSync)(this.dataPath))return null;let t=(0,g.resolve)(this.dataPath,e);return!this.validatePath(t,"directory")||!(0,c.existsSync)(t)?null:(0,c.readdirSync)(t)}exists(e){if(!(0,c.existsSync)(this.dataPath))return!1;let t=(0,g.resolve)(this.dataPath,e);return this.validatePath(t)?(0,c.existsSync)(t):!1}};var N={path:"./plugins",commands:!0,initialize:!0},G=class{static{p(this,"Pipeline")}serenity;properties;logger=new F.Logger("Plugins",F.LoggerColors.MaterialLapis);plugins=new Map;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...N,...t},e.on(v.ServerEvent.Start,this.start.bind(this)),e.on(v.ServerEvent.Stop,this.stop.bind(this)),e.on(v.WorldEvent.WorldInitialize,({world:s})=>{this.properties.commands&&A(s,this);for(let[,o]of this.plugins)s.blockPalette.registerType(...o.blocks.types).registerTrait(...o.blocks.traits),s.itemPalette.registerType(...o.items.types).registerTrait(...o.items.traits),s.entityPalette.registerType(...o.entities.types).registerTrait(...o.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){(0,u.existsSync)((0,n.resolve)(this.path))||(0,u.mkdirSync)((0,n.resolve)(this.path),{recursive:!0}),(0,u.existsSync)((0,n.resolve)(this.path,"data"))||(0,u.mkdirSync)((0,n.resolve)(this.path,"data"),{recursive:!0}),(0,u.existsSync)((0,n.resolve)(this.path,"configs"))||(0,u.mkdirSync)((0,n.resolve)(this.path,"configs"),{recursive:!0});let t=(0,u.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory()?r.name!=="data"&&r.name!=="configs":!0).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),s=[];for(let r of t)try{let i=(0,n.resolve)(this.path,r.name),h=(0,P.inflateSync)((0,u.readFileSync)(i)),l=new B.BinaryStream(h);switch(l.readByte()){case w.HasNoResources:{let d=l.readVarInt(),m=l.readBuffer(d).toString("utf-8"),f=this.loadFromTextSource(i,m,!0);f&&s.push(f);break}case w.HasResources:{let d=l.readVarInt(),m=l.readBuffer(d).toString("utf-8"),f=this.loadFromTextSource(i,m,!0);if(!f)break;s.push(f);let y=l.readVarInt();for(let z=0;z<y;z++)try{let V=l.readVarInt(),U=l.readBuffer(V),E=this.serenity.resources.loadFromZip(U);f.logger.success(`Loaded resource pack \xA7u${E.name}\xA7r (\xA78${E.uuid}\xA7r).`),f.resources.add(E)}catch(V){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r for plugin \xA71${f.identifier}\xA7r.`,V)}break}case S.Addon:{this.logger.warn(`The plugin \xA71${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let d=l.readRemainingBuffer().toString("utf-8"),m=this.loadFromTextSource(i,d,!0);m&&s.push(m);break}case S.Api:this.logger.error(`The plugin \xA71${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,i)}let o=(0,u.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of o)try{let i=(0,n.resolve)(this.path,r.name);if(!(0,u.existsSync)((0,n.resolve)(i,"package.json")))continue;let h=JSON.parse((0,u.readFileSync)((0,n.resolve)(i,"package.json"),"utf-8")),l=(0,n.resolve)(i,h.main);if(!(0,u.existsSync)((0,n.resolve)(i,l))){this.logger.warn(`Unable to load plugin \xA7u${h.name??"unknown-plugin"}\xA78@\xA7u${h.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(i,l))}\xA7r" was not found in the directory.`);continue}let b=require((0,n.resolve)(i,l)),d=b.default;if(this.plugins.has(d.identifier)){this.logger.warn(`Unable to load plugin \xA7u${d.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}d.pipeline=this,d.serenity=this.serenity,d.path=i,d.isBundled=!1,d.fileSystem=new k((0,n.resolve)(d.path,"../data",d.identifier),d.logger),this.linkModule(d.identifier,b),this.plugins.set(d.identifier,d),x.options.push(d.identifier),s.push(d),(0,u.existsSync)((0,n.resolve)(i,"resource_packs"))||(0,u.mkdirSync)((0,n.resolve)(i,"resource_packs"));let m=(0,u.readdirSync)((0,n.resolve)(i,"resource_packs"),{withFileTypes:!0}).filter(f=>f.isDirectory());for(let f of m)try{let y=this.serenity.resources.loadFromPath((0,n.resolve)(i,"resource_packs",f.name));d.logger.success(`Loaded resource pack \xA7u${y.name}\xA7r (\xA78${y.uuid}\xA7r).`),d.resources.add(y)}catch(y){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(i,"resource_packs",f.name))}\xA7r for plugin \xA71${d.identifier}\xA7r.`,y)}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,i)}s.sort((r,i)=>r.priority!==i.priority?i.priority-r.priority:r.identifier<i.identifier?-1:r.identifier>i.identifier?1:0);for(let r of s)try{if(Object.keys(r.config).length>0){let i=(0,n.resolve)(this.path,"configs",`${r.identifier}.json`);if(!(0,u.existsSync)(i))(0,u.writeFileSync)(i,JSON.stringify(r.config,null,2));else{let h=JSON.parse((0,u.readFileSync)(i,"utf-8"));Object.assign(r.config,h)}}if(r.onInitialize(r),this.bindEvents(r),r.isBundled){let i=(0,n.resolve)(r.path.slice(0,-7).replace(/\./g,"_"));(0,u.existsSync)(i)&&process.nextTick(()=>(0,u.unlinkSync)(i))}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(r.path))}", skipping the plugin.`,i)}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e)}loadFromTextSource(e,t,s=!1){let o=(0,n.resolve)(e.slice(0,-7).replace(/\./g,"_"));(0,u.writeFileSync)((0,n.resolve)(o),t);try{let r=require((0,n.resolve)(o)),i=r.default;return this.plugins.has(i.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${i.identifier}\xA7r, the plugin is already loaded in the pipeline.`),(0,u.unlinkSync)((0,n.resolve)(o)),null):(i.pipeline=this,i.serenity=this.serenity,i.path=(0,n.resolve)(e),i.isBundled=s,i.fileSystem=new k((0,n.resolve)(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),x.options.push(i.identifier),i)}catch(r){this.logger.error(`Failed to load plugin from \xA78${(0,n.relative)(process.cwd(),e)}\xA7r, skipping the plugin.`,r),(0,u.unlinkSync)((0,n.resolve)(o))}return null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete require.cache[require.resolve(t)],this.serenity.removePath(t);for(let s of e.resources)this.serenity.resources.packs.delete(s.uuid);if(e.isBundled){let s=(0,P.inflateSync)((0,u.readFileSync)(t)),o=new B.BinaryStream(s);switch(o.readByte()){case w.HasNoResources:{let i=o.readVarInt(),h=o.readBuffer(i).toString("utf-8"),l=this.loadFromTextSource(t,h,!0);if(!l)break;l.onInitialize(l),this.bindEvents(l),l.onStartUp(l);break}case w.HasResources:{let i=o.readVarInt(),h=o.readBuffer(i).toString("utf-8"),l=this.loadFromTextSource(t,h,!0);if(!l)break;l.onInitialize(l),this.bindEvents(l),l.onStartUp(l);let b=o.readVarInt();for(let d=0;d<b;d++)try{let m=o.readVarInt(),f=o.readBuffer(m),y=this.serenity.resources.loadFromZip(f);l.logger.success(`Loaded resource pack \xA7u${y.name}\xA7r (\xA78${y.uuid}\xA7r).`),l.resources.add(y)}catch(m){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,t))}\xA7r for plugin \xA71${l.identifier}\xA7r.`,m)}}}}else{let s=JSON.parse((0,u.readFileSync)((0,n.resolve)(t,"package.json"),"utf-8")),o=(0,n.resolve)(t,s.main);if(!(0,u.existsSync)((0,n.resolve)(t,o))){this.logger.warn(`Unable to reload plugin \xA7u${s.name??"unknown-plugin"}\xA78@\xA7u${s.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(t,o))}\xA7r" was not found in the directory.`);return}let r=require((0,n.resolve)(t,o)),i=r.default;i.pipeline=this,i.serenity=this.serenity,i.path=t,i.isBundled=!1,i.fileSystem=new k((0,n.resolve)(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),x.options.push(i.identifier),i.onInitialize(i),this.bindEvents(i)}}bundle(e){let t=new B.BinaryStream,s=e.resources.size>0?w.HasResources:w.HasNoResources;switch(t.writeByte(s),s){case w.HasNoResources:{let o=(0,n.resolve)(e.path,"dist","index.js"),r=(0,u.readFileSync)(o);t.writeVarInt(r.byteLength),t.writeBuffer(r),(0,u.writeFileSync)((0,n.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,P.deflateSync)(t.getBuffer()));break}case w.HasResources:{let o=(0,n.resolve)(e.path,"dist","index.js"),r=(0,u.readFileSync)(o);t.writeVarInt(r.byteLength),t.writeBuffer(r),t.writeVarInt(e.resources.size);for(let i of e.resources){let h=i.compress();t.writeVarInt(h.byteLength),t.writeBuffer(h)}(0,u.writeFileSync)((0,n.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,P.deflateSync)(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),s=Object.getOwnPropertyNames(t),o=Object.keys(v.WorldEvent);o=o.slice(o.length/2);for(let r of o){let i=o.indexOf(r);if(s.includes("on"+r)){let h=e["on"+r];typeof h=="function"&&this.serenity.on(i,h.bind(e))}if(s.includes("before"+r)){let h=e["before"+r];typeof h=="function"&&this.serenity.before(i,h.bind(e))}if(s.includes("after"+r)){let h=e["after"+r];typeof h=="function"&&this.serenity.after(i,h.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(o){o.module(e,()=>({exports:t,loader:"object"}))}})}};var T=require("@serenityjs/logger"),D=require("@serenityjs/emitter");var L=class{static{p(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var H=class{static{p(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var _=class{static{p(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var Q=class extends D.Emitter{static{p(this,"Plugin")}identifier;version;logger;priority=I.Normal;blocks=new L;items=new H;entities=new _;resources=new Set;config={};fileSystem;path;isBundled;pipeline;serenity;constructor(e,t,s){super(s?.maxListeners),this.identifier=e,this.version=t,this.logger=s?.logger??new T.Logger(`${e}@${t}`,T.LoggerColors.Blue),s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}defineConfig(e){return Object.assign(this.config,e),this.config}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginFileSystem,PluginHeader,PluginPriority,PluginType});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bS50cyIsICIuLi9zcmMvZW51bXMvaGVhZGVyLnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvZW51bXMvdHlwZS50cyIsICIuLi9zcmMvZmlsZS1zeXN0ZW0udHMiLCAiLi4vc3JjL3BsdWdpbi50cyIsICIuLi9zcmMvcmVnaXN0cnkvYmxvY2sudHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2l0ZW0udHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2VudGl0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsdWdpblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW51bXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maWxlLXN5c3RlbVwiO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUsIFBsdWdpbkhlYWRlciB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBQbHVnaW5GaWxlU3lzdGVtIH0gZnJvbSBcIi4vZmlsZS1zeXN0ZW1cIjtcblxuaW50ZXJmYWNlIFBpcGVsaW5lUHJvcGVydGllcyB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29tbWFuZHM6IGJvb2xlYW47XG4gIGluaXRpYWxpemU6IGJvb2xlYW47XG59XG5cbmNvbnN0IERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcyA9IHtcbiAgcGF0aDogXCIuL3BsdWdpbnNcIixcbiAgY29tbWFuZHM6IHRydWUsXG4gIGluaXRpYWxpemU6IHRydWVcbn07XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlBsdWdpbnNcIiwgTG9nZ2VyQ29sb3JzLk1hdGVyaWFsTGFwaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2lucyBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnMgPSBuZXcgTWFwPHN0cmluZywgUGx1Z2luPigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwaXBlbGluZSBpcyBydW5uaW5nIGluIEVTTSBtb2RlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVzbTogYm9vbGVhbiA9XG4gICAgdHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGU/LmV4cG9ydHMgIT09IGV4cG9ydHM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMucGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgc2V0IHBhdGgoXykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXRoIHByb3BlcnR5IGlzIHJlYWQtb25seS5cIik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwZWxpbmUgY2xhc3MuXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNlcmVuaXR5OiBTZXJlbml0eSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQaXBlbGluZVByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgLy8gTWVyZ2UgdGhlIHByb3BlcnRpZXMgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHNlcmVuaXR5IHNlcnZlciBldmVudHNcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdGFydCwgdGhpcy5zdGFydC5iaW5kKHRoaXMpKTtcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdG9wLCB0aGlzLnN0b3AuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT4ge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGZvciB0aGUgcGx1Z2luc1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5jb21tYW5kcykgQ29tbWFuZCh3b3JsZCwgdGhpcyk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCByZWdpc3RlciB0aGUgYmxvY2tzLCBpdGVtcywgYW5kIGVudGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IFssIHBsdWdpbl0gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9ja3MgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5ibG9ja1BhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5ibG9ja3MudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmJsb2Nrcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpdGVtcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLml0ZW1QYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uaXRlbXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLml0ZW1zLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0aWVzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuZW50aXR5UGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmVudGl0aWVzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5lbnRpdGllcy50cmFpdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgc2hvdWxkIGJlIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMucHJvcGVydGllcy5pbml0aWFsaXplKSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBhIHBsdWdpbnMgZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcImRhdGFcIikpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGF0YSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJkYXRhXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENoZWNrIGlmIGEgcGx1Z2lucyBjb25maWdzIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwiY29uZmlnc1wiKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBjb25maWdzIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcImNvbmZpZ3NcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgLy8gQW5kIGZpbHRlciBvdXQgdGhlIGRhdGEgYW5kIGNvbmZpZ3MgZGlyZWN0b3JpZXNcbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNEaXJlY3RvcnkoKVxuICAgICAgICA/IGRpcmVudC5uYW1lICE9PSBcImRhdGFcIiAmJiBkaXJlbnQubmFtZSAhPT0gXCJjb25maWdzXCJcbiAgICAgICAgOiB0cnVlXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIGEgZmlsZSwgYW5kIGlmIGl0IGhhcyBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBBcnJheSB0byBob2xkIHRoZSBvcmRlcmVkIHBsdWdpbnNcbiAgICBjb25zdCBvcmRlcmVkUGx1Z2luczogQXJyYXk8UGx1Z2luPiA9IFtdO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKSBhcyBQbHVnaW5UeXBlIHwgUGx1Z2luSGVhZGVyO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBpZiAocGx1Z2luKSBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIGlmICghcGx1Z2luKSBicmVhaztcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb3VyY2VzOyBpKyspIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWFkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgICAgcGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICAgIHBsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BZGRvbjoge1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBoYW5kbGUgYWRkb24gcGx1Z2lucywgYnV0IG1lbnRpb24gdGhhdCB0aGV5IGFyZSBkZXByZWNhdGVkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVGhlIHBsdWdpbiDCpzEke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBpcyB1c2luZyBhIGRlcHJlY2F0ZWQgcGx1Z2luIHR5cGUgKEFkZG9uKS4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BcGk6IHtcbiAgICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciBzdXBwb3J0IEFQSSBwbHVnaW5zXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBUEkpLiBBUEkgcGx1Z2lucyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLmZpbGVTeXN0ZW0gPSBuZXcgUGx1Z2luRmlsZVN5c3RlbShcbiAgICAgICAgICByZXNvbHZlKHBsdWdpbi5wYXRoLCBcIi4uL2RhdGFcIiwgcGx1Z2luLmlkZW50aWZpZXIpLFxuICAgICAgICAgIHBsdWdpbi5sb2dnZXJcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgXCJyZXNvdXJjZV9wYWNrc1wiIGRpcmVjdG9yeSBleGlzdHMgaW4gdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVzb3VyY2VfcGFja3MgZGlyZWN0b3J5XG4gICAgICAgICAgbWtkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2VfcGFjayBkaXJlY3RvcnksIG9ubHkgaW5jbHVkaW5nIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSwge1xuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICAgICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZSBwYWNrIGRpcmVjdG9yaWVzLCBhbmQgYXR0ZW1wdCB0byBsb2FkIHRoZW1cbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjaywgYW5kIGFkZCBpdCB0byB0aGUgc2VyZW5pdHkgcmVzb3VyY2VzXG4gICAgICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21QYXRoKFxuICAgICAgICAgICAgICByZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiwgcmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICBwbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3BhY2submFtZX3Cp3IgKMKnOCR7cGFjay51dWlkfcKncikuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgcGx1Z2luLnJlc291cmNlcy5hZGQocGFjayk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiLCByZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBmb3IgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLmAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBwbHVnaW5zIGJ5IHRoZWlyIHByaW9yaXR5XG4gICAgb3JkZXJlZFBsdWdpbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSBmaXJzdFxuICAgICAgaWYgKGEucHJpb3JpdHkgIT09IGIucHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5OyAvLyBIaWdoZXIgcHJpb3JpdHkgY29tZXMgZmlyc3RcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJpb3JpdHkgaXMgdGhlIHNhbWUsIHNvcnQgYnkgaWRlbnRpZmllciBhbHBoYWJldGljYWxseVxuICAgICAgaWYgKGEuaWRlbnRpZmllciA8IGIuaWRlbnRpZmllcikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuaWRlbnRpZmllciA+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgY29uZmlnIGRlZmluZWRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBsdWdpbi5jb25maWcgYXMgb2JqZWN0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4gY29uZmlnIGZpbGVcbiAgICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShcbiAgICAgICAgICAgIHRoaXMucGF0aCxcbiAgICAgICAgICAgIFwiY29uZmlnc1wiLFxuICAgICAgICAgICAgYCR7cGx1Z2luLmlkZW50aWZpZXJ9Lmpzb25gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgY29uZmlnIGZpbGUgZXhpc3RzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgZGVmYXVsdCBjb25maWcgdG8gdGhlIGNvbmZpZyBmaWxlXG4gICAgICAgICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIEpTT04uc3RyaW5naWZ5KHBsdWdpbi5jb25maWcsIG51bGwsIDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgY29uZmlnIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCBcInV0Zi04XCIpKTtcblxuICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBjb25maWcgZGF0YSB0byB0aGUgcGx1Z2luIGNvbmZpZ1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwbHVnaW4uY29uZmlnIGFzIG9iamVjdCwgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKHBsdWdpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBidW5kbGVkXG4gICAgICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb25zdCB0ZW1wID0gcmVzb2x2ZShwbHVnaW4ucGF0aC5zbGljZSgwLCAtNykucmVwbGFjZSgvXFwuL2csIFwiX1wiKSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmIChleGlzdHNTeW5jKHRlbXApKSBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHVubGlua1N5bmModGVtcCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKFxuICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIHJlc29sdmUocGx1Z2luLnBhdGgpXG4gICAgICAgICAgKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBwbHVnaW4gZnJvbSBhIHRleHQgc291cmNlLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gaXNCdW5kbGVkIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBidW5kbGVkIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBsb2FkRnJvbVRleHRTb3VyY2UoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGlzQnVuZGxlZCA9IGZhbHNlXG4gICk6IFBsdWdpbiB8IG51bGwge1xuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgY29uc3QgdGVtcCA9IHJlc29sdmUocGF0aC5zbGljZSgwLCAtNykucmVwbGFjZSgvXFwuL2csIFwiX1wiKSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgc291cmNlIHRvIHRoZSB0ZW1wb3JhcnkgcGF0aFxuICAgIHdyaXRlRmlsZVN5bmMocmVzb2x2ZSh0ZW1wKSwgc291cmNlKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUodGVtcCkpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgIC8vIExvZyB0aGUgd2FybmluZyB0aGF0IHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICB1bmxpbmtTeW5jKHJlc29sdmUodGVtcCkpO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHBsdWdpbi5wYXRoID0gcmVzb2x2ZShwYXRoKTtcbiAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBpc0J1bmRsZWQ7XG5cbiAgICAgIC8vIFNldCB0aGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBwbHVnaW5cbiAgICAgIHBsdWdpbi5maWxlU3lzdGVtID0gbmV3IFBsdWdpbkZpbGVTeXN0ZW0oXG4gICAgICAgIHJlc29sdmUocGx1Z2luLnBhdGgsIFwiLi4vZGF0YVwiLCBwbHVnaW4uaWRlbnRpZmllciksXG4gICAgICAgIHBsdWdpbi5sb2dnZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUodGVtcCkpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIHRoZSBwbHVnaW4gZmFpbGVkIHRvIGxvYWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgcGx1Z2luLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgICAgdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMucGFja3MuZGVsZXRlKHJlc291cmNlLnV1aWQpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW0gZnJvbSB0aGUgYnVmZmVyXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICBjb25zdCBuZXdQbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgaWYgKCFuZXdQbHVnaW4pIGJyZWFrO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgICAgIG5ld1BsdWdpbi5vblN0YXJ0VXAobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICBjb25zdCBuZXdQbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgaWYgKCFuZXdQbHVnaW4pIGJyZWFrO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgICAgIG5ld1BsdWdpbi5vblN0YXJ0VXAobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgYnVmZmVyXG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICBuZXdQbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHBsdWdpbiByZXNvdXJjZXMgc2V0XG4gICAgICAgICAgICAgIG5ld1BsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIHBhdGgpXG4gICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke25ld1BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBpbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgbmV3UGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIG5ld1BsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICBuZXdQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgbmV3UGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgbmV3UGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXQgdGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luXG4gICAgICBuZXdQbHVnaW4uZmlsZVN5c3RlbSA9IG5ldyBQbHVnaW5GaWxlU3lzdGVtKFxuICAgICAgICByZXNvbHZlKG5ld1BsdWdpbi5wYXRoLCBcIi4uL2RhdGFcIiwgbmV3UGx1Z2luLmlkZW50aWZpZXIpLFxuICAgICAgICBuZXdQbHVnaW4ubG9nZ2VyXG4gICAgICApO1xuXG4gICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICB0aGlzLmxpbmtNb2R1bGUobmV3UGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChuZXdQbHVnaW4uaWRlbnRpZmllciwgbmV3UGx1Z2luKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKG5ld1BsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGx1Z2luIGhlYWRlciBiYXNlZCBvbiB0aGUgcmVzb3VyY2VzXG4gICAgY29uc3QgaGVhZGVyID1cbiAgICAgIHBsdWdpbi5yZXNvdXJjZXMuc2l6ZSA+IDBcbiAgICAgICAgPyBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzXG4gICAgICAgIDogUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKGhlYWRlcik7XG5cbiAgICAvLyBTd2l0Y2ggYmFzZWQgb24gdGhlIHBsdWdpbiBoZWFkZXJcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGNvbXBpbGVkIGluZGV4IGZpbGVcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiLCBcImluZGV4LmpzXCIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoaW5kZXguYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHBsdWdpbi5yZXNvdXJjZXMuc2l6ZSk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzLCBhbmQgd3JpdGUgdGhlbSB0byB0aGUgc3RyZWFtXG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcGx1Z2luLnJlc291cmNlcykge1xuICAgICAgICAgIC8vIENvbXByZXNzIHRoZSByZXNvdXJjZSBwYWNrIGludG8gYSBidWZmZXJcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByZXNvdXJjZS5jb21wcmVzcygpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGJ1ZmZlci5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS12JHtwbHVnaW4udmVyc2lvbn0ucGx1Z2luYCksXG4gICAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYmluZEV2ZW50cyhwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcHJvdG90eXBlIG9mIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGx1Z2luKTtcblxuICAgIC8vIEdldCB0aGUgb2JqZWN0IGtleXMgZnJvbSB0aGUgcGx1Z2luXG4gICAgY29uc3QgcGx1Z2luS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSk7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIGV2ZW50IGtleXMsIGFuZCBzbGljZSB0aGVtIGluIGhhbGZcbiAgICBsZXQgZXZlbnRLZXlzID0gT2JqZWN0LmtleXMoV29ybGRFdmVudCk7XG4gICAgZXZlbnRLZXlzID0gZXZlbnRLZXlzLnNsaWNlKGV2ZW50S2V5cy5sZW5ndGggLyAyKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGV2ZW50IGtleXNcbiAgICBmb3IgKGNvbnN0IGV2ZW50S2V5IG9mIGV2ZW50S2V5cykge1xuICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZXZlbnQga2V5XG4gICAgICBjb25zdCBpbmRleCA9IGV2ZW50S2V5cy5pbmRleE9mKGV2ZW50S2V5KSBhcyBXb3JsZEV2ZW50O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJvblwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwib25cIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwib25cIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5vbihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJiZWZvcmVcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImJlZm9yZVwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5iZWZvcmUoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiBib29sZWFuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYWZ0ZXJcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImFmdGVyXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImFmdGVyXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYWZ0ZXIoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluayBhIG1vZHVsZSB0byB0aGUgcGlwZWxpbmUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbGluay5cbiAgICogQHBhcmFtIG1vZHVsZSBUaGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqL1xuICBwdWJsaWMgbGlua01vZHVsZShuYW1lOiBzdHJpbmcsIG1vZHVsZTogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcnVudGltZSBvZiB0aGUgc2VydmVyXG4gICAgY29uc3QgaXNCdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1biA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgLy8gTW9kdWxlIGxpbmtpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gQnVuXG4gICAgaWYgKCFpc0J1bikgcmV0dXJuO1xuXG4gICAgLy8gSW5qZWN0IHRoZSBtb2R1bGUgaW50byB0aGUgQnVuIHBsdWdpbiBzeXN0ZW1cbiAgICBCdW4ucGx1Z2luKHtcbiAgICAgIG5hbWU6IGBzZXJlbml0eWpzLnBsdWdpbi4ke25hbWV9YCxcbiAgICAgIHNldHVwKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5tb2R1bGUobmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleHBvcnRzOiBtb2R1bGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICBsb2FkZXI6IFwib2JqZWN0XCJcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRQYWxldHRlLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9ucyA9IFtcInNlcmVuaXR5Lm9wZXJhdG9yXCJdO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiIsICJlbnVtIFBsdWdpbkhlYWRlciB7XG4gIEhhc05vUmVzb3VyY2VzID0gMixcbiAgSGFzUmVzb3VyY2VzID0gM1xufVxuXG5leHBvcnQgeyBQbHVnaW5IZWFkZXIgfTtcbiIsICIvKipcbiAqIFRoZSBwcmlvcml0eSBvZiBhIHBsdWdpbiBkZXRlcm1pbmVzIHdoZW4gaXQgd2lsbCBiZSBsb2FkZWQgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGx1Z2lucy5cbiAqIEEgcGx1Z2luIHdpdGggYSBoaWdoZXIgcHJpb3JpdHkgd2lsbCBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHdpdGggYSBsb3dlciBwcmlvcml0eS5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIG9yIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaWJyYXJ5IHBsdWdpbiBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYmVmb3JlIGEgcGx1Z2luIHRoYXQgdXNlcyBpdCxcbiAqIG9yIGEgcGx1Z2luIHRoYXQgbW9kaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHNlcmVuaXR5J3MgQVBJcyBtYXkgbmVlZCB0byBiZSBsb2FkZWQgYWZ0ZXIgaXQuXG4gKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyBOb3JtYWwuXG4gKi9cbmVudW0gUGx1Z2luUHJpb3JpdHkge1xuICAvKipcbiAgICogQSBsb3cgcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGFmdGVyIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgcmVhY3RpbmcgdG8gY2hhbmdlcyBvciBmaW5hbCBhZGp1c3RtZW50cy5cbiAgICovXG4gIExvdyxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGEgcGx1Z2luLlxuICAgKiBTdWl0YWJsZSBmb3Igc3RhbmRhcmQgcGx1Z2luIGJlaGF2aW9yLlxuICAgKi9cbiAgTm9ybWFsLFxuXG4gIC8qKlxuICAgKiBBIGhpZ2ggcHJpb3JpdHkgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIGVhcmx5IHNldHVwIG9yIG92ZXJyaWRpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBIaWdoXG59XG5cbmV4cG9ydCB7IFBsdWdpblByaW9yaXR5IH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBta2RpclN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgcmVhZGRpclN5bmNcbn0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyByZXNvbHZlLCBzZXAsIGlzQWJzb2x1dGUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmNsYXNzIFBsdWdpbkZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW5GaWxlU3lzdGVtIGNsYXNzLlxuICAgKiBAcGFyYW0gZGF0YVBhdGggVGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGFQYXRoOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgdGhpcy5kYXRhUGF0aCA9IGRhdGFQYXRoO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHBhdGggaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXRoKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBleHBlY3RlZFR5cGU/OiBcImZpbGVcIiB8IFwiZGlyZWN0b3J5XCJcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGlzIGFic29sdXRlXG4gICAgaWYgKCFpc0Fic29sdXRlKHBhdGgpKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgQXR0ZW1wdGVkIHRvIGFjY2VzcyBpbnZhbGlkIHBhdGg6ICR7cGF0aH0uIFBhdGggbXVzdCBiZSBhYnNvbHV0ZS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgodGhpcy5kYXRhUGF0aCArIHNlcCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBJbnZhbGlkIHBhdGg6ICR7cGF0aH0uIFBhdGggbXVzdCBiZSB3aXRoaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBwYXRoIGlzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZSBvciBkaXJlY3RvcnlcbiAgICBjb25zdCBmaWxlUmVnZXggPSAvLipcXC4uKy87IC8vIE1hdGNoZXMgcGF0aHMgd2l0aCBhIGRvdCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzXG4gICAgY29uc3QgaGFzRXh0ZW5zaW9uID0gZmlsZVJlZ2V4LnRlc3QocGF0aCk7XG4gICAgaWYgKFxuICAgICAgKGV4cGVjdGVkVHlwZSA9PT0gXCJmaWxlXCIgJiYgIWhhc0V4dGVuc2lvbikgfHxcbiAgICAgIChleHBlY3RlZFR5cGUgPT09IFwiZGlyZWN0b3J5XCIgJiYgaGFzRXh0ZW5zaW9uKVxuICAgICkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEludmFsaWQgcGF0aDogJHtwYXRofS4gUGF0aCBpcyBub3QgYSB2YWxpZCAke2V4cGVjdGVkVHlwZX0uYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIGZpbGUgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlYWQuXG4gICAqIEBwYXJhbSBlbmNvZGluZyBPcHRpb25hbCBlbmNvZGluZy4gSWYgcHJvdmlkZWQsIHJldHVybnMgYSBzdHJpbmc7IG90aGVyd2lzZSwgcmV0dXJucyBhIEJ1ZmZlci5cbiAgICogQHJldHVybnMgVGhlIGZpbGUgZGF0YSBpZiBpdCBleGlzdHMgYW5kIGlzIHZhbGlkLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyByZWFkRmlsZShwYXRoOiBzdHJpbmcpOiBCdWZmZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZEZpbGUocGF0aDogc3RyaW5nLCBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcpOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgcmVhZEZpbGUoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGVuY29kaW5nPzogQnVmZmVyRW5jb2RpbmdcbiAgKTogQnVmZmVyIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gRW5zdXJlIHRoZSBwbHVnaW4gZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImZpbGVcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmVhZCBhbmQgcmV0dXJuIHRoZSBmaWxlIGRhdGFcbiAgICByZXR1cm4gcmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCBlbmNvZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGRhdGEgdG8gYSBmaWxlIGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBmaWxlLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gZGF0YSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSlcbiAgICAgIC8vIElmIGl0IGRvZXNuJ3QsIG1ha2UgdGhlIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHRoaXMuZGF0YVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZmlsZVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIEVuc3VyZSB0aGUgZGlyZWN0b3J5IGZvciB0aGUgZmlsZSBleGlzdHNcbiAgICBjb25zdCBkaXJQYXRoID0gZnVsbFBhdGguc3Vic3RyaW5nKDAsIGZ1bGxQYXRoLmxhc3RJbmRleE9mKHNlcCkpO1xuICAgIGlmICghZXhpc3RzU3luYyhkaXJQYXRoKSkgbWtkaXJTeW5jKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gV3JpdGUgdGhlIGZpbGUgZGF0YVxuICAgIHJldHVybiB3cml0ZUZpbGVTeW5jKGZ1bGxQYXRoLCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZmlsZSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUZpbGUocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBkYXRhIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJmaWxlXCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBmaWxlXG4gICAgcmV0dXJuIHJtU3luYyhmdWxsUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGRpcmVjdG9yeSBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgY3JlYXRlZCBkaXJlY3RvcnkgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBta2RpcihwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gZGF0YSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSlcbiAgICAgIC8vIElmIGl0IGRvZXNuJ3QsIG1ha2UgdGhlIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHRoaXMuZGF0YVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCk7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG5cbiAgICAvLyBNYWtlIHRoZSBkaXJlY3RvcnlcbiAgICByZXR1cm4gbWtkaXJTeW5jKGZ1bGxQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZGlyZWN0b3J5IGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlbW92ZS5cbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgdG8gZm9yY2VmdWxseSByZW1vdmUgdGhlIGRpcmVjdG9yeSBhbmQgaXRzIGNvbnRlbnRzLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBybWRpcihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyByZWN1cnNpdmU6IGJvb2xlYW47IGZvcmNlOiBib29sZWFuIH0gPSB7XG4gICAgICByZWN1cnNpdmU6IGZhbHNlLFxuICAgICAgZm9yY2U6IGZhbHNlXG4gICAgfVxuICApOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZGlyZWN0b3J5XCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgdGhlIGRpcmVjdG9yeVxuICAgIHJldHVybiBybVN5bmMoZnVsbFBhdGgsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gcmVhZC5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBvciBudWxsIGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgaW52YWxpZC5cbiAgICovXG4gIHB1YmxpYyByZWFkRGlyKHBhdGg6IHN0cmluZyk6IEFycmF5PHN0cmluZz4gfCBudWxsIHtcbiAgICAvLyBFbnN1cmUgdGhlIHBsdWdpbiBkYXRhIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJkaXJlY3RvcnlcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZWFkIGFuZCByZXR1cm4gdGhlIGRpcmVjdG9yeSBjb250ZW50c1xuICAgIHJldHVybiByZWFkZGlyU3luYyhmdWxsUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzIGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBleGlzdHMsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBleGlzdHMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gRW5zdXJlIHRoZSBwbHVnaW4gZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgb3IgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGV4aXN0c1xuICAgIHJldHVybiBleGlzdHNTeW5jKGZ1bGxQYXRoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5GaWxlU3lzdGVtIH07XG4iLCAiaW1wb3J0IHsgUmVzb3VyY2VQYWNrLCBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tIFwiQHNlcmVuaXR5anMvZW1pdHRlclwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuL3BpcGVsaW5lXCI7XG5pbXBvcnQgeyBQbHVnaW5FdmVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUGx1Z2luQmxvY2tSZWdpc3RyeSxcbiAgUGx1Z2luRW50aXR5UmVnaXN0cnksXG4gIFBsdWdpbkl0ZW1SZWdpc3RyeVxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgUGx1Z2luUHJpb3JpdHkgfSBmcm9tIFwiLi9lbnVtcy9wcmlvcml0eVwiO1xuaW1wb3J0IHsgUGx1Z2luRmlsZVN5c3RlbSB9IGZyb20gXCIuL2ZpbGUtc3lzdGVtXCI7XG5cbmludGVyZmFjZSBQbHVnaW5PcHRpb25zIGV4dGVuZHMgUGFydGlhbDxQbHVnaW5FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVycyBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1heExpc3RlbmVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqICMgSW50cm9kdWN0aW9uXG4gKiBQbHVnaW5zIGFyZSB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIFNlcmVuaXR5SlMuXG4gKiBUaGV5IGFyZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2hpY2ggYWxsb3dzIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgc2VydmVyLlxuICpcbiAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIHBsdWdpbnMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYFBsdWdpblR5cGVgIGVudW06IGBBZGRvbmAgJiBgQXBpYFxuICpcbiAqIEFkZG9uIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2Fubm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICogQXBpIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbiBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqXG4gKiAjIyBDbGFzcyBFeHRlbmRpbmcgUGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5UeXBlLCBQbHVnaW5FdmVudHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcGx1Z2luc1wiO1xuICpcbiAqIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gKiAgIHB1YmxpYyByZWFkb25seSB0eXBlID0gUGx1Z2luVHlwZS5BZGRvbjtcbiAqXG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcInNhbXBsZS1wbHVnaW5cIiwgXCIxLjAuMFwiKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIG9uSW5pdGlhbGl6ZSgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TdGFydFVwKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblNodXREb3duKCk6IHZvaWQge31cbiAqIH1cbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBuZXcgU2FtcGxlUGx1Z2luKCk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgUGx1Z2luPFQgPSB1bmtub3duPiBleHRlbmRzIEVtaXR0ZXI8VD4gaW1wbGVtZW50cyBQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHByaW9yaXR5IG9mIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIHBsdWdpbnMgYXJlIGxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcmlvcml0eTogUGx1Z2luUHJpb3JpdHkgPSBQbHVnaW5Qcmlvcml0eS5Ob3JtYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBibG9jayByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9ja3MgPSBuZXcgUGx1Z2luQmxvY2tSZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtcyA9IG5ldyBQbHVnaW5JdGVtUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdGllcyA9IG5ldyBQbHVnaW5FbnRpdHlSZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcGFja3MgcHJvdmlkZWQgYnkgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZXMgPSBuZXcgU2V0PFJlc291cmNlUGFjaz4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbmZpZyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogdW5rbm93biA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBmaWxlU3lzdGVtITogUGx1Z2luRmlsZVN5c3RlbTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFBsdWdpbk9wdGlvbnM+XG4gICkge1xuICAgIC8vIENhbGwgdGhlIHN1cGVyIG1ldGhvZCB3aXRoIHRoZSBtYXggbGlzdGVuZXJzXG4gICAgc3VwZXIob3B0aW9ucz8ubWF4TGlzdGVuZXJzKTtcblxuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBvcHRpb25zPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gb3B0aW9ucy5vbkluaXRpYWxpemU7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBvcHRpb25zLm9uU3RhcnRVcDtcbiAgICBpZiAob3B0aW9ucz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gb3B0aW9ucy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBwbHVnaW4gYnkgaXRzIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbiB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGluc3RhbmNlIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQgZXh0ZW5kcyBQbHVnaW4+KGlkZW50aWZpZXI6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaXMgZGVmaW5lZC5cbiAgICBpZiAoIXRoaXMucGlwZWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBpcGVsaW5lLnBsdWdpbnMuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBkZWZpbmVkXG4gICAgaWYgKCFwbHVnaW4pIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gcGx1Z2luIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgY29uZmlnIGZvciB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiBUaGUgY29uZmlnIGRlZmluaXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBjb25maWcgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGRlZmluZUNvbmZpZzxUPihkZWZpbml0aW9uOiBUKTogVCB7XG4gICAgLy8gQXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGNvbmZpZyBvYmplY3RcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuY29uZmlnIGFzIG9iamVjdCwgZGVmaW5pdGlvbik7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNvbmZpZyBvYmplY3RcbiAgICByZXR1cm4gdGhpcy5jb25maWcgYXMgVDtcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpbk9wdGlvbnMgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEJsb2NrVHJhaXQsIEN1c3RvbUJsb2NrVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkJsb2NrUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGJsb2NrIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUJsb2NrVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGJsb2NrIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUJsb2NrVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tQmxvY2tUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBCbG9ja1RyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkJsb2NrUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEl0ZW1TdGFja1RyYWl0LCBDdXN0b21JdGVtVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkl0ZW1SZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21JdGVtVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtU3RhY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEl0ZW1TdGFja1RyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkl0ZW1SZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgRW50aXR5VHJhaXQsIEN1c3RvbUVudGl0eVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUVudGl0eVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBFbnRpdHlUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjRkQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSwrQkFBQUUsRUFBQSxhQUFBQyxFQUFBLFdBQUFDLEVBQUEscUJBQUFDLEVBQUEsaUJBQUFDLEVBQUEsbUJBQUFDLEVBQUEsZUFBQUMsSUFBQSxlQUFBQyxFQUFBVCxHQ0NBLElBQUFVLEVBT08sY0FDUEMsRUFBa0MsZ0JBQ2xDQyxFQUF5QyxnQkFFekNDLEVBQXFDLDhCQUNyQ0MsRUFBa0QsNEJBQ2xEQyxFQUE2QixvQ0NkN0IsSUFBQUMsRUFBeUIsZ0JDQXpCLElBQUFDLEVBQTJCLDRCQUUzQixJQUFNQyxFQUFOLGNBQTBCQyxZQUFBQSxDQUYxQixNQUUwQkEsQ0FBQUEsRUFBQUEsb0JBQ3hCLE9BQXVCQyxXQUFhLFVBQ3BDLE9BQXVCQyxRQUF5QixDQUFBLENBQ2xELEVBRU1DLEVBQU4sY0FBZ0NILFlBQUFBLENBUGhDLE1BT2dDQSxDQUFB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QyxPQUFLNkIsR0FBZSxJQUl0QixDQU1PSixhQUFhTyxFQUF1QixDQUUzQyxDQU1PTixVQUFVTSxFQUF1QixDQUV4QyxDQU1PTCxXQUFXSyxFQUF1QixDQUV6QyxDQU9PQyxhQUFnQkMsRUFBa0IsQ0FFdkNDLGNBQU9DLE9BQU8sS0FBS3RCLE9BQWtCb0IsQ0FBQUEsRUFHOUIsS0FBS3BCLE1BQ2QsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiaW1wb3J0X2ZzIiwgImltcG9ydF9wYXRoIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiZGF0YVBhdGgiLCAibG9nZ2VyIiwgInZhbGlkYXRlUGF0aCIsICJwYXRoIiwgImV4cGVjdGVkVHlwZSIsICJpc0Fic29sdXRlIiwgIndhcm4iLCAic3RhcnRzV2l0aCIsICJzZXAiLCAiaGFzRXh0ZW5zaW9uIiwgInRlc3QiLCAicmVhZEZpbGUiLCAiZW5jb2RpbmciLCAiZXhpc3RzU3luYyIsICJmdWxsUGF0aCIsICJyZXNvbHZlIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImRpclBhdGgiLCAic3Vic3RyaW5nIiwgImxhc3RJbmRleE9mIiwgIndyaXRlRmlsZVN5bmMiLCAicmVtb3ZlRmlsZSIsICJybVN5bmMiLCAibWtkaXIiLCAicm1kaXIiLCAib3B0aW9ucyIsICJmb3JjZSIsICJyZWFkRGlyIiwgInJlYWRkaXJTeW5jIiwgImV4aXN0cyIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJuYW1lIiwgImlzRmlsZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJmaWxlU3lzdGVtIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJPYmplY3QiLCAia2V5cyIsICJjb25maWciLCAid3JpdGVGaWxlU3luYyIsICJzdHJpbmdpZnkiLCAiZGF0YSIsICJhc3NpZ24iLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidGVtcCIsICJzbGljZSIsICJyZXBsYWNlIiwgIm5leHRUaWNrIiwgInVubGlua1N5bmMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInNvdXJjZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiZ2V0UHJvdG90eXBlT2YiLCAicGx1Z2luS2V5cyIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImV2ZW50S2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAicHJpb3JpdHkiLCAiUGx1Z2luUHJpb3JpdHkiLCAiTm9ybWFsIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJyZXNvdXJjZXMiLCAiU2V0IiwgImNvbmZpZyIsICJmaWxlU3lzdGVtIiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVzb2x2ZSIsICJwbHVnaW4iLCAicGx1Z2lucyIsICJnZXQiLCAiX3BsdWdpbiIsICJkZWZpbmVDb25maWciLCAiZGVmaW5pdGlvbiIsICJPYmplY3QiLCAiYXNzaWduIl0KfQo=
1
+ "use strict";var $=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var p=(a,e)=>$(a,"name",{value:e,configurable:!0});var q=(a,e)=>{for(var t in e)$(a,t,{get:e[t],enumerable:!0})},J=(a,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!M.call(a,o)&&o!==t&&$(a,o,{get:()=>e[o],enumerable:!(s=U(e,o))||s.enumerable});return a};var W=a=>J($({},"__esModule",{value:!0}),a);var Q={};q(Q,{DefaultPipelineProperties:()=>j,Pipeline:()=>Z,Plugin:()=>G,PluginFileSystem:()=>k,PluginHeader:()=>w,PluginPriority:()=>I,PluginType:()=>S});module.exports=W(Q);var u=require("fs"),n=require("path"),P=require("zlib"),F=require("@serenityjs/logger"),v=require("@serenityjs/core"),B=require("@serenityjs/binarystream");var N=require("path");var O=require("@serenityjs/core");var x=class extends O.CustomEnum{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]};var K=p((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.registerSubCommand("list","List all loaded plugins",()=>{if(e.plugins.size===0)return{message:"\xA7cThere are currently no plugins loaded on the server."};let s=[...e.plugins.values()],o=[];for(let r of s)o.push(`\xA7u${r.identifier} v${r.version}\xA7r`);return{message:`\xA77Active Plugins (${s.length}):\xA7r ${o.join("\xA77,\xA7r ")}`}},["l"]),t.registerSubCommand("reload","Reload a specific plugin",s=>{s.overload({plugin:x},({plugin:o})=>{let r=e.plugins.get(o.result);if(!r)throw new Error(`Plugin ${o.result} is not found.`);return e.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")},["r"]),t.registerSubCommand("bundle","Bundle a specific plugin",s=>{s.overload({plugin:x},({plugin:o})=>{let r=e.plugins.get(o.result);if(!r)throw new Error(`Plugin ${o.result} is not found.`);if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${(0,N.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")},["b"])},()=>{throw new Error("No subcommand matched the provided arguments.")},["pl","plugin"])},"register"),z=K;var w=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(w||{});var I=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(I||{});var S=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(S||{});var c=require("fs"),g=require("path");var k=class{static{p(this,"PluginFileSystem")}dataPath;logger;constructor(e,t){this.dataPath=e,this.logger=t}validatePath(e,t){if(!(0,g.isAbsolute)(e))return this.logger.warn(`Attempted to access invalid path: ${e}. Path must be absolute.`),!1;if(!e.startsWith(this.dataPath+g.sep))return this.logger.warn(`Invalid path: ${e}. Path must be within the plugin's data directory.`),!1;let o=/.*\..+/.test(e);return t==="file"&&!o||t==="directory"&&o?(this.logger.warn(`Invalid path: ${e}. Path is not a valid ${t}.`),!1):!0}readFile(e,t){if(!(0,c.existsSync)(this.dataPath))return null;let s=(0,g.resolve)(this.dataPath,e);return!this.validatePath(s,"file")||!(0,c.existsSync)(s)?null:(0,c.readFileSync)(s,t)}writeFile(e,t){(0,c.existsSync)(this.dataPath)||(0,c.mkdirSync)(this.dataPath,{recursive:!0});let s=(0,g.resolve)(this.dataPath,e);if(!this.validatePath(s,"file"))return;let r=s.substring(0,s.lastIndexOf(g.sep));return(0,c.existsSync)(r)||(0,c.mkdirSync)(r,{recursive:!0}),(0,c.writeFileSync)(s,t)}removeFile(e){if(!(0,c.existsSync)(this.dataPath))return;let t=(0,g.resolve)(this.dataPath,e);if(this.validatePath(t,"file")&&(0,c.existsSync)(t))return(0,c.rmSync)(t)}mkdir(e){(0,c.existsSync)(this.dataPath)||(0,c.mkdirSync)(this.dataPath,{recursive:!0});let t=(0,g.resolve)(this.dataPath,e);if(this.validatePath(t))return(0,c.mkdirSync)(t,{recursive:!0})}rmdir(e,t={recursive:!1,force:!1}){if(!(0,c.existsSync)(this.dataPath))return;let s=(0,g.resolve)(this.dataPath,e);if(this.validatePath(s,"directory")&&(0,c.existsSync)(s))return(0,c.rmSync)(s,t)}readDir(e){if(!(0,c.existsSync)(this.dataPath))return null;let t=(0,g.resolve)(this.dataPath,e);return!this.validatePath(t,"directory")||!(0,c.existsSync)(t)?null:(0,c.readdirSync)(t)}exists(e){if(!(0,c.existsSync)(this.dataPath))return!1;let t=(0,g.resolve)(this.dataPath,e);return this.validatePath(t)?(0,c.existsSync)(t):!1}};var j={path:"./plugins",commands:!0,initialize:!0},Z=class{static{p(this,"Pipeline")}serenity;properties;logger=new F.Logger("Plugins",F.LoggerColors.MaterialLapis);plugins=new Map;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...j,...t},e.on(v.ServerEvent.Start,this.start.bind(this)),e.on(v.ServerEvent.Stop,this.stop.bind(this)),e.on(v.WorldEvent.WorldInitialize,({world:s})=>{this.properties.commands&&z(s,this);for(let[,o]of this.plugins)s.blockPalette.registerType(...o.blocks.types).registerTrait(...o.blocks.traits),s.itemPalette.registerType(...o.items.types).registerTrait(...o.items.traits),s.entityPalette.registerType(...o.entities.types).registerTrait(...o.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){(0,u.existsSync)((0,n.resolve)(this.path))||(0,u.mkdirSync)((0,n.resolve)(this.path),{recursive:!0}),(0,u.existsSync)((0,n.resolve)(this.path,"data"))||(0,u.mkdirSync)((0,n.resolve)(this.path,"data"),{recursive:!0}),(0,u.existsSync)((0,n.resolve)(this.path,"configs"))||(0,u.mkdirSync)((0,n.resolve)(this.path,"configs"),{recursive:!0});let t=(0,u.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory()?r.name!=="data"&&r.name!=="configs":!0).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),s=[];for(let r of t)try{let i=(0,n.resolve)(this.path,r.name),h=(0,P.inflateSync)((0,u.readFileSync)(i)),l=new B.BinaryStream(h);switch(l.readByte()){case w.HasNoResources:{let d=l.readVarInt(),m=l.readBuffer(d).toString("utf-8"),f=this.loadFromTextSource(i,m,!0);f&&s.push(f);break}case w.HasResources:{let d=l.readVarInt(),m=l.readBuffer(d).toString("utf-8"),f=this.loadFromTextSource(i,m,!0);if(!f)break;s.push(f);let y=l.readVarInt();for(let R=0;R<y;R++)try{let E=l.readVarInt(),D=l.readBuffer(E),V=this.serenity.resources.loadFromZip(D);f.logger.success(`Loaded resource pack \xA7u${V.name}\xA7r (\xA78${V.uuid}\xA7r).`),f.resources.add(V)}catch(E){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r for plugin \xA71${f.identifier}\xA7r.`,E)}break}case S.Addon:{this.logger.warn(`The plugin \xA71${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let d=l.readRemainingBuffer().toString("utf-8"),m=this.loadFromTextSource(i,d,!0);m&&s.push(m);break}case S.Api:this.logger.error(`The plugin \xA71${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,i)}let o=(0,u.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of o)try{let i=(0,n.resolve)(this.path,r.name);if(!(0,u.existsSync)((0,n.resolve)(i,"package.json")))continue;let h=JSON.parse((0,u.readFileSync)((0,n.resolve)(i,"package.json"),"utf-8")),l=(0,n.resolve)(i,h.main);if(!(0,u.existsSync)((0,n.resolve)(i,l))){this.logger.warn(`Unable to load plugin \xA7u${h.name??"unknown-plugin"}\xA78@\xA7u${h.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(i,l))}\xA7r" was not found in the directory.`);continue}let b=require((0,n.resolve)(i,l)),d=b.default;if(this.plugins.has(d.identifier)){this.logger.warn(`Unable to load plugin \xA7u${d.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}d.pipeline=this,d.serenity=this.serenity,d.path=i,d.isBundled=!1,d.fileSystem=new k((0,n.resolve)(d.path,"../data",d.identifier),d.logger),this.linkModule(d.identifier,b),this.plugins.set(d.identifier,d),x.options.push(d.identifier),s.push(d),(0,u.existsSync)((0,n.resolve)(i,"resource_packs"))||(0,u.mkdirSync)((0,n.resolve)(i,"resource_packs"));let m=(0,u.readdirSync)((0,n.resolve)(i,"resource_packs"),{withFileTypes:!0}).filter(f=>f.isDirectory());for(let f of m)try{let y=this.serenity.resources.loadFromPath((0,n.resolve)(i,"resource_packs",f.name));d.logger.success(`Loaded resource pack \xA7u${y.name}\xA7r (\xA78${y.uuid}\xA7r).`),d.resources.add(y)}catch(y){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(i,"resource_packs",f.name))}\xA7r for plugin \xA71${d.identifier}\xA7r.`,y)}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,r.name))}", skipping the plugin.`,i)}s.sort((r,i)=>r.priority!==i.priority?i.priority-r.priority:r.identifier<i.identifier?-1:r.identifier>i.identifier?1:0);for(let r of s)try{if(Object.keys(r.config).length>0){let i=(0,n.resolve)(this.path,"configs",`${r.identifier}.json`);if(!(0,u.existsSync)(i))(0,u.writeFileSync)(i,JSON.stringify(r.config,null,2));else{let h=JSON.parse((0,u.readFileSync)(i,"utf-8"));Object.assign(r.config,h)}}if(r.onInitialize(r),this.bindEvents(r),r.isBundled){let i=(0,n.resolve)(r.path.slice(0,-7).replace(/\./g,"_"));(0,u.existsSync)(i)&&process.nextTick(()=>(0,u.unlinkSync)(i))}}catch(i){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(r.path))}", skipping the plugin.`,i)}}async start(){for(let e of this.plugins.values())await e.onStartUp(e)}async stop(){for(let e of this.plugins.values())await e.onShutDown(e)}loadFromTextSource(e,t,s=!1){let o=(0,n.resolve)(e.slice(0,-7).replace(/\./g,"_"));(0,u.writeFileSync)((0,n.resolve)(o),t);try{let r=require((0,n.resolve)(o)),i=r.default;return this.plugins.has(i.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${i.identifier}\xA7r, the plugin is already loaded in the pipeline.`),(0,u.unlinkSync)((0,n.resolve)(o)),null):(i.pipeline=this,i.serenity=this.serenity,i.path=(0,n.resolve)(e),i.isBundled=s,i.fileSystem=new k((0,n.resolve)(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),x.options.push(i.identifier),i)}catch(r){this.logger.error(`Failed to load plugin from \xA78${(0,n.relative)(process.cwd(),e)}\xA7r, skipping the plugin.`,r),(0,u.unlinkSync)((0,n.resolve)(o))}return null}async reload(e){await e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete require.cache[require.resolve(t)],this.serenity.removePath(t);for(let s of e.resources)this.serenity.resources.packs.delete(s.uuid);if(e.isBundled){let s=(0,P.inflateSync)((0,u.readFileSync)(t)),o=new B.BinaryStream(s);switch(o.readByte()){case w.HasNoResources:{let i=o.readVarInt(),h=o.readBuffer(i).toString("utf-8"),l=this.loadFromTextSource(t,h,!0);if(!l)break;l.onInitialize(l),this.bindEvents(l),await l.onStartUp(l);break}case w.HasResources:{let i=o.readVarInt(),h=o.readBuffer(i).toString("utf-8"),l=this.loadFromTextSource(t,h,!0);if(!l)break;l.onInitialize(l),this.bindEvents(l),await l.onStartUp(l);let b=o.readVarInt();for(let d=0;d<b;d++)try{let m=o.readVarInt(),f=o.readBuffer(m),y=this.serenity.resources.loadFromZip(f);l.logger.success(`Loaded resource pack \xA7u${y.name}\xA7r (\xA78${y.uuid}\xA7r).`),l.resources.add(y)}catch(m){this.logger.error(`Failed to load resource pack \xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,t))}\xA7r for plugin \xA71${l.identifier}\xA7r.`,m)}}}}else{let s=JSON.parse((0,u.readFileSync)((0,n.resolve)(t,"package.json"),"utf-8")),o=(0,n.resolve)(t,s.main);if(!(0,u.existsSync)((0,n.resolve)(t,o))){this.logger.warn(`Unable to reload plugin \xA7u${s.name??"unknown-plugin"}\xA78@\xA7u${s.version??"unknown-version"}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(t,o))}\xA7r" was not found in the directory.`);return}let r=require((0,n.resolve)(t,o)),i=r.default;i.pipeline=this,i.serenity=this.serenity,i.path=t,i.isBundled=!1,i.fileSystem=new k((0,n.resolve)(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),x.options.push(i.identifier),i.onInitialize(i),this.bindEvents(i)}}bundle(e){let t=new B.BinaryStream,s=e.resources.size>0?w.HasResources:w.HasNoResources;switch(t.writeByte(s),s){case w.HasNoResources:{let o=(0,n.resolve)(e.path,"dist","index.js"),r=(0,u.readFileSync)(o);t.writeVarInt(r.byteLength),t.writeBuffer(r),(0,u.writeFileSync)((0,n.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,P.deflateSync)(t.getBuffer()));break}case w.HasResources:{let o=(0,n.resolve)(e.path,"dist","index.js"),r=(0,u.readFileSync)(o);t.writeVarInt(r.byteLength),t.writeBuffer(r),t.writeVarInt(e.resources.size);for(let i of e.resources){let h=i.compress();t.writeVarInt(h.byteLength),t.writeBuffer(h)}(0,u.writeFileSync)((0,n.resolve)(this.path,`${e.identifier}-v${e.version}.plugin`),(0,P.deflateSync)(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),s=Object.getOwnPropertyNames(t),o=Object.keys(v.WorldEvent);o=o.slice(o.length/2);for(let r of o){let i=o.indexOf(r);if(s.includes("on"+r)){let h=e["on"+r];typeof h=="function"&&this.serenity.on(i,h.bind(e))}if(s.includes("before"+r)){let h=e["before"+r];typeof h=="function"&&this.serenity.before(i,h.bind(e))}if(s.includes("after"+r)){let h=e["after"+r];typeof h=="function"&&this.serenity.after(i,h.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(o){o.module(e,()=>({exports:t,loader:"object"}))}})}};var T=require("@serenityjs/logger"),_=require("@serenityjs/emitter");var L=class{static{p(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var A=class{static{p(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var H=class{static{p(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var G=class extends _.Emitter{static{p(this,"Plugin")}identifier;version;logger;priority=I.Normal;blocks=new L;items=new A;entities=new H;resources=new Set;config={};fileSystem;path;isBundled;pipeline;serenity;constructor(e,t,s){super(s?.maxListeners),this.identifier=e,this.version=t,this.logger=s?.logger??new T.Logger(`${e}@${t}`,T.LoggerColors.Blue),s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}async onStartUp(e){}async onShutDown(e){}defineConfig(e){return Object.assign(this.config,e),this.config}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginFileSystem,PluginHeader,PluginPriority,PluginType});
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bS50cyIsICIuLi9zcmMvZW51bXMvaGVhZGVyLnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvZW51bXMvdHlwZS50cyIsICIuLi9zcmMvZmlsZS1zeXN0ZW0udHMiLCAiLi4vc3JjL3BsdWdpbi50cyIsICIuLi9zcmMvcmVnaXN0cnkvYmxvY2sudHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2l0ZW0udHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2VudGl0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsdWdpblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW51bXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maWxlLXN5c3RlbVwiO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUsIFBsdWdpbkhlYWRlciB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBQbHVnaW5GaWxlU3lzdGVtIH0gZnJvbSBcIi4vZmlsZS1zeXN0ZW1cIjtcblxuaW50ZXJmYWNlIFBpcGVsaW5lUHJvcGVydGllcyB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29tbWFuZHM6IGJvb2xlYW47XG4gIGluaXRpYWxpemU6IGJvb2xlYW47XG59XG5cbmNvbnN0IERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcyA9IHtcbiAgcGF0aDogXCIuL3BsdWdpbnNcIixcbiAgY29tbWFuZHM6IHRydWUsXG4gIGluaXRpYWxpemU6IHRydWVcbn07XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnRpZXM6IFBpcGVsaW5lUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlBsdWdpbnNcIiwgTG9nZ2VyQ29sb3JzLk1hdGVyaWFsTGFwaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2lucyBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnMgPSBuZXcgTWFwPHN0cmluZywgUGx1Z2luPigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwaXBlbGluZSBpcyBydW5uaW5nIGluIEVTTSBtb2RlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVzbTogYm9vbGVhbiA9XG4gICAgdHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGU/LmV4cG9ydHMgIT09IGV4cG9ydHM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMucGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgc2V0IHBhdGgoXykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXRoIHByb3BlcnR5IGlzIHJlYWQtb25seS5cIik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGlwZWxpbmUgY2xhc3MuXG4gICAqIEBwYXJhbSBzZXJlbml0eSBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNlcmVuaXR5OiBTZXJlbml0eSxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQaXBlbGluZVByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgLy8gTWVyZ2UgdGhlIHByb3BlcnRpZXMgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHNlcmVuaXR5IHNlcnZlciBldmVudHNcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdGFydCwgdGhpcy5zdGFydC5iaW5kKHRoaXMpKTtcbiAgICBzZXJlbml0eS5vbihTZXJ2ZXJFdmVudC5TdG9wLCB0aGlzLnN0b3AuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT4ge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGZvciB0aGUgcGx1Z2luc1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5jb21tYW5kcykgQ29tbWFuZCh3b3JsZCwgdGhpcyk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCByZWdpc3RlciB0aGUgYmxvY2tzLCBpdGVtcywgYW5kIGVudGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IFssIHBsdWdpbl0gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9ja3MgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5ibG9ja1BhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5ibG9ja3MudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmJsb2Nrcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpdGVtcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLml0ZW1QYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uaXRlbXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLml0ZW1zLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0aWVzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuZW50aXR5UGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmVudGl0aWVzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5lbnRpdGllcy50cmFpdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgc2hvdWxkIGJlIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMucHJvcGVydGllcy5pbml0aWFsaXplKSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBhIHBsdWdpbnMgZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcImRhdGFcIikpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGF0YSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJkYXRhXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENoZWNrIGlmIGEgcGx1Z2lucyBjb25maWdzIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwiY29uZmlnc1wiKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBjb25maWdzIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcImNvbmZpZ3NcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgLy8gQW5kIGZpbHRlciBvdXQgdGhlIGRhdGEgYW5kIGNvbmZpZ3MgZGlyZWN0b3JpZXNcbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNEaXJlY3RvcnkoKVxuICAgICAgICA/IGRpcmVudC5uYW1lICE9PSBcImRhdGFcIiAmJiBkaXJlbnQubmFtZSAhPT0gXCJjb25maWdzXCJcbiAgICAgICAgOiB0cnVlXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIGEgZmlsZSwgYW5kIGlmIGl0IGhhcyBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBBcnJheSB0byBob2xkIHRoZSBvcmRlcmVkIHBsdWdpbnNcbiAgICBjb25zdCBvcmRlcmVkUGx1Z2luczogQXJyYXk8UGx1Z2luPiA9IFtdO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKSBhcyBQbHVnaW5UeXBlIHwgUGx1Z2luSGVhZGVyO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBpZiAocGx1Z2luKSBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIGlmICghcGx1Z2luKSBicmVhaztcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb3VyY2VzOyBpKyspIHtcbiAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWFkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgICAgcGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICAgIHBsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BZGRvbjoge1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBoYW5kbGUgYWRkb24gcGx1Z2lucywgYnV0IG1lbnRpb24gdGhhdCB0aGV5IGFyZSBkZXByZWNhdGVkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVGhlIHBsdWdpbiDCpzEke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBpcyB1c2luZyBhIGRlcHJlY2F0ZWQgcGx1Z2luIHR5cGUgKEFkZG9uKS4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERFUFJFQ0FURUQ6IEV2ZW50dWFsbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIHRoZXNlIHBsdWdpbiB0eXBlc1xuICAgICAgICAgIGNhc2UgUGx1Z2luVHlwZS5BcGk6IHtcbiAgICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciBzdXBwb3J0IEFQSSBwbHVnaW5zXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBUEkpLiBBUEkgcGx1Z2lucyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gUGxlYXNlIHVwZGF0ZSB0aGUgcGx1Z2luIHRvIHVzZSB0aGUgbmV3IHBsdWdpbiBzeXN0ZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLmZpbGVTeXN0ZW0gPSBuZXcgUGx1Z2luRmlsZVN5c3RlbShcbiAgICAgICAgICByZXNvbHZlKHBsdWdpbi5wYXRoLCBcIi4uL2RhdGFcIiwgcGx1Z2luLmlkZW50aWZpZXIpLFxuICAgICAgICAgIHBsdWdpbi5sb2dnZXJcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgXCJyZXNvdXJjZV9wYWNrc1wiIGRpcmVjdG9yeSBleGlzdHMgaW4gdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIpKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVzb3VyY2VfcGFja3MgZGlyZWN0b3J5XG4gICAgICAgICAgbWtkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2VfcGFjayBkaXJlY3RvcnksIG9ubHkgaW5jbHVkaW5nIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSwge1xuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICAgICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZSBwYWNrIGRpcmVjdG9yaWVzLCBhbmQgYXR0ZW1wdCB0byBsb2FkIHRoZW1cbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjaywgYW5kIGFkZCBpdCB0byB0aGUgc2VyZW5pdHkgcmVzb3VyY2VzXG4gICAgICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21QYXRoKFxuICAgICAgICAgICAgICByZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiwgcmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICBwbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3BhY2submFtZX3Cp3IgKMKnOCR7cGFjay51dWlkfcKncikuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgcGx1Z2luLnJlc291cmNlcy5hZGQocGFjayk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiLCByZXNvdXJjZS5uYW1lKVxuICAgICAgICAgICAgICApfcKnciBmb3IgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLmAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBwbHVnaW5zIGJ5IHRoZWlyIHByaW9yaXR5XG4gICAgb3JkZXJlZFBsdWdpbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSBmaXJzdFxuICAgICAgaWYgKGEucHJpb3JpdHkgIT09IGIucHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5OyAvLyBIaWdoZXIgcHJpb3JpdHkgY29tZXMgZmlyc3RcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJpb3JpdHkgaXMgdGhlIHNhbWUsIHNvcnQgYnkgaWRlbnRpZmllciBhbHBoYWJldGljYWxseVxuICAgICAgaWYgKGEuaWRlbnRpZmllciA8IGIuaWRlbnRpZmllcikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuaWRlbnRpZmllciA+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgY29uZmlnIGRlZmluZWRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBsdWdpbi5jb25maWcgYXMgb2JqZWN0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4gY29uZmlnIGZpbGVcbiAgICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShcbiAgICAgICAgICAgIHRoaXMucGF0aCxcbiAgICAgICAgICAgIFwiY29uZmlnc1wiLFxuICAgICAgICAgICAgYCR7cGx1Z2luLmlkZW50aWZpZXJ9Lmpzb25gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgY29uZmlnIGZpbGUgZXhpc3RzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgZGVmYXVsdCBjb25maWcgdG8gdGhlIGNvbmZpZyBmaWxlXG4gICAgICAgICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIEpTT04uc3RyaW5naWZ5KHBsdWdpbi5jb25maWcsIG51bGwsIDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgY29uZmlnIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCBcInV0Zi04XCIpKTtcblxuICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBjb25maWcgZGF0YSB0byB0aGUgcGx1Z2luIGNvbmZpZ1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwbHVnaW4uY29uZmlnIGFzIG9iamVjdCwgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKHBsdWdpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBidW5kbGVkXG4gICAgICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb25zdCB0ZW1wID0gcmVzb2x2ZShwbHVnaW4ucGF0aC5zbGljZSgwLCAtNykucmVwbGFjZSgvXFwuL2csIFwiX1wiKSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmIChleGlzdHNTeW5jKHRlbXApKSBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHVubGlua1N5bmModGVtcCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKFxuICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIHJlc29sdmUocGx1Z2luLnBhdGgpXG4gICAgICAgICAgKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBhd2FpdCBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBhd2FpdCBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBwbHVnaW4gZnJvbSBhIHRleHQgc291cmNlLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gaXNCdW5kbGVkIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBidW5kbGVkIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBsb2FkRnJvbVRleHRTb3VyY2UoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGlzQnVuZGxlZCA9IGZhbHNlXG4gICk6IFBsdWdpbiB8IG51bGwge1xuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgY29uc3QgdGVtcCA9IHJlc29sdmUocGF0aC5zbGljZSgwLCAtNykucmVwbGFjZSgvXFwuL2csIFwiX1wiKSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgc291cmNlIHRvIHRoZSB0ZW1wb3JhcnkgcGF0aFxuICAgIHdyaXRlRmlsZVN5bmMocmVzb2x2ZSh0ZW1wKSwgc291cmNlKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUodGVtcCkpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgIC8vIExvZyB0aGUgd2FybmluZyB0aGF0IHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICB1bmxpbmtTeW5jKHJlc29sdmUodGVtcCkpO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHBsdWdpbi5wYXRoID0gcmVzb2x2ZShwYXRoKTtcbiAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBpc0J1bmRsZWQ7XG5cbiAgICAgIC8vIFNldCB0aGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBwbHVnaW5cbiAgICAgIHBsdWdpbi5maWxlU3lzdGVtID0gbmV3IFBsdWdpbkZpbGVTeXN0ZW0oXG4gICAgICAgIHJlc29sdmUocGx1Z2luLnBhdGgsIFwiLi4vZGF0YVwiLCBwbHVnaW4uaWRlbnRpZmllciksXG4gICAgICAgIHBsdWdpbi5sb2dnZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgIHRoaXMubGlua01vZHVsZShwbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUodGVtcCkpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIHRoZSBwbHVnaW4gZmFpbGVkIHRvIGxvYWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIGF3YWl0IHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgcGx1Z2luLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgICAgdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMucGFja3MuZGVsZXRlKHJlc291cmNlLnV1aWQpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW0gZnJvbSB0aGUgYnVmZmVyXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiBoZWFkZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICBjb25zdCBuZXdQbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgaWYgKCFuZXdQbHVnaW4pIGJyZWFrO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgICAgIGF3YWl0IG5ld1BsdWdpbi5vblN0YXJ0VXAobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICBjb25zdCBuZXdQbHVnaW4gPSB0aGlzLmxvYWRGcm9tVGV4dFNvdXJjZShwYXRoLCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgaWYgKCFuZXdQbHVnaW4pIGJyZWFrO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgICAgIGF3YWl0IG5ld1BsdWdpbi5vblN0YXJ0VXAobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgYnVmZmVyXG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zZXJlbml0eS5yZXNvdXJjZXMubG9hZEZyb21aaXAoYnVmZmVyKTtcblxuICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICBuZXdQbHVnaW4ubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgYExvYWRlZCByZXNvdXJjZSBwYWNrIMKndSR7cmVzb3VyY2UubmFtZX3Cp3IgKMKnOCR7cmVzb3VyY2UudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHBsdWdpbiByZXNvdXJjZXMgc2V0XG4gICAgICAgICAgICAgIG5ld1BsdWdpbi5yZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGlmIHRoZSByZXNvdXJjZSBwYWNrIGZhaWxlZCB0byBsb2FkXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIHBhdGgpXG4gICAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke25ld1BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiDCp3Uke21hbmlmZXN0Lm5hbWUgPz8gXCJ1bmtub3duLXBsdWdpblwifcKnOEDCp3Uke21hbmlmZXN0LnZlcnNpb24gPz8gXCJ1bmtub3duLXZlcnNpb25cIn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBpbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgbmV3UGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIG5ld1BsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICBuZXdQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgbmV3UGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgbmV3UGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXQgdGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luXG4gICAgICBuZXdQbHVnaW4uZmlsZVN5c3RlbSA9IG5ldyBQbHVnaW5GaWxlU3lzdGVtKFxuICAgICAgICByZXNvbHZlKG5ld1BsdWdpbi5wYXRoLCBcIi4uL2RhdGFcIiwgbmV3UGx1Z2luLmlkZW50aWZpZXIpLFxuICAgICAgICBuZXdQbHVnaW4ubG9nZ2VyXG4gICAgICApO1xuXG4gICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICB0aGlzLmxpbmtNb2R1bGUobmV3UGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChuZXdQbHVnaW4uaWRlbnRpZmllciwgbmV3UGx1Z2luKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKG5ld1BsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGx1Z2luIGhlYWRlciBiYXNlZCBvbiB0aGUgcmVzb3VyY2VzXG4gICAgY29uc3QgaGVhZGVyID1cbiAgICAgIHBsdWdpbi5yZXNvdXJjZXMuc2l6ZSA+IDBcbiAgICAgICAgPyBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzXG4gICAgICAgIDogUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKGhlYWRlcik7XG5cbiAgICAvLyBTd2l0Y2ggYmFzZWQgb24gdGhlIHBsdWdpbiBoZWFkZXJcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGNvbXBpbGVkIGluZGV4IGZpbGVcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiLCBcImluZGV4LmpzXCIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoaW5kZXguYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHBsdWdpbi5yZXNvdXJjZXMuc2l6ZSk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzLCBhbmQgd3JpdGUgdGhlbSB0byB0aGUgc3RyZWFtXG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcGx1Z2luLnJlc291cmNlcykge1xuICAgICAgICAgIC8vIENvbXByZXNzIHRoZSByZXNvdXJjZSBwYWNrIGludG8gYSBidWZmZXJcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByZXNvdXJjZS5jb21wcmVzcygpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGJ1ZmZlci5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS12JHtwbHVnaW4udmVyc2lvbn0ucGx1Z2luYCksXG4gICAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYmluZEV2ZW50cyhwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcHJvdG90eXBlIG9mIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGx1Z2luKTtcblxuICAgIC8vIEdldCB0aGUgb2JqZWN0IGtleXMgZnJvbSB0aGUgcGx1Z2luXG4gICAgY29uc3QgcGx1Z2luS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSk7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIGV2ZW50IGtleXMsIGFuZCBzbGljZSB0aGVtIGluIGhhbGZcbiAgICBsZXQgZXZlbnRLZXlzID0gT2JqZWN0LmtleXMoV29ybGRFdmVudCk7XG4gICAgZXZlbnRLZXlzID0gZXZlbnRLZXlzLnNsaWNlKGV2ZW50S2V5cy5sZW5ndGggLyAyKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGV2ZW50IGtleXNcbiAgICBmb3IgKGNvbnN0IGV2ZW50S2V5IG9mIGV2ZW50S2V5cykge1xuICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZXZlbnQga2V5XG4gICAgICBjb25zdCBpbmRleCA9IGV2ZW50S2V5cy5pbmRleE9mKGV2ZW50S2V5KSBhcyBXb3JsZEV2ZW50O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJvblwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwib25cIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwib25cIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5vbihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJiZWZvcmVcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImJlZm9yZVwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5iZWZvcmUoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiBib29sZWFuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYWZ0ZXJcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImFmdGVyXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImFmdGVyXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYWZ0ZXIoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluayBhIG1vZHVsZSB0byB0aGUgcGlwZWxpbmUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbGluay5cbiAgICogQHBhcmFtIG1vZHVsZSBUaGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqL1xuICBwdWJsaWMgbGlua01vZHVsZShuYW1lOiBzdHJpbmcsIG1vZHVsZTogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcnVudGltZSBvZiB0aGUgc2VydmVyXG4gICAgY29uc3QgaXNCdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1biA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgLy8gTW9kdWxlIGxpbmtpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gQnVuXG4gICAgaWYgKCFpc0J1bikgcmV0dXJuO1xuXG4gICAgLy8gSW5qZWN0IHRoZSBtb2R1bGUgaW50byB0aGUgQnVuIHBsdWdpbiBzeXN0ZW1cbiAgICBCdW4ucGx1Z2luKHtcbiAgICAgIG5hbWU6IGBzZXJlbml0eWpzLnBsdWdpbi4ke25hbWV9YCxcbiAgICAgIHNldHVwKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5tb2R1bGUobmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleHBvcnRzOiBtb2R1bGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICBsb2FkZXI6IFwib2JqZWN0XCJcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQsIENvbW1hbmRSZWdpc3RyeSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gUmVnaXN0ZXIgdGhlIFwibGlzdFwiIHN1YmNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3ViQ29tbWFuZChcbiAgICAgICAgXCJsaXN0XCIsXG4gICAgICAgIFwiTGlzdCBhbGwgbG9hZGVkIHBsdWdpbnNcIixcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBbXCJsXCJdXG4gICAgICApO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgXCJyZWxvYWRcIiBzdWJjb21tYW5kXG4gICAgICByZWdpc3RyeS5yZWdpc3RlclN1YkNvbW1hbmQoXG4gICAgICAgIFwicmVsb2FkXCIsXG4gICAgICAgIFwiUmVsb2FkIGEgc3BlY2lmaWMgcGx1Z2luXCIsXG4gICAgICAgIChzdWJSZWdpc3RyeTogQ29tbWFuZFJlZ2lzdHJ5KSA9PiB7XG4gICAgICAgICAgc3ViUmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoeyBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KFxuICAgICAgICAgICAgICAgIHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFtcInJcIl1cbiAgICAgICk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBcImJ1bmRsZVwiIHN1YmNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyU3ViQ29tbWFuZChcbiAgICAgICAgXCJidW5kbGVcIixcbiAgICAgICAgXCJCdW5kbGUgYSBzcGVjaWZpYyBwbHVnaW5cIixcbiAgICAgICAgKHN1YlJlZ2lzdHJ5OiBDb21tYW5kUmVnaXN0cnkpID0+IHtcbiAgICAgICAgICBzdWJSZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICh7IHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQoXG4gICAgICAgICAgICAgICAgcGx1Z2luLnJlc3VsdCBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgICAgIH0sXG4gICAgICAgIFtcImJcIl1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdWJjb21tYW5kIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfSxcbiAgICBbXCJwbFwiLCBcInBsdWdpblwiXSAvLyBDb21tYW5kIGFsaWFzZXNcbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iLCAiZW51bSBQbHVnaW5IZWFkZXIge1xuICBIYXNOb1Jlc291cmNlcyA9IDIsXG4gIEhhc1Jlc291cmNlcyA9IDNcbn1cblxuZXhwb3J0IHsgUGx1Z2luSGVhZGVyIH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcbiAgLyoqXG4gICAqIEEgbG93IHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBhZnRlciBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIHJlYWN0aW5nIHRvIGNoYW5nZXMgb3IgZmluYWwgYWRqdXN0bWVudHMuXG4gICAqL1xuICBMb3csXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciBhIHBsdWdpbi5cbiAgICogU3VpdGFibGUgZm9yIHN0YW5kYXJkIHBsdWdpbiBiZWhhdmlvci5cbiAgICovXG4gIE5vcm1hbCxcblxuICAvKipcbiAgICogQSBoaWdoIHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciBlYXJseSBzZXR1cCBvciBvdmVycmlkaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgSGlnaFxufVxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHJlYWRkaXJTeW5jXG59IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSwgc2VwLCBpc0Fic29sdXRlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5jbGFzcyBQbHVnaW5GaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRhUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luRmlsZVN5c3RlbSBjbGFzcy5cbiAgICogQHBhcmFtIGRhdGFQYXRoIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhUGF0aDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlcikge1xuICAgIHRoaXMuZGF0YVBhdGggPSBkYXRhUGF0aDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwYXRoIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGF0aChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZXhwZWN0ZWRUeXBlPzogXCJmaWxlXCIgfCBcImRpcmVjdG9yeVwiXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyBhYnNvbHV0ZVxuICAgIGlmICghaXNBYnNvbHV0ZShwYXRoKSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEF0dGVtcHRlZCB0byBhY2Nlc3MgaW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIG11c3QgYmUgYWJzb2x1dGUuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHBhdGggaXMgd2l0aGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeVxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGggKyBzZXApKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgSW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgcGF0aCBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5XG4gICAgY29uc3QgZmlsZVJlZ2V4ID0gLy4qXFwuLisvOyAvLyBNYXRjaGVzIHBhdGhzIHdpdGggYSBkb3QgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgY2hhcmFjdGVyc1xuICAgIGNvbnN0IGhhc0V4dGVuc2lvbiA9IGZpbGVSZWdleC50ZXN0KHBhdGgpO1xuICAgIGlmIChcbiAgICAgIChleHBlY3RlZFR5cGUgPT09IFwiZmlsZVwiICYmICFoYXNFeHRlbnNpb24pIHx8XG4gICAgICAoZXhwZWN0ZWRUeXBlID09PSBcImRpcmVjdG9yeVwiICYmIGhhc0V4dGVuc2lvbilcbiAgICApIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBJbnZhbGlkIHBhdGg6ICR7cGF0aH0uIFBhdGggaXMgbm90IGEgdmFsaWQgJHtleHBlY3RlZFR5cGV9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBmaWxlIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkLlxuICAgKiBAcGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwgZW5jb2RpbmcuIElmIHByb3ZpZGVkLCByZXR1cm5zIGEgc3RyaW5nOyBvdGhlcndpc2UsIHJldHVybnMgYSBCdWZmZXIuXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGRhdGEgaWYgaXQgZXhpc3RzIGFuZCBpcyB2YWxpZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVhZEZpbGUocGF0aDogc3RyaW5nKTogQnVmZmVyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRGaWxlKHBhdGg6IHN0cmluZywgZW5jb2Rpbmc6IEJ1ZmZlckVuY29kaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIHJlYWRGaWxlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nXG4gICk6IEJ1ZmZlciB8IHN0cmluZyB8IG51bGwge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJmaWxlXCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlYWQgYW5kIHJldHVybiB0aGUgZmlsZSBkYXRhXG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhmdWxsUGF0aCwgZW5jb2RpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgZmlsZS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0LCBtYWtlIHRoZSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyh0aGlzLmRhdGFQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImZpbGVcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG5cbiAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgZXhpc3RzXG4gICAgY29uc3QgZGlyUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cmluZygwLCBmdWxsUGF0aC5sYXN0SW5kZXhPZihzZXApKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyUGF0aCkpIG1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFdyaXRlIHRoZSBmaWxlIGRhdGFcbiAgICByZXR1cm4gd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGZpbGUgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVGaWxlKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gZGF0YSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZmlsZVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlsZVxuICAgIHJldHVybiBybVN5bmMoZnVsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGNyZWF0ZWQgZGlyZWN0b3J5IGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gICAqL1xuICBwdWJsaWMgbWtkaXIocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0LCBtYWtlIHRoZSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyh0aGlzLmRhdGFQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuXG4gICAgLy8gTWFrZSB0aGUgZGlyZWN0b3J5XG4gICAgcmV0dXJuIG1rZGlyU3luYyhmdWxsUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGRpcmVjdG9yeSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIHRvIGZvcmNlZnVsbHkgcmVtb3ZlIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50cy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgcm1kaXIoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgcmVjdXJzaXZlOiBib29sZWFuOyBmb3JjZTogYm9vbGVhbiB9ID0ge1xuICAgICAgcmVjdXJzaXZlOiBmYWxzZSxcbiAgICAgIGZvcmNlOiBmYWxzZVxuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBkYXRhIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImRpcmVjdG9yeVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBkaXJlY3RvcnlcbiAgICByZXR1cm4gcm1TeW5jKGZ1bGxQYXRoLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgb3IgbnVsbCBpZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZERpcihwYXRoOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgbnVsbCB7XG4gICAgLy8gRW5zdXJlIHRoZSBwbHVnaW4gZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZGlyZWN0b3J5XCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmVhZCBhbmQgcmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGVudHNcbiAgICByZXR1cm4gcmVhZGRpclN5bmMoZnVsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGZpbGUgb3IgZGlyZWN0b3J5IGV4aXN0cyBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBleGlzdHNcbiAgICByZXR1cm4gZXhpc3RzU3luYyhmdWxsUGF0aCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRmlsZVN5c3RlbSB9O1xuIiwgImltcG9ydCB7IFJlc291cmNlUGFjaywgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcbmltcG9ydCB7IFBsdWdpbkZpbGVTeXN0ZW0gfSBmcm9tIFwiLi9maWxlLXN5c3RlbVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwcmlvcml0eTogUGx1Z2luUHJpb3JpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtYXhMaXN0ZW5lcnM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiAjIEludHJvZHVjdGlvblxuICogUGx1Z2lucyBhcmUgdGhlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBTZXJlbml0eUpTLlxuICogVGhleSBhcmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIGFsbG93cyB0b3RhbCBjb250cm9sIG92ZXIgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGVyZSBhcmUgMiB0eXBlcyBvZiBwbHVnaW5zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGBQbHVnaW5UeXBlYCBlbnVtOiBgQWRkb25gICYgYEFwaWBcbiAqXG4gKiBBZGRvbiBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbm5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqIEFwaSBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW4gZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKlxuICogIyMgQ2xhc3MgRXh0ZW5kaW5nIFBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IFBsdWdpbiwgUGx1Z2luVHlwZSwgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIkBzZXJlbml0eWpzL3BsdWdpbnNcIjtcbiAqXG4gKiBjbGFzcyBTYW1wbGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICogICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IFBsdWdpblR5cGUuQWRkb247XG4gKlxuICogICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJzYW1wbGUtcGx1Z2luXCIsIFwiMS4wLjBcIik7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBvbkluaXRpYWxpemUoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU3RhcnRVcCgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TaHV0RG93bigpOiB2b2lkIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgbmV3IFNhbXBsZVBsdWdpbigpO1xuICogYGBgXG4gKi9cbmNsYXNzIFBsdWdpbjxUID0gdW5rbm93bj4gZXh0ZW5kcyBFbWl0dGVyPFQ+IGltcGxlbWVudHMgUGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5ID0gUGx1Z2luUHJpb3JpdHkuTm9ybWFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBhY2tzIHByb3ZpZGVkIGJ5IHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VzID0gbmV3IFNldDxSZXNvdXJjZVBhY2s+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IHVua25vd24gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgZmlsZVN5c3RlbSE6IFBsdWdpbkZpbGVTeXN0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxQbHVnaW5PcHRpb25zPlxuICApIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2Qgd2l0aCB0aGUgbWF4IGxpc3RlbmVyc1xuICAgIHN1cGVyKG9wdGlvbnM/Lm1heExpc3RlbmVycyk7XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgb3B0aW9ucz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IG9wdGlvbnMub25Jbml0aWFsaXplO1xuICAgIGlmIChvcHRpb25zPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gb3B0aW9ucy5vblN0YXJ0VXA7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IG9wdGlvbnMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcGx1Z2luIGJ5IGl0cyBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4gdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpbnN0YW5jZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUIGV4dGVuZHMgUGx1Z2luPihpZGVudGlmaWVyOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGlzIGRlZmluZWQuXG4gICAgaWYgKCF0aGlzLnBpcGVsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgY29uc3QgcGx1Z2luID0gdGhpcy5waXBlbGluZS5wbHVnaW5zLmdldChpZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgZGVmaW5lZFxuICAgIGlmICghcGx1Z2luKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJldHVybiB0aGUgcGx1Z2luXG4gICAgcmV0dXJuIHBsdWdpbiBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb25TdGFydFVwKF9wbHVnaW46IFBsdWdpbik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9uU2h1dERvd24oX3BsdWdpbjogUGx1Z2luKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGNvbmZpZyBmb3IgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGRlZmluaXRpb24gVGhlIGNvbmZpZyBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmlnIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBkZWZpbmVDb25maWc8VD4oZGVmaW5pdGlvbjogVCk6IFQge1xuICAgIC8vIEFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBjb25maWcgb2JqZWN0XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmNvbmZpZyBhcyBvYmplY3QsIGRlZmluaXRpb24pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb25maWcgb2JqZWN0XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI0ZEFBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsK0JBQUFFLEVBQUEsYUFBQUMsRUFBQSxXQUFBQyxFQUFBLHFCQUFBQyxFQUFBLGlCQUFBQyxFQUFBLG1CQUFBQyxFQUFBLGVBQUFDLElBQUEsZUFBQUMsRUFBQVQsR0NDQSxJQUFBVSxFQU9PLGNBQ1BDLEVBQWtDLGdCQUNsQ0MsRUFBeUMsZ0JBRXpDQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZDdCLElBQUFDLEVBQXlCLGdCQ0F6QixJQUFBQyxFQUEy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S0FBS3JCLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSGtCLEdBQVNsQixRQUNULElBQUlvQixTQUFPLEdBQUd0QixDQUFBQSxJQUFjQyxDQUFBQSxHQUFXc0IsZUFBYUMsSUFBSSxFQUd0REosR0FBU0ssZUFBYyxLQUFLQSxhQUFlTCxFQUFRSyxjQUNuREwsR0FBU00sWUFBVyxLQUFLQSxVQUFZTixFQUFRTSxXQUM3Q04sR0FBU08sYUFBWSxLQUFLQSxXQUFhUCxFQUFRTyxXQUNyRCxDQU9PQyxRQUEwQjVCLEVBQThCLENBRTdELEdBQUksQ0FBQyxLQUFLa0IsU0FBVSxPQUFPLEtBRzNCLElBQU1XLEVBQVMsS0FBS1gsU0FBU1ksUUFBUUMsSUFBSS9CLENBQUFBLEVBR3pDLE9BQUs2QixHQUFlLElBSXRCLENBTU9KLGFBQWFPLEVBQXVCLENBRTNDLENBTUEsTUFBYU4sVUFBVU0sRUFBZ0MsQ0FFdkQsQ0FNQSxNQUFhTCxXQUFXSyxFQUFnQyxDQUV4RCxDQU9PQyxhQUFnQkMsRUFBa0IsQ0FFdkNDLGNBQU9DLE9BQU8sS0FBS3RCLE9BQWtCb0IsQ0FBQUEsRUFHOUIsS0FBS3BCLE1BQ2QsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgInJlZ2lzdGVyU3ViQ29tbWFuZCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgInN1YlJlZ2lzdHJ5IiwgIm92ZXJsb2FkIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJyZXN1bHQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiaW1wb3J0X2ZzIiwgImltcG9ydF9wYXRoIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiZGF0YVBhdGgiLCAibG9nZ2VyIiwgInZhbGlkYXRlUGF0aCIsICJwYXRoIiwgImV4cGVjdGVkVHlwZSIsICJpc0Fic29sdXRlIiwgIndhcm4iLCAic3RhcnRzV2l0aCIsICJzZXAiLCAiaGFzRXh0ZW5zaW9uIiwgInRlc3QiLCAicmVhZEZpbGUiLCAiZW5jb2RpbmciLCAiZXhpc3RzU3luYyIsICJmdWxsUGF0aCIsICJyZXNvbHZlIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImRpclBhdGgiLCAic3Vic3RyaW5nIiwgImxhc3RJbmRleE9mIiwgIndyaXRlRmlsZVN5bmMiLCAicmVtb3ZlRmlsZSIsICJybVN5bmMiLCAibWtkaXIiLCAicm1kaXIiLCAib3B0aW9ucyIsICJmb3JjZSIsICJyZWFkRGlyIiwgInJlYWRkaXJTeW5jIiwgImV4aXN0cyIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJuYW1lIiwgImlzRmlsZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJmaWxlU3lzdGVtIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJPYmplY3QiLCAia2V5cyIsICJjb25maWciLCAid3JpdGVGaWxlU3luYyIsICJzdHJpbmdpZnkiLCAiZGF0YSIsICJhc3NpZ24iLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidGVtcCIsICJzbGljZSIsICJyZXBsYWNlIiwgIm5leHRUaWNrIiwgInVubGlua1N5bmMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInNvdXJjZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiZ2V0UHJvdG90eXBlT2YiLCAicGx1Z2luS2V5cyIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImV2ZW50S2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAicHJpb3JpdHkiLCAiUGx1Z2luUHJpb3JpdHkiLCAiTm9ybWFsIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJyZXNvdXJjZXMiLCAiU2V0IiwgImNvbmZpZyIsICJmaWxlU3lzdGVtIiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVzb2x2ZSIsICJwbHVnaW4iLCAicGx1Z2lucyIsICJnZXQiLCAiX3BsdWdpbiIsICJkZWZpbmVDb25maWciLCAiZGVmaW5pdGlvbiIsICJPYmplY3QiLCAiYXNzaWduIl0KfQo=