@dollhousemcp/mcp-server 2.0.24 → 2.0.26
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 +8 -0
- package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -1
- package/dist/auto-dollhouse/portDiscovery.js +7 -4
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +4 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +18 -1
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +16 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +2 -1
- package/dist/index.js +14 -2
- package/dist/server/tools/BuildInfoTools.d.ts +1 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -1
- package/dist/server/tools/BuildInfoTools.js +2 -1
- package/dist/server/tools/MCPAQLTools.js +3 -1
- package/dist/services/ActivationStore.d.ts +8 -0
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +28 -29
- package/dist/services/BuildInfoService.d.ts +3 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +18 -1
- package/dist/services/sessionIdentity.d.ts +24 -0
- package/dist/services/sessionIdentity.d.ts.map +1 -0
- package/dist/services/sessionIdentity.js +42 -0
- package/dist/utils/permissionAuthority.d.ts +38 -0
- package/dist/utils/permissionAuthority.d.ts.map +1 -0
- package/dist/utils/permissionAuthority.js +341 -0
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +10 -1
- package/dist/web/console/UnifiedConsole.d.ts +2 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +3 -1
- package/dist/web/portDiscovery.d.ts +7 -0
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +35 -4
- package/dist/web/public/app.js +28 -4
- package/dist/web/public/index.html +2 -0
- package/dist/web/public/permissions.css +456 -0
- package/dist/web/public/permissions.js +629 -12
- package/dist/web/public/sessions.css +119 -0
- package/dist/web/public/sessions.js +95 -9
- package/dist/web/public/setup.js +67 -7
- package/dist/web/public/styles.css +21 -2
- package/dist/web/routes/permissionRoutes.d.ts +4 -1
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +118 -6
- package/dist/web/routes/setupRoutes.d.ts +18 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +129 -49
- package/dist/web/server.d.ts +4 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +19 -1
- package/package.json +4 -3
- package/scripts/pretooluse-dollhouse.sh +78 -12
- package/scripts/pretooluse-vscode.sh +6 -9
- package/scripts/pretooluse-windsurf.sh +6 -9
- package/server.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaDispatcher.d.ts","sourceRoot":"","sources":["../../../src/handlers/mcp-aql/SchemaDispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAKlB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAejD;;;;;GAKG;AACH,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAyB3E;
|
|
1
|
+
{"version":3,"file":"SchemaDispatcher.d.ts","sourceRoot":"","sources":["../../../src/handlers/mcp-aql/SchemaDispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAKlB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAejD;;;;;GAKG;AACH,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAyB3E;AA00BD;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI9C;;;;;;;;;OASG;WACU,QAAQ,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,eAAe,EACzB,KAAK,CAAC,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,CAAC;CAoGpB;AAMD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AAGjD,eAAO,MAAM,QAAQ;;;;CAIpB,CAAC"}
|
|
@@ -557,6 +557,7 @@ async function handleBuildInfo(registry) {
|
|
|
557
557
|
}
|
|
558
558
|
const info = await service.getBuildInfo();
|
|
559
559
|
return {
|
|
560
|
+
structuredContent: info,
|
|
560
561
|
content: [{
|
|
561
562
|
type: 'text',
|
|
562
563
|
text: service.formatBuildInfo(info),
|
|
@@ -853,4 +854,4 @@ export const __test__ = {
|
|
|
853
854
|
SAFE_PATH_PATTERN,
|
|
854
855
|
FORBIDDEN_PATHS,
|
|
855
856
|
};
|
|
856
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hRGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL1NjaGVtYURpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEdBS2xCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUUzRSwrRUFBK0U7QUFDL0UsbUNBQW1DO0FBQ25DLCtFQUErRTtBQUUvRTs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRTNFOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBNEIsRUFBRSxJQUFZO0lBQ2hFLG9EQUFvRDtJQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Qix5Q0FBeUM7SUFDekMsS0FBSyxN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YXRjaGVyIGZvciBzY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnNcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhdXRvbWF0aWMgZGlzcGF0Y2ggZnJvbSBvcGVyYXRpb24gc2NoZW1hcyB0byBoYW5kbGVyIG1ldGhvZHMuXG4gKiBJdCBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBtYW51YWwgc3dpdGNoIHN0YXRlbWVudHMgaW4gTUNQQVFMSGFuZGxlciBieTpcbiAqXG4gKiAxLiBMb29raW5nIHVwIG9wZXJhdGlvbiBpbiBzY2hlbWFcbiAqIDIuIFJlc29sdmluZyBoYW5kbGVyIGZyb20gcmVnaXN0cnlcbiAqIDMuIEJ1aWxkaW5nIG1ldGhvZCBhcmd1bWVudHMgZnJvbSBwYXJhbXNcbiAqIDQuIENhbGxpbmcgdGhlIGhhbmRsZXIgbWV0aG9kXG4gKiA1LiBBcHBseWluZyBmaWVsZCBzZWxlY3Rpb24vdHJhbnNmb3JtYXRpb24gdG8gcmVzcG9uc2UgKElzc3VlICMyMDIpXG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBTY2hlbWFEaXNwYXRjaGVyLmRpc3BhdGNoKG9wZXJhdGlvbiwgcGFyYW1zLCByZWdpc3RyeSkg4oaSIFByb21pc2U8dW5rbm93bj5cbiAqIC0gVXNlcyBhcmdCdWlsZGVyIHRvIGRldGVybWluZSBob3cgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIGhhbmRsZXJcbiAqIC0gVmFsaWRhdGVzIHJlcXVpcmVkIHBhcmFtZXRlcnMgYmVmb3JlIGRpc3BhdGNoXG4gKiAtIFByb3ZpZGVzIGNsZWFyIGVycm9yIG1lc3NhZ2VzIGZvciBtaXNzaW5nIGhhbmRsZXJzL21ldGhvZHNcbiAqXG4gKiBJTlBVVCBOT1JNQUxJWkFUSU9OIChJc3N1ZSAjMjUxKTpcbiAqIC0gUGFyYW1ldGVycyBjYW4gaGF2ZSBtdWx0aXBsZSBzb3VyY2VzIHZpYSBgc291cmNlc2AgZmllbGRcbiAqIC0gUmVzb2x1dGlvbiBvcmRlcjogc291cmNlc1swXSwgc291cmNlc1sxXSwgLi4uLCBwYXJhbXNba2V5XVxuICogLSBTdXBwb3J0cyBkb3Qgbm90YXRpb246ICdpbnB1dC5lbGVtZW50VHlwZScsICdwYXJhbXMudHlwZSdcbiAqIC0gT3BlcmF0aW9ucyB3aXRoIGBuZWVkc0Z1bGxJbnB1dDogdHJ1ZWAgaGF2ZSBhY2Nlc3MgdG8gZnVsbCBPcGVyYXRpb25JbnB1dFxuICpcbiAqIEZJRUxEIFNFTEVDVElPTiAoSXNzdWUgIzIwMik6XG4gKiAtIFdoZW4gYGZpZWxkc2AgcGFyYW0gaXMgcHJvdmlkZWQsIGZpbHRlcnMgcmVzcG9uc2UgdG8gcmVxdWVzdGVkIGZpZWxkcyBvbmx5XG4gKiAtIFRyYW5zZm9ybXMgZmllbGQgbmFtZXMgZm9yIExMTSBjb25zaXN0ZW5jeSAobmFtZSDihpIgZWxlbWVudF9uYW1lKVxuICogLSBTdXBwb3J0cyBwcmVzZXQgZmllbGQgc2V0czogJ21pbmltYWwnLCAnc3RhbmRhcmQnLCAnZnVsbCdcbiAqXG4gKiBAc2VlIElzc3VlICMyNDcgLSBTY2hlbWEtZHJpdmVuIG9wZXJhdGlvbiBkZWZpbml0aW9uc1xuICogQHNlZSBJc3N1ZSAjMjUxIC0gRWxlbWVudENSVUQgaW5wdXQgbm9ybWFsaXphdGlvblxuICogQHNlZSBJc3N1ZSAjMjAyIC0gR3JhcGhRTCBmaWVsZCBzZWxlY3Rpb24gZm9yIHJlc3BvbnNlIHRva2VuIG9wdGltaXphdGlvblxuICovXG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0T3BlcmF0aW9uU2NoZW1hLFxuICBpc1NjaGVtYU9wZXJhdGlvbixcbiAgdHlwZSBPcGVyYXRpb25EZWYsXG4gIHR5cGUgUGFyYW1TY2hlbWEsXG4gIHR5cGUgUGFyYW1EZWYsXG4gIHR5cGUgSGFuZGxlcktleSxcbn0gZnJvbSAnLi9PcGVyYXRpb25TY2hlbWEuanMnO1xuaW1wb3J0IHsgSW50cm9zcGVjdGlvblJlc29sdmVyIH0gZnJvbSAnLi9JbnRyb3NwZWN0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgTm9ybWFsaXplclJlZ2lzdHJ5IH0gZnJvbSAnLi9ub3JtYWxpemVycy9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IE5vcm1hbGl6ZXJDb250ZXh0IH0gZnJvbSAnLi9ub3JtYWxpemVycy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJSZWdpc3RyeSB9IGZyb20gJy4vTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvbklucHV0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG4vLyBOb3RlOiBGaWVsZCBzZWxlY3Rpb24gaXMgbm93IGFwcGxpZWQgYXQgTUNQQVFMSGFuZGxlciBsZXZlbCAoSXNzdWUgIzIwMilcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW5wdXQgTm9ybWFsaXphdGlvbiAoSXNzdWUgIzI1MSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBWYWxpZGF0ZSBwcm9wZXJ0eSBwYXRoIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvbiBhdHRhY2tzLlxuICogT25seSBhbGxvd3MgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBhbmQgZG90cy5cbiAqL1xuY29uc3QgU0FGRV9QQVRIX1BBVFRFUk4gPSAvXlthLXpBLVpfJF1bYS16QS1aMC05XyQuXSokLztcbmNvbnN0IEZPUkJJRERFTl9QQVRIUyA9IG5ldyBTZXQoWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10pO1xuXG4vKipcbiAqIFJlc29sdmUgYSB2YWx1ZSBmcm9tIGEgZG90LW5vdGF0aW9uIHBhdGggb24gYW4gb2JqZWN0LlxuICogRXhhbXBsZTogZ2V0TmVzdGVkVmFsdWUoeyBpbnB1dDogeyBlbGVtZW50VHlwZTogJ3BlcnNvbmEnIH0gfSwgJ2lucHV0LmVsZW1lbnRUeXBlJykgPT4gJ3BlcnNvbmEnXG4gKlxuICogU2VjdXJpdHk6IFZhbGlkYXRlcyBwYXRoIGZvcm1hdCBhbmQgYmxvY2tzIHByb3RvdHlwZSBwb2xsdXRpb24gdmVjdG9ycy5cbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFZhbGlkYXRlIHBhdGggZm9ybWF0IHRvIHByZXZlbnQgaW5qZWN0aW9uIGF0dGFja3NcbiAgaWYgKCFTQUZFX1BBVEhfUEFUVEVSTi50ZXN0KHBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb3BlcnR5IHBhdGggZm9ybWF0OiAke3BhdGh9YCk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcblxuICAvLyBDaGVjayBmb3IgcHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0c1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoRk9SQklEREVOX1BBVEhTLmhhcyhwYXJ0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3JiaWRkZW4gcHJvcGVydHkgcGF0aCBzZWdtZW50OiAke3BhcnR9YCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSBvYmo7XG5cbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG11bHRpcGxlIHNvdXJjZXMuXG4gKlxuICogVGhlIHJlc29sdXRpb24gb3JkZXIgaXM6XG4gKiAxLiBDaGVjayBlYWNoIHNvdXJjZSBpbiBgc291cmNlc2AgYXJyYXkgKGlmIGRlZmluZWQpXG4gKiAyLiBGYWxsIGJhY2sgdG8gdGhlIGRpcmVjdCBwYXJhbWV0ZXIgdmFsdWVcbiAqIDMuIEZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlIChpZiBkZWZpbmVkKVxuICpcbiAqIEBwYXJhbSBrZXkgLSBQYXJhbWV0ZXIgbmFtZVxuICogQHBhcmFtIGRlZiAtIFBhcmFtZXRlciBkZWZpbml0aW9uIHdpdGggcG9zc2libGUgc291cmNlc1xuICogQHBhcmFtIGNvbnRleHQgLSBSZXNvbHV0aW9uIGNvbnRleHQgY29udGFpbmluZyBpbnB1dCwgcGFyYW1zLCBhbmQgcmF3IHBhcmFtc1xuICogQHJldHVybnMgUmVzb2x2ZWQgdmFsdWUgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQYXJhbVZhbHVlKFxuICBrZXk6IHN0cmluZyxcbiAgZGVmOiBQYXJhbURlZixcbiAgY29udGV4dDoge1xuICAgIGlucHV0PzogT3BlcmF0aW9uSW5wdXQ7XG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuKTogdW5rbm93biB7XG4gIC8vIElmIHNvdXJjZXMgYXJlIGRlZmluZWQsIGNoZWNrIHRoZW0gaW4gb3JkZXJcbiAgaWYgKGRlZi5zb3VyY2VzICYmIGRlZi5zb3VyY2VzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBkZWYuc291cmNlcykge1xuICAgICAgLy8gQnVpbGQgdGhlIHJlc29sdXRpb24gY29udGV4dCBhcyBhIGZsYXQgb2JqZWN0IGZvciBnZXROZXN0ZWRWYWx1ZVxuICAgICAgY29uc3QgcmVzb2x2ZUNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICBwYXJhbXM6IGNvbnRleHQucGFyYW1zLFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIGlucHV0IGZpZWxkcyB0byB0aGUgY29udGV4dCBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChjb250ZXh0LmlucHV0KSB7XG4gICAgICAgIHJlc29sdmVDb250ZXh0LmlucHV0ID0gY29udGV4dC5pbnB1dDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShyZXNvbHZlQ29udGV4dCwgc291cmNlKTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gZGlyZWN0IHBhcmFtIHZhbHVlXG4gIGNvbnN0IGRpcmVjdFZhbHVlID0gY29udGV4dC5wYXJhbXNba2V5XTtcbiAgaWYgKGRpcmVjdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGlyZWN0VmFsdWU7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gZGVmYXVsdFxuICByZXR1cm4gZGVmLmRlZmF1bHQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhcmFtZXRlciBTdHlsZSBDb252ZXJzaW9uIChJc3N1ZSAjMjUyKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENvbnZlcnQgYSBzbmFrZV9jYXNlIHN0cmluZyB0byBjYW1lbENhc2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNuYWtlVG9DYW1lbCgnZHJ5X3J1bicpID0+ICdkcnlSdW4nXG4gKiBzbmFrZVRvQ2FtZWwoJ21heF9yZXN1bHRzJykgPT4gJ21heFJlc3VsdHMnXG4gKiBzbmFrZVRvQ2FtZWwoJ2FscmVhZHlfY2FtZWwnKSA9PiAnYWxyZWFkeUNhbWVsJ1xuICovXG5mdW5jdGlvbiBzbmFrZVRvQ2FtZWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBsZXR0ZXIpID0+IGxldHRlci50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBBcHBseSBwYXJhbSBzdHlsZSBjb252ZXJzaW9uIHRvIGEga2V5IGJhc2VkIG9uIHRoZSBvcGVyYXRpb24gc2NoZW1hLlxuICogSW5kaXZpZHVhbCBgbWFwVG9gIG92ZXJyaWRlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzdHlsZSBjb252ZXJzaW9uLlxuICovXG5mdW5jdGlvbiBhcHBseVBhcmFtU3R5bGUoXG4gIGtleTogc3RyaW5nLFxuICBkZWY6IFBhcmFtRGVmLFxuICBwYXJhbVN0eWxlPzogJ3NuYWtlVG9DYW1lbCdcbik6IHN0cmluZyB7XG4gIC8vIEV4cGxpY2l0IG1hcFRvIHRha2VzIHByZWNlZGVuY2VcbiAgaWYgKGRlZi5tYXBUbykge1xuICAgIHJldHVybiBkZWYubWFwVG87XG4gIH1cblxuICAvLyBBcHBseSBzdHlsZSBjb252ZXJzaW9uIGlmIHNwZWNpZmllZFxuICBpZiAocGFyYW1TdHlsZSA9PT0gJ3NuYWtlVG9DYW1lbCcpIHtcbiAgICByZXR1cm4gc25ha2VUb0NhbWVsKGtleSk7XG4gIH1cblxuICAvLyBEZWZhdWx0OiB1c2Ugb3JpZ2luYWwga2V5XG4gIHJldHVybiBrZXk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhcmFtZXRlciBNYXBwaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTWFwIGlucHV0IHBhcmFtZXRlcnMgdG8gaGFuZGxlciBhcmd1bWVudHMgYmFzZWQgb24gcGFyYW0gc2NoZW1hLlxuICogU3VwcG9ydHMgbXVsdGktc291cmNlIHBhcmFtZXRlciByZXNvbHV0aW9uIGFuZCBwYXJhbSBzdHlsZSBjb252ZXJzaW9uLlxuICovXG5mdW5jdGlvbiBtYXBQYXJhbXMoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNjaGVtYTogUGFyYW1TY2hlbWEsXG4gIGlucHV0PzogT3BlcmF0aW9uSW5wdXQsXG4gIHBhcmFtU3R5bGU/OiAnc25ha2VUb0NhbWVsJ1xuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBtYXBwZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGNvbnN0IGNvbnRleHQgPSB7IGlucHV0LCBwYXJhbXMgfTtcblxuICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVBhcmFtVmFsdWUoa2V5LCBkZWYsIGNvbnRleHQpO1xuICAgIGNvbnN0IHRhcmdldEtleSA9IGFwcGx5UGFyYW1TdHlsZShrZXksIGRlZiwgcGFyYW1TdHlsZSk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWFwcGVkW3RhcmdldEtleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFwcGVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQuXG4gKlxuICogVXNlcyBtdWx0aS1zb3VyY2UgcmVzb2x1dGlvbiB0byBjaGVjayBhbGwgcG9zc2libGUgc291cmNlcyBmb3IgZWFjaFxuICogcmVxdWlyZWQgcGFyYW1ldGVyLiBQcm92aWRlcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcyBzaG93aW5nOlxuICogLSBXaGljaCBwYXJhbWV0ZXIgaXMgbWlzc2luZ1xuICogLSBXaGljaCBzb3VyY2VzIHdlcmUgY2hlY2tlZCAoaW4gb3JkZXIpXG4gKiAtIFdoYXQgd2FzIGFjdHVhbGx5IHByb3ZpZGVkIGluIHBhcmFtc1xuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXJcbiAqIEBwYXJhbSBzY2hlbWEgLSBQYXJhbWV0ZXIgc2NoZW1hIGRlZmluaW5nIHJlcXVpcmVtZW50c1xuICogQHBhcmFtIG9wZXJhdGlvbiAtIE9wZXJhdGlvbiBuYW1lIGZvciBlcnJvciBjb250ZXh0XG4gKiBAcGFyYW0gaW5wdXQgLSBPcHRpb25hbCBmdWxsIE9wZXJhdGlvbklucHV0IGZvciBzb3VyY2UgcmVzb2x1dGlvblxuICogQHRocm93cyBFcnJvciB3aXRoIGRlYnVnZ2luZyBjb250ZXh0IGlmIHJlcXVpcmVkIHBhcmFtZXRlciBpcyBtaXNzaW5nXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRQYXJhbXMoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNjaGVtYTogUGFyYW1TY2hlbWEsXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBpbnB1dD86IE9wZXJhdGlvbklucHV0XG4pOiB2b2lkIHtcbiAgY29uc3QgY29udGV4dCA9IHsgaW5wdXQsIHBhcmFtcyB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgaWYgKGRlZi5yZXF1aXJlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSByZXNvbHZlUGFyYW1WYWx1ZShrZXksIGRlZiwgY29udGV4dCk7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBCdWlsZCBkZXRhaWxlZCBlcnJvciBtZXNzYWdlIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc3Qgc291cmNlc0NoZWNrZWQgPSBkZWYuc291cmNlc1xuICAgICAgICAgID8gYFNvdXJjZXMgY2hlY2tlZCAoaW4gb3JkZXIpOiBbJHtkZWYuc291cmNlcy5qb2luKCcg4oaSICcpfV0g4oaSIHBhcmFtcy4ke2tleX1gXG4gICAgICAgICAgOiBgU291cmNlOiBwYXJhbXMuJHtrZXl9YDtcblxuICAgICAgICBjb25zdCBwcm92aWRlZFBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID4gMFxuICAgICAgICAgID8gYFByb3ZpZGVkIHBhcmFtczogeyR7T2JqZWN0LmtleXMocGFyYW1zKS5qb2luKCcsICcpfX1gXG4gICAgICAgICAgOiAnTm8gcGFyYW1zIHByb3ZpZGVkJztcblxuICAgICAgICAvLyBJc3N1ZSAjMjkwOiBDaGVjayBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSBmb3IgZWxlbWVudF90eXBlXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlVmFsdWUgPSBpbnB1dD8uZWxlbWVudF90eXBlIHx8IGlucHV0Py5lbGVtZW50VHlwZTtcbiAgICAgICAgY29uc3QgaGFzRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZVZhbHVlXG4gICAgICAgICAgPyBgaW5wdXQuZWxlbWVudF90eXBlOiAnJHtlbGVtZW50VHlwZVZhbHVlfSdgXG4gICAgICAgICAgOiAnaW5wdXQuZWxlbWVudF90eXBlOiB1bmRlZmluZWQnO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259Jy4gYCArXG4gICAgICAgICAgYCR7c291cmNlc0NoZWNrZWR9LiAke3Byb3ZpZGVkUGFyYW1zfS4gJHtoYXNFbGVtZW50VHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFR5cGUgVmFsaWRhdGlvbiAoSXNzdWUgIzI1NSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgYSBodW1hbi1yZWFkYWJsZSB0eXBlIGRlc2NyaXB0aW9uIGZvciBlcnJvciBtZXNzYWdlc1xuICovXG5mdW5jdGlvbiBnZXRBY3R1YWxUeXBlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnYXJyYXknO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgc2luZ2xlIHBhcmFtZXRlciB2YWx1ZSBhZ2FpbnN0IGl0cyB0eXBlIGRlZmluaXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgcGFyYW1ldGVyIHZhbHVlIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gZGVmIC0gVGhlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZyb20gc2NoZW1hXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHBhcmFtZXRlciBuYW1lIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBuYW1lIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gKiBAdGhyb3dzIEVycm9yIGlmIHR5cGUgdmFsaWRhdGlvbiBmYWlsc1xuICpcbiAqIEBzZWUgSXNzdWUgIzI1NSAtIFJ1bnRpbWUgdHlwZSB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1UeXBlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZGVmOiBQYXJhbURlZixcbiAga2V5OiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogc3RyaW5nXG4pOiB2b2lkIHtcbiAgLy8gU2tpcCB2YWxpZGF0aW9uIGZvciB1bmRlZmluZWQgdmFsdWVzIChoYW5kbGVkIGJ5IHJlcXVpcmVkIGNoZWNrKVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFjdHVhbFR5cGUgPSBnZXRBY3R1YWxUeXBlKHZhbHVlKTtcblxuICBzd2l0Y2ggKGRlZi50eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCBOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhIG51bWJlciwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc3RyaW5nW10nOlxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYSBzdHJpbmcgYXJyYXksIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGUgYXJyYXkgZWxlbWVudHMgYXJlIHN0cmluZ3NcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtpXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX1bJHtpfV0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7Z2V0QWN0dWFsVHlwZSh2YWx1ZVtpXSl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndW5rbm93bic6XG4gICAgICAvLyBBbGxvdyBhbnkgdHlwZSAtIG5vIHZhbGlkYXRpb24gbmVlZGVkXG4gICAgICBicmVhaztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFsbCBwYXJhbWV0ZXIgdHlwZXMgYWdhaW5zdCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBzY2hlbWEgLSBUaGUgcGFyYW1ldGVyIHNjaGVtYVxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gbmFtZSAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHRocm93cyBFcnJvciBpZiBhbnkgdHlwZSB2YWxpZGF0aW9uIGZhaWxzXG4gKlxuICogQHNlZSBJc3N1ZSAjMjU1IC0gUnVudGltZSB0eXBlIHZhbGlkYXRpb25cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbVR5cGVzKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzY2hlbWE6IFBhcmFtU2NoZW1hLFxuICBvcGVyYXRpb246IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXNba2V5XTtcbiAgICB2YWxpZGF0ZVBhcmFtVHlwZSh2YWx1ZSwgZGVmLCBrZXksIG9wZXJhdGlvbik7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSGFuZGxlciBSZXNvbHV0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLW51bGwgb2JqZWN0LlxuICogVXNlZCBmb3Igc2FmZSBwcm9wZXJ0eSBhY2Nlc3Mgd2l0aG91dCB0eXBlIGFzc2VydGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBjYWxsYWJsZSBtZXRob2QuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgbWV0aG9kIGxvb2t1cCB3aXRob3V0IHVuc2FmZSBhc3NlcnRpb25zLlxuICpcbiAqIEBwYXJhbSBvYmogLSBPYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gTmFtZSBvZiBtZXRob2QgdG8gbG9vayBmb3JcbiAqIEByZXR1cm5zIFRydWUgaWYgb2JqIGhhcyBhIGZ1bmN0aW9uIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWVcbiAqL1xuZnVuY3Rpb24gaGFzTWV0aG9kKFxuICBvYmo6IHVua25vd24sXG4gIG1ldGhvZE5hbWU6IHN0cmluZ1xuKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24+IHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgdHlwZW9mIG9ialttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBHZXQgaGFuZGxlciBmcm9tIHJlZ2lzdHJ5IHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIFJlc29sdmVzIGEgaGFuZGxlciBieSBrZXkgZnJvbSB0aGUgcmVnaXN0cnksIHByb3ZpZGluZyBjbGVhciBlcnJvciBtZXNzYWdlc1xuICogd2hlbiBoYW5kbGVycyBhcmUgbWlzc2luZy4gRGlmZmVyZW50aWF0ZXMgYmV0d2VlbiByZXF1aXJlZCBhbmQgb3B0aW9uYWwgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHJlZ2lzdHJ5IC0gSGFuZGxlciByZWdpc3RyeSBjb250YWluaW5nIGFsbCBjb25maWd1cmVkIGhhbmRsZXJzXG4gKiBAcGFyYW0gaGFuZGxlcktleSAtIEtleSBpZGVudGlmeWluZyB3aGljaCBoYW5kbGVyIHRvIHJldHJpZXZlXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgZm9yIGVycm9yIGNvbnRleHRcbiAqIEBwYXJhbSBvcHRpb25hbCAtIFdoZXRoZXIgdGhlIGhhbmRsZXIgaXMgb3B0aW9uYWwgKGFmZmVjdHMgZXJyb3IgbWVzc2FnaW5nKVxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIGhhbmRsZXJcbiAqIEB0aHJvd3MgRXJyb3IgaWYgaGFuZGxlciBpcyBub3QgY29uZmlndXJlZFxuICovXG5mdW5jdGlvbiBnZXRIYW5kbGVyKFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5LFxuICBoYW5kbGVyS2V5OiBIYW5kbGVyS2V5LFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHVua25vd24ge1xuICBjb25zdCBoYW5kbGVyID0gcmVnaXN0cnlbaGFuZGxlcktleSBhcyBrZXlvZiBIYW5kbGVyUmVnaXN0cnldO1xuXG4gIGlmICghaGFuZGxlciAmJiAhb3B0aW9uYWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSGFuZGxlciAnJHtoYW5kbGVyS2V5fScgaXMgcmVxdWlyZWQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBidXQgbm90IGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgYEVuc3VyZSB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGluIHRoZSBIYW5kbGVyUmVnaXN0cnkuYFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhbmRsZXIgJiYgb3B0aW9uYWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtoYW5kbGVyS2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgaGFuZGxlcktleS5zbGljZSgxKX0gb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBgICtcbiAgICAgIGAke2hhbmRsZXJLZXl9IG5vdCBjb25maWd1cmVkLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGhhbmRsZXIgdGhhdCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiBhbGwgY29uZmlndXJhdGlvbnMuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaGFuZGxlcjtcbn1cblxuLyoqXG4gKiBHZXQgbWV0aG9kIGZyb20gaGFuZGxlciB3aXRoIHR5cGUtc2FmZSBsb29rdXAuXG4gKlxuICogVXNlcyB0eXBlIGd1YXJkcyBpbnN0ZWFkIG9mIHVuc2FmZSB0eXBlIGFzc2VydGlvbnMgdG8gdmVyaWZ5IHRoZSBoYW5kbGVyXG4gKiBoYXMgdGhlIGV4cGVjdGVkIG1ldGhvZC4gUHJvdmlkZXMgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciAtIEhhbmRsZXIgb2JqZWN0IHRvIGdldCBtZXRob2QgZnJvbVxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBOYW1lIG9mIHRoZSBtZXRob2QgdG8gcmV0cmlldmVcbiAqIEBwYXJhbSBoYW5kbGVyS2V5IC0gSGFuZGxlciBrZXkgZm9yIGVycm9yIGNvbnRleHRcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gbmFtZSBmb3IgZXJyb3IgY29udGV4dFxuICogQHJldHVybnMgQm91bmQgbWV0aG9kIHJlYWR5IHRvIGNhbGxcbiAqIEB0aHJvd3MgRXJyb3IgaWYgbWV0aG9kIGlzIG5vdCBmb3VuZCBvciBpcyBub3QgY2FsbGFibGVcbiAqL1xuZnVuY3Rpb24gZ2V0TWV0aG9kKFxuICBoYW5kbGVyOiB1bmtub3duLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXJLZXk6IHN0cmluZyxcbiAgb3BlcmF0aW9uOiBzdHJpbmdcbik6ICguLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAvLyBVc2UgdHlwZSBndWFyZCBpbnN0ZWFkIG9mIHVuc2FmZSBhc3NlcnRpb25cbiAgaWYgKCFoYXNNZXRob2QoaGFuZGxlciwgbWV0aG9kTmFtZSkpIHtcbiAgICBjb25zdCBhdmFpbGFibGVNZXRob2RzID0gaXNPYmplY3QoaGFuZGxlcilcbiAgICAgID8gT2JqZWN0LmtleXMoaGFuZGxlcikuZmlsdGVyKGsgPT4gdHlwZW9mIGhhbmRsZXJba10gPT09ICdmdW5jdGlvbicpXG4gICAgICA6IFtdO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kIG9uIGhhbmRsZXIgJyR7aGFuZGxlcktleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScuIGAgK1xuICAgICAgYEF2YWlsYWJsZSBtZXRob2RzOiBbJHthdmFpbGFibGVNZXRob2RzLmpvaW4oJywgJykgfHwgJ25vbmUnfV1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIE5vdyBUeXBlU2NyaXB0IGtub3dzIGhhbmRsZXJbbWV0aG9kTmFtZV0gaXMgYSBmdW5jdGlvblxuICBjb25zdCBtZXRob2QgPSBoYW5kbGVyW21ldGhvZE5hbWVdO1xuICByZXR1cm4gbWV0aG9kLmJpbmQoaGFuZGxlcikgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQXJndW1lbnQgQnVpbGRpbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQYXJhbXMgdGhhdCBhcmUgaGFuZGxlZCBhdCB0aGUgZGlzcGF0Y2ggbGV2ZWwgYW5kIHNob3VsZCBOT1QgYmUgcGFzc2VkIHRvIGhhbmRsZXJzLlxuICogVGhlc2UgYXJlIGNyb3NzLWN1dHRpbmcgY29uY2VybnMgcHJvY2Vzc2VkIGJ5IFNjaGVtYURpc3BhdGNoZXIgaXRzZWxmLlxuICpcbiAqIEBzZWUgSXNzdWUgIzIwMiAtIGZpZWxkcyBpcyB1c2VkIGZvciByZXNwb25zZSBmaWx0ZXJpbmcsIG5vdCBieSBoYW5kbGVyc1xuICovXG5jb25zdCBESVNQQVRDSF9PTkxZX1BBUkFNUyA9IG5ldyBTZXQoWydmaWVsZHMnXSk7XG5cbi8qKlxuICogRmlsdGVyIG91dCBkaXNwYXRjaC1vbmx5IHBhcmFtcyBmcm9tIGEgcGFyYW1zIG9iamVjdC5cbiAqIFRoZXNlIHBhcmFtcyBhcmUgaGFuZGxlZCBhdCB0aGUgZGlzcGF0Y2ggbGV2ZWwgKGUuZy4sIGZpZWxkIHNlbGVjdGlvbilcbiAqIGFuZCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byBoYW5kbGVycy5cbiAqL1xuZnVuY3Rpb24gZmlsdGVyRGlzcGF0Y2hPbmx5UGFyYW1zKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGZpbHRlcmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMpKSB7XG4gICAgaWYgKCFESVNQQVRDSF9PTkxZX1BBUkFNUy5oYXMoa2V5KSkge1xuICAgICAgZmlsdGVyZWRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgYXJndW1lbnRzIGZvciBoYW5kbGVyIG1ldGhvZCBiYXNlZCBvbiBhcmdCdWlsZGVyIHR5cGVcbiAqXG4gKiAtICdzaW5nbGUnOiBQYXNzIHBhcmFtcyBpbiBzY2hlbWEgb3JkZXIgYXMgcG9zaXRpb25hbCBhcmdzIChkZWZhdWx0KVxuICogLSAnc3ByZWFkJzogUGFzcyBxdWVyeSArIHJlbWFpbmluZyBwYXJhbXNcbiAqIC0gJ25hbWVkJzogUGFzcyBtYXBwZWQgcGFyYW1zIGFzIG5hbWVkIG9iamVjdFxuICogLSAnbmFtZWRXaXRoVHlwZSc6IExpa2UgJ25hbWVkJyBidXQgZW5zdXJlcyAndHlwZScgaXMgaW5jbHVkZWQgZnJvbSByZXNvbHZlZCBzb3VyY2VzXG4gKiAtICd0eXBlV2l0aFBhcmFtcyc6IFBhc3MgcmVzb2x2ZWQgdHlwZSArIGZ1bGwgcGFyYW1zIG9iamVjdFxuICpcbiAqIE5vdGU6IFBhcmFtcyBpbiBESVNQQVRDSF9PTkxZX1BBUkFNUyBhcmUgZmlsdGVyZWQgb3V0IGJlZm9yZSBwYXNzaW5nIHRvIGhhbmRsZXJzLlxuICovXG5mdW5jdGlvbiBidWlsZEFyZ3MoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNjaGVtYTogT3BlcmF0aW9uRGVmLFxuICBtYXBwZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpbnB1dD86IE9wZXJhdGlvbklucHV0XG4pOiB1bmtub3duW10ge1xuICBjb25zdCBidWlsZGVyID0gc2NoZW1hLmFyZ0J1aWxkZXIgPz8gJ3NpbmdsZSc7XG5cbiAgc3dpdGNoIChidWlsZGVyKSB7XG4gICAgY2FzZSAnc3ByZWFkJzpcbiAgICAgIC8vIEZvciBoYW5kbGVycyB0aGF0IHRha2UgKHF1ZXJ5LCBvcHRpb25zKVxuICAgICAgcmV0dXJuIFtwYXJhbXMucXVlcnksIGZpbHRlckRpc3BhdGNoT25seVBhcmFtcyhwYXJhbXMpXTtcblxuICAgIGNhc2UgJ25hbWVkJzoge1xuICAgICAgLy8gRm9yIGhhbmRsZXJzIHRoYXQgdGFrZSBhIG5hbWVkIHBhcmFtcyBvYmplY3RcbiAgICAgIC8vIEZpbHRlciBvdXQgZGlzcGF0Y2gtb25seSBwYXJhbXNcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gZmlsdGVyRGlzcGF0Y2hPbmx5UGFyYW1zKG1hcHBlZFBhcmFtcyk7XG4gICAgICByZXR1cm4gW2ZpbHRlcmVkXTtcbiAgICB9XG5cbiAgICBjYXNlICduYW1lZFdpdGhUeXBlJzoge1xuICAgICAgLy8gTGlrZSAnbmFtZWQnIGJ1dCBlbnN1cmVzICdlbGVtZW50VHlwZScgYW5kICdlbGVtZW50TmFtZScgYXJlIGF2YWlsYWJsZVxuICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBFbGVtZW50Q1JVRCBwYXR0ZXJuIHdoZXJlIHR5cGUgY29tZXMgZnJvbSBpbnB1dC5lbGVtZW50X3R5cGUgT1IgcGFyYW1zLmVsZW1lbnRfdHlwZVxuICAgICAgLy8gSXNzdWUgIzI5MDogZWxlbWVudF9uYW1lIG1hcHMgdG8gZWxlbWVudE5hbWUsIGVsZW1lbnRfdHlwZSBtYXBzIHRvIGVsZW1lbnRUeXBlXG4gICAgICBjb25zdCByZXN1bHQgPSB7IC4uLm1hcHBlZFBhcmFtcyB9O1xuXG4gICAgICAvLyBJZiAnZWxlbWVudFR5cGUnIHdhc24ndCBpbiBtYXBwZWRQYXJhbXMgYnV0IGlzIGF2YWlsYWJsZSBmcm9tIGlucHV0LmVsZW1lbnRfdHlwZSAob3IgbGVnYWN5IGVsZW1lbnRUeXBlKSwgYWRkIGl0XG4gICAgICAvLyBJc3N1ZSAjMjkwOiBQcmVmZXIgc25ha2VfY2FzZSBlbGVtZW50X3R5cGUsIGZhbGxiYWNrIHRvIGNhbWVsQ2FzZSBlbGVtZW50VHlwZSBmb3IgYmFja3dhcmQgY29tcGF0XG4gICAgICBpZiAoIXJlc3VsdC5lbGVtZW50VHlwZSAmJiAoaW5wdXQ/LmVsZW1lbnRfdHlwZSB8fCBpbnB1dD8uZWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHJlc3VsdC5lbGVtZW50VHlwZSA9IGlucHV0LmVsZW1lbnRfdHlwZSB8fCBpbnB1dC5lbGVtZW50VHlwZTtcbiAgICAgIH1cbiAgICAgIC8vIFNldCAndHlwZScgZnJvbSAnZWxlbWVudFR5cGUnIGZvciBoYW5kbGVycyB0aGF0IGV4cGVjdCBpdFxuICAgICAgaWYgKCFyZXN1bHQudHlwZSAmJiByZXN1bHQuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgcmVzdWx0LnR5cGUgPSByZXN1bHQuZWxlbWVudFR5cGU7XG4gICAgICB9XG4gICAgICAvLyBTZXQgJ25hbWUnIGZyb20gJ2VsZW1lbnROYW1lJyBmb3IgaGFuZGxlcnMgdGhhdCBleHBlY3QgaXQgKElzc3VlICMyOTApXG4gICAgICBpZiAoIXJlc3VsdC5uYW1lICYmIHJlc3VsdC5lbGVtZW50TmFtZSkge1xuICAgICAgICByZXN1bHQubmFtZSA9IHJlc3VsdC5lbGVtZW50TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzI3ODogRm9yIGVuc2VtYmxlcywgbWVyZ2UgdG9wLWxldmVsIGVsZW1lbnRzIGludG8gbWV0YWRhdGFcbiAgICAgIC8vIExMTXMgb2Z0ZW4gcGFzcyBlbGVtZW50cyBhdCBwYXJhbXMgbGV2ZWwsIG5vdCBpbnNpZGUgbWV0YWRhdGFcbiAgICAgIC8vIElzc3VlICMyOTA6IFByZWZlciBzbmFrZV9jYXNlIGVsZW1lbnRfdHlwZSwgZmFsbGJhY2sgdG8gY2FtZWxDYXNlIGVsZW1lbnRUeXBlXG4gICAgICBjb25zdCByZXNvbHZlZFR5cGUgPSByZXN1bHQuZWxlbWVudFR5cGUgfHwgcmVzdWx0LnR5cGUgfHwgaW5wdXQ/LmVsZW1lbnRfdHlwZSB8fCBpbnB1dD8uZWxlbWVudFR5cGU7XG4gICAgICAvLyBDaGVjayBmb3IgZW5zZW1ibGUgdHlwZSAoaGFuZGxlcyBib3RoIHBsdXJhbCBjb25zdGFudCBhbmQgc2luZ3VsYXIgZm9ybSlcbiAgICAgIGNvbnN0IGlzRW5zZW1ibGUgPSByZXNvbHZlZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFIHx8IHJlc29sdmVkVHlwZSA9PT0gJ2Vuc2VtYmxlJztcbiAgICAgIGlmIChpc0Vuc2VtYmxlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gcGFyYW1zLmVsZW1lbnRzO1xuICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50cyAmJiAoIWN1cnJlbnRNZXRhZGF0YSB8fCAhY3VycmVudE1ldGFkYXRhLmVsZW1lbnRzKSkge1xuICAgICAgICAgIHJlc3VsdC5tZXRhZGF0YSA9IHsgLi4uY3VycmVudE1ldGFkYXRhLCBlbGVtZW50cyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3MjI6IENvbW1vbiBmaWVsZHMgKHRhZ3MsIHRyaWdnZXJzKSDigJQgTExNcyBwYXNzIGF0IHBhcmFtcyBsZXZlbCBmb3IgYW55IGVsZW1lbnQgdHlwZS5cbiAgICAgIHtcbiAgICAgICAgbGV0IGN1cnJlbnRNZXRhID0gcmVzdWx0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgdXBkYXRlZE1ldGEgPSBjdXJyZW50TWV0YTtcblxuICAgICAgICBpZiAocGFyYW1zLnRhZ3MgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzKSAmJiAoIXVwZGF0ZWRNZXRhIHx8IHVwZGF0ZWRNZXRhLnRhZ3MgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YSA9IHsgLi4udXBkYXRlZE1ldGEsIHRhZ3M6IHBhcmFtcy50YWdzIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy50cmlnZ2VycyAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLnRyaWdnZXJzKSAmJiAoIXVwZGF0ZWRNZXRhIHx8IHVwZGF0ZWRNZXRhLnRyaWdnZXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGEgPSB7IC4uLnVwZGF0ZWRNZXRhLCB0cmlnZ2VyczogcGFyYW1zLnRyaWdnZXJzIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZE1ldGEgIT09IGN1cnJlbnRNZXRhKSB7XG4gICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhID0gdXBkYXRlZE1ldGE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNUZW1wbGF0ZSA9IHJlc29sdmVkVHlwZSA9PT0gRWxlbWVudFR5cGUuVEVNUExBVEUgfHwgcmVzb2x2ZWRUeXBlID09PSAndGVtcGxhdGUnO1xuICAgICAgaWYgKGlzVGVtcGxhdGUgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMudmFyaWFibGVzKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjdXJyZW50TWV0YWRhdGE/LnZhcmlhYmxlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhID0geyAuLi5jdXJyZW50TWV0YWRhdGEsIHZhcmlhYmxlczogcGFyYW1zLnZhcmlhYmxlcyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFnZW50IFYyIGZpZWxkczogZ29hbCwgYWN0aXZhdGVzLCB0b29scywgc3lzdGVtUHJvbXB0LCBhdXRvbm9teSwgcmVzaWxpZW5jZVxuICAgICAgY29uc3QgaXNBZ2VudCA9IHJlc29sdmVkVHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQgfHwgcmVzb2x2ZWRUeXBlID09PSAnYWdlbnQnO1xuICAgICAgaWYgKGlzQWdlbnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1ldGFkYXRhID0gcmVzdWx0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgdXBkYXRlZE1ldGFkYXRhID0gY3VycmVudE1ldGFkYXRhO1xuXG4gICAgICAgIGlmIChwYXJhbXMuZ29hbCAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS5nb2FsID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIGdvYWw6IHBhcmFtcy5nb2FsIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEuYWN0aXZhdGVzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIGFjdGl2YXRlczogcGFyYW1zLmFjdGl2YXRlcyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMudG9vbHMgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEudG9vbHMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgdG9vbHM6IHBhcmFtcy50b29scyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElzc3VlICM3MjU6IEFjY2VwdCBib3RoIHN5c3RlbVByb21wdCBhbmQgc3lzdGVtX3Byb21wdCAoTExNcyBjb21tb25seSB1c2Ugc25ha2VfY2FzZSlcbiAgICAgICAgY29uc3Qgc3lzdGVtUHJvbXB0VmFsdWUgPSBwYXJhbXMuc3lzdGVtUHJvbXB0ID8/IHBhcmFtcy5zeXN0ZW1fcHJvbXB0O1xuICAgICAgICBpZiAoc3lzdGVtUHJvbXB0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIHN5c3RlbVByb21wdDogc3lzdGVtUHJvbXB0VmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmF1dG9ub215ICE9PSB1bmRlZmluZWQgJiYgKCF1cGRhdGVkTWV0YWRhdGEgfHwgdXBkYXRlZE1ldGFkYXRhLmF1dG9ub215ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIGF1dG9ub215OiBwYXJhbXMuYXV0b25vbXkgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJc3N1ZSAjNzIyOiByZXNpbGllbmNlIHdhcyBtaXNzaW5nIGZyb20gdGhlIGFnZW50IFYyIG1lcmdlXG4gICAgICAgIGlmIChwYXJhbXMucmVzaWxpZW5jZSAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS5yZXNpbGllbmNlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIHJlc2lsaWVuY2U6IHBhcmFtcy5yZXNpbGllbmNlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZE1ldGFkYXRhICE9PSBjdXJyZW50TWV0YWRhdGEpIHtcbiAgICAgICAgICByZXN1bHQubWV0YWRhdGEgPSB1cGRhdGVkTWV0YWRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzY2NjogTExNcyBvZnRlbiBwYXNzIGdhdGVrZWVwZXIgYXQgdG9wLWxldmVsIHBhcmFtcywgbm90IGluc2lkZSBtZXRhZGF0YS5cbiAgICAgIC8vIE1lcmdlIGl0IGludG8gbWV0YWRhdGEgZm9yIGFsbCBlbGVtZW50IHR5cGVzLlxuICAgICAgaWYgKHBhcmFtcy5nYXRla2VlcGVyICYmIHR5cGVvZiBwYXJhbXMuZ2F0ZWtlZXBlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1ldGEgPSByZXN1bHQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY3VycmVudE1ldGEgfHwgIWN1cnJlbnRNZXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbU2NoZW1hRGlzcGF0Y2hlcl0gTWVyZ2luZyB0b3AtbGV2ZWwgZ2F0ZWtlZXBlciBpbnRvIG1ldGFkYXRhIGZvciBlbGVtZW50ICcke3Jlc3VsdC5uYW1lID8/ICd1bmtub3duJ30nYCk7XG4gICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhID0geyAuLi5jdXJyZW50TWV0YSwgZ2F0ZWtlZXBlcjogcGFyYW1zLmdhdGVrZWVwZXIgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgb3V0IGRpc3BhdGNoLW9ubHkgcGFyYW1zIGJlZm9yZSByZXR1cm5pbmdcbiAgICAgIHJldHVybiBbZmlsdGVyRGlzcGF0Y2hPbmx5UGFyYW1zKHJlc3VsdCldO1xuICAgIH1cblxuICAgIGNhc2UgJ3R5cGVXaXRoUGFyYW1zJzoge1xuICAgICAgLy8gUGFzcyByZXNvbHZlZCB0eXBlICsgZnVsbCBwYXJhbXMgb2JqZWN0IChtaW51cyBkaXNwYXRjaC1vbmx5IHBhcmFtcylcbiAgICAgIC8vIFVzZWQgZm9yIG9wZXJhdGlvbnMgbGlrZSBsaXN0X2VsZW1lbnRzIHRoYXQgbmVlZCAodHlwZSwgcGFnaW5hdGlvblBhcmFtcylcbiAgICAgIC8vIElzc3VlICMyOTA6IGVsZW1lbnRfdHlwZSBtYXBzIHRvIGVsZW1lbnRUeXBlLCB3aXRoIGJhY2t3YXJkIGNvbXBhdCBmb3IgdHlwZVxuICAgICAgLy8gUHJlZmVyIHNuYWtlX2Nhc2UgZWxlbWVudF90eXBlLCBmYWxsYmFjayB0byBjYW1lbENhc2UgZWxlbWVudFR5cGVcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IG1hcHBlZFBhcmFtcy5lbGVtZW50VHlwZSA/PyBtYXBwZWRQYXJhbXMudHlwZSA/PyBpbnB1dD8uZWxlbWVudF90eXBlID8/IGlucHV0Py5lbGVtZW50VHlwZTtcbiAgICAgIHJldHVybiBbcmVzb2x2ZWRUeXBlLCBmaWx0ZXJEaXNwYXRjaE9ubHlQYXJhbXMocGFyYW1zKV07XG4gICAgfVxuXG4gICAgY2FzZSAnc2luZ2xlJzpcbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBFeHRyYWN0IHBhcmFtcyBpbiBzY2hlbWEgb3JkZXIsIHVzaW5nIHJlc29sdmVkIHZhbHVlc1xuICAgICAgaWYgKCFzY2hlbWEucGFyYW1zIHx8IE9iamVjdC5rZXlzKHNjaGVtYS5wYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBzaW1wbGUgaGFuZGxlcnMsIHBhc3MgcmVzb2x2ZWQgcGFyYW1zIGluIHNjaGVtYSBvcmRlclxuICAgICAgLy8gU2tpcCBkaXNwYXRjaC1vbmx5IHBhcmFtcyAobGlrZSAnZmllbGRzJykgdGhhdCBhcmUgaGFuZGxlZCBieSBTY2hlbWFEaXNwYXRjaGVyXG4gICAgICBjb25zdCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYS5wYXJhbXMpKSB7XG4gICAgICAgIC8vIFNraXAgZGlzcGF0Y2gtbGV2ZWwgcGFyYW1zIHRoYXQgc2hvdWxkbid0IGJlIHBhc3NlZCB0byBoYW5kbGVyc1xuICAgICAgICBpZiAoRElTUEFUQ0hfT05MWV9QQVJBTVMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgbWFwcGVkIHZhbHVlIGlmIGF2YWlsYWJsZSAoaGFuZGxlcyBzb3VyY2UgcmVzb2x1dGlvbilcbiAgICAgICAgY29uc3QgdGFyZ2V0S2V5ID0gc2NoZW1hLnBhcmFtc1trZXldLm1hcFRvID8/IGtleTtcbiAgICAgICAgYXJncy5wdXNoKG1hcHBlZFBhcmFtc1t0YXJnZXRLZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTcGVjaWFsIE9wZXJhdGlvbiBIYW5kbGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEhhbmRsZSBpbnRyb3NwZWN0aW9uIG9wZXJhdGlvbiAodXNlcyBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIgZGlyZWN0bHkpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUludHJvc3BlY3Rpb24oXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gSW50cm9zcGVjdGlvblJlc29sdmVyLnJlc29sdmUocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgZ2V0X2NhcGFiaWxpdGllcyBvcGVyYXRpb24gKHVzZXMgSW50cm9zcGVjdGlvblJlc29sdmVyIGRpcmVjdGx5KVxuICogQHNlZSBJc3N1ZSAjMTc2MCAtIGdldF9jYXBhYmlsaXRpZXMgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNhcGFiaWxpdGllcyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIuZ2V0Q2FwYWJpbGl0aWVzKHBhcmFtcyk7XG59XG5cbi8qKlxuICogSGFuZGxlIGJ1aWxkIGluZm8gb3BlcmF0aW9uIChmb3JtYXRzIG91dHB1dClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQnVpbGRJbmZvKFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3Qgc2VydmljZSA9IHJlZ2lzdHJ5LmJ1aWxkSW5mb1NlcnZpY2U7XG4gIGlmICghc2VydmljZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRJbmZvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQnVpbGRJbmZvU2VydmljZSBub3QgY29uZmlndXJlZCcpO1xuICB9XG5cbiAgY29uc3QgaW5mbyA9IGF3YWl0IHNlcnZpY2UuZ2V0QnVpbGRJbmZvKCk7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogW3tcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHRleHQ6IHNlcnZpY2UuZm9ybWF0QnVpbGRJbmZvKGluZm8pLFxuICAgIH1dLFxuICB9O1xufVxuXG4vKipcbiAqIEhhbmRsZSBjYWNoZSBidWRnZXQgcmVwb3J0IG9wZXJhdGlvbiAoZm9ybWF0cyBvdXRwdXQgYXMgbWFya2Rvd24gdGFibGUpXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUNhY2hlQnVkZ2V0UmVwb3J0KFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiB1bmtub3duIHtcbiAgY29uc3QgYnVkZ2V0ID0gcmVnaXN0cnkuY2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGlmICghYnVkZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZSBidWRnZXQgbm90IGF2YWlsYWJsZTogQ2FjaGVNZW1vcnlCdWRnZXQgbm90IGNvbmZpZ3VyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlcG9ydCA9IGJ1ZGdldC5nZXRSZXBvcnQoKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICcjIENhY2hlIE1lbW9yeSBCdWRnZXQgUmVwb3J0JyxcbiAgICAnJyxcbiAgICBgKipCdWRnZXQ6KiogJHtyZXBvcnQuYnVkZ2V0TUJ9IE1CYCxcbiAgICBgKipVc2VkOioqICR7cmVwb3J0LnRvdGFsTWVtb3J5TUJ9IE1CICgke3JlcG9ydC51dGlsaXphdGlvblBlcmNlbnR9JSlgLFxuICAgIGAqKlJlZ2lzdGVyZWQgQ2FjaGVzOioqICR7cmVwb3J0LmNhY2hlcy5sZW5ndGh9YCxcbiAgICAnJyxcbiAgXTtcbiAgaWYgKHJlcG9ydC5jYWNoZXMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJ3wgQ2FjaGUgfCBFbnRyaWVzIHwgTWVtb3J5IChNQikgfCBIaXQgUmF0ZSB8IExhc3QgQWN0aXZpdHkgfCcpO1xuICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfCcpO1xuICAgIGZvciAoY29uc3QgYyBvZiByZXBvcnQuY2FjaGVzKSB7XG4gICAgICBjb25zdCBhY3Rpdml0eSA9IGMubGFzdEFjdGl2aXR5TXMgPiAwXG4gICAgICAgID8gYCR7KChEYXRlLm5vdygpIC0gYy5sYXN0QWN0aXZpdHlNcykgLyAxMDAwKS50b0ZpeGVkKDApfXMgYWdvYFxuICAgICAgICA6ICduZXZlcic7XG4gICAgICBsaW5lcy5wdXNoKGB8ICR7Yy5uYW1lfSB8ICR7Yy5lbnRyaWVzfSB8ICR7Yy5tZW1vcnlNQn0gfCAkeyhjLmhpdFJhdGUgKiAxMDApLnRvRml4ZWQoMSl9JSB8ICR7YWN0aXZpdHl9IHxgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnX05vIGNhY2hlcyByZWdpc3RlcmVkLl8nKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IFt7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICB0ZXh0OiBsaW5lcy5qb2luKCdcXG4nKSxcbiAgICB9XSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHBvcnRQYWNrYWdlIGludGVyZmFjZSBmb3IgZWxlbWVudCBleHBvcnQuXG4gKiBNYXRjaGVzIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgaW1wb3J0IG9wZXJhdGlvbnMuXG4gKi9cbmludGVyZmFjZSBFeHBvcnRQYWNrYWdlIHtcbiAgZXhwb3J0VmVyc2lvbjogc3RyaW5nO1xuICBleHBvcnRlZEF0OiBzdHJpbmc7XG4gIGVsZW1lbnRUeXBlOiBzdHJpbmc7XG4gIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnO1xuICBkYXRhOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGFuZGxlIGVsZW1lbnQgZXhwb3J0IG9wZXJhdGlvbi5cbiAqIFJldHVybnMgYW4gRXhwb3J0UGFja2FnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbXBvcnQgb3BlcmF0aW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgbWFwcGVkUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcmVnaXN0cnk6IEhhbmRsZXJSZWdpc3RyeVxuKTogUHJvbWlzZTxFeHBvcnRQYWNrYWdlPiB7XG4gIGNvbnN0IGhhbmRsZXIgPSByZWdpc3RyeS5lbGVtZW50Q1JVRDtcbiAgaWYgKCFoYW5kbGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50Q1JVRCBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IGhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZXhwb3J0YWJsZSBkYXRhIGZyb20gdGhlIGVsZW1lbnRcbiAgLy8gSXNzdWUgIzI5MDogVXNlIG1hcHBlZCBuYW1lcyAoZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKSBmcm9tIHNjaGVtYSBtYXBUb1xuICBjb25zdCBuYW1lID0gbWFwcGVkUGFyYW1zLmVsZW1lbnROYW1lIGFzIHN0cmluZztcbiAgY29uc3QgdHlwZSA9IG1hcHBlZFBhcmFtcy5lbGVtZW50VHlwZSBhcyBzdHJpbmc7XG4gIGNvbnN0IGZvcm1hdCA9IChtYXBwZWRQYXJhbXMuZm9ybWF0IGFzICdqc29uJyB8ICd5YW1sJykgfHwgJ2pzb24nO1xuXG4gIC8vIFVzZSB0aGUgZWxlbWVudCBxdWVyeSBzZXJ2aWNlIHRvIGdldCBlbGVtZW50IGRldGFpbHNcbiAgY29uc3QgZWxlbWVudERldGFpbHMgPSBhd2FpdCBoYW5kbGVyLmdldEVsZW1lbnREZXRhaWxzKG5hbWUsIHR5cGUpO1xuICBpZiAoIWVsZW1lbnREZXRhaWxzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IG5vdCBmb3VuZDogJHt0eXBlfS8ke25hbWV9YCk7XG4gIH1cblxuICAvLyBCdWlsZCBleHBvcnQgcGFja2FnZSAobWF0Y2hlcyBNQ1BBUUxIYW5kbGVyLmhhbmRsZUV4cG9ydEVsZW1lbnQgZm9ybWF0KVxuICBjb25zdCBleHBvcnRQYWNrYWdlOiBFeHBvcnRQYWNrYWdlID0ge1xuICAgIGV4cG9ydFZlcnNpb246ICcxLjAnLFxuICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICBmb3JtYXQsXG4gICAgZGF0YTogJycsXG4gIH07XG5cbiAgLy8gU2VyaWFsaXplIHRvIHJlcXVlc3RlZCBmb3JtYXRcbiAgaWYgKGZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgZXhwb3J0UGFja2FnZS5kYXRhID0geWFtbC5kdW1wKGVsZW1lbnREZXRhaWxzLCB7XG4gICAgICBpbmRlbnQ6IDIsXG4gICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRQYWNrYWdlLmRhdGEgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50RGV0YWlscywgbnVsbCwgMik7XG4gIH1cblxuICByZXR1cm4gZXhwb3J0UGFja2FnZTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgZWxlbWVudCBpbXBvcnQgb3BlcmF0aW9uLlxuICogUGFyc2VzIGV4cG9ydCBwYWNrYWdlIGFuZCBkZWxlZ2F0ZXMgdG8gRWxlbWVudENSVUQuXG4gKlxuICogU3VwcG9ydHMgdHdvIGV4cG9ydCBwYWNrYWdlIGZvcm1hdHM6XG4gKiAxLiBNQ1BBUUxIYW5kbGVyIGZvcm1hdDogeyBleHBvcnRWZXJzaW9uLCBlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGZvcm1hdCwgZGF0YSB9XG4gKiAyLiBMZWdhY3kgZm9ybWF0OiB7IHZlcnNpb24sIGVsZW1lbnQ6IHsgdHlwZSwgbmFtZSwgLi4uIH0gfVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbXBvcnRFbGVtZW50KFxuICBtYXBwZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgaGFuZGxlciA9IHJlZ2lzdHJ5LmVsZW1lbnRDUlVEO1xuICBpZiAoIWhhbmRsZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnRDUlVEIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogaGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IG1hcHBlZFBhcmFtcy5kYXRhO1xuICBjb25zdCBvdmVyd3JpdGUgPSBtYXBwZWRQYXJhbXMub3ZlcndyaXRlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLy8gUGFyc2UgdGhlIGV4cG9ydCBwYWNrYWdlIChhY2NlcHQgc3RyaW5nIG9yIGFscmVhZHktcGFyc2VkIG9iamVjdClcbiAgbGV0IGV4cG9ydFBhY2thZ2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV4cG9ydFBhY2thZ2UgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBub3QgdmFsaWQgSlNPTicpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCkge1xuICAgIGV4cG9ydFBhY2thZ2UgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBtdXN0IGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIGVsZW1lbnQgZGV0YWlscyBiYXNlZCBvbiBwYWNrYWdlIGZvcm1hdFxuICBsZXQgZWxlbWVudFR5cGU6IHN0cmluZztcbiAgbGV0IGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gIGxldCBlbGVtZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaWYgKGV4cG9ydFBhY2thZ2UuZWxlbWVudFR5cGUgJiYgZXhwb3J0UGFja2FnZS5kYXRhKSB7XG4gICAgLy8gTUNQQVFMSGFuZGxlciBmb3JtYXQ6IHsgZXhwb3J0VmVyc2lvbiwgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBmb3JtYXQsIGRhdGEgfVxuICAgIGVsZW1lbnRUeXBlID0gZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSBhcyBzdHJpbmc7XG4gICAgZWxlbWVudE5hbWUgPSBleHBvcnRQYWNrYWdlLmVsZW1lbnROYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBmb3JtYXQgPSBleHBvcnRQYWNrYWdlLmZvcm1hdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBQYXJzZSB0aGUgbmVzdGVkIGRhdGEgZmllbGQgYmFzZWQgb24gZm9ybWF0XG4gICAgY29uc3QgbmVzdGVkRGF0YSA9IGV4cG9ydFBhY2thZ2UuZGF0YTtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICAgICAgICAvLyBVc2UgU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwgZm9yIHNhZmUgWUFNTCBwYXJzaW5nIChDT1JFX1NDSEVNQSwgc2l6ZSBsaW1pdHMpXG4gICAgICAgICAgZWxlbWVudERhdGEgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbChuZXN0ZWREYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50RGF0YSA9IEpTT04ucGFyc2UobmVzdGVkRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZXhwb3J0IHBhY2thZ2U6IGRhdGEgZmllbGQgaXMgbm90IHZhbGlkICR7Zm9ybWF0IHx8ICdKU09OJ31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXN0ZWREYXRhID09PSAnb2JqZWN0JyAmJiBuZXN0ZWREYXRhICE9PSBudWxsKSB7XG4gICAgICBlbGVtZW50RGF0YSA9IG5lc3RlZERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBmaWVsZCBtdXN0IGJlIHN0cmluZyBvciBvYmplY3QnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZS5lbGVtZW50KSB7XG4gICAgLy8gTGVnYWN5IGZvcm1hdDogeyB2ZXJzaW9uLCBlbGVtZW50OiB7IHR5cGUsIG5hbWUsIC4uLiB9IH1cbiAgICBjb25zdCBlbGVtZW50ID0gZXhwb3J0UGFja2FnZS5lbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlIGFzIHN0cmluZztcbiAgICBlbGVtZW50TmFtZSA9IGVsZW1lbnQubmFtZSBhcyBzdHJpbmc7XG4gICAgZWxlbWVudERhdGEgPSBlbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogbWlzc2luZyBlbGVtZW50IGRhdGEnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgd2hlbiBvdmVyd3JpdGUgaXMgZmFsc2VcbiAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBoYW5kbGVyLmdldEVsZW1lbnREZXRhaWxzKGVsZW1lbnROYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgYWxyZWFkeSBleGlzdHMuIFVzZSBvdmVyd3JpdGU6IHRydWUgdG8gcmVwbGFjZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gRWxlbWVudCBkb2Vzbid0IGV4aXN0LCB3aGljaCBpcyB3aGF0IHdlIHdhbnRcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBFcnJvcikgfHwgIWUubWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIGVsZW1lbnRcbiAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgbmFtZTogKGVsZW1lbnREYXRhLm5hbWUgYXMgc3RyaW5nKSB8fCBlbGVtZW50TmFtZSxcbiAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICBkZXNjcmlwdGlvbjogKGVsZW1lbnREYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgfHwgJycsXG4gICAgY29udGVudDogZWxlbWVudERhdGEuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaW5zdHJ1Y3Rpb25zOiBlbGVtZW50RGF0YS5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG1ldGFkYXRhOiBlbGVtZW50RGF0YS5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1haW4gRGlzcGF0Y2hlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNjaGVtYURpc3BhdGNoZXIgLSBEaXNwYXRjaCBvcGVyYXRpb25zIHVzaW5nIHNjaGVtYSBkZWZpbml0aW9uc1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGNvcmUgZGlzcGF0Y2ggbG9naWMgZm9yIHNjaGVtYS1kcml2ZW4gb3BlcmF0aW9ucy5cbiAqIEl0IHJlcGxhY2VzIHRoZSBtYW51YWwgZGlzcGF0Y2ggbWV0aG9kcyBpbiBNQ1BBUUxIYW5kbGVyIGZvciBvcGVyYXRpb25zXG4gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFEaXNwYXRjaGVyIHtcbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9wZXJhdGlvbiBjYW4gYmUgaGFuZGxlZCBieSBzY2hlbWEgZGlzcGF0Y2hcbiAgICovXG4gIHN0YXRpYyBjYW5EaXNwYXRjaChvcGVyYXRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NjaGVtYU9wZXJhdGlvbihvcGVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGFuIG9wZXJhdGlvbiB1c2luZyBpdHMgc2NoZW1hIGRlZmluaXRpb25cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIE9wZXJhdGlvbiBuYW1lIChlLmcuLCAnYnJvd3NlX2NvbGxlY3Rpb24nKVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHJlZ2lzdHJ5IC0gSGFuZGxlciByZWdpc3RyeSB3aXRoIGFsbCBjb25maWd1cmVkIGhhbmRsZXJzXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wdGlvbmFsIGZ1bGwgT3BlcmF0aW9uSW5wdXQgZm9yIHNvdXJjZSByZXNvbHV0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbiByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBvcGVyYXRpb24gbm90IGZvdW5kLCBoYW5kbGVyIG1pc3NpbmcsIG9yIHBhcmFtcyBpbnZhbGlkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGlzcGF0Y2goXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5LFxuICAgIGlucHV0PzogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gR2V0IHNjaGVtYSBkZWZpbml0aW9uXG4gICAgY29uc3Qgc2NoZW1hID0gZ2V0T3BlcmF0aW9uU2NoZW1hKG9wZXJhdGlvbik7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc2NoZW1hIGRlZmluaXRpb24gZm91bmQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259J2ApO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IG5vcm1hbGl6ZXIgaWYgc2NoZW1hIHNwZWNpZmllcyBvbmUgKElzc3VlICMyNDMpXG4gICAgLy8gTm9ybWFsaXplcnMgdHJhbnNmb3JtIHJhdyBpbnB1dCBwYXJhbXMgYmVmb3JlIHZhbGlkYXRpb24gYW5kIGRpc3BhdGNoXG4gICAgaWYgKHNjaGVtYS5ub3JtYWxpemVyKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVyID0gTm9ybWFsaXplclJlZ2lzdHJ5LmdldChzY2hlbWEubm9ybWFsaXplcik7XG4gICAgICBpZiAoIW5vcm1hbGl6ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb3JtYWxpemVyICcke3NjaGVtYS5ub3JtYWxpemVyfScgbm90IGZvdW5kIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScuIGAgK1xuICAgICAgICAgIGBSZWdpc3RlcmVkIG5vcm1hbGl6ZXJzOiBbJHtOb3JtYWxpemVyUmVnaXN0cnkubGlzdCgpLmpvaW4oJywgJykgfHwgJ25vbmUnfV1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIG5vcm1hbGl6ZXIgY29udGV4dCBmb3IgZGVidWdnaW5nIGFuZCBmdXR1cmUgZXh0ZW5zaWJpbGl0eVxuICAgICAgY29uc3Qgbm9ybWFsaXplckNvbnRleHQ6IE5vcm1hbGl6ZXJDb250ZXh0ID0ge1xuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIGVuZHBvaW50OiBzY2hlbWEuZW5kcG9pbnQsXG4gICAgICAgIGhhbmRsZXI6IHNjaGVtYS5oYW5kbGVyLFxuICAgICAgICBtZXRob2Q6IHNjaGVtYS5tZXRob2QsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBpbnB1dD8uZWxlbWVudFR5cGUsXG4gICAgICB9O1xuXG4gICAgICAvLyBOb3JtYWxpemUgcGFyYW1zIC0gdGhpcyBtYXkgdHJhbnNmb3JtLCB2YWxpZGF0ZSwgb3IgZW5yaWNoIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtcywgbm9ybWFsaXplckNvbnRleHQpO1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIG5vcm1hbGl6ZWQgcGFyYW1zIGZvciB0aGUgcmVzdCBvZiBkaXNwYXRjaFxuICAgICAgcGFyYW1zID0gcmVzdWx0LnBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBmdWxsIGlucHV0IGNvbnRleHQgZm9yIHNvdXJjZSByZXNvbHV0aW9uXG4gICAgY29uc3QgbmVlZHNJbnB1dCA9IHNjaGVtYS5uZWVkc0Z1bGxJbnB1dCAmJiBpbnB1dDtcblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIG9wZXJhdGlvbnNcbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19faW50cm9zcGVjdF9fJykge1xuICAgICAgcmV0dXJuIGhhbmRsZUludHJvc3BlY3Rpb24ocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fYnVpbGRJbmZvX18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlQnVpbGRJbmZvKHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fY2FjaGVCdWRnZXRfXycpIHtcbiAgICAgIHJldHVybiBoYW5kbGVDYWNoZUJ1ZGdldFJlcG9ydChyZWdpc3RyeSk7XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5tZXRob2QgPT09ICdfX2NhcGFiaWxpdGllc19fJykge1xuICAgICAgcmV0dXJuIGhhbmRsZUNhcGFiaWxpdGllcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIE1hcCBwYXJhbXMgYWNjb3JkaW5nIHRvIHNjaGVtYSAod2l0aCBpbnB1dCBjb250ZXh0IGFuZCBwYXJhbSBzdHlsZSlcbiAgICAvLyBGb3Igb3BlcmF0aW9ucyB3aXRoIG5vcm1hbGl6ZXJzLCB0aGUgbm9ybWFsaXplZCBwYXJhbXMgQVJFIHRoZSBtYXBwZWQgcGFyYW1zXG4gICAgLy8gKHRoZSBub3JtYWxpemVyIGFscmVhZHkgdHJhbnNmb3JtcyBpbnB1dCB0byBoYW5kbGVyLXJlYWR5IGZvcm1hdClcbiAgICBjb25zdCBtYXBwZWRQYXJhbXMgPSBzY2hlbWEubm9ybWFsaXplclxuICAgICAgPyBwYXJhbXMgIC8vIE5vcm1hbGl6ZXIgYWxyZWFkeSBwcm9kdWNlZCB0aGUgY29ycmVjdCBvdXRwdXQgZm9ybWF0XG4gICAgICA6IHNjaGVtYS5wYXJhbXNcbiAgICAgICAgPyBtYXBQYXJhbXMocGFyYW1zLCBzY2hlbWEucGFyYW1zLCBuZWVkc0lucHV0ID8gaW5wdXQgOiB1bmRlZmluZWQsIHNjaGVtYS5wYXJhbVN0eWxlKVxuICAgICAgICA6IHt9O1xuXG4gICAgLy8gVmFsaWRhdGUgcGFyYW1zOiByZXF1aXJlZCBwYXJhbXMgZmlyc3QsIHRoZW4gdHlwZSB2YWxpZGF0aW9uIChJc3N1ZSAjMjU1KVxuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBmb3Igbm9ybWFsaXplZCBvcGVyYXRpb25zIChub3JtYWxpemVyIGhhbmRsZXMgdmFsaWRhdGlvbilcbiAgICBpZiAoc2NoZW1hLnBhcmFtcyAmJiAhc2NoZW1hLm5vcm1hbGl6ZXIpIHtcbiAgICAgIHZhbGlkYXRlUmVxdWlyZWRQYXJhbXMocGFyYW1zLCBzY2hlbWEucGFyYW1zLCBvcGVyYXRpb24sIG5lZWRzSW5wdXQgPyBpbnB1dCA6IHVuZGVmaW5lZCk7XG4gICAgICB2YWxpZGF0ZVBhcmFtVHlwZXMocGFyYW1zLCBzY2hlbWEucGFyYW1zLCBvcGVyYXRpb24pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIEVsZW1lbnRDUlVEIG9wZXJhdGlvbnNcbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fZXhwb3J0X18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlRXhwb3J0RWxlbWVudChtYXBwZWRQYXJhbXMsIHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19faW1wb3J0X18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlSW1wb3J0RWxlbWVudChtYXBwZWRQYXJhbXMsIHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgaGFuZGxlciBmcm9tIHJlZ2lzdHJ5XG4gICAgY29uc3QgaGFuZGxlciA9IGdldEhhbmRsZXIoXG4gICAgICByZWdpc3RyeSxcbiAgICAgIHNjaGVtYS5oYW5kbGVyLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgc2NoZW1hLm9wdGlvbmFsID8/IGZhbHNlXG4gICAgKTtcblxuICAgIC8vIEdldCBtZXRob2QgZnJvbSBoYW5kbGVyXG4gICAgY29uc3QgbWV0aG9kID0gZ2V0TWV0aG9kKGhhbmRsZXIsIHNjaGVtYS5tZXRob2QsIHNjaGVtYS5oYW5kbGVyLCBvcGVyYXRpb24pO1xuXG4gICAgLy8gQnVpbGQgYXJndW1lbnRzIGJhc2VkIG9uIGFyZ0J1aWxkZXIgdHlwZSAod2l0aCBpbnB1dCBjb250ZXh0IGlmIG5lZWRlZClcbiAgICBjb25zdCBhcmdzID0gYnVpbGRBcmdzKHBhcmFtcywgc2NoZW1hLCBtYXBwZWRQYXJhbXMsIG5lZWRzSW5wdXQgPyBpbnB1dCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIG1ldGhvZFxuICAgIC8vIE5vdGU6IEZpZWxkIHNlbGVjdGlvbiBpcyBhcHBsaWVkIGF0IE1DUEFRTEhhbmRsZXIgbGV2ZWwgKElzc3VlICMyMDIpXG4gICAgcmV0dXJuIG1ldGhvZCguLi5hcmdzKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHBvcnRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB7IGlzU2NoZW1hT3BlcmF0aW9uLCBnZXRPcGVyYXRpb25TY2hlbWEgfTtcblxuLy8gVGVzdCBleHBvcnRzIGZvciBzZWN1cml0eSBib3VuZGFyeSB2ZXJpZmljYXRpb25cbmV4cG9ydCBjb25zdCBfX3Rlc3RfXyA9IHtcbiAgZ2V0TmVzdGVkVmFsdWUsXG4gIFNBRkVfUEFUSF9QQVRURVJOLFxuICBGT1JCSURERU5fUEFUSFMsXG59O1xuIl19
|
|
857
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hRGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL1NjaGVtYURpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEdBS2xCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUUzRSwrRUFBK0U7QUFDL0UsbUNBQW1DO0FBQ25DLCtFQUErRTtBQUUvRTs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRTNFOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBNEIsRUFBRSxJQUFZO0lBQ2hFLG9EQUFvRDtJQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Qix5Q0FBeUM7SUFDekMsS0FBSyxN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c3BhdGNoZXIgLSBHZW5lcmljIGRpc3BhdGNoZXIgZm9yIHNjaGVtYS1kcml2ZW4gb3BlcmF0aW9uc1xuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGF1dG9tYXRpYyBkaXNwYXRjaCBmcm9tIG9wZXJhdGlvbiBzY2hlbWFzIHRvIGhhbmRsZXIgbWV0aG9kcy5cbiAqIEl0IGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIG1hbnVhbCBzd2l0Y2ggc3RhdGVtZW50cyBpbiBNQ1BBUUxIYW5kbGVyIGJ5OlxuICpcbiAqIDEuIExvb2tpbmcgdXAgb3BlcmF0aW9uIGluIHNjaGVtYVxuICogMi4gUmVzb2x2aW5nIGhhbmRsZXIgZnJvbSByZWdpc3RyeVxuICogMy4gQnVpbGRpbmcgbWV0aG9kIGFyZ3VtZW50cyBmcm9tIHBhcmFtc1xuICogNC4gQ2FsbGluZyB0aGUgaGFuZGxlciBtZXRob2RcbiAqIDUuIEFwcGx5aW5nIGZpZWxkIHNlbGVjdGlvbi90cmFuc2Zvcm1hdGlvbiB0byByZXNwb25zZSAoSXNzdWUgIzIwMilcbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIFNjaGVtYURpc3BhdGNoZXIuZGlzcGF0Y2gob3BlcmF0aW9uLCBwYXJhbXMsIHJlZ2lzdHJ5KSDihpIgUHJvbWlzZTx1bmtub3duPlxuICogLSBVc2VzIGFyZ0J1aWxkZXIgdG8gZGV0ZXJtaW5lIGhvdyB0byBwYXNzIHBhcmFtZXRlcnMgdG8gaGFuZGxlclxuICogLSBWYWxpZGF0ZXMgcmVxdWlyZWQgcGFyYW1ldGVycyBiZWZvcmUgZGlzcGF0Y2hcbiAqIC0gUHJvdmlkZXMgY2xlYXIgZXJyb3IgbWVzc2FnZXMgZm9yIG1pc3NpbmcgaGFuZGxlcnMvbWV0aG9kc1xuICpcbiAqIElOUFVUIE5PUk1BTElaQVRJT04gKElzc3VlICMyNTEpOlxuICogLSBQYXJhbWV0ZXJzIGNhbiBoYXZlIG11bHRpcGxlIHNvdXJjZXMgdmlhIGBzb3VyY2VzYCBmaWVsZFxuICogLSBSZXNvbHV0aW9uIG9yZGVyOiBzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCAuLi4sIHBhcmFtc1trZXldXG4gKiAtIFN1cHBvcnRzIGRvdCBub3RhdGlvbjogJ2lucHV0LmVsZW1lbnRUeXBlJywgJ3BhcmFtcy50eXBlJ1xuICogLSBPcGVyYXRpb25zIHdpdGggYG5lZWRzRnVsbElucHV0OiB0cnVlYCBoYXZlIGFjY2VzcyB0byBmdWxsIE9wZXJhdGlvbklucHV0XG4gKlxuICogRklFTEQgU0VMRUNUSU9OIChJc3N1ZSAjMjAyKTpcbiAqIC0gV2hlbiBgZmllbGRzYCBwYXJhbSBpcyBwcm92aWRlZCwgZmlsdGVycyByZXNwb25zZSB0byByZXF1ZXN0ZWQgZmllbGRzIG9ubHlcbiAqIC0gVHJhbnNmb3JtcyBmaWVsZCBuYW1lcyBmb3IgTExNIGNvbnNpc3RlbmN5IChuYW1lIOKGkiBlbGVtZW50X25hbWUpXG4gKiAtIFN1cHBvcnRzIHByZXNldCBmaWVsZCBzZXRzOiAnbWluaW1hbCcsICdzdGFuZGFyZCcsICdmdWxsJ1xuICpcbiAqIEBzZWUgSXNzdWUgIzI0NyAtIFNjaGVtYS1kcml2ZW4gb3BlcmF0aW9uIGRlZmluaXRpb25zXG4gKiBAc2VlIElzc3VlICMyNTEgLSBFbGVtZW50Q1JVRCBpbnB1dCBub3JtYWxpemF0aW9uXG4gKiBAc2VlIElzc3VlICMyMDIgLSBHcmFwaFFMIGZpZWxkIHNlbGVjdGlvbiBmb3IgcmVzcG9uc2UgdG9rZW4gb3B0aW1pemF0aW9uXG4gKi9cblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQge1xuICBnZXRPcGVyYXRpb25TY2hlbWEsXG4gIGlzU2NoZW1hT3BlcmF0aW9uLFxuICB0eXBlIE9wZXJhdGlvbkRlZixcbiAgdHlwZSBQYXJhbVNjaGVtYSxcbiAgdHlwZSBQYXJhbURlZixcbiAgdHlwZSBIYW5kbGVyS2V5LFxufSBmcm9tICcuL09wZXJhdGlvblNjaGVtYS5qcyc7XG5pbXBvcnQgeyBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIgfSBmcm9tICcuL0ludHJvc3BlY3Rpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBOb3JtYWxpemVyUmVnaXN0cnkgfSBmcm9tICcuL25vcm1hbGl6ZXJzL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgTm9ybWFsaXplckNvbnRleHQgfSBmcm9tICcuL25vcm1hbGl6ZXJzL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlclJlZ2lzdHJ5IH0gZnJvbSAnLi9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uSW5wdXQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbi8vIE5vdGU6IEZpZWxkIHNlbGVjdGlvbiBpcyBub3cgYXBwbGllZCBhdCBNQ1BBUUxIYW5kbGVyIGxldmVsIChJc3N1ZSAjMjAyKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnB1dCBOb3JtYWxpemF0aW9uIChJc3N1ZSAjMjUxKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFZhbGlkYXRlIHByb3BlcnR5IHBhdGggdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uIGF0dGFja3MuXG4gKiBPbmx5IGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGFuZCBkb3RzLlxuICovXG5jb25zdCBTQUZFX1BBVEhfUEFUVEVSTiA9IC9eW2EtekEtWl8kXVthLXpBLVowLTlfJC5dKiQvO1xuY29uc3QgRk9SQklEREVOX1BBVEhTID0gbmV3IFNldChbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXSk7XG5cbi8qKlxuICogUmVzb2x2ZSBhIHZhbHVlIGZyb20gYSBkb3Qtbm90YXRpb24gcGF0aCBvbiBhbiBvYmplY3QuXG4gKiBFeGFtcGxlOiBnZXROZXN0ZWRWYWx1ZSh7IGlucHV0OiB7IGVsZW1lbnRUeXBlOiAncGVyc29uYScgfSB9LCAnaW5wdXQuZWxlbWVudFR5cGUnKSA9PiAncGVyc29uYSdcbiAqXG4gKiBTZWN1cml0eTogVmFsaWRhdGVzIHBhdGggZm9ybWF0IGFuZCBibG9ja3MgcHJvdG90eXBlIHBvbGx1dGlvbiB2ZWN0b3JzLlxuICovXG5mdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgLy8gVmFsaWRhdGUgcGF0aCBmb3JtYXQgdG8gcHJldmVudCBpbmplY3Rpb24gYXR0YWNrc1xuICBpZiAoIVNBRkVfUEFUSF9QQVRURVJOLnRlc3QocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvcGVydHkgcGF0aCBmb3JtYXQ6ICR7cGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuXG4gIC8vIENoZWNrIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uIGF0dGVtcHRzXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChGT1JCSURERU5fUEFUSFMuaGFzKHBhcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwcm9wZXJ0eSBwYXRoIHNlZ21lbnQ6ICR7cGFydH1gKTtcbiAgICB9XG4gIH1cblxuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcGFyYW1ldGVyIHZhbHVlIGZyb20gbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBUaGUgcmVzb2x1dGlvbiBvcmRlciBpczpcbiAqIDEuIENoZWNrIGVhY2ggc291cmNlIGluIGBzb3VyY2VzYCBhcnJheSAoaWYgZGVmaW5lZClcbiAqIDIuIEZhbGwgYmFjayB0byB0aGUgZGlyZWN0IHBhcmFtZXRlciB2YWx1ZVxuICogMy4gRmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUgKGlmIGRlZmluZWQpXG4gKlxuICogQHBhcmFtIGtleSAtIFBhcmFtZXRlciBuYW1lXG4gKiBAcGFyYW0gZGVmIC0gUGFyYW1ldGVyIGRlZmluaXRpb24gd2l0aCBwb3NzaWJsZSBzb3VyY2VzXG4gKiBAcGFyYW0gY29udGV4dCAtIFJlc29sdXRpb24gY29udGV4dCBjb250YWluaW5nIGlucHV0LCBwYXJhbXMsIGFuZCByYXcgcGFyYW1zXG4gKiBAcmV0dXJucyBSZXNvbHZlZCB2YWx1ZSBvciB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVBhcmFtVmFsdWUoXG4gIGtleTogc3RyaW5nLFxuICBkZWY6IFBhcmFtRGVmLFxuICBjb250ZXh0OiB7XG4gICAgaW5wdXQ/OiBPcGVyYXRpb25JbnB1dDtcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG4pOiB1bmtub3duIHtcbiAgLy8gSWYgc291cmNlcyBhcmUgZGVmaW5lZCwgY2hlY2sgdGhlbSBpbiBvcmRlclxuICBpZiAoZGVmLnNvdXJjZXMgJiYgZGVmLnNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIGRlZi5zb3VyY2VzKSB7XG4gICAgICAvLyBCdWlsZCB0aGUgcmVzb2x1dGlvbiBjb250ZXh0IGFzIGEgZmxhdCBvYmplY3QgZm9yIGdldE5lc3RlZFZhbHVlXG4gICAgICBjb25zdCByZXNvbHZlQ29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIHBhcmFtczogY29udGV4dC5wYXJhbXMsXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgaW5wdXQgZmllbGRzIHRvIHRoZSBjb250ZXh0IGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGNvbnRleHQuaW5wdXQpIHtcbiAgICAgICAgcmVzb2x2ZUNvbnRleHQuaW5wdXQgPSBjb250ZXh0LmlucHV0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKHJlc29sdmVDb250ZXh0LCBzb3VyY2UpO1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byBkaXJlY3QgcGFyYW0gdmFsdWVcbiAgY29uc3QgZGlyZWN0VmFsdWUgPSBjb250ZXh0LnBhcmFtc1trZXldO1xuICBpZiAoZGlyZWN0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkaXJlY3RWYWx1ZTtcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byBkZWZhdWx0XG4gIHJldHVybiBkZWYuZGVmYXVsdDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGFyYW1ldGVyIFN0eWxlIENvbnZlcnNpb24gKElzc3VlICMyNTIpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ29udmVydCBhIHNuYWtlX2Nhc2Ugc3RyaW5nIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogc25ha2VUb0NhbWVsKCdkcnlfcnVuJykgPT4gJ2RyeVJ1bidcbiAqIHNuYWtlVG9DYW1lbCgnbWF4X3Jlc3VsdHMnKSA9PiAnbWF4UmVzdWx0cydcbiAqIHNuYWtlVG9DYW1lbCgnYWxyZWFkeV9jYW1lbCcpID0+ICdhbHJlYWR5Q2FtZWwnXG4gKi9cbmZ1bmN0aW9uIHNuYWtlVG9DYW1lbChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGxldHRlcikgPT4gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xufVxuXG4vKipcbiAqIEFwcGx5IHBhcmFtIHN0eWxlIGNvbnZlcnNpb24gdG8gYSBrZXkgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiBzY2hlbWEuXG4gKiBJbmRpdmlkdWFsIGBtYXBUb2Agb3ZlcnJpZGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHN0eWxlIGNvbnZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UGFyYW1TdHlsZShcbiAga2V5OiBzdHJpbmcsXG4gIGRlZjogUGFyYW1EZWYsXG4gIHBhcmFtU3R5bGU/OiAnc25ha2VUb0NhbWVsJ1xuKTogc3RyaW5nIHtcbiAgLy8gRXhwbGljaXQgbWFwVG8gdGFrZXMgcHJlY2VkZW5jZVxuICBpZiAoZGVmLm1hcFRvKSB7XG4gICAgcmV0dXJuIGRlZi5tYXBUbztcbiAgfVxuXG4gIC8vIEFwcGx5IHN0eWxlIGNvbnZlcnNpb24gaWYgc3BlY2lmaWVkXG4gIGlmIChwYXJhbVN0eWxlID09PSAnc25ha2VUb0NhbWVsJykge1xuICAgIHJldHVybiBzbmFrZVRvQ2FtZWwoa2V5KTtcbiAgfVxuXG4gIC8vIERlZmF1bHQ6IHVzZSBvcmlnaW5hbCBrZXlcbiAgcmV0dXJuIGtleTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGFyYW1ldGVyIE1hcHBpbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBNYXAgaW5wdXQgcGFyYW1ldGVycyB0byBoYW5kbGVyIGFyZ3VtZW50cyBiYXNlZCBvbiBwYXJhbSBzY2hlbWEuXG4gKiBTdXBwb3J0cyBtdWx0aS1zb3VyY2UgcGFyYW1ldGVyIHJlc29sdXRpb24gYW5kIHBhcmFtIHN0eWxlIGNvbnZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIG1hcFBhcmFtcyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2NoZW1hOiBQYXJhbVNjaGVtYSxcbiAgaW5wdXQ/OiBPcGVyYXRpb25JbnB1dCxcbiAgcGFyYW1TdHlsZT86ICdzbmFrZVRvQ2FtZWwnXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IG1hcHBlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3QgY29udGV4dCA9IHsgaW5wdXQsIHBhcmFtcyB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXNvbHZlUGFyYW1WYWx1ZShrZXksIGRlZiwgY29udGV4dCk7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gYXBwbHlQYXJhbVN0eWxlKGtleSwgZGVmLCBwYXJhbVN0eWxlKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtYXBwZWRbdGFyZ2V0S2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXBwZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudC5cbiAqXG4gKiBVc2VzIG11bHRpLXNvdXJjZSByZXNvbHV0aW9uIHRvIGNoZWNrIGFsbCBwb3NzaWJsZSBzb3VyY2VzIGZvciBlYWNoXG4gKiByZXF1aXJlZCBwYXJhbWV0ZXIuIFByb3ZpZGVzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzIHNob3dpbmc6XG4gKiAtIFdoaWNoIHBhcmFtZXRlciBpcyBtaXNzaW5nXG4gKiAtIFdoaWNoIHNvdXJjZXMgd2VyZSBjaGVja2VkIChpbiBvcmRlcilcbiAqIC0gV2hhdCB3YXMgYWN0dWFsbHkgcHJvdmlkZWQgaW4gcGFyYW1zXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlclxuICogQHBhcmFtIHNjaGVtYSAtIFBhcmFtZXRlciBzY2hlbWEgZGVmaW5pbmcgcmVxdWlyZW1lbnRzXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgZm9yIGVycm9yIGNvbnRleHRcbiAqIEBwYXJhbSBpbnB1dCAtIE9wdGlvbmFsIGZ1bGwgT3BlcmF0aW9uSW5wdXQgZm9yIHNvdXJjZSByZXNvbHV0aW9uXG4gKiBAdGhyb3dzIEVycm9yIHdpdGggZGVidWdnaW5nIGNvbnRleHQgaWYgcmVxdWlyZWQgcGFyYW1ldGVyIGlzIG1pc3NpbmdcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXF1aXJlZFBhcmFtcyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2NoZW1hOiBQYXJhbVNjaGVtYSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIGlucHV0PzogT3BlcmF0aW9uSW5wdXRcbik6IHZvaWQge1xuICBjb25zdCBjb250ZXh0ID0geyBpbnB1dCwgcGFyYW1zIH07XG5cbiAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICBpZiAoZGVmLnJlcXVpcmVkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJlc29sdmVQYXJhbVZhbHVlKGtleSwgZGVmLCBjb250ZXh0KTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEJ1aWxkIGRldGFpbGVkIGVycm9yIG1lc3NhZ2UgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zdCBzb3VyY2VzQ2hlY2tlZCA9IGRlZi5zb3VyY2VzXG4gICAgICAgICAgPyBgU291cmNlcyBjaGVja2VkIChpbiBvcmRlcik6IFske2RlZi5zb3VyY2VzLmpvaW4oJyDihpIgJyl9XSDihpIgcGFyYW1zLiR7a2V5fWBcbiAgICAgICAgICA6IGBTb3VyY2U6IHBhcmFtcy4ke2tleX1gO1xuXG4gICAgICAgIGNvbnN0IHByb3ZpZGVkUGFyYW1zID0gT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBgUHJvdmlkZWQgcGFyYW1zOiB7JHtPYmplY3Qua2V5cyhwYXJhbXMpLmpvaW4oJywgJyl9fWBcbiAgICAgICAgICA6ICdObyBwYXJhbXMgcHJvdmlkZWQnO1xuXG4gICAgICAgIC8vIElzc3VlICMyOTA6IENoZWNrIGJvdGggc25ha2VfY2FzZSBhbmQgY2FtZWxDYXNlIGZvciBlbGVtZW50X3R5cGVcbiAgICAgICAgY29uc3QgZWxlbWVudFR5cGVWYWx1ZSA9IGlucHV0Py5lbGVtZW50X3R5cGUgfHwgaW5wdXQ/LmVsZW1lbnRUeXBlO1xuICAgICAgICBjb25zdCBoYXNFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlVmFsdWVcbiAgICAgICAgICA/IGBpbnB1dC5lbGVtZW50X3R5cGU6ICcke2VsZW1lbnRUeXBlVmFsdWV9J2BcbiAgICAgICAgICA6ICdpbnB1dC5lbGVtZW50X3R5cGU6IHVuZGVmaW5lZCc7XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nLiBgICtcbiAgICAgICAgICBgJHtzb3VyY2VzQ2hlY2tlZH0uICR7cHJvdmlkZWRQYXJhbXN9LiAke2hhc0VsZW1lbnRUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZSBWYWxpZGF0aW9uIChJc3N1ZSAjMjU1KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBhIGh1bWFuLXJlYWRhYmxlIHR5cGUgZGVzY3JpcHRpb24gZm9yIGVycm9yIG1lc3NhZ2VzXG4gKi9cbmZ1bmN0aW9uIGdldEFjdHVhbFR5cGUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdhcnJheSc7XG4gIHJldHVybiB0eXBlb2YgdmFsdWU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBzaW5nbGUgcGFyYW1ldGVyIHZhbHVlIGFnYWluc3QgaXRzIHR5cGUgZGVmaW5pdGlvblxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwYXJhbWV0ZXIgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBkZWYgLSBUaGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZnJvbSBzY2hlbWFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcGFyYW1ldGVyIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlcylcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlcylcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdHlwZSB2YWxpZGF0aW9uIGZhaWxzXG4gKlxuICogQHNlZSBJc3N1ZSAjMjU1IC0gUnVudGltZSB0eXBlIHZhbGlkYXRpb25cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbVR5cGUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWY6IFBhcmFtRGVmLFxuICBrZXk6IHN0cmluZyxcbiAgb3BlcmF0aW9uOiBzdHJpbmdcbik6IHZvaWQge1xuICAvLyBTa2lwIHZhbGlkYXRpb24gZm9yIHVuZGVmaW5lZCB2YWx1ZXMgKGhhbmRsZWQgYnkgcmVxdWlyZWQgY2hlY2spXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgY29uc3QgYWN0dWFsVHlwZSA9IGdldEFjdHVhbFR5cGUodmFsdWUpO1xuXG4gIHN3aXRjaCAoZGVmLnR5cGUpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGEgbnVtYmVyLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzdHJpbmdbXSc6XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhIHN0cmluZyBhcnJheSwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBWYWxpZGF0ZSBhcnJheSBlbGVtZW50cyBhcmUgc3RyaW5nc1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fVske2l9XScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtnZXRBY3R1YWxUeXBlKHZhbHVlW2ldKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd1bmtub3duJzpcbiAgICAgIC8vIEFsbG93IGFueSB0eXBlIC0gbm8gdmFsaWRhdGlvbiBuZWVkZWRcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYWxsIHBhcmFtZXRlciB0eXBlcyBhZ2FpbnN0IHNjaGVtYSBkZWZpbml0aW9uc1xuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHNjaGVtYSAtIFRoZSBwYXJhbWV0ZXIgc2NoZW1hXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBuYW1lIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSB0eXBlIHZhbGlkYXRpb24gZmFpbHNcbiAqXG4gKiBAc2VlIElzc3VlICMyNTUgLSBSdW50aW1lIHR5cGUgdmFsaWRhdGlvblxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtVHlwZXMoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNjaGVtYTogUGFyYW1TY2hlbWEsXG4gIG9wZXJhdGlvbjogc3RyaW5nXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtc1trZXldO1xuICAgIHZhbGlkYXRlUGFyYW1UeXBlKHZhbHVlLCBkZWYsIGtleSwgb3BlcmF0aW9uKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIYW5kbGVyIFJlc29sdXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBub24tbnVsbCBvYmplY3QuXG4gKiBVc2VkIGZvciBzYWZlIHByb3BlcnR5IGFjY2VzcyB3aXRob3V0IHR5cGUgYXNzZXJ0aW9ucy5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIGNhbGxhYmxlIG1ldGhvZC5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBtZXRob2QgbG9va3VwIHdpdGhvdXQgdW5zYWZlIGFzc2VydGlvbnMuXG4gKlxuICogQHBhcmFtIG9iaiAtIE9iamVjdCB0byBjaGVja1xuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBOYW1lIG9mIG1ldGhvZCB0byBsb29rIGZvclxuICogQHJldHVybnMgVHJ1ZSBpZiBvYmogaGFzIGEgZnVuY3Rpb24gcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICovXG5mdW5jdGlvbiBoYXNNZXRob2QoXG4gIG9iajogdW5rbm93bixcbiAgbWV0aG9kTmFtZTogc3RyaW5nXG4pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bj4ge1xuICByZXR1cm4gaXNPYmplY3Qob2JqKSAmJiB0eXBlb2Ygb2JqW21ldGhvZE5hbWVdID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIEdldCBoYW5kbGVyIGZyb20gcmVnaXN0cnkgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogUmVzb2x2ZXMgYSBoYW5kbGVyIGJ5IGtleSBmcm9tIHRoZSByZWdpc3RyeSwgcHJvdmlkaW5nIGNsZWFyIGVycm9yIG1lc3NhZ2VzXG4gKiB3aGVuIGhhbmRsZXJzIGFyZSBtaXNzaW5nLiBEaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBoYW5kbGVycy5cbiAqXG4gKiBAcGFyYW0gcmVnaXN0cnkgLSBIYW5kbGVyIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgYWxsIGNvbmZpZ3VyZWQgaGFuZGxlcnNcbiAqIEBwYXJhbSBoYW5kbGVyS2V5IC0gS2V5IGlkZW50aWZ5aW5nIHdoaWNoIGhhbmRsZXIgdG8gcmV0cmlldmVcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gbmFtZSBmb3IgZXJyb3IgY29udGV4dFxuICogQHBhcmFtIG9wdGlvbmFsIC0gV2hldGhlciB0aGUgaGFuZGxlciBpcyBvcHRpb25hbCAoYWZmZWN0cyBlcnJvciBtZXNzYWdpbmcpXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgaGFuZGxlclxuICogQHRocm93cyBFcnJvciBpZiBoYW5kbGVyIGlzIG5vdCBjb25maWd1cmVkXG4gKi9cbmZ1bmN0aW9uIGdldEhhbmRsZXIoXG4gIHJlZ2lzdHJ5OiBIYW5kbGVyUmVnaXN0cnksXG4gIGhhbmRsZXJLZXk6IEhhbmRsZXJLZXksXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBvcHRpb25hbDogYm9vbGVhblxuKTogdW5rbm93biB7XG4gIGNvbnN0IGhhbmRsZXIgPSByZWdpc3RyeVtoYW5kbGVyS2V5IGFzIGtleW9mIEhhbmRsZXJSZWdpc3RyeV07XG5cbiAgaWYgKCFoYW5kbGVyICYmICFvcHRpb25hbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBIYW5kbGVyICcke2hhbmRsZXJLZXl9JyBpcyByZXF1aXJlZCBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIGJ1dCBub3QgY29uZmlndXJlZC4gYCArXG4gICAgICBgRW5zdXJlIHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIEhhbmRsZXJSZWdpc3RyeS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmICghaGFuZGxlciAmJiBvcHRpb25hbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2hhbmRsZXJLZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBoYW5kbGVyS2V5LnNsaWNlKDEpfSBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IGAgK1xuICAgICAgYCR7aGFuZGxlcktleX0gbm90IGNvbmZpZ3VyZWQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgaGFuZGxlciB0aGF0IG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGFsbCBjb25maWd1cmF0aW9ucy5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBoYW5kbGVyO1xufVxuXG4vKipcbiAqIEdldCBtZXRob2QgZnJvbSBoYW5kbGVyIHdpdGggdHlwZS1zYWZlIGxvb2t1cC5cbiAqXG4gKiBVc2VzIHR5cGUgZ3VhcmRzIGluc3RlYWQgb2YgdW5zYWZlIHR5cGUgYXNzZXJ0aW9ucyB0byB2ZXJpZnkgdGhlIGhhbmRsZXJcbiAqIGhhcyB0aGUgZXhwZWN0ZWQgbWV0aG9kLiBQcm92aWRlcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcyBmb3IgZGVidWdnaW5nLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gSGFuZGxlciBvYmplY3QgdG8gZ2V0IG1ldGhvZCBmcm9tXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIE5hbWUgb2YgdGhlIG1ldGhvZCB0byByZXRyaWV2ZVxuICogQHBhcmFtIGhhbmRsZXJLZXkgLSBIYW5kbGVyIGtleSBmb3IgZXJyb3IgY29udGV4dFxuICogQHBhcmFtIG9wZXJhdGlvbiAtIE9wZXJhdGlvbiBuYW1lIGZvciBlcnJvciBjb250ZXh0XG4gKiBAcmV0dXJucyBCb3VuZCBtZXRob2QgcmVhZHkgdG8gY2FsbFxuICogQHRocm93cyBFcnJvciBpZiBtZXRob2QgaXMgbm90IGZvdW5kIG9yIGlzIG5vdCBjYWxsYWJsZVxuICovXG5mdW5jdGlvbiBnZXRNZXRob2QoXG4gIGhhbmRsZXI6IHVua25vd24sXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcktleTogc3RyaW5nLFxuICBvcGVyYXRpb246IHN0cmluZ1xuKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gIC8vIFVzZSB0eXBlIGd1YXJkIGluc3RlYWQgb2YgdW5zYWZlIGFzc2VydGlvblxuICBpZiAoIWhhc01ldGhvZChoYW5kbGVyLCBtZXRob2ROYW1lKSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZU1ldGhvZHMgPSBpc09iamVjdChoYW5kbGVyKVxuICAgICAgPyBPYmplY3Qua2V5cyhoYW5kbGVyKS5maWx0ZXIoayA9PiB0eXBlb2YgaGFuZGxlcltrXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIDogW107XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWV0aG9kICcke21ldGhvZE5hbWV9JyBub3QgZm91bmQgb24gaGFuZGxlciAnJHtoYW5kbGVyS2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259Jy4gYCArXG4gICAgICBgQXZhaWxhYmxlIG1ldGhvZHM6IFske2F2YWlsYWJsZU1ldGhvZHMuam9pbignLCAnKSB8fCAnbm9uZSd9XWBcbiAgICApO1xuICB9XG5cbiAgLy8gTm93IFR5cGVTY3JpcHQga25vd3MgaGFuZGxlclttZXRob2ROYW1lXSBpcyBhIGZ1bmN0aW9uXG4gIGNvbnN0IG1ldGhvZCA9IGhhbmRsZXJbbWV0aG9kTmFtZV07XG4gIHJldHVybiBtZXRob2QuYmluZChoYW5kbGVyKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBcmd1bWVudCBCdWlsZGluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBhcmFtcyB0aGF0IGFyZSBoYW5kbGVkIGF0IHRoZSBkaXNwYXRjaCBsZXZlbCBhbmQgc2hvdWxkIE5PVCBiZSBwYXNzZWQgdG8gaGFuZGxlcnMuXG4gKiBUaGVzZSBhcmUgY3Jvc3MtY3V0dGluZyBjb25jZXJucyBwcm9jZXNzZWQgYnkgU2NoZW1hRGlzcGF0Y2hlciBpdHNlbGYuXG4gKlxuICogQHNlZSBJc3N1ZSAjMjAyIC0gZmllbGRzIGlzIHVzZWQgZm9yIHJlc3BvbnNlIGZpbHRlcmluZywgbm90IGJ5IGhhbmRsZXJzXG4gKi9cbmNvbnN0IERJU1BBVENIX09OTFlfUEFSQU1TID0gbmV3IFNldChbJ2ZpZWxkcyddKTtcblxuLyoqXG4gKiBGaWx0ZXIgb3V0IGRpc3BhdGNoLW9ubHkgcGFyYW1zIGZyb20gYSBwYXJhbXMgb2JqZWN0LlxuICogVGhlc2UgcGFyYW1zIGFyZSBoYW5kbGVkIGF0IHRoZSBkaXNwYXRjaCBsZXZlbCAoZS5nLiwgZmllbGQgc2VsZWN0aW9uKVxuICogYW5kIHNob3VsZCBub3QgYmUgcGFzc2VkIHRvIGhhbmRsZXJzLlxuICovXG5mdW5jdGlvbiBmaWx0ZXJEaXNwYXRjaE9ubHlQYXJhbXMoXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZmlsdGVyZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcykpIHtcbiAgICBpZiAoIURJU1BBVENIX09OTFlfUEFSQU1TLmhhcyhrZXkpKSB7XG4gICAgICBmaWx0ZXJlZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhcmd1bWVudHMgZm9yIGhhbmRsZXIgbWV0aG9kIGJhc2VkIG9uIGFyZ0J1aWxkZXIgdHlwZVxuICpcbiAqIC0gJ3NpbmdsZSc6IFBhc3MgcGFyYW1zIGluIHNjaGVtYSBvcmRlciBhcyBwb3NpdGlvbmFsIGFyZ3MgKGRlZmF1bHQpXG4gKiAtICdzcHJlYWQnOiBQYXNzIHF1ZXJ5ICsgcmVtYWluaW5nIHBhcmFtc1xuICogLSAnbmFtZWQnOiBQYXNzIG1hcHBlZCBwYXJhbXMgYXMgbmFtZWQgb2JqZWN0XG4gKiAtICduYW1lZFdpdGhUeXBlJzogTGlrZSAnbmFtZWQnIGJ1dCBlbnN1cmVzICd0eXBlJyBpcyBpbmNsdWRlZCBmcm9tIHJlc29sdmVkIHNvdXJjZXNcbiAqIC0gJ3R5cGVXaXRoUGFyYW1zJzogUGFzcyByZXNvbHZlZCB0eXBlICsgZnVsbCBwYXJhbXMgb2JqZWN0XG4gKlxuICogTm90ZTogUGFyYW1zIGluIERJU1BBVENIX09OTFlfUEFSQU1TIGFyZSBmaWx0ZXJlZCBvdXQgYmVmb3JlIHBhc3NpbmcgdG8gaGFuZGxlcnMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQXJncyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2NoZW1hOiBPcGVyYXRpb25EZWYsXG4gIG1hcHBlZFBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGlucHV0PzogT3BlcmF0aW9uSW5wdXRcbik6IHVua25vd25bXSB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBzY2hlbWEuYXJnQnVpbGRlciA/PyAnc2luZ2xlJztcblxuICBzd2l0Y2ggKGJ1aWxkZXIpIHtcbiAgICBjYXNlICdzcHJlYWQnOlxuICAgICAgLy8gRm9yIGhhbmRsZXJzIHRoYXQgdGFrZSAocXVlcnksIG9wdGlvbnMpXG4gICAgICByZXR1cm4gW3BhcmFtcy5xdWVyeSwgZmlsdGVyRGlzcGF0Y2hPbmx5UGFyYW1zKHBhcmFtcyldO1xuXG4gICAgY2FzZSAnbmFtZWQnOiB7XG4gICAgICAvLyBGb3IgaGFuZGxlcnMgdGhhdCB0YWtlIGEgbmFtZWQgcGFyYW1zIG9iamVjdFxuICAgICAgLy8gRmlsdGVyIG91dCBkaXNwYXRjaC1vbmx5IHBhcmFtc1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBmaWx0ZXJEaXNwYXRjaE9ubHlQYXJhbXMobWFwcGVkUGFyYW1zKTtcbiAgICAgIHJldHVybiBbZmlsdGVyZWRdO1xuICAgIH1cblxuICAgIGNhc2UgJ25hbWVkV2l0aFR5cGUnOiB7XG4gICAgICAvLyBMaWtlICduYW1lZCcgYnV0IGVuc3VyZXMgJ2VsZW1lbnRUeXBlJyBhbmQgJ2VsZW1lbnROYW1lJyBhcmUgYXZhaWxhYmxlXG4gICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIEVsZW1lbnRDUlVEIHBhdHRlcm4gd2hlcmUgdHlwZSBjb21lcyBmcm9tIGlucHV0LmVsZW1lbnRfdHlwZSBPUiBwYXJhbXMuZWxlbWVudF90eXBlXG4gICAgICAvLyBJc3N1ZSAjMjkwOiBlbGVtZW50X25hbWUgbWFwcyB0byBlbGVtZW50TmFtZSwgZWxlbWVudF90eXBlIG1hcHMgdG8gZWxlbWVudFR5cGVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4ubWFwcGVkUGFyYW1zIH07XG5cbiAgICAgIC8vIElmICdlbGVtZW50VHlwZScgd2Fzbid0IGluIG1hcHBlZFBhcmFtcyBidXQgaXMgYXZhaWxhYmxlIGZyb20gaW5wdXQuZWxlbWVudF90eXBlIChvciBsZWdhY3kgZWxlbWVudFR5cGUpLCBhZGQgaXRcbiAgICAgIC8vIElzc3VlICMyOTA6IFByZWZlciBzbmFrZV9jYXNlIGVsZW1lbnRfdHlwZSwgZmFsbGJhY2sgdG8gY2FtZWxDYXNlIGVsZW1lbnRUeXBlIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICAgIGlmICghcmVzdWx0LmVsZW1lbnRUeXBlICYmIChpbnB1dD8uZWxlbWVudF90eXBlIHx8IGlucHV0Py5lbGVtZW50VHlwZSkpIHtcbiAgICAgICAgcmVzdWx0LmVsZW1lbnRUeXBlID0gaW5wdXQuZWxlbWVudF90eXBlIHx8IGlucHV0LmVsZW1lbnRUeXBlO1xuICAgICAgfVxuICAgICAgLy8gU2V0ICd0eXBlJyBmcm9tICdlbGVtZW50VHlwZScgZm9yIGhhbmRsZXJzIHRoYXQgZXhwZWN0IGl0XG4gICAgICBpZiAoIXJlc3VsdC50eXBlICYmIHJlc3VsdC5lbGVtZW50VHlwZSkge1xuICAgICAgICByZXN1bHQudHlwZSA9IHJlc3VsdC5lbGVtZW50VHlwZTtcbiAgICAgIH1cbiAgICAgIC8vIFNldCAnbmFtZScgZnJvbSAnZWxlbWVudE5hbWUnIGZvciBoYW5kbGVycyB0aGF0IGV4cGVjdCBpdCAoSXNzdWUgIzI5MClcbiAgICAgIGlmICghcmVzdWx0Lm5hbWUgJiYgcmVzdWx0LmVsZW1lbnROYW1lKSB7XG4gICAgICAgIHJlc3VsdC5uYW1lID0gcmVzdWx0LmVsZW1lbnROYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjMjc4OiBGb3IgZW5zZW1ibGVzLCBtZXJnZSB0b3AtbGV2ZWwgZWxlbWVudHMgaW50byBtZXRhZGF0YVxuICAgICAgLy8gTExNcyBvZnRlbiBwYXNzIGVsZW1lbnRzIGF0IHBhcmFtcyBsZXZlbCwgbm90IGluc2lkZSBtZXRhZGF0YVxuICAgICAgLy8gSXNzdWUgIzI5MDogUHJlZmVyIHNuYWtlX2Nhc2UgZWxlbWVudF90eXBlLCBmYWxsYmFjayB0byBjYW1lbENhc2UgZWxlbWVudFR5cGVcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IHJlc3VsdC5lbGVtZW50VHlwZSB8fCByZXN1bHQudHlwZSB8fCBpbnB1dD8uZWxlbWVudF90eXBlIHx8IGlucHV0Py5lbGVtZW50VHlwZTtcbiAgICAgIC8vIENoZWNrIGZvciBlbnNlbWJsZSB0eXBlIChoYW5kbGVzIGJvdGggcGx1cmFsIGNvbnN0YW50IGFuZCBzaW5ndWxhciBmb3JtKVxuICAgICAgY29uc3QgaXNFbnNlbWJsZSA9IHJlc29sdmVkVHlwZSA9PT0gRWxlbWVudFR5cGUuRU5TRU1CTEUgfHwgcmVzb2x2ZWRUeXBlID09PSAnZW5zZW1ibGUnO1xuICAgICAgaWYgKGlzRW5zZW1ibGUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBwYXJhbXMuZWxlbWVudHM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YSA9IHJlc3VsdC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGVsZW1lbnRzICYmICghY3VycmVudE1ldGFkYXRhIHx8ICFjdXJyZW50TWV0YWRhdGEuZWxlbWVudHMpKSB7XG4gICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhID0geyAuLi5jdXJyZW50TWV0YWRhdGEsIGVsZW1lbnRzIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzcyMjogQ29tbW9uIGZpZWxkcyAodGFncywgdHJpZ2dlcnMpIOKAlCBMTE1zIHBhc3MgYXQgcGFyYW1zIGxldmVsIGZvciBhbnkgZWxlbWVudCB0eXBlLlxuICAgICAge1xuICAgICAgICBsZXQgY3VycmVudE1ldGEgPSByZXN1bHQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB1cGRhdGVkTWV0YSA9IGN1cnJlbnRNZXRhO1xuXG4gICAgICAgIGlmIChwYXJhbXMudGFncyAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLnRhZ3MpICYmICghdXBkYXRlZE1ldGEgfHwgdXBkYXRlZE1ldGEudGFncyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIHVwZGF0ZWRNZXRhID0geyAuLi51cGRhdGVkTWV0YSwgdGFnczogcGFyYW1zLnRhZ3MgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLnRyaWdnZXJzICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMudHJpZ2dlcnMpICYmICghdXBkYXRlZE1ldGEgfHwgdXBkYXRlZE1ldGEudHJpZ2dlcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YSA9IHsgLi4udXBkYXRlZE1ldGEsIHRyaWdnZXJzOiBwYXJhbXMudHJpZ2dlcnMgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVkTWV0YSAhPT0gY3VycmVudE1ldGEpIHtcbiAgICAgICAgICByZXN1bHQubWV0YWRhdGEgPSB1cGRhdGVkTWV0YTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1RlbXBsYXRlID0gcmVzb2x2ZWRUeXBlID09PSBFbGVtZW50VHlwZS5URU1QTEFURSB8fCByZXNvbHZlZFR5cGUgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICBpZiAoaXNUZW1wbGF0ZSAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy52YXJpYWJsZXMpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YSA9IHJlc3VsdC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGN1cnJlbnRNZXRhZGF0YT8udmFyaWFibGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQubWV0YWRhdGEgPSB7IC4uLmN1cnJlbnRNZXRhZGF0YSwgdmFyaWFibGVzOiBwYXJhbXMudmFyaWFibGVzIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWdlbnQgVjIgZmllbGRzOiBnb2FsLCBhY3RpdmF0ZXMsIHRvb2xzLCBzeXN0ZW1Qcm9tcHQsIGF1dG9ub215LCByZXNpbGllbmNlXG4gICAgICBjb25zdCBpc0FnZW50ID0gcmVzb2x2ZWRUeXBlID09PSBFbGVtZW50VHlwZS5BR0VOVCB8fCByZXNvbHZlZFR5cGUgPT09ICdhZ2VudCc7XG4gICAgICBpZiAoaXNBZ2VudCkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSByZXN1bHQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB1cGRhdGVkTWV0YWRhdGEgPSBjdXJyZW50TWV0YWRhdGE7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5nb2FsICE9PSB1bmRlZmluZWQgJiYgKCF1cGRhdGVkTWV0YWRhdGEgfHwgdXBkYXRlZE1ldGFkYXRhLmdvYWwgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgZ29hbDogcGFyYW1zLmdvYWwgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmFjdGl2YXRlcyAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS5hY3RpdmF0ZXMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgYWN0aXZhdGVzOiBwYXJhbXMuYWN0aXZhdGVzIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy50b29scyAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS50b29scyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIHVwZGF0ZWRNZXRhZGF0YSA9IHsgLi4udXBkYXRlZE1ldGFkYXRhLCB0b29sczogcGFyYW1zLnRvb2xzIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXNzdWUgIzcyNTogQWNjZXB0IGJvdGggc3lzdGVtUHJvbXB0IGFuZCBzeXN0ZW1fcHJvbXB0IChMTE1zIGNvbW1vbmx5IHVzZSBzbmFrZV9jYXNlKVxuICAgICAgICBjb25zdCBzeXN0ZW1Qcm9tcHRWYWx1ZSA9IHBhcmFtcy5zeXN0ZW1Qcm9tcHQgPz8gcGFyYW1zLnN5c3RlbV9wcm9tcHQ7XG4gICAgICAgIGlmIChzeXN0ZW1Qcm9tcHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgc3lzdGVtUHJvbXB0OiBzeXN0ZW1Qcm9tcHRWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMuYXV0b25vbXkgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEuYXV0b25vbXkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgYXV0b25vbXk6IHBhcmFtcy5hdXRvbm9teSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElzc3VlICM3MjI6IHJlc2lsaWVuY2Ugd2FzIG1pc3NpbmcgZnJvbSB0aGUgYWdlbnQgVjIgbWVyZ2VcbiAgICAgICAgaWYgKHBhcmFtcy5yZXNpbGllbmNlICE9PSB1bmRlZmluZWQgJiYgKCF1cGRhdGVkTWV0YWRhdGEgfHwgdXBkYXRlZE1ldGFkYXRhLnJlc2lsaWVuY2UgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgcmVzaWxpZW5jZTogcGFyYW1zLnJlc2lsaWVuY2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVkTWV0YWRhdGEgIT09IGN1cnJlbnRNZXRhZGF0YSkge1xuICAgICAgICAgIHJlc3VsdC5tZXRhZGF0YSA9IHVwZGF0ZWRNZXRhZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNjY2OiBMTE1zIG9mdGVuIHBhc3MgZ2F0ZWtlZXBlciBhdCB0b3AtbGV2ZWwgcGFyYW1zLCBub3QgaW5zaWRlIG1ldGFkYXRhLlxuICAgICAgLy8gTWVyZ2UgaXQgaW50byBtZXRhZGF0YSBmb3IgYWxsIGVsZW1lbnQgdHlwZXMuXG4gICAgICBpZiAocGFyYW1zLmdhdGVrZWVwZXIgJiYgdHlwZW9mIHBhcmFtcy5nYXRla2VlcGVyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjdXJyZW50TWV0YSA9IHJlc3VsdC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjdXJyZW50TWV0YSB8fCAhY3VycmVudE1ldGEuZ2F0ZWtlZXBlcikge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFtTY2hlbWFEaXNwYXRjaGVyXSBNZXJnaW5nIHRvcC1sZXZlbCBnYXRla2VlcGVyIGludG8gbWV0YWRhdGEgZm9yIGVsZW1lbnQgJyR7cmVzdWx0Lm5hbWUgPz8gJ3Vua25vd24nfSdgKTtcbiAgICAgICAgICByZXN1bHQubWV0YWRhdGEgPSB7IC4uLmN1cnJlbnRNZXRhLCBnYXRla2VlcGVyOiBwYXJhbXMuZ2F0ZWtlZXBlciB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgZGlzcGF0Y2gtb25seSBwYXJhbXMgYmVmb3JlIHJldHVybmluZ1xuICAgICAgcmV0dXJuIFtmaWx0ZXJEaXNwYXRjaE9ubHlQYXJhbXMocmVzdWx0KV07XG4gICAgfVxuXG4gICAgY2FzZSAndHlwZVdpdGhQYXJhbXMnOiB7XG4gICAgICAvLyBQYXNzIHJlc29sdmVkIHR5cGUgKyBmdWxsIHBhcmFtcyBvYmplY3QgKG1pbnVzIGRpc3BhdGNoLW9ubHkgcGFyYW1zKVxuICAgICAgLy8gVXNlZCBmb3Igb3BlcmF0aW9ucyBsaWtlIGxpc3RfZWxlbWVudHMgdGhhdCBuZWVkICh0eXBlLCBwYWdpbmF0aW9uUGFyYW1zKVxuICAgICAgLy8gSXNzdWUgIzI5MDogZWxlbWVudF90eXBlIG1hcHMgdG8gZWxlbWVudFR5cGUsIHdpdGggYmFja3dhcmQgY29tcGF0IGZvciB0eXBlXG4gICAgICAvLyBQcmVmZXIgc25ha2VfY2FzZSBlbGVtZW50X3R5cGUsIGZhbGxiYWNrIHRvIGNhbWVsQ2FzZSBlbGVtZW50VHlwZVxuICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gbWFwcGVkUGFyYW1zLmVsZW1lbnRUeXBlID8/IG1hcHBlZFBhcmFtcy50eXBlID8/IGlucHV0Py5lbGVtZW50X3R5cGUgPz8gaW5wdXQ/LmVsZW1lbnRUeXBlO1xuICAgICAgcmV0dXJuIFtyZXNvbHZlZFR5cGUsIGZpbHRlckRpc3BhdGNoT25seVBhcmFtcyhwYXJhbXMpXTtcbiAgICB9XG5cbiAgICBjYXNlICdzaW5nbGUnOlxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIEV4dHJhY3QgcGFyYW1zIGluIHNjaGVtYSBvcmRlciwgdXNpbmcgcmVzb2x2ZWQgdmFsdWVzXG4gICAgICBpZiAoIXNjaGVtYS5wYXJhbXMgfHwgT2JqZWN0LmtleXMoc2NoZW1hLnBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIHNpbXBsZSBoYW5kbGVycywgcGFzcyByZXNvbHZlZCBwYXJhbXMgaW4gc2NoZW1hIG9yZGVyXG4gICAgICAvLyBTa2lwIGRpc3BhdGNoLW9ubHkgcGFyYW1zIChsaWtlICdmaWVsZHMnKSB0aGF0IGFyZSBoYW5kbGVkIGJ5IFNjaGVtYURpc3BhdGNoZXJcbiAgICAgIGNvbnN0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hLnBhcmFtcykpIHtcbiAgICAgICAgLy8gU2tpcCBkaXNwYXRjaC1sZXZlbCBwYXJhbXMgdGhhdCBzaG91bGRuJ3QgYmUgcGFzc2VkIHRvIGhhbmRsZXJzXG4gICAgICAgIGlmIChESVNQQVRDSF9PTkxZX1BBUkFNUy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBtYXBwZWQgdmFsdWUgaWYgYXZhaWxhYmxlIChoYW5kbGVzIHNvdXJjZSByZXNvbHV0aW9uKVxuICAgICAgICBjb25zdCB0YXJnZXRLZXkgPSBzY2hlbWEucGFyYW1zW2tleV0ubWFwVG8gPz8ga2V5O1xuICAgICAgICBhcmdzLnB1c2gobWFwcGVkUGFyYW1zW3RhcmdldEtleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNwZWNpYWwgT3BlcmF0aW9uIEhhbmRsZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogSGFuZGxlIGludHJvc3BlY3Rpb24gb3BlcmF0aW9uICh1c2VzIEludHJvc3BlY3Rpb25SZXNvbHZlciBkaXJlY3RseSlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW50cm9zcGVjdGlvbihcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIucmVzb2x2ZShwYXJhbXMpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBnZXRfY2FwYWJpbGl0aWVzIG9wZXJhdGlvbiAodXNlcyBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIgZGlyZWN0bHkpXG4gKiBAc2VlIElzc3VlICMxNzYwIC0gZ2V0X2NhcGFiaWxpdGllcyBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2FwYWJpbGl0aWVzKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgcmV0dXJuIEludHJvc3BlY3Rpb25SZXNvbHZlci5nZXRDYXBhYmlsaXRpZXMocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgYnVpbGQgaW5mbyBvcGVyYXRpb24gKGZvcm1hdHMgb3V0cHV0KVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVCdWlsZEluZm8oXG4gIHJlZ2lzdHJ5OiBIYW5kbGVyUmVnaXN0cnlcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBzZXJ2aWNlID0gcmVnaXN0cnkuYnVpbGRJbmZvU2VydmljZTtcbiAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCdWlsZEluZm8gb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBCdWlsZEluZm9TZXJ2aWNlIG5vdCBjb25maWd1cmVkJyk7XG4gIH1cblxuICBjb25zdCBpbmZvID0gYXdhaXQgc2VydmljZS5nZXRCdWlsZEluZm8oKTtcbiAgcmV0dXJuIHtcbiAgICBzdHJ1Y3R1cmVkQ29udGVudDogaW5mbyxcbiAgICBjb250ZW50OiBbe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdGV4dDogc2VydmljZS5mb3JtYXRCdWlsZEluZm8oaW5mbyksXG4gICAgfV0sXG4gIH07XG59XG5cbi8qKlxuICogSGFuZGxlIGNhY2hlIGJ1ZGdldCByZXBvcnQgb3BlcmF0aW9uIChmb3JtYXRzIG91dHB1dCBhcyBtYXJrZG93biB0YWJsZSlcbiAqL1xuZnVuY3Rpb24gaGFuZGxlQ2FjaGVCdWRnZXRSZXBvcnQoXG4gIHJlZ2lzdHJ5OiBIYW5kbGVyUmVnaXN0cnlcbik6IHVua25vd24ge1xuICBjb25zdCBidWRnZXQgPSByZWdpc3RyeS5jYWNoZU1lbW9yeUJ1ZGdldDtcbiAgaWYgKCFidWRnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlIGJ1ZGdldCBub3QgYXZhaWxhYmxlOiBDYWNoZU1lbW9yeUJ1ZGdldCBub3QgY29uZmlndXJlZCcpO1xuICB9XG5cbiAgY29uc3QgcmVwb3J0ID0gYnVkZ2V0LmdldFJlcG9ydCgpO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJyMgQ2FjaGUgTWVtb3J5IEJ1ZGdldCBSZXBvcnQnLFxuICAgICcnLFxuICAgIGAqKkJ1ZGdldDoqKiAke3JlcG9ydC5idWRnZXRNQn0gTUJgLFxuICAgIGAqKlVzZWQ6KiogJHtyZXBvcnQudG90YWxNZW1vcnlNQn0gTUIgKCR7cmVwb3J0LnV0aWxpemF0aW9uUGVyY2VudH0lKWAsXG4gICAgYCoqUmVnaXN0ZXJlZCBDYWNoZXM6KiogJHtyZXBvcnQuY2FjaGVzLmxlbmd0aH1gLFxuICAgICcnLFxuICBdO1xuICBpZiAocmVwb3J0LmNhY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCgnfCBDYWNoZSB8IEVudHJpZXMgfCBNZW1vcnkgKE1CKSB8IEhpdCBSYXRlIHwgTGFzdCBBY3Rpdml0eSB8Jyk7XG4gICAgbGluZXMucHVzaCgnfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18Jyk7XG4gICAgZm9yIChjb25zdCBjIG9mIHJlcG9ydC5jYWNoZXMpIHtcbiAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYy5sYXN0QWN0aXZpdHlNcyA+IDBcbiAgICAgICAgPyBgJHsoKERhdGUubm93KCkgLSBjLmxhc3RBY3Rpdml0eU1zKSAvIDEwMDApLnRvRml4ZWQoMCl9cyBhZ29gXG4gICAgICAgIDogJ25ldmVyJztcbiAgICAgIGxpbmVzLnB1c2goYHwgJHtjLm5hbWV9IHwgJHtjLmVudHJpZXN9IHwgJHtjLm1lbW9yeU1CfSB8ICR7KGMuaGl0UmF0ZSAqIDEwMCkudG9GaXhlZCgxKX0lIHwgJHthY3Rpdml0eX0gfGApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCdfTm8gY2FjaGVzIHJlZ2lzdGVyZWQuXycpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY29udGVudDogW3tcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHRleHQ6IGxpbmVzLmpvaW4oJ1xcbicpLFxuICAgIH1dLFxuICB9O1xufVxuXG4vKipcbiAqIEV4cG9ydFBhY2thZ2UgaW50ZXJmYWNlIGZvciBlbGVtZW50IGV4cG9ydC5cbiAqIE1hdGNoZXMgdGhlIGZvcm1hdCBleHBlY3RlZCBieSBpbXBvcnQgb3BlcmF0aW9ucy5cbiAqL1xuaW50ZXJmYWNlIEV4cG9ydFBhY2thZ2Uge1xuICBleHBvcnRWZXJzaW9uOiBzdHJpbmc7XG4gIGV4cG9ydGVkQXQ6IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IHN0cmluZztcbiAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgZm9ybWF0OiAnanNvbicgfCAneWFtbCc7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGUgZWxlbWVudCBleHBvcnQgb3BlcmF0aW9uLlxuICogUmV0dXJucyBhbiBFeHBvcnRQYWNrYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGltcG9ydCBvcGVyYXRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVFeHBvcnRFbGVtZW50KFxuICBtYXBwZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiBQcm9taXNlPEV4cG9ydFBhY2thZ2U+IHtcbiAgY29uc3QgaGFuZGxlciA9IHJlZ2lzdHJ5LmVsZW1lbnRDUlVEO1xuICBpZiAoIWhhbmRsZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnRDUlVEIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogaGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICB9XG5cbiAgLy8gR2V0IHRoZSBleHBvcnRhYmxlIGRhdGEgZnJvbSB0aGUgZWxlbWVudFxuICAvLyBJc3N1ZSAjMjkwOiBVc2UgbWFwcGVkIG5hbWVzIChlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpIGZyb20gc2NoZW1hIG1hcFRvXG4gIGNvbnN0IG5hbWUgPSBtYXBwZWRQYXJhbXMuZWxlbWVudE5hbWUgYXMgc3RyaW5nO1xuICBjb25zdCB0eXBlID0gbWFwcGVkUGFyYW1zLmVsZW1lbnRUeXBlIGFzIHN0cmluZztcbiAgY29uc3QgZm9ybWF0ID0gKG1hcHBlZFBhcmFtcy5mb3JtYXQgYXMgJ2pzb24nIHwgJ3lhbWwnKSB8fCAnanNvbic7XG5cbiAgLy8gVXNlIHRoZSBlbGVtZW50IHF1ZXJ5IHNlcnZpY2UgdG8gZ2V0IGVsZW1lbnQgZGV0YWlsc1xuICBjb25zdCBlbGVtZW50RGV0YWlscyA9IGF3YWl0IGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgdHlwZSk7XG4gIGlmICghZWxlbWVudERldGFpbHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgbm90IGZvdW5kOiAke3R5cGV9LyR7bmFtZX1gKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGV4cG9ydCBwYWNrYWdlIChtYXRjaGVzIE1DUEFRTEhhbmRsZXIuaGFuZGxlRXhwb3J0RWxlbWVudCBmb3JtYXQpXG4gIGNvbnN0IGV4cG9ydFBhY2thZ2U6IEV4cG9ydFBhY2thZ2UgPSB7XG4gICAgZXhwb3J0VmVyc2lvbjogJzEuMCcsXG4gICAgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgIGVsZW1lbnROYW1lOiBuYW1lLFxuICAgIGZvcm1hdCxcbiAgICBkYXRhOiAnJyxcbiAgfTtcblxuICAvLyBTZXJpYWxpemUgdG8gcmVxdWVzdGVkIGZvcm1hdFxuICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICBleHBvcnRQYWNrYWdlLmRhdGEgPSB5YW1sLmR1bXAoZWxlbWVudERldGFpbHMsIHtcbiAgICAgIGluZGVudDogMixcbiAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydFBhY2thZ2UuZGF0YSA9IEpTT04uc3RyaW5naWZ5KGVsZW1lbnREZXRhaWxzLCBudWxsLCAyKTtcbiAgfVxuXG4gIHJldHVybiBleHBvcnRQYWNrYWdlO1xufVxuXG4vKipcbiAqIEhhbmRsZSBlbGVtZW50IGltcG9ydCBvcGVyYXRpb24uXG4gKiBQYXJzZXMgZXhwb3J0IHBhY2thZ2UgYW5kIGRlbGVnYXRlcyB0byBFbGVtZW50Q1JVRC5cbiAqXG4gKiBTdXBwb3J0cyB0d28gZXhwb3J0IHBhY2thZ2UgZm9ybWF0czpcbiAqIDEuIE1DUEFRTEhhbmRsZXIgZm9ybWF0OiB7IGV4cG9ydFZlcnNpb24sIGVsZW1lbnRUeXBlLCBlbGVtZW50TmFtZSwgZm9ybWF0LCBkYXRhIH1cbiAqIDIuIExlZ2FjeSBmb3JtYXQ6IHsgdmVyc2lvbiwgZWxlbWVudDogeyB0eXBlLCBuYW1lLCAuLi4gfSB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUltcG9ydEVsZW1lbnQoXG4gIG1hcHBlZFBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJlZ2lzdHJ5OiBIYW5kbGVyUmVnaXN0cnlcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBoYW5kbGVyID0gcmVnaXN0cnkuZWxlbWVudENSVUQ7XG4gIGlmICghaGFuZGxlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudENSVUQgb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBoYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gbWFwcGVkUGFyYW1zLmRhdGE7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IG1hcHBlZFBhcmFtcy5vdmVyd3JpdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvLyBQYXJzZSB0aGUgZXhwb3J0IHBhY2thZ2UgKGFjY2VwdCBzdHJpbmcgb3IgYWxyZWFkeS1wYXJzZWQgb2JqZWN0KVxuICBsZXQgZXhwb3J0UGFja2FnZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgZXhwb3J0UGFja2FnZSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXhwb3J0IHBhY2thZ2U6IG5vdCB2YWxpZCBKU09OJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsKSB7XG4gICAgZXhwb3J0UGFja2FnZSA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBkYXRhIG11c3QgYmUgYSBzdHJpbmcgb3Igb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgZWxlbWVudCBkZXRhaWxzIGJhc2VkIG9uIHBhY2thZ2UgZm9ybWF0XG4gIGxldCBlbGVtZW50VHlwZTogc3RyaW5nO1xuICBsZXQgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgbGV0IGVsZW1lbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAoZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSAmJiBleHBvcnRQYWNrYWdlLmRhdGEpIHtcbiAgICAvLyBNQ1BBUUxIYW5kbGVyIGZvcm1hdDogeyBleHBvcnRWZXJzaW9uLCBlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGZvcm1hdCwgZGF0YSB9XG4gICAgZWxlbWVudFR5cGUgPSBleHBvcnRQYWNrYWdlLmVsZW1lbnRUeXBlIGFzIHN0cmluZztcbiAgICBlbGVtZW50TmFtZSA9IGV4cG9ydFBhY2thZ2UuZWxlbWVudE5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGZvcm1hdCA9IGV4cG9ydFBhY2thZ2UuZm9ybWF0IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vIFBhcnNlIHRoZSBuZXN0ZWQgZGF0YSBmaWVsZCBiYXNlZCBvbiBmb3JtYXRcbiAgICBjb25zdCBuZXN0ZWREYXRhID0gZXhwb3J0UGFja2FnZS5kYXRhO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgICAgIC8vIFVzZSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbCBmb3Igc2FmZSBZQU1MIHBhcnNpbmcgKENPUkVfU0NIRU1BLCBzaXplIGxpbWl0cylcbiAgICAgICAgICBlbGVtZW50RGF0YSA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2VSYXdZYW1sKG5lc3RlZERhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnREYXRhID0gSlNPTi5wYXJzZShuZXN0ZWREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBmaWVsZCBpcyBub3QgdmFsaWQgJHtmb3JtYXQgfHwgJ0pTT04nfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG5lc3RlZERhdGEgPT09ICdvYmplY3QnICYmIG5lc3RlZERhdGEgIT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnREYXRhID0gbmVzdGVkRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBkYXRhIGZpZWxkIG11c3QgYmUgc3RyaW5nIG9yIG9iamVjdCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlLmVsZW1lbnQpIHtcbiAgICAvLyBMZWdhY3kgZm9ybWF0OiB7IHZlcnNpb24sIGVsZW1lbnQ6IHsgdHlwZSwgbmFtZSwgLi4uIH0gfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBleHBvcnRQYWNrYWdlLmVsZW1lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGUgYXMgc3RyaW5nO1xuICAgIGVsZW1lbnROYW1lID0gZWxlbWVudC5uYW1lIGFzIHN0cmluZztcbiAgICBlbGVtZW50RGF0YSA9IGVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBtaXNzaW5nIGVsZW1lbnQgZGF0YScpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgZWxlbWVudCBhbHJlYWR5IGV4aXN0cyB3aGVuIG92ZXJ3cml0ZSBpcyBmYWxzZVxuICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBhbHJlYWR5IGV4aXN0cy4gVXNlIG92ZXJ3cml0ZTogdHJ1ZSB0byByZXBsYWNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBFbGVtZW50IGRvZXNuJ3QgZXhpc3QsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudFxuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEVycm9yKSB8fCAhZS5tZXNzYWdlLmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgZWxlbWVudFxuICByZXR1cm4gaGFuZGxlci5jcmVhdGVFbGVtZW50KHtcbiAgICBuYW1lOiAoZWxlbWVudERhdGEubmFtZSBhcyBzdHJpbmcpIHx8IGVsZW1lbnROYW1lLFxuICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiAoZWxlbWVudERhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nKSB8fCAnJyxcbiAgICBjb250ZW50OiBlbGVtZW50RGF0YS5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBpbnN0cnVjdGlvbnM6IGVsZW1lbnREYXRhLmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbWV0YWRhdGE6IGVsZW1lbnREYXRhLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICB9KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTWFpbiBEaXNwYXRjaGVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2NoZW1hRGlzcGF0Y2hlciAtIERpc3BhdGNoIG9wZXJhdGlvbnMgdXNpbmcgc2NoZW1hIGRlZmluaXRpb25zXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgY29yZSBkaXNwYXRjaCBsb2dpYyBmb3Igc2NoZW1hLWRyaXZlbiBvcGVyYXRpb25zLlxuICogSXQgcmVwbGFjZXMgdGhlIG1hbnVhbCBkaXNwYXRjaCBtZXRob2RzIGluIE1DUEFRTEhhbmRsZXIgZm9yIG9wZXJhdGlvbnNcbiAqIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYURpc3BhdGNoZXIge1xuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gb3BlcmF0aW9uIGNhbiBiZSBoYW5kbGVkIGJ5IHNjaGVtYSBkaXNwYXRjaFxuICAgKi9cbiAgc3RhdGljIGNhbkRpc3BhdGNoKG9wZXJhdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2NoZW1hT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gb3BlcmF0aW9uIHVzaW5nIGl0cyBzY2hlbWEgZGVmaW5pdGlvblxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGUuZy4sICdicm93c2VfY29sbGVjdGlvbicpXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcGVyYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcmVnaXN0cnkgLSBIYW5kbGVyIHJlZ2lzdHJ5IHdpdGggYWxsIGNvbmZpZ3VyZWQgaGFuZGxlcnNcbiAgICogQHBhcmFtIGlucHV0IC0gT3B0aW9uYWwgZnVsbCBPcGVyYXRpb25JbnB1dCBmb3Igc291cmNlIHJlc29sdXRpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gb3BlcmF0aW9uIHJlc3VsdFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG9wZXJhdGlvbiBub3QgZm91bmQsIGhhbmRsZXIgbWlzc2luZywgb3IgcGFyYW1zIGludmFsaWRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkaXNwYXRjaChcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHJlZ2lzdHJ5OiBIYW5kbGVyUmVnaXN0cnksXG4gICAgaW5wdXQ/OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBHZXQgc2NoZW1hIGRlZmluaXRpb25cbiAgICBjb25zdCBzY2hlbWEgPSBnZXRPcGVyYXRpb25TY2hlbWEob3BlcmF0aW9uKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzY2hlbWEgZGVmaW5pdGlvbiBmb3VuZCBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nYCk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgbm9ybWFsaXplciBpZiBzY2hlbWEgc3BlY2lmaWVzIG9uZSAoSXNzdWUgIzI0MylcbiAgICAvLyBOb3JtYWxpemVycyB0cmFuc2Zvcm0gcmF3IGlucHV0IHBhcmFtcyBiZWZvcmUgdmFsaWRhdGlvbiBhbmQgZGlzcGF0Y2hcbiAgICBpZiAoc2NoZW1hLm5vcm1hbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZXIgPSBOb3JtYWxpemVyUmVnaXN0cnkuZ2V0KHNjaGVtYS5ub3JtYWxpemVyKTtcbiAgICAgIGlmICghbm9ybWFsaXplcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vcm1hbGl6ZXIgJyR7c2NoZW1hLm5vcm1hbGl6ZXJ9JyBub3QgZm91bmQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259Jy4gYCArXG4gICAgICAgICAgYFJlZ2lzdGVyZWQgbm9ybWFsaXplcnM6IFske05vcm1hbGl6ZXJSZWdpc3RyeS5saXN0KCkuam9pbignLCAnKSB8fCAnbm9uZSd9XWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgbm9ybWFsaXplciBjb250ZXh0IGZvciBkZWJ1Z2dpbmcgYW5kIGZ1dHVyZSBleHRlbnNpYmlsaXR5XG4gICAgICBjb25zdCBub3JtYWxpemVyQ29udGV4dDogTm9ybWFsaXplckNvbnRleHQgPSB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgZW5kcG9pbnQ6IHNjaGVtYS5lbmRwb2ludCxcbiAgICAgICAgaGFuZGxlcjogc2NoZW1hLmhhbmRsZXIsXG4gICAgICAgIG1ldGhvZDogc2NoZW1hLm1ldGhvZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IGlucHV0Py5lbGVtZW50VHlwZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBwYXJhbXMgLSB0aGlzIG1heSB0cmFuc2Zvcm0sIHZhbGlkYXRlLCBvciBlbnJpY2ggcGFyYW1ldGVyc1xuICAgICAgY29uc3QgcmVzdWx0ID0gbm9ybWFsaXplci5ub3JtYWxpemUocGFyYW1zLCBub3JtYWxpemVyQ29udGV4dCk7XG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2Ugbm9ybWFsaXplZCBwYXJhbXMgZm9yIHRoZSByZXN0IG9mIGRpc3BhdGNoXG4gICAgICBwYXJhbXMgPSByZXN1bHQucGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIGZ1bGwgaW5wdXQgY29udGV4dCBmb3Igc291cmNlIHJlc29sdXRpb25cbiAgICBjb25zdCBuZWVkc0lucHV0ID0gc2NoZW1hLm5lZWRzRnVsbElucHV0ICYmIGlucHV0O1xuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgb3BlcmF0aW9uc1xuICAgIGlmIChzY2hlbWEubWV0aG9kID09PSAnX19pbnRyb3NwZWN0X18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlSW50cm9zcGVjdGlvbihwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEubWV0aG9kID09PSAnX19idWlsZEluZm9fXycpIHtcbiAgICAgIHJldHVybiBoYW5kbGVCdWlsZEluZm8ocmVnaXN0cnkpO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEubWV0aG9kID09PSAnX19jYWNoZUJ1ZGdldF9fJykge1xuICAgICAgcmV0dXJuIGhhbmRsZUNhY2hlQnVkZ2V0UmVwb3J0KHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fY2FwYWJpbGl0aWVzX18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlQ2FwYWJpbGl0aWVzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gTWFwIHBhcmFtcyBhY2NvcmRpbmcgdG8gc2NoZW1hICh3aXRoIGlucHV0IGNvbnRleHQgYW5kIHBhcmFtIHN0eWxlKVxuICAgIC8vIEZvciBvcGVyYXRpb25zIHdpdGggbm9ybWFsaXplcnMsIHRoZSBub3JtYWxpemVkIHBhcmFtcyBBUkUgdGhlIG1hcHBlZCBwYXJhbXNcbiAgICAvLyAodGhlIG5vcm1hbGl6ZXIgYWxyZWFkeSB0cmFuc2Zvcm1zIGlucHV0IHRvIGhhbmRsZXItcmVhZHkgZm9ybWF0KVxuICAgIGNvbnN0IG1hcHBlZFBhcmFtcyA9IHNjaGVtYS5ub3JtYWxpemVyXG4gICAgICA/IHBhcmFtcyAgLy8gTm9ybWFsaXplciBhbHJlYWR5IHByb2R1Y2VkIHRoZSBjb3JyZWN0IG91dHB1dCBmb3JtYXRcbiAgICAgIDogc2NoZW1hLnBhcmFtc1xuICAgICAgICA/IG1hcFBhcmFtcyhwYXJhbXMsIHNjaGVtYS5wYXJhbXMsIG5lZWRzSW5wdXQgPyBpbnB1dCA6IHVuZGVmaW5lZCwgc2NoZW1hLnBhcmFtU3R5bGUpXG4gICAgICAgIDoge307XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXJhbXM6IHJlcXVpcmVkIHBhcmFtcyBmaXJzdCwgdGhlbiB0eXBlIHZhbGlkYXRpb24gKElzc3VlICMyNTUpXG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGZvciBub3JtYWxpemVkIG9wZXJhdGlvbnMgKG5vcm1hbGl6ZXIgaGFuZGxlcyB2YWxpZGF0aW9uKVxuICAgIGlmIChzY2hlbWEucGFyYW1zICYmICFzY2hlbWEubm9ybWFsaXplcikge1xuICAgICAgdmFsaWRhdGVSZXF1aXJlZFBhcmFtcyhwYXJhbXMsIHNjaGVtYS5wYXJhbXMsIG9wZXJhdGlvbiwgbmVlZHNJbnB1dCA/IGlucHV0IDogdW5kZWZpbmVkKTtcbiAgICAgIHZhbGlkYXRlUGFyYW1UeXBlcyhwYXJhbXMsIHNjaGVtYS5wYXJhbXMsIG9wZXJhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgRWxlbWVudENSVUQgb3BlcmF0aW9uc1xuICAgIGlmIChzY2hlbWEubWV0aG9kID09PSAnX19leHBvcnRfXycpIHtcbiAgICAgIHJldHVybiBoYW5kbGVFeHBvcnRFbGVtZW50KG1hcHBlZFBhcmFtcywgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEubWV0aG9kID09PSAnX19pbXBvcnRfXycpIHtcbiAgICAgIHJldHVybiBoYW5kbGVJbXBvcnRFbGVtZW50KG1hcHBlZFBhcmFtcywgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIC8vIEdldCBoYW5kbGVyIGZyb20gcmVnaXN0cnlcbiAgICBjb25zdCBoYW5kbGVyID0gZ2V0SGFuZGxlcihcbiAgICAgIHJlZ2lzdHJ5LFxuICAgICAgc2NoZW1hLmhhbmRsZXIsXG4gICAgICBvcGVyYXRpb24sXG4gICAgICBzY2hlbWEub3B0aW9uYWwgPz8gZmFsc2VcbiAgICApO1xuXG4gICAgLy8gR2V0IG1ldGhvZCBmcm9tIGhhbmRsZXJcbiAgICBjb25zdCBtZXRob2QgPSBnZXRNZXRob2QoaGFuZGxlciwgc2NoZW1hLm1ldGhvZCwgc2NoZW1hLmhhbmRsZXIsIG9wZXJhdGlvbik7XG5cbiAgICAvLyBCdWlsZCBhcmd1bWVudHMgYmFzZWQgb24gYXJnQnVpbGRlciB0eXBlICh3aXRoIGlucHV0IGNvbnRleHQgaWYgbmVlZGVkKVxuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEFyZ3MocGFyYW1zLCBzY2hlbWEsIG1hcHBlZFBhcmFtcywgbmVlZHNJbnB1dCA/IGlucHV0IDogdW5kZWZpbmVkKTtcblxuICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgbWV0aG9kXG4gICAgLy8gTm90ZTogRmllbGQgc2VsZWN0aW9uIGlzIGFwcGxpZWQgYXQgTUNQQVFMSGFuZGxlciBsZXZlbCAoSXNzdWUgIzIwMilcbiAgICByZXR1cm4gbWV0aG9kKC4uLmFyZ3MpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4cG9ydHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHsgaXNTY2hlbWFPcGVyYXRpb24sIGdldE9wZXJhdGlvblNjaGVtYSB9O1xuXG4vLyBUZXN0IGV4cG9ydHMgZm9yIHNlY3VyaXR5IGJvdW5kYXJ5IHZlcmlmaWNhdGlvblxuZXhwb3J0IGNvbnN0IF9fdGVzdF9fID0ge1xuICBnZXROZXN0ZWRWYWx1ZSxcbiAgU0FGRV9QQVRIX1BBVFRFUk4sXG4gIEZPUkJJRERFTl9QQVRIUyxcbn07XG4iXX0=
|