@dollhousemcp/mcp-server 2.0.16 → 2.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md.backup +18 -0
- package/dist/elements/BaseElement.d.ts +1 -0
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +7 -1
- package/dist/elements/agents/AgentManager.js +2 -2
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +17 -1
- package/dist/elements/base/ElementFileOperations.js +2 -2
- package/dist/elements/ensembles/EnsembleManager.js +3 -3
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +14 -3
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +3 -2
- package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/createElement.js +6 -2
- package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/editElement.js +6 -2
- package/dist/handlers/element-crud/helpers.d.ts +2 -0
- package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
- package/dist/handlers/element-crud/helpers.js +21 -2
- package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/IntrospectionResolver.js +34 -7
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +50 -14
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +3 -2
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/evaluatePermission.js +2 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +17 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +88 -4
- package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/AgentActivationStrategy.js +5 -1
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts +1 -0
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/BaseActivationStrategy.js +15 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +5 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.js +5 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.js +5 -1
- package/dist/handlers/strategies/SkillActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/SkillActivationStrategy.js +5 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.js +7 -2
- package/dist/persona/PersonaElement.js +2 -2
- package/dist/services/SerializationService.d.ts.map +1 -1
- package/dist/services/SerializationService.js +7 -1
- package/dist/types/elements/IElement.d.ts +9 -0
- package/dist/types/elements/IElement.d.ts.map +1 -1
- package/dist/types/elements/IElement.js +1 -1
- package/dist/utils/permissionHooks.d.ts +39 -3
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +651 -74
- package/dist/web/public/permissions.css +190 -2
- package/dist/web/public/permissions.js +209 -56
- package/dist/web/public/setup.js +452 -108
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +108 -17
- package/dist/web/routes/setupRoutes.d.ts +1 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +128 -42
- package/package.json +3 -1
- package/scripts/pretooluse-dollhouse.sh +39 -1
- package/scripts/pretooluse-vscode.sh +163 -0
- package/scripts/pretooluse-windsurf.sh +166 -4
- package/server.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAMpE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAInD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAErG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ import { PathValidator } from '../../security/pathValidator.js';
|
|
|
29
29
|
import { ElementEventDispatcher } from '../../events/ElementEventDispatcher.js';
|
|
30
30
|
import { ElementTransactionScope } from './ElementTransactionScope.js';
|
|
31
31
|
import { ElementStorageLayer } from '../../storage/ElementStorageLayer.js';
|
|
32
|
+
import { getGatekeeperAuthoringErrors } from '../../handlers/mcp-aql/policies/ElementPolicies.js';
|
|
32
33
|
import { getValidatedScanCooldown, getValidatedElementCacheTTL, getValidatedPathCacheTTL } from '../../config/performance-constants.js';
|
|
33
34
|
const DEFAULT_ELEMENT_CACHE_TTL_MS = getValidatedElementCacheTTL();
|
|
34
35
|
const DEFAULT_PATH_CACHE_TTL_MS = getValidatedPathCacheTTL();
|
|
@@ -403,6 +404,12 @@ export class BaseElementManager {
|
|
|
403
404
|
* fail to load, so rejecting it on write prevents permanently broken elements.
|
|
404
405
|
*/
|
|
405
406
|
validateSerializedContent(content) {
|
|
407
|
+
const validateGatekeeperMetadata = (record, sourceLabel) => {
|
|
408
|
+
const errors = getGatekeeperAuthoringErrors(record);
|
|
409
|
+
if (errors.length > 0) {
|
|
410
|
+
throw new Error(`Invalid gatekeeper policy in serialized ${this.getElementLabel()} ${sourceLabel}: ${[...new Set(errors)].join('; ')}`);
|
|
411
|
+
}
|
|
412
|
+
};
|
|
406
413
|
// Extract frontmatter if present (SonarCloud S6594: use RegExp.exec)
|
|
407
414
|
const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
408
415
|
const frontmatterMatch = frontmatterRegex.exec(content);
|
|
@@ -429,6 +436,8 @@ export class BaseElementManager {
|
|
|
429
436
|
`Review the element's metadata and instructions for suspicious anchor/alias patterns.`, 'critical');
|
|
430
437
|
}
|
|
431
438
|
}
|
|
439
|
+
const frontmatterData = SecureYamlParser.parseRawYaml(yamlContent, SECURITY_LIMITS.MAX_YAML_LENGTH);
|
|
440
|
+
validateGatekeeperMetadata(frontmatterData, 'frontmatter');
|
|
432
441
|
// Body content validation with element type context
|
|
433
442
|
const contentContext = BaseElementManager.ELEMENT_TYPE_TO_CONTEXT[this.elementType];
|
|
434
443
|
const bodyValidation = ContentValidator.validateAndSanitize(bodyContent, {
|
|
@@ -438,6 +447,13 @@ export class BaseElementManager {
|
|
|
438
447
|
throw new SecurityError(`Critical security threat detected in serialized body content: ${bodyValidation.detectedPatterns?.join(', ')}`, 'critical');
|
|
439
448
|
}
|
|
440
449
|
}
|
|
450
|
+
else if (this.elementType === ElementType.MEMORY) {
|
|
451
|
+
const rawYaml = SecureYamlParser.parseRawYaml(content, SECURITY_LIMITS.MAX_YAML_LENGTH);
|
|
452
|
+
validateGatekeeperMetadata(rawYaml, 'YAML root');
|
|
453
|
+
if (rawYaml.metadata && typeof rawYaml.metadata === 'object' && !Array.isArray(rawYaml.metadata)) {
|
|
454
|
+
validateGatekeeperMetadata(rawYaml.metadata, 'metadata');
|
|
455
|
+
}
|
|
456
|
+
}
|
|
441
457
|
}
|
|
442
458
|
/**
|
|
443
459
|
* List all available elements
|
|
@@ -1036,4 +1052,4 @@ export class BaseElementManager {
|
|
|
1036
1052
|
return result.errors.map(e => ({ field: 'general', message: e }));
|
|
1037
1053
|
}
|
|
1038
1054
|
}
|
|
1039
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3pCLE1BQU0sdUNBQXVDLENBQUM7QUFJL0MsTUFBTSw0QkFBNEIsR0FBRywyQkFBMkIsRUFBRSxDQUFDO0FBQ25FLE1BQU0seUJBQXlCLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztBQTJCN0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFnQixrQkFBa0I7SUFDNUIsZ0JBQWdCLENBQW1CO0lBQ25DLGVBQWUsQ0FBa0I7SUFDakMsY0FBYyxDQUF3QjtJQUN0QyxnQkFBZ0IsQ0FBb0I7SUFDcEMsVUFBVSxDQUFTO0lBRTdCOzs7T0FHRztJQUNPLFNBQVMsQ0FBbUI7SUFFdEMseUVBQXlFO0lBQy9ELFFBQVEsQ0FBYztJQUVoQyxtRUFBbUU7SUFDM0QsWUFBWSxDQUFtQjtJQUN0QixrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUN4RCxzQkFBc0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsY0FBYyxDQUFjO0lBQ25CLGVBQWUsQ0FBeUI7SUFDeEMsMEJBQTBCLENBQVU7SUFDcEMsV0FBVyxDQUFjO0lBQ3pCLFlBQVksQ0FBcUI7SUFDL0IsYUFBYSxDQUFpQjtJQUVqRDswRkFDc0Y7SUFDOUUsTUFBTSxDQUFVLHVCQUF1QixHQUF3RjtRQUNySSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTO1FBQ2hDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU87UUFDNUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVTtRQUNsQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO1FBQzVCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVE7S0FDL0IsQ0FBQztJQUVpQixZQUFZLENBQWdCO0lBRS9DOzs7T0FHRztJQUNjLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUUzRTs7OztPQUlHO0lBQ2MsbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUV6RDs7Ozs7OztPQU9HO0lBQ08scUJBQXFCLENBQUMsUUFBZ0I7UUFDOUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFRRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsc0JBQXNCLENBQUMsWUFBb0I7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUNoQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxZQUFvQjtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxJQUFjLFVBQVU7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDeEIsTUFBTSxDQUFVLHNCQUFzQixHQUFHLElBQUksQ0FBQztJQUM5QyxNQUFNLENBQVUsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBRW5EOzs7Ozs7OztPQVFHO0lBQ0gsWUFDRSxXQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsVUFBcUMsRUFBRSxFQUN2QyxxQkFBNEMsRUFDNUMsa0JBQXNDO1FBRXRDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLHFCQUFxQixDQUFDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBRTNDLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxJQUFJLDRCQUE0QixDQUFDO1FBQ2hGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUkseUJBQXlCLENBQUM7UUFDdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBRXpDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZO1lBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBYSxDQUFDLE9BQU8sRUFBRTtZQUNwQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUk7WUFDOUIsSUFBSSxFQUFFLFlBQVksV0FBVyxFQUFFO1lBQy9CLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxzQkFBc0I7WUFDbEQsV0FBVyxFQUFFLEVBQUUsRUFBRSw2QkFBNkI7WUFDOUMsS0FBSyxFQUFFLGVBQWU7WUFDdEIsS0FBSyxFQUFFLGFBQWE7U0FDckIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFFBQVEsQ0FBUztZQUN2QyxJQUFJLEVBQUUsYUFBYSxXQUFXLEVBQUU7WUFDaEMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLG1CQUFtQjtZQUMvQyxXQUFXLEVBQUUsRUFBRSxFQUFFLDZCQUE2QjtZQUM5QyxLQUFLLEVBQUUsWUFBWTtZQUNuQixLQUFLLEVBQUUsYUFBYTtTQUNyQixDQUFDLENBQUM7UUFFSCw0Q0FBNEM7UUFDNUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUMvQyxDQUFDO2FBQU0sSUFBSSxPQUFRLElBQUksQ0FBQyxnQkFBd0IsQ0FBQyxhQUFhLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDOUUsSUFBSSxDQUFDLFVBQVUsR0FBSSxJQUFJLENBQUMsZ0JBQXdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYiwyQ0FBMkMsV0FBVyxJQUFJO2dCQUMxRCxnRUFBZ0UsQ0FDakUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksc0JBQXNCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMvRixJQUFJLENBQUMsMEJBQTBCO1lBQzdCLE9BQU8sQ0FBQywwQkFBMEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixLQUFLLE1BQU0sQ0FBQztRQUU5RixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsS0FBSyxNQUFNLENBQUM7UUFDeEcsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUN4RCxJQUFJLENBQUMsVUFBVSxFQUNmLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGtCQUFrQixDQUFDLHFCQUE0QztRQUN2RSxPQUFPLElBQUksbUJBQW1CLENBQUMscUJBQXFCLEVBQUU7WUFDcEQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdEMsY0FBYyxFQUFFLHdCQUF3QixFQUFFO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFTRDs7T0FFRztJQUNPLDBCQUEwQjtRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFnQjtRQUN6QixNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sYUFBYSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBRW5DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN2QixvQkFBb0IsRUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUNuRSxDQUFDO1FBRUYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDeEYsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLE9BQU87YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsOEVBQThFO1lBQzlFLGlFQUFpRTtZQUNqRSxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLGdEQUFnRCxJQUFJLENBQUMsV0FBVyxzREFBc0QsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcE8sQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUVuRixxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV4RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU3RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFekMsbUVBQW1FO1lBQ25FLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxZQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVyRixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FDNUIsc0JBQXNCLEVBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQzVFLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDREQUE0RDtZQUM1RCw2REFBNkQ7WUFDN0QsMEVBQTBFO1lBQzFFLHdFQUF3RTtZQUN4RSxNQUFNLGNBQWMsR0FBSSxLQUErQixDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7WUFDMUUsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBRTFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDeEQsYUFBYSxHQUFHLFFBQVEsRUFBRSxNQUFNLEtBQUssTUFBTSxDQUFDO2dCQUU1QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7b0JBQ3JDLFFBQVEsRUFBRSxZQUFZO29CQUN0QixNQUFNO29CQUNOLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2lCQUN4RSxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDL0YsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUM1QixvQkFBb0IsRUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDMUUsQ0FBQztnQkFDRixNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsWUFBWSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssdUJBQXVCLENBQUMsSUFBNkIsRUFBRSxRQUFnQjtRQUM3RSxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFFOUIsOENBQThDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixxREFBcUQ7WUFDckQsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELGlCQUFpQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxDQUNULG9CQUFvQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxRQUFRLEtBQUs7Z0JBQ3ZFLDZCQUE2QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ25ELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLElBQVk7UUFDNUIsb0RBQW9EO1FBQ3BELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdEQsSUFBSSxRQUFRLEtBQUssSUFBSTtnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNGLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFVLEVBQUUsUUFBZ0I7UUFDckMsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRixNQUFNLGFBQWEsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV2RixlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPO1lBQ3ZDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUU7WUFDL0csY0FBYyxFQUFFO2dCQUNkLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ25DLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQy9CLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87YUFDbEM7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsb0JBQW9CLEVBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQzVFLENBQUM7UUFFRixXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUM1QixzQkFBc0IsRUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDNUUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzVCLG9CQUFvQixFQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDbkYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0RSxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVyRCxtRkFBbUY7WUFDbkYsa0ZBQWtGO1lBQ2xGLGdGQUFnRjtZQUNoRixJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFeEMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFbEYsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxXQUFXLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx5QkFBeUIsQ0FBQyxPQUFlO1FBQy9DLHFFQUFxRTtRQUNyRSxNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO1FBQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWxFLGlFQUFpRTtZQUNqRSxzRUFBc0U7WUFDdEUsMkVBQTJFO1lBQzNFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsc0VBQXNFO1lBQ3RFLG9EQUFvRDtZQUNwRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDdkQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO3dCQUMvQixJQUFJLEVBQUUsd0JBQXdCO3dCQUM5QixRQUFRLEVBQUUsVUFBVTt3QkFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLDRCQUE0Qjt3QkFDNUQsT0FBTyxFQUFFLDREQUE0RCxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7d0JBQzdGLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFO3FCQUM3QyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxJQUFJLGFBQWEsQ0FDckIsY0FBYyxJQUFJLENBQUMsZUFBZSxFQUFFLHFEQUFxRDt3QkFDekYsc0ZBQXNGLEVBQ3RGLFVBQVUsQ0FDWCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsb0RBQW9EO1lBQ3BELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRixNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3ZFLGNBQWM7YUFDZixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sSUFBSSxjQUFjLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLElBQUksYUFBYSxDQUNyQixpRUFBaUUsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUM5RyxVQUFVLENBQ1gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDO1lBQ0gsMEJBQTBCO1lBQzFCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTNELHNFQUFzRTtZQUN0RSwyRUFBMkU7WUFDM0UsaUZBQWlGO1lBQ2pGLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVDLEtBQUssTUFBTSxPQUFPLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbEQsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBRWhGLHdFQUF3RTtZQUN4RSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXpFLDREQUE0RDtZQUM1RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2hDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUM7b0JBQ0gsb0VBQW9FO29CQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDakUsSUFBSSxNQUFNO3dCQUFFLE9BQU8sTUFBTSxDQUFDO29CQUMxQiw4REFBOEQ7b0JBQzlELE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxrREFBa0Q7b0JBQ2xELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBRUYscUNBQXFDO1lBQ3JDLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBbUIsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQVEsQ0FBQztRQUNwRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyx1REFBdUQsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQWtDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQWtDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQWtCO1FBQ2pDLDJEQUEyRDtRQUMzRCx3RUFBd0U7UUFDeEUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQztnQkFBQyxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsdUVBQXVFO1FBQ3ZFLGtDQUFrQztRQUNsQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO1FBRUQsaUVBQWlFO1FBQ2pFLG9FQUFvRTtRQUNwRSx1RUFBdUU7UUFDdkUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUN6QyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQseURBQXlEO1FBQ3pELDJEQUEyRDtRQUMzRCxvRUFBb0U7UUFDcEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLG9CQUFvQjtZQUNoRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQzFELENBQUMsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBa0I7UUFDMUMsa0VBQWtFO1FBQ2xFLHNFQUFzRTtRQUN0RSx5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsVUFBVTtZQUNWLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3pDLDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO1NBQ3BDLENBQUM7UUFFRixLQUFLLE1BQU0sUUFBUSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osT0FBTyxPQUFPLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQWtCO1FBQzVDLDJDQUEyQztRQUMzQyxxRUFBcUU7UUFDckUsTUFBTSxhQUFhLEdBQUc7WUFDcEIsb0ZBQW9GO1lBQ3BGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUM7WUFDbkMsNENBQTRDO1lBQzVDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3pDLGtEQUFrRDtZQUNsRCxVQUFVO1NBQ1gsQ0FBQztRQUVGLEtBQUssTUFBTSxRQUFRLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUMsbURBQW1EO2dCQUNuRCxpRkFBaUY7Z0JBQ2pGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLGtCQUFrQixLQUFLLG9CQUFvQjtvQkFDM0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRTtvQkFDaEUsT0FBTyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDOUIsT0FBTyxPQUFPLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztnQkFDaEIsdURBQXVEO2dCQUN2RCxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLE9BQVU7UUFDakIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUMzQixlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksU0FBUztZQUN6QyxPQUFPLEVBQUUsd0JBQXdCLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxRQUFRLEVBQUU7U0FDdkUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRixNQUFNLGFBQWEsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV2RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsc0JBQXNCLEVBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FDbkUsQ0FBQztRQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FDNUIsd0JBQXdCLEVBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FDbkUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzVCLHNCQUFzQixFQUN0QixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUMxRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN4RixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLDhCQUE4QixJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbkUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVM7aUJBQzFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLFFBQWdCO1FBQzNCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM3QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFeEUsT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sbUJBQW1CLENBQUMsUUFBZ0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFnQjtRQUNyRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLEdBQUcsSUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQy9HLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsZUFBZSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsZUFBZSxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsc0JBQXNCO1FBQ3RCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRXBFLElBQUksQ0FBQztZQUNILHdFQUF3RTtZQUN4RSxNQUFNLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTNFLHFGQUFxRjtZQUNyRixPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxDQUFDO1FBQzVELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLDhCQUE4QixDQUFDLFlBQW9CO1FBQ3pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sdUJBQXVCLENBQUMsWUFBb0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxZQUFvQixFQUFFLFlBQW9CO1FBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEYsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLHNCQUFzQjtTQUN2RCxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRTtZQUN6RCxjQUFjLEVBQUUsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM3RSxDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxrQkFBa0IsQ0FBQyxNQUs1QjtRQUNDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoRyxPQUFPO1lBQ0wsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixTQUFTO1lBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ2pFLFVBQVU7WUFDVixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxZQUFvQjtRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsTUFBTSxhQUFhLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzVCLHlCQUF5QixFQUN6QixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQ25FLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3BDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRTtvQkFDdEQsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO29CQUM3QixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUs7aUJBQ3RELENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFHRDs7OztPQUlHO0lBQ08sWUFBWSxDQUFDLE9BQVUsRUFBRSxRQUFnQjtRQUNqRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEQsNkVBQTZFO1FBQzdFLGlGQUFpRjtRQUNqRixrRkFBa0Y7UUFDbEYsOEVBQThFO1FBQzlFLG1EQUFtRDtRQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxJQUFJLFVBQVUsSUFBSSxVQUFVLEtBQUssT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLHNEQUFzRDtZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO1lBQzFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFFYixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUU7Z0JBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztnQkFDbEMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFlBQVksRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRTtnQkFDekMsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0NBQStDLEVBQUU7Z0JBQzVELEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM3RCxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3JCLFFBQVEsRUFBRSxZQUFZO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxLQUFLLENBQUMsWUFBWTtRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsNkNBQTZDO1FBQzdFLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxLQUFLLE1BQU0sT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzFELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sYUFBYSxDQUFDLFFBQWdCO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV0RCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLFNBQVMsU0FBUyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sYUFBYTtRQUNyQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0MsT0FBTztZQUNMLFlBQVksRUFBRSxhQUFhLENBQUMsSUFBSTtZQUNoQyxZQUFZLEVBQUUsU0FBUyxDQUFDLElBQUk7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPO1lBQ0wsRUFBRSxJQUFJLEVBQUUsWUFBWSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUE2QixFQUFFO1lBQ3RGLEVBQUUsSUFBSSxFQUFFLGFBQWEsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBaUMsRUFBRTtTQUM1RixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU87UUFDWixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsaUNBQWlDO0lBQ2pDLCtDQUErQztJQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNPLGlCQUFpQixDQUFDLElBQVk7UUFDdEMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLElBQUk7WUFDVCx3RkFBd0Y7YUFDdkYsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQztZQUNwQyxzREFBc0Q7YUFDckQsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7WUFDeEIsK0JBQStCO2FBQzlCLFdBQVcsRUFBRTtZQUNkLHdFQUF3RTthQUN2RSxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQztZQUM1QixnREFBZ0Q7YUFDL0MsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDcEIsNENBQTRDO2FBQzNDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNPLGtCQUFrQixDQUFDLElBQVk7UUFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsY0FBYyxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFnQkQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWEsRUFBRSxPQUFpQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZUVsZW1lbnRNYW5hZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnQgbWFuYWdlcnNcbiAqXG4gKiBQcm92aWRlcyBjb21tb24gQ1JVRCBvcGVyYXRpb25zIGZvciBhbGwgZWxlbWVudCB0eXBlcyB1c2luZyB0aGVcbiAqIFRlbXBsYXRlIE1ldGhvZCBQYXR0ZXJuOlxuICogLSBEZWZpbmVzIHRoZSBza2VsZXRvbiBvZiBvcGVyYXRpb25zIGluIGJhc2UgY2xhc3NcbiAqIC0gTGV0cyBzdWJjbGFzc2VzIG92ZXJyaWRlIHNwZWNpZmljIHN0ZXBzIHdpdGhvdXQgY2hhbmdpbmcgc3RydWN0dXJlXG4gKlxuICogU3ViY2xhc3NlczogU2tpbGxNYW5hZ2VyLCBUZW1wbGF0ZU1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlclxuICpcbiAqIFNFQ1VSSVRZOlxuICogMS4gQ1JJVElDQUw6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZC93cml0ZSBvcGVyYXRpb25zXG4gKiAyLiBISUdIOiBQYXRoIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAzLiBNRURJVU06IFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gKiA0LiBNRURJVU06IElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdob3V0XG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnRFdmVudERpc3BhdGNoZXIsIEVsZW1lbnRFdmVudFBheWxvYWQgfSBmcm9tICcuLi8uLi9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSB9IGZyb20gJy4vRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHR5cGUgRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9FbGVtZW50U3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRJbmRleEVudHJ5IH0gZnJvbSAnLi4vLi4vc3RvcmFnZS90eXBlcy5qcyc7XG5pbXBvcnQge1xuICBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24sXG4gIGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCxcbiAgZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMXG59IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDYWNoZU1lbW9yeUJ1ZGdldCB9IGZyb20gJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJztcbmltcG9ydCB0eXBlIHsgQmFja3VwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnO1xuXG5jb25zdCBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMKCk7XG5jb25zdCBERUZBVUxUX1BBVEhfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyB7XG4gIGVsZW1lbnREaXJPdmVycmlkZT86IHN0cmluZztcbiAgZXZlbnREaXNwYXRjaGVyPzogRWxlbWVudEV2ZW50RGlzcGF0Y2hlcjtcbiAgZWxlbWVudENhY2hlVFRMPzogbnVtYmVyO1xuICBwYXRoQ2FjaGVUVEw/OiBudW1iZXI7XG4gIGVuYWJsZUZpbGVXYXRjaGVyPzogYm9vbGVhbjtcbiAgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U/OiBib29sZWFuO1xuICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgbWVtb3J5QnVkZ2V0PzogQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xufVxuXG4vKipcbiAqIFJlY29yZCBvZiBhbiBlbGVtZW50IHRoYXQgZmFpbGVkIHRvIGxvYWQgKElzc3VlICM3MDgpLlxuICogU3RvcmVkIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoIFwiZmlsZSBub3QgZm91bmRcIiBmcm9tIFwiZmlsZSBpbnZhbGlkXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZEVsZW1lbnRSZWNvcmQge1xuICAvKiogUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkuICovXG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSByZWFzb24gdGhlIGVsZW1lbnQgd2FzIHJlamVjdGVkLiAqL1xuICByZWFzb246IHN0cmluZztcbiAgLyoqIElTTyB0aW1lc3RhbXAgb2YgbGFzdCBmYWlsZWQgbG9hZCBhdHRlbXB0LiAqL1xuICBmYWlsZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgaW1wbGVtZW50aW5nIGNvbW1vbiBlbGVtZW50IG1hbmFnZW1lbnQgb3BlcmF0aW9uc1xuICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGxvZ2ljIHZpYSBhYnN0cmFjdCBtZXRob2RzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRWxlbWVudE1hbmFnZXI8VCBleHRlbmRzIElFbGVtZW50PiBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxUPiB7XG4gIHByb3RlY3RlZCBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcm90ZWN0ZWQgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlT3BlcmF0aW9uczogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2U7XG4gIHByb3RlY3RlZCBlbGVtZW50RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogT2J0YWluZWQgZnJvbSBWYWxpZGF0aW9uUmVnaXN0cnkgZHVyaW5nIGNvbnN0cnVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRvcjogRWxlbWVudFZhbGlkYXRvcjtcblxuICAvLyBQcmltYXJ5IGNhY2hlOiBJRCDihpIgRWxlbWVudCAod2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcylcbiAgcHJvdGVjdGVkIGVsZW1lbnRzOiBMUlVDYWNoZTxUPjtcblxuICAvLyBSZXZlcnNlIGluZGV4OiBBYnNvbHV0ZSBGaWxlUGF0aCDihpIgRWxlbWVudCBJRCAod2l0aCBzaXplIGxpbWl0cylcbiAgcHJpdmF0ZSBmaWxlUGF0aFRvSWQ6IExSVUNhY2hlPHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudEdlbmVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBjYWNoZUdlbmVyYXRpb25Db3VudGVyID0gMDtcbiAgcHJpdmF0ZSB3YXRjaGVyQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnREaXNwYXRjaGVyOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xuXG4gIC8qKiBNYXAgcGx1cmFsIEVsZW1lbnRUeXBlIGVudW0gdmFsdWVzIHRvIHNpbmd1bGFyIENvbnRlbnRWYWxpZGF0b3IgY29udGV4dC5cbiAgICogIFBhcnRpYWwgYmVjYXVzZSBub3QgYWxsIGVsZW1lbnQgdHlwZXMgaGF2ZSBhIGNvbnRlbnQgY29udGV4dCAoZS5nLiwgZW5zZW1ibGVzKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQ6IFBhcnRpYWw8UmVjb3JkPEVsZW1lbnRUeXBlLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4+ID0ge1xuICAgIFtFbGVtZW50VHlwZS5QRVJTT05BXTogJ3BlcnNvbmEnLFxuICAgIFtFbGVtZW50VHlwZS5TS0lMTF06ICdza2lsbCcsXG4gICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJ3RlbXBsYXRlJyxcbiAgICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnYWdlbnQnLFxuICAgIFtFbGVtZW50VHlwZS5NRU1PUlldOiAnbWVtb3J5JyxcbiAgfTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmFnZUxheWVyOiBJU3RvcmFnZUxheWVyO1xuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBFbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBLZXllZCBieSByZWxhdGl2ZSBmaWxlIHBhdGggZm9yIGRlZHVwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBJbnZhbGlkRWxlbWVudFJlY29yZD4oKTtcblxuICAvKipcbiAgICogVHJhY2tzIGZpbGUgcGF0aHMgd2hvc2UgbG9hZCBmYWlsdXJlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGF0IGVycm9yIGxldmVsLlxuICAgKiBSZXBlYXRlZCBmYWlsdXJlcyB3aXRoIHRoZSBzYW1lIHJlYXNvbiBhcmUgZGVtb3RlZCB0byBkZWJ1ZyB0byBhdm9pZCBsb2cgZmxvb2RpbmcuXG4gICAqIENsZWFyZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIG9uIGRpc2sgb3IgbG9hZHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdXBwcmVzc2VkTG9hZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9zdCByZWNlbnQgbG9hZCgpIGZhaWx1cmUgZm9yIHRoaXMgcGF0aCB3YXMgc3VwcHJlc3NlZFxuICAgKiBiZWNhdXNlIGl0IHdhcyBhIHJlcGVhdCBvZiBhbiBhbHJlYWR5LWxvZ2dlZCBlcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgdG8gYXZvaWQgZHVwbGljYXRlIHNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFJlbGF0aXZlIGZpbGUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5XG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVycm9yIGZvciB0aGlzIHBhdGggaXMgY3VycmVudGx5IHN1cHByZXNzZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0xvYWRFcnJvclN1cHByZXNzZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuaGFzKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZnRlckxvYWQ/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYmVmb3JlU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBhZnRlclNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgZmluZEJ5SWRlbnRpZmllcj8oaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJvdGVjdGVkIGNhbkRlbGV0ZT8oZWxlbWVudDogVCk6IFByb21pc2U8eyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgZGVsZXRpbmcgYSBmaWxlIChtb3ZlcyBmaWxlIHRvIGJhY2t1cCBkaXIpLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9yaWdpbmFsIGZpbGUgd2FzIG1vdmVkIChjYWxsZXIgc2hvdWxkIHNraXAgZGVsZXRlRmlsZSkuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuICEhcmVzdWx0Lm1vdmVkT3JpZ2luYWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyIGZvciBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBlbWl0IGN1c3RvbSBldmVudHMuXG4gICAqXG4gICAqIEJhc2VFbGVtZW50TWFuYWdlciBoYW5kbGVzIHN0YW5kYXJkIGxpZmVjeWNsZSBldmVudHMgKGxvYWQsIHNhdmUsIGRlbGV0ZSkgYXV0b21hdGljYWxseS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgZ2V0dGVyIG9ubHkgd2hlbiB0aGV5IG5lZWQgdG8gZW1pdCBhZGRpdGlvbmFsIGRvbWFpbi1zcGVjaWZpY1xuICAgKiBldmVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIENSVUQgbGlmZWN5Y2xlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBQZXJzb25hTWFuYWdlciBlbWl0cyBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBldmVudHNcbiAgICogdGhpcy5kaXNwYXRjaGVyLmVtaXQoJ2VsZW1lbnQ6YWN0aXZhdGUnLCB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7Li4ufSkpO1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgbWFuYWdlclxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkaXNwYXRjaGVyKCk6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmV2ZW50RGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUgPSAxMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUEFUSF9DQUNIRV9TSVpFID0gMTAwMDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgLSBpbml0aWFsaXplcyBjb21tb24gZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICogQHBhcmFtIHBvcnRmb2xpb01hbmFnZXIgLSBQb3J0Zm9saW8gbWFuYWdlciBmb3IgZGlyZWN0b3J5IHJlc29sdXRpb25cbiAgICogQHBhcmFtIGZpbGVMb2NrTWFuYWdlciAtIEZpbGUgbG9jayBtYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgZmlsZVdhdGNoU2VydmljZVxuICAgKiBAcGFyYW0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlIC0gU2VydmljZSBmb3IgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uUmVnaXN0cnkgLSBSZWdpc3RyeSBmb3Igb2J0YWluaW5nIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9yc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgb3B0aW9uczogQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5XG4gICkge1xuICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBwb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gICAgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlID0gb3B0aW9ucy5maWxlV2F0Y2hTZXJ2aWNlO1xuICAgIHRoaXMuYmFja3VwU2VydmljZSA9IG9wdGlvbnMuYmFja3VwU2VydmljZTtcblxuICAgIC8vIEdldCB0aGUgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRvcihlbGVtZW50VHlwZSk7XG5cbiAgICBjb25zdCBlbGVtZW50Q2FjaGVUVEwgPSBvcHRpb25zLmVsZW1lbnRDYWNoZVRUTCA/PyBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TO1xuICAgIGNvbnN0IHBhdGhDYWNoZVRUTCA9IG9wdGlvbnMucGF0aENhY2hlVFRMID8/IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVM7XG4gICAgdGhpcy5tZW1vcnlCdWRnZXQgPSBvcHRpb25zLm1lbW9yeUJ1ZGdldDtcblxuICAgIGNvbnN0IG9uU2V0Q2FsbGJhY2sgPSB0aGlzLm1lbW9yeUJ1ZGdldFxuICAgICAgPyAoKSA9PiB0aGlzLm1lbW9yeUJ1ZGdldCEuZW5mb3JjZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbGVtZW50cyA9IG5ldyBMUlVDYWNoZTxUPih7XG4gICAgICBuYW1lOiBgZWxlbWVudHM6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogNTAsIC8vIE1heCA1ME1CIGZvciBlbGVtZW50IGNhY2hlXG4gICAgICB0dGxNczogZWxlbWVudENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVQYXRoVG9JZCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6IGBwYXRoSW5kZXg6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9QQVRIX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogMTAsIC8vIE1heCAxME1CIGZvciBwYXRoIG1hcHBpbmdzXG4gICAgICB0dGxNczogcGF0aENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjYWNoZXMgd2l0aCBnbG9iYWwgbWVtb3J5IGJ1ZGdldFxuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSBvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSBlbGVtZW50IGRpcmVjdG9yeSBmb3IgJHtlbGVtZW50VHlwZX0uIGAgK1xuICAgICAgICAnUHJvdmlkZSBhbiBlbGVtZW50RGlyT3ZlcnJpZGUgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgbWFuYWdlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gb3B0aW9ucy5ldmVudERpc3BhdGNoZXIgPz8gRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5nZXRTaGFyZWREaXNwYXRjaGVyKCk7XG4gICAgdGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA9XG4gICAgICBvcHRpb25zLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID8/IHByb2Nlc3MuZW52LkFVVE9fUkVMT0FEX09OX0VYVEVSTkFMX0NIQU5HRSA9PT0gJ3RydWUnO1xuXG4gICAgY29uc3QgZW5hYmxlV2F0Y2hlciA9IG9wdGlvbnMuZW5hYmxlRmlsZVdhdGNoZXIgPz8gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VOQUJMRV9GSUxFX1dBVENIRVIgPT09ICd0cnVlJztcbiAgICBpZiAoZW5hYmxlV2F0Y2hlciAmJiB0aGlzLmZpbGVXYXRjaFNlcnZpY2UpIHtcbiAgICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB0aGlzLmZpbGVXYXRjaFNlcnZpY2Uud2F0Y2hEaXJlY3RvcnkoXG4gICAgICAgIHRoaXMuZWxlbWVudERpcixcbiAgICAgICAgKHJlbGF0aXZlUGF0aCkgPT4gdGhpcy5oYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZUxheWVyID0gdGhpcy5jcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIHN0b3JhZ2UgbGF5ZXIuXG4gICAqIERlZmF1bHQgcmV0dXJucyBFbGVtZW50U3RvcmFnZUxheWVyIGZvciAubWQgZWxlbWVudHMuXG4gICAqIFN1YmNsYXNzZXMgKGUuZy4gTWVtb3J5TWFuYWdlcikgY2FuIG92ZXJyaWRlIHRvIHJldHVybiBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB7XG4gICAgICBlbGVtZW50RGlyOiB0aGlzLmVsZW1lbnREaXIsXG4gICAgICBmaWxlRXh0ZW5zaW9uOiB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBlbGVtZW50IHR5cGUgKGUuZy4sIFwic2tpbGxcIiwgXCJwZXJzb25hXCIpLlxuICAgKiBVc2VkIGluIGZpbGVuYW1lIGdlbmVyYXRpb24gKHtuYW1lfS17bGFiZWx9Lm1kKSBhbmQgZGlzcGxheSBzdHJpbmdzLlxuICAgKiBNdXN0IHJldHVybiB0aGUgc2luZ3VsYXIgZm9ybSDigJQgbm90IHRoZSBwbHVyYWwgRWxlbWVudFR5cGUgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhcGl0YWxpemVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgbGFiZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsKCk7XG4gICAgcmV0dXJuIGxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGFiZWwuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBlbGVtZW50IGZyb20gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IERlZmluZXMgdGhlIGFsZ29yaXRobSwgc3ViY2xhc3NlcyBjdXN0b21pemUgc3RlcHNcbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVMgKGluaGVyaXRlZCBmcm9tIG9yaWdpbmFsIG1hbmFnZXJzKTpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpsb2FkOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGBcbiAgICAgIH0pO1xuICAgICAgLy8gSXNzdWUgIzgxMDogUGFzcyBlbGVtZW50IHR5cGUgYXMgY29udGVudENvbnRleHQgc28gU2VjdXJlWWFtbFBhcnNlciBleGVtcHRzXG4gICAgICAvLyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBzZWN0aW9uIHRhZ3MgaW4gdGVtcGxhdGVzKVxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBpZiAoIWNvbnRlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTm8gY29udGVudENvbnRleHQgbWFwcGluZyBmb3IgZWxlbWVudFR5cGUgJyR7dGhpcy5lbGVtZW50VHlwZX0nIOKAlCBwYXJzaW5nIHdpdGhvdXQgY29udGV4dCBleGVtcHRpb25zLiBBdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGNvbnRlbnQsIHVuZGVmaW5lZCwgeyBjb250ZW50Q29udGV4dCB9KTtcblxuICAgICAgLy8gSXNzdWUgIzY5NTogRmlsbCBpbiBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAgICAvLyBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHNvIG9sZGVyIGVsZW1lbnRzIHdpdGggc3BhcnNlIGZyb250bWF0dGVyXG4gICAgICAvLyBkb24ndCBnZXQgcmVqZWN0ZWQuXG4gICAgICB0aGlzLm1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKHBhcnNlZC5kYXRhLCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyTG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyTG9hZChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBJc3N1ZSAjNzA4OiBDbGVhciBhbnkgcHJldmlvdXMgaW52YWxpZCByZWNvcmQgb24gc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBsb2FkZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElzc3VlICM3MDg6IFJlY29yZCB0aGUgZmFpbHVyZSBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgLy8gXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGV4aXN0cyBidXQgZmFpbGVkIHZhbGlkYXRpb25cIi5cbiAgICAgIC8vIE9ubHkgdHJhY2sgcGFyc2UvdmFsaWRhdGlvbiBlcnJvcnMg4oCUIEVOT0VOVCBtZWFucyB0aGUgZmlsZSBpcyBnZW51aW5lbHlcbiAgICAgIC8vIG1pc3NpbmcsIG5vdCBpbnZhbGlkLCBzbyB3ZSBtdXN0IG5vdCBwb2xsdXRlIHRoZSBpbnZhbGlkIG1hcCB3aXRoIGl0LlxuICAgICAgY29uc3QgaXNGaWxlTm90Rm91bmQgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJztcbiAgICAgIGxldCBpc1JlcGVhdEVycm9yID0gZmFsc2U7XG5cbiAgICAgIGlmICghaXNGaWxlTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW52YWxpZEVsZW1lbnRzLmdldChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpc1JlcGVhdEVycm9yID0gZXhpc3Rpbmc/LnJlYXNvbiA9PT0gcmVhc29uO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLnNldChyZWxhdGl2ZVBhdGgsIHtcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBmYWlsZWRBdDogaXNSZXBlYXRFcnJvciA/IGV4aXN0aW5nIS5mYWlsZWRBdCA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlcGVhdEVycm9yKSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5hZGQocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTdXBwcmVzc2VkIHJlcGVhdGVkIGxvYWQgZXJyb3IgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gJHtyZWxhdGl2ZVBhdGh9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgICAnZWxlbWVudDpsb2FkOmVycm9yJyxcbiAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBmcm9tICR7YWJzb2x1dGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY5NTogUHJlLWZpbGwgbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICAgKiBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHJ1bnMuIFRoaXMgaW1wbGVtZW50cyB0aGUgXCJ0b2xlcmFudCByZWFkZXJcIiBwYXR0ZXJuXG4gICAqIOKAlCBzdHJpY3Qgb24gb3V0cHV0LCBsZW5pZW50IG9uIGlucHV0IGZvciBvbGRlci9zcGFyc2UgZnJvbnRtYXR0ZXIuXG4gICAqXG4gICAqIE11dGF0ZXMgYGRhdGFgIGluIHBsYWNlLiBMb2dzIGEgd2FybmluZyBmb3IgZWFjaCBkZWZhdWx0ZWQgZmllbGQgc29cbiAgICogb3BlcmF0b3JzIGtub3cgd2hpY2ggZmlsZXMgbmVlZCB1cGRhdGluZy5cbiAgICovXG4gIHByaXZhdGUgbWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtaWdyYXRlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGlzIG1hbmFnZXIncyBlbGVtZW50IHR5cGVcbiAgICBpZiAoIWRhdGEudHlwZSkge1xuICAgICAgLy8gRWxlbWVudFR5cGUgaXMgcGx1cmFsICgncGVyc29uYXMnLCAnc2tpbGxzJywgZXRjLilcbiAgICAgIC8vIFNvbWUgbWFuYWdlcnMgZXhwZWN0IHNpbmd1bGFyICgncGVyc29uYScsICdhZ2VudCcpLCBzb21lIHBsdXJhbC5cbiAgICAgIC8vIFNldCB0aGUgcGx1cmFsIGZvcm0g4oCUIHBhcnNlTWV0YWRhdGEoKSBoYW5kbGVzIG5vcm1hbGl6YXRpb24uXG4gICAgICBkYXRhLnR5cGUgPSB0aGlzLmVsZW1lbnRUeXBlO1xuICAgICAgbWlncmF0ZWQucHVzaCgndHlwZScpO1xuICAgIH1cblxuICAgIC8vIEluZmVyIG5hbWUgZnJvbSBmaWxlbmFtZSAoc3RyaXAgZXh0ZW5zaW9uLCB1bi1zbHVnaWZ5KVxuICAgIGlmICghZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGRhdGEubmFtZSA9IGJhc2VuYW1lO1xuICAgICAgbWlncmF0ZWQucHVzaCgnbmFtZScpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdmVyc2lvblxuICAgIGlmICghZGF0YS52ZXJzaW9uKSB7XG4gICAgICBkYXRhLnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgbWlncmF0ZWQucHVzaCgndmVyc2lvbicpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYXV0aG9yXG4gICAgaWYgKCFkYXRhLmF1dGhvcikge1xuICAgICAgZGF0YS5hdXRob3IgPSAndW5rbm93bic7XG4gICAgICBtaWdyYXRlZC5wdXNoKCdhdXRob3InKTtcbiAgICB9XG5cbiAgICBpZiAobWlncmF0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbVG9sZXJhbnRSZWFkZXJdICR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBcIiR7ZmlsZVBhdGh9XCI6IGAgK1xuICAgICAgICBgZGVmYXVsdGVkIG1pc3NpbmcgZmllbGRzOiAke21pZ3JhdGVkLmpvaW4oJywgJyl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogUmV0dXJucyBlbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBDYWxsZXJzIGNhbiB1c2UgdGhpcyB0byByZXBvcnQgaW52YWxpZCBlbGVtZW50cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGhpZGluZyB0aGVtLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnRzKCk6IEludmFsaWRFbGVtZW50UmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5pbnZhbGlkRWxlbWVudHMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IENoZWNrIGlmIGEgc3BlY2lmaWMgZmlsZSBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogVXNlZCBieSBnZXRfZWxlbWVudCB0byBkaXN0aW5ndWlzaCBcIm5vdCBmb3VuZFwiIGZyb20gXCJpbnZhbGlkXCIuXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudChuYW1lOiBzdHJpbmcpOiBJbnZhbGlkRWxlbWVudFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgYnkgZXhhY3QgcGF0aCBtYXRjaCBhbmQgYnkgbmFtZS1iYXNlZCBtYXRjaFxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCByZWNvcmRdIG9mIHRoaXMuaW52YWxpZEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZmlsZVBhdGggPT09IG5hbWUpIHJldHVybiByZWNvcmQ7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGlmIChiYXNlbmFtZSA9PT0gbmFtZSB8fCB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGJhc2VuYW1lKSA9PT0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gZWxlbWVudCB0byBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogQ29tbW9uIHNhdmUgbG9naWMgd2l0aCBob29rcyBmb3IgY3VzdG9taXphdGlvblxuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUzpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogLSBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmdcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfRURJVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zYXZlYCxcbiAgICAgIGRldGFpbHM6IGBTYXZpbmcgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9IHYke2VsZW1lbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZ2V0RWxlbWVudExhYmVsKCksXG4gICAgICAgIGF1dGhvcjogZWxlbWVudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIHZlcnNpb246IGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpzYXZlOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkUm9sbGJhY2soYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmJlZm9yZVNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgpO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAvLyBGaXggIzkwODogVmFsaWRhdGUgc2VyaWFsaXplZCBjb250ZW50IGJlZm9yZSB3cml0aW5nIChzeW1tZXRyaWMgd2l0aCByZWFkIHBhdGgpLlxuICAgICAgLy8gUmVhZCBwYXRoIHZhbGlkYXRlcyB2aWEgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIOKGkiBDb250ZW50VmFsaWRhdG9yOyB3cml0ZSBwYXRoXG4gICAgICAvLyBtdXN0IGFwcGx5IHRoZSBzYW1lIGNoZWNrcyB0byBwcmV2ZW50IHNhdmluZyBjb250ZW50IHRoYXQgd291bGQgZmFpbCB0byBsb2FkLlxuICAgICAgdGhpcy52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShhYnNvbHV0ZVBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBzYXZlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2VyaWFsaXplZCBlbGVtZW50IGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay5cbiAgICogRml4ICM5MDg6IE1pcnJvcnMgdGhlIHJlYWQtcGF0aCB2YWxpZGF0aW9uIGZyb20gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpXG4gICAqIHRvIGVuc3VyZSB3cml0ZSDihpIgcmVhZCBzeW1tZXRyeS4gQ29udGVudCB0aGF0IGZhaWxzIHRoaXMgY2hlY2sgd291bGQgYWxzb1xuICAgKiBmYWlsIHRvIGxvYWQsIHNvIHJlamVjdGluZyBpdCBvbiB3cml0ZSBwcmV2ZW50cyBwZXJtYW5lbnRseSBicm9rZW4gZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBpZiBwcmVzZW50IChTb25hckNsb3VkIFM2NTk0OiB1c2UgUmVnRXhwLmV4ZWMpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJSZWdleCA9IC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vO1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBmcm9udG1hdHRlclJlZ2V4LmV4ZWMoY29udGVudCk7XG5cbiAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgY29uc3QgYm9keUNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhmcm9udG1hdHRlck1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgIC8vIFlBTUwgYm9tYiBkZXRlY3Rpb24gKG1pcnJvcnMgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIHN0ZXAgNCkuXG4gICAgICAvLyBPbmx5IHJ1biB3aGVuIFlBTUwgaXMgdW5kZXIgTUFYX1lBTUxfTEVOR1RIICg2NEtCKSDigJQgdGhlIHNhbWUgbGltaXRcbiAgICAgIC8vIHVzZWQgYnkgdGhlIHJlYWQgcGF0aCBpbiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkuIHZhbGlkYXRlWWFtbENvbnRlbnQoKVxuICAgICAgLy8gaW5jbHVkZXMgaXRzIG93biBzaXplIGNoZWNrIGludGVybmFsbHksIGFuZCB3ZSBpbnRlbnRpb25hbGx5IHNraXAgc2l6ZVxuICAgICAgLy8gZW5mb3JjZW1lbnQgb24gdGhlIHdyaXRlIHBhdGggYmVjYXVzZSB0aGUgc2VyaWFsaXplciBtYXkgcHJvZHVjZSBsYXJnZVxuICAgICAgLy8gZnJvbnRtYXR0ZXIgZm9yIGVsZW1lbnRzIHdpdGggbG9uZyBpbnN0cnVjdGlvbnMuIFRoZSByZWFkIHBhdGggd2lsbFxuICAgICAgLy8gcmVqZWN0IG92ZXJzaXplZCBZQU1MIG9uIHRoZSBuZXh0IGxvYWQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA8PSBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIKSB7XG4gICAgICAgIGlmICghQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxDb250ZW50KSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnRgLFxuICAgICAgICAgICAgZGV0YWlsczogYE1hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBvdXRwdXQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgeWFtbExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICAgIGBTZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQuIGAgK1xuICAgICAgICAgICAgYFJldmlldyB0aGUgZWxlbWVudCdzIG1ldGFkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHN1c3BpY2lvdXMgYW5jaG9yL2FsaWFzIHBhdHRlcm5zLmAsXG4gICAgICAgICAgICAnY3JpdGljYWwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCb2R5IGNvbnRlbnQgdmFsaWRhdGlvbiB3aXRoIGVsZW1lbnQgdHlwZSBjb250ZXh0XG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGNvbnN0IGJvZHlWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGJvZHlDb250ZW50LCB7XG4gICAgICAgIGNvbnRlbnRDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICBpZiAoIWJvZHlWYWxpZGF0aW9uLmlzVmFsaWQgJiYgYm9keVZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBzZXJpYWxpemVkIGJvZHkgY29udGVudDogJHtib2R5VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhdmFpbGFibGUgZWxlbWVudHNcbiAgICogU0VDVVJJVFk6IFVzZXMgUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoKSB3aGljaCBmaWx0ZXJzIHRlc3QgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxUW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFNjYW4gZm9yIGNoYW5nZXMg4oCUIHBvcHVsYXRlcyBpbmRleCBmb3IgbGlzdFN1bW1hcmllcygpL2ZpbmRCeU5hbWUoKVxuICAgICAgLy8gTm9uLWZhdGFsOiBzY2FuIGZhaWx1cmUgbXVzdCBuZXZlciBwcmV2ZW50IGxpc3QoKSBmcm9tIHJldHVybmluZyByZXN1bHRzXG4gICAgICAvLyBFdmljdCBzdGFsZSBjYWNoZSBlbnRyaWVzIHNvIHRoZSBjYWNoZSBjaGVjayBiZWxvdyBuZXZlciByZXR1cm5zIG91dGRhdGVkIGRhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5zY2FuKCk7XG4gICAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBbLi4uZGlmZi5tb2RpZmllZCwgLi4uZGlmZi5yZW1vdmVkXSkge1xuICAgICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCByZWxQYXRoKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic1BhdGgpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggeyAvKiBpbmRleCB1bmF2YWlsYWJsZSwgbGlzdCgpIGNvbnRpbnVlcyB3aXRob3V0IGNhY2hlIG9wdGltaXphdGlvbiAqLyB9XG5cbiAgICAgIC8vIFVzZSBQb3J0Zm9saW9NYW5hZ2VyIGZvciBhdXRob3JpdGF0aXZlIGZpbGUgbGlzdCArIHNlY3VyaXR5IGZpbHRlcmluZ1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKHRoaXMuZWxlbWVudFR5cGUpO1xuXG4gICAgICAvLyBMb2FkIGFsbCBlbGVtZW50cyBpbiBwYXJhbGxlbCwgY2hlY2tpbmcgY2FjaGUgYmVmb3JlIGRpc2tcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdCAoYXZvaWRzIGRpc2sgcmVhZCBpZiBlbGVtZW50IGlzIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGUpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgICAgICAgICAvLyBDYWNoZSBtaXNzIOKAlCByZWFkIGZyb20gZGlzayAocG9wdWxhdGVzIGNhY2hlIGZvciBuZXh0IHRpbWUpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gbG9hZCgpIGhhbmRsZXMgZXJyb3IgbG9nZ2luZyB3aXRoIGRlZHVwbGljYXRpb25cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgZmFpbGVkIGxvYWRzIGFuZCByZXR1cm5cbiAgICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIoKGUpOiBlIGlzIEF3YWl0ZWQ8VD4gPT4gZSAhPT0gbnVsbCkgYXMgVFtdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtsYWJlbH1zIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQsIHJldHVybmluZyBlbXB0eSBhcnJheWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsaXN0ICR7dGhpcy5lbGVtZW50VHlwZX1zOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBsaWdodHdlaWdodCBtZXRhZGF0YSBzdW1tYXJpZXMgd2l0aG91dCBsb2FkaW5nIGZ1bGwgZWxlbWVudHMuXG4gICAqIFVzZWZ1bCB3aGVuIG9ubHkgbmFtZXMvZGVzY3JpcHRpb25zL3RhZ3MgYXJlIG5lZWRlZC5cbiAgICovXG4gIGFzeW5jIGxpc3RTdW1tYXJpZXMoKTogUHJvbWlzZTxFbGVtZW50SW5kZXhFbnRyeVtdPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlTGF5ZXIubGlzdFN1bW1hcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IG5hbWUgb3IgSUQgd2l0aG91dCBsb2FkaW5nIGFsbCBlbGVtZW50c1xuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBmb3IgYWN0aXZhdGlvbiBmbG93XG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFuIG9wdGltaXplZCBsb29rdXAgdGhhdCB0cmllcyBjYWNoZSBmaXJzdCwgdGhlblxuICAgKiBhdHRlbXB0cyBkaXJlY3QgZmlsZSBhY2Nlc3MgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBmdWxsIGxpc3QoKSBzY2FuLlxuICAgKiBUaGlzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gbGlzdCgpIGZvciBsYXJnZSBwb3J0Zm9saW9zLlxuICAgKlxuICAgKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVFM6XG4gICAqIDEuIENhY2hlIGxvb2t1cCAtIE8oMSkgaWYgZWxlbWVudCB3YXMgcHJldmlvdXNseSBsb2FkZWRcbiAgICogMi4gRGlyZWN0IGZpbGUgYWNjZXNzIC0gTygxKSBmb3IgbmFtZS1iYXNlZCBsb29rdXBzXG4gICAqIDMuIEZ1bGwgc2NhbiBmYWxsYmFjayAtIE8obikgb25seSBpZiBhYm92ZSBtZXRob2RzIGZhaWxcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbGVtZW50IG5hbWUgb3IgSUQgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBFbGVtZW50IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYW1lKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZpcnN0LCB0cnkgZmluZGluZyBpbiBjYWNoZSBieSBpdGVyYXRpbmcgY2FjaGVkIGVsZW1lbnRzXG4gICAgLy8gVGhpcyBpcyBmYXN0IChPKGNhY2hlIHNpemUpKSBhbmQgd29ya3MgZm9yIHJlY2VudGx5IGFjY2Vzc2VkIGVsZW1lbnRzXG4gICAgY29uc3QgY2FjaGVkRWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEluQ2FjaGUoaWRlbnRpZmllcik7XG4gICAgaWYgKGNhY2hlZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFNlY29uZCwgdHJ5IHN0b3JhZ2UgbGF5ZXIgaW5kZXggKE8oMSkgbmFtZSBsb29rdXApXG4gICAgY29uc3QgaW5kZXhlZFBhdGggPSB0aGlzLnN0b3JhZ2VMYXllci5nZXRQYXRoQnlOYW1lKGlkZW50aWZpZXIpO1xuICAgIGlmIChpbmRleGVkUGF0aCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChpbmRleGVkUGF0aCk7IH0gY2F0Y2ggeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuICAgIH1cblxuICAgIC8vIFRoaXJkLCB0cnkgZGlyZWN0IGZpbGUgYWNjZXNzIHVzaW5nIHN0YW5kYXJkIG5hbWluZyBjb252ZW50aW9uXG4gICAgLy8gRWxlbWVudCBmaWxlcyBhcmUgdHlwaWNhbGx5IG5hbWVkOiBsb3dlcmNhc2UtbmFtZS13aXRoLWh5cGhlbnMue2V4dH1cbiAgICAvLyBUaGlzIGlzIE8oMSkgZmlsZSBzeXN0ZW0gbG9va3VwXG4gICAgY29uc3QgZGlyZWN0TG9hZEF0dGVtcHQgPSBhd2FpdCB0aGlzLnRyeURpcmVjdExvYWQoaWRlbnRpZmllcik7XG4gICAgaWYgKGRpcmVjdExvYWRBdHRlbXB0KSB7XG4gICAgICByZXR1cm4gZGlyZWN0TG9hZEF0dGVtcHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RvcmFnZSBsYXllciBoYXMgY29tcGxldGVkIGF0IGxlYXN0IG9uZSBzY2FuLCB0aGUgaW5kZXggaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBhIG1pc3MgbWVhbnMgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuIFNraXAgdGhlXG4gICAgLy8gZXhwZW5zaXZlIGxpc3QoKSBmYWxsYmFjayB0byBhdm9pZCBPKG4pIHJlc2NhbnMgb24gZXZlcnkgY2FjaGUgbWlzcy5cbiAgICBpZiAodGhpcy5zdG9yYWdlTGF5ZXIuaGFzQ29tcGxldGVkU2NhbigpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBGdWxsIGxpc3QoKSBzY2FuIChPKG4pIC0gbG9hZHMgYWxsIGVsZW1lbnRzKVxuICAgIC8vIE9ubHkgdXNlZCBvbiBmaXJzdCBhY2Nlc3MgYmVmb3JlIGFueSBzY2FuIGhhcyBjb21wbGV0ZWQuXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIGZpbmQgZWxlbWVudHMgZXZlbiB3aXRoIG5vbi1zdGFuZGFyZCBmaWxlIG5hbWluZy5cbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChlID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGUubWV0YWRhdGEubmFtZSkgPT09IG5vcm1hbGl6ZWRJZGVudGlmaWVyIHx8XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBlLmlkID09PSBpZGVudGlmaWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFNlYXJjaCBjYWNoZSBmb3IgZWxlbWVudCBieSBuYW1lIG9yIElEXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRJbkNhY2hlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIExSVUNhY2hlIGRvZXNuJ3QgcHJvdmlkZSBpdGVyYXRpb24sIGJ1dCB3ZSBjYW4gY2hlY2sgaWYgd2UgaGF2ZVxuICAgIC8vIGEgY2FjaGVkIHBhdGggZm9yIHRoaXMgaWRlbnRpZmllciBieSB0cnlpbmcgY29tbW9uIG5hbWluZyBwYXR0ZXJucy5cbiAgICAvLyBJTVBPUlRBTlQ6IGZpbGVQYXRoVG9JZCBzdG9yZXMgYWJzb2x1dGUgcGF0aHMgKHNldCBieSBjYWNoZUVsZW1lbnQgdmlhXG4gICAgLy8gcmVzb2x2ZUFic29sdXRlUGF0aCksIHNvIHdlIG11c3QgcmVzb2x2ZSB0byBhYnNvbHV0ZSBiZWZvcmUgbG9va3VwLlxuICAgIGNvbnN0IHBvc3NpYmxlRmlsZW5hbWVzID0gW1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGAke2lkZW50aWZpZXJ9JHt0aGlzLmdldEZpbGVFeHRlbnNpb24oKX1gLFxuICAgICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgY2FjaGUgbG9va3Vwc1xuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllcilcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBwb3NzaWJsZUZpbGVuYW1lcykge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGNhY2hlZElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkSWQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZ2V0KGNhY2hlZElkKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBUcnkgbG9hZGluZyBlbGVtZW50IGRpcmVjdGx5IGJ5IGNvbnN0cnVjdGluZyBleHBlY3RlZCBmaWxlbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlEaXJlY3RMb2FkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRyeSBsb2FkaW5nIHVzaW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnNcbiAgICAvLyBVc2UgdW5pZmllZCBub3JtYWxpemVGaWxlbmFtZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgLy8gUHJpbWFyeTogVXNlIHVuaWZpZWQgbm9ybWFsaXphdGlvbiAoaGFuZGxlcyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAgICB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShpZGVudGlmaWVyKSxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFzLWlzIHdpdGggZXh0ZW5zaW9uXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFscmVhZHkgaW5jbHVkZXMgZXh0ZW5zaW9uXG4gICAgICBpZGVudGlmaWVyXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMubG9hZChmaWxlUGF0aCk7XG4gICAgICAgIC8vIFZlcmlmeSB0aGUgbG9hZGVkIGVsZW1lbnQgbWF0Y2hlcyB0aGUgaWRlbnRpZmllclxuICAgICAgICAvLyBOb3JtYWxpemUgYm90aCBzaWRlcyBzbyBcIkNvZGUgUmV2aWV3XCIgKHNwYWNlcykgbWF0Y2hlcyBcImNvZGUtcmV2aWV3XCIgKGh5cGhlbnMpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXRhTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZE1ldGFOYW1lID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGZhaWxlZCB0byBsb2FkIC0gdHJ5IG5leHQgcGF0aFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRGVsZWdhdGVzIHRvIGVsZW1lbnQncyBvd24gdmFsaWRhdGUgbWV0aG9kXG4gICAqXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggYm90aCAndmFsaWQnIGFuZCAnaXNWYWxpZCcgcHJvcGVydGllcy5cbiAgICogICAgICAgICAgJ2lzVmFsaWQnIGlzIGRlcHJlY2F0ZWQgLSB1c2UgJ3ZhbGlkJyBmb3IgbmV3IGNvZGUuXG4gICAqL1xuICB2YWxpZGF0ZShlbGVtZW50OiBUKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbGVtZW50XG4gICAqIFNFQ1VSSVRZOiBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCBkZWxldGlvbiBvdXRzaWRlIGRpcmVjdG9yeVxuICAgKiBDQUNIRSBGSVg6IFVzZXMgZmlsZXBhdGgtYmFzZWQgY2FjaGUgcmVtb3ZhbCB0byBwcmV2ZW50IHN0YWxlIGVudHJpZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYCxcbiAgICAgIGRldGFpbHM6IGBBdHRlbXB0aW5nIHRvIGRlbGV0ZSAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2ZpbGVQYXRofWBcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmRlbGV0ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbkRlbGV0ZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50Rm9yVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMubG9hZEVsZW1lbnRTbmFwc2hvdChhYnNvbHV0ZVBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gYXdhaXQgdGhpcy5jYW5EZWxldGUoZWxlbWVudEZvclZhbGlkYXRpb24pO1xuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGVjaXNpb24ucmVhc29uID8/IGBEZWxldGlvbiBub3QgcGVybWl0dGVkIGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbW92ZWRUb0JhY2t1cCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoIW1vdmVkVG9CYWNrdXApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5kZWxldGVgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBkZWxldGVkOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzXG4gICAqL1xuICBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGFic29sdXRlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgICBpZiAoIXNhbml0aXplZCB8fCBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzYW5pdGl6ZWQuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoc2FuaXRpemVkKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5tZCcsICcubWFya2Rvd24nLCAnLnR4dCcsICcueW1sJywgJy55YW1sJ107XG5cbiAgICAgIHJldHVybiBleHQgPT09ICcnIHx8IGFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBmaWxlIHBhdGggdG8gaXRzIGFic29sdXRlIGZvcm0gZm9yIGNhY2hlIGNvbnNpc3RlbmN5XG4gICAqIEVuc3VyZXMgY29uc2lzdGVudCBwYXRoIGhhbmRsaW5nIGFjcm9zcyByZWxhdGl2ZS9hYnNvbHV0ZSBwYXRoc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpXG4gICAgICA6IHBhdGgubm9ybWFsaXplKHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7IHJlbGF0aXZlUGF0aDogc3RyaW5nOyBhYnNvbHV0ZVBhdGg6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICBpZiAoIXNhbml0aXplZFBhdGggfHwgc2FuaXRpemVkUGF0aC50cmltKCkubGVuZ3RoID09PSAwIHx8IHNhbml0aXplZFBhdGggPT09ICcuJyB8fCBzYW5pdGl6ZWRQYXRoID09PSBwYXRoLnNlcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aDogZW1wdHkgcGF0aCBpcyBub3QgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJzb2x1dGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRocyBhcmUgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGggKHJlbW92ZSByZWR1bmRhbnQgc2VwYXJhdG9ycywgcmVzb2x2ZSAuIGFuZCAuLilcbiAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpdmUgPSBwYXRoLm5vcm1hbGl6ZShzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEJ1aWxkIGFic29sdXRlIHBhdGhcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBub3JtYWxpemVkUmVsYXRpdmUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIFdJVEhPVVQgcmVzb2x2aW5nIHN5bWxpbmtzIC0ganVzdCBjaGVjayBzZWN1cml0eSBjb25zdHJhaW50c1xuICAgICAgYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZUVsZW1lbnRQYXRoT25seShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgaW5wdXQgYXMgcmVsYXRpdmVQYXRoIChpdCdzIGFscmVhZHkgcmVsYXRpdmUpIGFuZCBjb21wdXRlZCBhYnNvbHV0ZVBhdGhcbiAgICAgIHJldHVybiB7IHJlbGF0aXZlUGF0aDogbm9ybWFsaXplZFJlbGF0aXZlLCBhYnNvbHV0ZVBhdGggfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6ICR7cmVhc29ufWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpKTtcbiAgICBpZiAoIWVsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0KGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdGVjdGVkIGNhY2hlIGxvb2t1cCBieSBhYnNvbHV0ZSBwYXRoLlxuICAgKiBBbGxvd3Mgc3ViY2xhc3NlcyB3aXRoIGN1c3RvbSBsb2FkKCkgb3ZlcnJpZGVzIChlLmcuIE1lbW9yeU1hbmFnZXIpXG4gICAqIHRvIGNoZWNrIHRoZSBMUlUgY2FjaGUgYmVmb3JlIHJlLXJlYWRpbmcgZnJvbSBkaXNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENhY2hlZEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoOiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRFbGVtZW50U25hcHNob3RgXG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKHJhdywgdW5kZWZpbmVkLCB7XG4gICAgICBjb250ZW50Q29udGV4dDogQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUW3RoaXMuZWxlbWVudFR5cGVdLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IHBheWxvYWQgZm9yIGVsZW1lbnQgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICpcbiAgICogVGhpcyBoZWxwZXIgaXMgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgcGF5bG9hZFxuICAgKiBzdHJ1Y3R1cmUgd2hlbiBlbWl0dGluZyBjdXN0b20gZXZlbnRzIHZpYSB0aGUgZGlzcGF0Y2hlciBnZXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFdmVudCBwYXJhbWV0ZXJzIGluY2x1ZGluZyBjb3JyZWxhdGlvbiBJRCwgZWxlbWVudCwgZmlsZSBwYXRoLCBhbmQgb3B0aW9uYWwgZXJyb3JcbiAgICogQHJldHVybnMgRnVsbHktZm9ybWVkIEVsZW1lbnRFdmVudFBheWxvYWQgcmVhZHkgZm9yIGVtaXNzaW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRXZlbnRQYXlsb2FkKHBhcmFtczoge1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICBmaWxlUGF0aD86IHN0cmluZztcbiAgICBlbGVtZW50PzogVDtcbiAgICBlcnJvcj86IHVua25vd247XG4gIH0pOiBFbGVtZW50RXZlbnRQYXlsb2FkIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSBwYXJhbXMuZWxlbWVudD8uaWQ7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZ2V0KGVsZW1lbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHBhcmFtcy5jb3JyZWxhdGlvbklkLFxuICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICBlbGVtZW50SWQsXG4gICAgICBmaWxlUGF0aDogcGFyYW1zLmZpbGVQYXRoLFxuICAgICAgbWV0YWRhdGE6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIuc25hcHNob3RNZXRhZGF0YShwYXJhbXMuZWxlbWVudCksXG4gICAgICBnZW5lcmF0aW9uLFxuICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgIC8vIENsZWFyIGVycm9yIHN1cHByZXNzaW9uIHNvIGEgY2hhbmdlZCBmaWxlIGdldHMgZnJlc2ggbG9nZ2luZ1xuICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICdlbGVtZW50OmV4dGVybmFsLWNoYW5nZScsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UpIHtcbiAgICAgIHZvaWQgdGhpcy5sb2FkKHJlbGF0aXZlUGF0aCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdXRvIHJlbG9hZCBhZnRlciBleHRlcm5hbCBjaGFuZ2UgZmFpbGVkJywge1xuICAgICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3JcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVsZW1lbnQgdG8gYm90aCBjYWNoZXMgKGJpZGlyZWN0aW9uYWwgbWFwcGluZylcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIGNhY2hlXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FjaGVFbGVtZW50KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2xlYXIgYW55IHN0YWxlIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgZmlsZXBhdGggYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZS5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGdlbmVyYXRlSWQoKSBpbiBCYXNlRWxlbWVudC50cyBpbmNsdWRlcyBhIERhdGUubm93KClcbiAgICAvLyB0aW1lc3RhbXAsIGNhdXNpbmcgZWFjaCBsb2FkIGZyb20gZGlzayB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudCBJRC4gV2l0aG91dCB0aGlzXG4gICAgLy8gY2xlYW51cCwgb2xkIElEcyByZW1haW4gaW4gdGhlIGNhY2hlIGFzIHN0YWxlIGRhdGEsIGxlYWRpbmcgdG8gaW5jb25zaXN0ZW50XG4gICAgLy8gcmVzdWx0cyBpbiBtZXRob2RzIGxpa2UgZmluZFBlcnNvbmEoKSBvciBsaXN0KCkuXG4gICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0lkICYmIGV4aXN0aW5nSWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgIC8vIENsZWFyIHN0YWxlIGNhY2hlIGVudHJ5IHdoZW4gZWxlbWVudCBJRCBoYXMgY2hhbmdlZFxuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50cy5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuc2V0KGFic29sdXRlUGF0aCwgZWxlbWVudC5pZCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5jYWNoZUdlbmVyYXRpb25Db3VudGVyO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLnNldChlbGVtZW50LmlkLCBnZW5lcmF0aW9uKTtcblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5yZWxhdGl2ZSh0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKVxuICAgICAgOiBmaWxlUGF0aDtcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2ZpbGVuYW1lJywge1xuICAgICAgICB2YWx1ZTogcGF0aC5iYXNlbmFtZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlUGF0aCcsIHtcbiAgICAgICAgdmFsdWU6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGF0dGFjaCBmaWxlbmFtZSBtZXRhZGF0YSB0byBlbGVtZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIGZyZXNoIGRpc2sgc2NhbiBhbmQgZXZpY3QgYW55IG1vZGlmaWVkL3JlbW92ZWQgZW50cmllcyBmcm9tIHRoZVxuICAgKiBpbi1tZW1vcnkgTFJVIGNhY2hlLiBDYWxsIGJlZm9yZSBmaW5kQnlOYW1lKCkgd2hlbiBmcmVzaG5lc3MgaXMgY3JpdGljYWxcbiAgICogKGUuZy4gb24gZW5zZW1ibGUgYWN0aXZhdGlvbikgdG8gcGljayB1cCBleHRlcm5hbCBmaWxlIGNoYW5nZXMgdGhhdFxuICAgKiBvY2N1cnJlZCBzaW5jZSB0aGUgbGFzdCBzY2FuLCBldmVuIGlmIHRoZSBzY2FuIGNvb2xkb3duIGlzIHN0aWxsIGFjdGl2ZS5cbiAgICpcbiAgICogVW5saWtlIGxpc3QoKSwgdGhpcyBkb2VzIG5vdCBsb2FkIGFsbCBlbGVtZW50cyDigJQgaXQgb25seSBldmljdHMgc3RhbGUgb25lcy5cbiAgICogRml4ZXMgIzE4OTUgKGVuc2VtYmxlIGFjdGl2YXRpb24gc2VydmluZyBzdGFsZSBjYWNoZWQgZWxlbWVudCBsaXN0KS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzY2FuQW5kRXZpY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpOyAvLyBieXBhc3MgY29vbGRvd24gc28gdGhlIG5leHQgc2NhbiBoaXRzIGRpc2tcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlmZiA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcbiAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBbLi4uZGlmZi5tb2RpZmllZCwgLi4uZGlmZi5yZW1vdmVkXSkge1xuICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzUGF0aCk7XG4gICAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic1BhdGgpO1xuICAgICAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBub24tZmF0YWwg4oCUIGNhY2hlIG1heSBiZSBzbGlnaHRseSBzdGFsZSwgYnV0IGFjdGl2YXRpb24gcHJvY2VlZHMgKi8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIGJvdGggY2FjaGVzIGJ5IGZpbGUgcGF0aFxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBkZWxldGlvbiB0byBhdm9pZCBzdGFsZSBjYWNoZSBlbnRyaWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgdW5jYWNoZUJ5UGF0aChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBlbGVtZW50SWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChlbGVtZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGVsZW1lbnRJZCk7XG4gICAgICBsb2dnZXIuZGVidWcoYFVuY2FjaGVkIGVsZW1lbnQgJHtlbGVtZW50SWR9IGZyb20gJHthYnNvbHV0ZVBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjYWNoZWQgZWxlbWVudHNcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2FjaGUgc2l6ZSBtZXRyaWNzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q2FjaGVTdGF0cygpOiB7IGVsZW1lbnRDb3VudDogbnVtYmVyOyBwYXRoTWFwcGluZ3M6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbGVtZW50c1N0YXRzID0gdGhpcy5lbGVtZW50cy5nZXRTdGF0cygpO1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldFN0YXRzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudENvdW50OiBlbGVtZW50c1N0YXRzLnNpemUsXG4gICAgICBwYXRoTWFwcGluZ3M6IHBhdGhTdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgaW50ZXJuYWwgTFJVIGNhY2hlIGluc3RhbmNlcyBmb3IgbWV0cmljcyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldE1ldHJpY3NDYWNoZXMoKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBMUlVDYWNoZTx1bmtub3duPiB9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbmFtZTogYGVsZW1lbnRzOiR7dGhpcy5lbGVtZW50VHlwZX1gLCBpbnN0YW5jZTogdGhpcy5lbGVtZW50cyBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgICAgeyBuYW1lOiBgcGF0aEluZGV4OiR7dGhpcy5lbGVtZW50VHlwZX1gLCBpbnN0YW5jZTogdGhpcy5maWxlUGF0aFRvSWQgYXMgTFJVQ2FjaGU8dW5rbm93bj4gfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzIGFuZCBjbGVhbnVwXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGFkZCB0aGVpciBvd24gY2xlYW51cCBsb2dpY1xuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVtb3J5QnVkZ2V0KSB7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZWxlbWVudHMpO1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQudW5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5jbGVhcigpO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuY2xlYXIoKTtcbiAgICB0aGlzLndhdGNoZXJDbGVhbnVwPy4oKTtcbiAgICB0aGlzLndhdGNoZXJDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9TWFuYWdlciBkaXNwb3NlZCBhbmQgY2FjaGVzIGNsZWFyZWRgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJTEVOQU1FIE5PUk1BTElaQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSBuYW1lIHRvIGtlYmFiLWNhc2UgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgZm9ybWF0dGluZy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgdW5pZmllZCBmaWxlbmFtZSBub3JtYWxpemF0aW9uIGFjcm9zcyBhbGwgZWxlbWVudCBtYW5hZ2VycyxcbiAgICogZW5zdXJpbmcgY29uc2lzdGVudCBuYW1pbmcgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZm9ybWF0IChDYW1lbENhc2UsIHNwYWNlcyxcbiAgICogdW5kZXJzY29yZXMsIG1peGVkIGNhc2UsIGV0Yy4pLlxuICAgKlxuICAgKiBUcmFuc2Zvcm1hdGlvbnMgYXBwbGllZCAoaW4gb3JkZXIpOlxuICAgKiAxLiBJbnNlcnQgaHlwaGVucyBiZXR3ZWVuIGNhbWVsQ2FzZSBib3VuZGFyaWVzIChNeU5hbWUgLT4gTXktTmFtZSlcbiAgICogMi4gUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgKiAzLiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgKiA0LiBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnMgKGtlZXAgb25seSBhLXosIDAtOSwgLSlcbiAgICogNS4gQ29sbGFwc2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgKiA2LiBUcmltIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNSVURWLUFnZW50LURlbHRhXCIpIC8vIFwiY3J1ZHYtYWdlbnQtZGVsdGFcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNyZWF0aXZlIFdyaXRlclwiKSAgIC8vIFwiY3JlYXRpdmUtd3JpdGVyXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDYW1lbENhc2VOYW1lXCIpICAgICAvLyBcImNhbWVsLWNhc2UtbmFtZVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwibXlfc2tpbGxfbmFtZVwiKSAgICAgLy8gXCJteS1za2lsbC1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJTcGVjaWFsQENoYXJzIVwiKSAgICAvLyBcInNwZWNpYWwtY2hhcnNcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIi0tbGVhZGluZy1hbmQtdHJhaWxpbmctLVwiKSAvLyBcImxlYWRpbmctYW5kLXRyYWlsaW5nXCJcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgZWxlbWVudCBuYW1lIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIGtlYmFiLWNhc2UgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICd1bm5hbWVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZVxuICAgICAgLy8gU3RlcCAxOiBJbnNlcnQgaHlwaGVucyBiZXR3ZWVuIGNhbWVsQ2FzZSBib3VuZGFyaWVzIChsb3dlcmNhc2UgZm9sbG93ZWQgYnkgdXBwZXJjYXNlKVxuICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpXG4gICAgICAvLyBTdGVwIDI6IFJlcGxhY2Ugc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC9bXFxzX10rL2csICctJylcbiAgICAgIC8vIFN0ZXAgMzogQ29udmVydCB0byBsb3dlcmNhc2VcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAvLyBTdGVwIDQ6IFN0cmlwIGludmFsaWQgY2hhcmFjdGVycyAoa2VlcCBvbmx5IGFscGhhbnVtZXJpYyBhbmQgaHlwaGVucylcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJylcbiAgICAgIC8vIFN0ZXAgNTogQ29sbGFwc2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoLy0rL2csICctJylcbiAgICAgIC8vIFN0ZXAgNjogVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdGFuZGFyZGl6ZWQgZmlsZW5hbWUgZm9yIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIE5vcm1hbGl6ZXMgdGhlIGVsZW1lbnQgbmFtZSAoaGFuZGxpbmcgQ2FtZWxDYXNlLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBldGMuKVxuICAgKiBhbmQgYXBwZW5kcyB0aGUgZmlsZSBleHRlbnNpb24uIFRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIChwZXJzb25hcy8sIHNraWxscy8sIGV0Yy4pXG4gICAqIGFscmVhZHkgcHJvdmlkZXMgdHlwZSBjb250ZXh0LCBzbyB0aGUgdHlwZSBpcyBOT1QgaW5jbHVkZWQgaW4gdGhlIGZpbGVuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBlbGVtZW50IG5hbWUgdG8gY29udmVydCB0byBhIGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIFRoZSBzdGFuZGFyZGl6ZWQgZmlsZW5hbWUgKGUuZy4sIFwiY29kZS1yZXZpZXcubWRcIilcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiQ29kZSBSZXZpZXdcIikgICAgICAgICAvLyDihpIgXCJjb2RlLXJldmlldy5tZFwiXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkRlYnVnIERldGVjdGl2ZVwiKSAgICAgLy8g4oaSIFwiZGVidWctZGV0ZWN0aXZlLm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiQnVnUmVwb3J0XCIpICAgICAgICAgICAvLyDihpIgXCJidWctcmVwb3J0Lm1kXCIgKENhbWVsQ2FzZSBzcGxpdClcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiZml4LXBlcnNvbmEtaGVscGVyXCIpICAvLyDihpIgXCJmaXgtcGVyc29uYS1oZWxwZXIubWRcIiAobm8gbWFuZ2xpbmcpXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpIHx8ICd1bm5hbWVkJztcbiAgICBjb25zdCBleHRlbnNpb24gPSB0aGlzLmdldEZpbGVFeHRlbnNpb24oKTtcbiAgICByZXR1cm4gYCR7bm9ybWFsaXplZE5hbWV9JHtleHRlbnNpb259YDtcbiAgfVxuXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUJTVFJBQ1QgTUVUSE9EUyAtIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIHZhbGlkYXRlIG1ldGFkYXRhIGZyb20gZnJvbnRtYXR0ZXJcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZWxlbWVudC1zcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gUmF3IG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgYW5kIHR5cGVkIG1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPFRbJ21ldGFkYXRhJ10+O1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgRWxlbWVudFZhbGlkYXRvciB2aWEgVmFsaWRhdGlvblJlZ2lzdHJ5IGluc3RlYWQuXG4gICAqIFdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhOiBhbnksIF9zdHJpY3Q/OiBib29sZWFuKTogUHJvbWlzZTxpbXBvcnQoJy4uLy4uL3V0aWxzL3ZhbGlkYXRpb24vRmllbGRWYWxpZGF0b3IuanMnKS5WYWxpZGF0aW9uRXJyb3JbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIHJldHVybiByZXN1bHQuZXJyb3JzLm1hcChlID0+ICh7IGZpZWxkOiAnZ2VuZXJhbCcsIG1lc3NhZ2U6IGUgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlIGZyb20gbWV0YWRhdGEgYW5kIGNvbnRlbnRcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZWxlbWVudC1zcGVjaWZpYyBjb25zdHJ1Y3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gVmFsaWRhdGVkIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gRWxlbWVudCBjb250ZW50IChpbnN0cnVjdGlvbnMsIHRlbXBsYXRlLCBldGMuKVxuICAgKiBAcmV0dXJucyBOZXcgZWxlbWVudCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IFRbJ21ldGFkYXRhJ10sIGNvbnRlbnQ6IHN0cmluZyk6IFQ7XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhbiBlbGVtZW50IHRvIGZpbGUgY29udGVudFxuICAgKiBTdWJjbGFzc2VzIGNhbiBjdXN0b21pemUgc2VyaWFsaXphdGlvbiBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJucyBGaWxlIGNvbnRlbnQgKHVzdWFsbHkgbWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IFQpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAqIE1vc3QgZWxlbWVudHMgdXNlIC5tZCwgYnV0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlXG4gICAqL1xuICBhYnN0cmFjdCBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGVsZW1lbnQgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZm9ybWF0LXNwZWNpZmljIGltcG9ydCBsb2dpY1xuICAgKi9cbiAgYWJzdHJhY3QgaW1wb3J0RWxlbWVudChkYXRhOiBzdHJpbmcsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPFQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZWxlbWVudCB0byBleHRlcm5hbCBmb3JtYXRcbiAgICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgZm9ybWF0LXNwZWNpZmljIGV4cG9ydCBsb2dpY1xuICAgKi9cbiAgYWJzdHJhY3QgZXhwb3J0RWxlbWVudChlbGVtZW50OiBULCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuIl19
|
|
1055
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEcsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFD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S0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2VFbGVtZW50TWFuYWdlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBlbGVtZW50IG1hbmFnZXJzXG4gKlxuICogUHJvdmlkZXMgY29tbW9uIENSVUQgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMgdXNpbmcgdGhlXG4gKiBUZW1wbGF0ZSBNZXRob2QgUGF0dGVybjpcbiAqIC0gRGVmaW5lcyB0aGUgc2tlbGV0b24gb2Ygb3BlcmF0aW9ucyBpbiBiYXNlIGNsYXNzXG4gKiAtIExldHMgc3ViY2xhc3NlcyBvdmVycmlkZSBzcGVjaWZpYyBzdGVwcyB3aXRob3V0IGNoYW5naW5nIHN0cnVjdHVyZVxuICpcbiAqIFN1YmNsYXNzZXM6IFNraWxsTWFuYWdlciwgVGVtcGxhdGVNYW5hZ2VyLCBBZ2VudE1hbmFnZXIsIE1lbW9yeU1hbmFnZXJcbiAqXG4gKiBTRUNVUklUWTpcbiAqIDEuIENSSVRJQ0FMOiBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWQvd3JpdGUgb3BlcmF0aW9uc1xuICogMi4gSElHSDogUGF0aCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICogMy4gTUVESVVNOiBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbFxuICogNC4gTUVESVVNOiBJbnB1dCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdGhyb3VnaG91dFxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZXJyb3JzLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLCBFbGVtZW50RXZlbnRQYXlsb2FkIH0gZnJvbSAnLi4vLi4vZXZlbnRzL0VsZW1lbnRFdmVudERpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUgfSBmcm9tICcuL0VsZW1lbnRUcmFuc2FjdGlvblNjb3BlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIEVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL0VsZW1lbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRWxlbWVudFN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvRWxlbWVudFN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcbmltcG9ydCB7XG4gIGdldFZhbGlkYXRlZFNjYW5Db29sZG93bixcbiAgZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMLFxuICBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVExcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IENhY2hlTWVtb3J5QnVkZ2V0IH0gZnJvbSAnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnO1xuaW1wb3J0IHR5cGUgeyBCYWNrdXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcyc7XG5cbmNvbnN0IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRFbGVtZW50Q2FjaGVUVEwoKTtcbmNvbnN0IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVEwoKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zIHtcbiAgZWxlbWVudERpck92ZXJyaWRlPzogc3RyaW5nO1xuICBldmVudERpc3BhdGNoZXI/OiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBlbGVtZW50Q2FjaGVUVEw/OiBudW1iZXI7XG4gIHBhdGhDYWNoZVRUTD86IG51bWJlcjtcbiAgZW5hYmxlRmlsZVdhdGNoZXI/OiBib29sZWFuO1xuICBhdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZT86IGJvb2xlYW47XG4gIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlO1xuICBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG59XG5cbi8qKlxuICogUmVjb3JkIG9mIGFuIGVsZW1lbnQgdGhhdCBmYWlsZWQgdG8gbG9hZCAoSXNzdWUgIzcwOCkuXG4gKiBTdG9yZWQgc28gY2FsbGVycyBjYW4gZGlzdGluZ3Vpc2ggXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGludmFsaWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkRWxlbWVudFJlY29yZCB7XG4gIC8qKiBSZWxhdGl2ZSBmaWxlIHBhdGggd2l0aGluIHRoZSBlbGVtZW50IGRpcmVjdG9yeS4gKi9cbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiB0aGUgZWxlbWVudCB3YXMgcmVqZWN0ZWQuICovXG4gIHJlYXNvbjogc3RyaW5nO1xuICAvKiogSVNPIHRpbWVzdGFtcCBvZiBsYXN0IGZhaWxlZCBsb2FkIGF0dGVtcHQuICovXG4gIGZhaWxlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBpbXBsZW1lbnRpbmcgY29tbW9uIGVsZW1lbnQgbWFuYWdlbWVudCBvcGVyYXRpb25zXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgbG9naWMgdmlhIGFic3RyYWN0IG1ldGhvZHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbGVtZW50TWFuYWdlcjxUIGV4dGVuZHMgSUVsZW1lbnQ+IGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFQ+IHtcbiAgcHJvdGVjdGVkIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgcHJvdGVjdGVkIGVsZW1lbnREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBPYnRhaW5lZCBmcm9tIFZhbGlkYXRpb25SZWdpc3RyeSBkdXJpbmcgY29uc3RydWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBFbGVtZW50VmFsaWRhdG9yO1xuXG4gIC8vIFByaW1hcnkgY2FjaGU6IElEIOKGkiBFbGVtZW50ICh3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzKVxuICBwcm90ZWN0ZWQgZWxlbWVudHM6IExSVUNhY2hlPFQ+O1xuXG4gIC8vIFJldmVyc2UgaW5kZXg6IEFic29sdXRlIEZpbGVQYXRoIOKGkiBFbGVtZW50IElEICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIGZpbGVQYXRoVG9JZDogTFJVQ2FjaGU8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50R2VuZXJhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIGNhY2hlR2VuZXJhdGlvbkNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHdhdGNoZXJDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudERpc3BhdGNoZXI6IEVsZW1lbnRFdmVudERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeUJ1ZGdldD86IENhY2hlTWVtb3J5QnVkZ2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG5cbiAgLyoqIE1hcCBwbHVyYWwgRWxlbWVudFR5cGUgZW51bSB2YWx1ZXMgdG8gc2luZ3VsYXIgQ29udGVudFZhbGlkYXRvciBjb250ZXh0LlxuICAgKiAgUGFydGlhbCBiZWNhdXNlIG5vdCBhbGwgZWxlbWVudCB0eXBlcyBoYXZlIGEgY29udGVudCBjb250ZXh0IChlLmcuLCBlbnNlbWJsZXMpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTEVNRU5UX1RZUEVfVE9fQ09OVEVYVDogUGFydGlhbDxSZWNvcmQ8RWxlbWVudFR5cGUsICdwZXJzb25hJyB8ICdza2lsbCcgfCAndGVtcGxhdGUnIHwgJ2FnZW50JyB8ICdtZW1vcnknPj4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLlNLSUxMXTogJ3NraWxsJyxcbiAgICBbRWxlbWVudFR5cGUuVEVNUExBVEVdOiAndGVtcGxhdGUnLFxuICAgIFtFbGVtZW50VHlwZS5BR0VOVF06ICdhZ2VudCcsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdG9yYWdlTGF5ZXI6IElTdG9yYWdlTGF5ZXI7XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IEVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIEtleWVkIGJ5IHJlbGF0aXZlIGZpbGUgcGF0aCBmb3IgZGVkdXBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52YWxpZEVsZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEludmFsaWRFbGVtZW50UmVjb3JkPigpO1xuXG4gIC8qKlxuICAgKiBUcmFja3MgZmlsZSBwYXRocyB3aG9zZSBsb2FkIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYXQgZXJyb3IgbGV2ZWwuXG4gICAqIFJlcGVhdGVkIGZhaWx1cmVzIHdpdGggdGhlIHNhbWUgcmVhc29uIGFyZSBkZW1vdGVkIHRvIGRlYnVnIHRvIGF2b2lkIGxvZyBmbG9vZGluZy5cbiAgICogQ2xlYXJlZCB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgb24gZGlzayBvciBsb2FkcyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cHByZXNzZWRMb2FkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb3N0IHJlY2VudCBsb2FkKCkgZmFpbHVyZSBmb3IgdGhpcyBwYXRoIHdhcyBzdXBwcmVzc2VkXG4gICAqIGJlY2F1c2UgaXQgd2FzIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktbG9nZ2VkIGVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyB0byBhdm9pZCBkdXBsaWNhdGUgc2VjdXJpdHkgZXZlbnQgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZXJyb3IgZm9yIHRoaXMgcGF0aCBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzTG9hZEVycm9yU3VwcHJlc3NlZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5oYXMoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFmdGVyTG9hZD8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBiZWZvcmVTYXZlPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGFmdGVyU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBmaW5kQnlJZGVudGlmaWVyPyhpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICBwcm90ZWN0ZWQgY2FuRGVsZXRlPyhlbGVtZW50OiBUKTogUHJvbWlzZTx7IGFsbG93ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9PjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGJlZm9yZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWxlLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBuby1vcCAoZS5nLiBNZW1vcnlNYW5hZ2VyIGhhcyBpdHMgb3duIGJhY2t1cCBzeXN0ZW0pLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYmFja3VwU2VydmljZSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGJlZm9yZSBkZWxldGluZyBhIGZpbGUgKG1vdmVzIGZpbGUgdG8gYmFja3VwIGRpcikuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZmlsZSB3YXMgbW92ZWQgKGNhbGxlciBzaG91bGQgc2tpcCBkZWxldGVGaWxlKS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuYmFja3VwU2VydmljZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4gISFyZXN1bHQubW92ZWRPcmlnaW5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGV2ZW50IGRpc3BhdGNoZXIgZm9yIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGVtaXQgY3VzdG9tIGV2ZW50cy5cbiAgICpcbiAgICogQmFzZUVsZW1lbnRNYW5hZ2VyIGhhbmRsZXMgc3RhbmRhcmQgbGlmZWN5Y2xlIGV2ZW50cyAobG9hZCwgc2F2ZSwgZGVsZXRlKSBhdXRvbWF0aWNhbGx5LlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyBnZXR0ZXIgb25seSB3aGVuIHRoZXkgbmVlZCB0byBlbWl0IGFkZGl0aW9uYWwgZG9tYWluLXNwZWNpZmljXG4gICAqIGV2ZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgQ1JVRCBsaWZlY3ljbGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFBlcnNvbmFNYW5hZ2VyIGVtaXRzIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGV2ZW50c1xuICAgKiB0aGlzLmRpc3BhdGNoZXIuZW1pdCgnZWxlbWVudDphY3RpdmF0ZScsIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsuLi59KSk7XG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBFbGVtZW50RXZlbnREaXNwYXRjaGVyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBtYW5hZ2VyXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRpc3BhdGNoZXIoKTogRWxlbWVudEV2ZW50RGlzcGF0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnREaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8gQ2FjaGUgY29uZmlndXJhdGlvbiBjb25zdGFudHNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0VMRU1FTlRfQ0FDSEVfU0laRSA9IDEwMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9QQVRIX0NBQ0hFX1NJWkUgPSAxMDAwO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciAtIGluaXRpYWxpemVzIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIG1hbmFnZXIgaGFuZGxlc1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvTWFuYWdlciAtIFBvcnRmb2xpbyBtYW5hZ2VyIGZvciBkaXJlY3RvcnkgcmVzb2x1dGlvblxuICAgKiBAcGFyYW0gZmlsZUxvY2tNYW5hZ2VyIC0gRmlsZSBsb2NrIG1hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBmaWxlV2F0Y2hTZXJ2aWNlXG4gICAqIEBwYXJhbSBmaWxlT3BlcmF0aW9uc1NlcnZpY2UgLSBTZXJ2aWNlIGZvciBmaWxlIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHZhbGlkYXRpb25SZWdpc3RyeSAtIFJlZ2lzdHJ5IGZvciBvYnRhaW5pbmcgdHlwZS1zcGVjaWZpYyB2YWxpZGF0b3JzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBvcHRpb25zOiBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zID0ge30sXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnlcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gICAgdGhpcy5maWxlTG9ja01hbmFnZXIgPSBmaWxlTG9ja01hbmFnZXI7XG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgICB0aGlzLmZpbGVXYXRjaFNlcnZpY2UgPSBvcHRpb25zLmZpbGVXYXRjaFNlcnZpY2U7XG4gICAgdGhpcy5iYWNrdXBTZXJ2aWNlID0gb3B0aW9ucy5iYWNrdXBTZXJ2aWNlO1xuXG4gICAgLy8gR2V0IHRoZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdG9yKGVsZW1lbnRUeXBlKTtcblxuICAgIGNvbnN0IGVsZW1lbnRDYWNoZVRUTCA9IG9wdGlvbnMuZWxlbWVudENhY2hlVFRMID8/IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVM7XG4gICAgY29uc3QgcGF0aENhY2hlVFRMID0gb3B0aW9ucy5wYXRoQ2FjaGVUVEwgPz8gREVGQVVMVF9QQVRIX0NBQ0hFX1RUTF9NUztcbiAgICB0aGlzLm1lbW9yeUJ1ZGdldCA9IG9wdGlvbnMubWVtb3J5QnVkZ2V0O1xuXG4gICAgY29uc3Qgb25TZXRDYWxsYmFjayA9IHRoaXMubWVtb3J5QnVkZ2V0XG4gICAgICA/ICgpID0+IHRoaXMubWVtb3J5QnVkZ2V0IS5lbmZvcmNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBMUlUgY2FjaGVzIHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICB0aGlzLmVsZW1lbnRzID0gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG5hbWU6IGBlbGVtZW50czoke2VsZW1lbnRUeXBlfWAsXG4gICAgICBtYXhTaXplOiBCYXNlRWxlbWVudE1hbmFnZXIuTUFYX0VMRU1FTlRfQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiA1MCwgLy8gTWF4IDUwTUIgZm9yIGVsZW1lbnQgY2FjaGVcbiAgICAgIHR0bE1zOiBlbGVtZW50Q2FjaGVUVEwsXG4gICAgICBvblNldDogb25TZXRDYWxsYmFjayxcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsZVBhdGhUb0lkID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgICAgbmFtZTogYHBhdGhJbmRleDoke2VsZW1lbnRUeXBlfWAsXG4gICAgICBtYXhTaXplOiBCYXNlRWxlbWVudE1hbmFnZXIuTUFYX1BBVEhfQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiAxMCwgLy8gTWF4IDEwTUIgZm9yIHBhdGggbWFwcGluZ3NcbiAgICAgIHR0bE1zOiBwYXRoQ2FjaGVUVEwsXG4gICAgICBvblNldDogb25TZXRDYWxsYmFjayxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyIGNhY2hlcyB3aXRoIGdsb2JhbCBtZW1vcnkgYnVkZ2V0XG4gICAgaWYgKHRoaXMubWVtb3J5QnVkZ2V0KSB7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmVsZW1lbnRzKTtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lbGVtZW50RGlyT3ZlcnJpZGUpIHtcbiAgICAgIHRoaXMuZWxlbWVudERpciA9IG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mICh0aGlzLnBvcnRmb2xpb01hbmFnZXIgYXMgYW55KS5nZXRFbGVtZW50RGlyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byByZXNvbHZlIGVsZW1lbnQgZGlyZWN0b3J5IGZvciAke2VsZW1lbnRUeXBlfS4gYCArXG4gICAgICAgICdQcm92aWRlIGFuIGVsZW1lbnREaXJPdmVycmlkZSB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBtYW5hZ2VyLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBvcHRpb25zLmV2ZW50RGlzcGF0Y2hlciA/PyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLmdldFNoYXJlZERpc3BhdGNoZXIoKTtcbiAgICB0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID1cbiAgICAgIG9wdGlvbnMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UgPz8gcHJvY2Vzcy5lbnYuQVVUT19SRUxPQURfT05fRVhURVJOQUxfQ0hBTkdFID09PSAndHJ1ZSc7XG5cbiAgICBjb25zdCBlbmFibGVXYXRjaGVyID0gb3B0aW9ucy5lbmFibGVGaWxlV2F0Y2hlciA/PyBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU5BQkxFX0ZJTEVfV0FUQ0hFUiA9PT0gJ3RydWUnO1xuICAgIGlmIChlbmFibGVXYXRjaGVyICYmIHRoaXMuZmlsZVdhdGNoU2VydmljZSkge1xuICAgICAgdGhpcy53YXRjaGVyQ2xlYW51cCA9IHRoaXMuZmlsZVdhdGNoU2VydmljZS53YXRjaERpcmVjdG9yeShcbiAgICAgICAgdGhpcy5lbGVtZW50RGlyLFxuICAgICAgICAocmVsYXRpdmVQYXRoKSA9PiB0aGlzLmhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIgPSB0aGlzLmNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgc3RvcmFnZSBsYXllci5cbiAgICogRGVmYXVsdCByZXR1cm5zIEVsZW1lbnRTdG9yYWdlTGF5ZXIgZm9yIC5tZCBlbGVtZW50cy5cbiAgICogU3ViY2xhc3NlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKSBjYW4gb3ZlcnJpZGUgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSk6IElTdG9yYWdlTGF5ZXIge1xuICAgIHJldHVybiBuZXcgRWxlbWVudFN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHtcbiAgICAgIGVsZW1lbnREaXI6IHRoaXMuZWxlbWVudERpcixcbiAgICAgIGZpbGVFeHRlbnNpb246IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpLFxuICAgICAgc2NhbkNvb2xkb3duTXM6IGdldFZhbGlkYXRlZFNjYW5Db29sZG93bigpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmd1bGFyIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIGVsZW1lbnQgdHlwZSAoZS5nLiwgXCJza2lsbFwiLCBcInBlcnNvbmFcIikuXG4gICAqIFVzZWQgaW4gZmlsZW5hbWUgZ2VuZXJhdGlvbiAoe25hbWV9LXtsYWJlbH0ubWQpIGFuZCBkaXNwbGF5IHN0cmluZ3MuXG4gICAqIE11c3QgcmV0dXJuIHRoZSBzaW5ndWxhciBmb3JtIOKAlCBub3QgdGhlIHBsdXJhbCBFbGVtZW50VHlwZSB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgZWxlbWVudCBsYWJlbC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWwoKTtcbiAgICByZXR1cm4gbGFiZWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBsYWJlbC5zbGljZSgxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGVsZW1lbnQgZnJvbSBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogRGVmaW5lcyB0aGUgYWxnb3JpdGhtLCBzdWJjbGFzc2VzIGN1c3RvbWl6ZSBzdGVwc1xuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUyAoaW5oZXJpdGVkIGZyb20gb3JpZ2luYWwgbWFuYWdlcnMpOlxuICAgKiAtIHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgcHJldmVudHMgcmFjZSBjb25kaXRpb25zXG4gICAqIC0gUGF0aCB2YWxpZGF0aW9uIHByZXZlbnRzIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZyBmb3IgYXVkaXQgdHJhaWxcbiAgICovXG4gIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmxvYWQ6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRWxlbWVudEZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkYFxuICAgICAgfSk7XG4gICAgICAvLyBJc3N1ZSAjODEwOiBQYXNzIGVsZW1lbnQgdHlwZSBhcyBjb250ZW50Q29udGV4dCBzbyBTZWN1cmVZYW1sUGFyc2VyIGV4ZW1wdHNcbiAgICAgIC8vIGxlZ2l0aW1hdGUgcGF0dGVybnMgKGUuZy4sIDxzY3JpcHQ+IHNlY3Rpb24gdGFncyBpbiB0ZW1wbGF0ZXMpXG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghY29udGVudENvbnRleHQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBObyBjb250ZW50Q29udGV4dCBtYXBwaW5nIGZvciBlbGVtZW50VHlwZSAnJHt0aGlzLmVsZW1lbnRUeXBlfScg4oCUIHBhcnNpbmcgd2l0aG91dCBjb250ZXh0IGV4ZW1wdGlvbnMuIEF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQpLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoY29udGVudCwgdW5kZWZpbmVkLCB7IGNvbnRlbnRDb250ZXh0IH0pO1xuXG4gICAgICAvLyBJc3N1ZSAjNjk1OiBGaWxsIGluIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgICAgIC8vIGJlZm9yZSBwYXJzZU1ldGFkYXRhKCkgc28gb2xkZXIgZWxlbWVudHMgd2l0aCBzcGFyc2UgZnJvbnRtYXR0ZXJcbiAgICAgIC8vIGRvbid0IGdldCByZWplY3RlZC5cbiAgICAgIHRoaXMubWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMocGFyc2VkLmRhdGEsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgaWYgKHRoaXMuYWZ0ZXJMb2FkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJMb2FkKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIElzc3VlICM3MDg6IENsZWFyIGFueSBwcmV2aW91cyBpbnZhbGlkIHJlY29yZCBvbiBzdWNjZXNzZnVsIGxvYWRcbiAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6bG9hZDpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSXNzdWUgIzcwODogUmVjb3JkIHRoZSBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAvLyBcImZpbGUgbm90IGZvdW5kXCIgZnJvbSBcImZpbGUgZXhpc3RzIGJ1dCBmYWlsZWQgdmFsaWRhdGlvblwiLlxuICAgICAgLy8gT25seSB0cmFjayBwYXJzZS92YWxpZGF0aW9uIGVycm9ycyDigJQgRU5PRU5UIG1lYW5zIHRoZSBmaWxlIGlzIGdlbnVpbmVseVxuICAgICAgLy8gbWlzc2luZywgbm90IGludmFsaWQsIHNvIHdlIG11c3Qgbm90IHBvbGx1dGUgdGhlIGludmFsaWQgbWFwIHdpdGggaXQuXG4gICAgICBjb25zdCBpc0ZpbGVOb3RGb3VuZCA9IChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnO1xuICAgICAgbGV0IGlzUmVwZWF0RXJyb3IgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpc0ZpbGVOb3RGb3VuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbnZhbGlkRWxlbWVudHMuZ2V0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGlzUmVwZWF0RXJyb3IgPSBleGlzdGluZz8ucmVhc29uID09PSByZWFzb247XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuc2V0KHJlbGF0aXZlUGF0aCwge1xuICAgICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIGZhaWxlZEF0OiBpc1JlcGVhdEVycm9yID8gZXhpc3RpbmchLmZhaWxlZEF0IDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVwZWF0RXJyb3IpIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmFkZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFN1cHByZXNzZWQgcmVwZWF0ZWQgbG9hZCBlcnJvciBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke3JlbGF0aXZlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAgICdlbGVtZW50OmxvYWQ6ZXJyb3InLFxuICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGZyb20gJHthYnNvbHV0ZVBhdGh9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjk1OiBQcmUtZmlsbCBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAqIGJlZm9yZSBwYXJzZU1ldGFkYXRhKCkgcnVucy4gVGhpcyBpbXBsZW1lbnRzIHRoZSBcInRvbGVyYW50IHJlYWRlclwiIHBhdHRlcm5cbiAgICog4oCUIHN0cmljdCBvbiBvdXRwdXQsIGxlbmllbnQgb24gaW5wdXQgZm9yIG9sZGVyL3NwYXJzZSBmcm9udG1hdHRlci5cbiAgICpcbiAgICogTXV0YXRlcyBgZGF0YWAgaW4gcGxhY2UuIExvZ3MgYSB3YXJuaW5nIGZvciBlYWNoIGRlZmF1bHRlZCBmaWVsZCBzb1xuICAgKiBvcGVyYXRvcnMga25vdyB3aGljaCBmaWxlcyBuZWVkIHVwZGF0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBtaWdyYXRlTWV0YWRhdGFEZWZhdWx0cyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1pZ3JhdGVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoaXMgbWFuYWdlcidzIGVsZW1lbnQgdHlwZVxuICAgIGlmICghZGF0YS50eXBlKSB7XG4gICAgICAvLyBFbGVtZW50VHlwZSBpcyBwbHVyYWwgKCdwZXJzb25hcycsICdza2lsbHMnLCBldGMuKVxuICAgICAgLy8gU29tZSBtYW5hZ2VycyBleHBlY3Qgc2luZ3VsYXIgKCdwZXJzb25hJywgJ2FnZW50JyksIHNvbWUgcGx1cmFsLlxuICAgICAgLy8gU2V0IHRoZSBwbHVyYWwgZm9ybSDigJQgcGFyc2VNZXRhZGF0YSgpIGhhbmRsZXMgbm9ybWFsaXphdGlvbi5cbiAgICAgIGRhdGEudHlwZSA9IHRoaXMuZWxlbWVudFR5cGU7XG4gICAgICBtaWdyYXRlZC5wdXNoKCd0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgbmFtZSBmcm9tIGZpbGVuYW1lIChzdHJpcCBleHRlbnNpb24sIHVuLXNsdWdpZnkpXG4gICAgaWYgKCFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCkpO1xuICAgICAgZGF0YS5uYW1lID0gYmFzZW5hbWU7XG4gICAgICBtaWdyYXRlZC5wdXNoKCduYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgaWYgKCFkYXRhLnZlcnNpb24pIHtcbiAgICAgIGRhdGEudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICBtaWdyYXRlZC5wdXNoKCd2ZXJzaW9uJyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBhdXRob3JcbiAgICBpZiAoIWRhdGEuYXV0aG9yKSB7XG4gICAgICBkYXRhLmF1dGhvciA9ICd1bmtub3duJztcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ2F1dGhvcicpO1xuICAgIH1cblxuICAgIGlmIChtaWdyYXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtUb2xlcmFudFJlYWRlcl0gJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IFwiJHtmaWxlUGF0aH1cIjogYCArXG4gICAgICAgIGBkZWZhdWx0ZWQgbWlzc2luZyBmaWVsZHM6ICR7bWlncmF0ZWQuam9pbignLCAnKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBSZXR1cm5zIGVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIENhbGxlcnMgY2FuIHVzZSB0aGlzIHRvIHJlcG9ydCBpbnZhbGlkIGVsZW1lbnRzIGluc3RlYWQgb2Ygc2lsZW50bHkgaGlkaW5nIHRoZW0uXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudHMoKTogSW52YWxpZEVsZW1lbnRSZWNvcmRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmludmFsaWRFbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogQ2hlY2sgaWYgYSBzcGVjaWZpYyBmaWxlIGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBVc2VkIGJ5IGdldF9lbGVtZW50IHRvIGRpc3Rpbmd1aXNoIFwibm90IGZvdW5kXCIgZnJvbSBcImludmFsaWRcIi5cbiAgICovXG4gIGdldEludmFsaWRFbGVtZW50KG5hbWU6IHN0cmluZyk6IEludmFsaWRFbGVtZW50UmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBieSBleGFjdCBwYXRoIG1hdGNoIGFuZCBieSBuYW1lLWJhc2VkIG1hdGNoXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHJlY29yZF0gb2YgdGhpcy5pbnZhbGlkRWxlbWVudHMpIHtcbiAgICAgIGlmIChmaWxlUGF0aCA9PT0gbmFtZSkgcmV0dXJuIHJlY29yZDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCkpO1xuICAgICAgaWYgKGJhc2VuYW1lID09PSBuYW1lIHx8IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoYmFzZW5hbWUpID09PSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbiBlbGVtZW50IHRvIGZpbGVcbiAgICogVEVNUExBVEUgTUVUSE9EOiBDb21tb24gc2F2ZSBsb2dpYyB3aXRoIGhvb2tzIGZvciBjdXN0b21pemF0aW9uXG4gICAqXG4gICAqIFNFQ1VSSVRZIEZJWEVTOlxuICAgKiAtIHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZSgpIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZ1xuICAgKi9cbiAgYXN5bmMgc2F2ZShlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUodGhpcy5nZXRFbGVtZW50TGFiZWwoKSwgY29ycmVsYXRpb25JZCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9FRElURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnNhdmVgLFxuICAgICAgZGV0YWlsczogYFNhdmluZyAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdiR7ZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5nZXRFbGVtZW50TGFiZWwoKSxcbiAgICAgICAgYXV0aG9yOiBlbGVtZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgdmVyc2lvbjogZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OnNhdmU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQocmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpzYXZlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTplcnJvcicsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCwgZXJyb3IgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0cmFuc2FjdGlvbi5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYmVmb3JlU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZVNhdmUoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGFic29sdXRlUGF0aCkpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIC8vIEZpeCAjOTA4OiBWYWxpZGF0ZSBzZXJpYWxpemVkIGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgKHN5bW1ldHJpYyB3aXRoIHJlYWQgcGF0aCkuXG4gICAgICAvLyBSZWFkIHBhdGggdmFsaWRhdGVzIHZpYSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkg4oaSIENvbnRlbnRWYWxpZGF0b3I7IHdyaXRlIHBhdGhcbiAgICAgIC8vIG11c3QgYXBwbHkgdGhlIHNhbWUgY2hlY2tzIHRvIHByZXZlbnQgc2F2aW5nIGNvbnRlbnQgdGhhdCB3b3VsZCBmYWlsIHRvIGxvYWQuXG4gICAgICB0aGlzLnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGFic29sdXRlUGF0aCwgY29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgaWYgKHRoaXMuYWZ0ZXJTYXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IHNhdmVkOiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzZXJpYWxpemVkIGVsZW1lbnQgY29udGVudCBiZWZvcmUgd3JpdGluZyB0byBkaXNrLlxuICAgKiBGaXggIzkwODogTWlycm9ycyB0aGUgcmVhZC1wYXRoIHZhbGlkYXRpb24gZnJvbSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKClcbiAgICogdG8gZW5zdXJlIHdyaXRlIOKGkiByZWFkIHN5bW1ldHJ5LiBDb250ZW50IHRoYXQgZmFpbHMgdGhpcyBjaGVjayB3b3VsZCBhbHNvXG4gICAqIGZhaWwgdG8gbG9hZCwgc28gcmVqZWN0aW5nIGl0IG9uIHdyaXRlIHByZXZlbnRzIHBlcm1hbmVudGx5IGJyb2tlbiBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZXJpYWxpemVkQ29udGVudChjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YSA9IChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLCBzb3VyY2VMYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKHJlY29yZCk7XG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5IGluIHNlcmlhbGl6ZWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke3NvdXJjZUxhYmVsfTogJHtbLi4ubmV3IFNldChlcnJvcnMpXS5qb2luKCc7ICcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBpZiBwcmVzZW50IChTb25hckNsb3VkIFM2NTk0OiB1c2UgUmVnRXhwLmV4ZWMpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJSZWdleCA9IC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vO1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBmcm9udG1hdHRlclJlZ2V4LmV4ZWMoY29udGVudCk7XG5cbiAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgY29uc3QgYm9keUNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhmcm9udG1hdHRlck1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgIC8vIFlBTUwgYm9tYiBkZXRlY3Rpb24gKG1pcnJvcnMgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIHN0ZXAgNCkuXG4gICAgICAvLyBPbmx5IHJ1biB3aGVuIFlBTUwgaXMgdW5kZXIgTUFYX1lBTUxfTEVOR1RIICg2NEtCKSDigJQgdGhlIHNhbWUgbGltaXRcbiAgICAgIC8vIHVzZWQgYnkgdGhlIHJlYWQgcGF0aCBpbiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkuIHZhbGlkYXRlWWFtbENvbnRlbnQoKVxuICAgICAgLy8gaW5jbHVkZXMgaXRzIG93biBzaXplIGNoZWNrIGludGVybmFsbHksIGFuZCB3ZSBpbnRlbnRpb25hbGx5IHNraXAgc2l6ZVxuICAgICAgLy8gZW5mb3JjZW1lbnQgb24gdGhlIHdyaXRlIHBhdGggYmVjYXVzZSB0aGUgc2VyaWFsaXplciBtYXkgcHJvZHVjZSBsYXJnZVxuICAgICAgLy8gZnJvbnRtYXR0ZXIgZm9yIGVsZW1lbnRzIHdpdGggbG9uZyBpbnN0cnVjdGlvbnMuIFRoZSByZWFkIHBhdGggd2lsbFxuICAgICAgLy8gcmVqZWN0IG92ZXJzaXplZCBZQU1MIG9uIHRoZSBuZXh0IGxvYWQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA8PSBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIKSB7XG4gICAgICAgIGlmICghQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxDb250ZW50KSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnRgLFxuICAgICAgICAgICAgZGV0YWlsczogYE1hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBvdXRwdXQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgeWFtbExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICAgIGBTZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQuIGAgK1xuICAgICAgICAgICAgYFJldmlldyB0aGUgZWxlbWVudCdzIG1ldGFkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHN1c3BpY2lvdXMgYW5jaG9yL2FsaWFzIHBhdHRlcm5zLmAsXG4gICAgICAgICAgICAnY3JpdGljYWwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcm9udG1hdHRlckRhdGEgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbCh5YW1sQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShmcm9udG1hdHRlckRhdGEsICdmcm9udG1hdHRlcicpO1xuXG4gICAgICAvLyBCb2R5IGNvbnRlbnQgdmFsaWRhdGlvbiB3aXRoIGVsZW1lbnQgdHlwZSBjb250ZXh0XG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGNvbnN0IGJvZHlWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGJvZHlDb250ZW50LCB7XG4gICAgICAgIGNvbnRlbnRDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICBpZiAoIWJvZHlWYWxpZGF0aW9uLmlzVmFsaWQgJiYgYm9keVZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBzZXJpYWxpemVkIGJvZHkgY29udGVudDogJHtib2R5VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICBjb25zdCByYXdZYW1sID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoY29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShyYXdZYW1sLCAnWUFNTCByb290Jyk7XG4gICAgICBpZiAocmF3WWFtbC5tZXRhZGF0YSAmJiB0eXBlb2YgcmF3WWFtbC5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmF3WWFtbC5tZXRhZGF0YSkpIHtcbiAgICAgICAgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEocmF3WWFtbC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJ21ldGFkYXRhJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBlbGVtZW50c1xuICAgKiBTRUNVUklUWTogVXNlcyBQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cygpIHdoaWNoIGZpbHRlcnMgdGVzdCBlbGVtZW50c1xuICAgKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcblxuICAgICAgLy8gU2NhbiBmb3IgY2hhbmdlcyDigJQgcG9wdWxhdGVzIGluZGV4IGZvciBsaXN0U3VtbWFyaWVzKCkvZmluZEJ5TmFtZSgpXG4gICAgICAvLyBOb24tZmF0YWw6IHNjYW4gZmFpbHVyZSBtdXN0IG5ldmVyIHByZXZlbnQgbGlzdCgpIGZyb20gcmV0dXJuaW5nIHJlc3VsdHNcbiAgICAgIC8vIEV2aWN0IHN0YWxlIGNhY2hlIGVudHJpZXMgc28gdGhlIGNhY2hlIGNoZWNrIGJlbG93IG5ldmVyIHJldHVybnMgb3V0ZGF0ZWQgZGF0YVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlmZiA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcbiAgICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIFsuLi5kaWZmLm1vZGlmaWVkLCAuLi5kaWZmLnJlbW92ZWRdKSB7XG4gICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIHJlbFBhdGgpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzUGF0aCk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic1BhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7IC8qIGluZGV4IHVuYXZhaWxhYmxlLCBsaXN0KCkgY29udGludWVzIHdpdGhvdXQgY2FjaGUgb3B0aW1pemF0aW9uICovIH1cblxuICAgICAgLy8gVXNlIFBvcnRmb2xpb01hbmFnZXIgZm9yIGF1dGhvcml0YXRpdmUgZmlsZSBsaXN0ICsgc2VjdXJpdHkgZmlsdGVyaW5nXG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHModGhpcy5lbGVtZW50VHlwZSk7XG5cbiAgICAgIC8vIExvYWQgYWxsIGVsZW1lbnRzIGluIHBhcmFsbGVsLCBjaGVja2luZyBjYWNoZSBiZWZvcmUgZGlza1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IChhdm9pZHMgZGlzayByZWFkIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgICAgIC8vIENhY2hlIG1pc3Mg4oCUIHJlYWQgZnJvbSBkaXNrIChwb3B1bGF0ZXMgY2FjaGUgZm9yIG5leHQgdGltZSlcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWQoZmlsZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBsb2FkKCkgaGFuZGxlcyBlcnJvciBsb2dnaW5nIHdpdGggZGVkdXBsaWNhdGlvblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gRmlsdGVyIG91dCBmYWlsZWQgbG9hZHMgYW5kIHJldHVyblxuICAgICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcigoZSk6IGUgaXMgQXdhaXRlZDxUPiA9PiBlICE9PSBudWxsKSBhcyBUW107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGAke2xhYmVsfXMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IHlldCwgcmV0dXJuaW5nIGVtcHR5IGFycmF5YCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgJHt0aGlzLmVsZW1lbnRUeXBlfXM6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGxpZ2h0d2VpZ2h0IG1ldGFkYXRhIHN1bW1hcmllcyB3aXRob3V0IGxvYWRpbmcgZnVsbCBlbGVtZW50cy5cbiAgICogVXNlZnVsIHdoZW4gb25seSBuYW1lcy9kZXNjcmlwdGlvbnMvdGFncyBhcmUgbmVlZGVkLlxuICAgKi9cbiAgYXN5bmMgbGlzdFN1bW1hcmllcygpOiBQcm9taXNlPEVsZW1lbnRJbmRleEVudHJ5W10+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VMYXllci5saXN0U3VtbWFyaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgZWxlbWVudHMgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSBvciBJRCB3aXRob3V0IGxvYWRpbmcgYWxsIGVsZW1lbnRzXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGZvciBhY3RpdmF0aW9uIGZsb3dcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYW4gb3B0aW1pemVkIGxvb2t1cCB0aGF0IHRyaWVzIGNhY2hlIGZpcnN0LCB0aGVuXG4gICAqIGF0dGVtcHRzIGRpcmVjdCBmaWxlIGFjY2VzcyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGZ1bGwgbGlzdCgpIHNjYW4uXG4gICAqIFRoaXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBsaXN0KCkgZm9yIGxhcmdlIHBvcnRmb2xpb3MuXG4gICAqXG4gICAqIFBFUkZPUk1BTkNFIElNUFJPVkVNRU5UUzpcbiAgICogMS4gQ2FjaGUgbG9va3VwIC0gTygxKSBpZiBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGxvYWRlZFxuICAgKiAyLiBEaXJlY3QgZmlsZSBhY2Nlc3MgLSBPKDEpIGZvciBuYW1lLWJhc2VkIGxvb2t1cHNcbiAgICogMy4gRnVsbCBzY2FuIGZhbGxiYWNrIC0gTyhuKSBvbmx5IGlmIGFib3ZlIG1ldGhvZHMgZmFpbFxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVsZW1lbnQgbmFtZSBvciBJRCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIEVsZW1lbnQgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIGFzeW5jIGZpbmRCeU5hbWUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gRmlyc3QsIHRyeSBmaW5kaW5nIGluIGNhY2hlIGJ5IGl0ZXJhdGluZyBjYWNoZWQgZWxlbWVudHNcbiAgICAvLyBUaGlzIGlzIGZhc3QgKE8oY2FjaGUgc2l6ZSkpIGFuZCB3b3JrcyBmb3IgcmVjZW50bHkgYWNjZXNzZWQgZWxlbWVudHNcbiAgICBjb25zdCBjYWNoZWRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kSW5DYWNoZShpZGVudGlmaWVyKTtcbiAgICBpZiAoY2FjaGVkRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGNhY2hlZEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kLCB0cnkgc3RvcmFnZSBsYXllciBpbmRleCAoTygxKSBuYW1lIGxvb2t1cClcbiAgICBjb25zdCBpbmRleGVkUGF0aCA9IHRoaXMuc3RvcmFnZUxheWVyLmdldFBhdGhCeU5hbWUoaWRlbnRpZmllcik7XG4gICAgaWYgKGluZGV4ZWRQYXRoKSB7XG4gICAgICB0cnkgeyByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGluZGV4ZWRQYXRoKTsgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9XG4gICAgfVxuXG4gICAgLy8gVGhpcmQsIHRyeSBkaXJlY3QgZmlsZSBhY2Nlc3MgdXNpbmcgc3RhbmRhcmQgbmFtaW5nIGNvbnZlbnRpb25cbiAgICAvLyBFbGVtZW50IGZpbGVzIGFyZSB0eXBpY2FsbHkgbmFtZWQ6IGxvd2VyY2FzZS1uYW1lLXdpdGgtaHlwaGVucy57ZXh0fVxuICAgIC8vIFRoaXMgaXMgTygxKSBmaWxlIHN5c3RlbSBsb29rdXBcbiAgICBjb25zdCBkaXJlY3RMb2FkQXR0ZW1wdCA9IGF3YWl0IHRoaXMudHJ5RGlyZWN0TG9hZChpZGVudGlmaWVyKTtcbiAgICBpZiAoZGlyZWN0TG9hZEF0dGVtcHQpIHtcbiAgICAgIHJldHVybiBkaXJlY3RMb2FkQXR0ZW1wdDtcbiAgICB9XG5cbiAgICAvLyBJZiBzdG9yYWdlIGxheWVyIGhhcyBjb21wbGV0ZWQgYXQgbGVhc3Qgb25lIHNjYW4sIHRoZSBpbmRleCBpc1xuICAgIC8vIGF1dGhvcml0YXRpdmUg4oCUIGEgbWlzcyBtZWFucyB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4gU2tpcCB0aGVcbiAgICAvLyBleHBlbnNpdmUgbGlzdCgpIGZhbGxiYWNrIHRvIGF2b2lkIE8obikgcmVzY2FucyBvbiBldmVyeSBjYWNoZSBtaXNzLlxuICAgIGlmICh0aGlzLnN0b3JhZ2VMYXllci5oYXNDb21wbGV0ZWRTY2FuKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IEZ1bGwgbGlzdCgpIHNjYW4gKE8obikgLSBsb2FkcyBhbGwgZWxlbWVudHMpXG4gICAgLy8gT25seSB1c2VkIG9uIGZpcnN0IGFjY2VzcyBiZWZvcmUgYW55IHNjYW4gaGFzIGNvbXBsZXRlZC5cbiAgICAvLyBUaGlzIGVuc3VyZXMgd2UgZmluZCBlbGVtZW50cyBldmVuIHdpdGggbm9uLXN0YW5kYXJkIGZpbGUgbmFtaW5nLlxuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGlkZW50aWZpZXIpO1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKGUgPT5cbiAgICAgIHRoaXMubm9ybWFsaXplRmlsZW5hbWUoZS5tZXRhZGF0YS5uYW1lKSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXIgfHxcbiAgICAgIGUubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIGUuaWQgPT09IGlkZW50aWZpZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogU2VhcmNoIGNhY2hlIGZvciBlbGVtZW50IGJ5IG5hbWUgb3IgSURcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZEluQ2FjaGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gTFJVQ2FjaGUgZG9lc24ndCBwcm92aWRlIGl0ZXJhdGlvbiwgYnV0IHdlIGNhbiBjaGVjayBpZiB3ZSBoYXZlXG4gICAgLy8gYSBjYWNoZWQgcGF0aCBmb3IgdGhpcyBpZGVudGlmaWVyIGJ5IHRyeWluZyBjb21tb24gbmFtaW5nIHBhdHRlcm5zLlxuICAgIC8vIElNUE9SVEFOVDogZmlsZVBhdGhUb0lkIHN0b3JlcyBhYnNvbHV0ZSBwYXRocyAoc2V0IGJ5IGNhY2hlRWxlbWVudCB2aWFcbiAgICAvLyByZXNvbHZlQWJzb2x1dGVQYXRoKSwgc28gd2UgbXVzdCByZXNvbHZlIHRvIGFic29sdXRlIGJlZm9yZSBsb29rdXAuXG4gICAgY29uc3QgcG9zc2libGVGaWxlbmFtZXMgPSBbXG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgYCR7aWRlbnRpZmllcn0ke3RoaXMuZ2V0RmlsZUV4dGVuc2lvbigpfWAsXG4gICAgICAvLyBVc2UgdW5pZmllZCBub3JtYWxpemVGaWxlbmFtZSBmb3IgY29uc2lzdGVudCBjYWNoZSBsb29rdXBzXG4gICAgICB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShpZGVudGlmaWVyKVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHBvc3NpYmxlRmlsZW5hbWVzKSB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpO1xuICAgICAgY29uc3QgY2FjaGVkSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGlmIChjYWNoZWRJZCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50cy5nZXQoY2FjaGVkSWQpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFRyeSBsb2FkaW5nIGVsZW1lbnQgZGlyZWN0bHkgYnkgY29uc3RydWN0aW5nIGV4cGVjdGVkIGZpbGVuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRyeURpcmVjdExvYWQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gVHJ5IGxvYWRpbmcgdXNpbmcgY29tbW9uIG5hbWluZyBwYXR0ZXJuc1xuICAgIC8vIFVzZSB1bmlmaWVkIG5vcm1hbGl6ZUZpbGVuYW1lIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIGNvbnN0cnVjdGlvblxuICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICAvLyBQcmltYXJ5OiBVc2UgdW5pZmllZCBub3JtYWxpemF0aW9uIChoYW5kbGVzIENhbWVsQ2FzZSwgc3BhY2VzLCB1bmRlcnNjb3JlcywgZXRjLilcbiAgICAgIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGlkZW50aWZpZXIpLFxuICAgICAgLy8gRmFsbGJhY2s6IElkZW50aWZpZXIgYXMtaXMgd2l0aCBleHRlbnNpb25cbiAgICAgIGAke2lkZW50aWZpZXJ9JHt0aGlzLmdldEZpbGVFeHRlbnNpb24oKX1gLFxuICAgICAgLy8gRmFsbGJhY2s6IElkZW50aWZpZXIgYWxyZWFkeSBpbmNsdWRlcyBleHRlbnNpb25cbiAgICAgIGlkZW50aWZpZXJcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5sb2FkKGZpbGVQYXRoKTtcbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBsb2FkZWQgZWxlbWVudCBtYXRjaGVzIHRoZSBpZGVudGlmaWVyXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHNpZGVzIHNvIFwiQ29kZSBSZXZpZXdcIiAoc3BhY2VzKSBtYXRjaGVzIFwiY29kZS1yZXZpZXdcIiAoaHlwaGVucylcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1ldGFOYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShlbGVtZW50Lm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoaWRlbnRpZmllcik7XG4gICAgICAgIGlmIChub3JtYWxpemVkTWV0YU5hbWUgPT09IG5vcm1hbGl6ZWRJZGVudGlmaWVyIHx8XG4gICAgICAgICAgICBlbGVtZW50Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgICBlbGVtZW50LmlkID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgZmFpbGVkIHRvIGxvYWQgLSB0cnkgbmV4dCBwYXRoXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZWxlbWVudFxuICAgKiBEZWxlZ2F0ZXMgdG8gZWxlbWVudCdzIG93biB2YWxpZGF0ZSBtZXRob2RcbiAgICpcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBib3RoICd2YWxpZCcgYW5kICdpc1ZhbGlkJyBwcm9wZXJ0aWVzLlxuICAgKiAgICAgICAgICAnaXNWYWxpZCcgaXMgZGVwcmVjYXRlZCAtIHVzZSAndmFsaWQnIGZvciBuZXcgY29kZS5cbiAgICovXG4gIHZhbGlkYXRlKGVsZW1lbnQ6IFQpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogU0VDVVJJVFk6IFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IGRlbGV0aW9uIG91dHNpZGUgZGlyZWN0b3J5XG4gICAqIENBQ0hFIEZJWDogVXNlcyBmaWxlcGF0aC1iYXNlZCBjYWNoZSByZW1vdmFsIHRvIHByZXZlbnQgc3RhbGUgZW50cmllc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5kZWxldGVgLFxuICAgICAgZGV0YWlsczogYEF0dGVtcHRpbmcgdG8gZGVsZXRlICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX06ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUodGhpcy5nZXRFbGVtZW50TGFiZWwoKSwgY29ycmVsYXRpb25JZCk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlEZWxldGVkKHJlbGF0aXZlUGF0aCk7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmRlbGV0ZTpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkUm9sbGJhY2soYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmRlbGV0ZTplcnJvcicsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZXJyb3IgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0cmFuc2FjdGlvbi5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FuRGVsZXRlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGb3JWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy5sb2FkRWxlbWVudFNuYXBzaG90KGFic29sdXRlUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBhd2FpdCB0aGlzLmNhbkRlbGV0ZShlbGVtZW50Rm9yVmFsaWRhdGlvbik7XG4gICAgICAgIGlmICghZGVjaXNpb24uYWxsb3dlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZWNpc2lvbi5yZWFzb24gPz8gYERlbGV0aW9uIG5vdCBwZXJtaXR0ZWQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtb3ZlZFRvQmFja3VwID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGlmICghbW92ZWRUb0JhY2t1cCkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmRlbGV0ZWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGRlbGV0ZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gZWxlbWVudCBleGlzdHNcbiAgICovXG4gIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoYWJzb2x1dGVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBmaWxlIHBhdGhcbiAgICovXG4gIHZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICAgIGlmICghc2FuaXRpemVkIHx8IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhbml0aXplZC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShzYW5pdGl6ZWQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9ucyA9IFsnLm1kJywgJy5tYXJrZG93bicsICcudHh0JywgJy55bWwnLCAnLnlhbWwnXTtcblxuICAgICAgcmV0dXJuIGV4dCA9PT0gJycgfHwgYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGVcbiAgICovXG4gIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGZpbGUgcGF0aCB0byBpdHMgYWJzb2x1dGUgZm9ybSBmb3IgY2FjaGUgY29uc2lzdGVuY3lcbiAgICogRW5zdXJlcyBjb25zaXN0ZW50IHBhdGggaGFuZGxpbmcgYWNyb3NzIHJlbGF0aXZlL2Fic29sdXRlIHBhdGhzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgPyBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aClcbiAgICAgIDogcGF0aC5ub3JtYWxpemUocGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgZmlsZVBhdGgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHsgcmVsYXRpdmVQYXRoOiBzdHJpbmc7IGFic29sdXRlUGF0aDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgIGlmICghc2FuaXRpemVkUGF0aCB8fCBzYW5pdGl6ZWRQYXRoLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgc2FuaXRpemVkUGF0aCA9PT0gJy4nIHx8IHNhbml0aXplZFBhdGggPT09IHBhdGguc2VwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRoOiBlbXB0eSBwYXRoIGlzIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYnNvbHV0ZSAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGhzIGFyZSBub3QgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aCAocmVtb3ZlIHJlZHVuZGFudCBzZXBhcmF0b3JzLCByZXNvbHZlIC4gYW5kIC4uKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGl2ZSA9IHBhdGgubm9ybWFsaXplKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gQnVpbGQgYWJzb2x1dGUgcGF0aFxuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIG5vcm1hbGl6ZWRSZWxhdGl2ZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgV0lUSE9VVCByZXNvbHZpbmcgc3ltbGlua3MgLSBqdXN0IGNoZWNrIHNlY3VyaXR5IGNvbnN0cmFpbnRzXG4gICAgICBhd2FpdCBQYXRoVmFsaWRhdG9yLnZhbGlkYXRlRWxlbWVudFBhdGhPbmx5KGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50RGlyKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBpbnB1dCBhcyByZWxhdGl2ZVBhdGggKGl0J3MgYWxyZWFkeSByZWxhdGl2ZSkgYW5kIGNvbXB1dGVkIGFic29sdXRlUGF0aFxuICAgICAgcmV0dXJuIHsgcmVsYXRpdmVQYXRoOiBub3JtYWxpemVkUmVsYXRpdmUsIGFic29sdXRlUGF0aCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aDogJHtyZWFzb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQodGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCkpO1xuICAgIGlmICghZWxlbWVudElkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5nZXQoZWxlbWVudElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgY2FjaGUgbG9va3VwIGJ5IGFic29sdXRlIHBhdGguXG4gICAqIEFsbG93cyBzdWJjbGFzc2VzIHdpdGggY3VzdG9tIGxvYWQoKSBvdmVycmlkZXMgKGUuZy4gTWVtb3J5TWFuYWdlcilcbiAgICogdG8gY2hlY2sgdGhlIExSVSBjYWNoZSBiZWZvcmUgcmUtcmVhZGluZyBmcm9tIGRpc2suXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q2FjaGVkQnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEVsZW1lbnRTbmFwc2hvdChhYnNvbHV0ZVBhdGg6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRWxlbWVudEZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZEVsZW1lbnRTbmFwc2hvdGBcbiAgICB9KTtcbiAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIocmF3LCB1bmRlZmluZWQsIHtcbiAgICAgIGNvbnRlbnRDb250ZXh0OiBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV0sXG4gICAgfSk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkLmRhdGEpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcbiAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgZXZlbnQgcGF5bG9hZCBmb3IgZWxlbWVudCBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKlxuICAgKiBUaGlzIGhlbHBlciBpcyBhdmFpbGFibGUgdG8gc3ViY2xhc3NlcyB0byBlbnN1cmUgY29uc2lzdGVudCBldmVudCBwYXlsb2FkXG4gICAqIHN0cnVjdHVyZSB3aGVuIGVtaXR0aW5nIGN1c3RvbSBldmVudHMgdmlhIHRoZSBkaXNwYXRjaGVyIGdldHRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEV2ZW50IHBhcmFtZXRlcnMgaW5jbHVkaW5nIGNvcnJlbGF0aW9uIElELCBlbGVtZW50LCBmaWxlIHBhdGgsIGFuZCBvcHRpb25hbCBlcnJvclxuICAgKiBAcmV0dXJucyBGdWxseS1mb3JtZWQgRWxlbWVudEV2ZW50UGF5bG9hZCByZWFkeSBmb3IgZW1pc3Npb25cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVFdmVudFBheWxvYWQocGFyYW1zOiB7XG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgIGZpbGVQYXRoPzogc3RyaW5nO1xuICAgIGVsZW1lbnQ/OiBUO1xuICAgIGVycm9yPzogdW5rbm93bjtcbiAgfSk6IEVsZW1lbnRFdmVudFBheWxvYWQge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHBhcmFtcy5lbGVtZW50Py5pZDtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gZWxlbWVudElkICE9PSB1bmRlZmluZWQgPyB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5nZXQoZWxlbWVudElkKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgY29ycmVsYXRpb25JZDogcGFyYW1zLmNvcnJlbGF0aW9uSWQsXG4gICAgICBlbGVtZW50VHlwZTogdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgIGVsZW1lbnRJZCxcbiAgICAgIGZpbGVQYXRoOiBwYXJhbXMuZmlsZVBhdGgsXG4gICAgICBtZXRhZGF0YTogRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5zbmFwc2hvdE1ldGFkYXRhKHBhcmFtcy5lbGVtZW50KSxcbiAgICAgIGdlbmVyYXRpb24sXG4gICAgICBlcnJvcjogcGFyYW1zLmVycm9yXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxDaGFuZ2UocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5pbnZhbGlkYXRlKCk7XG4gICAgLy8gQ2xlYXIgZXJyb3Igc3VwcHJlc3Npb24gc28gYSBjaGFuZ2VkIGZpbGUgZ2V0cyBmcmVzaCBsb2dnaW5nXG4gICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgJ2VsZW1lbnQ6ZXh0ZXJuYWwtY2hhbmdlJyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSkge1xuICAgICAgdm9pZCB0aGlzLmxvYWQocmVsYXRpdmVQYXRoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1dG8gcmVsb2FkIGFmdGVyIGV4dGVybmFsIGNoYW5nZSBmYWlsZWQnLCB7XG4gICAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZWxlbWVudCB0byBib3RoIGNhY2hlcyAoYmlkaXJlY3Rpb25hbCBtYXBwaW5nKVxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2FjaGVcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCBjYWNoZUVsZW1lbnQoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG5cbiAgICAvLyBDbGVhciBhbnkgc3RhbGUgY2FjaGUgZW50cmllcyBmb3IgdGhpcyBmaWxlcGF0aCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgb25lLlxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZ2VuZXJhdGVJZCgpIGluIEJhc2VFbGVtZW50LnRzIGluY2x1ZGVzIGEgRGF0ZS5ub3coKVxuICAgIC8vIHRpbWVzdGFtcCwgY2F1c2luZyBlYWNoIGxvYWQgZnJvbSBkaXNrIHRvIGdlbmVyYXRlIGEgZGlmZmVyZW50IElELiBXaXRob3V0IHRoaXNcbiAgICAvLyBjbGVhbnVwLCBvbGQgSURzIHJlbWFpbiBpbiB0aGUgY2FjaGUgYXMgc3RhbGUgZGF0YSwgbGVhZGluZyB0byBpbmNvbnNpc3RlbnRcbiAgICAvLyByZXN1bHRzIGluIG1ldGhvZHMgbGlrZSBmaW5kUGVyc29uYSgpIG9yIGxpc3QoKS5cbiAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nSWQgJiYgZXhpc3RpbmdJZCAhPT0gZWxlbWVudC5pZCkge1xuICAgICAgLy8gQ2xlYXIgc3RhbGUgY2FjaGUgZW50cnkgd2hlbiBlbGVtZW50IElEIGhhcyBjaGFuZ2VkXG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRzLnNldChlbGVtZW50LmlkLCBlbGVtZW50KTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5zZXQoYWJzb2x1dGVQYXRoLCBlbGVtZW50LmlkKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmNhY2hlR2VuZXJhdGlvbkNvdW50ZXI7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuc2V0KGVsZW1lbnQuaWQsIGdlbmVyYXRpb24pO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgPyBwYXRoLnJlbGF0aXZlKHRoaXMuZWxlbWVudERpciwgZmlsZVBhdGgpXG4gICAgICA6IGZpbGVQYXRoO1xuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZW5hbWUnLCB7XG4gICAgICAgIHZhbHVlOiBwYXRoLmJhc2VuYW1lKHJlbGF0aXZlUGF0aCksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2ZpbGVQYXRoJywge1xuICAgICAgICB2YWx1ZTogcmVsYXRpdmVQYXRoLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gYXR0YWNoIGZpbGVuYW1lIG1ldGFkYXRhIHRvIGVsZW1lbnQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGEgZnJlc2ggZGlzayBzY2FuIGFuZCBldmljdCBhbnkgbW9kaWZpZWQvcmVtb3ZlZCBlbnRyaWVzIGZyb20gdGhlXG4gICAqIGluLW1lbW9yeSBMUlUgY2FjaGUuIENhbGwgYmVmb3JlIGZpbmRCeU5hbWUoKSB3aGVuIGZyZXNobmVzcyBpcyBjcml0aWNhbFxuICAgKiAoZS5nLiBvbiBlbnNlbWJsZSBhY3RpdmF0aW9uKSB0byBwaWNrIHVwIGV4dGVybmFsIGZpbGUgY2hhbmdlcyB0aGF0XG4gICAqIG9jY3VycmVkIHNpbmNlIHRoZSBsYXN0IHNjYW4sIGV2ZW4gaWYgdGhlIHNjYW4gY29vbGRvd24gaXMgc3RpbGwgYWN0aXZlLlxuICAgKlxuICAgKiBVbmxpa2UgbGlzdCgpLCB0aGlzIGRvZXMgbm90IGxvYWQgYWxsIGVsZW1lbnRzIOKAlCBpdCBvbmx5IGV2aWN0cyBzdGFsZSBvbmVzLlxuICAgKiBGaXhlcyAjMTg5NSAoZW5zZW1ibGUgYWN0aXZhdGlvbiBzZXJ2aW5nIHN0YWxlIGNhY2hlZCBlbGVtZW50IGxpc3QpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNjYW5BbmRFdmljdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5pbnZhbGlkYXRlKCk7IC8vIGJ5cGFzcyBjb29sZG93biBzbyB0aGUgbmV4dCBzY2FuIGhpdHMgZGlza1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIFsuLi5kaWZmLm1vZGlmaWVkLCAuLi5kaWZmLnJlbW92ZWRdKSB7XG4gICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCByZWxQYXRoKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nSWQpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IC8qIG5vbi1mYXRhbCDigJQgY2FjaGUgbWF5IGJlIHNsaWdodGx5IHN0YWxlLCBidXQgYWN0aXZhdGlvbiBwcm9jZWVkcyAqLyB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gYm90aCBjYWNoZXMgYnkgZmlsZSBwYXRoXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIGRlbGV0aW9uIHRvIGF2b2lkIHN0YWxlIGNhY2hlIGVudHJpZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCB1bmNhY2hlQnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVW5jYWNoZWQgZWxlbWVudCAke2VsZW1lbnRJZH0gZnJvbSAke2Fic29sdXRlUGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBlbGVtZW50c1xuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjYWNoZSBzaXplIG1ldHJpY3NcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZVN0YXRzKCk6IHsgZWxlbWVudENvdW50OiBudW1iZXI7IHBhdGhNYXBwaW5nczogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVsZW1lbnRzU3RhdHMgPSB0aGlzLmVsZW1lbnRzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgcGF0aFN0YXRzID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0U3RhdHMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50Q291bnQ6IGVsZW1lbnRzU3RhdHMuc2l6ZSxcbiAgICAgIHBhdGhNYXBwaW5nczogcGF0aFN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBpbnRlcm5hbCBMUlUgY2FjaGUgaW5zdGFuY2VzIGZvciBtZXRyaWNzIGNvbGxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0TWV0cmljc0NhY2hlcygpOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgaW5zdGFuY2U6IExSVUNhY2hlPHVua25vd24+IH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBuYW1lOiBgZWxlbWVudHM6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmVsZW1lbnRzIGFzIExSVUNhY2hlPHVua25vd24+IH0sXG4gICAgICB7IG5hbWU6IGBwYXRoSW5kZXg6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmZpbGVQYXRoVG9JZCBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiByZXNvdXJjZXMgYW5kIGNsZWFudXBcbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYWRkIHRoZWlyIG93biBjbGVhbnVwIGxvZ2ljXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW1vcnlCdWRnZXQpIHtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXA/LigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX1NYW5hZ2VyIGRpc3Bvc2VkIGFuZCBjYWNoZXMgY2xlYXJlZGApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklMRU5BTUUgTk9STUFMSVpBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIG5hbWUgdG8ga2ViYWItY2FzZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBmb3JtYXR0aW5nLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB1bmlmaWVkIGZpbGVuYW1lIG5vcm1hbGl6YXRpb24gYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLFxuICAgKiBlbnN1cmluZyBjb25zaXN0ZW50IG5hbWluZyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmb3JtYXQgKENhbWVsQ2FzZSwgc3BhY2VzLFxuICAgKiB1bmRlcnNjb3JlcywgbWl4ZWQgY2FzZSwgZXRjLikuXG4gICAqXG4gICAqIFRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIChpbiBvcmRlcik6XG4gICAqIDEuIEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKE15TmFtZSAtPiBNeS1OYW1lKVxuICAgKiAyLiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAqIDMuIENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAqIDQuIFN0cmlwIGludmFsaWQgY2hhcmFjdGVycyAoa2VlcCBvbmx5IGEteiwgMC05LCAtKVxuICAgKiA1LiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAqIDYuIFRyaW0gbGVhZGluZy90cmFpbGluZyBoeXBoZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ1JVRFYtQWdlbnQtRGVsdGFcIikgLy8gXCJjcnVkdi1hZ2VudC1kZWx0YVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ3JlYXRpdmUgV3JpdGVyXCIpICAgLy8gXCJjcmVhdGl2ZS13cml0ZXJcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNhbWVsQ2FzZU5hbWVcIikgICAgIC8vIFwiY2FtZWwtY2FzZS1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJteV9za2lsbF9uYW1lXCIpICAgICAvLyBcIm15LXNraWxsLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIlNwZWNpYWxAQ2hhcnMhXCIpICAgIC8vIFwic3BlY2lhbC1jaGFyc1wiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiLS1sZWFkaW5nLWFuZC10cmFpbGluZy0tXCIpIC8vIFwibGVhZGluZy1hbmQtdHJhaWxpbmdcIlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBlbGVtZW50IG5hbWUgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQga2ViYWItY2FzZSBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqL1xuICBwcm90ZWN0ZWQgbm9ybWFsaXplRmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3VubmFtZWQnO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gICAgICAvLyBTdGVwIDE6IEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKGxvd2VyY2FzZSBmb2xsb3dlZCBieSB1cHBlcmNhc2UpXG4gICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJylcbiAgICAgIC8vIFN0ZXAgMjogUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCAzOiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIFN0ZXAgNDogU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYWxwaGFudW1lcmljIGFuZCBoeXBoZW5zKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKVxuICAgICAgLy8gU3RlcCA1OiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCA2OiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogTm9ybWFsaXplcyB0aGUgZWxlbWVudCBuYW1lIChoYW5kbGluZyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAqIGFuZCBhcHBlbmRzIHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHBlcnNvbmFzLywgc2tpbGxzLywgZXRjLilcbiAgICogYWxyZWFkeSBwcm92aWRlcyB0eXBlIGNvbnRleHQsIHNvIHRoZSB0eXBlIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBjb252ZXJ0IHRvIGEgZmlsZW5hbWVcbiAgICogQHJldHVybnMgVGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSAoZS5nLiwgXCJjb2RlLXJldmlldy5tZFwiKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJDb2RlIFJldmlld1wiKSAgICAgICAgIC8vIOKGkiBcImNvZGUtcmV2aWV3Lm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiRGVidWcgRGV0ZWN0aXZlXCIpICAgICAvLyDihpIgXCJkZWJ1Zy1kZXRlY3RpdmUubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJCdWdSZXBvcnRcIikgICAgICAgICAgIC8vIOKGkiBcImJ1Zy1yZXBvcnQubWRcIiAoQ2FtZWxDYXNlIHNwbGl0KVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJmaXgtcGVyc29uYS1oZWxwZXJcIikgIC8vIOKGkiBcImZpeC1wZXJzb25hLWhlbHBlci5tZFwiIChubyBtYW5nbGluZylcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkgfHwgJ3VubmFtZWQnO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpO1xuICAgIHJldHVybiBgJHtub3JtYWxpemVkTmFtZX0ke2V4dGVuc2lvbn1gO1xuICB9XG5cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBQlNUUkFDVCBNRVRIT0RTIC0gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgbWV0YWRhdGEgZnJvbSBmcm9udG1hdHRlclxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIHZhbGlkYXRpb24gbG9naWNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBhbmQgdHlwZWQgbWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8VFsnbWV0YWRhdGEnXT47XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBFbGVtZW50VmFsaWRhdG9yIHZpYSBWYWxpZGF0aW9uUmVnaXN0cnkgaW5zdGVhZC5cbiAgICogV2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSwgX3N0cmljdD86IGJvb2xlYW4pOiBQcm9taXNlPGltcG9ydCgnLi4vLi4vdXRpbHMvdmFsaWRhdGlvbi9GaWVsZFZhbGlkYXRvci5qcycpLlZhbGlkYXRpb25FcnJvcltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcnMubWFwKGUgPT4gKHsgZmllbGQ6ICdnZW5lcmFsJywgbWVzc2FnZTogZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVsZW1lbnQgaW5zdGFuY2UgZnJvbSBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGNvbnN0cnVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBWYWxpZGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBFbGVtZW50IGNvbnRlbnQgKGluc3RydWN0aW9ucywgdGVtcGxhdGUsIGV0Yy4pXG4gICAqIEByZXR1cm5zIE5ldyBlbGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogVFsnbWV0YWRhdGEnXSwgY29udGVudDogc3RyaW5nKTogVDtcblxuICAvKipcbiAgICogU2VyaWFsaXplIGFuIGVsZW1lbnQgdG8gZmlsZSBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgY2FuIGN1c3RvbWl6ZSBzZXJpYWxpemF0aW9uIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAodXN1YWxseSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogVCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogTW9zdCBlbGVtZW50cyB1c2UgLm1kLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGVcbiAgICovXG4gIGFic3RyYWN0IGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZWxlbWVudCBmcm9tIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgaW1wb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgZXhwb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IFQsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz47XG59XG4iXX0=
|