@serenityjs/plugins 0.8.17 → 0.8.18-beta-20260205000321
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/CHANGELOG.md +12 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +6 -6
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 f=(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{f(this,"PluginsEnum")}static identifier="plugins";static options=[]},O=class extends R.CustomEnum{static{f(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var Z=f((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{f(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{f(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"),p=this.loadFromTextSource(i,m,!0);p&&s.push(p);break}case w.HasResources:{let d=l.readVarInt(),m=l.readBuffer(d).toString("utf-8"),p=this.loadFromTextSource(i,m,!0);if(!p)break;s.push(p);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);p.logger.success(`Loaded resource pack \xA7u${E.name}\xA7r (\xA78${E.uuid}\xA7r).`),p.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${p.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(p=>p.isDirectory());for(let p of m)try{let y=this.serenity.resources.loadFromPath((0,n.resolve)(i,"resource_packs",p.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",p.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){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))}}}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(),p=o.readBuffer(m),y=this.serenity.resources.loadFromZip(p);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{f(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{f(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{f(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{f(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+IGIuaWRlbnRpZmllcikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsdWdpbnMsIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBvcmRlcmVkUGx1Z2lucykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgY29uZmlnIGRlZmluZWRcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwbHVnaW4uY29uZmlnIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBDcmVhdGUgdGhlIHBhdGggdG8gdGhlIHBsdWdpbiBjb25maWcgZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIFwiY29uZmlnc1wiLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0uanNvbmApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgY29uZmlnIGZpbGUgZXhpc3RzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICAgIC8vIFdyaXRlIHRoZSBkZWZhdWx0IGNvbmZpZyB0byB0aGUgY29uZmlnIGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIEpTT04uc3RyaW5naWZ5KHBsdWdpbi5jb25maWcsIG51bGwsIDIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBjb25maWcgZmlsZVxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCBcInV0Zi04XCIpKTtcblxuICAgICAgICAgIC8vIEFzc2lnbiB0aGUgY29uZmlnIGRhdGEgdG8gdGhlIHBsdWdpbiBjb25maWdcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbi5jb25maWcgYXMgb2JqZWN0LCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGJ1bmRsZWRcbiAgICAgIGlmIChwbHVnaW4uaXNCdW5kbGVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHRlbXAgPSByZXNvbHZlKHBsdWdpbi5wYXRoLnNsaWNlKDAsIC03KS5yZXBsYWNlKC9cXC4vZywgXCJfXCIpKTtcblxuICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlIGlmIGl0IGV4aXN0c1xuICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wKSkgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB1bmxpbmtTeW5jKHRlbXApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcGx1Z2luIGZyb20gYSB0ZXh0IHNvdXJjZS5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGNvZGUgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGlzQnVuZGxlZCBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgYnVuZGxlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgbG9hZEZyb21UZXh0U291cmNlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBpc0J1bmRsZWQgPSBmYWxzZVxuICApOiBQbHVnaW4gfCBudWxsIHtcbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgIGNvbnN0IHRlbXAgPSByZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpLnJlcGxhY2UoL1xcLi9nLCBcIl9cIikpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHNvdXJjZSB0byB0aGUgdGVtcG9yYXJ5IHBhdGhcbiAgICB3cml0ZUZpbGVTeW5jKHJlc29sdmUodGVtcCksIHNvdXJjZSk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHRlbXApKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAvLyBMb2cgdGhlIHdhcm5pbmcgdGhhdCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHRlbXApKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICBwbHVnaW4ucGF0aCA9IHJlc29sdmUocGF0aCk7XG4gICAgICBwbHVnaW4uaXNCdW5kbGVkID0gaXNCdW5kbGVkO1xuXG4gICAgICAvLyBTZXQgdGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luXG4gICAgICBwbHVnaW4uZmlsZVN5c3RlbSA9IG5ldyBQbHVnaW5GaWxlU3lzdGVtKFxuICAgICAgICByZXNvbHZlKHBsdWdpbi5wYXRoLCBcIi4uL2RhdGFcIiwgcGx1Z2luLmlkZW50aWZpZXIpLFxuICAgICAgICBwbHVnaW4ubG9nZ2VyXG4gICAgICApO1xuXG4gICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICB0aGlzLmxpbmtNb2R1bGUocGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHRlbXApKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgcGx1Z2luIGZhaWxlZCB0byBsb2FkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHBsdWdpbiwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBwbHVnaW4ucmVzb3VyY2VzKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICAgIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLnBhY2tzLmRlbGV0ZShyZXNvdXJjZS51dWlkKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpIGFzIFBsdWdpblR5cGUgfCBQbHVnaW5IZWFkZXI7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvdXJjZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIGxvYWQgb2YgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgICAgbmV3UGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICBuZXdQbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgcGFjayDCpzgke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBwYXRoKVxuICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtuZXdQbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBuZXdQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgbmV3UGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIG5ld1BsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgIG5ld1BsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgLy8gU2V0IHRoZSBmaWxlIHN5c3RlbSBmb3IgdGhlIHBsdWdpblxuICAgICAgbmV3UGx1Z2luLmZpbGVTeXN0ZW0gPSBuZXcgUGx1Z2luRmlsZVN5c3RlbShcbiAgICAgICAgcmVzb2x2ZShuZXdQbHVnaW4ucGF0aCwgXCIuLi9kYXRhXCIsIG5ld1BsdWdpbi5pZGVudGlmaWVyKSxcbiAgICAgICAgbmV3UGx1Z2luLmxvZ2dlclxuICAgICAgKTtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKG5ld1BsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQobmV3UGx1Z2luLmlkZW50aWZpZXIsIG5ld1BsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChuZXdQbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBsdWdpbiBoZWFkZXIgYmFzZWQgb24gdGhlIHJlc291cmNlc1xuICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICBwbHVnaW4ucmVzb3VyY2VzLnNpemUgPiAwXG4gICAgICAgID8gUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlc1xuICAgICAgICA6IFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlcztcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShoZWFkZXIpO1xuXG4gICAgLy8gU3dpdGNoIGJhc2VkIG9uIHRoZSBwbHVnaW4gaGVhZGVyXG4gICAgc3dpdGNoIChoZWFkZXIpIHtcbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgY29tcGlsZWQgaW5kZXggZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIsIFwiaW5kZXguanNcIik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocGF0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChpbmRleC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LXYke3BsdWdpbi52ZXJzaW9ufS5wbHVnaW5gKSxcbiAgICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgYW1vdW50IG9mIHJlc291cmNlcyB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChwbHVnaW4ucmVzb3VyY2VzLnNpemUpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN0cmVhbVxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBDb21wcmVzcyB0aGUgcmVzb3VyY2UgcGFjayBpbnRvIGEgYnVmZmVyXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVzb3VyY2UuY29tcHJlc3MoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludChidWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgYSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqIEBwYXJhbSBtb2R1bGUgVGhlIG1vZHVsZSB0byBsaW5rLlxuICAgKi9cbiAgcHVibGljIGxpbmtNb2R1bGUobmFtZTogc3RyaW5nLCBtb2R1bGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHJ1bnRpbWUgb2YgdGhlIHNlcnZlclxuICAgIGNvbnN0IGlzQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW4gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgIC8vIE1vZHVsZSBsaW5raW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIEJ1blxuICAgIGlmICghaXNCdW4pIHJldHVybjtcblxuICAgIC8vIEluamVjdCB0aGUgbW9kdWxlIGludG8gdGhlIEJ1biBwbHVnaW4gc3lzdGVtXG4gICAgQnVuLnBsdWdpbih7XG4gICAgICBuYW1lOiBgc2VyZW5pdHlqcy5wbHVnaW4uJHtuYW1lfWAsXG4gICAgICBzZXR1cChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIubW9kdWxlKG5hbWUsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhwb3J0czogbW9kdWxlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgbG9hZGVyOiBcIm9iamVjdFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iLCAiZW51bSBQbHVnaW5IZWFkZXIge1xuICBIYXNOb1Jlc291cmNlcyA9IDIsXG4gIEhhc1Jlc291cmNlcyA9IDNcbn1cblxuZXhwb3J0IHsgUGx1Z2luSGVhZGVyIH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcbiAgLyoqXG4gICAqIEEgbG93IHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBhZnRlciBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIHJlYWN0aW5nIHRvIGNoYW5nZXMgb3IgZmluYWwgYWRqdXN0bWVudHMuXG4gICAqL1xuICBMb3csXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciBhIHBsdWdpbi5cbiAgICogU3VpdGFibGUgZm9yIHN0YW5kYXJkIHBsdWdpbiBiZWhhdmlvci5cbiAgICovXG4gIE5vcm1hbCxcblxuICAvKipcbiAgICogQSBoaWdoIHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciBlYXJseSBzZXR1cCBvciBvdmVycmlkaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgSGlnaFxufVxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHJlYWRkaXJTeW5jXG59IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSwgc2VwLCBpc0Fic29sdXRlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5jbGFzcyBQbHVnaW5GaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRhUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luRmlsZVN5c3RlbSBjbGFzcy5cbiAgICogQHBhcmFtIGRhdGFQYXRoIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhUGF0aDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlcikge1xuICAgIHRoaXMuZGF0YVBhdGggPSBkYXRhUGF0aDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwYXRoIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGF0aChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZXhwZWN0ZWRUeXBlPzogXCJmaWxlXCIgfCBcImRpcmVjdG9yeVwiXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyBhYnNvbHV0ZVxuICAgIGlmICghaXNBYnNvbHV0ZShwYXRoKSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEF0dGVtcHRlZCB0byBhY2Nlc3MgaW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIG11c3QgYmUgYWJzb2x1dGUuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHBhdGggaXMgd2l0aGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeVxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGggKyBzZXApKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgSW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgcGF0aCBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5XG4gICAgY29uc3QgZmlsZVJlZ2V4ID0gLy4qXFwuLisvOyAvLyBNYXRjaGVzIHBhdGhzIHdpdGggYSBkb3QgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgY2hhcmFjdGVyc1xuICAgIGNvbnN0IGhhc0V4dGVuc2lvbiA9IGZpbGVSZWdleC50ZXN0KHBhdGgpO1xuICAgIGlmIChcbiAgICAgIChleHBlY3RlZFR5cGUgPT09IFwiZmlsZVwiICYmICFoYXNFeHRlbnNpb24pIHx8XG4gICAgICAoZXhwZWN0ZWRUeXBlID09PSBcImRpcmVjdG9yeVwiICYmIGhhc0V4dGVuc2lvbilcbiAgICApIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBJbnZhbGlkIHBhdGg6ICR7cGF0aH0uIFBhdGggaXMgbm90IGEgdmFsaWQgJHtleHBlY3RlZFR5cGV9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBmaWxlIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkLlxuICAgKiBAcGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwgZW5jb2RpbmcuIElmIHByb3ZpZGVkLCByZXR1cm5zIGEgc3RyaW5nOyBvdGhlcndpc2UsIHJldHVybnMgYSBCdWZmZXIuXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGRhdGEgaWYgaXQgZXhpc3RzIGFuZCBpcyB2YWxpZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVhZEZpbGUocGF0aDogc3RyaW5nKTogQnVmZmVyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRGaWxlKHBhdGg6IHN0cmluZywgZW5jb2Rpbmc6IEJ1ZmZlckVuY29kaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIHJlYWRGaWxlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nXG4gICk6IEJ1ZmZlciB8IHN0cmluZyB8IG51bGwge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJmaWxlXCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlYWQgYW5kIHJldHVybiB0aGUgZmlsZSBkYXRhXG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhmdWxsUGF0aCwgZW5jb2RpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgZmlsZS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0LCBtYWtlIHRoZSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyh0aGlzLmRhdGFQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImZpbGVcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG5cbiAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgZXhpc3RzXG4gICAgY29uc3QgZGlyUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cmluZygwLCBmdWxsUGF0aC5sYXN0SW5kZXhPZihzZXApKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyUGF0aCkpIG1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFdyaXRlIHRoZSBmaWxlIGRhdGFcbiAgICByZXR1cm4gd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGZpbGUgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVGaWxlKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gZGF0YSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZmlsZVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlsZVxuICAgIHJldHVybiBybVN5bmMoZnVsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGNyZWF0ZWQgZGlyZWN0b3J5IGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gICAqL1xuICBwdWJsaWMgbWtkaXIocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0LCBtYWtlIHRoZSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyh0aGlzLmRhdGFQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuXG4gICAgLy8gTWFrZSB0aGUgZGlyZWN0b3J5XG4gICAgcmV0dXJuIG1rZGlyU3luYyhmdWxsUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGRpcmVjdG9yeSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIHRvIGZvcmNlZnVsbHkgcmVtb3ZlIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50cy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgcm1kaXIoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgcmVjdXJzaXZlOiBib29sZWFuOyBmb3JjZTogYm9vbGVhbiB9ID0ge1xuICAgICAgcmVjdXJzaXZlOiBmYWxzZSxcbiAgICAgIGZvcmNlOiBmYWxzZVxuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBkYXRhIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImRpcmVjdG9yeVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBkaXJlY3RvcnlcbiAgICByZXR1cm4gcm1TeW5jKGZ1bGxQYXRoLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgb3IgbnVsbCBpZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZERpcihwYXRoOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgbnVsbCB7XG4gICAgLy8gRW5zdXJlIHRoZSBwbHVnaW4gZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZGlyZWN0b3J5XCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmVhZCBhbmQgcmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGVudHNcbiAgICByZXR1cm4gcmVhZGRpclN5bmMoZnVsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGZpbGUgb3IgZGlyZWN0b3J5IGV4aXN0cyBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBleGlzdHNcbiAgICByZXR1cm4gZXhpc3RzU3luYyhmdWxsUGF0aCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRmlsZVN5c3RlbSB9O1xuIiwgImltcG9ydCB7IFJlc291cmNlUGFjaywgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcbmltcG9ydCB7IFBsdWdpbkZpbGVTeXN0ZW0gfSBmcm9tIFwiLi9maWxlLXN5c3RlbVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwcmlvcml0eTogUGx1Z2luUHJpb3JpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtYXhMaXN0ZW5lcnM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiAjIEludHJvZHVjdGlvblxuICogUGx1Z2lucyBhcmUgdGhlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBTZXJlbml0eUpTLlxuICogVGhleSBhcmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIGFsbG93cyB0b3RhbCBjb250cm9sIG92ZXIgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGVyZSBhcmUgMiB0eXBlcyBvZiBwbHVnaW5zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGBQbHVnaW5UeXBlYCBlbnVtOiBgQWRkb25gICYgYEFwaWBcbiAqXG4gKiBBZGRvbiBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbm5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqIEFwaSBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW4gZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKlxuICogIyMgQ2xhc3MgRXh0ZW5kaW5nIFBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IFBsdWdpbiwgUGx1Z2luVHlwZSwgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIkBzZXJlbml0eWpzL3BsdWdpbnNcIjtcbiAqXG4gKiBjbGFzcyBTYW1wbGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICogICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IFBsdWdpblR5cGUuQWRkb247XG4gKlxuICogICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJzYW1wbGUtcGx1Z2luXCIsIFwiMS4wLjBcIik7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBvbkluaXRpYWxpemUoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU3RhcnRVcCgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TaHV0RG93bigpOiB2b2lkIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgbmV3IFNhbXBsZVBsdWdpbigpO1xuICogYGBgXG4gKi9cbmNsYXNzIFBsdWdpbjxUID0gdW5rbm93bj4gZXh0ZW5kcyBFbWl0dGVyPFQ+IGltcGxlbWVudHMgUGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5ID0gUGx1Z2luUHJpb3JpdHkuTm9ybWFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBhY2tzIHByb3ZpZGVkIGJ5IHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VzID0gbmV3IFNldDxSZXNvdXJjZVBhY2s+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IHVua25vd24gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgZmlsZVN5c3RlbSE6IFBsdWdpbkZpbGVTeXN0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxQbHVnaW5PcHRpb25zPlxuICApIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2Qgd2l0aCB0aGUgbWF4IGxpc3RlbmVyc1xuICAgIHN1cGVyKG9wdGlvbnM/Lm1heExpc3RlbmVycyk7XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgb3B0aW9ucz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IG9wdGlvbnMub25Jbml0aWFsaXplO1xuICAgIGlmIChvcHRpb25zPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gb3B0aW9ucy5vblN0YXJ0VXA7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IG9wdGlvbnMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcGx1Z2luIGJ5IGl0cyBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4gdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpbnN0YW5jZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUIGV4dGVuZHMgUGx1Z2luPihpZGVudGlmaWVyOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGlzIGRlZmluZWQuXG4gICAgaWYgKCF0aGlzLnBpcGVsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgY29uc3QgcGx1Z2luID0gdGhpcy5waXBlbGluZS5wbHVnaW5zLmdldChpZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgZGVmaW5lZFxuICAgIGlmICghcGx1Z2luKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJldHVybiB0aGUgcGx1Z2luXG4gICAgcmV0dXJuIHBsdWdpbiBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TdGFydFVwKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGNvbmZpZyBmb3IgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGRlZmluaXRpb24gVGhlIGNvbmZpZyBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmlnIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBkZWZpbmVDb25maWc8VD4oZGVmaW5pdGlvbjogVCk6IFQge1xuICAgIC8vIEFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBjb25maWcgb2JqZWN0XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmNvbmZpZyBhcyBvYmplY3QsIGRlZmluaXRpb24pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb25maWcgb2JqZWN0XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI0ZEFBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsK0JBQUFFLEVBQUEsYUFBQUMsRUFBQSxXQUFBQyxFQUFBLHFCQUFBQyxFQUFBLGlCQUFBQyxFQUFBLG1CQUFBQyxFQUFBLGVBQUFDLElBQUEsZUFBQUMsRUFBQVQsR0NDQSxJQUFBVSxFQU9PLGNBQ1BDLEVBQWtDLGdCQUNsQ0MsRUFBeUMsZ0JBRXpDQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZDdCLElBQUFDLEVBQXlCLGdCQ0F6QixJQUFBQyxFQUEyQiw0QkFFM0IsSUFBTUMsRUFBTixjQUEwQkMsWUFBQUEsQ0FGMUIsTUFFMEJBLENBQUFBLEVBQUFBLG9CQUN4QixPQUF1QkMsV0FBYSxVQUNwQyxPQUF1QkMsUUFBeUIsQ0FBQSxDQUNsRCxFQUVNQyxFQUFOLGNBQWdDSCxZQUFBQSxDQVBoQyxNQU9nQ0EsQ0FBQUEsRUFBQUEsMEJBQzlCLE9BQXVCQyxXQUFhLGlCQUNwQyxPQUF1QkMsUUFBeUIsQ0FBQyxPQUFRLFNBQVUsU0FDckUsRURGQSxJQUFNRSxFQUFXQyxFQUFBLENBQUNDLEVBQWNDLElBQUFBLENBQzlCRCxFQUFNRSxlQUFlSixTQUNuQixVQUNBLDBDQUNDSyxHQUFBQSxDQUVDQSxFQUFTQyxZQUFjLENBQUMscUJBR3hCRCxFQUFTRSxTQUNQLENBQ0VDLE9BQVFDLENBQ1YsRUFDQSxDQUFDLENBQUVELE9BQUFBLENBQU0sSUFBRSxDQUVULEdBQUlBLEVBQU9FLFNBQVcsT0FBUSxPQUc5QixHQUFJUCxFQUFTUSxRQUFRQyxPQUFTLEVBQzVCLE1BQU8sQ0FDTEMsUUFBUyx5REFDWCxFQUdGLElBQU1GLEVBQVUsSUFBSVIsRUFBU1EsUUFBUUcsT0FBTSxHQUdyQ0QsRUFBVSxDQUFBLEVBR2hCLFFB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UCxZQUNFbkIsRUFDQUMsRUFDQW1CLEVBQ0EsQ0FFQSxNQUFNQSxHQUFTQyxZQUFBQSxFQUdmLEtBQUtyQixXQUFhQSxFQUNsQixLQUFLQyxRQUFVQSxFQUdmLEtBQUtDLE9BQ0hrQixHQUFTbEIsUUFDVCxJQUFJb0IsU0FBTyxHQUFHdEIsQ0FBQUEsSUFBY0MsQ0FBQUEsR0FBV3NCLGVBQWFDLElBQUksRUFHdERKLEdBQVNLLGVBQWMsS0FBS0EsYUFBZUwsRUFBUUssY0FDbkRMLEdBQVNNLFlBQVcsS0FBS0EsVUFBWU4sRUFBUU0sV0FDN0NOLEdBQVNPLGFBQVksS0FBS0EsV0FBYVAsRUFBUU8sV0FDckQsQ0FPT0MsUUFBMEI1QixFQUE4QixDQUU3RCxHQUFJLENBQUMsS0FBS2tCLFNBQVUsT0FBTyxLQUczQixJQUFNVyxFQUFTLEtBQUtYLFNBQVNZLFFBQVFDLElBQUkvQixDQUFBQSxFQUd6QyxPQUFLNkIsR0FBZSxJQUl0QixDQU1PSixhQUFhTyxFQUF1QixDQUUzQyxDQU1PTixVQUFVTSxFQUF1QixDQUV4QyxDQU1PTCxXQUFXSyxFQUF1QixDQUV6QyxDQU9PQyxhQUFnQkMsRUFBa0IsQ0FFdkNDLGNBQU9DLE9BQU8sS0FBS3RCLE9BQWtCb0IsQ0FBQUEsRUFHOUIsS0FBS3BCLE1BQ2QsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiaW1wb3J0X2ZzIiwgImltcG9ydF9wYXRoIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiZGF0YVBhdGgiLCAibG9nZ2VyIiwgInZhbGlkYXRlUGF0aCIsICJwYXRoIiwgImV4cGVjdGVkVHlwZSIsICJpc0Fic29sdXRlIiwgIndhcm4iLCAic3RhcnRzV2l0aCIsICJzZXAiLCAiaGFzRXh0ZW5zaW9uIiwgInRlc3QiLCAicmVhZEZpbGUiLCAiZW5jb2RpbmciLCAiZXhpc3RzU3luYyIsICJmdWxsUGF0aCIsICJyZXNvbHZlIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImRpclBhdGgiLCAic3Vic3RyaW5nIiwgImxhc3RJbmRleE9mIiwgIndyaXRlRmlsZVN5bmMiLCAicmVtb3ZlRmlsZSIsICJybVN5bmMiLCAibWtkaXIiLCAicm1kaXIiLCAib3B0aW9ucyIsICJmb3JjZSIsICJyZWFkRGlyIiwgInJlYWRkaXJTeW5jIiwgImV4aXN0cyIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJuYW1lIiwgImlzRmlsZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJmaWxlU3lzdGVtIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJPYmplY3QiLCAia2V5cyIsICJjb25maWciLCAid3JpdGVGaWxlU3luYyIsICJzdHJpbmdpZnkiLCAiZGF0YSIsICJhc3NpZ24iLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidGVtcCIsICJzbGljZSIsICJyZXBsYWNlIiwgIm5leHRUaWNrIiwgInVubGlua1N5bmMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInNvdXJjZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiZ2V0UHJvdG90eXBlT2YiLCAicGx1Z2luS2V5cyIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImV2ZW50S2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAicHJpb3JpdHkiLCAiUGx1Z2luUHJpb3JpdHkiLCAiTm9ybWFsIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJyZXNvdXJjZXMiLCAiU2V0IiwgImNvbmZpZyIsICJmaWxlU3lzdGVtIiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVzb2x2ZSIsICJwbHVnaW4iLCAicGx1Z2lucyIsICJnZXQiLCAiX3BsdWdpbiIsICJkZWZpbmVDb25maWciLCAiZGVmaW5pdGlvbiIsICJPYmplY3QiLCAiYXNzaWduIl0KfQo=
|
|
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+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBFbnRpdHlUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjRkQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSwrQkFBQUUsRUFBQSxhQUFBQyxFQUFBLFdBQUFDLEVBQUEscUJBQUFDLEVBQUEsaUJBQUFDLEVBQUEsbUJBQUFDLEVBQUEsZUFBQUMsSUFBQSxlQUFBQyxFQUFBVCxHQ0NBLElBQUFVLEVBT08sY0FDUEMsRUFBa0MsZ0JBQ2xDQyxFQUF5QyxnQkFFekNDLEVBQXFDLDhCQUNyQ0MsRUFBa0QsNEJBQ2xEQyxFQUE2QixvQ0NkN0IsSUFBQUMsRUFBeUIsZ0JDQXpCLElBQUFDLEVBQTJCLDRCQUUzQixJQUFNQyxFQUFOLGNBQTBCQyxZQUFBQSxDQUYxQixNQUUwQkEsQ0FBQUEsRUFBQUEsb0JBQ3hCLE9BQXVCQyxXQUFhLFVBQ3BDLE9BQXVCQyxRQUF5QixDQUFBLENBQ2xELEVBRU1DLEVBQU4sY0FBZ0NILFlBQUFBLENBUGhDLE1BT2dDQSxDQUFBQSxFQUFBQSwwQkFDOUIsT0FBdUJDLFdBQWEsaUJBQ3BDLE9BQXVCQyxRQUF5QixDQUFDLE9BQVEsU0FBVSxTQUNyRSxFREZBLElBQU1FLEVBQVdDLEVBQUEsQ0FBQ0MsRUFBY0MsSUFBQUEsQ0FDOUJELEVBQU1FLGVBQWVKLFNBQ25CLFVBQ0EsMENBQ0NLLEdBQUFBLENBRUNBLEVBQVNDLFlBQWMsQ0FBQyxxQkFHeEJELEVBQVNFLFNBQ1AsQ0FDRUMsT0FBUUMsQ0FDVixFQUNBLENBQUMsQ0FBRUQsT0FBQUEsQ0FBTSxJQUFFLENBRVQsR0FBSUEsRUFBT0UsU0FBVyxPQUFRLE9BRzlCLEdBQUlQLEVBQVNRLFFBQVFDLE9BQVMsRUFDNUIsTUFBTyxDQUNMQyxRQUFTLHlEQUNYLEVBR0YsSUFBTUYsRUFBVSxJQUFJUixFQUFTUSxRQUFRRyxPQUFNLEdBR3JDRCxFQUFVLENBQUEsRUFHaEIsUUFBV0UsS0FBVUosRUFFbkJFLEVBQVFHLEtBQUssUUFBS0QsRUFBT0UsVUFBVSxLQUFLRixFQUFPRyxPQUFPLE9BQUksRUFJNUQsTUFBTyxDQUNMTCxRQUFTLHdCQUFxQkYsRUFBUVEsTUFBTSxXQUFRTixFQUFRTyxLQUFLLGNBQUEsQ0FBQSxFQUNuRSxDQUNGLENBQUEsRUFHRmYsRUFBU0UsU0FDUCxDQUNFQyxPQUFRQyxFQUNSTSxPQUFRTSxDQUNWLEVBQ0EsQ0FBQyxDQUFFYixPQUFBQSxFQUFRTyxPQUFBQSxDQUFNLElBQUUsQ0FFakIsR0FBSVAsRUFBT0UsU0FBVyxVQUFZRixFQUFPRSxTQUFXLFNBQVUsT0FHOUQsSUFBTVksRUFBaUJuQixFQUFTUSxRQUFRWSxJQUFJUixFQUFPTCxNQUFNLEVBR3pELEdBQUksQ0FBQ1ksRUFDSCxNQUFNLElBQUlFLE1BQU0sVUFBVVQsRUFBT0wsTUFBTSxnQkFBZ0IsRUFHekQsR0FBSUYsRUFBT0UsU0FBVyxTQUVwQlAsT0FBQUEsRUFBU3NCLE9BQU9ILENBQUFBLEVBR1QsQ0FDTFQsUUFBUyxtQ0FBNkJTLEVBQWVMLFVBQVUsUUFDakUsRUFFQSxHQUFJSyxFQUFlSSxVQUVqQixNQUFNLElBQUlGLE1BQ1IsVUFBVUYsRUFBZUwsVUFBVSx3REFBd0QsRUFJL0ZkLE9BQUFBLEVBQVN3QixPQUFPTCxDQUFBQSxFQUdULENBQ0xULFFBQVMsa0NBQTRCUyxFQUFlTCxVQUFVLDRDQUFtQ1csWUFBU0MsUUFBUUMsSUFBRyxFQUFJM0IsRUFBUzRCLElBQUksQ0FBQSxRQUN4SSxDQUVKLENBQUEsQ0FFSixFQUNBLElBQUEsQ0FDRSxNQUFNLElBQUlQLE1BQU0sNkNBQUEsQ0FDbEIsQ0FBQSxDQUVKLEVBekZpQixZQTJGakJRLEVBQWVoQyxFRW5HZixJQUFLaUMsRUFBQUEsU0FBQUEsRUFBQUEsa0ZBQUFBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDUUwsSUFBS0MsRUFBQUEsU0FBQUEsRUFBQUEsQ0FJRixPQUFBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BTUFBLEVBQUFBLEVBQUEsT0FBQSxDQUFBLEVBQUEsU0FNQUEsRUFBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxPQWhCRUEsR0FBQUEsR0FBQUEsQ0FBQUEsQ0FBQUEsRUNMTCxJQUFLQyxFQUFBQSxTQUFBQSxFQUFBQSxDQUdGLE9BQUFBLEVBQUFBLEVBQUEsTUFBQSxDQUFBLEVBQUEsUUFLQUEsRUFBQUEsRUFBQSxJQUFBLENBQUEsRUFBQSxNQVJFQSxHQUFBQSxHQUFBQSxDQUFBQSxDQUFBQSxFQ0hMLElBQUFDLEVBT08sY0FDUEMsRUFBeUMsZ0JBSXpDLElBQU1DLEVBQU4sS0FBTUEsQ0FaTixNQVlNQSxDQUFBQSxFQUFBQSx5QkFJWUMsU0FLQ0MsT0FNakIsWUFBbUJELEVBQWtCQyxFQUFnQixDQUNuRCxLQUFLRCxTQUFXQSxFQUNoQixLQUFLQyxPQUFTQSxDQUNoQixDQU9RQyxhQUNOQyxFQUNBQyxFQUNTLENBRVQsR0FBSSxJQUFDQyxjQUFXRixDQUFBQSxFQUNkLFlBQUtGLE9BQU9LLEtBQ1YscUNBQXFDSCxDQUFBQSwwQkFBOEIsRUFFOUQsR0FJVCxHQUFJLENBQUNBLEVBQUtJLFdBQVcsS0FBS1AsU0FBV1EsS0FBQUEsRUFDbkMsWUFBS1AsT0FBT0ssS0FDVixpQkFBaUJILENBQUFBLG9EQUF3RCxFQUVwRSxHQUtULElBQU1NLEVBRFksU0FDYUMsS0FBS1AsQ0FBQUEsRUFDcEMsT0FDR0MsSUFBaUIsUUFBVSxDQUFDSyxHQUM1QkwsSUFBaUIsYUFBZUssR0FFakMsS0FBS1IsT0FBT0ssS0FDVixpQkFBaUJILENBQUFBLHlCQUE2QkMsQ0FBQUEsR0FBZSxFQUV4RCxJQUdGLEVBQ1QsQ0FVT08sU0FDTFIsRUFDQVMsRUFDd0IsQ0FFeEIsR0FBSSxJQUFDQyxjQUFXLEtBQUtiLFFBQVEsRUFBRyxPQUFPLEtBR3ZDLElBQU1jLEtBQVdDLFdBQVEsS0FBS2YsU0FBVUcsQ0FBQUEsRUFPeEMsTUFISSxDQURZLEtBQUtELGFBQWFZLEVBQVUsTUFBQSxHQUl4QyxJQUFDRCxjQUFXQyxDQUFBQSxFQUFrQixRQUczQkUsZ0JBQWFGLEVBQVVGLENBQUFBLENBQ2hDLENBUU9LLFVBQVVkLEVBQWNlLEVBQTZCLElBRXJETCxjQUFXLEtBQUtiLFFBQVEsTUFFM0JtQixhQUFVLEtBQUtuQixTQUFVLENBQUVvQixVQUFXLEVBQUssQ0FBQSxFQUc3QyxJQUFNTixLQUFXQyxXQUFRLEtBQUtmLFNBQVVHLENBQUFBLEVBSXhDLEdBQUksQ0FEWSxLQUFLRCxhQUFhWSxFQUFVLE1BQUEsRUFDOUIsT0FHZCxJQUFNTyxFQUFVUCxFQUFTUSxVQUFVLEVBQUdSLEVBQVNTLFlBQVlmLEtBQUFBLENBQUFBLEVBQzNELFNBQUtLLGNBQVdRLENBQUFBLE1BQVVGLGFBQVVFLEVBQVMsQ0FBRUQsVUFBVyxFQUFLLENBQUEsS0FHeERJLGlCQUFjVixFQUFVSSxDQUFBQSxDQUNqQyxDQU1PTyxXQUFXdEIsRUFBb0IsQ0FFcEMsR0FBSSxJQUFDVSxjQUFXLEtBQUtiLFFBQVEsRUFBRyxPQUdoQyxJQUFNYyxLQUFXQyxXQUFRLEtBQUtmLFNBQVVHLENBQUFBLEVBSXhDLEdBRGdCLEtBQUtELGFBQWFZLEVBQVUsTUFBQSxNQUl2Q0QsY0FBV0MsQ0FBQUEsRUFHaEIsU0FBT1ksVUFBT1osQ0FBQUEsQ0FDaEIsQ0FPT2EsTUFBTXhCLEVBQWtDLElBRXhDVSxjQUFXLEtBQUtiLFFBQVEsTUFFM0JtQixhQUFVLEtBQUtuQixTQUFVLENBQUVvQixVQUFXLEVBQUssQ0FBQSxFQUc3QyxJQUFNTixLQUFXQyxXQUFRLEtBQUtmLFNBQVVHLENBQUFBLEVBSXhDLEdBRGdCLEtBQUtELGFBQWFZLENBQUFBLEVBSWxDLFNBQU9LLGFBQVVMLEVBQVUsQ0FBRU0sVUFBVyxFQUFLLENBQUEsQ0FDL0MsQ0FPT1EsTUFDTHpCLEVBQ0EwQixFQUFrRCxDQUNoRFQsVUFBVyxHQUNYVSxNQUFPLEVBQ1QsRUFDTSxDQUVOLEdBQUksSUFBQ2pCLGNBQVcsS0FBS2IsUUFBUSxFQUFHLE9BR2hDLElBQU1jLEtBQVdDLFdBQVEsS0FBS2YsU0FBVUcsQ0FBQUEsRUFJeEMsR0FEZ0IsS0FBS0QsYUFBYVksRUFBVSxXQUFBLE1BSXZDRCxjQUFXQyxDQUFBQSxFQUdoQixTQUFPWSxVQUFPWixFQUFVZSxDQUFBQSxDQUMxQixDQU9PRSxRQUFRNUIsRUFBb0MsQ0FFakQsR0FBSSxJQUFDVSxjQUFXLEtBQUtiLFFBQVEsRUFBRyxPQUFPLEtBR3ZDLElBQU1jLEtBQVdDLFdBQVEsS0FBS2YsU0FBVUcsQ0FBQUEsRUFPeEMsTUFISSxDQURZLEtBQUtELGFBQWFZLEVBQVUsV0FBQSxHQUl4QyxJQUFDRCxjQUFXQyxDQUFBQSxFQUFrQixRQUczQmtCLGVBQVlsQixDQUFBQSxDQUNyQixDQU9PbUIsT0FBTzlCLEVBQXVCLENBRW5DLEdBQUksSUFBQ1UsY0FBVyxLQUFLYixRQUFRLEVBQUcsTUFBTyxHQUd2QyxJQUFNYyxLQUFXQyxXQUFRLEtBQUtmLFNBQVVHLENBQUFBLEVBSXhDLE9BRGdCLEtBQUtELGFBQWFZLENBQUFBLEtBSTNCRCxjQUFXQyxDQUFBQSxFQUhHLEVBSXZCLENBQ0YsRU52TkEsSUFBTW9CLEVBQWdELENBQ3BEQyxLQUFNLFlBQ05DLFNBQVUsR0FDVkMsV0FBWSxFQUNkLEVBRU1DLEVBQU4sS0FBTUEsQ0FuQ04sTUFtQ01BLENBQUFBLEVBQUFBLGlCQUllQyxTQUtBQyxXQUtIQyxPQUFTLElBQUlDLFNBQU8sVUFBV0MsZUFBYUMsYUFBYSxFQUt6REMsUUFBVSxJQUFJQyxJQUtkQyxJQUNkLE9BQU9DLE9BQVcsS0FBZUEsUUFBUUMsVUFBWUEsUUFLdkQsSUFBV2QsTUFBZSxDQUN4QixPQUFPLEtBQUtLLFdBQVdMLElBQ3pCLENBS0EsSUFBV0EsS0FBS2UsRUFBRyxDQUNqQixNQUFNLElBQUlDLE1BQU0saUNBQUEsQ0FDbEIsQ0FPQSxZQUNFWixFQUNBQyxFQUNBLENBRUEsS0FBS0QsU0FBV0EsRUFHaEIsS0FBS0MsV0FBYSxDQUFFLEdBQUdOLEVBQTJCLEdBQUdNLENBQVcsRUFHaEVELEVBQVNhLEdBQUdDLGNBQVlDLE1BQU8sS0FBS0MsTUFBTUMsS0FBSyxJQUFJLENBQUEsRUFDbkRqQixFQUFTYSxHQUFHQyxjQUFZSSxLQUFNLEtBQUtDLEtBQUtGLEtBQUssSUFBSSxDQUFBLEVBR2pEakIsRUFBU2EsR0FBR08sYUFBV0MsZ0JBQWlCLENBQUMsQ0FBRUMsTUFBQUEsQ0FBSyxJQUFFLENBRTVDLEtBQUtyQixXQUFXSixVQUFVMEIsRUFBUUQsRUFBTyxJQUFJLEVBR2pELE9BQVcsQ0FBQSxDQUFHRSxDQUFBQSxJQUFXLEtBQUtsQixRQUU1QmdCLEVBQU1HLGFBQ0hDLGFBQVksR0FBSUYsRUFBT0csT0FBT0MsS0FBSyxFQUNuQ0MsY0FBYSxHQUFJTCxFQUFPRyxPQUFPRyxNQUFNLEVBR3hDUixFQUFNUyxZQUNITCxhQUFZLEdBQUlGLEVBQU9RLE1BQU1KLEtBQUssRUFDbENDLGNBQWEsR0FBSUwsRUFBT1EsTUFBTUYsTUFBTSxFQUd2Q1IsRUFBTVcsY0FDSFAsYUFBWSxHQUFJRixFQUFPVSxTQUFTTixLQUFLLEVBQ3JDQyxjQUFhLEdBQUlMLEVBQU9VLFNBQVNKLE1BQU0sQ0FFOUMsQ0FBQSxFQUdJLEtBQUs3QixXQUFXSCxZQUFZLEtBQUtBLFdBQVUsQ0FDakQsQ0FLT0EsWUFBbUIsSUFFbkJxQyxpQkFBV0MsV0FBUSxLQUFLeEMsSUFBSSxDQUFBLE1BRS9CeUMsZ0JBQVVELFdBQVEsS0FBS3hDLElBQUksRUFBRyxDQUFFMEMsVUFBVyxFQUFLLENBQUEsS0FHN0NILGlCQUFXQyxXQUFRLEtBQUt4QyxLQUFNLE1BQUEsQ0FBQSxNQUVqQ3lDLGdCQUFVRCxXQUFRLEtBQUt4QyxLQUFNLE1BQUEsRUFBUyxDQUFFMEMsVUFBVyxFQUFLLENBQUEsS0FHckRILGlCQUFXQyxXQUFRLEtBQUt4QyxLQUFNLFNBQUEsQ0FBQSxNQUVqQ3lDLGdCQUFVRCxXQUFRLEtBQUt4QyxLQUFNLFNBQUEsRUFBWSxDQUFFMEMsVUFBVyxFQUFLLENBQUEsRUFhN0QsSUFBTUMsS0FUVUMsa0JBQVlKLFdBQVEsS0FBS3hDLElBQUksRUFBRyxDQUM5QzZDLGNBQWUsRUFDakIsQ0FBQSxFQUFHQyxPQUFRQyxHQUNUQSxFQUFPQyxZQUFXLEVBQ2RELEVBQU9FLE9BQVMsUUFBVUYsRUFBT0UsT0FBUyxVQUMxQyxFQUFBLEVBSWtCSCxPQUFRQyxHQUU5QkEsRUFBT0csT0FBTSxFQUFLSCxFQUFPRSxLQUFLRSxTQUFTLFNBQUEsRUFBYSxFQUFBLEVBSWhEQyxFQUFnQyxDQUFBLEVBR3RDLFFBQVdDLEtBQVVWLEVBRW5CLEdBQUksQ0FFRixJQUFNM0MsS0FBT3dDLFdBQVEsS0FBS3hDLEtBQU1xRCxFQUFPSixJQUFJLEVBR3JDSyxLQUFTQyxrQkFBWUMsZ0JBQWF4RCxDQUFBQSxDQUFBQSxFQUNsQ3lELEVBQVMsSUFBSUMsZUFBYUosQ0FBQUEsRUFLaEMsT0FGYUcsRUFBT0UsU0FBUSxFQUVwQkMsQ0FDTixLQUFLQyxFQUFhQyxlQUFnQixDQUVoQyxJQUFNQyxFQUFTTixFQUFPTyxXQUFVLEVBRzFCQyxFQUFRUixFQUFPUyxXQUFXSCxDQUFBQSxFQUFRSSxTQUFTLE9BQUEsRUFHM0N2QyxFQUFTLEtBQUt3QyxtQkFBbUJwRSxFQUFNaUUsRUFBTyxFQUFBLEVBR2hEckMsR0FBUXdCLEVBQWVpQixLQUFLekMsQ0FBQUEsRUFHaEMsS0FDRixDQUVBLEtBQUtpQyxFQUFhUyxhQUFjLENBRTlCLElBQU1QLEVBQVNOLEVBQU9PLFdBQVUsRUFHMUJDLEVBQVFSLEVBQU9TLFdBQVdILENBQUFBLEVBQVFJLFNBQVMsT0FBQSxFQUczQ3ZDLEVBQVMsS0FBS3dDLG1CQUFtQnBFLEVBQU1pRSxFQUFPLEVBQUEsRUFHcEQsR0FBSSxDQUFDckMsRUFBUSxNQUdid0IsRUFBZWlCLEtBQUt6QyxDQUFBQSxFQUdwQixJQUFNMkMsRUFBWWQsRUFBT08sV0FBVSxFQUduQyxRQUFTUSxFQUFJLEVBQUdBLEVBQUlELEVBQVdDLElBRTdCLEdBQUksQ0FFRixJQUFNVCxFQUFTTixFQUFPTyxXQUFVLEVBRzFCVixFQUFTRyxFQUFPUyxXQUFXSCxDQUFBQSxFQUczQlUsRUFBVyxLQUFLckUsU0FBU21FLFVBQVVHLFlBQVlwQixDQUFBQSxFQUdyRDFCLEVBQU90QixPQUFPcUUsUUFDWiw2QkFBMEJGLEVBQVN4QixJQUFJLGVBQVN3QixFQUFTRyxJQUFJLFNBQU0sRUFJckVoRCxFQUFPMkMsVUFBVU0sSUFBSUosQ0FBQUEsQ0FDdkIsT0FBU0ssRUFBUSxDQUVmLEtBQUt4RSxPQUFPeUUsTUFDVix3Q0FBa0NDLFlBQ2hDQyxRQUFRQyxJQUFHLEtBQ1gxQyxXQUFRLEtBQUt4QyxLQUFNcUQsRUFBT0osSUFBSSxDQUFBLENBQUEseUJBQ1pyQixFQUFPdUQsVUFBVSxTQUNyQ0wsQ0FBQUEsQ0FFSixDQUlGLEtBQ0YsQ0FHQSxLQUFLTSxFQUFXQyxNQUFPLENBRXJCLEtBQUsvRSxPQUFPZ0YsS0FDVixzQkFBZ0JOLFlBQ2RDLFFBQVFDLElBQUcsS0FDWDFDLFdBQVEsS0FBS3hDLEtBQU1xRCxFQUFPSixJQUFJLENBQUEsQ0FBQSx5R0FDdUUsRUFJekcsSUFBTWdCLEVBQVFSLEVBQU84QixvQkFBbUIsRUFBR3BCLFNBQVMsT0FBQSxFQUc5Q3ZDLEVBQVMsS0FBS3dDLG1CQUFtQnBFLEVBQU1pRSxFQUFPLEVBQUEsRUFHaERyQyxHQUFRd0IsRUFBZWlCLEtBQUt6QyxDQUFBQSxFQUdoQyxLQUNGLENBR0EsS0FBS3dELEVBQVdJLElBRWQsS0FBS2xGLE9BQU95RSxNQUNWLHNCQUFnQkMsWUFDZEMsUUFBUUMsSUFBRyxLQUNYMUMsV0FBUSxLQUFLeEMsS0FBTXFELEVBQU9KLElBQUksQ0FBQSxDQUFBLDRJQUMwRyxDQUdoSixDQUNGLE9BQVM2QixFQUFRLENBRWYsS0FBS3hFLE9BQU95RSxNQUNWLGtDQUErQkMsWUFBU0MsUUFBUUMsSUFBRyxLQUFJMUMsV0FBUSxLQUFLeEMsS0FBTXFELEVBQU9KLElBQUksQ0FBQSxDQUFBLDBCQUNyRjZCLENBQUFBLENBRUosQ0FJRixJQUFNVyxLQUFjN0Msa0JBQVlKLFdBQVEsS0FBS3hDLElBQUksRUFBRyxDQUNsRDZDLGNBQWUsRUFDakIsQ0FBQSxFQUFHQyxPQUFRQyxHQUFXQSxFQUFPQyxZQUFXLENBQUEsRUFHeEMsUUFBVzBDLEtBQWFELEVBRXRCLEdBQUksQ0FFRixJQUFNekYsS0FBT3dDLFdBQVEsS0FBS3hDLEtBQU0wRixFQUFVekMsSUFBSSxFQUc5QyxHQUFJLElBQUNWLGlCQUFXQyxXQUFReEMsRUFBTSxjQUFBLENBQUEsRUFBa0IsU0FHaEQsSUFBTTJGLEVBQVdDLEtBQUtDLFNBQ3BCckMsbUJBQWFoQixXQUFReEMsRUFBTSxjQUFBLEVBQWlCLE9BQUEsQ0FBQSxFQUl4QzhGLEtBQU90RCxXQUFReEMsRUFBTTJGLEVBQVNHLElBQUksRUFHeEMsR0FBSSxJQUFDdkQsaUJBQVdDLFdBQVF4QyxFQUFNOEYsQ0FBQUEsQ0FBQUEsRUFBUSxDQUNwQyxLQUFLeEYsT0FBT2dGLEtBQ1YsOEJBQTJCSyxFQUFTMUMsTUFBUSxnQkFBQSxjQUF3QjBDLEVBQVNJLFNBQVcsaUJBQUEsdUNBQStDZixZQUFTQyxRQUFRQyxJQUFHLEtBQUkxQyxXQUFReEMsRUFBTThGLENBQUFBLENBQUFBLENBQUFBLHdDQUEyQyxFQUkxTixRQUNGLENBR0EsSUFBTWpGLEVBQVNtRixXQUFReEQsV0FBUXhDLEVBQU04RixDQUFBQSxDQUFBQSxFQUcvQmxFLEVBQVNmLEVBQU9vRixRQUd0QixHQUFJLEtBQUt2RixRQUFRd0YsSUFBSXRFLEVBQU91RCxVQUFVLEVBQUcsQ0FDdkMsS0FBSzdFLE9BQU9nRixLQUNWLDhCQUEyQjFELEVBQU91RCxVQUFVLHNEQUFtRCxFQUlqRyxRQUNGLENBR0F2RCxFQUFPdUUsU0FBVyxLQUNsQnZFLEVBQU94QixTQUFXLEtBQUtBLFNBQ3ZCd0IsRUFBTzVCLEtBQU9BLEVBQ2Q0QixFQUFPd0UsVUFBWSxHQUduQnhFLEVBQU95RSxXQUFhLElBQUlDLEtBQ3RCOUQsV0FBUVosRUFBTzVCLEtBQU0sVUFBVzRCLEVBQU91RCxVQUFVLEVBQ2pEdkQsRUFBT3RCLE1BQU0sRUFJZixLQUFLaUcsV0FBVzNFLEVBQU91RCxXQUFZdEUsQ0FBQUEsRUFHbkMsS0FBS0gsUUFBUThGLElBQUk1RSxFQUFPdUQsV0FBWXZELENBQUFBLEVBR3BDNkUsRUFBWUMsUUFBUXJDLEtBQUt6QyxFQUFPdUQsVUFBVSxFQUcxQy9CLEVBQWVpQixLQUFLekMsQ0FBQUEsS0FHZlcsaUJBQVdDLFdBQVF4QyxFQUFNLGdCQUFBLENBQUEsTUFFNUJ5QyxnQkFBVUQsV0FBUXhDLEVBQU0sZ0JBQUEsQ0FBQSxFQUkxQixJQUFNdUUsS0FBWTNCLGtCQUFZSixXQUFReEMsRUFBTSxnQkFBQSxFQUFtQixDQUM3RDZDLGNBQWUsRUFDakIsQ0FBQSxFQUFHQyxPQUFRQyxHQUFXQSxFQUFPQyxZQUFXLENBQUEsRUFHeEMsUUFBV3lCLEtBQVlGLEVBRXJCLEdBQUksQ0FFRixJQUFNb0MsRUFBTyxLQUFLdkcsU0FBU21FLFVBQVVxQyxnQkFDbkNwRSxXQUFReEMsRUFBTSxpQkFBa0J5RSxFQUFTeEIsSUFBSSxDQUFBLEVBSS9DckIsRUFBT3RCLE9BQU9xRSxRQUNaLDZCQUEwQmdDLEVBQUsxRCxJQUFJLGVBQVMwRCxFQUFLL0IsSUFBSSxTQUFNLEVBSTdEaEQsRUFBTzJDLFVBQVVNLElBQUk4QixDQUFBQSxDQUN2QixPQUFTN0IsRUFBUSxDQUVmLEtBQUt4RSxPQUFPeUUsTUFDVix3Q0FBa0NDLFlBQ2hDQyxRQUFRQyxJQUFHLEtBQ1gxQyxXQUFReEMsRUFBTSxpQkFBa0J5RSxFQUFTeEIsSUFBSSxDQUFBLENBQUEseUJBQzNCckIsRUFBT3VELFVBQVUsU0FDckNMLENBQUFBLENBRUosQ0FFSixPQUFTQSxFQUFRLENBRWYsS0FBS3hFLE9BQU95RSxNQUNWLGtDQUErQkMsWUFBU0MsUUFBUUMsSUFBRyxLQUFJMUMsV0FBUSxLQUFLeEMsS0FBTTBGLEVBQVV6QyxJQUFJLENBQUEsQ0FBQSwwQkFDeEY2QixDQUFBQSxDQUVKLENBSUYxQixFQUFleUQsS0FBSyxDQUFDQyxFQUFHQyxJQUVsQkQsRUFBRUUsV0FBYUQsRUFBRUMsU0FDWkQsRUFBRUMsU0FBV0YsRUFBRUUsU0FJcEJGLEVBQUUzQixXQUFhNEIsRUFBRTVCLFdBQW1CLEdBQ3BDMkIsRUFBRTNCLFdBQWE0QixFQUFFNUIsV0FBbUIsRUFDakMsQ0FDVCxFQUdBLFFBQVd2RCxLQUFVd0IsRUFDbkIsR0FBSSxDQUVGLEdBQUk2RCxPQUFPQyxLQUFLdEYsRUFBT3VGLE1BQU0sRUFBWXBELE9BQVMsRUFBRyxDQUVuRCxJQUFNL0QsS0FBT3dDLFdBQ1gsS0FBS3hDLEtBQ0wsVUFDQSxHQUFHNEIsRUFBT3VELFVBQVUsT0FBTyxFQUk3QixHQUFJLElBQUM1QyxjQUFXdkMsQ0FBQUEsS0FFZG9ILGlCQUFjcEgsRUFBTTRGLEtBQUt5QixVQUFVekYsRUFBT3VGLE9BQVEsS0FBTSxDQUFBLENBQUEsTUFDbkQsQ0FFTCxJQUFNRyxFQUFPMUIsS0FBS0MsU0FBTXJDLGdCQUFheEQsRUFBTSxPQUFBLENBQUEsRUFHM0NpSCxPQUFPTSxPQUFPM0YsRUFBT3VGLE9BQWtCRyxDQUFBQSxDQUN6QyxDQUNGLENBT0EsR0FKQTFGLEVBQU80RixhQUFhNUYsQ0FBQUEsRUFDcEIsS0FBSzZGLFdBQVc3RixDQUFBQSxFQUdaQSxFQUFPd0UsVUFBVyxDQUVwQixJQUFNc0IsS0FBT2xGLFdBQVFaLEVBQU81QixLQUFLMkgsTUFBTSxFQUFHLEVBQUMsRUFBR0MsUUFBUSxNQUFPLEdBQUEsQ0FBQSxLQUd6RHJGLGNBQVdtRixDQUFBQSxHQUFPekMsUUFBUTRDLFNBQVMsT0FBTUMsY0FBV0osQ0FBQUEsQ0FBQUEsQ0FDMUQsQ0FDRixPQUFTNUMsRUFBUSxDQUVmLEtBQUt4RSxPQUFPeUUsTUFDVixrQ0FBK0JDLFlBQzdCQyxRQUFRQyxJQUFHLEtBQ1gxQyxXQUFRWixFQUFPNUIsSUFBSSxDQUFBLENBQUEsMEJBRXJCOEUsQ0FBQUEsQ0FFSixDQUVKLENBS08xRCxPQUFjLENBRW5CLFFBQVdRLEtBQVUsS0FBS2xCLFFBQVFxSCxPQUFNLEVBQUluRyxFQUFPb0csVUFBVXBHLENBQUFBLENBQy9ELENBS09MLE1BQWEsQ0FFbEIsUUFBV0ssS0FBVSxLQUFLbEIsUUFBUXFILE9BQU0sRUFBSW5HLEVBQU9xRyxXQUFXckcsQ0FBQUEsQ0FDaEUsQ0FPT3dDLG1CQUNMcEUsRUFDQWtJLEVBQ0E5QixFQUFZLEdBQ0csQ0FFZixJQUFNc0IsS0FBT2xGLFdBQVF4QyxFQUFLMkgsTUFBTSxFQUFHLEVBQUMsRUFBR0MsUUFBUSxNQUFPLEdBQUEsQ0FBQSxLQUd0RFIsb0JBQWM1RSxXQUFRa0YsQ0FBQUEsRUFBT1EsQ0FBQUEsRUFHN0IsR0FBSSxDQUVGLElBQU1ySCxFQUFTbUYsV0FBUXhELFdBQVFrRixDQUFBQSxDQUFBQSxFQUd6QjlGLEVBQVNmLEVBQU9vRixRQUd0QixPQUFJLEtBQUt2RixRQUFRd0YsSUFBSXRFLEVBQU91RCxVQUFVLEdBRXBDLEtBQUs3RSxPQUFPZ0YsS0FDViw4QkFBMkIxRCxFQUFPdUQsVUFBVSxzREFBbUQsS0FJakcyQyxpQkFBV3RGLFdBQVFrRixDQUFBQSxDQUFBQSxFQUdaLE9BSVQ5RixFQUFPdUUsU0FBVyxLQUNsQnZFLEVBQU94QixTQUFXLEtBQUtBLFNBQ3ZCd0IsRUFBTzVCLFFBQU93QyxXQUFReEMsQ0FBQUEsRUFDdEI0QixFQUFPd0UsVUFBWUEsRUFHbkJ4RSxFQUFPeUUsV0FBYSxJQUFJQyxLQUN0QjlELFdBQVFaLEVBQU81QixLQUFNLFVBQVc0QixFQUFPdUQsVUFBVSxFQUNqRHZELEVBQU90QixNQUFNLEVBSWYsS0FBS2lHLFdBQVczRSxFQUFPdUQsV0FBWXRFLENBQUFBLEVBR25DLEtBQUtILFFBQVE4RixJQUFJNUUsRUFBT3VELFdBQVl2RCxDQUFBQSxFQUdwQzZFLEVBQVlDLFFBQVFyQyxLQUFLekMsRUFBT3VELFVBQVUsRUFHbkN2RCxFQUNULE9BQVNrRCxFQUFRLENBRWYsS0FBS3hFLE9BQU95RSxNQUNWLHNDQUFnQ0MsWUFBU0MsUUFBUUMsSUFBRyxFQUFJbEYsQ0FBQUEsQ0FBQUEsOEJBQ3hEOEUsQ0FBQUEsS0FJRmdELGlCQUFXdEYsV0FBUWtGLENBQUFBLENBQUFBLENBQ3JCLENBR0EsT0FBTyxJQUNULENBRU9TLE9BQU92RyxFQUFzQixDQUVsQ0EsRUFBT3FHLFdBQVdyRyxDQUFBQSxFQUdsQixLQUFLbEIsUUFBUTBILE9BQU94RyxFQUFPdUQsVUFBVSxFQUdyQyxJQUFNbkYsRUFBTzRCLEVBQU81QixLQUdwQixPQUFPZ0csUUFBUXFDLE1BQU1yQyxRQUFReEQsUUFBUXhDLENBQUFBLENBQUFBLEVBR3JDLEtBQUtJLFNBQVNrSSxXQUFXdEksQ0FBQUEsRUFHekIsUUFBV3lFLEtBQVk3QyxFQUFPMkMsVUFFNUIsS0FBS25FLFNBQVNtRSxVQUFVZ0UsTUFBTUgsT0FBTzNELEVBQVNHLElBQUksRUFHcEQsR0FBSWhELEVBQU93RSxVQUFXLENBRXBCLElBQU05QyxLQUFTQyxrQkFBWUMsZ0JBQWF4RCxDQUFBQSxDQUFBQSxFQUdsQ3lELEVBQVMsSUFBSUMsZUFBYUosQ0FBQUEsRUFLaEMsT0FGYUcsRUFBT0UsU0FBUSxFQUVwQkMsQ0FDTixLQUFLQyxFQUFhQyxlQUFnQixDQUVoQyxJQUFNQyxFQUFTTixFQUFPTyxXQUFVLEVBRzFCQyxFQUFRUixFQUFPUyxXQUFXSCxDQUFBQSxFQUFRSSxTQUFTLE9BQUEsRUFHM0NxRSxFQUFZLEtBQUtwRSxtQkFBbUJwRSxFQUFNaUUsRUFBTyxFQUFBLEVBR3ZELEdBQUksQ0FBQ3VFLEVBQVcsTUFHaEJBLEVBQVVoQixhQUFhZ0IsQ0FBQUEsRUFDdkIsS0FBS2YsV0FBV2UsQ0FBQUEsRUFHaEJBLEVBQVVSLFVBQVVRLENBQUFBLEVBR3BCLEtBQ0YsQ0FFQSxLQUFLM0UsRUFBYVMsYUFBYyxDQUU5QixJQUFNUCxFQUFTTixFQUFPTyxXQUFVLEVBRzFCQyxFQUFRUixFQUFPUyxXQUFXSCxDQUFBQSxFQUFRSSxTQUFTLE9BQUEsRUFHM0NxRSxFQUFZLEtBQUtwRSxtQkFBbUJwRSxFQUFNaUUsRUFBTyxFQUFBLEVBR3ZELEdBQUksQ0FBQ3VFLEVBQVcsTUFHaEJBLEVBQVVoQixhQUFhZ0IsQ0FBQUEsRUFDdkIsS0FBS2YsV0FBV2UsQ0FBQUEsRUFHaEJBLEVBQVVSLFVBQVVRLENBQUFBLEVBR3BCLElBQU1qRSxFQUFZZCxFQUFPTyxXQUFVLEVBR25DLFFBQVNRLEVBQUksRUFBR0EsRUFBSUQsRUFBV0MsSUFFN0IsR0FBSSxDQUVGLElBQU1ULEVBQVNOLEVBQU9PLFdBQVUsRUFHMUJWLEVBQVNHLEVBQU9TLFdBQVdILENBQUFBLEVBRzNCVSxFQUFXLEtBQUtyRSxTQUFTbUUsVUFBVUcsWUFBWXBCLENBQUFBLEVBR3JEa0YsRUFBVWxJLE9BQU9xRSxRQUNmLDZCQUEwQkYsRUFBU3hCLElBQUksZUFBU3dCLEVBQVNHLElBQUksU0FBTSxFQUlyRTRELEVBQVVqRSxVQUFVTSxJQUFJSixDQUFBQSxDQUMxQixPQUFTSyxFQUFRLENBRWYsS0FBS3hFLE9BQU95RSxNQUNWLHdDQUFrQ0MsWUFDaENDLFFBQVFDLElBQUcsS0FDWDFDLFdBQVEsS0FBS3hDLEtBQU1BLENBQUFBLENBQUFBLENBQUFBLHlCQUNEd0ksRUFBVXJELFVBQVUsU0FDeENMLENBQUFBLENBRUosQ0FFSixDQUNGLENBQ0YsS0FBTyxDQUVMLElBQU1hLEVBQVdDLEtBQUtDLFNBQ3BCckMsbUJBQWFoQixXQUFReEMsRUFBTSxjQUFBLEVBQWlCLE9BQUEsQ0FBQSxFQUl4QzhGLEtBQU90RCxXQUFReEMsRUFBTTJGLEVBQVNHLElBQUksRUFHeEMsR0FBSSxJQUFDdkQsaUJBQVdDLFdBQVF4QyxFQUFNOEYsQ0FBQUEsQ0FBQUEsRUFBUSxDQUNwQyxLQUFLeEYsT0FBT2dGLEtBQ1YsZ0NBQTZCSyxFQUFTMUMsTUFBUSxnQkFBQSxjQUF3QjBDLEVBQVNJLFNBQVcsaUJBQUEsdUNBQStDZixZQUFTQyxRQUFRQyxJQUFHLEtBQUkxQyxXQUFReEMsRUFBTThGLENBQUFBLENBQUFBLENBQUFBLHdDQUEyQyxFQUk1TixNQUNGLENBR0EsSUFBTWpGLEVBQVNtRixXQUFReEQsV0FBUXhDLEVBQU04RixDQUFBQSxDQUFBQSxFQUcvQjBDLEVBQVkzSCxFQUFPb0YsUUFHekJ1QyxFQUFVckMsU0FBVyxLQUNyQnFDLEVBQVVwSSxTQUFXLEtBQUtBLFNBQzFCb0ksRUFBVXhJLEtBQU9BLEVBQ2pCd0ksRUFBVXBDLFVBQVksR0FHdEJvQyxFQUFVbkMsV0FBYSxJQUFJQyxLQUN6QjlELFdBQVFnRyxFQUFVeEksS0FBTSxVQUFXd0ksRUFBVXJELFVBQVUsRUFDdkRxRCxFQUFVbEksTUFBTSxFQUlsQixLQUFLaUcsV0FBV2lDLEVBQVVyRCxXQUFZdEUsQ0FBQUEsRUFHdEMsS0FBS0gsUUFBUThGLElBQUlnQyxFQUFVckQsV0FBWXFELENBQUFBLEVBR3ZDL0IsRUFBWUMsUUFBUXJDLEtBQUttRSxFQUFVckQsVUFBVSxFQUc3Q3FELEVBQVVoQixhQUFhZ0IsQ0FBQUEsRUFDdkIsS0FBS2YsV0FBV2UsQ0FBQUEsQ0FDbEIsQ0FDRixDQUVPbkYsT0FBT3pCLEVBQXNCLENBRWxDLElBQU02QixFQUFTLElBQUlDLGVBR2IrRSxFQUNKN0csRUFBTzJDLFVBQVVtRSxLQUFPLEVBQ3BCN0UsRUFBYVMsYUFDYlQsRUFBYUMsZUFNbkIsT0FIQUwsRUFBT2tGLFVBQVVGLENBQUFBLEVBR1RBLEVBQUFBLENBQ04sS0FBSzVFLEVBQWFDLGVBQWdCLENBRWhDLElBQU05RCxLQUFPd0MsV0FBUVosRUFBTzVCLEtBQU0sT0FBUSxVQUFBLEVBR3BDaUUsS0FBUVQsZ0JBQWF4RCxDQUFBQSxFQUczQnlELEVBQU9tRixZQUFZM0UsRUFBTTRFLFVBQVUsRUFHbkNwRixFQUFPcUYsWUFBWTdFLENBQUFBLEtBR25CbUQsb0JBQ0U1RSxXQUFRLEtBQUt4QyxLQUFNLEdBQUc0QixFQUFPdUQsVUFBVSxLQUFLdkQsRUFBT21FLE9BQU8sU0FBUyxLQUNuRWdELGVBQVl0RixFQUFPdUYsVUFBUyxDQUFBLENBQUEsRUFJOUIsS0FDRixDQUVBLEtBQUtuRixFQUFhUyxhQUFjLENBRTlCLElBQU10RSxLQUFPd0MsV0FBUVosRUFBTzVCLEtBQU0sT0FBUSxVQUFBLEVBR3BDaUUsS0FBUVQsZ0JBQWF4RCxDQUFBQSxFQUczQnlELEVBQU9tRixZQUFZM0UsRUFBTTRFLFVBQVUsRUFHbkNwRixFQUFPcUYsWUFBWTdFLENBQUFBLEVBR25CUixFQUFPbUYsWUFBWWhILEVBQU8yQyxVQUFVbUUsSUFBSSxFQUd4QyxRQUFXakUsS0FBWTdDLEVBQU8yQyxVQUFXLENBRXZDLElBQU1qQixFQUFTbUIsRUFBU3dFLFNBQVEsRUFHaEN4RixFQUFPbUYsWUFBWXRGLEVBQU91RixVQUFVLEVBR3BDcEYsRUFBT3FGLFlBQVl4RixDQUFBQSxDQUNyQixJQUdBOEQsb0JBQ0U1RSxXQUFRLEtBQUt4QyxLQUFNLEdBQUc0QixFQUFPdUQsVUFBVSxLQUFLdkQsRUFBT21FLE9BQU8sU0FBUyxLQUNuRWdELGVBQVl0RixFQUFPdUYsVUFBUyxDQUFBLENBQUEsRUFJOUIsS0FDRixDQUNGLENBQ0YsQ0FFVXZCLFdBQVc3RixFQUFzQixDQUV6QyxJQUFNc0gsRUFBWWpDLE9BQU9rQyxlQUFldkgsQ0FBQUEsRUFHbEN3SCxFQUFhbkMsT0FBT29DLG9CQUFvQkgsQ0FBQUEsRUFHMUNJLEVBQVlyQyxPQUFPQyxLQUFLMUYsWUFBQUEsRUFDNUI4SCxFQUFZQSxFQUFVM0IsTUFBTTJCLEVBQVV2RixPQUFTLENBQUEsRUFHL0MsUUFBV3dGLEtBQVlELEVBQVcsQ0FFaEMsSUFBTXJGLEVBQVFxRixFQUFVRSxRQUFRRCxDQUFBQSxFQUdoQyxHQUFJSCxFQUFXSyxTQUFTLEtBQU9GLENBQUFBLEVBQVcsQ0FFeEMsSUFBTUcsRUFBUTlILEVBQVEsS0FBTzJILENBQUFBLEVBR3pCLE9BQU9HLEdBQVUsWUFFbkIsS0FBS3RKLFNBQVNhLEdBQUdnRCxFQUFPeUYsRUFBTXJJLEtBQUtPLENBQUFBLENBQUFBLENBQ3ZDLENBR0EsR0FBSXdILEVBQVdLLFNBQVMsU0FBV0YsQ0FBQUEsRUFBVyxDQUU1QyxJQUFNRyxFQUFROUgsRUFBUSxTQUFXMkgsQ0FBQUEsRUFHN0IsT0FBT0csR0FBVSxZQUVuQixLQUFLdEosU0FBU3VKLE9BQU8xRixFQUFPeUYsRUFBTXJJLEtBQUtPLENBQUFBLENBQUFBLENBQzNDLENBR0EsR0FBSXdILEVBQVdLLFNBQVMsUUFBVUYsQ0FBQUEsRUFBVyxDQUUzQyxJQUFNRyxFQUFROUgsRUFBUSxRQUFVMkgsQ0FBQUEsRUFHNUIsT0FBT0csR0FBVSxZQUVuQixLQUFLdEosU0FBU3dKLE1BQU0zRixFQUFPeUYsRUFBTXJJLEtBQUtPLENBQUFBLENBQUFBLENBQzFDLENBQ0YsQ0FDRixDQU9PMkUsV0FBV3RELEVBQWNwQyxFQUF1QixDQUV2Q29FLFFBQVE0RSxTQUFTQyxNQUFRQyxRQU12Q0MsSUFBSXBJLE9BQU8sQ0FDVHFCLEtBQU0scUJBQXFCQSxDQUFBQSxHQUMzQmdILE1BQU1DLEVBQU8sQ0FDWEEsRUFBUXJKLE9BQU9vQyxFQUFNLEtBQ1osQ0FDTG5DLFFBQVNELEVBQ1RzSixPQUFRLFFBQ1YsRUFDRixDQUNGLENBQ0YsQ0FBQSxDQUNGLENBQ0YsRU9wM0JBLElBQUFDLEVBQXFDLDhCQUNyQ0MsRUFBd0IsK0JDQXhCLElBQU1DLEVBQU4sS0FBTUEsQ0FBTixNQUFNQSxDQUFBQSxFQUFBQSw0QkFJWUMsTUFBZ0MsQ0FBQSxFQUtoQ0MsT0FBbUMsQ0FBQSxFQVE1Q0MsZ0JBQWdCRixFQUFxQyxDQUUxRCxZQUFLQSxNQUFNRyxLQUFJLEdBQUlILENBQUFBLEVBR1osSUFDVCxDQU9PSSxlQUFlQyxFQUE2QixDQUVqRCxJQUFNQyxFQUFRLEtBQUtOLE1BQU1PLFFBQVFGLENBQUFBLEVBR2pDLE9BQUlDLElBQVUsSUFBSSxLQUFLTixNQUFNUSxPQUFPRixFQUFPLENBQUEsRUFHcEMsSUFDVCxDQVFPRyxpQkFBaUJSLEVBQXdDLENBRTlELFlBQUtBLE9BQU9FLEtBQUksR0FBSUYsQ0FBQUEsRUFHYixJQUNULENBT09TLGdCQUFnQkMsRUFBZ0MsQ0FFckQsSUFBTUwsRUFBUSxLQUFLTCxPQUFPTSxRQUFRSSxDQUFBQSxFQUdsQyxPQUFJTCxJQUFVLElBQUksS0FBS0wsT0FBT08sT0FBT0YsRUFBTyxDQUFBLEVBR3JDLElBQ1QsQ0FDRixFQ3RFQSxJQUFNTSxFQUFOLEtBQU1BLENBQU4sTUFBTUEsQ0FBQUEsRUFBQUEsMkJBSVlDLE1BQStCLENBQUEsRUFLL0JDLE9BQXVDLENBQUEsRUFRaERDLGdCQUFnQkYsRUFBb0MsQ0FFekQsWUFBS0EsTUFBTUcsS0FBSSxHQUFJSCxDQUFBQSxFQUdaLElBQ1QsQ0FPT0ksZUFBZUMsRUFBNEIsQ0FFaEQsSUFBTUMsRUFBUSxLQUFLTixNQUFNTyxRQUFRRixDQUFBQSxFQUdqQyxPQUFJQyxJQUFVLElBQUksS0FBS04sTUFBTVEsT0FBT0YsRUFBTyxDQUFBLEVBR3BDLElBQ1QsQ0FRT0csaUJBQWlCUixFQUE0QyxDQUVsRSxZQUFLQSxPQUFPRSxLQUFJLEdBQUlGLENBQUFBLEVBR2IsSUFDVCxDQU9PUyxnQkFBZ0JDLEVBQW9DLENBRXpELElBQU1MLEVBQVEsS0FBS0wsT0FBT00sUUFBUUksQ0FBQUEsRUFHbEMsT0FBSUwsSUFBVSxJQUFJLEtBQUtMLE9BQU9PLE9BQU9GLEVBQU8sQ0FBQSxFQUdyQyxJQUNULENBQ0YsRUN0RUEsSUFBTU0sRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDZCQUlZQyxNQUFpQyxDQUFBLEVBS2pDQyxPQUFvQyxDQUFBLEVBUTdDQyxnQkFBZ0JGLEVBQXNDLENBRTNELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQThCLENBRWxELElBQU1DLEVBQVEsS0FBS04sTUFBTU8sUUFBUUYsQ0FBQUEsRUFHakMsT0FBSUMsSUFBVSxJQUFJLEtBQUtOLE1BQU1RLE9BQU9GLEVBQU8sQ0FBQSxFQUdwQyxJQUNULENBUU9HLGlCQUFpQlIsRUFBeUMsQ0FFL0QsWUFBS0EsT0FBT0UsS0FBSSxHQUFJRixDQUFBQSxFQUdiLElBQ1QsQ0FPT1MsZ0JBQWdCQyxFQUFpQyxDQUV0RCxJQUFNTCxFQUFRLEtBQUtMLE9BQU9NLFFBQVFJLENBQUFBLEVBR2xDLE9BQUlMLElBQVUsSUFBSSxLQUFLTCxPQUFPTyxPQUFPRixFQUFPLENBQUEsRUFHckMsSUFDVCxDQUNGLEVIVkEsSUFBTU0sRUFBTixjQUFrQ0MsU0FBQUEsQ0E3RGxDLE1BNkRrQ0EsQ0FBQUEsRUFBQUEsZUFJaEJDLFdBS0FDLFFBS0FDLE9BTUFDLFNBQTJCQyxFQUFlQyxPQU0xQ0MsT0FBUyxJQUFJQyxFQU1iQyxNQUFRLElBQUlDLEVBTVpDLFNBQVcsSUFBSUMsRUFLZkMsVUFBWSxJQUFJQyxJQUtoQkMsT0FBa0IsQ0FBQyxFQU01QkMsV0FNQUMsS0FNQUMsVUFNQUMsU0FNQUMsU0FRUCxZQUNFbkIsRUFDQUMsRUFDQW1CLEVBQ0EsQ0FFQSxNQUFNQSxHQUFTQyxZQUFBQSxFQUdmLEtBQUtyQixXQUFhQSxFQUNsQixLQUFLQyxRQUFVQSxFQUdmLEtBQUtDLE9BQ0hrQixHQUFTbEIsUUFDVCxJQUFJb0IsU0FBTyxHQUFHdEIsQ0FBQUEsSUFBY0MsQ0FBQUEsR0FBV3NCLGVBQWFDLElBQUksRUFHdERKLEdBQVNLLGVBQWMsS0FBS0EsYUFBZUwsRUFBUUssY0FDbkRMLEdBQVNNLFlBQVcsS0FBS0EsVUFBWU4sRUFBUU0sV0FDN0NOLEdBQVNPLGFBQVksS0FBS0EsV0FBYVAsRUFBUU8sV0FDckQsQ0FPT0MsUUFBMEI1QixFQUE4QixDQUU3RCxHQUFJLENBQUMsS0FBS2tCLFNBQVUsT0FBTyxLQUczQixJQUFNVyxFQUFTLEtBQUtYLFNBQVNZLFFBQVFDLElBQUkvQixDQUFBQSxFQUd6QyxPQUFLNkIsR0FBZSxJQUl0QixDQU1PSixhQUFhTyxFQUF1QixDQUUzQyxDQU1PTixVQUFVTSxFQUF1QixDQUV4QyxDQU1PTCxXQUFXSyxFQUF1QixDQUV6QyxDQU9PQyxhQUFnQkMsRUFBa0IsQ0FFdkNDLGNBQU9DLE9BQU8sS0FBS3RCLE9BQWtCb0IsQ0FBQUEsRUFHOUIsS0FBS3BCLE1BQ2QsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiUGx1Z2luSGVhZGVyIiwgIlBsdWdpblByaW9yaXR5IiwgIlBsdWdpblR5cGUiLCAiaW1wb3J0X2ZzIiwgImltcG9ydF9wYXRoIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiZGF0YVBhdGgiLCAibG9nZ2VyIiwgInZhbGlkYXRlUGF0aCIsICJwYXRoIiwgImV4cGVjdGVkVHlwZSIsICJpc0Fic29sdXRlIiwgIndhcm4iLCAic3RhcnRzV2l0aCIsICJzZXAiLCAiaGFzRXh0ZW5zaW9uIiwgInRlc3QiLCAicmVhZEZpbGUiLCAiZW5jb2RpbmciLCAiZXhpc3RzU3luYyIsICJmdWxsUGF0aCIsICJyZXNvbHZlIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImRpclBhdGgiLCAic3Vic3RyaW5nIiwgImxhc3RJbmRleE9mIiwgIndyaXRlRmlsZVN5bmMiLCAicmVtb3ZlRmlsZSIsICJybVN5bmMiLCAibWtkaXIiLCAicm1kaXIiLCAib3B0aW9ucyIsICJmb3JjZSIsICJyZWFkRGlyIiwgInJlYWRkaXJTeW5jIiwgImV4aXN0cyIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJuYW1lIiwgImlzRmlsZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJmaWxlU3lzdGVtIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJPYmplY3QiLCAia2V5cyIsICJjb25maWciLCAid3JpdGVGaWxlU3luYyIsICJzdHJpbmdpZnkiLCAiZGF0YSIsICJhc3NpZ24iLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidGVtcCIsICJzbGljZSIsICJyZXBsYWNlIiwgIm5leHRUaWNrIiwgInVubGlua1N5bmMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInNvdXJjZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiZ2V0UHJvdG90eXBlT2YiLCAicGx1Z2luS2V5cyIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImV2ZW50S2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9lbWl0dGVyIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJFbWl0dGVyIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAicHJpb3JpdHkiLCAiUGx1Z2luUHJpb3JpdHkiLCAiTm9ybWFsIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJyZXNvdXJjZXMiLCAiU2V0IiwgImNvbmZpZyIsICJmaWxlU3lzdGVtIiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgIm9wdGlvbnMiLCAibWF4TGlzdGVuZXJzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJvbkluaXRpYWxpemUiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVzb2x2ZSIsICJwbHVnaW4iLCAicGx1Z2lucyIsICJnZXQiLCAiX3BsdWdpbiIsICJkZWZpbmVDb25maWciLCAiZGVmaW5pdGlvbiIsICJPYmplY3QiLCAiYXNzaWduIl0KfQo=
|