@serenityjs/plugins 0.7.8 → 0.8.0-beta-20250407220732
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 +13 -0
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @serenityjs/plugins
|
|
2
2
|
|
|
3
|
+
## 0.8.0-beta-20250407220732
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`7afde6d`](https://github.com/SerenityJS/serenity/commit/7afde6d98ab6c157ae581593669cc66df78571d2) Thanks [@PMK744](https://github.com/PMK744)! - init v0.8.0-beta
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`7afde6d`](https://github.com/SerenityJS/serenity/commit/7afde6d98ab6c157ae581593669cc66df78571d2)]:
|
|
12
|
+
- @serenityjs/core@0.8.0-beta-20250407220732
|
|
13
|
+
- @serenityjs/logger@0.8.0-beta-20250407220732
|
|
14
|
+
- @serenityjs/protocol@0.8.0-beta-20250407220732
|
|
15
|
+
|
|
3
16
|
## 0.7.8
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var x=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var u=(a,t)=>x(a,"name",{value:t,configurable:!0});var j=(a,t)=>{for(var i in t)x(a,i,{get:t[i],enumerable:!0})},q=(a,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of D(t))!F.call(a,e)&&e!==i&&x(a,e,{get:()=>t[e],enumerable:!(r=U(t,e))||r.enumerable});return a};var C=a=>q(x({},"__esModule",{value:!0}),a);var W={};j(W,{DefaultPipelineProperties:()=>R,Pipeline:()=>_,Plugin:()=>$,PluginType:()=>d});module.exports=C(W);var o=require("fs"),n=require("path"),y=require("zlib"),P=require("child_process"),b=require("@serenityjs/logger"),g=require("@serenityjs/core"),k=require("@serenityjs/binarystream");var w=require("@serenityjs/logger");var d=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(d||{});var B=class{static{u(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var z=class{static{u(this,"PluginItemRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var A=class{static{u(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var $=class{static{u(this,"Plugin")}identifier;version;logger;type;blocks=new B;items=new z;entities=new A;path;isBundled;pipeline;serenity;constructor(t,i,r){this.identifier=t,this.version=i,this.logger=r?.logger??new w.Logger(`${t}@${i}`,w.LoggerColors.Blue),this.type=r?.type??d.Addon,r?.onInitialize&&(this.onInitialize=r.onInitialize),r?.onStartUp&&(this.onStartUp=r.onStartUp),r?.onShutDown&&(this.onShutDown=r.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};var I=require("path");var E=require("@serenityjs/core");var m=class extends E.CustomEnum{static{u(this,"PluginsEnum")}static identifier="plugins";static options=[]},T=class extends E.CustomEnum{static{u(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var L=u((a,t)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",i=>{i.permissions=["serenity.operator"],i.overload({action:T},({action:r})=>{if(r.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let e=[...t.plugins.values()],s=[];for(let h of e)s.push(`\xA7u${h.identifier} v${h.version}\xA7r`);return{message:`\xA77Active Plugins (${e.length}):\xA7r ${s.join("\xA77,\xA7r ")}`}}),i.overload({action:T,plugin:m},({action:r,plugin:e})=>{if(r.result!=="reload"&&r.result!=="bundle")return;let s=t.plugins.get(e.result);if(!s)throw new Error(`Plugin ${e.result} is not found.`);if(r.result==="reload")return t.reload(s),{message:`\xA7aSuccessfully reloaded \xA72${s.identifier}\xA7a.`};if(s.isBundled)throw new Error(`Plugin ${s.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(s),{message:`\xA7aSuccessfully bundled \xA72${s.identifier}\xA7a, output file was placed at \xA77${(0,I.relative)(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),O=L;var R={path:"./plugins",commands:!0,initialize:!0},_=class{static{u(this,"Pipeline")}serenity;properties;logger=new b.Logger("Plugins",b.LoggerColors.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(t){throw new Error("The path property is read-only.")}constructor(t,i){this.serenity=t,this.properties={...R,...i},t.on(g.ServerEvent.Start,this.start.bind(this)),t.on(g.ServerEvent.Stop,this.stop.bind(this)),
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGlwZWxpbmVQcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb21tYW5kczogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vcGx1Z2luc1wiLFxuICBjb21tYW5kczogdHJ1ZSxcbiAgaW5pdGlhbGl6ZTogdHJ1ZVxufTtcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUGx1Z2luc1wiLCBMb2dnZXJDb2xvcnMuTWF0ZXJpYWxMYXBpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zIGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2lucyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wb3JhcnkgcGF0aHMgdXNlZCBieSB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGVtcFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgaW4gRVNNIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNtOiBib29sZWFuID1cbiAgICB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZT8uZXhwb3J0cyAhPT0gZXhwb3J0cztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGF0aChfKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhdGggcHJvcGVydHkgaXMgcmVhZC1vbmx5LlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBlbGluZSBjbGFzcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBpcGVsaW5lUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICAvLyBNZXJnZSB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgc2VyZW5pdHkgc2VydmVyIGV2ZW50c1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0YXJ0LCB0aGlzLnN0YXJ0LmJpbmQodGhpcykpO1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0b3AsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIGNvbW1hbmQgc2hvdWxkIGJlIHJlZ2lzdGVyZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSB7XG4gICAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICAgIHNlcmVuaXR5Lm9uKFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplLCAoeyB3b3JsZCB9KSA9PiB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kcyBmb3IgdGhlIHBsdWdpbnNcbiAgICAgICAgQ29tbWFuZCh3b3JsZCwgdGhpcyk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIHJlZ2lzdGVyIHRoZSBibG9ja3MsIGl0ZW1zLCBhbmQgZW50aXRpZXNcbiAgICAgICAgZm9yIChjb25zdCBbLCBwbHVnaW5dIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9ja3MgZm9yIHRoZSB3b3JsZFxuICAgICAgICAgIHdvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uYmxvY2tzLnR5cGVzKVxuICAgICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmJsb2Nrcy50cmFpdHMpO1xuXG4gICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW1zIGZvciB0aGUgd29ybGRcbiAgICAgICAgICB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uaXRlbXMudHlwZXMpXG4gICAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uaXRlbXMudHJhaXRzKTtcblxuICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdGllcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgICAgd29ybGQuZW50aXR5UGFsZXR0ZVxuICAgICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uZW50aXRpZXMudHlwZXMpXG4gICAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uZW50aXRpZXMudHJhaXRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgc2hvdWxkIGJlIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMucHJvcGVydGllcy5pbml0aWFsaXplKSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZSh0aGlzLnBhdGgpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgbWtkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZWFkIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZmlsZXMgdGhhdCBoYXZlIGEgLnBsdWdpbiBleHRlbnNpb25cbiAgICBjb25zdCBidW5kbGVzID0gZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT5cbiAgICAgIGRpcmVudC5pc0ZpbGUoKSA/IGRpcmVudC5uYW1lLmVuZHNXaXRoKFwiLnBsdWdpblwiKSA6IGZhbHNlXG4gICAgKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gdHlwZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gdHlwZSBpcyB2YWxpZFxuICAgICAgICBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgb3IgbWFpbiBlbnRyeSBwb2ludHMgdG8gdGVtcG9yYXJ5IGZpbGVzXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpKTtcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4gYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwicGFja2FnZVwiKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIG5hbWUpKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKHBsdWdpbik7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBEZWxldGUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXNcbiAgICBmb3IgKGNvbnN0IHRlbXBQYXRoIG9mIHRoaXMudGVtcFBhdGhzKSB7XG4gICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIER5bmFtaWMgZGVsZXRlIGlzIHJlcXVpcmVkIGhlcmVcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcblxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuICAgICAgdGhpcy5iaW5kRXZlbnRzKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgcGx1Z2luIHR5cGUgdG8gdGhlIHN0cmVhbVxuICAgIHN0cmVhbS53cml0ZUJ5dGUocGx1Z2luLnR5cGUpO1xuXG4gICAgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAvLyBHZXQgdGhlIGFkZG9uIHBhdGhcbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZVxuICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocmVzb2x2ZShpbnB1dFBhdGgsIFwiaW5kZXguanNcIikpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IHRvIHRoZSBzdHJlYW1cbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAvLyBQYWNrIHRoZSBwbHVnaW5cbiAgICAgIGV4ZWNTeW5jKFwibnBtIHBhY2tcIiwgeyBjd2Q6IHBsdWdpbi5wYXRoLCBzdGRpbzogXCJpZ25vcmVcIiB9KTtcblxuICAgICAgLy8gR2V0IHRoZSB0YXJiYWxsIHBhdGhcbiAgICAgIGNvbnN0IHRhcmJhbGwgPSByZWFkZGlyU3luYyhwbHVnaW4ucGF0aCkuZmluZCgoZmlsZSkgPT5cbiAgICAgICAgZmlsZS5lbmRzV2l0aChcIi50Z3pcIilcbiAgICAgICk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJiYWxsIGV4aXN0c1xuICAgICAgaWYgKCF0YXJiYWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJQYWNrZWQgdGFyYmFsbCBub3QgZm91bmQuXCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYmluZEV2ZW50cyhwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcHJvdG90eXBlIG9mIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGx1Z2luKTtcblxuICAgIC8vIEdldCB0aGUgb2JqZWN0IGtleXMgZnJvbSB0aGUgcGx1Z2luXG4gICAgY29uc3QgcGx1Z2luS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSk7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIGV2ZW50IGtleXMsIGFuZCBzbGljZSB0aGVtIGluIGhhbGZcbiAgICBsZXQgZXZlbnRLZXlzID0gT2JqZWN0LmtleXMoV29ybGRFdmVudCk7XG4gICAgZXZlbnRLZXlzID0gZXZlbnRLZXlzLnNsaWNlKGV2ZW50S2V5cy5sZW5ndGggLyAyKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGV2ZW50IGtleXNcbiAgICBmb3IgKGNvbnN0IGV2ZW50S2V5IG9mIGV2ZW50S2V5cykge1xuICAgICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZXZlbnQga2V5XG4gICAgICBjb25zdCBpbmRleCA9IGV2ZW50S2V5cy5pbmRleE9mKGV2ZW50S2V5KSBhcyBXb3JsZEV2ZW50O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJvblwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwib25cIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwib25cIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5vbihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJiZWZvcmVcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImJlZm9yZVwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5iZWZvcmUoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiBib29sZWFuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYWZ0ZXJcIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcImFmdGVyXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImFmdGVyXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYWZ0ZXIoaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBQbHVnaW5FdmVudHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgUGx1Z2luQmxvY2tSZWdpc3RyeSxcbiAgUGx1Z2luRW50aXR5UmVnaXN0cnksXG4gIFBsdWdpbkl0ZW1SZWdpc3RyeVxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luUHJvcGVydGllcyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICB0eXBlOiBQbHVnaW5UeXBlO1xufVxuXG4vKipcbiAqICMgSW50cm9kdWN0aW9uXG4gKiBQbHVnaW5zIGFyZSB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIFNlcmVuaXR5SlMuXG4gKiBUaGV5IGFyZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2hpY2ggYWxsb3dzIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgc2VydmVyLlxuICpcbiAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIHBsdWdpbnMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYFBsdWdpblR5cGVgIGVudW06IGBBZGRvbmAgJiBgQXBpYFxuICpcbiAqIEFkZG9uIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2Fubm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICogQXBpIHBsdWdpbnMgYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbiBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqXG4gKiAjIyBDbGFzcyBFeHRlbmRpbmcgUGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5UeXBlLCBQbHVnaW5FdmVudHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcGx1Z2luc1wiO1xuICpcbiAqIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gKiAgIHB1YmxpYyByZWFkb25seSB0eXBlID0gUGx1Z2luVHlwZS5BZGRvbjtcbiAqXG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcInNhbXBsZS1wbHVnaW5cIiwgXCIxLjAuMFwiKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIG9uSW5pdGlhbGl6ZSgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TdGFydFVwKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblNodXREb3duKCk6IHZvaWQge31cbiAqIH1cbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBuZXcgU2FtcGxlUGx1Z2luKCk7XG4gKiBgYGBcbiAqL1xuY2xhc3MgUGx1Z2luIGltcGxlbWVudHMgUGx1Z2luUHJvcGVydGllcyB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGx1Z2luVHlwZTtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBQbHVnaW5CbG9ja1JlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IFBsdWdpbkl0ZW1SZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IFBsdWdpbkVudGl0eVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQbHVnaW5Qcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgcHJvcGVydGllcz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IHByb3BlcnRpZXM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gcHJvcGVydGllc1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gcHJvcGVydGllcy5vbkluaXRpYWxpemU7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBwcm9wZXJ0aWVzLm9uU3RhcnRVcDtcbiAgICBpZiAocHJvcGVydGllcz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gcHJvcGVydGllcy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TdGFydFVwKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpblByb3BlcnRpZXMgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEJsb2NrVHJhaXQsIEN1c3RvbUJsb2NrVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkJsb2NrUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGJsb2NrIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUJsb2NrVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGJsb2NrIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUJsb2NrVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tQmxvY2tUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBCbG9ja1RyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkJsb2NrUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEl0ZW1UcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1UcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUl0ZW1UeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1UcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEl0ZW1UcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iXSwKICAibWFwcGluZ3MiOiAiNGRBQUEsSUFBQUEsRUFBQSxHQUFBQyxFQUFBRCxFQUFBLCtCQUFBRSxFQUFBLGFBQUFDLEVBQUEsV0FBQUMsRUFBQSxlQUFBQyxJQUFBLGVBQUFDLEVBQUFOLEdDQ0EsSUFBQU8sRUFRTyxjQUNQQyxFQUFrQyxnQkFDbENDLEVBQXlDLGdCQUN6Q0MsRUFBeUIseUJBRXpCQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZjdCLElBQUFDLEVBQXFDLDhCQ0VyQyxJQUFLQyxFQUFBQSxTQUFBQSxFQUFBQSxDQUdGLE9BQUFBLEVBQUFBLEVBQUEsTUFBQSxDQUFBLEVBQUEsUUFLQUEsRUFBQUEsRUFBQSxJQUFBLENBQUEsRUFBQSxNQVJFQSxHQUFBQSxHQUFBQSxDQUFBQSxDQUFBQSxFQ0RMLElBQU1DLEVBQU4sS0FBTUEsQ0FBTixNQUFNQSxDQUFBQSxFQUFBQSw0QkFJWUMsTUFBZ0MsQ0FBQSxFQUtoQ0MsT0FBbUMsQ0FBQSxFQVE1Q0MsZ0JBQWdCRixFQUFxQyxDQUUxRCxZQUFLQSxNQUFNRyxLQUFJLEdBQUlILENBQUFBLEVBR1osSUFDVCxDQU9PSSxlQUFlQyxFQUE2QixDQUVqRCxJQUFNQyxFQUFRLEtBQUtOLE1BQU1PLFFBQVFGLENBQUFBLEVBR2pDLE9BQUlDLElBQVUsSUFBSSxLQUFLTixNQUFNUSxPQUFPRixFQUFPLENBQUEsRUFHcEMsSUFDVCxDQVFPRyxpQkFBaUJSLEVBQXdDLENBRTlE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RW5CLEtBQUs5SCxTQUFTZ0ksTUFBTXJFLEVBQU9tRSxFQUFNM0csS0FBS08sQ0FBQUEsQ0FBQUEsQ0FDMUMsQ0FDRixDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5UeXBlIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX3psaWIiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2xvZ2dlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInR5cGUiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgIl9wbHVnaW4iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
|
|
1
|
+
"use strict";var x=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var u=(a,t)=>x(a,"name",{value:t,configurable:!0});var j=(a,t)=>{for(var i in t)x(a,i,{get:t[i],enumerable:!0})},q=(a,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of D(t))!F.call(a,e)&&e!==i&&x(a,e,{get:()=>t[e],enumerable:!(r=U(t,e))||r.enumerable});return a};var C=a=>q(x({},"__esModule",{value:!0}),a);var W={};j(W,{DefaultPipelineProperties:()=>R,Pipeline:()=>_,Plugin:()=>$,PluginType:()=>d});module.exports=C(W);var o=require("fs"),n=require("path"),y=require("zlib"),P=require("child_process"),b=require("@serenityjs/logger"),g=require("@serenityjs/core"),k=require("@serenityjs/binarystream");var w=require("@serenityjs/logger");var d=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(d||{});var B=class{static{u(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var z=class{static{u(this,"PluginItemRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var A=class{static{u(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var $=class{static{u(this,"Plugin")}identifier;version;logger;type;blocks=new B;items=new z;entities=new A;path;isBundled;pipeline;serenity;constructor(t,i,r){this.identifier=t,this.version=i,this.logger=r?.logger??new w.Logger(`${t}@${i}`,w.LoggerColors.Blue),this.type=r?.type??d.Addon,r?.onInitialize&&(this.onInitialize=r.onInitialize),r?.onStartUp&&(this.onStartUp=r.onStartUp),r?.onShutDown&&(this.onShutDown=r.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};var I=require("path");var E=require("@serenityjs/core");var m=class extends E.CustomEnum{static{u(this,"PluginsEnum")}static identifier="plugins";static options=[]},T=class extends E.CustomEnum{static{u(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var L=u((a,t)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",i=>{i.permissions=["serenity.operator"],i.overload({action:T},({action:r})=>{if(r.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let e=[...t.plugins.values()],s=[];for(let h of e)s.push(`\xA7u${h.identifier} v${h.version}\xA7r`);return{message:`\xA77Active Plugins (${e.length}):\xA7r ${s.join("\xA77,\xA7r ")}`}}),i.overload({action:T,plugin:m},({action:r,plugin:e})=>{if(r.result!=="reload"&&r.result!=="bundle")return;let s=t.plugins.get(e.result);if(!s)throw new Error(`Plugin ${e.result} is not found.`);if(r.result==="reload")return t.reload(s),{message:`\xA7aSuccessfully reloaded \xA72${s.identifier}\xA7a.`};if(s.isBundled)throw new Error(`Plugin ${s.identifier} cannot be bundled, as it is already a bundled plugin.`);return t.bundle(s),{message:`\xA7aSuccessfully bundled \xA72${s.identifier}\xA7a, output file was placed at \xA77${(0,I.relative)(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),O=L;var R={path:"./plugins",commands:!0,initialize:!0},_=class{static{u(this,"Pipeline")}serenity;properties;logger=new b.Logger("Plugins",b.LoggerColors.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(t){throw new Error("The path property is read-only.")}constructor(t,i){this.serenity=t,this.properties={...R,...i},t.on(g.ServerEvent.Start,this.start.bind(this)),t.on(g.ServerEvent.Stop,this.stop.bind(this)),t.on(g.WorldEvent.WorldInitialize,({world:r})=>{this.properties.commands&&O(r,this);for(let[,e]of this.plugins)r.blockPalette.registerType(...e.blocks.types).registerTrait(...e.blocks.traits),r.itemPalette.registerType(...e.items.types).registerTrait(...e.items.traits),r.entityPalette.registerType(...e.entities.types).registerTrait(...e.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){(0,o.existsSync)((0,n.resolve)(this.path))||(0,o.mkdirSync)((0,n.resolve)(this.path),{recursive:!0});let i=(0,o.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(e=>e.isFile()?e.name.endsWith(".plugin"):!1);for(let e of i)try{let s=(0,n.resolve)(this.path,e.name),h=(0,y.inflateSync)((0,o.readFileSync)(s)),l=new k.BinaryStream(h),v=l.readByte();if(v===d.Addon){let p=l.readRemainingBuffer().toString("utf-8"),c=(0,n.resolve)(this.path,e.name.slice(0,-7));(0,o.writeFileSync)(c,p);let f=require(c).default;if(this.plugins.has(f.identifier)){this.logger.warn(`Unable to load plugin \xA71${f.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}f.pipeline=this,f.serenity=this.serenity,f.path=s,f.isBundled=!0,this.plugins.set(f.identifier,f),f.onInitialize(f),this.bindEvents(f),m.options.push(f.identifier),this.tempPaths.add(c)}else if(v===d.Api){let p=l.readRemainingBuffer();(0,o.unlinkSync)(s);let c=(0,n.resolve)(this.path,e.name.slice(0,-7));(0,o.writeFileSync)(c,p),(0,P.execSync)(`tar -xzf ${c} -C ${this.path}`,{stdio:"ignore"}),(0,o.unlinkSync)(c);let S=e.name.slice(0,-7);(0,o.renameSync)((0,n.resolve)(this.path,"package"),(0,n.resolve)(this.path,S)),(0,P.execSync)("npm install",{cwd:(0,n.resolve)(this.path,S),stdio:"ignore"})}}catch(s){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,e.name))}", skipping the plugin.`,s)}let r=(0,o.readdirSync)((0,n.resolve)(this.path),{withFileTypes:!0}).filter(e=>e.isDirectory());for(let e of r)try{let s=(0,n.resolve)(this.path,e.name);if(!(0,o.existsSync)((0,n.resolve)(s,"package.json")))continue;let h=JSON.parse((0,o.readFileSync)((0,n.resolve)(s,"package.json"),"utf-8")),l=(0,n.resolve)(s,h.main);if(!(0,o.existsSync)((0,n.resolve)(s,l))){this.logger.warn(`Unable to load plugin \xA71${h.name}\xA78@\xA71${h.version}\xA7r, the main entry path "\xA78${(0,n.relative)(process.cwd(),(0,n.resolve)(s,l))}\xA7r" was not found in the directory.`);continue}let p=require((0,n.resolve)(s,l)).default;if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=s,p.isBundled=!1,this.plugins.set(p.identifier,p),m.options.push(p.identifier),p.onInitialize(p),this.bindEvents(p)}catch(s){this.logger.error(`Failed to load plugin from "${(0,n.relative)(process.cwd(),(0,n.resolve)(this.path,e.name))}", skipping the plugin.`,s)}}start(){for(let t of this.plugins.values())t.onStartUp(t)}stop(){for(let t of this.plugins.values())t.onShutDown(t);for(let t of this.tempPaths)(0,o.unlinkSync)(t)}reload(t){t.onShutDown(t),this.plugins.delete(t.identifier);let i=t.path;delete require.cache[require.resolve(i)],this.serenity.removePath(i);try{let e=require(i).default;if(!(e instanceof $)){this.logger.warn(`Unable to reload plugin from \xA78${(0,n.relative)(process.cwd(),i)}\xA7r, the plugin is not an instance of the Plugin class.`);return}e.pipeline=this,e.serenity=this.serenity,e.path=i,this.plugins.set(e.identifier,e),e.onInitialize(e),this.bindEvents(e),e.onStartUp(e),this.logger.info(`Successfully reloaded plugin \xA71${e.identifier}\xA7r from \xA78${(0,n.relative)(process.cwd(),i)}\xA7r.`)}catch(r){this.logger.error(`Failed to reload plugin from \xA78${(0,n.relative)(process.cwd(),i)}\xA7r, skipping the plugin.`,r)}}bundle(t){let i=new k.BinaryStream;if(i.writeByte(t.type),t.type===d.Addon){let r=(0,n.resolve)(t.path,"dist"),e=(0,o.readFileSync)((0,n.resolve)(r,"index.js"));i.writeBuffer(e),(0,o.writeFileSync)((0,n.resolve)(this.path,`${t.identifier}.plugin`),(0,y.deflateSync)(i.getBuffer()))}else if(t.type===d.Api){(0,P.execSync)("npm pack",{cwd:t.path,stdio:"ignore"});let r=(0,o.readdirSync)(t.path).find(s=>s.endsWith(".tgz"));if(!r)throw new Error("Packed tarball not found.");let e=(0,o.readFileSync)((0,n.resolve)(t.path,r));(0,o.unlinkSync)((0,n.resolve)(t.path,r)),i.writeBuffer(e),(0,o.writeFileSync)((0,n.resolve)(this.path,`${t.identifier}.plugin`),(0,y.deflateSync)(i.getBuffer()))}}bindEvents(t){let i=Object.getPrototypeOf(t),r=Object.getOwnPropertyNames(i),e=Object.keys(g.WorldEvent);e=e.slice(e.length/2);for(let s of e){let h=e.indexOf(s);if(r.includes("on"+s)){let l=t["on"+s];typeof l=="function"&&this.serenity.on(h,l.bind(t))}if(r.includes("before"+s)){let l=t["before"+s];typeof l=="function"&&this.serenity.before(h,l.bind(t))}if(r.includes("after"+s)){let l=t["after"+s];typeof l=="function"&&this.serenity.after(h,l.bind(t))}}}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginType});
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2VyZW5pdHksIFNlcnZlckV2ZW50LCBXb3JsZEV2ZW50IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUGx1Z2luUGFja2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbmltcG9ydCBDb21tYW5kIGZyb20gXCIuL2NvbW1hbmRzL2NvbW1hbmRcIjtcbmltcG9ydCB7IFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vY29tbWFuZHNcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbnRlcmZhY2UgUGlwZWxpbmVQcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb21tYW5kczogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vcGx1Z2luc1wiLFxuICBjb21tYW5kczogdHJ1ZSxcbiAgaW5pdGlhbGl6ZTogdHJ1ZVxufTtcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUGlwZWxpbmVQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUGx1Z2luc1wiLCBMb2dnZXJDb2xvcnMuTWF0ZXJpYWxMYXBpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW5zIGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2lucyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wb3JhcnkgcGF0aHMgdXNlZCBieSB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGVtcFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgaW4gRVNNIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXNtOiBib29sZWFuID1cbiAgICB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZT8uZXhwb3J0cyAhPT0gZXhwb3J0cztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBzZXQgcGF0aChfKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhdGggcHJvcGVydHkgaXMgcmVhZC1vbmx5LlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQaXBlbGluZSBjbGFzcy5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBpcGVsaW5lUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBzZXJlbml0eSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICAvLyBNZXJnZSB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgc2VyZW5pdHkgc2VydmVyIGV2ZW50c1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0YXJ0LCB0aGlzLnN0YXJ0LmJpbmQodGhpcykpO1xuICAgIHNlcmVuaXR5Lm9uKFNlcnZlckV2ZW50LlN0b3AsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgIHNlcmVuaXR5Lm9uKFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplLCAoeyB3b3JsZCB9KSA9PiB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgY29tbWFuZHMgZm9yIHRoZSBwbHVnaW5zXG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSBDb21tYW5kKHdvcmxkLCB0aGlzKTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcGx1Z2lucywgYW5kIHJlZ2lzdGVyIHRoZSBibG9ja3MsIGl0ZW1zLCBhbmQgZW50aXRpZXNcbiAgICAgIGZvciAoY29uc3QgWywgcGx1Z2luXSBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLmJsb2Nrcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uYmxvY2tzLnRyYWl0cyk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW1zIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuaXRlbVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5pdGVtcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uaXRlbXMudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgZW50aXRpZXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uZW50aXRpZXMudHlwZXMpXG4gICAgICAgICAgLnJlZ2lzdGVyVHJhaXQoLi4ucGx1Z2luLmVudGl0aWVzLnRyYWl0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBzaG91bGQgYmUgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmluaXRpYWxpemUpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBvciBtYWluIGVudHJ5IHBvaW50cyB0byB0ZW1wb3JhcnkgZmlsZXNcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZS5zbGljZSgwLCAtNykpO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGluZGV4KTtcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUodGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHRlbXBvcmFyeSBwYXRoIHRvIHRoZSBzZXRcbiAgICAgICAgICB0aGlzLnRlbXBQYXRocy5hZGQodGVtcFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIC5wbHVnaW4gZmlsZVxuICAgICAgICAgIHVubGlua1N5bmMocGF0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIGEgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZS5zbGljZSgwLCAtNykpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBidWZmZXIpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdGFyYmFsbCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgICAgICBleGVjU3luYyhgdGFyIC14emYgJHt0ZW1wUGF0aH0gLUMgJHt0aGlzLnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIG5hbWUgZnJvbSB0aGUgdGFyYmFsbFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidW5kbGUubmFtZS5zbGljZSgwLCAtNyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBcInBhY2thZ2VcIiBkaXJlY3RvcnkgdG8gdGhlIHBsdWdpbiBuYW1lXG4gICAgICAgICAgcmVuYW1lU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLCByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSkpO1xuXG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgZXhlY1N5bmMoXCJucG0gaW5zdGFsbFwiLCB7XG4gICAgICAgICAgICBjd2Q6IHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSxcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke21hbmlmZXN0Lm5hbWV9wqc4QMKnMSR7bWFuaWZlc3QudmVyc2lvbn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gRHluYW1pYyBkZWxldGUgaXMgcmVxdWlyZWQgaGVyZVxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHBhdGgpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHJQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgaWYgKCEoclBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHJQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgclBsdWdpbi5wYXRoID0gcGF0aDtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHJQbHVnaW4uaWRlbnRpZmllciwgclBsdWdpbik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vbkluaXRpYWxpemUoclBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMoclBsdWdpbik7XG5cbiAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25TdGFydFVwKHJQbHVnaW4pO1xuXG4gICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgcmVsb2FkXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIHBsdWdpbiDCpzEke3JQbHVnaW4uaWRlbnRpZmllcn3Cp3IgZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnci5gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlXG4gICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgdG8gdGhlIHN0cmVhbVxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgIC8vIFBhY2sgdGhlIHBsdWdpblxuICAgICAgZXhlY1N5bmMoXCJucG0gcGFja1wiLCB7IGN3ZDogcGx1Z2luLnBhdGgsIHN0ZGlvOiBcImlnbm9yZVwiIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRhcmJhbGwgcGF0aFxuICAgICAgY29uc3QgdGFyYmFsbCA9IHJlYWRkaXJTeW5jKHBsdWdpbi5wYXRoKS5maW5kKChmaWxlKSA9PlxuICAgICAgICBmaWxlLmVuZHNXaXRoKFwiLnRnelwiKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmJhbGwgZXhpc3RzXG4gICAgICBpZiAoIXRhcmJhbGwpIHRocm93IG5ldyBFcnJvcihcIlBhY2tlZCB0YXJiYWxsIG5vdCBmb3VuZC5cIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgY29uc3QgYnVmZmVyID0gcmVhZEZpbGVTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRXZlbnRzKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwcm90b3R5cGUgb2YgdGhlIHBsdWdpblxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwbHVnaW4pO1xuXG4gICAgLy8gR2V0IHRoZSBvYmplY3Qga2V5cyBmcm9tIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwbHVnaW5LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZXZlbnQga2V5cywgYW5kIHNsaWNlIHRoZW0gaW4gaGFsZlxuICAgIGxldCBldmVudEtleXMgPSBPYmplY3Qua2V5cyhXb3JsZEV2ZW50KTtcbiAgICBldmVudEtleXMgPSBldmVudEtleXMuc2xpY2UoZXZlbnRLZXlzLmxlbmd0aCAvIDIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXZlbnQga2V5c1xuICAgIGZvciAoY29uc3QgZXZlbnRLZXkgb2YgZXZlbnRLZXlzKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBldmVudCBrZXlcbiAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnRLZXlzLmluZGV4T2YoZXZlbnRLZXkpIGFzIFdvcmxkRXZlbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcIm9uXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJvblwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJvblwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5Lm9uKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImJlZm9yZVwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYmVmb3JlXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImJlZm9yZVwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmJlZm9yZShpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IGJvb2xlYW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJhZnRlclwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5hZnRlcihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuL3BpcGVsaW5lXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlIH0gZnJvbSBcIi4vZW51bXNcIjtcbmltcG9ydCB7IFBsdWdpbkV2ZW50cyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBQbHVnaW5CbG9ja1JlZ2lzdHJ5LFxuICBQbHVnaW5FbnRpdHlSZWdpc3RyeSxcbiAgUGx1Z2luSXRlbVJlZ2lzdHJ5XG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbmludGVyZmFjZSBQbHVnaW5Qcm9wZXJ0aWVzIGV4dGVuZHMgUGFydGlhbDxQbHVnaW5FdmVudHM+IHtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIHR5cGU6IFBsdWdpblR5cGU7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW4gaW1wbGVtZW50cyBQbHVnaW5Qcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBsdWdpblByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBwcm9wZXJ0aWVzPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy50eXBlID0gcHJvcGVydGllcz8udHlwZSA/PyBQbHVnaW5UeXBlLkFkZG9uO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBwcm9wZXJ0aWVzLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAocHJvcGVydGllcz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IHByb3BlcnRpZXMub25TdGFydFVwO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBwcm9wZXJ0aWVzLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luUHJvcGVydGllcyB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IHR5cGUgQmxvY2tUcmFpdCwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luQmxvY2tSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEJsb2NrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luQmxvY2tSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgSXRlbVRyYWl0LCBDdXN0b21JdGVtVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkl0ZW1SZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkl0ZW1SZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgRW50aXR5VHJhaXQsIEN1c3RvbUVudGl0eVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUVudGl0eVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBFbnRpdHlUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRQYWxldHRlLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9ucyA9IFtcInNlcmVuaXR5Lm9wZXJhdG9yXCJdO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICI0ZEFBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsK0JBQUFFLEVBQUEsYUFBQUMsRUFBQSxXQUFBQyxFQUFBLGVBQUFDLElBQUEsZUFBQUMsRUFBQU4sR0NDQSxJQUFBTyxFQVFPLGNBQ1BDLEVBQWtDLGdCQUNsQ0MsRUFBeUMsZ0JBQ3pDQyxFQUF5Qix5QkFFekJDLEVBQXFDLDhCQUNyQ0MsRUFBa0QsNEJBQ2xEQyxFQUE2QixvQ0NmN0IsSUFBQUMsRUFBcUMsOEJDRXJDLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDREwsSUFBTUMsRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDRCQUlZQyxNQUFnQyxDQUFBLEVBS2hDQyxPQUFtQyxDQUFBLEVBUTVDQyxnQkFBZ0JGLEVBQXFDLENBRTFELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQTZCLENBRWpELElBQU1DLEVBQVEsS0FBS04sTUFBTU8sUUFBUUYsQ0FBQUEsRUFHakMsT0FBSUMsSUFBVSxJQUFJLEtBQUtOLE1BQU1RLE9BQU9GLEVBQU8sQ0FBQSxFQUdwQyxJQUNULENBUU9HLGlCQUFpQlIsRUFBd0MsQ0FFOUQsWUFBS0EsT0FBT0UsS0FBSSxHQUFJRixDQUFBQSxFQUdiLElBQ1QsQ0FPT1MsZ0JBQWdCQyxFQUFnQyxDQUVyRCxJQUFNTCxFQUFRLEtBQUtMLE9BQU9NLFFBQVFJLENBQUFBLEVBR2xDLE9BQUlM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X2V4cG9ydCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgIlBpcGVsaW5lIiwgIlBsdWdpbiIsICJQbHVnaW5UeXBlIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX3psaWIiLCAiaW1wb3J0X25vZGVfY2hpbGRfcHJvY2VzcyIsICJpbXBvcnRfbG9nZ2VyIiwgImltcG9ydF9jb3JlIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiaW1wb3J0X2xvZ2dlciIsICJQbHVnaW5UeXBlIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbiIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibG9nZ2VyIiwgInR5cGUiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgIl9wbHVnaW4iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2NvcmUiLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var F=Object.defineProperty;var p=(o,t)=>F(o,"name",{value:t,configurable:!0}),c=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});import{existsSync as S,mkdirSync as _,readdirSync as $,readFileSync as y,renameSync as W,unlinkSync as x,writeFileSync as w}from"node:fs";import{relative as g,resolve as n}from"node:path";import{deflateSync as O,inflateSync as K}from"node:zlib";import{execSync as E}from"node:child_process";import{Logger as N,LoggerColors as M}from"@serenityjs/logger";import{ServerEvent as R,WorldEvent as U}from"@serenityjs/core";import{BinaryStream as D}from"@serenityjs/binarystream";import{Logger as j,LoggerColors as q}from"@serenityjs/logger";var f=function(o){return o[o.Addon=0]="Addon",o[o.Api=1]="Api",o}(f||{});var T=class{static{p(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var k=class{static{p(this,"PluginItemRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var B=class{static{p(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var z=class{static{p(this,"Plugin")}identifier;version;logger;type;blocks=new T;items=new k;entities=new B;path;isBundled;pipeline;serenity;constructor(t,i,s){this.identifier=t,this.version=i,this.logger=s?.logger??new j(`${t}@${i}`,q.Blue),this.type=s?.type??f.Addon,s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};import{relative as C}from"path";import{CustomEnum as A}from"@serenityjs/core";var m=class extends A{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]},v=class extends A{static{p(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var L=p((o,t)=>{o.commandPalette.register("plugins","Interact with the plugins of the server",i=>{i.permissions=["serenity.operator"],i.overload({action:v},({action:s})=>{if(s.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let e=[...t.plugins.values()],r=[];for(let u of e)r.push(`\xA7u${u.identifier} v${u.version}\xA7r`);return{message:`\xA77Active Plugins (${e.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),i.overload({action:v,plugin:m},({action:s,plugin:e})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=t.plugins.get(e.result);if(!r)throw new Error(`Plugin ${e.result} is not found.`);if(s.result==="reload")return t.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 t.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${C(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),I=L;var J={path:"./plugins",commands:!0,initialize:!0},qt=class{static{p(this,"Pipeline")}serenity;properties;logger=new N("Plugins",M.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(t){throw new Error("The path property is read-only.")}constructor(t,i){this.serenity=t,this.properties={...J,...i},t.on(R.Start,this.start.bind(this)),t.on(R.Stop,this.stop.bind(this)),
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2Jsb2NrLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9pdGVtLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9lbnRpdHkudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5NYXRlcmlhbExhcGlzKTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIHtcbiAgICAgIC8vIEhvb2sgaW50byB0aGUgd29ybGQgaW5pdGlhbGl6ZSBldmVudFxuICAgICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+IHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGZvciB0aGUgcGx1Z2luc1xuICAgICAgICBDb21tYW5kKHdvcmxkLCB0aGlzKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgcmVnaXN0ZXIgdGhlIGJsb2NrcywgaXRlbXMsIGFuZCBlbnRpdGllc1xuICAgICAgICBmb3IgKGNvbnN0IFssIHBsdWdpbl0gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgICAgd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5ibG9ja3MudHlwZXMpXG4gICAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uYmxvY2tzLnRyYWl0cyk7XG5cbiAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICAgIHdvcmxkLml0ZW1QYWxldHRlXG4gICAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5pdGVtcy50eXBlcylcbiAgICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5pdGVtcy50cmFpdHMpO1xuXG4gICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0aWVzIGZvciB0aGUgd29ybGRcbiAgICAgICAgICB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5lbnRpdGllcy50eXBlcylcbiAgICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5lbnRpdGllcy50cmFpdHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBzaG91bGQgYmUgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmluaXRpYWxpemUpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBvciBtYWluIGVudHJ5IHBvaW50cyB0byB0ZW1wb3JhcnkgZmlsZXNcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZS5zbGljZSgwLCAtNykpO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGluZGV4KTtcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUodGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHRlbXBvcmFyeSBwYXRoIHRvIHRoZSBzZXRcbiAgICAgICAgICB0aGlzLnRlbXBQYXRocy5hZGQodGVtcFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkUmVtYWluaW5nQnVmZmVyKCk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIC5wbHVnaW4gZmlsZVxuICAgICAgICAgIHVubGlua1N5bmMocGF0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIGEgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZS5zbGljZSgwLCAtNykpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB3cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBidWZmZXIpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdGFyYmFsbCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgICAgICBleGVjU3luYyhgdGFyIC14emYgJHt0ZW1wUGF0aH0gLUMgJHt0aGlzLnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIG5hbWUgZnJvbSB0aGUgdGFyYmFsbFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidW5kbGUubmFtZS5zbGljZSgwLCAtNyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBcInBhY2thZ2VcIiBkaXJlY3RvcnkgdG8gdGhlIHBsdWdpbiBuYW1lXG4gICAgICAgICAgcmVuYW1lU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLCByZXNvbHZlKHRoaXMucGF0aCwgbmFtZSkpO1xuXG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgZXhlY1N5bmMoXCJucG0gaW5zdGFsbFwiLCB7XG4gICAgICAgICAgICBjd2Q6IHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSxcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZW50cmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gcmVhZGRpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7XG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgfSkuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpcmVjdG9yaWVzLCBjaGVja2luZyBpZiB0aGV5IGFyZSB2YWxpZCBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhIHBhY2thZ2UuanNvbiBmaWxlLCBpZiBub3QsIHNraXAgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMocmVzb2x2ZShwYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICAgIC8vIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIHRoaXMuZXNtID8gbWFuaWZlc3QubW9kdWxlIDogbWFuaWZlc3QubWFpbik7XG4gICAgICAgIGNvbnN0IG1haW4gPSByZXNvbHZlKHBhdGgsIG1hbmlmZXN0Lm1haW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke21hbmlmZXN0Lm5hbWV9wqc4QMKnMSR7bWFuaWZlc3QudmVyc2lvbn3Cp3IsIHRoZSBtYWluIGVudHJ5IHBhdGggXCLCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUocGF0aCwgbWFpbikpfcKnclwiIHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZShwYXRoLCBtYWluKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgIHBsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgcGx1Z2luLm9uSW5pdGlhbGl6ZShwbHVnaW4pO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIERlbGV0ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlc1xuICAgIGZvciAoY29uc3QgdGVtcFBhdGggb2YgdGhpcy50ZW1wUGF0aHMpIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gdGhlIHBsdWdpblxuICAgIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG1hcFxuICAgIHRoaXMucGx1Z2lucy5kZWxldGUocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBwbHVnaW4gcGF0aFxuICAgIGNvbnN0IHBhdGggPSBwbHVnaW4ucGF0aDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVxdWlyZSBjYWNoZSBmb3IgdGhlIHBsdWdpblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gRHluYW1pYyBkZWxldGUgaXMgcmVxdWlyZWQgaGVyZVxuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZShwYXRoKV07XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkucmVtb3ZlUGF0aChwYXRoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgdHJ5IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHBhdGgpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IHJQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzc1xuICAgICAgaWYgKCEoclBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgdGhlIHBsdWdpbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbiBjbGFzcy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHJQbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgclBsdWdpbi5wYXRoID0gcGF0aDtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KHJQbHVnaW4uaWRlbnRpZmllciwgclBsdWdpbik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vbkluaXRpYWxpemUoclBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMoclBsdWdpbik7XG5cbiAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25TdGFydFVwKHJQbHVnaW4pO1xuXG4gICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgcmVsb2FkXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIHBsdWdpbiDCpzEke3JQbHVnaW4uaWRlbnRpZmllcn3Cp3IgZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnci5gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlXG4gICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgdG8gdGhlIHN0cmVhbVxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgIC8vIFBhY2sgdGhlIHBsdWdpblxuICAgICAgZXhlY1N5bmMoXCJucG0gcGFja1wiLCB7IGN3ZDogcGx1Z2luLnBhdGgsIHN0ZGlvOiBcImlnbm9yZVwiIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRhcmJhbGwgcGF0aFxuICAgICAgY29uc3QgdGFyYmFsbCA9IHJlYWRkaXJTeW5jKHBsdWdpbi5wYXRoKS5maW5kKChmaWxlKSA9PlxuICAgICAgICBmaWxlLmVuZHNXaXRoKFwiLnRnelwiKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmJhbGwgZXhpc3RzXG4gICAgICBpZiAoIXRhcmJhbGwpIHRocm93IG5ldyBFcnJvcihcIlBhY2tlZCB0YXJiYWxsIG5vdCBmb3VuZC5cIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgY29uc3QgYnVmZmVyID0gcmVhZEZpbGVTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRXZlbnRzKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwcm90b3R5cGUgb2YgdGhlIHBsdWdpblxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwbHVnaW4pO1xuXG4gICAgLy8gR2V0IHRoZSBvYmplY3Qga2V5cyBmcm9tIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwbHVnaW5LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZXZlbnQga2V5cywgYW5kIHNsaWNlIHRoZW0gaW4gaGFsZlxuICAgIGxldCBldmVudEtleXMgPSBPYmplY3Qua2V5cyhXb3JsZEV2ZW50KTtcbiAgICBldmVudEtleXMgPSBldmVudEtleXMuc2xpY2UoZXZlbnRLZXlzLmxlbmd0aCAvIDIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXZlbnQga2V5c1xuICAgIGZvciAoY29uc3QgZXZlbnRLZXkgb2YgZXZlbnRLZXlzKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBldmVudCBrZXlcbiAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnRLZXlzLmluZGV4T2YoZXZlbnRLZXkpIGFzIFdvcmxkRXZlbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcIm9uXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJvblwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJvblwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5Lm9uKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImJlZm9yZVwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYmVmb3JlXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImJlZm9yZVwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmJlZm9yZShpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IGJvb2xlYW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJhZnRlclwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5hZnRlcihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuL3BpcGVsaW5lXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlIH0gZnJvbSBcIi4vZW51bXNcIjtcbmltcG9ydCB7IFBsdWdpbkV2ZW50cyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBQbHVnaW5CbG9ja1JlZ2lzdHJ5LFxuICBQbHVnaW5FbnRpdHlSZWdpc3RyeSxcbiAgUGx1Z2luSXRlbVJlZ2lzdHJ5XG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbmludGVyZmFjZSBQbHVnaW5Qcm9wZXJ0aWVzIGV4dGVuZHMgUGFydGlhbDxQbHVnaW5FdmVudHM+IHtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIHR5cGU6IFBsdWdpblR5cGU7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW4gaW1wbGVtZW50cyBQbHVnaW5Qcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBQbHVnaW5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBsdWdpblByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBwcm9wZXJ0aWVzPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy50eXBlID0gcHJvcGVydGllcz8udHlwZSA/PyBQbHVnaW5UeXBlLkFkZG9uO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBwcm9wZXJ0aWVzLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAocHJvcGVydGllcz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IHByb3BlcnRpZXMub25TdGFydFVwO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBwcm9wZXJ0aWVzLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgdXAuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzdGFydGVkIHVwLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0VXAoX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luUHJvcGVydGllcyB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IHR5cGUgQmxvY2tUcmFpdCwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luQmxvY2tSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEJsb2NrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luQmxvY2tSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgSXRlbVRyYWl0LCBDdXN0b21JdGVtVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkl0ZW1SZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkl0ZW1SZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgRW50aXR5VHJhaXQsIEN1c3RvbUVudGl0eVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUVudGl0eVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBFbnRpdHlUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5FbnRpdHlSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRQYWxldHRlLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9ucyA9IFtcInNlcmVuaXR5Lm9wZXJhdG9yXCJdO1xuXG4gICAgICAvLyBPdmVybG9hZCBmb3IgbGlzdGluZyB0aGUgcGx1Z2luc1xuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBsaXN0XG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwibGlzdFwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vIHBsdWdpbnNcbiAgICAgICAgICBpZiAocGlwZWxpbmUucGx1Z2lucy5zaXplID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogXCLCp2NUaGVyZSBhcmUgY3VycmVudCBubyBwbHVnaW5zIGxvYWRlZCBvbiB0aGUgc2VydmVyLlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2lucyA9IFsuLi5waXBlbGluZS5wbHVnaW5zLnZhbHVlcygpXTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHBsdWdpbnNcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gbmFtZSB0byB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfSB2JHtwbHVnaW4udmVyc2lvbn3Cp3JgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYMKnN0FjdGl2ZSBQbHVnaW5zICgke3BsdWdpbnMubGVuZ3RofSk6wqdyICR7bWVzc2FnZS5qb2luKFwiwqc3LMKnciBcIil9YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bSxcbiAgICAgICAgICBwbHVnaW46IFBsdWdpbnNFbnVtXG4gICAgICAgIH0sXG4gICAgICAgICh7IGFjdGlvbiwgcGx1Z2luIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcInJlbG9hZFwiICYmIGFjdGlvbi5yZXN1bHQgIT09IFwiYnVuZGxlXCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwaXBlbGluZS5wbHVnaW5zLmdldChwbHVnaW4ucmVzdWx0IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIG5vdCBmb3VuZFxuICAgICAgICAgIGlmICghcGx1Z2luSW5zdGFuY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke3BsdWdpbi5yZXN1bHR9IGlzIG5vdCBmb3VuZC5gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgPT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5yZWxvYWQocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgcmVsb2FkZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luSW5zdGFuY2UuaXNCdW5kbGVkKVxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgYnVuZGxlZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBsdWdpbiAke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9IGNhbm5vdCBiZSBidW5kbGVkLCBhcyBpdCBpcyBhbHJlYWR5IGEgYnVuZGxlZCBwbHVnaW4uYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBCdW5kbGUgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUuYnVuZGxlKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IGJ1bmRsZWQgwqcyJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfcKnYSwgb3V0cHV0IGZpbGUgd2FzIHBsYWNlZCBhdCDCpzcke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBpcGVsaW5lLnBhdGgpfcKnYS5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG92ZXJsb2FkIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cIik7XG4gICAgfVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuY2xhc3MgUGx1Z2luQWN0aW9uc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5fYWN0aW9uc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJsaXN0XCIsIFwicmVsb2FkXCIsIFwiYnVuZGxlXCJdO1xufVxuXG5leHBvcnQgeyBQbHVnaW5zRW51bSwgUGx1Z2luQWN0aW9uc0VudW0gfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBQ3pDLE9BQVNDLFlBQUFBLE1BQWdCLHFCQUV6QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJBQ3JDLE9BQW1CQyxlQUFBQSxFQUFhQyxjQUFBQSxNQUFrQixtQkFDbEQsT0FBU0MsZ0JBQUFBLE1BQW9CLDJCQ2Y3QixPQUFTQyxVQUFBQSxFQUFRQyxnQkFBQUEsTUFBb0IscUJDRXJDLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLENBR0YsT0FBQUEsRUFBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxRQUtBQSxFQUFBQSxFQUFBLElBQUEsQ0FBQSxFQUFBLE1BUkVBLEdBQUFBLEdBQUFBLENBQUFBLENBQUFBLEVDREwsSUFBTUMsRUFBTixLQUFNQSxDQUFOLE1BQU1BLENBQUFBLEVBQUFBLDRCQUlZQyxNQUFnQyxDQUFBLEVBS2hDQyxPQUFtQyxDQUFBLEVBUTVDQyxnQkFBZ0JGLEVBQXFDLENBRTFELFlBQUtBLE1BQU1HLEtBQUksR0FBSUgsQ0FBQUEsRUFHWixJQUNULENBT09JLGVBQWVDLEVBQTZCLENBRWpELElBQU1DLEVBQVEsS0FBS04sTUFBTU8sUUFBUUYsQ0FBQUEsRUFHakMsT0FBSUMsSUFBVSxJQUFJLEtBQUtOLE1BQU1RLE9BQU9GLEVBQU8sQ0FBQSxFQUdwQyxJQUNULENBUU9HLGlCQUFpQlIsRUFBd0MsQ0FFOUQsWUFBS0EsT0FBT0UsS0FBSSxHQUFJRixDQUFBQSxFQUdiLElBQ1QsQ0FPT1MsZ0JBQWdCQyxFQUFnQyxDQUVyRCxJQUFNTCxFQUFRLEtBQUtMLE9BQU9NLFFBQVFJLENBQUFBLEVBR2xDLE9BQUlMLElBQVUsSUFBSSxLQUFLTCxPQUFPTyxPQUFPRixFQUFPLENBQUEsRUFHckMsSUFDVCxDQUNGLEVDdEVBLElBQU1NLEVBQU4sS0FBTUEsQ0FBTixNQUFNQSxDQUFBQSxFQUFBQSwyQkFJWUMsTUFBK0IsQ0FBQSxFQUsvQkMsT0FBa0MsQ0FBQSxFQVEzQ0MsZ0JBQWdCRixFQUFvQyxDQUV6RCxZQUFLQSxNQUFNRyxLQUFJLEdBQUlILENBQUFBLEVBR1osSUFDVCxDQU9PSSxlQUFlQyxFQUE0QixDQUVoRCxJQUFNQyxFQUFRLEtBQUtOLE1BQU1PLFFBQVFGLENBQUFBLEVBR2pDLE9BQUlDLElBQVUsSUFBSSxLQUFLTixNQUFNUSxPQUFPRixFQUFPLENBQUEsRUFHcEMsSUFDVCxDQVFPRyxpQkFBaUJSLEVBQXVDLENBRTdELFlBQUtBLE9BQU9FLEtBQUksR0FBSUYsQ0FBQUEsRUFHYixJQUNULENBT09TLGdCQUFnQkMsRUFBK0IsQ0FFcEQsSUFBTUwsRUFBUSxLQUFLTCxPQUFPTSxRQUFRSSxDQUFBQSxFQUdsQyxPQUFJTCxJQUFVLElBQUksS0FBS0wsT0FBT08sT0FBT0YsRUFBTyxDQUFBLEVBR3JDLElBQ1QsQ0FDRixFQ3RFQSxJQUFNTSxFQUFOLEtBQU1BLENBQU4sTUFBTUEsQ0FBQUEsRUFBQUEsNkJBSVlDLE1BQWlDLENBQUEsRUFLakNDLE9BQW9DLENBQUEsRUFRN0NDLGdCQUFnQkYsRUFBc0MsQ0FFM0QsWUFBS0EsTUFBTUcsS0FBSSxHQUFJSCxDQUFBQSxFQUdaLElBQ1QsQ0FPT0ksZUFBZUMsRUFBOEIsQ0FFbEQsSUFBTUMsRUFBUSxLQUFLTixNQUFNTyxRQUFRRixDQUFBQSxFQUdqQyxPQUFJQyxJQUFVLElBQUksS0FBS04sTUFBTVEsT0FBT0YsRUFBTyxDQUFBLEVBR3BDLElBQ1QsQ0FRT0csaUJBQWlCUixFQUF5QyxDQUUvRCxZQUFLQSxPQUFPRSxLQUFJLEdBQUlGLENBQUFBLEVBR2IsSUFDVCxDQU9PUyxnQkFBZ0JDLEVBQWlDLENBRXRELElBQU1MLEVBQVEsS0FBS0wsT0FBT00sUUFBUUksQ0FBQUEsRUFHbEMsT0FBSUwsSUFBVSxJQUFJLEtBQUtMLE9BQU9PLE9BQU9GLEVBQU8sQ0FBQSxFQUdyQyxJQUNULENBQ0YsRUp4QkEsSUFBTU0sRUFBTixLQUFNQSxDQS9DTixNQStDTUEsQ0FBQUEsRUFBQUEsZUFJWUMsV0FLQUMsUUFLQUMsT0FLQUMsS0FNQUMsT0FBUyxJQUFJQyxFQU1iQyxNQUFRLElBQUlDLEVBTVpDLFNBQVcsSUFBSUMsRUFNeEJDLEtBTUFDLFVBTUFDLFNBTUFDLFNBUVAsWUFDRWIsRUFDQUMsRUFDQWEsRUFDQSxDQUVBLEtBQUtkLFdBQWFBLEVBQ2xCLEtBQUtDLFFBQVVBLEVBR2YsS0FBS0MsT0FDSFksR0FBWVosUUFDWixJQUFJYSxFQUFPLEdBQUdmLENBQUFBLElBQWNDLENBQUFBLEdBQVdlLEVBQWFDLElBQUksRUFHMUQsS0FBS2QsS0FBT1csR0FBWVgsTUFBUWUsRUFBV0MsTUFHdkNMLEdBQVlNLGVBQWMsS0FBS0EsYUFBZU4sRUFBV00sY0FDekROLEdBQVlPLFlBQVcsS0FBS0EsVUFBWVAsRUFBV08sV0FDbkRQLEdBQVlRLGFBQVksS0FBS0EsV0FBYVIsRUFBV1EsV0FDM0QsQ0FNT0YsYUFBYUcsRUFBdUIsQ0FFM0MsQ0FNT0YsVUFBVUUsRUFBdUIsQ0FFeEMsQ0FNT0QsV0FBV0MsRUFBdUIsQ0FFekMsQ0FDRixFS25LQSxPQUFTQyxZQUFBQSxNQUFnQixPQ0F6QixPQUFTQyxjQUFBQSxNQUFrQixtQkFFM0IsSUFBTUMsRUFBTixjQUEwQkMsQ0FBQUEsQ0FGMUIsTUFFMEJBLENBQUFBLEVBQUFBLG9CQUN4QixPQUF1QkMsV0FBYSxVQUNwQyxPQUF1QkMsUUFBeUIsQ0FBQSxDQUNsRCxFQUVNQyxFQUFOLGNBQWdDSCxDQUFBQSxDQVBoQyxNQU9nQ0EsQ0FBQUEsRUFBQUEsMEJBQzlCLE9BQXVCQyxXQUFhLGlCQUNwQyxPQUF1QkMsUUFBeUIsQ0FBQyxPQUFRLFNBQVUsU0FDckUsRURGQSxJQUFNRSxFQUFXQyxFQUFBLENBQUNDLEVBQWNDLElBQUFBLENBQzlCRCxFQUFNRSxlQUFlSixTQUNuQixVQUNBLDBDQUNDSyxHQUFBQSxDQUVDQSxFQUFTQyxZQUFjLENBQUMscUJBR3hCRCxFQUFTRSxTQUNQLENBQ0VDLE9BQVFDLENBQ1YsRUFDQSxDQUFDLENBQUVELE9BQUFBLENBQU0sSUFBRSxDQUVULEdBQUlBLEVBQU9FLFNBQVcsT0FBUSxPQUc5QixHQUFJUCxFQUFTUSxRQUFRQyxPQUFTLEVBQzVCLE1BQU8sQ0FDTEMsUUFBUyx5REFDWCxFQUdGLElBQU1GLEVBQVUsSUFBSVIsRUFBU1EsUUFBUUcsT0FBTSxHQUdyQ0QsRUFBVSxDQUFBLEVBR2hCLFFBQVdFLEtBQVVKLEVBRW5CRSxFQUFRRyxLQUFLLFFBQUtELEVBQU9FLFVBQVUsS0FBS0YsRUFBT0csT0FBTyxPQUFJLEVBSTVELE1BQU8sQ0FDTEwsUUFBUyx3QkFBcUJGLEVBQVFRLE1BQU0sV0FBUU4sRUFBUU8sS0FBSyxjQUFBLENBQUEsRUFDbkUsQ0FDRixDQUFBLEVBR0ZmLEVBQVNFLFNBQ1AsQ0FDRUMsT0FBUUMsRUFDUk0sT0FBUU0sQ0FDVixFQUNBLENBQUMsQ0FBRWIsT0FBQUEsRUFBUU8sT0FBQUEsQ0FBTSxJQUFFLENBRWpCLEdBQUlQLEVBQU9FLFNBQVcsVUFBWUYsRUFBT0UsU0FBVyxTQUFVLE9BRzlELElBQU1ZLEVBQWlCbkIsRUFBU1EsUUFBUVksSUFBSVIsRUFBT0wsTUFBTSxFQUd6RCxHQUFJLENBQUNZLEVBQ0gsTUFBTSxJQUFJRSxNQUFNLFVBQVVULEVBQU9MLE1BQU0sZ0JBQWdCLEVBR3pELEdBQUlGLEVBQU9FLFNBQVcsU0FFcEJQLE9BQUFBLEVBQVNzQixPQUFPSCxDQUFBQSxFQUdULENBQ0xULFFBQVMsbUNBQTZCUyxFQUFlTCxVQUFVLFFBQ2pFLEVBRUEsR0FBSUssRUFBZUksVUFFakIsTUFBTSxJQUFJRixNQUNSLFVBQVVGLEVBQWVMLFVBQVUsd0RBQXdELEVBSS9GZCxPQUFBQSxFQUFTd0IsT0FBT0wsQ0FBQUEsRUFHVCxDQUNMVCxRQUFTLGtDQUE0QlMsRUFBZUwsVUFBVSx5Q0FBbUNXLEVBQVNDLFFBQVFDLElBQUcsRUFBSTNCLEVBQVM0QixJQUFJLENBQUEsUUFDeEksQ0FFSixDQUFBLENBRUosRUFDQSxJQUFBLENBQ0UsTUFBTSxJQUFJUCxNQUFNLDZDQUFBLENBQ2xCLENBQUEsQ0FFSixFQXpGaUIsWUEyRmpCUSxFQUFlaEMsRU5yRWYsSUFBTWlDLEVBQWdELENBQ3BEQyxLQUFNLFlBQ05DLFNBQVUsR0FDVkMsV0FBWSxFQUNkLEVBRU1DLEdBQU4sS0FBTUEsQ0FwQ04sTUFvQ01BLENBQUFBLEVBQUFBLGlCQUllQyxTQUtBQyxXQUtIQyxPQUFTLElBQUlDLEVBQU8sVUFBV0MsRUFBYUMsYUFBYSxFQUt6REMsUUFBVSxJQUFJQyxJQUtYQyxVQUFZLElBQUlDLElBS25CQyxJQUNkLE9BQU9DLE9BQVcsS0FBZUEsUUFBUUMsVUFBWUEsUUFLdkQsSUFBV2hCLE1BQWUsQ0FDeEIsT0FBTyxLQUFLSyxXQUFXTCxJQUN6QixDQUtBLElBQVdBLEtBQUtpQixFQUFHLENBQ2pCLE1BQU0sSUFBSUMsTUFBTSxpQ0FBQSxDQUNsQixDQU9BLFlBQ0VkLEVBQ0FDLEVBQ0EsQ0FFQSxLQUFLRCxTQUFXQSxFQUdoQixLQUFLQyxXQUFhLENBQUUsR0FBR04sRUFBMkIsR0FBR00sQ0FBVyxFQUdoRUQsRUFBU2UsR0FBR0MsRUFBWUMsTUFBTyxLQUFLQyxNQUFNQyxLQUFLLElBQUksQ0FBQSxFQUNuRG5CLEVBQVNlLEdBQUdDLEVBQVlJLEtBQU0sS0FBS0MsS0FBS0YsS0FBSyxJQUFJLENBQUEsRUFHN0MsS0FBS2xCLFdBQVdKLFVBRWxCRyxFQUFTZSxHQUFHTyxFQUFXQyxnQkFBaUIsQ0FBQyxDQUFFQyxNQUFBQSxDQUFLLElBQUUsQ0FFaERDLEVBQVFELEVBQU8sSUFBSSxFQUduQixPQUFXLENBQUEsQ0FBR0UsQ0FBQUEsSUFBVyxLQUFLcEIsUUFFNUJrQixFQUFNRyxhQUNIQyxhQUFZLEdBQUlGLEVBQU9HLE9BQU9DLEtBQUssRUFDbkNDLGNBQWEsR0FBSUwsRUFBT0csT0FBT0csTUFBTSxFQUd4Q1IsRUFBTVMsWUFDSEwsYUFBWSxHQUFJRixFQUFPUSxNQUFNSixLQUFLLEVBQ2xDQyxjQUFhLEdBQUlMLEVBQU9RLE1BQU1GLE1BQU0sRUFHdkNSLEVBQU1XLGNBQ0hQLGFBQVksR0FBSUYsRUFBT1UsU0FBU04sS0FBSyxFQUNyQ0MsY0FBYSxHQUFJTCxFQUFPVSxTQUFTSixNQUFNLENBRTlDLENBQUEsRUFJRSxLQUFLL0IsV0FBV0gsWUFBWSxLQUFLQSxXQUFVLENBQ2pELENBS09BLFlBQW1CLENBRW5CdUMsRUFBV0MsRUFBUSxLQUFLMUMsSUFBSSxDQUFBLEdBRS9CMkMsRUFBVUQsRUFBUSxLQUFLMUMsSUFBSSxFQUFHLENBQUU0QyxVQUFXLEVBQUssQ0FBQSxFQVFsRCxJQUFNQyxFQUxVQyxFQUFZSixFQUFRLEtBQUsxQyxJQUFJLEVBQUcsQ0FDOUMrQyxjQUFlLEVBQ2pCLENBQUEsRUFHd0JDLE9BQVFDLEdBQzlCQSxFQUFPQyxPQUFNLEVBQUtELEVBQU9FLEtBQUtDLFNBQVMsU0FBQSxFQUFhLEVBQUEsRUFJdEQsUUFBV0MsS0FBVVIsRUFFbkIsR0FBSSxDQUVGLElBQU03QyxFQUFPMEMsRUFBUSxLQUFLMUMsS0FBTXFELEVBQU9GLElBQUksRUFHckNHLEVBQVNDLEVBQVlDLEVBQWF4RCxDQUFBQSxDQUFBQSxFQUNsQ3lELEVBQVMsSUFBSUMsRUFBYUosQ0FBQUEsRUFHMUJLLEVBQU9GLEVBQU9HLFNBQVEsRUFHNUIsR0FBSUQsSUFBU0UsRUFBV0MsTUFBTyxDQUU3QixJQUFNQyxFQUFRTixFQUFPTyxvQkFBbUIsRUFBR0MsU0FBUyxPQUFBLEVBRzlDQyxFQUFXeEIsRUFBUSxLQUFLMUMsS0FBTXFELEVBQU9GLEtBQUtnQixNQUFNLEVBQUcsRUFBQyxDQUFBLEVBQzFEQyxFQUFjRixFQUFVSCxDQUFBQSxFQU14QixJQUFNakMsRUFIU3VDLEVBQVFILENBQUFBLEVBR0RJLFFBR3RCLEdBQUksS0FBSzVELFFBQVE2RCxJQUFJekMsRUFBTzBDLFVBQVUsRUFBRyxDQUN2QyxLQUFLbEUsT0FBT21FLEtBQ1YsOEJBQTJCM0MsRUFBTzBDLFVBQVUsc0RBQW1ELEVBSWpHLFFBQ0YsQ0FHQTFDLEVBQU80QyxTQUFXLEtBQ2xCNUMsRUFBTzFCLFNBQVcsS0FBS0EsU0FDdkIwQixFQUFPOUIsS0FBT0EsRUFDZDhCLEVBQU82QyxVQUFZLEdBR25CLEtBQUtqRSxRQUFRa0UsSUFBSTlDLEVBQU8wQyxXQUFZMUMsQ0FBQUEsRUFHcENBLEVBQU8rQyxhQUFhL0MsQ0FBQUEsRUFDcEIsS0FBS2dELFdBQVdoRCxDQUFBQSxFQUdoQmlELEVBQVlDLFFBQVFDLEtBQUtuRCxFQUFPMEMsVUFBVSxFQUcxQyxLQUFLNUQsVUFBVXNFLElBQUloQixDQUFBQSxDQUNyQixTQUFXUCxJQUFTRSxFQUFXc0IsSUFBSyxDQUVsQyxJQUFNN0IsRUFBU0csRUFBT08sb0JBQW1CLEVBR3pDb0IsRUFBV3BGLENBQUFBLEVBR1gsSUFBTWtFLEVBQVd4QixFQUFRLEtBQUsxQyxLQUFNcUQsRUFBT0YsS0FBS2dCLE1BQU0sRUFBRyxFQUFDLENBQUEsRUFHMURDLEVBQWNGLEVBQVVaLENBQUFBLEVBR3hCK0IsRUFBUyxZQUFZbkIsQ0FBQUEsT0FBZSxLQUFLbEUsSUFBSSxHQUFJLENBQy9Dc0YsTUFBTyxRQUNULENBQUEsRUFHQUYsRUFBV2xCLENBQUFBLEVBR1gsSUFBTWYsRUFBT0UsRUFBT0YsS0FBS2dCLE1BQU0sRUFBRyxFQUFDLEVBR25Db0IsRUFBVzdDLEVBQVEsS0FBSzFDLEtBQU0sU0FBQSxFQUFZMEMsRUFBUSxLQUFLMUMsS0FBTW1ELENBQUFBLENBQUFBLEVBRzdEa0MsRUFBUyxjQUFlLENBQ3RCRyxJQUFLOUMsRUFBUSxLQUFLMUMsS0FBTW1ELENBQUFBLEVBQ3hCbUMsTUFBTyxRQUNULENBQUEsQ0FDRixDQUNGLE9BQVNHLEVBQVEsQ0FFZixLQUFLbkYsT0FBT29GLE1BQ1YsK0JBQStCQyxFQUFTQyxRQUFRSixJQUFHLEVBQUk5QyxFQUFRLEtBQUsxQyxLQUFNcUQsRUFBT0YsSUFBSSxDQUFBLENBQUEsMEJBQ3JGc0MsQ0FBQUEsQ0FFSixDQUlGLElBQU1JLEVBQWMvQyxFQUFZSixFQUFRLEtBQUsxQyxJQUFJLEVBQUcsQ0FDbEQrQyxjQUFlLEVBQ2pCLENBQUEsRUFBR0MsT0FBUUMsR0FBV0EsRUFBTzZDLFlBQVcsQ0FBQSxFQUd4QyxRQUFXQyxLQUFhRixFQUV0QixHQUFJLENBRUYsSUFBTTdGLEVBQU8wQyxFQUFRLEtBQUsxQyxLQUFNK0YsRUFBVTVDLElBQUksRUFHOUMsR0FBSSxDQUFDVixFQUFXQyxFQUFRMUMsRUFBTSxjQUFBLENBQUEsRUFBa0IsU0FHaEQsSUFBTWdHLEVBQVdDLEtBQUtDLE1BQ3BCMUMsRUFBYWQsRUFBUTFDLEVBQU0sY0FBQSxFQUFpQixPQUFBLENBQUEsRUFLeENtRyxFQUFPekQsRUFBUTFDLEVBQU1nRyxFQUFTRyxJQUFJLEVBR3hDLEdBQUksQ0FBQzFELEVBQVdDLEVBQVExQyxFQUFNbUcsQ0FBQUEsQ0FBQUEsRUFBUSxDQUNwQyxLQUFLN0YsT0FBT21FLEtBQ1YsOEJBQTJCdUIsRUFBUzdDLElBQUksY0FBUTZDLEVBQVNJLE9BQU8sb0NBQThCVCxFQUFTQyxRQUFRSixJQUFHLEVBQUk5QyxFQUFRMUMsRUFBTW1HLENBQUFBLENBQUFBLENBQUFBLHdDQUEyQyxFQUlqTCxRQUNGLENBTUEsSUFBTXJFLEVBSFN1QyxFQUFRM0IsRUFBUTFDLEVBQU1tRyxDQUFBQSxDQUFBQSxFQUdmN0IsUUFHdEIsR0FBSSxLQUFLNUQsUUFBUTZELElBQUl6QyxFQUFPMEMsVUFBVSxFQUFHLENBQ3ZDLEtBQUtsRSxPQUFPbUUsS0FDViw4QkFBMkIzQyxFQUFPMEMsVUFBVSxzREFBbUQsRUFJakcsUUFDRixDQUdBMUMsRUFBTzRDLFNBQVcsS0FDbEI1QyxFQUFPMUIsU0FBVyxLQUFLQSxTQUN2QjBCLEVBQU85QixLQUFPQSxFQUNkOEIsRUFBTzZDLFVBQVksR0FHbkIsS0FBS2pFLFFBQVFrRSxJQUFJOUMsRUFBTzBDLFdBQVkxQyxDQUFBQSxFQUdwQ2lELEVBQVlDLFFBQVFDLEtBQUtuRCxFQUFPMEMsVUFBVSxFQUcxQzFDLEVBQU8rQyxhQUFhL0MsQ0FBQUEsRUFDcEIsS0FBS2dELFdBQVdoRCxDQUFBQSxDQUNsQixPQUFTMkQsRUFBUSxDQUVmLEtBQUtuRixPQUFPb0YsTUFDViwrQkFBK0JDLEVBQVNDLFFBQVFKLElBQUcsRUFBSTlDLEVBQVEsS0FBSzFDLEtBQU0rRixFQUFVNUMsSUFBSSxDQUFBLENBQUEsMEJBQ3hGc0MsQ0FBQUEsQ0FFSixDQUVKLENBS09uRSxPQUFjLENBRW5CLFFBQVdRLEtBQVUsS0FBS3BCLFFBQVEyRixPQUFNLEVBQUl2RSxFQUFPd0UsVUFBVXhFLENBQUFBLENBQy9ELENBS09MLE1BQWEsQ0FFbEIsUUFBV0ssS0FBVSxLQUFLcEIsUUFBUTJGLE9BQU0sRUFBSXZFLEVBQU95RSxXQUFXekUsQ0FBQUEsRUFHOUQsUUFBV29DLEtBQVksS0FBS3RELFVBRTFCd0UsRUFBV2xCLENBQUFBLENBRWYsQ0FFT3NDLE9BQU8xRSxFQUFzQixDQUVsQ0EsRUFBT3lFLFdBQVd6RSxDQUFBQSxFQUdsQixLQUFLcEIsUUFBUStGLE9BQU8zRSxFQUFPMEMsVUFBVSxFQUdyQyxJQUFNeEUsRUFBTzhCLEVBQU85QixLQUlwQixPQUFPcUUsRUFBUXFDLE1BQU1yQyxFQUFRM0IsUUFBUTFDLENBQUFBLENBQUFBLEVBR3JDLEtBQUtJLFNBQVN1RyxXQUFXM0csQ0FBQUEsRUFHekIsR0FBSSxDQU1GLElBQU00RyxFQUhTdkMsRUFBUXJFLENBQUFBLEVBR0FzRSxRQUd2QixHQUFJLEVBQUVzQyxhQUFtQkMsR0FBUyxDQUNoQyxLQUFLdkcsT0FBT21FLEtBQ1YscUNBQWtDa0IsRUFBU0MsUUFBUUosSUFBRyxFQUFJeEYsQ0FBQUEsQ0FBQUEsMkRBQTZELEVBSXpILE1BQ0YsQ0FHQTRHLEVBQVFsQyxTQUFXLEtBQ25Ca0MsRUFBUXhHLFNBQVcsS0FBS0EsU0FDeEJ3RyxFQUFRNUcsS0FBT0EsRUFHZixLQUFLVSxRQUFRa0UsSUFBSWdDLEVBQVFwQyxXQUFZb0MsQ0FBQUEsRUFHckNBLEVBQVEvQixhQUFhK0IsQ0FBQUEsRUFDckIsS0FBSzlCLFdBQVc4QixDQUFBQSxFQUdoQkEsRUFBUU4sVUFBVU0sQ0FBQUEsRUFHbEIsS0FBS3RHLE9BQU93RyxLQUNWLHFDQUFrQ0YsRUFBUXBDLFVBQVUsbUJBQWFtQixFQUFTQyxRQUFRSixJQUFHLEVBQUl4RixDQUFBQSxDQUFBQSxRQUFVLENBRXZHLE9BQVN5RixFQUFRLENBRWYsS0FBS25GLE9BQU9vRixNQUNWLHFDQUFrQ0MsRUFBU0MsUUFBUUosSUFBRyxFQUFJeEYsQ0FBQUEsQ0FBQUEsOEJBQzFEeUYsQ0FBQUEsQ0FFSixDQUNGLENBRU9wQyxPQUFPdkIsRUFBc0IsQ0FFbEMsSUFBTTJCLEVBQVMsSUFBSUMsRUFLbkIsR0FGQUQsRUFBT3NELFVBQVVqRixFQUFPNkIsSUFBSSxFQUV4QjdCLEVBQU82QixPQUFTRSxFQUFXQyxNQUFPLENBRXBDLElBQU1rRCxFQUFZdEUsRUFBUVosRUFBTzlCLEtBQU0sTUFBQSxFQUdqQytELEVBQVFQLEVBQWFkLEVBQVFzRSxFQUFXLFVBQUEsQ0FBQSxFQUc5Q3ZELEVBQU93RCxZQUFZbEQsQ0FBQUEsRUFHbkJLLEVBQ0UxQixFQUFRLEtBQUsxQyxLQUFNLEdBQUc4QixFQUFPMEMsVUFBVSxTQUFTLEVBQ2hEMEMsRUFBWXpELEVBQU8wRCxVQUFTLENBQUEsQ0FBQSxDQUVoQyxTQUFXckYsRUFBTzZCLE9BQVNFLEVBQVdzQixJQUFLLENBRXpDRSxFQUFTLFdBQVksQ0FBRUcsSUFBSzFELEVBQU85QixLQUFNc0YsTUFBTyxRQUFTLENBQUEsRUFHekQsSUFBTThCLEVBQVV0RSxFQUFZaEIsRUFBTzlCLElBQUksRUFBRXFILEtBQU1DLEdBQzdDQSxFQUFLbEUsU0FBUyxNQUFBLENBQUEsRUFJaEIsR0FBSSxDQUFDZ0UsRUFBUyxNQUFNLElBQUlsRyxNQUFNLDJCQUFBLEVBRzlCLElBQU1vQyxFQUFTRSxFQUFhZCxFQUFRWixFQUFPOUIsS0FBTW9ILENBQUFBLENBQUFBLEVBR2pEaEMsRUFBVzFDLEVBQVFaLEVBQU85QixLQUFNb0gsQ0FBQUEsQ0FBQUEsRUFHaEMzRCxFQUFPd0QsWUFBWTNELENBQUFBLEVBR25CYyxFQUNFMUIsRUFBUSxLQUFLMUMsS0FBTSxHQUFHOEIsRUFBTzBDLFVBQVUsU0FBUyxFQUNoRDBDLEVBQVl6RCxFQUFPMEQsVUFBUyxDQUFBLENBQUEsQ0FFaEMsQ0FDRixDQUVVckMsV0FBV2hELEVBQXNCLENBRXpDLElBQU15RixFQUFZQyxPQUFPQyxlQUFlM0YsQ0FBQUEsRUFHbEM0RixFQUFhRixPQUFPRyxvQkFBb0JKLENBQUFBLEVBRzFDSyxFQUFZSixPQUFPSyxLQUFLbkcsQ0FBQUEsRUFDNUJrRyxFQUFZQSxFQUFVekQsTUFBTXlELEVBQVVFLE9BQVMsQ0FBQSxFQUcvQyxRQUFXQyxLQUFZSCxFQUFXLENBRWhDLElBQU03RCxFQUFRNkQsRUFBVUksUUFBUUQsQ0FBQUEsRUFHaEMsR0FBSUwsRUFBV08sU0FBUyxLQUFPRixDQUFBQSxFQUFXLENBRXhDLElBQU1HLEVBQVFwRyxFQUFRLEtBQU9pRyxDQUFBQSxFQUd6QixPQUFPRyxHQUFVLFlBRW5CLEtBQUs5SCxTQUFTZSxHQUFHNEMsRUFBT21FLEVBQU0zRyxLQUFLTyxDQUFBQSxDQUFBQSxDQUN2QyxDQUdBLEdBQUk0RixFQUFXTyxTQUFTLFNBQVdGLENBQUFBLEVBQVcsQ0FFNUMsSUFBTUcsRUFBUXBHLEVBQVEsU0FBV2lHLENBQUFBLEVBRzdCLE9BQU9HLEdBQVUsWUFFbkIsS0FBSzlILFNBQVMrSCxPQUFPcEUsRUFBT21FLEVBQU0zRyxLQUFLTyxDQUFBQSxDQUFBQSxDQUMzQyxDQUdBLEdBQUk0RixFQUFXTyxTQUFTLFFBQVVGLENBQUFBLEVBQVcsQ0FFM0MsSUFBTUcsRUFBUXBHLEVBQVEsUUFBVWlHLENBQUFBLEVBRzVCLE9BQU9HLEdBQVUsWUFFbkIsS0FBSzlILFNBQVNnSSxNQUFNckUsRUFBT21FLEVBQU0zRyxLQUFLTyxDQUFBQSxDQUFBQSxDQUMxQyxDQUNGLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAicmVuYW1lU3luYyIsICJ1bmxpbmtTeW5jIiwgIndyaXRlRmlsZVN5bmMiLCAicmVsYXRpdmUiLCAicmVzb2x2ZSIsICJkZWZsYXRlU3luYyIsICJpbmZsYXRlU3luYyIsICJleGVjU3luYyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlNlcnZlckV2ZW50IiwgIldvcmxkRXZlbnQiLCAiQmluYXJ5U3RyZWFtIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiUGx1Z2luVHlwZSIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW4iLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJ0eXBlIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkN1c3RvbUVudW0iLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
|
|
1
|
+
var F=Object.defineProperty;var p=(o,t)=>F(o,"name",{value:t,configurable:!0}),c=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});import{existsSync as S,mkdirSync as _,readdirSync as $,readFileSync as y,renameSync as W,unlinkSync as x,writeFileSync as w}from"node:fs";import{relative as g,resolve as n}from"node:path";import{deflateSync as O,inflateSync as K}from"node:zlib";import{execSync as E}from"node:child_process";import{Logger as N,LoggerColors as M}from"@serenityjs/logger";import{ServerEvent as R,WorldEvent as U}from"@serenityjs/core";import{BinaryStream as D}from"@serenityjs/binarystream";import{Logger as j,LoggerColors as q}from"@serenityjs/logger";var f=function(o){return o[o.Addon=0]="Addon",o[o.Api=1]="Api",o}(f||{});var T=class{static{p(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var k=class{static{p(this,"PluginItemRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var B=class{static{p(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...t){return this.types.push(...t),this}unregisterType(t){let i=this.types.indexOf(t);return i!==-1&&this.types.splice(i,1),this}registerTrait(...t){return this.traits.push(...t),this}unregisterTrait(t){let i=this.traits.indexOf(t);return i!==-1&&this.traits.splice(i,1),this}};var z=class{static{p(this,"Plugin")}identifier;version;logger;type;blocks=new T;items=new k;entities=new B;path;isBundled;pipeline;serenity;constructor(t,i,s){this.identifier=t,this.version=i,this.logger=s?.logger??new j(`${t}@${i}`,q.Blue),this.type=s?.type??f.Addon,s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}onInitialize(t){}onStartUp(t){}onShutDown(t){}};import{relative as C}from"path";import{CustomEnum as A}from"@serenityjs/core";var m=class extends A{static{p(this,"PluginsEnum")}static identifier="plugins";static options=[]},v=class extends A{static{p(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var L=p((o,t)=>{o.commandPalette.register("plugins","Interact with the plugins of the server",i=>{i.permissions=["serenity.operator"],i.overload({action:v},({action:s})=>{if(s.result!=="list")return;if(t.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let e=[...t.plugins.values()],r=[];for(let u of e)r.push(`\xA7u${u.identifier} v${u.version}\xA7r`);return{message:`\xA77Active Plugins (${e.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),i.overload({action:v,plugin:m},({action:s,plugin:e})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=t.plugins.get(e.result);if(!r)throw new Error(`Plugin ${e.result} is not found.`);if(s.result==="reload")return t.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 t.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${C(process.cwd(),t.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),I=L;var J={path:"./plugins",commands:!0,initialize:!0},qt=class{static{p(this,"Pipeline")}serenity;properties;logger=new N("Plugins",M.MaterialLapis);plugins=new Map;tempPaths=new Set;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(t){throw new Error("The path property is read-only.")}constructor(t,i){this.serenity=t,this.properties={...J,...i},t.on(R.Start,this.start.bind(this)),t.on(R.Stop,this.stop.bind(this)),t.on(U.WorldInitialize,({world:s})=>{this.properties.commands&&I(s,this);for(let[,e]of this.plugins)s.blockPalette.registerType(...e.blocks.types).registerTrait(...e.blocks.traits),s.itemPalette.registerType(...e.items.types).registerTrait(...e.items.traits),s.entityPalette.registerType(...e.entities.types).registerTrait(...e.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){S(n(this.path))||_(n(this.path),{recursive:!0});let i=$(n(this.path),{withFileTypes:!0}).filter(e=>e.isFile()?e.name.endsWith(".plugin"):!1);for(let e of i)try{let r=n(this.path,e.name),u=K(y(r)),a=new D(u),P=a.readByte();if(P===f.Addon){let l=a.readRemainingBuffer().toString("utf-8"),d=n(this.path,e.name.slice(0,-7));w(d,l);let h=c(d).default;if(this.plugins.has(h.identifier)){this.logger.warn(`Unable to load plugin \xA71${h.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}h.pipeline=this,h.serenity=this.serenity,h.path=r,h.isBundled=!0,this.plugins.set(h.identifier,h),h.onInitialize(h),this.bindEvents(h),m.options.push(h.identifier),this.tempPaths.add(d)}else if(P===f.Api){let l=a.readRemainingBuffer();x(r);let d=n(this.path,e.name.slice(0,-7));w(d,l),E(`tar -xzf ${d} -C ${this.path}`,{stdio:"ignore"}),x(d);let b=e.name.slice(0,-7);W(n(this.path,"package"),n(this.path,b)),E("npm install",{cwd:n(this.path,b),stdio:"ignore"})}}catch(r){this.logger.error(`Failed to load plugin from "${g(process.cwd(),n(this.path,e.name))}", skipping the plugin.`,r)}let s=$(n(this.path),{withFileTypes:!0}).filter(e=>e.isDirectory());for(let e of s)try{let r=n(this.path,e.name);if(!S(n(r,"package.json")))continue;let u=JSON.parse(y(n(r,"package.json"),"utf-8")),a=n(r,u.main);if(!S(n(r,a))){this.logger.warn(`Unable to load plugin \xA71${u.name}\xA78@\xA71${u.version}\xA7r, the main entry path "\xA78${g(process.cwd(),n(r,a))}\xA7r" was not found in the directory.`);continue}let l=c(n(r,a)).default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA71${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=r,l.isBundled=!1,this.plugins.set(l.identifier,l),m.options.push(l.identifier),l.onInitialize(l),this.bindEvents(l)}catch(r){this.logger.error(`Failed to load plugin from "${g(process.cwd(),n(this.path,e.name))}", skipping the plugin.`,r)}}start(){for(let t of this.plugins.values())t.onStartUp(t)}stop(){for(let t of this.plugins.values())t.onShutDown(t);for(let t of this.tempPaths)x(t)}reload(t){t.onShutDown(t),this.plugins.delete(t.identifier);let i=t.path;delete c.cache[c.resolve(i)],this.serenity.removePath(i);try{let e=c(i).default;if(!(e instanceof z)){this.logger.warn(`Unable to reload plugin from \xA78${g(process.cwd(),i)}\xA7r, the plugin is not an instance of the Plugin class.`);return}e.pipeline=this,e.serenity=this.serenity,e.path=i,this.plugins.set(e.identifier,e),e.onInitialize(e),this.bindEvents(e),e.onStartUp(e),this.logger.info(`Successfully reloaded plugin \xA71${e.identifier}\xA7r from \xA78${g(process.cwd(),i)}\xA7r.`)}catch(s){this.logger.error(`Failed to reload plugin from \xA78${g(process.cwd(),i)}\xA7r, skipping the plugin.`,s)}}bundle(t){let i=new D;if(i.writeByte(t.type),t.type===f.Addon){let s=n(t.path,"dist"),e=y(n(s,"index.js"));i.writeBuffer(e),w(n(this.path,`${t.identifier}.plugin`),O(i.getBuffer()))}else if(t.type===f.Api){E("npm pack",{cwd:t.path,stdio:"ignore"});let s=$(t.path).find(r=>r.endsWith(".tgz"));if(!s)throw new Error("Packed tarball not found.");let e=y(n(t.path,s));x(n(t.path,s)),i.writeBuffer(e),w(n(this.path,`${t.identifier}.plugin`),O(i.getBuffer()))}}bindEvents(t){let i=Object.getPrototypeOf(t),s=Object.getOwnPropertyNames(i),e=Object.keys(U);e=e.slice(e.length/2);for(let r of e){let u=e.indexOf(r);if(s.includes("on"+r)){let a=t["on"+r];typeof a=="function"&&this.serenity.on(u,a.bind(t))}if(s.includes("before"+r)){let a=t["before"+r];typeof a=="function"&&this.serenity.before(u,a.bind(t))}if(s.includes("after"+r)){let a=t["after"+r];typeof a=="function"&&this.serenity.after(u,a.bind(t))}}}};export{J as DefaultPipelineProperties,qt as Pipeline,z as Plugin,f as PluginType};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL3JlZ2lzdHJ5L2Jsb2NrLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9pdGVtLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9lbnRpdHkudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5NYXRlcmlhbExhcGlzKTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSB3b3JsZCBpbml0aWFsaXplIGV2ZW50XG4gICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+IHtcbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kcyBmb3IgdGhlIHBsdWdpbnNcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIENvbW1hbmQod29ybGQsIHRoaXMpO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgcmVnaXN0ZXIgdGhlIGJsb2NrcywgaXRlbXMsIGFuZCBlbnRpdGllc1xuICAgICAgZm9yIChjb25zdCBbLCBwbHVnaW5dIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2tzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uYmxvY2tzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5ibG9ja3MudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLml0ZW1zLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5pdGVtcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdGllcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmVudGl0eVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5lbnRpdGllcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uZW50aXRpZXMudHJhaXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGZpbGVzIHRoYXQgaGF2ZSBhIC5wbHVnaW4gZXh0ZW5zaW9uXG4gICAgY29uc3QgYnVuZGxlcyA9IGVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+XG4gICAgICBkaXJlbnQuaXNGaWxlKCkgPyBkaXJlbnQubmFtZS5lbmRzV2l0aChcIi5wbHVnaW5cIikgOiBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBidW5kbGVkIHBsdWdpbnMsIGFuZCBpbXBvcnQgdGhlbVxuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcGx1Z2luXG4gICAgICB0cnkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSAucGx1Z2luIGZpbGUgYW5kIGluZmxhdGUgaXQsIGFuZCBjcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbVxuICAgICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIHR5cGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHR5cGUgaXMgdmFsaWRcbiAgICAgICAgaWYgKHR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIG9yIG1haW4gZW50cnkgcG9pbnRzIHRvIHRlbXBvcmFyeSBmaWxlc1xuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZSh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7cGx1Z2luLmlkZW50aWZpZXJ9wqdyLCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgICB0aGlzLnBsdWdpbnMuc2V0KHBsdWdpbi5pZGVudGlmaWVyLCBwbHVnaW4pO1xuXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKHBsdWdpbik7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdGVtcG9yYXJ5IHBhdGggdG8gdGhlIHNldFxuICAgICAgICAgIHRoaXMudGVtcFBhdGhzLmFkZCh0ZW1wUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKTtcblxuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgLnBsdWdpbiBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyhwYXRoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gYSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIGNvbnN0IHRlbXBQYXRoID0gcmVzb2x2ZSh0aGlzLnBhdGgsIGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KSk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGJ1ZmZlcik7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSB0YXJiYWxsIHRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgICAgICAgIGV4ZWNTeW5jKGB0YXIgLXh6ZiAke3RlbXBQYXRofSAtQyAke3RoaXMucGF0aH1gLCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgIHVubGlua1N5bmModGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gbmFtZSBmcm9tIHRoZSB0YXJiYWxsXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ1bmRsZS5uYW1lLnNsaWNlKDAsIC03KTtcblxuICAgICAgICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIFwicGFja2FnZVwiIGRpcmVjdG9yeSB0byB0aGUgcGx1Z2luIG5hbWVcbiAgICAgICAgICByZW5hbWVTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcInBhY2thZ2VcIiksIHJlc29sdmUodGhpcy5wYXRoLCBuYW1lKSk7XG5cbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBleGVjU3luYyhcIm5wbSBpbnN0YWxsXCIsIHtcbiAgICAgICAgICAgIGN3ZDogcmVzb2x2ZSh0aGlzLnBhdGgsIG5hbWUpLFxuICAgICAgICAgICAgc3RkaW86IFwiaWdub3JlXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBkaXJlY3RvcmllcyBmcm9tIHRoZSBlbnRyaWVzXG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KS5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZGlyZWN0b3JpZXMsIGNoZWNraW5nIGlmIHRoZXkgYXJlIHZhbGlkIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGEgcGFja2FnZS5qc29uIGZpbGUsIGlmIG5vdCwgc2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgICAvLyBHZXQgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgdGhpcy5lc20gPyBtYW5pZmVzdC5tb2R1bGUgOiBtYW5pZmVzdC5tYWluKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgbWFuaWZlc3QubWFpbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHBhdGgsIG1haW4pKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgVW5hYmxlIHRvIGxvYWQgcGx1Z2luIMKnMSR7bWFuaWZlc3QubmFtZX3CpzhAwqcxJHttYW5pZmVzdC52ZXJzaW9ufcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHBhdGgsIG1haW4pKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oYXMocGx1Z2luLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgICAgcGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICBwbHVnaW4uaXNCdW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHRoaXMucGF0aCwgZGlyZWN0b3J5Lm5hbWUpKX1cIiwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgdXAgYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TdGFydFVwKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAvLyBTaHV0IGRvd24gYWxsIHRoZSBwbHVnaW5zXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zLnZhbHVlcygpKSBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gRGVsZXRlIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzXG4gICAgZm9yIChjb25zdCB0ZW1wUGF0aCBvZiB0aGlzLnRlbXBQYXRocykge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBEeW5hbWljIGRlbGV0ZSBpcyByZXF1aXJlZCBoZXJlXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG5cbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocGF0aCk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgclBsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICBpZiAoIShyUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgclBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICByUGx1Z2luLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQoclBsdWdpbi5pZGVudGlmaWVyLCByUGx1Z2luKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uSW5pdGlhbGl6ZShyUGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhyUGx1Z2luKTtcblxuICAgICAgLy8gU3RhcnQgdXAgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5vblN0YXJ0VXAoclBsdWdpbik7XG5cbiAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCByZWxvYWRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTdWNjZXNzZnVsbHkgcmVsb2FkZWQgcGx1Z2luIMKnMSR7clBsdWdpbi5pZGVudGlmaWVyfcKnciBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLmBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsdWdpbiB0eXBlIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVCeXRlKHBsdWdpbi50eXBlKTtcblxuICAgIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BZGRvbikge1xuICAgICAgLy8gR2V0IHRoZSBhZGRvbiBwYXRoXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGVcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoaW5wdXRQYXRoLCBcImluZGV4LmpzXCIpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCB0byB0aGUgc3RyZWFtXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgLy8gUGFjayB0aGUgcGx1Z2luXG4gICAgICBleGVjU3luYyhcIm5wbSBwYWNrXCIsIHsgY3dkOiBwbHVnaW4ucGF0aCwgc3RkaW86IFwiaWdub3JlXCIgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFyYmFsbCBwYXRoXG4gICAgICBjb25zdCB0YXJiYWxsID0gcmVhZGRpclN5bmMocGx1Z2luLnBhdGgpLmZpbmQoKGZpbGUpID0+XG4gICAgICAgIGZpbGUuZW5kc1dpdGgoXCIudGd6XCIpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdGFyYmFsbCBleGlzdHNcbiAgICAgIGlmICghdGFyYmFsbCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2VkIHRhcmJhbGwgbm90IGZvdW5kLlwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmZmVyKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpblR5cGUgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcblxuaW50ZXJmYWNlIFBsdWdpblByb3BlcnRpZXMgZXh0ZW5kcyBQYXJ0aWFsPFBsdWdpbkV2ZW50cz4ge1xuICBsb2dnZXI6IExvZ2dlcjtcbiAgdHlwZTogUGx1Z2luVHlwZTtcbn1cblxuLyoqXG4gKiAjIEludHJvZHVjdGlvblxuICogUGx1Z2lucyBhcmUgdGhlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBTZXJlbml0eUpTLlxuICogVGhleSBhcmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIGFsbG93cyB0b3RhbCBjb250cm9sIG92ZXIgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGVyZSBhcmUgMiB0eXBlcyBvZiBwbHVnaW5zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGBQbHVnaW5UeXBlYCBlbnVtOiBgQWRkb25gICYgYEFwaWBcbiAqXG4gKiBBZGRvbiBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbm5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqIEFwaSBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW4gZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKlxuICogIyMgQ2xhc3MgRXh0ZW5kaW5nIFBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IFBsdWdpbiwgUGx1Z2luVHlwZSwgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIkBzZXJlbml0eWpzL3BsdWdpbnNcIjtcbiAqXG4gKiBjbGFzcyBTYW1wbGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICogICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IFBsdWdpblR5cGUuQWRkb247XG4gKlxuICogICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJzYW1wbGUtcGx1Z2luXCIsIFwiMS4wLjBcIik7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBvbkluaXRpYWxpemUoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU3RhcnRVcCgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TaHV0RG93bigpOiB2b2lkIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgbmV3IFNhbXBsZVBsdWdpbigpO1xuICogYGBgXG4gKi9cbmNsYXNzIFBsdWdpbiBpbXBsZW1lbnRzIFBsdWdpblByb3BlcnRpZXMge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBibG9jayByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9ja3MgPSBuZXcgUGx1Z2luQmxvY2tSZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtcyA9IG5ldyBQbHVnaW5JdGVtUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSByZWdpc3RyeSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcy90cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdGllcyA9IG5ldyBQbHVnaW5FbnRpdHlSZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGx1Z2luUHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIHByb3BlcnRpZXM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0aWVzPy50eXBlID8/IFBsdWdpblR5cGUuQWRkb247XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIHByb3BlcnRpZXNcbiAgICBpZiAocHJvcGVydGllcz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IHByb3BlcnRpZXMub25Jbml0aWFsaXplO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gcHJvcGVydGllcy5vblN0YXJ0VXA7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IHByb3BlcnRpZXMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5Qcm9wZXJ0aWVzIH07XG4iLCAiLyoqXG4gKiBUaGUgcGx1Z2luIHR5cGUgZGVjbGFyZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSBwbHVnaW4uXG4gKi9cbmVudW0gUGx1Z2luVHlwZSB7XG4gIC8qKlxuICAgKiBBbiBhZGRvbiBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRob3V0IGFuIGV4cG9zZWQgQVBJLlxuICAgKi9cbiAgQWRkb24sXG5cbiAgLyoqXG4gICAqIEFuIEFQSSBwbHVnaW4gdHlwZSBhZGRzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aXRoIGFuIGV4cG9zZWQgQVBJIGZvciBvdGhlciBwbHVnaW5zIHRvIHVzZS5cbiAgICovXG4gIEFwaVxufVxuXG5leHBvcnQgeyBQbHVnaW5UeXBlIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtVHJhaXQsIEN1c3RvbUl0ZW1UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luSXRlbVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtVHJhaXQ+ID0gW107XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUoLi4udHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21JdGVtVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luSXRlbVJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBFbnRpdHlUcmFpdCwgQ3VzdG9tRW50aXR5VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkVudGl0eVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tRW50aXR5VHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEVudGl0eVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkVudGl0eVJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZFBhbGV0dGUucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25zID0gW1wic2VyZW5pdHkub3BlcmF0b3JcIl07XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNFbnVtLCBQbHVnaW5BY3Rpb25zRW51bSB9O1xu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ICJyZWFkRmlsZVN5bmMiLCAicmVuYW1lU3luYyIsICJ1bmxpbmtTeW5jIiwgIndyaXRlRmlsZVN5bmMiLCAicmVsYXRpdmUiLCAicmVzb2x2ZSIsICJkZWZsYXRlU3luYyIsICJpbmZsYXRlU3luYyIsICJleGVjU3luYyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlNlcnZlckV2ZW50IiwgIldvcmxkRXZlbnQiLCAiQmluYXJ5U3RyZWFtIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiUGx1Z2luVHlwZSIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgInR5cGVzIiwgInRyYWl0cyIsICJyZWdpc3RlclR5cGUiLCAicHVzaCIsICJ1bnJlZ2lzdGVyVHlwZSIsICJ0eXBlIiwgImluZGV4IiwgImluZGV4T2YiLCAic3BsaWNlIiwgInJlZ2lzdGVyVHJhaXQiLCAidW5yZWdpc3RlclRyYWl0IiwgInRyYWl0IiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW4iLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJ0eXBlIiwgImJsb2NrcyIsICJQbHVnaW5CbG9ja1JlZ2lzdHJ5IiwgIml0ZW1zIiwgIlBsdWdpbkl0ZW1SZWdpc3RyeSIsICJlbnRpdGllcyIsICJQbHVnaW5FbnRpdHlSZWdpc3RyeSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkN1c3RvbUVudW0iLCAiUGx1Z2luc0VudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgInBpcGVsaW5lIiwgImNvbW1hbmRQYWxldHRlIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25zIiwgIm92ZXJsb2FkIiwgImFjdGlvbiIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZXN1bHQiLCAicGx1Z2lucyIsICJzaXplIiwgIm1lc3NhZ2UiLCAidmFsdWVzIiwgInBsdWdpbiIsICJwdXNoIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsZW5ndGgiLCAiam9pbiIsICJQbHVnaW5zRW51bSIsICJwbHVnaW5JbnN0YW5jZSIsICJnZXQiLCAiRXJyb3IiLCAicmVsb2FkIiwgImlzQnVuZGxlZCIsICJidW5kbGUiLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAicGF0aCIsICJjb21tYW5kX2RlZmF1bHQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJwYXRoIiwgImNvbW1hbmRzIiwgImluaXRpYWxpemUiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJNYXRlcmlhbExhcGlzIiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0ZpbGUiLCAibmFtZSIsICJlbmRzV2l0aCIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInR5cGUiLCAicmVhZEJ5dGUiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJpbmRleCIsICJyZWFkUmVtYWluaW5nQnVmZmVyIiwgInRvU3RyaW5nIiwgInRlbXBQYXRoIiwgInNsaWNlIiwgIndyaXRlRmlsZVN5bmMiLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgImhhcyIsICJpZGVudGlmaWVyIiwgIndhcm4iLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiYmluZEV2ZW50cyIsICJQbHVnaW5zRW51bSIsICJvcHRpb25zIiwgInB1c2giLCAiYWRkIiwgIkFwaSIsICJ1bmxpbmtTeW5jIiwgImV4ZWNTeW5jIiwgInN0ZGlvIiwgInJlbmFtZVN5bmMiLCAiY3dkIiwgInJlYXNvbiIsICJlcnJvciIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImRpcmVjdG9yaWVzIiwgImlzRGlyZWN0b3J5IiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJ2YWx1ZXMiLCAib25TdGFydFVwIiwgIm9uU2h1dERvd24iLCAicmVsb2FkIiwgImRlbGV0ZSIsICJjYWNoZSIsICJyZW1vdmVQYXRoIiwgInJQbHVnaW4iLCAiUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiLCAicHJvdG90eXBlIiwgIk9iamVjdCIsICJnZXRQcm90b3R5cGVPZiIsICJwbHVnaW5LZXlzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiZXZlbnRLZXlzIiwgImtleXMiLCAibGVuZ3RoIiwgImV2ZW50S2V5IiwgImluZGV4T2YiLCAiaW5jbHVkZXMiLCAidmFsdWUiLCAiYmVmb3JlIiwgImFmdGVyIl0KfQo=
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@serenityjs/plugins",
|
|
3
3
|
"author": "Serenity",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.8.0-beta-20250407220732",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"typecheck": "tsc --noEmit"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@serenityjs/internal-config": "
|
|
23
|
+
"@serenityjs/internal-config": "0.8.0-beta-20250407220732",
|
|
24
24
|
"@swc/core": "1.7.42",
|
|
25
25
|
"@types/node": "22.8.6",
|
|
26
26
|
"eslint": "9.13.0",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@serenityjs/binarystream": "^2.7.0",
|
|
32
|
-
"@serenityjs/core": "
|
|
33
|
-
"@serenityjs/logger": "
|
|
34
|
-
"@serenityjs/protocol": "
|
|
32
|
+
"@serenityjs/core": "0.8.0-beta-20250407220732",
|
|
33
|
+
"@serenityjs/logger": "0.8.0-beta-20250407220732",
|
|
34
|
+
"@serenityjs/protocol": "0.8.0-beta-20250407220732"
|
|
35
35
|
}
|
|
36
36
|
}
|