@dollhousemcp/mcp-server 2.0.12-rc.9 → 2.0.13
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 +66 -0
- package/README.md +4 -4
- package/README.md.backup +5 -5
- package/README.npm.md +4 -4
- package/dist/di/Container.d.ts +14 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +43 -26
- package/dist/elements/agents/AgentManager.d.ts +11 -4
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +38 -11
- package/dist/elements/base/BaseElementManager.d.ts +10 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +26 -1
- package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
- package/dist/elements/ensembles/EnsembleManager.js +13 -2
- package/dist/elements/templates/Template.d.ts +33 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +74 -15
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +8 -1
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/element-crud/createElement.js +2 -2
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
- package/dist/index.js +19 -13
- package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +43 -1
- package/dist/security/contentValidator.d.ts +15 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +40 -2
- package/dist/utils/TemplateRenderer.d.ts +9 -0
- package/dist/utils/TemplateRenderer.d.ts.map +1 -1
- package/dist/utils/TemplateRenderer.js +21 -1
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +193 -59
- package/dist/web/console/SessionNames.d.ts +18 -5
- package/dist/web/console/SessionNames.d.ts.map +1 -1
- package/dist/web/console/SessionNames.js +63 -8
- package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
- package/dist/web/console/StaleProcessRecovery.js +5 -4
- package/dist/web/console/UnifiedConsole.js +3 -3
- package/dist/web/console/consoleToken.js +3 -3
- package/dist/web/portDiscovery.d.ts +1 -1
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +2 -2
- package/dist/web/public/app.js +65 -11
- package/dist/web/public/index.html +2 -0
- package/dist/web/public/logs.js +24 -2
- package/dist/web/public/metrics.js +22 -4
- package/dist/web/public/sessions.js +55 -8
- package/dist/web/public/setup.js +11 -2
- package/dist/web/public/styles.css +12 -0
- package/dist/web/routes/permissionRoutes.js +2 -2
- package/dist/web/routes/setupRoutes.d.ts +67 -1
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +298 -6
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +4 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +14 -5
- package/package.json +5 -3
- package/server.json +2 -2
|
@@ -452,6 +452,13 @@ function buildArgs(params, schema, mappedParams, input) {
|
|
|
452
452
|
result.metadata = updatedMeta;
|
|
453
453
|
}
|
|
454
454
|
}
|
|
455
|
+
const isTemplate = resolvedType === ElementType.TEMPLATE || resolvedType === 'template';
|
|
456
|
+
if (isTemplate && Array.isArray(params.variables)) {
|
|
457
|
+
const currentMetadata = result.metadata;
|
|
458
|
+
if (currentMetadata?.variables === undefined) {
|
|
459
|
+
result.metadata = { ...currentMetadata, variables: params.variables };
|
|
460
|
+
}
|
|
461
|
+
}
|
|
455
462
|
// Agent V2 fields: goal, activates, tools, systemPrompt, autonomy, resilience
|
|
456
463
|
const isAgent = resolvedType === ElementType.AGENT || resolvedType === 'agent';
|
|
457
464
|
if (isAgent) {
|
|
@@ -846,4 +853,4 @@ export const __test__ = {
|
|
|
846
853
|
SAFE_PATH_PATTERN,
|
|
847
854
|
FORBIDDEN_PATHS,
|
|
848
855
|
};
|
|
849
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hRGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL1NjaGVtYURpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEdBS2xCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUUzRSwrRUFBK0U7QUFDL0UsbUNBQW1DO0FBQ25DLCtFQUErRTtBQUUvRTs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRTNFOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBNEIsRUFBRSxJQUFZO0lBQ2hFLG9EQUFvRDtJQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5Qix5Q0FBeUM7SUFDekMsS0FBSyxN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LEtBQUssQ0FDekIsQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUU1RSwwRUFBMEU7UUFDMUUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyRiwwQkFBMEI7UUFDMUIsdUVBQXVFO1FBQ3ZFLE9BQU8sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBRUQsK0VBQStFO0FBQy9FLFVBQVU7QUFDViwrRUFBK0U7QUFFL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFFakQsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixjQUFjO0lBQ2QsaUJBQWlCO0lBQ2pCLGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NoZW1hRGlzcGF0Y2hlciAtIEdlbmVyaWMgZGlzcGF0Y2hlciBmb3Igc2NoZW1hLWRyaXZlbiBvcGVyYXRpb25zXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYXV0b21hdGljIGRpc3BhdGNoIGZyb20gb3BlcmF0aW9uIHNjaGVtYXMgdG8gaGFuZGxlciBtZXRob2RzLlxuICogSXQgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgbWFudWFsIHN3aXRjaCBzdGF0ZW1lbnRzIGluIE1DUEFRTEhhbmRsZXIgYnk6XG4gKlxuICogMS4gTG9va2luZyB1cCBvcGVyYXRpb24gaW4gc2NoZW1hXG4gKiAyLiBSZXNvbHZpbmcgaGFuZGxlciBmcm9tIHJlZ2lzdHJ5XG4gKiAzLiBCdWlsZGluZyBtZXRob2QgYXJndW1lbnRzIGZyb20gcGFyYW1zXG4gKiA0LiBDYWxsaW5nIHRoZSBoYW5kbGVyIG1ldGhvZFxuICogNS4gQXBwbHlpbmcgZmllbGQgc2VsZWN0aW9uL3RyYW5zZm9ybWF0aW9uIHRvIHJlc3BvbnNlIChJc3N1ZSAjMjAyKVxuICpcbiAqIEFSQ0hJVEVDVFVSRTpcbiAqIC0gU2NoZW1hRGlzcGF0Y2hlci5kaXNwYXRjaChvcGVyYXRpb24sIHBhcmFtcywgcmVnaXN0cnkpIOKGkiBQcm9taXNlPHVua25vd24+XG4gKiAtIFVzZXMgYXJnQnVpbGRlciB0byBkZXRlcm1pbmUgaG93IHRvIHBhc3MgcGFyYW1ldGVycyB0byBoYW5kbGVyXG4gKiAtIFZhbGlkYXRlcyByZXF1aXJlZCBwYXJhbWV0ZXJzIGJlZm9yZSBkaXNwYXRjaFxuICogLSBQcm92aWRlcyBjbGVhciBlcnJvciBtZXNzYWdlcyBmb3IgbWlzc2luZyBoYW5kbGVycy9tZXRob2RzXG4gKlxuICogSU5QVVQgTk9STUFMSVpBVElPTiAoSXNzdWUgIzI1MSk6XG4gKiAtIFBhcmFtZXRlcnMgY2FuIGhhdmUgbXVsdGlwbGUgc291cmNlcyB2aWEgYHNvdXJjZXNgIGZpZWxkXG4gKiAtIFJlc29sdXRpb24gb3JkZXI6IHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIC4uLiwgcGFyYW1zW2tleV1cbiAqIC0gU3VwcG9ydHMgZG90IG5vdGF0aW9uOiAnaW5wdXQuZWxlbWVudFR5cGUnLCAncGFyYW1zLnR5cGUnXG4gKiAtIE9wZXJhdGlvbnMgd2l0aCBgbmVlZHNGdWxsSW5wdXQ6IHRydWVgIGhhdmUgYWNjZXNzIHRvIGZ1bGwgT3BlcmF0aW9uSW5wdXRcbiAqXG4gKiBGSUVMRCBTRUxFQ1RJT04gKElzc3VlICMyMDIpOlxuICogLSBXaGVuIGBmaWVsZHNgIHBhcmFtIGlzIHByb3ZpZGVkLCBmaWx0ZXJzIHJlc3BvbnNlIHRvIHJlcXVlc3RlZCBmaWVsZHMgb25seVxuICogLSBUcmFuc2Zvcm1zIGZpZWxkIG5hbWVzIGZvciBMTE0gY29uc2lzdGVuY3kgKG5hbWUg4oaSIGVsZW1lbnRfbmFtZSlcbiAqIC0gU3VwcG9ydHMgcHJlc2V0IGZpZWxkIHNldHM6ICdtaW5pbWFsJywgJ3N0YW5kYXJkJywgJ2Z1bGwnXG4gKlxuICogQHNlZSBJc3N1ZSAjMjQ3IC0gU2NoZW1hLWRyaXZlbiBvcGVyYXRpb24gZGVmaW5pdGlvbnNcbiAqIEBzZWUgSXNzdWUgIzI1MSAtIEVsZW1lbnRDUlVEIGlucHV0IG5vcm1hbGl6YXRpb25cbiAqIEBzZWUgSXNzdWUgIzIwMiAtIEdyYXBoUUwgZmllbGQgc2VsZWN0aW9uIGZvciByZXNwb25zZSB0b2tlbiBvcHRpbWl6YXRpb25cbiAqL1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7XG4gIGdldE9wZXJhdGlvblNjaGVtYSxcbiAgaXNTY2hlbWFPcGVyYXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uRGVmLFxuICB0eXBlIFBhcmFtU2NoZW1hLFxuICB0eXBlIFBhcmFtRGVmLFxuICB0eXBlIEhhbmRsZXJLZXksXG59IGZyb20gJy4vT3BlcmF0aW9uU2NoZW1hLmpzJztcbmltcG9ydCB7IEludHJvc3BlY3Rpb25SZXNvbHZlciB9IGZyb20gJy4vSW50cm9zcGVjdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IE5vcm1hbGl6ZXJSZWdpc3RyeSB9IGZyb20gJy4vbm9ybWFsaXplcnMvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgeyBOb3JtYWxpemVyQ29udGV4dCB9IGZyb20gJy4vbm9ybWFsaXplcnMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyUmVnaXN0cnkgfSBmcm9tICcuL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25JbnB1dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuLy8gTm90ZTogRmllbGQgc2VsZWN0aW9uIGlzIG5vdyBhcHBsaWVkIGF0IE1DUEFRTEhhbmRsZXIgbGV2ZWwgKElzc3VlICMyMDIpXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElucHV0IE5vcm1hbGl6YXRpb24gKElzc3VlICMyNTEpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVmFsaWRhdGUgcHJvcGVydHkgcGF0aCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb24gYXR0YWNrcy5cbiAqIE9ubHkgYWxsb3dzIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlcywgYW5kIGRvdHMuXG4gKi9cbmNvbnN0IFNBRkVfUEFUSF9QQVRURVJOID0gL15bYS16QS1aXyRdW2EtekEtWjAtOV8kLl0qJC87XG5jb25zdCBGT1JCSURERU5fUEFUSFMgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuLyoqXG4gKiBSZXNvbHZlIGEgdmFsdWUgZnJvbSBhIGRvdC1ub3RhdGlvbiBwYXRoIG9uIGFuIG9iamVjdC5cbiAqIEV4YW1wbGU6IGdldE5lc3RlZFZhbHVlKHsgaW5wdXQ6IHsgZWxlbWVudFR5cGU6ICdwZXJzb25hJyB9IH0sICdpbnB1dC5lbGVtZW50VHlwZScpID0+ICdwZXJzb25hJ1xuICpcbiAqIFNlY3VyaXR5OiBWYWxpZGF0ZXMgcGF0aCBmb3JtYXQgYW5kIGJsb2NrcyBwcm90b3R5cGUgcG9sbHV0aW9uIHZlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHBhdGg6IHN0cmluZyk6IHVua25vd24ge1xuICAvLyBWYWxpZGF0ZSBwYXRoIGZvcm1hdCB0byBwcmV2ZW50IGluamVjdGlvbiBhdHRhY2tzXG4gIGlmICghU0FGRV9QQVRIX1BBVFRFUk4udGVzdChwYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9wZXJ0eSBwYXRoIGZvcm1hdDogJHtwYXRofWApO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG5cbiAgLy8gQ2hlY2sgZm9yIHByb3RvdHlwZSBwb2xsdXRpb24gYXR0ZW1wdHNcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKEZPUkJJRERFTl9QQVRIUy5oYXMocGFydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yYmlkZGVuIHByb3BlcnR5IHBhdGggc2VnbWVudDogJHtwYXJ0fWApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLlxuICpcbiAqIFRoZSByZXNvbHV0aW9uIG9yZGVyIGlzOlxuICogMS4gQ2hlY2sgZWFjaCBzb3VyY2UgaW4gYHNvdXJjZXNgIGFycmF5IChpZiBkZWZpbmVkKVxuICogMi4gRmFsbCBiYWNrIHRvIHRoZSBkaXJlY3QgcGFyYW1ldGVyIHZhbHVlXG4gKiAzLiBGYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZSAoaWYgZGVmaW5lZClcbiAqXG4gKiBAcGFyYW0ga2V5IC0gUGFyYW1ldGVyIG5hbWVcbiAqIEBwYXJhbSBkZWYgLSBQYXJhbWV0ZXIgZGVmaW5pdGlvbiB3aXRoIHBvc3NpYmxlIHNvdXJjZXNcbiAqIEBwYXJhbSBjb250ZXh0IC0gUmVzb2x1dGlvbiBjb250ZXh0IGNvbnRhaW5pbmcgaW5wdXQsIHBhcmFtcywgYW5kIHJhdyBwYXJhbXNcbiAqIEByZXR1cm5zIFJlc29sdmVkIHZhbHVlIG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiByZXNvbHZlUGFyYW1WYWx1ZShcbiAga2V5OiBzdHJpbmcsXG4gIGRlZjogUGFyYW1EZWYsXG4gIGNvbnRleHQ6IHtcbiAgICBpbnB1dD86IE9wZXJhdGlvbklucHV0O1xuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cbik6IHVua25vd24ge1xuICAvLyBJZiBzb3VyY2VzIGFyZSBkZWZpbmVkLCBjaGVjayB0aGVtIGluIG9yZGVyXG4gIGlmIChkZWYuc291cmNlcyAmJiBkZWYuc291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgZGVmLnNvdXJjZXMpIHtcbiAgICAgIC8vIEJ1aWxkIHRoZSByZXNvbHV0aW9uIGNvbnRleHQgYXMgYSBmbGF0IG9iamVjdCBmb3IgZ2V0TmVzdGVkVmFsdWVcbiAgICAgIGNvbnN0IHJlc29sdmVDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgcGFyYW1zOiBjb250ZXh0LnBhcmFtcyxcbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBpbnB1dCBmaWVsZHMgdG8gdGhlIGNvbnRleHQgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoY29udGV4dC5pbnB1dCkge1xuICAgICAgICByZXNvbHZlQ29udGV4dC5pbnB1dCA9IGNvbnRleHQuaW5wdXQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUocmVzb2x2ZUNvbnRleHQsIHNvdXJjZSk7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbCBiYWNrIHRvIGRpcmVjdCBwYXJhbSB2YWx1ZVxuICBjb25zdCBkaXJlY3RWYWx1ZSA9IGNvbnRleHQucGFyYW1zW2tleV07XG4gIGlmIChkaXJlY3RWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRpcmVjdFZhbHVlO1xuICB9XG5cbiAgLy8gRmFsbCBiYWNrIHRvIGRlZmF1bHRcbiAgcmV0dXJuIGRlZi5kZWZhdWx0O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJhbWV0ZXIgU3R5bGUgQ29udmVyc2lvbiAoSXNzdWUgIzI1Milcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc25ha2VfY2FzZSBzdHJpbmcgdG8gY2FtZWxDYXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzbmFrZVRvQ2FtZWwoJ2RyeV9ydW4nKSA9PiAnZHJ5UnVuJ1xuICogc25ha2VUb0NhbWVsKCdtYXhfcmVzdWx0cycpID0+ICdtYXhSZXN1bHRzJ1xuICogc25ha2VUb0NhbWVsKCdhbHJlYWR5X2NhbWVsJykgPT4gJ2FscmVhZHlDYW1lbCdcbiAqL1xuZnVuY3Rpb24gc25ha2VUb0NhbWVsKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgbGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSk7XG59XG5cbi8qKlxuICogQXBwbHkgcGFyYW0gc3R5bGUgY29udmVyc2lvbiB0byBhIGtleSBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHNjaGVtYS5cbiAqIEluZGl2aWR1YWwgYG1hcFRvYCBvdmVycmlkZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgc3R5bGUgY29udmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlQYXJhbVN0eWxlKFxuICBrZXk6IHN0cmluZyxcbiAgZGVmOiBQYXJhbURlZixcbiAgcGFyYW1TdHlsZT86ICdzbmFrZVRvQ2FtZWwnXG4pOiBzdHJpbmcge1xuICAvLyBFeHBsaWNpdCBtYXBUbyB0YWtlcyBwcmVjZWRlbmNlXG4gIGlmIChkZWYubWFwVG8pIHtcbiAgICByZXR1cm4gZGVmLm1hcFRvO1xuICB9XG5cbiAgLy8gQXBwbHkgc3R5bGUgY29udmVyc2lvbiBpZiBzcGVjaWZpZWRcbiAgaWYgKHBhcmFtU3R5bGUgPT09ICdzbmFrZVRvQ2FtZWwnKSB7XG4gICAgcmV0dXJuIHNuYWtlVG9DYW1lbChrZXkpO1xuICB9XG5cbiAgLy8gRGVmYXVsdDogdXNlIG9yaWdpbmFsIGtleVxuICByZXR1cm4ga2V5O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJhbWV0ZXIgTWFwcGluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE1hcCBpbnB1dCBwYXJhbWV0ZXJzIHRvIGhhbmRsZXIgYXJndW1lbnRzIGJhc2VkIG9uIHBhcmFtIHNjaGVtYS5cbiAqIFN1cHBvcnRzIG11bHRpLXNvdXJjZSBwYXJhbWV0ZXIgcmVzb2x1dGlvbiBhbmQgcGFyYW0gc3R5bGUgY29udmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gbWFwUGFyYW1zKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzY2hlbWE6IFBhcmFtU2NoZW1hLFxuICBpbnB1dD86IE9wZXJhdGlvbklucHV0LFxuICBwYXJhbVN0eWxlPzogJ3NuYWtlVG9DYW1lbCdcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWFwcGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBjb25zdCBjb250ZXh0ID0geyBpbnB1dCwgcGFyYW1zIH07XG5cbiAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJlc29sdmVQYXJhbVZhbHVlKGtleSwgZGVmLCBjb250ZXh0KTtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBhcHBseVBhcmFtU3R5bGUoa2V5LCBkZWYsIHBhcmFtU3R5bGUpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1hcHBlZFt0YXJnZXRLZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hcHBlZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50LlxuICpcbiAqIFVzZXMgbXVsdGktc291cmNlIHJlc29sdXRpb24gdG8gY2hlY2sgYWxsIHBvc3NpYmxlIHNvdXJjZXMgZm9yIGVhY2hcbiAqIHJlcXVpcmVkIHBhcmFtZXRlci4gUHJvdmlkZXMgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMgc2hvd2luZzpcbiAqIC0gV2hpY2ggcGFyYW1ldGVyIGlzIG1pc3NpbmdcbiAqIC0gV2hpY2ggc291cmNlcyB3ZXJlIGNoZWNrZWQgKGluIG9yZGVyKVxuICogLSBXaGF0IHdhcyBhY3R1YWxseSBwcm92aWRlZCBpbiBwYXJhbXNcbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgY2FsbGVyXG4gKiBAcGFyYW0gc2NoZW1hIC0gUGFyYW1ldGVyIHNjaGVtYSBkZWZpbmluZyByZXF1aXJlbWVudHNcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gbmFtZSBmb3IgZXJyb3IgY29udGV4dFxuICogQHBhcmFtIGlucHV0IC0gT3B0aW9uYWwgZnVsbCBPcGVyYXRpb25JbnB1dCBmb3Igc291cmNlIHJlc29sdXRpb25cbiAqIEB0aHJvd3MgRXJyb3Igd2l0aCBkZWJ1Z2dpbmcgY29udGV4dCBpZiByZXF1aXJlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlcXVpcmVkUGFyYW1zKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzY2hlbWE6IFBhcmFtU2NoZW1hLFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgaW5wdXQ/OiBPcGVyYXRpb25JbnB1dFxuKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRleHQgPSB7IGlucHV0LCBwYXJhbXMgfTtcblxuICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGlmIChkZWYucmVxdWlyZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVBhcmFtVmFsdWUoa2V5LCBkZWYsIGNvbnRleHQpO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQnVpbGQgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnN0IHNvdXJjZXNDaGVja2VkID0gZGVmLnNvdXJjZXNcbiAgICAgICAgICA/IGBTb3VyY2VzIGNoZWNrZWQgKGluIG9yZGVyKTogWyR7ZGVmLnNvdXJjZXMuam9pbignIOKGkiAnKX1dIOKGkiBwYXJhbXMuJHtrZXl9YFxuICAgICAgICAgIDogYFNvdXJjZTogcGFyYW1zLiR7a2V5fWA7XG5cbiAgICAgICAgY29uc3QgcHJvdmlkZWRQYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGBQcm92aWRlZCBwYXJhbXM6IHske09iamVjdC5rZXlzKHBhcmFtcykuam9pbignLCAnKX19YFxuICAgICAgICAgIDogJ05vIHBhcmFtcyBwcm92aWRlZCc7XG5cbiAgICAgICAgLy8gSXNzdWUgIzI5MDogQ2hlY2sgYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2UgZm9yIGVsZW1lbnRfdHlwZVxuICAgICAgICBjb25zdCBlbGVtZW50VHlwZVZhbHVlID0gaW5wdXQ/LmVsZW1lbnRfdHlwZSB8fCBpbnB1dD8uZWxlbWVudFR5cGU7XG4gICAgICAgIGNvbnN0IGhhc0VsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVWYWx1ZVxuICAgICAgICAgID8gYGlucHV0LmVsZW1lbnRfdHlwZTogJyR7ZWxlbWVudFR5cGVWYWx1ZX0nYFxuICAgICAgICAgIDogJ2lucHV0LmVsZW1lbnRfdHlwZTogdW5kZWZpbmVkJztcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScuIGAgK1xuICAgICAgICAgIGAke3NvdXJjZXNDaGVja2VkfS4gJHtwcm92aWRlZFBhcmFtc30uICR7aGFzRWxlbWVudFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUeXBlIFZhbGlkYXRpb24gKElzc3VlICMyNTUpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGEgaHVtYW4tcmVhZGFibGUgdHlwZSBkZXNjcmlwdGlvbiBmb3IgZXJyb3IgbWVzc2FnZXNcbiAqL1xuZnVuY3Rpb24gZ2V0QWN0dWFsVHlwZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ2FycmF5JztcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHNpbmdsZSBwYXJhbWV0ZXIgdmFsdWUgYWdhaW5zdCBpdHMgdHlwZSBkZWZpbml0aW9uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHBhcmFtZXRlciB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGRlZiAtIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmcm9tIHNjaGVtYVxuICogQHBhcmFtIGtleSAtIFRoZSBwYXJhbWV0ZXIgbmFtZSAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gbmFtZSAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICogQHRocm93cyBFcnJvciBpZiB0eXBlIHZhbGlkYXRpb24gZmFpbHNcbiAqXG4gKiBAc2VlIElzc3VlICMyNTUgLSBSdW50aW1lIHR5cGUgdmFsaWRhdGlvblxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtVHlwZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGRlZjogUGFyYW1EZWYsXG4gIGtleTogc3RyaW5nLFxuICBvcGVyYXRpb246IHN0cmluZ1xuKTogdm9pZCB7XG4gIC8vIFNraXAgdmFsaWRhdGlvbiBmb3IgdW5kZWZpbmVkIHZhbHVlcyAoaGFuZGxlZCBieSByZXF1aXJlZCBjaGVjaylcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICBjb25zdCBhY3R1YWxUeXBlID0gZ2V0QWN0dWFsVHlwZSh2YWx1ZSk7XG5cbiAgc3dpdGNoIChkZWYudHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYSBudW1iZXIsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhcnJheSc6XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUGFyYW1ldGVyICcke2tleX0nIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgbXVzdCBiZSBhbiBhcnJheSwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3N0cmluZ1tdJzpcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259JyBtdXN0IGJlIGEgc3RyaW5nIGFycmF5LCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGFycmF5IGVsZW1lbnRzIGFyZSBzdHJpbmdzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9WyR7aX1dJyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke2dldEFjdHVhbFR5cGUodmFsdWVbaV0pfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgLy8gQWxsb3cgYW55IHR5cGUgLSBubyB2YWxpZGF0aW9uIG5lZWRlZFxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbGwgcGFyYW1ldGVyIHR5cGVzIGFnYWluc3Qgc2NoZW1hIGRlZmluaXRpb25zXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gc2NoZW1hIC0gVGhlIHBhcmFtZXRlciBzY2hlbWFcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlcylcbiAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IHR5cGUgdmFsaWRhdGlvbiBmYWlsc1xuICpcbiAqIEBzZWUgSXNzdWUgIzI1NSAtIFJ1bnRpbWUgdHlwZSB2YWxpZGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1UeXBlcyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2NoZW1hOiBQYXJhbVNjaGVtYSxcbiAgb3BlcmF0aW9uOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV07XG4gICAgdmFsaWRhdGVQYXJhbVR5cGUodmFsdWUsIGRlZiwga2V5LCBvcGVyYXRpb24pO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhhbmRsZXIgUmVzb2x1dGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdC5cbiAqIFVzZWQgZm9yIHNhZmUgcHJvcGVydHkgYWNjZXNzIHdpdGhvdXQgdHlwZSBhc3NlcnRpb25zLlxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaGFzIGEgY2FsbGFibGUgbWV0aG9kLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIG1ldGhvZCBsb29rdXAgd2l0aG91dCB1bnNhZmUgYXNzZXJ0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gT2JqZWN0IHRvIGNoZWNrXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIE5hbWUgb2YgbWV0aG9kIHRvIGxvb2sgZm9yXG4gKiBAcmV0dXJucyBUcnVlIGlmIG9iaiBoYXMgYSBmdW5jdGlvbiBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gKi9cbmZ1bmN0aW9uIGhhc01ldGhvZChcbiAgb2JqOiB1bmtub3duLFxuICBtZXRob2ROYW1lOiBzdHJpbmdcbik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duPiB7XG4gIHJldHVybiBpc09iamVjdChvYmopICYmIHR5cGVvZiBvYmpbbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogR2V0IGhhbmRsZXIgZnJvbSByZWdpc3RyeSB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBSZXNvbHZlcyBhIGhhbmRsZXIgYnkga2V5IGZyb20gdGhlIHJlZ2lzdHJ5LCBwcm92aWRpbmcgY2xlYXIgZXJyb3IgbWVzc2FnZXNcbiAqIHdoZW4gaGFuZGxlcnMgYXJlIG1pc3NpbmcuIERpZmZlcmVudGlhdGVzIGJldHdlZW4gcmVxdWlyZWQgYW5kIG9wdGlvbmFsIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSByZWdpc3RyeSAtIEhhbmRsZXIgcmVnaXN0cnkgY29udGFpbmluZyBhbGwgY29uZmlndXJlZCBoYW5kbGVyc1xuICogQHBhcmFtIGhhbmRsZXJLZXkgLSBLZXkgaWRlbnRpZnlpbmcgd2hpY2ggaGFuZGxlciB0byByZXRyaWV2ZVxuICogQHBhcmFtIG9wZXJhdGlvbiAtIE9wZXJhdGlvbiBuYW1lIGZvciBlcnJvciBjb250ZXh0XG4gKiBAcGFyYW0gb3B0aW9uYWwgLSBXaGV0aGVyIHRoZSBoYW5kbGVyIGlzIG9wdGlvbmFsIChhZmZlY3RzIGVycm9yIG1lc3NhZ2luZylcbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBoYW5kbGVyXG4gKiBAdGhyb3dzIEVycm9yIGlmIGhhbmRsZXIgaXMgbm90IGNvbmZpZ3VyZWRcbiAqL1xuZnVuY3Rpb24gZ2V0SGFuZGxlcihcbiAgcmVnaXN0cnk6IEhhbmRsZXJSZWdpc3RyeSxcbiAgaGFuZGxlcktleTogSGFuZGxlcktleSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIG9wdGlvbmFsOiBib29sZWFuXG4pOiB1bmtub3duIHtcbiAgY29uc3QgaGFuZGxlciA9IHJlZ2lzdHJ5W2hhbmRsZXJLZXkgYXMga2V5b2YgSGFuZGxlclJlZ2lzdHJ5XTtcblxuICBpZiAoIWhhbmRsZXIgJiYgIW9wdGlvbmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEhhbmRsZXIgJyR7aGFuZGxlcktleX0nIGlzIHJlcXVpcmVkIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgYnV0IG5vdCBjb25maWd1cmVkLiBgICtcbiAgICAgIGBFbnN1cmUgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgSGFuZGxlclJlZ2lzdHJ5LmBcbiAgICApO1xuICB9XG5cbiAgaWYgKCFoYW5kbGVyICYmIG9wdGlvbmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7aGFuZGxlcktleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGhhbmRsZXJLZXkuc2xpY2UoMSl9IG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogYCArXG4gICAgICBgJHtoYW5kbGVyS2V5fSBub3QgY29uZmlndXJlZC4gVGhpcyBpcyBhbiBvcHRpb25hbCBoYW5kbGVyIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gYWxsIGNvbmZpZ3VyYXRpb25zLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbi8qKlxuICogR2V0IG1ldGhvZCBmcm9tIGhhbmRsZXIgd2l0aCB0eXBlLXNhZmUgbG9va3VwLlxuICpcbiAqIFVzZXMgdHlwZSBndWFyZHMgaW5zdGVhZCBvZiB1bnNhZmUgdHlwZSBhc3NlcnRpb25zIHRvIHZlcmlmeSB0aGUgaGFuZGxlclxuICogaGFzIHRoZSBleHBlY3RlZCBtZXRob2QuIFByb3ZpZGVzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBIYW5kbGVyIG9iamVjdCB0byBnZXQgbWV0aG9kIGZyb21cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gTmFtZSBvZiB0aGUgbWV0aG9kIHRvIHJldHJpZXZlXG4gKiBAcGFyYW0gaGFuZGxlcktleSAtIEhhbmRsZXIga2V5IGZvciBlcnJvciBjb250ZXh0XG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgZm9yIGVycm9yIGNvbnRleHRcbiAqIEByZXR1cm5zIEJvdW5kIG1ldGhvZCByZWFkeSB0byBjYWxsXG4gKiBAdGhyb3dzIEVycm9yIGlmIG1ldGhvZCBpcyBub3QgZm91bmQgb3IgaXMgbm90IGNhbGxhYmxlXG4gKi9cbmZ1bmN0aW9uIGdldE1ldGhvZChcbiAgaGFuZGxlcjogdW5rbm93bixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBoYW5kbGVyS2V5OiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogc3RyaW5nXG4pOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgLy8gVXNlIHR5cGUgZ3VhcmQgaW5zdGVhZCBvZiB1bnNhZmUgYXNzZXJ0aW9uXG4gIGlmICghaGFzTWV0aG9kKGhhbmRsZXIsIG1ldGhvZE5hbWUpKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlTWV0aG9kcyA9IGlzT2JqZWN0KGhhbmRsZXIpXG4gICAgICA/IE9iamVjdC5rZXlzKGhhbmRsZXIpLmZpbHRlcihrID0+IHR5cGVvZiBoYW5kbGVyW2tdID09PSAnZnVuY3Rpb24nKVxuICAgICAgOiBbXTtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZCBvbiBoYW5kbGVyICcke2hhbmRsZXJLZXl9JyBmb3Igb3BlcmF0aW9uICcke29wZXJhdGlvbn0nLiBgICtcbiAgICAgIGBBdmFpbGFibGUgbWV0aG9kczogWyR7YXZhaWxhYmxlTWV0aG9kcy5qb2luKCcsICcpIHx8ICdub25lJ31dYFxuICAgICk7XG4gIH1cblxuICAvLyBOb3cgVHlwZVNjcmlwdCBrbm93cyBoYW5kbGVyW21ldGhvZE5hbWVdIGlzIGEgZnVuY3Rpb25cbiAgY29uc3QgbWV0aG9kID0gaGFuZGxlclttZXRob2ROYW1lXTtcbiAgcmV0dXJuIG1ldGhvZC5iaW5kKGhhbmRsZXIpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFyZ3VtZW50IEJ1aWxkaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGFyYW1zIHRoYXQgYXJlIGhhbmRsZWQgYXQgdGhlIGRpc3BhdGNoIGxldmVsIGFuZCBzaG91bGQgTk9UIGJlIHBhc3NlZCB0byBoYW5kbGVycy5cbiAqIFRoZXNlIGFyZSBjcm9zcy1jdXR0aW5nIGNvbmNlcm5zIHByb2Nlc3NlZCBieSBTY2hlbWFEaXNwYXRjaGVyIGl0c2VsZi5cbiAqXG4gKiBAc2VlIElzc3VlICMyMDIgLSBmaWVsZHMgaXMgdXNlZCBmb3IgcmVzcG9uc2UgZmlsdGVyaW5nLCBub3QgYnkgaGFuZGxlcnNcbiAqL1xuY29uc3QgRElTUEFUQ0hfT05MWV9QQVJBTVMgPSBuZXcgU2V0KFsnZmllbGRzJ10pO1xuXG4vKipcbiAqIEZpbHRlciBvdXQgZGlzcGF0Y2gtb25seSBwYXJhbXMgZnJvbSBhIHBhcmFtcyBvYmplY3QuXG4gKiBUaGVzZSBwYXJhbXMgYXJlIGhhbmRsZWQgYXQgdGhlIGRpc3BhdGNoIGxldmVsIChlLmcuLCBmaWVsZCBzZWxlY3Rpb24pXG4gKiBhbmQgc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gaGFuZGxlcnMuXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckRpc3BhdGNoT25seVBhcmFtcyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgIGlmICghRElTUEFUQ0hfT05MWV9QQVJBTVMuaGFzKGtleSkpIHtcbiAgICAgIGZpbHRlcmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFyZ3VtZW50cyBmb3IgaGFuZGxlciBtZXRob2QgYmFzZWQgb24gYXJnQnVpbGRlciB0eXBlXG4gKlxuICogLSAnc2luZ2xlJzogUGFzcyBwYXJhbXMgaW4gc2NoZW1hIG9yZGVyIGFzIHBvc2l0aW9uYWwgYXJncyAoZGVmYXVsdClcbiAqIC0gJ3NwcmVhZCc6IFBhc3MgcXVlcnkgKyByZW1haW5pbmcgcGFyYW1zXG4gKiAtICduYW1lZCc6IFBhc3MgbWFwcGVkIHBhcmFtcyBhcyBuYW1lZCBvYmplY3RcbiAqIC0gJ25hbWVkV2l0aFR5cGUnOiBMaWtlICduYW1lZCcgYnV0IGVuc3VyZXMgJ3R5cGUnIGlzIGluY2x1ZGVkIGZyb20gcmVzb2x2ZWQgc291cmNlc1xuICogLSAndHlwZVdpdGhQYXJhbXMnOiBQYXNzIHJlc29sdmVkIHR5cGUgKyBmdWxsIHBhcmFtcyBvYmplY3RcbiAqXG4gKiBOb3RlOiBQYXJhbXMgaW4gRElTUEFUQ0hfT05MWV9QQVJBTVMgYXJlIGZpbHRlcmVkIG91dCBiZWZvcmUgcGFzc2luZyB0byBoYW5kbGVycy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRBcmdzKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzY2hlbWE6IE9wZXJhdGlvbkRlZixcbiAgbWFwcGVkUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5wdXQ/OiBPcGVyYXRpb25JbnB1dFxuKTogdW5rbm93bltdIHtcbiAgY29uc3QgYnVpbGRlciA9IHNjaGVtYS5hcmdCdWlsZGVyID8/ICdzaW5nbGUnO1xuXG4gIHN3aXRjaCAoYnVpbGRlcikge1xuICAgIGNhc2UgJ3NwcmVhZCc6XG4gICAgICAvLyBGb3IgaGFuZGxlcnMgdGhhdCB0YWtlIChxdWVyeSwgb3B0aW9ucylcbiAgICAgIHJldHVybiBbcGFyYW1zLnF1ZXJ5LCBmaWx0ZXJEaXNwYXRjaE9ubHlQYXJhbXMocGFyYW1zKV07XG5cbiAgICBjYXNlICduYW1lZCc6IHtcbiAgICAgIC8vIEZvciBoYW5kbGVycyB0aGF0IHRha2UgYSBuYW1lZCBwYXJhbXMgb2JqZWN0XG4gICAgICAvLyBGaWx0ZXIgb3V0IGRpc3BhdGNoLW9ubHkgcGFyYW1zXG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGZpbHRlckRpc3BhdGNoT25seVBhcmFtcyhtYXBwZWRQYXJhbXMpO1xuICAgICAgcmV0dXJuIFtmaWx0ZXJlZF07XG4gICAgfVxuXG4gICAgY2FzZSAnbmFtZWRXaXRoVHlwZSc6IHtcbiAgICAgIC8vIExpa2UgJ25hbWVkJyBidXQgZW5zdXJlcyAnZWxlbWVudFR5cGUnIGFuZCAnZWxlbWVudE5hbWUnIGFyZSBhdmFpbGFibGVcbiAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgRWxlbWVudENSVUQgcGF0dGVybiB3aGVyZSB0eXBlIGNvbWVzIGZyb20gaW5wdXQuZWxlbWVudF90eXBlIE9SIHBhcmFtcy5lbGVtZW50X3R5cGVcbiAgICAgIC8vIElzc3VlICMyOTA6IGVsZW1lbnRfbmFtZSBtYXBzIHRvIGVsZW1lbnROYW1lLCBlbGVtZW50X3R5cGUgbWFwcyB0byBlbGVtZW50VHlwZVxuICAgICAgY29uc3QgcmVzdWx0ID0geyAuLi5tYXBwZWRQYXJhbXMgfTtcblxuICAgICAgLy8gSWYgJ2VsZW1lbnRUeXBlJyB3YXNuJ3QgaW4gbWFwcGVkUGFyYW1zIGJ1dCBpcyBhdmFpbGFibGUgZnJvbSBpbnB1dC5lbGVtZW50X3R5cGUgKG9yIGxlZ2FjeSBlbGVtZW50VHlwZSksIGFkZCBpdFxuICAgICAgLy8gSXNzdWUgIzI5MDogUHJlZmVyIHNuYWtlX2Nhc2UgZWxlbWVudF90eXBlLCBmYWxsYmFjayB0byBjYW1lbENhc2UgZWxlbWVudFR5cGUgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgICAgaWYgKCFyZXN1bHQuZWxlbWVudFR5cGUgJiYgKGlucHV0Py5lbGVtZW50X3R5cGUgfHwgaW5wdXQ/LmVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXN1bHQuZWxlbWVudFR5cGUgPSBpbnB1dC5lbGVtZW50X3R5cGUgfHwgaW5wdXQuZWxlbWVudFR5cGU7XG4gICAgICB9XG4gICAgICAvLyBTZXQgJ3R5cGUnIGZyb20gJ2VsZW1lbnRUeXBlJyBmb3IgaGFuZGxlcnMgdGhhdCBleHBlY3QgaXRcbiAgICAgIGlmICghcmVzdWx0LnR5cGUgJiYgcmVzdWx0LmVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHJlc3VsdC50eXBlID0gcmVzdWx0LmVsZW1lbnRUeXBlO1xuICAgICAgfVxuICAgICAgLy8gU2V0ICduYW1lJyBmcm9tICdlbGVtZW50TmFtZScgZm9yIGhhbmRsZXJzIHRoYXQgZXhwZWN0IGl0IChJc3N1ZSAjMjkwKVxuICAgICAgaWYgKCFyZXN1bHQubmFtZSAmJiByZXN1bHQuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgcmVzdWx0Lm5hbWUgPSByZXN1bHQuZWxlbWVudE5hbWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICMyNzg6IEZvciBlbnNlbWJsZXMsIG1lcmdlIHRvcC1sZXZlbCBlbGVtZW50cyBpbnRvIG1ldGFkYXRhXG4gICAgICAvLyBMTE1zIG9mdGVuIHBhc3MgZWxlbWVudHMgYXQgcGFyYW1zIGxldmVsLCBub3QgaW5zaWRlIG1ldGFkYXRhXG4gICAgICAvLyBJc3N1ZSAjMjkwOiBQcmVmZXIgc25ha2VfY2FzZSBlbGVtZW50X3R5cGUsIGZhbGxiYWNrIHRvIGNhbWVsQ2FzZSBlbGVtZW50VHlwZVxuICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gcmVzdWx0LmVsZW1lbnRUeXBlIHx8IHJlc3VsdC50eXBlIHx8IGlucHV0Py5lbGVtZW50X3R5cGUgfHwgaW5wdXQ/LmVsZW1lbnRUeXBlO1xuICAgICAgLy8gQ2hlY2sgZm9yIGVuc2VtYmxlIHR5cGUgKGhhbmRsZXMgYm90aCBwbHVyYWwgY29uc3RhbnQgYW5kIHNpbmd1bGFyIGZvcm0pXG4gICAgICBjb25zdCBpc0Vuc2VtYmxlID0gcmVzb2x2ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSB8fCByZXNvbHZlZFR5cGUgPT09ICdlbnNlbWJsZSc7XG4gICAgICBpZiAoaXNFbnNlbWJsZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHBhcmFtcy5lbGVtZW50cztcbiAgICAgICAgY29uc3QgY3VycmVudE1ldGFkYXRhID0gcmVzdWx0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudHMgJiYgKCFjdXJyZW50TWV0YWRhdGEgfHwgIWN1cnJlbnRNZXRhZGF0YS5lbGVtZW50cykpIHtcbiAgICAgICAgICByZXN1bHQubWV0YWRhdGEgPSB7IC4uLmN1cnJlbnRNZXRhZGF0YSwgZWxlbWVudHMgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzIyOiBDb21tb24gZmllbGRzICh0YWdzLCB0cmlnZ2Vycykg4oCUIExMTXMgcGFzcyBhdCBwYXJhbXMgbGV2ZWwgZm9yIGFueSBlbGVtZW50IHR5cGUuXG4gICAgICB7XG4gICAgICAgIGxldCBjdXJyZW50TWV0YSA9IHJlc3VsdC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHVwZGF0ZWRNZXRhID0gY3VycmVudE1ldGE7XG5cbiAgICAgICAgaWYgKHBhcmFtcy50YWdzICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMudGFncykgJiYgKCF1cGRhdGVkTWV0YSB8fCB1cGRhdGVkTWV0YS50YWdzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGEgPSB7IC4uLnVwZGF0ZWRNZXRhLCB0YWdzOiBwYXJhbXMudGFncyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMudHJpZ2dlcnMgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50cmlnZ2VycykgJiYgKCF1cGRhdGVkTWV0YSB8fCB1cGRhdGVkTWV0YS50cmlnZ2VycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIHVwZGF0ZWRNZXRhID0geyAuLi51cGRhdGVkTWV0YSwgdHJpZ2dlcnM6IHBhcmFtcy50cmlnZ2VycyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRNZXRhICE9PSBjdXJyZW50TWV0YSkge1xuICAgICAgICAgIHJlc3VsdC5tZXRhZGF0YSA9IHVwZGF0ZWRNZXRhO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFnZW50IFYyIGZpZWxkczogZ29hbCwgYWN0aXZhdGVzLCB0b29scywgc3lzdGVtUHJvbXB0LCBhdXRvbm9teSwgcmVzaWxpZW5jZVxuICAgICAgY29uc3QgaXNBZ2VudCA9IHJlc29sdmVkVHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQgfHwgcmVzb2x2ZWRUeXBlID09PSAnYWdlbnQnO1xuICAgICAgaWYgKGlzQWdlbnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1ldGFkYXRhID0gcmVzdWx0Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgdXBkYXRlZE1ldGFkYXRhID0gY3VycmVudE1ldGFkYXRhO1xuXG4gICAgICAgIGlmIChwYXJhbXMuZ29hbCAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS5nb2FsID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIGdvYWw6IHBhcmFtcy5nb2FsIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5hY3RpdmF0ZXMgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEuYWN0aXZhdGVzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIGFjdGl2YXRlczogcGFyYW1zLmFjdGl2YXRlcyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMudG9vbHMgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEudG9vbHMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB1cGRhdGVkTWV0YWRhdGEgPSB7IC4uLnVwZGF0ZWRNZXRhZGF0YSwgdG9vbHM6IHBhcmFtcy50b29scyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElzc3VlICM3MjU6IEFjY2VwdCBib3RoIHN5c3RlbVByb21wdCBhbmQgc3lzdGVtX3Byb21wdCAoTExNcyBjb21tb25seSB1c2Ugc25ha2VfY2FzZSlcbiAgICAgICAgY29uc3Qgc3lzdGVtUHJvbXB0VmFsdWUgPSBwYXJhbXMuc3lzdGVtUHJvbXB0ID8/IHBhcmFtcy5zeXN0ZW1fcHJvbXB0O1xuICAgICAgICBpZiAoc3lzdGVtUHJvbXB0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAoIXVwZGF0ZWRNZXRhZGF0YSB8fCB1cGRhdGVkTWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIHN5c3RlbVByb21wdDogc3lzdGVtUHJvbXB0VmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmF1dG9ub215ICE9PSB1bmRlZmluZWQgJiYgKCF1cGRhdGVkTWV0YWRhdGEgfHwgdXBkYXRlZE1ldGFkYXRhLmF1dG9ub215ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIGF1dG9ub215OiBwYXJhbXMuYXV0b25vbXkgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJc3N1ZSAjNzIyOiByZXNpbGllbmNlIHdhcyBtaXNzaW5nIGZyb20gdGhlIGFnZW50IFYyIG1lcmdlXG4gICAgICAgIGlmIChwYXJhbXMucmVzaWxpZW5jZSAhPT0gdW5kZWZpbmVkICYmICghdXBkYXRlZE1ldGFkYXRhIHx8IHVwZGF0ZWRNZXRhZGF0YS5yZXNpbGllbmNlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgdXBkYXRlZE1ldGFkYXRhID0geyAuLi51cGRhdGVkTWV0YWRhdGEsIHJlc2lsaWVuY2U6IHBhcmFtcy5yZXNpbGllbmNlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZE1ldGFkYXRhICE9PSBjdXJyZW50TWV0YWRhdGEpIHtcbiAgICAgICAgICByZXN1bHQubWV0YWRhdGEgPSB1cGRhdGVkTWV0YWRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzY2NjogTExNcyBvZnRlbiBwYXNzIGdhdGVrZWVwZXIgYXQgdG9wLWxldmVsIHBhcmFtcywgbm90IGluc2lkZSBtZXRhZGF0YS5cbiAgICAgIC8vIE1lcmdlIGl0IGludG8gbWV0YWRhdGEgZm9yIGFsbCBlbGVtZW50IHR5cGVzLlxuICAgICAgaWYgKHBhcmFtcy5nYXRla2VlcGVyICYmIHR5cGVvZiBwYXJhbXMuZ2F0ZWtlZXBlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1ldGEgPSByZXN1bHQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY3VycmVudE1ldGEgfHwgIWN1cnJlbnRNZXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbU2NoZW1hRGlzcGF0Y2hlcl0gTWVyZ2luZyB0b3AtbGV2ZWwgZ2F0ZWtlZXBlciBpbnRvIG1ldGFkYXRhIGZvciBlbGVtZW50ICcke3Jlc3VsdC5uYW1lID8/ICd1bmtub3duJ30nYCk7XG4gICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhID0geyAuLi5jdXJyZW50TWV0YSwgZ2F0ZWtlZXBlcjogcGFyYW1zLmdhdGVrZWVwZXIgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgb3V0IGRpc3BhdGNoLW9ubHkgcGFyYW1zIGJlZm9yZSByZXR1cm5pbmdcbiAgICAgIHJldHVybiBbZmlsdGVyRGlzcGF0Y2hPbmx5UGFyYW1zKHJlc3VsdCldO1xuICAgIH1cblxuICAgIGNhc2UgJ3R5cGVXaXRoUGFyYW1zJzoge1xuICAgICAgLy8gUGFzcyByZXNvbHZlZCB0eXBlICsgZnVsbCBwYXJhbXMgb2JqZWN0IChtaW51cyBkaXNwYXRjaC1vbmx5IHBhcmFtcylcbiAgICAgIC8vIFVzZWQgZm9yIG9wZXJhdGlvbnMgbGlrZSBsaXN0X2VsZW1lbnRzIHRoYXQgbmVlZCAodHlwZSwgcGFnaW5hdGlvblBhcmFtcylcbiAgICAgIC8vIElzc3VlICMyOTA6IGVsZW1lbnRfdHlwZSBtYXBzIHRvIGVsZW1lbnRUeXBlLCB3aXRoIGJhY2t3YXJkIGNvbXBhdCBmb3IgdHlwZVxuICAgICAgLy8gUHJlZmVyIHNuYWtlX2Nhc2UgZWxlbWVudF90eXBlLCBmYWxsYmFjayB0byBjYW1lbENhc2UgZWxlbWVudFR5cGVcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IG1hcHBlZFBhcmFtcy5lbGVtZW50VHlwZSA/PyBtYXBwZWRQYXJhbXMudHlwZSA/PyBpbnB1dD8uZWxlbWVudF90eXBlID8/IGlucHV0Py5lbGVtZW50VHlwZTtcbiAgICAgIHJldHVybiBbcmVzb2x2ZWRUeXBlLCBmaWx0ZXJEaXNwYXRjaE9ubHlQYXJhbXMocGFyYW1zKV07XG4gICAgfVxuXG4gICAgY2FzZSAnc2luZ2xlJzpcbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBFeHRyYWN0IHBhcmFtcyBpbiBzY2hlbWEgb3JkZXIsIHVzaW5nIHJlc29sdmVkIHZhbHVlc1xuICAgICAgaWYgKCFzY2hlbWEucGFyYW1zIHx8IE9iamVjdC5rZXlzKHNjaGVtYS5wYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBzaW1wbGUgaGFuZGxlcnMsIHBhc3MgcmVzb2x2ZWQgcGFyYW1zIGluIHNjaGVtYSBvcmRlclxuICAgICAgLy8gU2tpcCBkaXNwYXRjaC1vbmx5IHBhcmFtcyAobGlrZSAnZmllbGRzJykgdGhhdCBhcmUgaGFuZGxlZCBieSBTY2hlbWFEaXNwYXRjaGVyXG4gICAgICBjb25zdCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYS5wYXJhbXMpKSB7XG4gICAgICAgIC8vIFNraXAgZGlzcGF0Y2gtbGV2ZWwgcGFyYW1zIHRoYXQgc2hvdWxkbid0IGJlIHBhc3NlZCB0byBoYW5kbGVyc1xuICAgICAgICBpZiAoRElTUEFUQ0hfT05MWV9QQVJBTVMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgbWFwcGVkIHZhbHVlIGlmIGF2YWlsYWJsZSAoaGFuZGxlcyBzb3VyY2UgcmVzb2x1dGlvbilcbiAgICAgICAgY29uc3QgdGFyZ2V0S2V5ID0gc2NoZW1hLnBhcmFtc1trZXldLm1hcFRvID8/IGtleTtcbiAgICAgICAgYXJncy5wdXNoKG1hcHBlZFBhcmFtc1t0YXJnZXRLZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTcGVjaWFsIE9wZXJhdGlvbiBIYW5kbGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEhhbmRsZSBpbnRyb3NwZWN0aW9uIG9wZXJhdGlvbiAodXNlcyBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIgZGlyZWN0bHkpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUludHJvc3BlY3Rpb24oXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gSW50cm9zcGVjdGlvblJlc29sdmVyLnJlc29sdmUocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgZ2V0X2NhcGFiaWxpdGllcyBvcGVyYXRpb24gKHVzZXMgSW50cm9zcGVjdGlvblJlc29sdmVyIGRpcmVjdGx5KVxuICogQHNlZSBJc3N1ZSAjMTc2MCAtIGdldF9jYXBhYmlsaXRpZXMgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNhcGFiaWxpdGllcyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIuZ2V0Q2FwYWJpbGl0aWVzKHBhcmFtcyk7XG59XG5cbi8qKlxuICogSGFuZGxlIGJ1aWxkIGluZm8gb3BlcmF0aW9uIChmb3JtYXRzIG91dHB1dClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQnVpbGRJbmZvKFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3Qgc2VydmljZSA9IHJlZ2lzdHJ5LmJ1aWxkSW5mb1NlcnZpY2U7XG4gIGlmICghc2VydmljZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRJbmZvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQnVpbGRJbmZvU2VydmljZSBub3QgY29uZmlndXJlZCcpO1xuICB9XG5cbiAgY29uc3QgaW5mbyA9IGF3YWl0IHNlcnZpY2UuZ2V0QnVpbGRJbmZvKCk7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogW3tcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHRleHQ6IHNlcnZpY2UuZm9ybWF0QnVpbGRJbmZvKGluZm8pLFxuICAgIH1dLFxuICB9O1xufVxuXG4vKipcbiAqIEhhbmRsZSBjYWNoZSBidWRnZXQgcmVwb3J0IG9wZXJhdGlvbiAoZm9ybWF0cyBvdXRwdXQgYXMgbWFya2Rvd24gdGFibGUpXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUNhY2hlQnVkZ2V0UmVwb3J0KFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiB1bmtub3duIHtcbiAgY29uc3QgYnVkZ2V0ID0gcmVnaXN0cnkuY2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGlmICghYnVkZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZSBidWRnZXQgbm90IGF2YWlsYWJsZTogQ2FjaGVNZW1vcnlCdWRnZXQgbm90IGNvbmZpZ3VyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlcG9ydCA9IGJ1ZGdldC5nZXRSZXBvcnQoKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICcjIENhY2hlIE1lbW9yeSBCdWRnZXQgUmVwb3J0JyxcbiAgICAnJyxcbiAgICBgKipCdWRnZXQ6KiogJHtyZXBvcnQuYnVkZ2V0TUJ9IE1CYCxcbiAgICBgKipVc2VkOioqICR7cmVwb3J0LnRvdGFsTWVtb3J5TUJ9IE1CICgke3JlcG9ydC51dGlsaXphdGlvblBlcmNlbnR9JSlgLFxuICAgIGAqKlJlZ2lzdGVyZWQgQ2FjaGVzOioqICR7cmVwb3J0LmNhY2hlcy5sZW5ndGh9YCxcbiAgICAnJyxcbiAgXTtcbiAgaWYgKHJlcG9ydC5jYWNoZXMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJ3wgQ2FjaGUgfCBFbnRyaWVzIHwgTWVtb3J5IChNQikgfCBIaXQgUmF0ZSB8IExhc3QgQWN0aXZpdHkgfCcpO1xuICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfCcpO1xuICAgIGZvciAoY29uc3QgYyBvZiByZXBvcnQuY2FjaGVzKSB7XG4gICAgICBjb25zdCBhY3Rpdml0eSA9IGMubGFzdEFjdGl2aXR5TXMgPiAwXG4gICAgICAgID8gYCR7KChEYXRlLm5vdygpIC0gYy5sYXN0QWN0aXZpdHlNcykgLyAxMDAwKS50b0ZpeGVkKDApfXMgYWdvYFxuICAgICAgICA6ICduZXZlcic7XG4gICAgICBsaW5lcy5wdXNoKGB8ICR7Yy5uYW1lfSB8ICR7Yy5lbnRyaWVzfSB8ICR7Yy5tZW1vcnlNQn0gfCAkeyhjLmhpdFJhdGUgKiAxMDApLnRvRml4ZWQoMSl9JSB8ICR7YWN0aXZpdHl9IHxgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnX05vIGNhY2hlcyByZWdpc3RlcmVkLl8nKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IFt7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICB0ZXh0OiBsaW5lcy5qb2luKCdcXG4nKSxcbiAgICB9XSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHBvcnRQYWNrYWdlIGludGVyZmFjZSBmb3IgZWxlbWVudCBleHBvcnQuXG4gKiBNYXRjaGVzIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgaW1wb3J0IG9wZXJhdGlvbnMuXG4gKi9cbmludGVyZmFjZSBFeHBvcnRQYWNrYWdlIHtcbiAgZXhwb3J0VmVyc2lvbjogc3RyaW5nO1xuICBleHBvcnRlZEF0OiBzdHJpbmc7XG4gIGVsZW1lbnRUeXBlOiBzdHJpbmc7XG4gIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnO1xuICBkYXRhOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGFuZGxlIGVsZW1lbnQgZXhwb3J0IG9wZXJhdGlvbi5cbiAqIFJldHVybnMgYW4gRXhwb3J0UGFja2FnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbXBvcnQgb3BlcmF0aW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgbWFwcGVkUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcmVnaXN0cnk6IEhhbmRsZXJSZWdpc3RyeVxuKTogUHJvbWlzZTxFeHBvcnRQYWNrYWdlPiB7XG4gIGNvbnN0IGhhbmRsZXIgPSByZWdpc3RyeS5lbGVtZW50Q1JVRDtcbiAgaWYgKCFoYW5kbGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50Q1JVRCBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IGhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZXhwb3J0YWJsZSBkYXRhIGZyb20gdGhlIGVsZW1lbnRcbiAgLy8gSXNzdWUgIzI5MDogVXNlIG1hcHBlZCBuYW1lcyAoZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKSBmcm9tIHNjaGVtYSBtYXBUb1xuICBjb25zdCBuYW1lID0gbWFwcGVkUGFyYW1zLmVsZW1lbnROYW1lIGFzIHN0cmluZztcbiAgY29uc3QgdHlwZSA9IG1hcHBlZFBhcmFtcy5lbGVtZW50VHlwZSBhcyBzdHJpbmc7XG4gIGNvbnN0IGZvcm1hdCA9IChtYXBwZWRQYXJhbXMuZm9ybWF0IGFzICdqc29uJyB8ICd5YW1sJykgfHwgJ2pzb24nO1xuXG4gIC8vIFVzZSB0aGUgZWxlbWVudCBxdWVyeSBzZXJ2aWNlIHRvIGdldCBlbGVtZW50IGRldGFpbHNcbiAgY29uc3QgZWxlbWVudERldGFpbHMgPSBhd2FpdCBoYW5kbGVyLmdldEVsZW1lbnREZXRhaWxzKG5hbWUsIHR5cGUpO1xuICBpZiAoIWVsZW1lbnREZXRhaWxzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IG5vdCBmb3VuZDogJHt0eXBlfS8ke25hbWV9YCk7XG4gIH1cblxuICAvLyBCdWlsZCBleHBvcnQgcGFja2FnZSAobWF0Y2hlcyBNQ1BBUUxIYW5kbGVyLmhhbmRsZUV4cG9ydEVsZW1lbnQgZm9ybWF0KVxuICBjb25zdCBleHBvcnRQYWNrYWdlOiBFeHBvcnRQYWNrYWdlID0ge1xuICAgIGV4cG9ydFZlcnNpb246ICcxLjAnLFxuICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICBmb3JtYXQsXG4gICAgZGF0YTogJycsXG4gIH07XG5cbiAgLy8gU2VyaWFsaXplIHRvIHJlcXVlc3RlZCBmb3JtYXRcbiAgaWYgKGZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgZXhwb3J0UGFja2FnZS5kYXRhID0geWFtbC5kdW1wKGVsZW1lbnREZXRhaWxzLCB7XG4gICAgICBpbmRlbnQ6IDIsXG4gICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRQYWNrYWdlLmRhdGEgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50RGV0YWlscywgbnVsbCwgMik7XG4gIH1cblxuICByZXR1cm4gZXhwb3J0UGFja2FnZTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgZWxlbWVudCBpbXBvcnQgb3BlcmF0aW9uLlxuICogUGFyc2VzIGV4cG9ydCBwYWNrYWdlIGFuZCBkZWxlZ2F0ZXMgdG8gRWxlbWVudENSVUQuXG4gKlxuICogU3VwcG9ydHMgdHdvIGV4cG9ydCBwYWNrYWdlIGZvcm1hdHM6XG4gKiAxLiBNQ1BBUUxIYW5kbGVyIGZvcm1hdDogeyBleHBvcnRWZXJzaW9uLCBlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGZvcm1hdCwgZGF0YSB9XG4gKiAyLiBMZWdhY3kgZm9ybWF0OiB7IHZlcnNpb24sIGVsZW1lbnQ6IHsgdHlwZSwgbmFtZSwgLi4uIH0gfVxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbXBvcnRFbGVtZW50KFxuICBtYXBwZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgaGFuZGxlciA9IHJlZ2lzdHJ5LmVsZW1lbnRDUlVEO1xuICBpZiAoIWhhbmRsZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnRDUlVEIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogaGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IG1hcHBlZFBhcmFtcy5kYXRhO1xuICBjb25zdCBvdmVyd3JpdGUgPSBtYXBwZWRQYXJhbXMub3ZlcndyaXRlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLy8gUGFyc2UgdGhlIGV4cG9ydCBwYWNrYWdlIChhY2NlcHQgc3RyaW5nIG9yIGFscmVhZHktcGFyc2VkIG9iamVjdClcbiAgbGV0IGV4cG9ydFBhY2thZ2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV4cG9ydFBhY2thZ2UgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBub3QgdmFsaWQgSlNPTicpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCkge1xuICAgIGV4cG9ydFBhY2thZ2UgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBtdXN0IGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIGVsZW1lbnQgZGV0YWlscyBiYXNlZCBvbiBwYWNrYWdlIGZvcm1hdFxuICBsZXQgZWxlbWVudFR5cGU6IHN0cmluZztcbiAgbGV0IGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gIGxldCBlbGVtZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaWYgKGV4cG9ydFBhY2thZ2UuZWxlbWVudFR5cGUgJiYgZXhwb3J0UGFja2FnZS5kYXRhKSB7XG4gICAgLy8gTUNQQVFMSGFuZGxlciBmb3JtYXQ6IHsgZXhwb3J0VmVyc2lvbiwgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBmb3JtYXQsIGRhdGEgfVxuICAgIGVsZW1lbnRUeXBlID0gZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSBhcyBzdHJpbmc7XG4gICAgZWxlbWVudE5hbWUgPSBleHBvcnRQYWNrYWdlLmVsZW1lbnROYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBmb3JtYXQgPSBleHBvcnRQYWNrYWdlLmZvcm1hdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBQYXJzZSB0aGUgbmVzdGVkIGRhdGEgZmllbGQgYmFzZWQgb24gZm9ybWF0XG4gICAgY29uc3QgbmVzdGVkRGF0YSA9IGV4cG9ydFBhY2thZ2UuZGF0YTtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICAgICAgICAvLyBVc2UgU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwgZm9yIHNhZmUgWUFNTCBwYXJzaW5nIChDT1JFX1NDSEVNQSwgc2l6ZSBsaW1pdHMpXG4gICAgICAgICAgZWxlbWVudERhdGEgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbChuZXN0ZWREYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50RGF0YSA9IEpTT04ucGFyc2UobmVzdGVkRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZXhwb3J0IHBhY2thZ2U6IGRhdGEgZmllbGQgaXMgbm90IHZhbGlkICR7Zm9ybWF0IHx8ICdKU09OJ31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXN0ZWREYXRhID09PSAnb2JqZWN0JyAmJiBuZXN0ZWREYXRhICE9PSBudWxsKSB7XG4gICAgICBlbGVtZW50RGF0YSA9IG5lc3RlZERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBmaWVsZCBtdXN0IGJlIHN0cmluZyBvciBvYmplY3QnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZS5lbGVtZW50KSB7XG4gICAgLy8gTGVnYWN5IGZvcm1hdDogeyB2ZXJzaW9uLCBlbGVtZW50OiB7IHR5cGUsIG5hbWUsIC4uLiB9IH1cbiAgICBjb25zdCBlbGVtZW50ID0gZXhwb3J0UGFja2FnZS5lbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlIGFzIHN0cmluZztcbiAgICBlbGVtZW50TmFtZSA9IGVsZW1lbnQubmFtZSBhcyBzdHJpbmc7XG4gICAgZWxlbWVudERhdGEgPSBlbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogbWlzc2luZyBlbGVtZW50IGRhdGEnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgd2hlbiBvdmVyd3JpdGUgaXMgZmFsc2VcbiAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBoYW5kbGVyLmdldEVsZW1lbnREZXRhaWxzKGVsZW1lbnROYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgYWxyZWFkeSBleGlzdHMuIFVzZSBvdmVyd3JpdGU6IHRydWUgdG8gcmVwbGFjZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gRWxlbWVudCBkb2Vzbid0IGV4aXN0LCB3aGljaCBpcyB3aGF0IHdlIHdhbnRcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBFcnJvcikgfHwgIWUubWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIGVsZW1lbnRcbiAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgbmFtZTogKGVsZW1lbnREYXRhLm5hbWUgYXMgc3RyaW5nKSB8fCBlbGVtZW50TmFtZSxcbiAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICBkZXNjcmlwdGlvbjogKGVsZW1lbnREYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgfHwgJycsXG4gICAgY29udGVudDogZWxlbWVudERhdGEuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaW5zdHJ1Y3Rpb25zOiBlbGVtZW50RGF0YS5pbnN0cnVjdGlvbnMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG1ldGFkYXRhOiBlbGVtZW50RGF0YS5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1haW4gRGlzcGF0Y2hlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNjaGVtYURpc3BhdGNoZXIgLSBEaXNwYXRjaCBvcGVyYXRpb25zIHVzaW5nIHNjaGVtYSBkZWZpbml0aW9uc1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGNvcmUgZGlzcGF0Y2ggbG9naWMgZm9yIHNjaGVtYS1kcml2ZW4gb3BlcmF0aW9ucy5cbiAqIEl0IHJlcGxhY2VzIHRoZSBtYW51YWwgZGlzcGF0Y2ggbWV0aG9kcyBpbiBNQ1BBUUxIYW5kbGVyIGZvciBvcGVyYXRpb25zXG4gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFEaXNwYXRjaGVyIHtcbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9wZXJhdGlvbiBjYW4gYmUgaGFuZGxlZCBieSBzY2hlbWEgZGlzcGF0Y2hcbiAgICovXG4gIHN0YXRpYyBjYW5EaXNwYXRjaChvcGVyYXRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NjaGVtYU9wZXJhdGlvbihvcGVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGFuIG9wZXJhdGlvbiB1c2luZyBpdHMgc2NoZW1hIGRlZmluaXRpb25cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIE9wZXJhdGlvbiBuYW1lIChlLmcuLCAnYnJvd3NlX2NvbGxlY3Rpb24nKVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHJlZ2lzdHJ5IC0gSGFuZGxlciByZWdpc3RyeSB3aXRoIGFsbCBjb25maWd1cmVkIGhhbmRsZXJzXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wdGlvbmFsIGZ1bGwgT3BlcmF0aW9uSW5wdXQgZm9yIHNvdXJjZSByZXNvbHV0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbiByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBvcGVyYXRpb24gbm90IGZvdW5kLCBoYW5kbGVyIG1pc3NpbmcsIG9yIHBhcmFtcyBpbnZhbGlkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGlzcGF0Y2goXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZWdpc3RyeTogSGFuZGxlclJlZ2lzdHJ5LFxuICAgIGlucHV0PzogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gR2V0IHNjaGVtYSBkZWZpbml0aW9uXG4gICAgY29uc3Qgc2NoZW1hID0gZ2V0T3BlcmF0aW9uU2NoZW1hKG9wZXJhdGlvbik7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc2NoZW1hIGRlZmluaXRpb24gZm91bmQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259J2ApO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IG5vcm1hbGl6ZXIgaWYgc2NoZW1hIHNwZWNpZmllcyBvbmUgKElzc3VlICMyNDMpXG4gICAgLy8gTm9ybWFsaXplcnMgdHJhbnNmb3JtIHJhdyBpbnB1dCBwYXJhbXMgYmVmb3JlIHZhbGlkYXRpb24gYW5kIGRpc3BhdGNoXG4gICAgaWYgKHNjaGVtYS5ub3JtYWxpemVyKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVyID0gTm9ybWFsaXplclJlZ2lzdHJ5LmdldChzY2hlbWEubm9ybWFsaXplcik7XG4gICAgICBpZiAoIW5vcm1hbGl6ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb3JtYWxpemVyICcke3NjaGVtYS5ub3JtYWxpemVyfScgbm90IGZvdW5kIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScuIGAgK1xuICAgICAgICAgIGBSZWdpc3RlcmVkIG5vcm1hbGl6ZXJzOiBbJHtOb3JtYWxpemVyUmVnaXN0cnkubGlzdCgpLmpvaW4oJywgJykgfHwgJ25vbmUnfV1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIG5vcm1hbGl6ZXIgY29udGV4dCBmb3IgZGVidWdnaW5nIGFuZCBmdXR1cmUgZXh0ZW5zaWJpbGl0eVxuICAgICAgY29uc3Qgbm9ybWFsaXplckNvbnRleHQ6IE5vcm1hbGl6ZXJDb250ZXh0ID0ge1xuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIGVuZHBvaW50OiBzY2hlbWEuZW5kcG9pbnQsXG4gICAgICAgIGhhbmRsZXI6IHNjaGVtYS5oYW5kbGVyLFxuICAgICAgICBtZXRob2Q6IHNjaGVtYS5tZXRob2QsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBpbnB1dD8uZWxlbWVudFR5cGUsXG4gICAgICB9O1xuXG4gICAgICAvLyBOb3JtYWxpemUgcGFyYW1zIC0gdGhpcyBtYXkgdHJhbnNmb3JtLCB2YWxpZGF0ZSwgb3IgZW5yaWNoIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtcywgbm9ybWFsaXplckNvbnRleHQpO1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIG5vcm1hbGl6ZWQgcGFyYW1zIGZvciB0aGUgcmVzdCBvZiBkaXNwYXRjaFxuICAgICAgcGFyYW1zID0gcmVzdWx0LnBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBmdWxsIGlucHV0IGNvbnRleHQgZm9yIHNvdXJjZSByZXNvbHV0aW9uXG4gICAgY29uc3QgbmVlZHNJbnB1dCA9IHNjaGVtYS5uZWVkc0Z1bGxJbnB1dCAmJiBpbnB1dDtcblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIG9wZXJhdGlvbnNcbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19faW50cm9zcGVjdF9fJykge1xuICAgICAgcmV0dXJuIGhhbmRsZUludHJvc3BlY3Rpb24ocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fYnVpbGRJbmZvX18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlQnVpbGRJbmZvKHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fY2FjaGVCdWRnZXRfXycpIHtcbiAgICAgIHJldHVybiBoYW5kbGVDYWNoZUJ1ZGdldFJlcG9ydChyZWdpc3RyeSk7XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5tZXRob2QgPT09ICdfX2NhcGFiaWxpdGllc19fJykge1xuICAgICAgcmV0dXJuIGhhbmRsZUNhcGFiaWxpdGllcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIE1hcCBwYXJhbXMgYWNjb3JkaW5nIHRvIHNjaGVtYSAod2l0aCBpbnB1dCBjb250ZXh0IGFuZCBwYXJhbSBzdHlsZSlcbiAgICAvLyBGb3Igb3BlcmF0aW9ucyB3aXRoIG5vcm1hbGl6ZXJzLCB0aGUgbm9ybWFsaXplZCBwYXJhbXMgQVJFIHRoZSBtYXBwZWQgcGFyYW1zXG4gICAgLy8gKHRoZSBub3JtYWxpemVyIGFscmVhZHkgdHJhbnNmb3JtcyBpbnB1dCB0byBoYW5kbGVyLXJlYWR5IGZvcm1hdClcbiAgICBjb25zdCBtYXBwZWRQYXJhbXMgPSBzY2hlbWEubm9ybWFsaXplclxuICAgICAgPyBwYXJhbXMgIC8vIE5vcm1hbGl6ZXIgYWxyZWFkeSBwcm9kdWNlZCB0aGUgY29ycmVjdCBvdXRwdXQgZm9ybWF0XG4gICAgICA6IHNjaGVtYS5wYXJhbXNcbiAgICAgICAgPyBtYXBQYXJhbXMocGFyYW1zLCBzY2hlbWEucGFyYW1zLCBuZWVkc0lucHV0ID8gaW5wdXQgOiB1bmRlZmluZWQsIHNjaGVtYS5wYXJhbVN0eWxlKVxuICAgICAgICA6IHt9O1xuXG4gICAgLy8gVmFsaWRhdGUgcGFyYW1zOiByZXF1aXJlZCBwYXJhbXMgZmlyc3QsIHRoZW4gdHlwZSB2YWxpZGF0aW9uIChJc3N1ZSAjMjU1KVxuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBmb3Igbm9ybWFsaXplZCBvcGVyYXRpb25zIChub3JtYWxpemVyIGhhbmRsZXMgdmFsaWRhdGlvbilcbiAgICBpZiAoc2NoZW1hLnBhcmFtcyAmJiAhc2NoZW1hLm5vcm1hbGl6ZXIpIHtcbiAgICAgIHZhbGlkYXRlUmVxdWlyZWRQYXJhbXMocGFyYW1zLCBzY2hlbWEucGFyYW1zLCBvcGVyYXRpb24sIG5lZWRzSW5wdXQgPyBpbnB1dCA6IHVuZGVmaW5lZCk7XG4gICAgICB2YWxpZGF0ZVBhcmFtVHlwZXMocGFyYW1zLCBzY2hlbWEucGFyYW1zLCBvcGVyYXRpb24pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIEVsZW1lbnRDUlVEIG9wZXJhdGlvbnNcbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19fZXhwb3J0X18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlRXhwb3J0RWxlbWVudChtYXBwZWRQYXJhbXMsIHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLm1ldGhvZCA9PT0gJ19faW1wb3J0X18nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlSW1wb3J0RWxlbWVudChtYXBwZWRQYXJhbXMsIHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgaGFuZGxlciBmcm9tIHJlZ2lzdHJ5XG4gICAgY29uc3QgaGFuZGxlciA9IGdldEhhbmRsZXIoXG4gICAgICByZWdpc3RyeSxcbiAgICAgIHNjaGVtYS5oYW5kbGVyLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgc2NoZW1hLm9wdGlvbmFsID8/IGZhbHNlXG4gICAgKTtcblxuICAgIC8vIEdldCBtZXRob2QgZnJvbSBoYW5kbGVyXG4gICAgY29uc3QgbWV0aG9kID0gZ2V0TWV0aG9kKGhhbmRsZXIsIHNjaGVtYS5tZXRob2QsIHNjaGVtYS5oYW5kbGVyLCBvcGVyYXRpb24pO1xuXG4gICAgLy8gQnVpbGQgYXJndW1lbnRzIGJhc2VkIG9uIGFyZ0J1aWxkZXIgdHlwZSAod2l0aCBpbnB1dCBjb250ZXh0IGlmIG5lZWRlZClcbiAgICBjb25zdCBhcmdzID0gYnVpbGRBcmdzKHBhcmFtcywgc2NoZW1hLCBtYXBwZWRQYXJhbXMsIG5lZWRzSW5wdXQgPyBpbnB1dCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIG1ldGhvZFxuICAgIC8vIE5vdGU6IEZpZWxkIHNlbGVjdGlvbiBpcyBhcHBsaWVkIGF0IE1DUEFRTEhhbmRsZXIgbGV2ZWwgKElzc3VlICMyMDIpXG4gICAgcmV0dXJuIG1ldGhvZCguLi5hcmdzKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFeHBvcnRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB7IGlzU2NoZW1hT3BlcmF0aW9uLCBnZXRPcGVyYXRpb25TY2hlbWEgfTtcblxuLy8gVGVzdCBleHBvcnRzIGZvciBzZWN1cml0eSBib3VuZGFyeSB2ZXJpZmljYXRpb25cbmV4cG9ydCBjb25zdCBfX3Rlc3RfXyA9IHtcbiAgZ2V0TmVzdGVkVmFsdWUsXG4gIFNBRkVfUEFUSF9QQVRURVJOLFxuICBGT1JCSURERU5fUEFUSFMsXG59O1xuIl19
|
|
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
|
|
@@ -35,6 +35,9 @@ export declare class EnsembleActivationStrategy extends BaseActivationStrategy i
|
|
|
35
35
|
* @see Issue #275 - Handlers return success=true for missing elements
|
|
36
36
|
*/
|
|
37
37
|
deactivate(name: string): Promise<MCPResponse>;
|
|
38
|
+
private getManagers;
|
|
39
|
+
private deactivateMembers;
|
|
40
|
+
private deactivateMember;
|
|
38
41
|
/**
|
|
39
42
|
* Get all active ensembles
|
|
40
43
|
* NOTE: This was missing in the original implementation - adding basic version
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnsembleActivationStrategy.d.ts","sourceRoot":"","sources":["../../../src/handlers/strategies/EnsembleActivationStrategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"EnsembleActivationStrategy.d.ts","sourceRoot":"","sources":["../../../src/handlers/strategies/EnsembleActivationStrategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIxF,qBAAa,0BAA2B,SAAQ,sBAAuB,YAAW,yBAAyB;IAEvG,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBANd,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc;IAKjD;;;OAGG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA8DlD;;;;;;OAMG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAepD,OAAO,CAAC,WAAW;YAWL,iBAAiB;YAOjB,gBAAgB;IA+B9B;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;IAyB/C;;;OAGG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAmC5D"}
|
|
@@ -36,14 +36,7 @@ export class EnsembleActivationStrategy extends BaseActivationStrategy {
|
|
|
36
36
|
const ensemble = activationResult.ensemble;
|
|
37
37
|
// Activate the ensemble with all managers (orchestration)
|
|
38
38
|
try {
|
|
39
|
-
const result = await ensemble.activateEnsemble(this.portfolioManager,
|
|
40
|
-
skillManager: this.skillManager,
|
|
41
|
-
templateManager: this.templateManager,
|
|
42
|
-
agentManager: this.agentManager,
|
|
43
|
-
memoryManager: this.memoryManager,
|
|
44
|
-
personaManager: this.personaManager,
|
|
45
|
-
ensembleManager: this.ensembleManager
|
|
46
|
-
});
|
|
39
|
+
const result = await ensemble.activateEnsemble(this.portfolioManager, this.getManagers());
|
|
47
40
|
const statusEmoji = result.success ? '✅' : '⚠️';
|
|
48
41
|
const details = [
|
|
49
42
|
`${statusEmoji} Ensemble '${ensemble.metadata.name}' activated`,
|
|
@@ -101,8 +94,54 @@ export class EnsembleActivationStrategy extends BaseActivationStrategy {
|
|
|
101
94
|
if (!deactivationResult.success) {
|
|
102
95
|
this.throwNotFoundError(name, 'Ensemble');
|
|
103
96
|
}
|
|
97
|
+
if (deactivationResult.ensemble) {
|
|
98
|
+
await this.deactivateMembers(deactivationResult.ensemble);
|
|
99
|
+
}
|
|
104
100
|
return this.createSuccessResponse(`✅ Ensemble '${name}' deactivated`);
|
|
105
101
|
}
|
|
102
|
+
getManagers() {
|
|
103
|
+
return {
|
|
104
|
+
skillManager: this.skillManager,
|
|
105
|
+
templateManager: this.templateManager,
|
|
106
|
+
agentManager: this.agentManager,
|
|
107
|
+
memoryManager: this.memoryManager,
|
|
108
|
+
personaManager: this.personaManager,
|
|
109
|
+
ensembleManager: this.ensembleManager
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async deactivateMembers(ensemble) {
|
|
113
|
+
const deactivationPromises = (ensemble.metadata.elements || []).map((element) => this.deactivateMember(element));
|
|
114
|
+
await Promise.all(deactivationPromises);
|
|
115
|
+
}
|
|
116
|
+
async deactivateMember(element) {
|
|
117
|
+
const normalizedType = element.element_type.toLowerCase();
|
|
118
|
+
switch (normalizedType) {
|
|
119
|
+
case 'skill':
|
|
120
|
+
case 'skills':
|
|
121
|
+
await this.skillManager.deactivateSkill(element.element_name);
|
|
122
|
+
return;
|
|
123
|
+
case 'persona':
|
|
124
|
+
case 'personas':
|
|
125
|
+
await Promise.resolve(this.personaManager.deactivatePersona(element.element_name));
|
|
126
|
+
return;
|
|
127
|
+
case 'agent':
|
|
128
|
+
case 'agents':
|
|
129
|
+
await this.agentManager.deactivateAgent(element.element_name);
|
|
130
|
+
return;
|
|
131
|
+
case 'memory':
|
|
132
|
+
case 'memories':
|
|
133
|
+
await this.memoryManager.deactivateMemory(element.element_name);
|
|
134
|
+
return;
|
|
135
|
+
case 'ensemble':
|
|
136
|
+
case 'ensembles':
|
|
137
|
+
await this.ensembleManager.deactivateEnsemble(element.element_name);
|
|
138
|
+
return;
|
|
139
|
+
case 'template':
|
|
140
|
+
case 'templates':
|
|
141
|
+
default:
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
106
145
|
/**
|
|
107
146
|
* Get all active ensembles
|
|
108
147
|
* NOTE: This was missing in the original implementation - adding basic version
|
|
@@ -163,4 +202,4 @@ export class EnsembleActivationStrategy extends BaseActivationStrategy {
|
|
|
163
202
|
};
|
|
164
203
|
}
|
|
165
204
|
}
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvc3RyYXRlZ2llcy9FbnNlbWJsZUFjdGl2YXRpb25TdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQVNILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3JFLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxzQkFBc0I7SUFFakQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFQbkIsWUFDbUIsZUFBZ0MsRUFDaEMsZ0JBQWtDLEVBQ2xDLFlBQTBCLEVBQzFCLGVBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLGNBQThCO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBUlMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUdqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQ3pCLHFEQUFxRDtRQUNyRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFTLENBQUM7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QixJQUFJLFlBQVksRUFBRTtZQUMzRix3QkFBeUIsUUFBUSxDQUFDLFFBQWdCLENBQUMsY0FBYyxJQUFJLFdBQVcsRUFBRTtZQUNsRix1QkFBd0IsUUFBUSxDQUFDLFFBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUM5RSwwQkFBMkIsUUFBUSxDQUFDLFFBQWdCLENBQUMsZUFBZSxJQUFJLENBQUMsRUFBRTtZQUMzRSxFQUFFO1lBQ0YsaUJBQWlCLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUk7WUFDNUQsWUFBWTtTQUNiLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUN6QixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3kgLSBTdHJhdGVneSBmb3IgZW5zZW1ibGUgZWxlbWVudCBhY3RpdmF0aW9uXG4gKlxuICogSGFuZGxlcyBhY3RpdmF0aW9uLCBkZWFjdGl2YXRpb24sIGFuZCBzdGF0dXMgdHJhY2tpbmcgZm9yIGVuc2VtYmxlIGVsZW1lbnRzLlxuICogRW5zZW1ibGVzIGNvb3JkaW5hdGUgbXVsdGlwbGUgZWxlbWVudHMgYW5kIHJlcXVpcmUgYWxsIG1hbmFnZXJzIGZvciBhY3RpdmF0aW9uLlxuICovXG5cbmltcG9ydCB7IEVuc2VtYmxlTWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2tpbGxNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvc2tpbGxzL2luZGV4LmpzJztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBQZXJzb25hTWFuYWdlciB9IGZyb20gJy4uLy4uL3BlcnNvbmEvUGVyc29uYU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEJhc2VBY3RpdmF0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL0Jhc2VBY3RpdmF0aW9uU3RyYXRlZ3kuanMnO1xuaW1wb3J0IHsgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneSwgTUNQUmVzcG9uc2UgfSBmcm9tICcuL0VsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3kuanMnO1xuXG5leHBvcnQgY2xhc3MgRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBCYXNlQWN0aXZhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5zZW1ibGVNYW5hZ2VyOiBFbnNlbWJsZU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZU1hbmFnZXI6IFRlbXBsYXRlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFnZW50TWFuYWdlcjogQWdlbnRNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcnNvbmFNYW5hZ2VyOiBQZXJzb25hTWFuYWdlclxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFuIGVuc2VtYmxlIHdpdGggYWxsIGl0cyBjb25zdGl0dWVudCBlbGVtZW50c1xuICAgKiBFeHRyYWN0ZWQgZnJvbSBFbGVtZW50Q1JVREhhbmRsZXIudHMgbGluZXMgMjgxLTM0NVxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxNQ1BSZXNwb25zZT4ge1xuICAgIC8vIEFjdGl2YXRlIHZpYSBtYW5hZ2VyICh3aGljaCBoYW5kbGVzIG5hbWUgdHJhY2tpbmcpXG4gICAgY29uc3QgYWN0aXZhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmFjdGl2YXRlRW5zZW1ibGUobmFtZSk7XG5cbiAgICBpZiAoIWFjdGl2YXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm90Rm91bmRSZXNwb25zZShuYW1lLCAnRW5zZW1ibGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnNlbWJsZSA9IGFjdGl2YXRpb25SZXN1bHQuZW5zZW1ibGUhO1xuXG4gICAgLy8gQWN0aXZhdGUgdGhlIGVuc2VtYmxlIHdpdGggYWxsIG1hbmFnZXJzIChvcmNoZXN0cmF0aW9uKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnNlbWJsZS5hY3RpdmF0ZUVuc2VtYmxlKHRoaXMucG9ydGZvbGlvTWFuYWdlciwge1xuICAgICAgICBza2lsbE1hbmFnZXI6IHRoaXMuc2tpbGxNYW5hZ2VyLFxuICAgICAgICB0ZW1wbGF0ZU1hbmFnZXI6IHRoaXMudGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgICBhZ2VudE1hbmFnZXI6IHRoaXMuYWdlbnRNYW5hZ2VyLFxuICAgICAgICBtZW1vcnlNYW5hZ2VyOiB0aGlzLm1lbW9yeU1hbmFnZXIsXG4gICAgICAgIHBlcnNvbmFNYW5hZ2VyOiB0aGlzLnBlcnNvbmFNYW5hZ2VyLFxuICAgICAgICBlbnNlbWJsZU1hbmFnZXI6IHRoaXMuZW5zZW1ibGVNYW5hZ2VyXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3RhdHVzRW1vamkgPSByZXN1bHQuc3VjY2VzcyA/ICfinIUnIDogJ+KaoO+4jyc7XG4gICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICBgJHtzdGF0dXNFbW9qaX0gRW5zZW1ibGUgJyR7ZW5zZW1ibGUubWV0YWRhdGEubmFtZX0nIGFjdGl2YXRlZGAsXG4gICAgICAgIGBgLFxuICAgICAgICBgKipTdHJhdGVneSoqOiAke2Vuc2VtYmxlLm1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneX1gLFxuICAgICAgICBgKipBY3RpdmF0ZWQqKjogJHtyZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMubGVuZ3RofSBlbGVtZW50c2AsXG4gICAgICAgIGAqKkZhaWxlZCoqOiAke3Jlc3VsdC5mYWlsZWRFbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzYCxcbiAgICAgICAgYCoqRHVyYXRpb24qKjogJHtyZXN1bHQudG90YWxEdXJhdGlvbn1tc2AsXG4gICAgICBdO1xuXG4gICAgICBpZiAocmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGV0YWlscy5wdXNoKGBgLCBgKipBY3RpdmUgRWxlbWVudHMqKjpgKTtcbiAgICAgICAgcmVzdWx0LmFjdGl2YXRlZEVsZW1lbnRzLmZvckVhY2goKGVsZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgIGRldGFpbHMucHVzaChgICAtICR7ZWxlbX1gKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQuZmFpbGVkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBkZXRhaWxzLnB1c2goYGAsIGAqKkZhaWxlZCBFbGVtZW50cyoqOmApO1xuICAgICAgICByZXN1bHQuZmFpbGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudFJlc3VsdCA9IHJlc3VsdC5lbGVtZW50UmVzdWx0cy5maW5kKChyOiBhbnkpID0+IHIuZWxlbWVudE5hbWUgPT09IGVsZW0gJiYgIXIuc3VjY2Vzcyk7XG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlbGVtZW50UmVzdWx0Py5lcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKGAgIC0gJHtlbGVtfTogJHtlcnJvck1zZ31gKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM2NDI6IEZhaWwtc2FmZSB3YXJuaW5nIGZvciBDTEkgcmVzdHJpY3Rpb25zXG4gICAgICBjb25zdCByZXN0cmljdGlvbldhcm5pbmcgPSB0aGlzLmZvcm1hdFJlc3RyaWN0aW9uV2FybmluZyhlbnNlbWJsZS5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGlmIChyZXN0cmljdGlvbldhcm5pbmcpIHtcbiAgICAgICAgZGV0YWlscy5wdXNoKHJlc3RyaWN0aW9uV2FybmluZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogZGV0YWlscy5qb2luKCdcXG4nKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChhY3RpdmF0aW9uRXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gYWN0aXZhdGUgZW5zZW1ibGU6ICR7YWN0aXZhdGlvbkVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBhY3RpdmF0aW9uRXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIGFuIGVuc2VtYmxlXG4gICAqIE5PVEU6IFRoaXMgd2FzIG1pc3NpbmcgaW4gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIC0gYWRkaW5nIGl0IG5vd1xuICAgKlxuICAgKiBAdGhyb3dzIHtFbGVtZW50Tm90Rm91bmRFcnJvcn0gV2hlbiBlbnNlbWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKiBAc2VlIElzc3VlICMyNzUgLSBIYW5kbGVycyByZXR1cm4gc3VjY2Vzcz10cnVlIGZvciBtaXNzaW5nIGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TUNQUmVzcG9uc2U+IHtcbiAgICAvLyBEZWFjdGl2YXRlIHZpYSBtYW5hZ2VyICh3aGljaCBoYW5kbGVzIG5hbWUgdHJhY2tpbmcpXG4gICAgY29uc3QgZGVhY3RpdmF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIuZGVhY3RpdmF0ZUVuc2VtYmxlKG5hbWUpO1xuXG4gICAgaWYgKCFkZWFjdGl2YXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhpcy50aHJvd05vdEZvdW5kRXJyb3IobmFtZSwgJ0Vuc2VtYmxlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU3VjY2Vzc1Jlc3BvbnNlKGDinIUgRW5zZW1ibGUgJyR7bmFtZX0nIGRlYWN0aXZhdGVkYCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgZW5zZW1ibGVzXG4gICAqIE5PVEU6IFRoaXMgd2FzIG1pc3NpbmcgaW4gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIC0gYWRkaW5nIGJhc2ljIHZlcnNpb25cbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKCk6IFByb21pc2U8TUNQUmVzcG9uc2U+IHtcbiAgICBjb25zdCBhY3RpdmVFbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5nZXRBY3RpdmVFbnNlbWJsZXMoKTtcblxuICAgIGlmIChhY3RpdmVFbnNlbWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IFwi8J+OrSBObyBhY3RpdmUgZW5zZW1ibGVzXCJcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZW5zZW1ibGVMaXN0ID0gYWN0aXZlRW5zZW1ibGVzLm1hcChlID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDb3VudCA9IGUubWV0YWRhdGEuZWxlbWVudHM/Lmxlbmd0aCB8fCAwO1xuICAgICAgcmV0dXJuIGDwn46tICR7ZS5tZXRhZGF0YS5uYW1lfSAoJHtlbGVtZW50Q291bnR9IGVsZW1lbnRzKWA7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHRleHQ6IGBBY3RpdmUgZW5zZW1ibGVzOlxcbiR7ZW5zZW1ibGVMaXN0fWBcbiAgICAgIH1dXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZW5zZW1ibGVcbiAgICogRXh0cmFjdGVkIGZyb20gRWxlbWVudENSVURIYW5kbGVyLnRzIGxpbmVzIDgwNy04NDZcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TUNQUmVzcG9uc2U+IHtcbiAgICAvLyBVc2UgZmxleGlibGUgZmluZGluZyB0byBzdXBwb3J0IGJvdGggZGlzcGxheSBuYW1lIGFuZCBmaWxlbmFtZVxuICAgIGNvbnN0IGFsbEVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRGbGV4aWJseShuYW1lLCBhbGxFbnNlbWJsZXMpO1xuICAgIGlmICghZW5zZW1ibGUpIHtcbiAgICAgIHRoaXMudGhyb3dOb3RGb3VuZEVycm9yKG5hbWUsICdFbnNlbWJsZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzTGlzdCA9IGVuc2VtYmxlLm1ldGFkYXRhLmVsZW1lbnRzPy5tYXAoKGVsZW06IGFueSkgPT5cbiAgICAgIGAtICR7ZWxlbS5lbGVtZW50X25hbWV9ICgke2VsZW0uZWxlbWVudF90eXBlfSkgLSAke2VsZW0ucm9sZX0sIHByaW9yaXR5OiAke2VsZW0ucHJpb3JpdHl9LCBhY3RpdmF0aW9uOiAke2VsZW0uYWN0aXZhdGlvbn1gXG4gICAgKS5qb2luKCdcXG4nKSB8fCAnTm8gZWxlbWVudHMgY29uZmlndXJlZCc7XG5cbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgYPCfjq0gKioke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgYCR7ZW5zZW1ibGUubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgIGBgLFxuICAgICAgYCoqU3RhdHVzKio6ICR7ZW5zZW1ibGUuZ2V0U3RhdHVzKCl9YCxcbiAgICAgIGAqKlZlcnNpb24qKjogJHtlbnNlbWJsZS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCd9YCxcbiAgICAgIGAqKkFjdGl2YXRpb24gU3RyYXRlZ3kqKjogJHsoZW5zZW1ibGUubWV0YWRhdGEgYXMgYW55KS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgJ3NlcXVlbnRpYWwnfWAsXG4gICAgICBgKipDb25mbGljdCBSZXNvbHV0aW9uKio6ICR7KGVuc2VtYmxlLm1ldGFkYXRhIGFzIGFueSkuY29uZmxpY3RSZXNvbHV0aW9uIHx8ICdsYXN0LXdyaXRlJ31gLFxuICAgICAgYCoqQ29udGV4dCBTaGFyaW5nKio6ICR7KGVuc2VtYmxlLm1ldGFkYXRhIGFzIGFueSkuY29udGV4dFNoYXJpbmcgfHwgJ3NlbGVjdGl2ZSd9YCxcbiAgICAgIGAqKkFsbG93cyBOZXN0aW5nKio6ICR7KGVuc2VtYmxlLm1ldGFkYXRhIGFzIGFueSkuYWxsb3dOZXN0ZWQgPyAnWWVzJyA6ICdObyd9YCxcbiAgICAgIGAqKk1heCBOZXN0aW5nIERlcHRoKio6ICR7KGVuc2VtYmxlLm1ldGFkYXRhIGFzIGFueSkubWF4TmVzdGluZ0RlcHRoIHx8IDV9YCxcbiAgICAgIGBgLFxuICAgICAgYCoqRWxlbWVudHMqKiAoJHtlbnNlbWJsZS5tZXRhZGF0YS5lbGVtZW50cz8ubGVuZ3RoIHx8IDB9KTpgLFxuICAgICAgZWxlbWVudHNMaXN0XG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogZGV0YWlscy5qb2luKCdcXG4nKVxuICAgICAgfV1cbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVBY3RpdmF0aW9uU3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGFuZGxlcnMvc3RyYXRlZ2llcy9FbnNlbWJsZUFjdGl2YXRpb25TdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQVNILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBS3JFLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxzQkFBc0I7SUFFakQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFQbkIsWUFDbUIsZUFBZ0MsRUFDaEMsZ0JBQWtDLEVBQ2xDLFlBQTBCLEVBQzFCLGVBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLGNBQThCO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBUlMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUdqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQ3pCLHFEQUFxRDtRQUNyRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFTLENBQUM7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QyxNQUFNLE9BQU8sR0FBRztZQUNkLFFBQVEsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUk7WUFDbEMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUNsQyxFQUFFO1lBQ0YsZUFBZSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDckMsZ0JBQWdCLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLE9BQU8sRUFBRTtZQUN0RCw0QkFBNkIsUUFBUSxDQUFDLFFBQWdCLENBQUMsa0JBQWtCLElBQUksWUFBWSxFQUFFO1lBQzNGLDRCQUE2QixRQUFRLENBQUMsUUFBZ0IsQ0FBQyxrQkFBa0IsSUFBSSxZQUFZLEVBQUU7WUFDM0Ysd0JBQXlCLFFBQVEsQ0FBQyxRQUFnQixDQUFDLGNBQWMsSUFBSSxXQUFXLEVBQUU7WUFDbEYsdUJBQXdCLFFBQVEsQ0FBQyxRQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDOUUsMEJBQTJCLFFBQVEsQ0FBQyxRQUFnQixDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUU7WUFDM0UsRUFBRTtZQUNGLGlCQUFpQixRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJO1lBQzVELFlBQVk7U0FDYixDQUFDO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDO29CQUNSLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDekIsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuc2VtYmxlQWN0aXZhdGlvblN0cmF0ZWd5IC0gU3RyYXRlZ3kgZm9yIGVuc2VtYmxlIGVsZW1lbnQgYWN0aXZhdGlvblxuICpcbiAqIEhhbmRsZXMgYWN0aXZhdGlvbiwgZGVhY3RpdmF0aW9uLCBhbmQgc3RhdHVzIHRyYWNraW5nIGZvciBlbnNlbWJsZSBlbGVtZW50cy5cbiAqIEVuc2VtYmxlcyBjb29yZGluYXRlIG11bHRpcGxlIGVsZW1lbnRzIGFuZCByZXF1aXJlIGFsbCBtYW5hZ2VycyBmb3IgYWN0aXZhdGlvbi5cbiAqL1xuXG5pbXBvcnQgeyBFbnNlbWJsZU1hbmFnZXIgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNraWxsTWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuLi8uLi9lbGVtZW50cy90ZW1wbGF0ZXMvVGVtcGxhdGVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEFnZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgUGVyc29uYU1hbmFnZXIgfSBmcm9tICcuLi8uLi9wZXJzb25hL1BlcnNvbmFNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBCYXNlQWN0aXZhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9CYXNlQWN0aXZhdGlvblN0cmF0ZWd5LmpzJztcbmltcG9ydCB7IEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3ksIE1DUFJlc3BvbnNlIH0gZnJvbSAnLi9FbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5LmpzJztcbmltcG9ydCB0eXBlIHsgRW5zZW1ibGUgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50TWFuYWdlcnMsIEVuc2VtYmxlRWxlbWVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBFbnNlbWJsZUFjdGl2YXRpb25TdHJhdGVneSBleHRlbmRzIEJhc2VBY3RpdmF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBFbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnNlbWJsZU1hbmFnZXI6IEVuc2VtYmxlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBza2lsbE1hbmFnZXI6IFNraWxsTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlTWFuYWdlcjogVGVtcGxhdGVNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGVyc29uYU1hbmFnZXI6IFBlcnNvbmFNYW5hZ2VyXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gZW5zZW1ibGUgd2l0aCBhbGwgaXRzIGNvbnN0aXR1ZW50IGVsZW1lbnRzXG4gICAqIEV4dHJhY3RlZCBmcm9tIEVsZW1lbnRDUlVESGFuZGxlci50cyBsaW5lcyAyODEtMzQ1XG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE1DUFJlc3BvbnNlPiB7XG4gICAgLy8gQWN0aXZhdGUgdmlhIG1hbmFnZXIgKHdoaWNoIGhhbmRsZXMgbmFtZSB0cmFja2luZylcbiAgICBjb25zdCBhY3RpdmF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIuYWN0aXZhdGVFbnNlbWJsZShuYW1lKTtcblxuICAgIGlmICghYWN0aXZhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVOb3RGb3VuZFJlc3BvbnNlKG5hbWUsICdFbnNlbWJsZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuc2VtYmxlID0gYWN0aXZhdGlvblJlc3VsdC5lbnNlbWJsZSE7XG5cbiAgICAvLyBBY3RpdmF0ZSB0aGUgZW5zZW1ibGUgd2l0aCBhbGwgbWFuYWdlcnMgKG9yY2hlc3RyYXRpb24pXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVuc2VtYmxlLmFjdGl2YXRlRW5zZW1ibGUodGhpcy5wb3J0Zm9saW9NYW5hZ2VyLCB0aGlzLmdldE1hbmFnZXJzKCkpO1xuXG4gICAgICBjb25zdCBzdGF0dXNFbW9qaSA9IHJlc3VsdC5zdWNjZXNzID8gJ+KchScgOiAn4pqg77iPJztcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICAgIGAke3N0YXR1c0Vtb2ppfSBFbnNlbWJsZSAnJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfScgYWN0aXZhdGVkYCxcbiAgICAgICAgYGAsXG4gICAgICAgIGAqKlN0cmF0ZWd5Kio6ICR7ZW5zZW1ibGUubWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5fWAsXG4gICAgICAgIGAqKkFjdGl2YXRlZCoqOiAke3Jlc3VsdC5hY3RpdmF0ZWRFbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzYCxcbiAgICAgICAgYCoqRmFpbGVkKio6ICR7cmVzdWx0LmZhaWxlZEVsZW1lbnRzLmxlbmd0aH0gZWxlbWVudHNgLFxuICAgICAgICBgKipEdXJhdGlvbioqOiAke3Jlc3VsdC50b3RhbER1cmF0aW9ufW1zYCxcbiAgICAgIF07XG5cbiAgICAgIGlmIChyZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBkZXRhaWxzLnB1c2goYGAsIGAqKkFjdGl2ZSBFbGVtZW50cyoqOmApO1xuICAgICAgICByZXN1bHQuYWN0aXZhdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKGAgIC0gJHtlbGVtfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5mYWlsZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRldGFpbHMucHVzaChgYCwgYCoqRmFpbGVkIEVsZW1lbnRzKio6YCk7XG4gICAgICAgIHJlc3VsdC5mYWlsZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50UmVzdWx0ID0gcmVzdWx0LmVsZW1lbnRSZXN1bHRzLmZpbmQoKHI6IGFueSkgPT4gci5lbGVtZW50TmFtZSA9PT0gZWxlbSAmJiAhci5zdWNjZXNzKTtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVsZW1lbnRSZXN1bHQ/LmVycm9yPy5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJztcbiAgICAgICAgICBkZXRhaWxzLnB1c2goYCAgLSAke2VsZW19OiAke2Vycm9yTXNnfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzY0MjogRmFpbC1zYWZlIHdhcm5pbmcgZm9yIENMSSByZXN0cmljdGlvbnNcbiAgICAgIGNvbnN0IHJlc3RyaWN0aW9uV2FybmluZyA9IHRoaXMuZm9ybWF0UmVzdHJpY3Rpb25XYXJuaW5nKGVuc2VtYmxlLm1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgaWYgKHJlc3RyaWN0aW9uV2FybmluZykge1xuICAgICAgICBkZXRhaWxzLnB1c2gocmVzdHJpY3Rpb25XYXJuaW5nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGFjdGl2YXRpb25FcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBhY3RpdmF0ZSBlbnNlbWJsZTogJHthY3RpdmF0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGFjdGl2YXRpb25FcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gZW5zZW1ibGVcbiAgICogTk9URTogVGhpcyB3YXMgbWlzc2luZyBpbiB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gLSBhZGRpbmcgaXQgbm93XG4gICAqXG4gICAqIEB0aHJvd3Mge0VsZW1lbnROb3RGb3VuZEVycm9yfSBXaGVuIGVuc2VtYmxlIGRvZXMgbm90IGV4aXN0XG4gICAqIEBzZWUgSXNzdWUgIzI3NSAtIEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxNQ1BSZXNwb25zZT4ge1xuICAgIC8vIERlYWN0aXZhdGUgdmlhIG1hbmFnZXIgKHdoaWNoIGhhbmRsZXMgbmFtZSB0cmFja2luZylcbiAgICBjb25zdCBkZWFjdGl2YXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5kZWFjdGl2YXRlRW5zZW1ibGUobmFtZSk7XG5cbiAgICBpZiAoIWRlYWN0aXZhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aGlzLnRocm93Tm90Rm91bmRFcnJvcihuYW1lLCAnRW5zZW1ibGUnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVhY3RpdmF0aW9uUmVzdWx0LmVuc2VtYmxlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGVNZW1iZXJzKGRlYWN0aXZhdGlvblJlc3VsdC5lbnNlbWJsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU3VjY2Vzc1Jlc3BvbnNlKGDinIUgRW5zZW1ibGUgJyR7bmFtZX0nIGRlYWN0aXZhdGVkYCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZXJzKCk6IEVsZW1lbnRNYW5hZ2VycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNraWxsTWFuYWdlcjogdGhpcy5za2lsbE1hbmFnZXIsXG4gICAgICB0ZW1wbGF0ZU1hbmFnZXI6IHRoaXMudGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgYWdlbnRNYW5hZ2VyOiB0aGlzLmFnZW50TWFuYWdlcixcbiAgICAgIG1lbW9yeU1hbmFnZXI6IHRoaXMubWVtb3J5TWFuYWdlcixcbiAgICAgIHBlcnNvbmFNYW5hZ2VyOiB0aGlzLnBlcnNvbmFNYW5hZ2VyLFxuICAgICAgZW5zZW1ibGVNYW5hZ2VyOiB0aGlzLmVuc2VtYmxlTWFuYWdlclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlYWN0aXZhdGVNZW1iZXJzKGVuc2VtYmxlOiBFbnNlbWJsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWN0aXZhdGlvblByb21pc2VzID0gKGVuc2VtYmxlLm1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdKS5tYXAoKGVsZW1lbnQpID0+XG4gICAgICB0aGlzLmRlYWN0aXZhdGVNZW1iZXIoZWxlbWVudClcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGRlYWN0aXZhdGlvblByb21pc2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVhY3RpdmF0ZU1lbWJlcihlbGVtZW50OiBFbnNlbWJsZUVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IGVsZW1lbnQuZWxlbWVudF90eXBlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlICdza2lsbCc6XG4gICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5kZWFjdGl2YXRlU2tpbGwoZWxlbWVudC5lbGVtZW50X25hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdwZXJzb25hJzpcbiAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMucGVyc29uYU1hbmFnZXIuZGVhY3RpdmF0ZVBlcnNvbmEoZWxlbWVudC5lbGVtZW50X25hbWUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnYWdlbnQnOlxuICAgICAgY2FzZSAnYWdlbnRzJzpcbiAgICAgICAgYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZGVhY3RpdmF0ZUFnZW50KGVsZW1lbnQuZWxlbWVudF9uYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnbWVtb3J5JzpcbiAgICAgIGNhc2UgJ21lbW9yaWVzJzpcbiAgICAgICAgYXdhaXQgdGhpcy5tZW1vcnlNYW5hZ2VyLmRlYWN0aXZhdGVNZW1vcnkoZWxlbWVudC5lbGVtZW50X25hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdlbnNlbWJsZSc6XG4gICAgICBjYXNlICdlbnNlbWJsZXMnOlxuICAgICAgICBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5kZWFjdGl2YXRlRW5zZW1ibGUoZWxlbWVudC5lbGVtZW50X25hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICd0ZW1wbGF0ZSc6XG4gICAgICBjYXNlICd0ZW1wbGF0ZXMnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBlbnNlbWJsZXNcbiAgICogTk9URTogVGhpcyB3YXMgbWlzc2luZyBpbiB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gLSBhZGRpbmcgYmFzaWMgdmVyc2lvblxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHMoKTogUHJvbWlzZTxNQ1BSZXNwb25zZT4ge1xuICAgIGNvbnN0IGFjdGl2ZUVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmdldEFjdGl2ZUVuc2VtYmxlcygpO1xuXG4gICAgaWYgKGFjdGl2ZUVuc2VtYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogXCLwn46tIE5vIGFjdGl2ZSBlbnNlbWJsZXNcIlxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnNlbWJsZUxpc3QgPSBhY3RpdmVFbnNlbWJsZXMubWFwKGUgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudENvdW50ID0gZS5tZXRhZGF0YS5lbGVtZW50cz8ubGVuZ3RoIHx8IDA7XG4gICAgICByZXR1cm4gYPCfjq0gJHtlLm1ldGFkYXRhLm5hbWV9ICgke2VsZW1lbnRDb3VudH0gZWxlbWVudHMpYDtcbiAgICB9KS5qb2luKCdcXG4nKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogYEFjdGl2ZSBlbnNlbWJsZXM6XFxuJHtlbnNlbWJsZUxpc3R9YFxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbnNlbWJsZVxuICAgKiBFeHRyYWN0ZWQgZnJvbSBFbGVtZW50Q1JVREhhbmRsZXIudHMgbGluZXMgODA3LTg0NlxuICAgKi9cbiAgYXN5bmMgZ2V0RWxlbWVudERldGFpbHMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxNQ1BSZXNwb25zZT4ge1xuICAgIC8vIFVzZSBmbGV4aWJsZSBmaW5kaW5nIHRvIHN1cHBvcnQgYm90aCBkaXNwbGF5IG5hbWUgYW5kIGZpbGVuYW1lXG4gICAgY29uc3QgYWxsRW5zZW1ibGVzID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIubGlzdCgpO1xuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudEZsZXhpYmx5KG5hbWUsIGFsbEVuc2VtYmxlcyk7XG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgdGhpcy50aHJvd05vdEZvdW5kRXJyb3IobmFtZSwgJ0Vuc2VtYmxlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHNMaXN0ID0gZW5zZW1ibGUubWV0YWRhdGEuZWxlbWVudHM/Lm1hcCgoZWxlbTogYW55KSA9PlxuICAgICAgYC0gJHtlbGVtLmVsZW1lbnRfbmFtZX0gKCR7ZWxlbS5lbGVtZW50X3R5cGV9KSAtICR7ZWxlbS5yb2xlfSwgcHJpb3JpdHk6ICR7ZWxlbS5wcmlvcml0eX0sIGFjdGl2YXRpb246ICR7ZWxlbS5hY3RpdmF0aW9ufWBcbiAgICApLmpvaW4oJ1xcbicpIHx8ICdObyBlbGVtZW50cyBjb25maWd1cmVkJztcblxuICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICBg8J+OrSAqKiR7ZW5zZW1ibGUubWV0YWRhdGEubmFtZX0qKmAsXG4gICAgICBgJHtlbnNlbWJsZS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgYGAsXG4gICAgICBgKipTdGF0dXMqKjogJHtlbnNlbWJsZS5nZXRTdGF0dXMoKX1gLFxuICAgICAgYCoqVmVyc2lvbioqOiAke2Vuc2VtYmxlLm1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMC4wJ31gLFxuICAgICAgYCoqQWN0aXZhdGlvbiBTdHJhdGVneSoqOiAkeyhlbnNlbWJsZS5tZXRhZGF0YSBhcyBhbnkpLmFjdGl2YXRpb25TdHJhdGVneSB8fCAnc2VxdWVudGlhbCd9YCxcbiAgICAgIGAqKkNvbmZsaWN0IFJlc29sdXRpb24qKjogJHsoZW5zZW1ibGUubWV0YWRhdGEgYXMgYW55KS5jb25mbGljdFJlc29sdXRpb24gfHwgJ2xhc3Qtd3JpdGUnfWAsXG4gICAgICBgKipDb250ZXh0IFNoYXJpbmcqKjogJHsoZW5zZW1ibGUubWV0YWRhdGEgYXMgYW55KS5jb250ZXh0U2hhcmluZyB8fCAnc2VsZWN0aXZlJ31gLFxuICAgICAgYCoqQWxsb3dzIE5lc3RpbmcqKjogJHsoZW5zZW1ibGUubWV0YWRhdGEgYXMgYW55KS5hbGxvd05lc3RlZCA/ICdZZXMnIDogJ05vJ31gLFxuICAgICAgYCoqTWF4IE5lc3RpbmcgRGVwdGgqKjogJHsoZW5zZW1ibGUubWV0YWRhdGEgYXMgYW55KS5tYXhOZXN0aW5nRGVwdGggfHwgNX1gLFxuICAgICAgYGAsXG4gICAgICBgKipFbGVtZW50cyoqICgke2Vuc2VtYmxlLm1ldGFkYXRhLmVsZW1lbnRzPy5sZW5ndGggfHwgMH0pOmAsXG4gICAgICBlbGVtZW50c0xpc3RcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICB9XVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|