@dollhousemcp/mcp-server 2.0.26 → 2.0.27-rc.2

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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.27-rc.2] - 2026-04-19
4
+
5
+ - Version bump
6
+
3
7
  ## [2.0.26] - 2026-04-17
4
8
 
5
9
  - Version bump
@@ -38,6 +38,14 @@ export declare const resolveEnsembleElementTypes: typeof resolveElementTypes;
38
38
  * - Ensemble creation and validation
39
39
  * - Element reference management
40
40
  * - Import/export in multiple formats
41
+ *
42
+ * MEMORY BEHAVIOR:
43
+ * - Tracks warned legacy element-field fingerprints in memory so repeated parses
44
+ * of the same ensemble/element/field combination do not keep spamming logs.
45
+ * - Fingerprints are scoped to the manager lifetime and grow with the number of
46
+ * unique legacy field sightings.
47
+ * - Long-running servers can clear this history explicitly with
48
+ * clearLegacyElementWarningHistory(), and dispose() also clears it.
41
49
  */
42
50
  export declare class EnsembleManager extends BaseElementManager<Ensemble> {
43
51
  private metadataService;
@@ -45,8 +53,18 @@ export declare class EnsembleManager extends BaseElementManager<Ensemble> {
45
53
  private validationService;
46
54
  private serializationService;
47
55
  private activeEnsembleNames;
56
+ private readonly legacyElementFieldWarnings;
48
57
  constructor(portfolioManager: PortfolioManager, fileLockManager: FileLockManager, fileOperationsService: FileOperationsService, validationRegistry: ValidationRegistry, serializationService: SerializationService, metadataService: MetadataService, fileWatchService?: FileWatchService, memoryBudget?: import('../../cache/CacheMemoryBudget.js').CacheMemoryBudget, backupService?: import('../../services/BackupService.js').BackupService);
49
58
  protected getElementLabel(): string;
59
+ /**
60
+ * Clear warn-once state for legacy ensemble element fields.
61
+ *
62
+ * Useful for long-lived processes that want to cap in-memory warning history
63
+ * or intentionally re-emit migration guidance after a maintenance boundary.
64
+ */
65
+ clearLegacyElementWarningHistory(): void;
66
+ dispose(): void;
67
+ private warnOnceForLegacyElementField;
50
68
  /**
51
69
  * Parse metadata from YAML frontmatter
52
70
  *
@@ -1 +1 @@
1
- {"version":3,"file":"EnsembleManager.d.ts","sourceRoot":"","sources":["../../../src/elements/ensembles/EnsembleManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EnsembleManager.d.ts","sourceRoot":"","sources":["../../../src/elements/ensembles/EnsembleManager.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,14 @@ export const resolveEnsembleElementTypes = resolveElementTypes;
41
41
  * - Ensemble creation and validation
42
42
  * - Element reference management
43
43
  * - Import/export in multiple formats
44
+ *
45
+ * MEMORY BEHAVIOR:
46
+ * - Tracks warned legacy element-field fingerprints in memory so repeated parses
47
+ * of the same ensemble/element/field combination do not keep spamming logs.
48
+ * - Fingerprints are scoped to the manager lifetime and grow with the number of
49
+ * unique legacy field sightings.
50
+ * - Long-running servers can clear this history explicitly with
51
+ * clearLegacyElementWarningHistory(), and dispose() also clears it.
44
52
  */
45
53
  export class EnsembleManager extends BaseElementManager {
46
54
  metadataService;
@@ -48,6 +56,7 @@ export class EnsembleManager extends BaseElementManager {
48
56
  validationService;
49
57
  serializationService;
50
58
  activeEnsembleNames = new Set();
59
+ legacyElementFieldWarnings = new Set();
51
60
  constructor(portfolioManager, fileLockManager, fileOperationsService, validationRegistry, serializationService, metadataService, fileWatchService, memoryBudget, backupService) {
52
61
  super(ElementType.ENSEMBLE, portfolioManager, fileLockManager, { fileWatchService, memoryBudget, backupService }, fileOperationsService, validationRegistry);
53
62
  this.metadataService = metadataService;
@@ -58,6 +67,28 @@ export class EnsembleManager extends BaseElementManager {
58
67
  getElementLabel() {
59
68
  return 'ensemble';
60
69
  }
70
+ /**
71
+ * Clear warn-once state for legacy ensemble element fields.
72
+ *
73
+ * Useful for long-lived processes that want to cap in-memory warning history
74
+ * or intentionally re-emit migration guidance after a maintenance boundary.
75
+ */
76
+ clearLegacyElementWarningHistory() {
77
+ this.legacyElementFieldWarnings.clear();
78
+ }
79
+ dispose() {
80
+ super.dispose();
81
+ this.clearLegacyElementWarningHistory();
82
+ }
83
+ warnOnceForLegacyElementField(ensembleName, index, field, replacement) {
84
+ // Keep the fingerprint stable across parse/create paths for the same ensemble element.
85
+ const fingerprint = `${ensembleName}:${index}:${field}`;
86
+ if (this.legacyElementFieldWarnings.has(fingerprint)) {
87
+ return;
88
+ }
89
+ this.legacyElementFieldWarnings.add(fingerprint);
90
+ logger.warn(`Ensemble '${ensembleName}' element at index ${index} uses deprecated '${field}' field. Use '${replacement}' instead.`);
91
+ }
61
92
  /**
62
93
  * Parse metadata from YAML frontmatter
63
94
  *
@@ -169,7 +200,7 @@ export class EnsembleManager extends BaseElementManager {
169
200
  }
170
201
  // Log deprecation warning if using legacy 'name' field
171
202
  if (elem.name && !elem.element_name) {
172
- logger.warn(`Ensemble element at index ${index} uses deprecated 'name' field. Use 'element_name' instead.`);
203
+ this.warnOnceForLegacyElementField(name, index, 'name', 'element_name');
173
204
  }
174
205
  const elementNameResult = this.validationService.validateAndSanitizeInput(String(rawElementName), { maxLength: SECURITY_LIMITS.MAX_NAME_LENGTH, allowSpaces: true });
175
206
  if (!elementNameResult.isValid) {
@@ -181,7 +212,7 @@ export class EnsembleManager extends BaseElementManager {
181
212
  const rawElementType = elem.element_type || elem.type || 'skill';
182
213
  // Log deprecation warning if using legacy 'type' field
183
214
  if (elem.type && !elem.element_type) {
184
- logger.warn(`Ensemble element at index ${index} uses deprecated 'type' field. Use 'element_type' instead.`);
215
+ this.warnOnceForLegacyElementField(name, index, 'type', 'element_type');
185
216
  }
186
217
  const elementTypeResult = this.validationService.validateAndSanitizeInput(String(rawElementType), { maxLength: SECURITY_LIMITS.MAX_TAG_LENGTH, allowSpaces: false });
187
218
  if (!elementTypeResult.isValid) {
@@ -518,6 +549,7 @@ export class EnsembleManager extends BaseElementManager {
518
549
  if (!metadata.name) {
519
550
  throw new Error('Ensemble must have a name');
520
551
  }
552
+ const ensembleName = metadata.name;
521
553
  let rawElements = metadata.elements || [];
522
554
  // Migrate legacy element fields (name -> element_name, type -> element_type)
523
555
  // This ensures backwards compatibility with API calls using old field names
@@ -529,7 +561,7 @@ export class EnsembleManager extends BaseElementManager {
529
561
  }
530
562
  // Log deprecation warning if using legacy 'name' field
531
563
  if (elem.name && !elem.element_name) {
532
- logger.warn(`Ensemble element at index ${index} uses deprecated 'name' field. Use 'element_name' instead.`);
564
+ this.warnOnceForLegacyElementField(ensembleName, index, 'name', 'element_name');
533
565
  }
534
566
  // Support both element_type (new standard) and type (legacy)
535
567
  // Issue #466: No longer defaults to 'skill' — callers must provide type
@@ -541,7 +573,7 @@ export class EnsembleManager extends BaseElementManager {
541
573
  }
542
574
  // Log deprecation warning if using legacy 'type' field
543
575
  if (elem.type && !elem.element_type) {
544
- logger.warn(`Ensemble element at index ${index} uses deprecated 'type' field. Use 'element_type' instead.`);
576
+ this.warnOnceForLegacyElementField(ensembleName, index, 'type', 'element_type');
545
577
  }
546
578
  return {
547
579
  element_name: elementName,
@@ -826,4 +858,4 @@ export class EnsembleManager extends BaseElementManager {
826
858
  }
827
859
  }
828
860
  }
829
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsbUJBQW1CLENBQUM7QUFFL0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxrQkFBNEI7SUFZckQ7SUFYTyxZQUFZLENBQVM7SUFDOUIsaUJBQWlCLENBQW9CO0lBQ3JDLG9CQUFvQixDQUF1QjtJQUMzQyxtQkFBbUIsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVyRCxZQUNFLGdCQUFrQyxFQUNsQyxlQUFnQyxFQUNoQyxxQkFBNEMsRUFDNUMsa0JBQXNDLEVBQ3RDLG9CQUEwQyxFQUNsQyxlQUFnQyxFQUN4QyxnQkFBbUMsRUFDbkMsWUFBMkUsRUFDM0UsYUFBdUU7UUFFdkUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFMckosb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBTXhDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDbkQsQ0FBQztJQUVrQixlQUFlO1FBQ2hDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ2dCLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBUztRQUM5Qyw4RUFBOEU7UUFDOUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pGLFFBQVEsRUFBRSxJQUFJO1lBQ2QsU0FBUyxFQUFFLGVBQWUsQ0FBQyxlQUFlO1NBQzNDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDO1FBRXZDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLElBQUksV0FBK0IsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQy9GLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFNBQVMsRUFBRSxlQUFlLENBQUMsc0JBQXNCO2dCQUNqRCxPQUFPLEVBQUUsbUJBQW1CLENBQUMsZ0JBQWdCO2FBQzlDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0QsV0FBVyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUM7UUFDMUMsQ0FBQztRQUVELG9HQUFvRztRQUNwRyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7UUFDM0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDOUcsU0FBUyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUI7WUFDaEQsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDLGNBQWUsQ0FBQztRQUVwRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxrQkFBeUIsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsS0FBSyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7UUFDM0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDOUcsU0FBUyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUI7WUFDaEQsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDLGNBQWUsQ0FBQztRQUVwRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxrQkFBeUIsQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQywyQkFBMkIsS0FBSyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7UUFFM0csK0RBQStEO1FBQy9ELElBQUksbUJBQTJCLENBQUM7UUFDaEMsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUNoRyxTQUFTLEVBQUUsZUFBZSxDQUFDLHFCQUFxQjtZQUNoRCxXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLGNBQWUsQ0FBQztRQUU1RCx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDdEUsSUFBSSxjQUFjLENBQUM7UUFFbkIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLGNBQWMsR0FBRztnQkFDZixpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsQ0FBQyxpQkFBaUIsSUFBSSxlQUFlLENBQUMsWUFBWTtnQkFDL0gsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGFBQWEsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXO2dCQUM3RSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxxQkFBcUIsSUFBSSxpQkFBaUIsQ0FBQyxrQkFBa0IsSUFBSSxlQUFlLENBQUMsbUJBQW1CO2FBQzNJLENBQUM7UUFDSixDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBc0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUMvRSxxREFBcUQ7WUFDckQseUZBQXlGO1lBQ3pGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUN0RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssK0RBQStELENBQUMsQ0FBQztZQUM1RyxDQUFDO1lBQ0QsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsS0FBSyw0REFBNEQsQ0FBQyxDQUFDO1lBQzlHLENBQUM7WUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FDdkUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUN0QixFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDbEUsQ0FBQztZQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxjQUFlLENBQUM7WUFFdEQscURBQXFEO1lBQ3JELHlGQUF5RjtZQUN6RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDO1lBQ2pFLHVEQUF1RDtZQUN2RCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEtBQUssNERBQTRELENBQUMsQ0FBQztZQUM5RyxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQ3ZFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFDdEIsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQ2xFLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsY0FBZSxDQUFDO1lBRXRELHFEQUFxRDtZQUNyRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQ25ELEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQ3pFLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsY0FBZSxDQUFDO1lBRXRELHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFrQixDQUFDLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsS0FBSyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCwyREFBMkQ7WUFDM0QsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQzdFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxFQUNuQyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUN6RSxDQUFDO1lBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxLQUFLLEtBQUssdUJBQXVCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUNELE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsY0FBZSxDQUFDO1lBRWxFLHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGlCQUF3QixDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsS0FBSyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFaEQsOEVBQThFO1lBQzlFLG9GQUFvRjtZQUNwRiwwREFBMEQ7WUFDMUQsSUFBSSxTQUE2QixDQUFDO1lBQ2xDLElBQUksaUJBQWlCLEtBQUssYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUNyRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN0QjtvQkFDRSxTQUFTLEVBQUUsZUFBZSxDQUFDLG9CQUFvQjtvQkFDL0MsV0FBVyxFQUFFLElBQUk7b0JBQ2pCLGFBQWEsRUFBRSw4QkFBOEIsQ0FBRSxxQ0FBcUM7aUJBQ3JGLENBQ0YsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixLQUFLLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRyxDQUFDO2dCQUNELFNBQVMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDO1lBQzdDLENBQUM7WUFFRCxxREFBcUQ7WUFDckQsSUFBSSxZQUFrQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLHFCQUFxQixHQUFhLEVBQUUsQ0FBQztnQkFDM0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztvQkFDL0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDN0UsU0FBUyxFQUFFLGVBQWUsQ0FBQyxlQUFlO3dCQUMxQyxXQUFXLEVBQUUsSUFBSTtxQkFDbEIsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsY0FBYyxLQUFLLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNwRyxDQUFDO29CQUNELHFCQUFxQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBZSxDQUFDLENBQUM7Z0JBQ3hELENBQUM7Z0JBQ0QsWUFBWSxHQUFHLHFCQUFxQixDQUFDO1lBQ3ZDLENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsSUFBSSxPQUEyQixDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDMUYsU0FBUyxFQUFFLGVBQWUsQ0FBQyxzQkFBc0I7b0JBQ2pELFdBQVcsRUFBRSxJQUFJO29CQUNqQixTQUFTLEVBQUUsYUFBYSxDQUFFLCtEQUErRDtpQkFDMUYsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLEtBQUssS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVGLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUM7WUFDekMsQ0FBQztZQUVELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFdBQVc7Z0JBQ3pCLFlBQVksRUFBRSxXQUFXO2dCQUN6QixJQUFJLEVBQUUsV0FBMEI7Z0JBQ2hDLFFBQVE7Z0JBQ1IsVUFBVSxFQUFFLGlCQUFtQztnQkFDL0MsU0FBUztnQkFDVCxZQUFZO2dCQUNaLE9BQU87YUFDUixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCx5QkFBeUI7UUFDekIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNuRCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEcsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7UUFFOUcsbURBQW1EO1FBQ25ELElBQUksSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUN4QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzdFLFNBQVMsRUFBRSxlQUFlLENBQUMsY0FBYztvQkFDekMsV0FBVyxFQUFFLElBQUk7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxJQUFJO1lBQ0osV0FBVyxFQUFFLFdBQVcsSUFBSSxFQUFFO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU87WUFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuRCxJQUFJO1lBQ0osa0JBQWtCLEVBQUUsa0JBQXdDO1lBQzVELGtCQUFrQixFQUFFLGtCQUFnRDtZQUNwRSxjQUFjLEVBQUUsY0FBK0M7WUFDL0QsY0FBYztZQUNkLFdBQVc7WUFDWCxlQUFlO1lBQ2YsUUFBUTtZQUNSLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBK0IsQ0FBQyxFQUFHLGFBQWE7U0FDekgsQ0FBQztRQUVGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDZ0IsYUFBYSxDQUFDLFFBQTBCLEVBQUUsUUFBZ0I7UUFDM0UsT0FBUSxRQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFFLCtDQUErQztRQUN6RixNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakYsZ0VBQWdFO1FBQ2hFLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUM5QyxPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDZ0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWlCO1FBQ3pELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFbEMsMkNBQTJDO1FBQzNDLE1BQU0sV0FBVyxHQUFRO1lBQ3ZCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixJQUFJLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDM0MsY0FBYyxFQUFFLElBQUksRUFBRyxtQ0FBbUM7WUFDMUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3JCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUN6QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1lBQy9DLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7WUFDL0MsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO1lBQ3ZDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7U0FDMUMsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixXQUFXLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDbEQsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QixXQUFXLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDdkQsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixXQUFXLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDL0MsQ0FBQztRQUVELCtFQUErRTtRQUMvRSxXQUFXLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xELE1BQU0sUUFBUSxHQUFRO2dCQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxvREFBb0Q7UUFDcEQsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUU7WUFDcEUsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFBRywyREFBMkQ7WUFDNUUsYUFBYSxFQUFFLElBQUksRUFBRyw0Q0FBNEM7WUFDbEUsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxHQUFHO1lBQ2QsV0FBVyxFQUFFLEtBQUssQ0FBRSwrQ0FBK0M7U0FDcEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQWlCO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRSxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNNLGdCQUFnQjtRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNNLEtBQUssQ0FBQyxhQUFhLENBQzFCLElBQVksRUFDWixTQUF1QyxVQUFVO1FBRWpELElBQUksQ0FBQztZQUNILElBQUksTUFBVyxDQUFDO1lBRWhCLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0JBQ2pELE1BQU0sRUFBRSwrQkFBK0I7aUJBQ3hDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixpREFBaUQ7Z0JBQ2pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7b0JBQzlELFdBQVcsRUFBRSxLQUFLLEVBQUUsZ0NBQWdDO29CQUNwRCxlQUFlLEVBQUUsSUFBSTtvQkFDckIsTUFBTSxFQUFFLCtCQUErQjtpQkFDeEMsQ0FBQyxDQUFDO2dCQUVILE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNyQixzREFBc0Q7WUFDeEQsQ0FBQztZQUVELGlCQUFpQjtZQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbEQsa0JBQWtCO1lBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVqRix3QkFBd0I7WUFDeEIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsd0JBQXdCLENBQUMsUUFBUTtnQkFDdkMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLCtCQUErQjtnQkFDdkMsT0FBTyxFQUFFLHNCQUFzQixRQUFRLENBQUMsSUFBSSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxXQUFXO2FBQ3pGLENBQUMsQ0FBQztZQUVILE9BQU8sUUFBUSxDQUFDO1FBRWxCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsd0JBQXdCLENBQUMsUUFBUTtnQkFDdkMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLE9BQU8sRUFBRSw4QkFBOEIsS0FBSyxFQUFFO2FBQy9DLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsYUFBYSxDQUMxQixPQUFpQixFQUNqQixTQUF1QyxVQUFVO1FBRWpELElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE9BQU8sT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpRjtRQUM1RixpREFBaUQ7UUFDakQseUZBQXlGO1FBQ3pGLHVFQUF1RTtRQUN2RSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFDM0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQ2pDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUUxQyw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQXNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDdkYsNkRBQTZEO1lBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssK0RBQStELENBQUMsQ0FBQztZQUM1RyxDQUFDO1lBQ0QsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsS0FBSyw0REFBNEQsQ0FBQyxDQUFDO1lBQzlHLENBQUM7WUFFRCw2REFBNkQ7WUFDN0Qsd0VBQXdFO1lBQ3hFLDRDQUE0QztZQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLFlBQVksV0FBVyxjQUFjLEtBQUssd0JBQXdCO29CQUNsRSxnRkFBZ0YsQ0FDakYsQ0FBQztZQUNKLENBQUM7WUFDRCx1REFBdUQ7WUFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixLQUFLLDREQUE0RCxDQUFDLENBQUM7WUFDOUcsQ0FBQztZQUVELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFdBQVc7Z0JBQ3pCLFlBQVksRUFBRSxXQUFXO2dCQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxZQUFZO2dCQUNqRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRO2dCQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRO2dCQUN2QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ0gsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBcUI7WUFDckMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUU7WUFDdkMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksT0FBTztZQUNwQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDdkQsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUN6QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLElBQUssUUFBZ0IsQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsQ0FBQyxtQkFBbUI7WUFDakksa0JBQWtCLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixJQUFLLFFBQWdCLENBQUMsbUJBQW1CLElBQUksaUJBQWlCLENBQUMsbUJBQW1CO1lBQ2pJLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYyxJQUFJLGlCQUFpQixDQUFDLGVBQWU7WUFDNUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO1lBQ3ZDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLFlBQVk7WUFDbkUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLElBQUksaUJBQWlCLENBQUMsaUJBQWlCO1lBQ2hGLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsZ0ZBQWdGO1lBQ2hGLFVBQVUsRUFBRSx3QkFBd0IsQ0FBRSxRQUFnQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSyxFQUFFLFVBQVUsRUFBRSxRQUE4QyxDQUFDO1NBQy9JLENBQUM7UUFFRiwyRUFBMkU7UUFDM0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1RCxpRUFBaUU7UUFDakUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FDbEUsQ0FBQztRQUNGLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixZQUFZLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXpGLDBFQUEwRTtRQUMxRSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixRQUFRLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN0QyxDQUFDO1FBRUQsZUFBZTtRQUNmLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEMsZ0VBQWdFO1FBQ2hFLDJFQUEyRTtRQUUzRSxlQUFlO1FBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxLQUFLO1lBQ3BDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUscUJBQXFCLFlBQVksQ0FBQyxJQUFJLEVBQUU7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLFFBQVEsQ0FBQyxPQUFpQjtRQUNqQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWlCLEVBQUUsUUFBZ0I7UUFDckQsa0NBQWtDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksMEJBQTBCLENBQUM7WUFDckcsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNwQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLHdCQUF3QixDQUFDLE9BQU87WUFDdEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUsc0JBQXNCLFFBQVEsRUFBRTtTQUMxQyxDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFN0IsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxPQUFPO1lBQ3RDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUsa0NBQWtDLFFBQVEsRUFBRTtTQUN0RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsSUFBSTtRQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxrRUFBa0U7UUFDbEUsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN6RCwwQ0FBMEM7Z0JBQzFDLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUN2QyxnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLGdFQUFnRTtRQUNoRSxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUxQixzREFBc0Q7UUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QseURBQXlEO2dCQUN6RCxPQUFPLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQzthQUNwRSxDQUFDO1FBQ0osQ0FBQztRQUVELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsZ0NBQWdDO1FBQ2hDLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTFCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLGtDQUFrQztZQUMxQyxPQUFPLEVBQUUsdUJBQXVCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1NBQ3pELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLDJEQUEyRDtZQUMzRCxPQUFPLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2hGLFFBQVE7U0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQWtCO1FBQ3pDLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsZ0ZBQWdGO1FBQ2hGLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsdURBQXVEO1FBRXZELHNEQUFzRDtRQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCx5REFBeUQ7Z0JBQ3pELE9BQU8sRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO2FBQ3BFLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELGtDQUFrQztRQUNsQyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU1QixlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxvQ0FBb0M7WUFDNUMsT0FBTyxFQUFFLHlCQUF5QixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtTQUMzRCxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYiwyREFBMkQ7WUFDM0QsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNsRixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssd0JBQXdCO1FBQzlCLE1BQU0sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzRSxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDckQsT0FBTztRQUNULENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsbUNBQW1DLEdBQUcsS0FBSztnQkFDM0MscUdBQXFHLENBQ3RHLENBQUM7WUFFRixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsMENBQTBDO2dCQUNsRCxPQUFPLEVBQUUsbUNBQW1DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO2FBQ25GLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsS0FBSyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQywyQkFBMkI7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztZQUNoRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFM0UsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFFcEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsY0FBYyxPQUFPLHVDQUF1QztvQkFDNUQscUJBQXFCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUNqRSxDQUFDO2dCQUVGLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLDZDQUE2QztvQkFDckQsT0FBTyxFQUFFLFdBQVcsT0FBTyxtQ0FBbUM7b0JBQzlELGNBQWMsRUFBRTt3QkFDZCxZQUFZLEVBQUUsT0FBTzt3QkFDckIsV0FBVyxFQUFFLE9BQU87d0JBQ3BCLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDbEM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVqRSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSw2Q0FBNkM7Z0JBQ3JELE9BQU8sRUFBRSxtQkFBbUIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ3JGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgRW5zZW1ibGUgZWxlbWVudHNcbiAqXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIGVuc2VtYmxlcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIEV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciB1bmlmaWVkIGVsZW1lbnQgbWFuYWdlbWVudFxuICogLSBGb2xsb3dzIHRlbXBsYXRlIG1ldGhvZCBwYXR0ZXJuIChwYXJzZU1ldGFkYXRhLCBjcmVhdGVFbGVtZW50IGhvb2tzKVxuICogLSBQdXJlIG1hbmFnZXIgbGF5ZXIgLSBkZWxlZ2F0ZXMgYnVzaW5lc3MgbG9naWMgdG8gRW5zZW1ibGUgY2xhc3NcbiAqIC0gVXNlcyBESSBmb3IgZGVwZW5kZW5jaWVzIChQb3J0Zm9saW9NYW5hZ2VyLCBGaWxlTG9ja01hbmFnZXIpXG4gKlxuICogU0VDVVJJVFk6XG4gKiAtIFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqIC0gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgdXNlciBkYXRhXG4gKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsc1xuICogLSBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICovXG5cbmltcG9ydCB7IEVuc2VtYmxlLCBFbnNlbWJsZU1ldGFkYXRhLCBFbnNlbWJsZUVsZW1lbnQgfSBmcm9tICcuL0Vuc2VtYmxlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIEVOU0VNQkxFX0RFRkFVTFRTLFxuICBFTlNFTUJMRV9MSU1JVFMsXG4gIEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUyxcbiAgRU5TRU1CTEVfRVJST1JTLFxuICBBQ1RJVkFUSU9OX1NUUkFURUdJRVMsXG4gIENPTkZMSUNUX1NUUkFURUdJRVMsXG4gIEVMRU1FTlRfUk9MRVMsXG4gIEFDVElWQVRJT05fTU9ERVNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0aW9uU3RyYXRlZ3ksIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LCBFbGVtZW50Um9sZSwgQWN0aXZhdGlvbk1vZGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBWQUxJREFUSU9OX1BBVFRFUk5TLCBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLy8gSXNzdWUgIzQ2NjogU2hhcmVkIGVsZW1lbnQgdHlwZSByZXNvbHZlciDigJQgcmUtZXhwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmV4cG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMsIHR5cGUgRWxlbWVudE1hbmFnZXJzRm9yUmVzb2x1dGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIHJlc29sdmVFbGVtZW50VHlwZXMgZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcycgKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlRW5zZW1ibGVFbGVtZW50VHlwZXMgPSByZXNvbHZlRWxlbWVudFR5cGVzO1xuXG4vKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIE1hbmFnZXMgZW5zZW1ibGUgZWxlbWVudCBsaWZlY3ljbGVcbiAqXG4gKiBFeHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlciB0byBwcm92aWRlIGVuc2VtYmxlLXNwZWNpZmljIG9wZXJhdGlvbnM6XG4gKiAtIFlBTUwgcGFyc2luZyB3aXRoIGJvdGggc25ha2VfY2FzZSBhbmQgY2FtZWxDYXNlIHN1cHBvcnRcbiAqIC0gRW5zZW1ibGUgY3JlYXRpb24gYW5kIHZhbGlkYXRpb25cbiAqIC0gRWxlbWVudCByZWZlcmVuY2UgbWFuYWdlbWVudFxuICogLSBJbXBvcnQvZXhwb3J0IGluIG11bHRpcGxlIGZvcm1hdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVuc2VtYmxlTWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxFbnNlbWJsZT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGVuc2VtYmxlc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgYWN0aXZlRW5zZW1ibGVOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuRU5TRU1CTEUsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMuZW5zZW1ibGVzRGlyID0gdGhpcy5lbGVtZW50RGlyO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdlbnNlbWJsZSc7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqXG4gICAqIE5BTUlORyBDT05WRU5USU9OIFNVUFBPUlQ6XG4gICAqIC0gVHlwZVNjcmlwdCBpbnRlcmZhY2VzIHVzZSBjYW1lbENhc2UgKGFjdGl2YXRpb25TdHJhdGVneSwgY29uZmxpY3RSZXNvbHV0aW9uKVxuICAgKiAtIFlBTUwgZmlsZXMgY2FuIHVzZSBzbmFrZV9jYXNlIChhY3RpdmF0aW9uX3N0cmF0ZWd5LCBjb25mbGljdF9yZXNvbHV0aW9uKVxuICAgKiAtIFRoaXMgbWV0aG9kIG1hcHMgc25ha2VfY2FzZSDihpIgY2FtZWxDYXNlIGZvciB1c2VyIGNvbnZlbmllbmNlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gUmF3IFlBTUwgZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBFbnNlbWJsZU1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPEVuc2VtYmxlTWV0YWRhdGE+IHtcbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgdmFsaWRhdGVNZXRhZGF0YUZpZWxkIGZvciBmaWVsZC1hd2FyZSBlcnJvciBtZXNzYWdlcyAoIzM2NSlcbiAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZU1ldGFkYXRhRmllbGQoJ25hbWUnLCBkYXRhLm5hbWUsIHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIXG4gICAgfSk7XG4gICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBuYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIG1ldGFkYXRhIG11c3QgaW5jbHVkZSBhIG5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgdmFsaWRhdGVNZXRhZGF0YUZpZWxkIGZvciBmaWVsZC1hd2FyZSBlcnJvciBtZXNzYWdlcyAoIzM2NSlcbiAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCdkZXNjcmlwdGlvbicsIGRhdGEuZGVzY3JpcHRpb24sIHtcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBwYXR0ZXJuOiBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfREVTQ1JJUFRJT05cbiAgICAgIH0pO1xuICAgICAgaWYgKCFkZXNjUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGFjdGl2YXRpb24gc3RyYXRlZ3kgKHN1cHBvcnQgYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2UpXG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5UmF3ID0gZGF0YS5hY3RpdmF0aW9uX3N0cmF0ZWd5IHx8IGRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1k7XG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGFjdGl2YXRpb25TdHJhdGVneVJhdyksIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY3RpdmF0aW9uIHN0cmF0ZWd5OiAke2FjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneSA9IGFjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFBQ1RJVkFUSU9OX1NUUkFURUdJRVMuaW5jbHVkZXMoYWN0aXZhdGlvblN0cmF0ZWd5IGFzIGFueSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9TVFJBVEVHWX06ICR7YWN0aXZhdGlvblN0cmF0ZWd5fWApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvblJhdyA9IGRhdGEuY29uZmxpY3RfcmVzb2x1dGlvbiB8fCBkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbiB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05GTElDVF9SRVNPTFVUSU9OO1xuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhjb25mbGljdFJlc29sdXRpb25SYXcpLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneTogJHtjb25mbGljdFJlc29sdXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb24gPSBjb25mbGljdFJlc29sdXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghQ09ORkxJQ1RfU1RSQVRFR0lFUy5pbmNsdWRlcyhjb25mbGljdFJlc29sdXRpb24gYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0NPTkZMSUNUX1JFU09MVVRJT059OiAke2NvbmZsaWN0UmVzb2x1dGlvbn1gKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbnRleHQgc2hhcmluZyBtb2RlXG4gICAgY29uc3QgY29udGV4dFNoYXJpbmdSYXcgPSBkYXRhLmNvbnRleHRfc2hhcmluZyB8fCBkYXRhLmNvbnRleHRTaGFyaW5nIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTlRFWFRfU0hBUklORztcblxuICAgIC8vIEZJWDogSGFuZGxlIGJvb2xlYW4gdmFsdWVzICh0cnVlIC0+ICdmdWxsJywgZmFsc2UgLT4gJ25vbmUnKVxuICAgIGxldCBjb250ZXh0U2hhcmluZ1ZhbHVlOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0U2hhcmluZ1JhdyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBjb250ZXh0U2hhcmluZ1ZhbHVlID0gY29udGV4dFNoYXJpbmdSYXcgPyAnZnVsbCcgOiAnbm9uZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHRTaGFyaW5nVmFsdWUgPSBTdHJpbmcoY29udGV4dFNoYXJpbmdSYXcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoY29udGV4dFNoYXJpbmdWYWx1ZSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFjb250ZXh0U2hhcmluZ1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udGV4dCBzaGFyaW5nIG1vZGU6ICR7Y29udGV4dFNoYXJpbmdSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0U2hhcmluZyA9IGNvbnRleHRTaGFyaW5nUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIVsnbm9uZScsICdzZWxlY3RpdmUnLCAnZnVsbCddLmluY2x1ZGVzKGNvbnRleHRTaGFyaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRleHQgc2hhcmluZyBtb2RlOiAke2NvbnRleHRTaGFyaW5nfWApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHJlc291cmNlIGxpbWl0cyAoc3VwcG9ydCBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IHJlc291cmNlTGltaXRzUmF3ID0gZGF0YS5yZXNvdXJjZV9saW1pdHMgfHwgZGF0YS5yZXNvdXJjZUxpbWl0cztcbiAgICBsZXQgcmVzb3VyY2VMaW1pdHM7XG5cbiAgICBpZiAocmVzb3VyY2VMaW1pdHNSYXcpIHtcbiAgICAgIHJlc291cmNlTGltaXRzID0ge1xuICAgICAgICBtYXhBY3RpdmVFbGVtZW50czogcmVzb3VyY2VMaW1pdHNSYXcubWF4X2FjdGl2ZV9lbGVtZW50cyB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhBY3RpdmVFbGVtZW50cyB8fCBFTlNFTUJMRV9MSU1JVFMuTUFYX0VMRU1FTlRTLFxuICAgICAgICBtYXhNZW1vcnlNYjogcmVzb3VyY2VMaW1pdHNSYXcubWF4X21lbW9yeV9tYiB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhNZW1vcnlNYixcbiAgICAgICAgbWF4RXhlY3V0aW9uVGltZU1zOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfZXhlY3V0aW9uX3RpbWVfbXMgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4RXhlY3V0aW9uVGltZU1zIHx8IEVOU0VNQkxFX0xJTUlUUy5NQVhfQUNUSVZBVElPTl9USU1FXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGVsZW1lbnRzIGFycmF5XG4gICAgY29uc3QgZWxlbWVudHNSYXcgPSBkYXRhLmVsZW1lbnRzIHx8IFtdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50c1JhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgZWxlbWVudHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IGVsZW1lbnRzUmF3Lm1hcCgoZWxlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgbmFtZVxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnROYW1lID0gZWxlbS5lbGVtZW50X25hbWUgfHwgZWxlbS5uYW1lO1xuICAgICAgaWYgKCFyYXdFbGVtZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gbXVzdCBoYXZlIGVsZW1lbnRfbmFtZSAob3IgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpYCk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ25hbWUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS5uYW1lICYmICFlbGVtLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ25hbWUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfbmFtZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhyYXdFbGVtZW50TmFtZSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILCBhbGxvd1NwYWNlczogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50TmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IG5hbWUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudE5hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCB0eXBlXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgcmF3RWxlbWVudFR5cGUgPSBlbGVtLmVsZW1lbnRfdHlwZSB8fCBlbGVtLnR5cGUgfHwgJ3NraWxsJztcbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAndHlwZScgZmllbGRcbiAgICAgIGlmIChlbGVtLnR5cGUgJiYgIWVsZW0uZWxlbWVudF90eXBlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAndHlwZScgZmllbGQuIFVzZSAnZWxlbWVudF90eXBlJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKHJhd0VsZW1lbnRUeXBlKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50VHlwZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IHJvbGVcbiAgICAgIGNvbnN0IGVsZW1lbnRSb2xlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50Um9sZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHJvbGUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudFJvbGVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFJvbGUgPSBlbGVtZW50Um9sZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyhlbGVtZW50Um9sZSBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9FTEVNRU5UX1JPTEV9OiAke2VsZW1lbnRSb2xlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgY29uc3QgZWxlbWVudEFjdGl2YXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKGVsZW0uYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhY3RpdmF0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRBY3RpdmF0aW9uID0gZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgICBpZiAoIUFDVElWQVRJT05fTU9ERVMuaW5jbHVkZXMoZWxlbWVudEFjdGl2YXRpb24gYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQUNUSVZBVElPTl9NT0RFfTogJHtlbGVtZW50QWN0aXZhdGlvbn1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgcHJpb3JpdHkgKDAtMTAwLCBkZWZhdWx0IDUwKVxuICAgICAgbGV0IHByaW9yaXR5ID0gZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWTtcbiAgICAgIGlmICh0eXBlb2YgcHJpb3JpdHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHByaW9yaXR5ID0gcGFyc2VJbnQocHJpb3JpdHksIDEwKTtcbiAgICAgIH1cbiAgICAgIHByaW9yaXR5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBwcmlvcml0eSkpO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbmRpdGlvbiAoaWYgY29uZGl0aW9uYWwgYWN0aXZhdGlvbilcbiAgICAgIC8vIENvbmRpdGlvbnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIC0gdGhleSBjYW4gY29udGFpbiBvcGVyYXRvcnMgbGlrZSA9PSwgIT0sICYmLCB8fFxuICAgICAgLy8gU28gd2UgdXNlIGEgY3VzdG9tIHBhdHRlcm4gdGhhdCBhbGxvd3MgdGhlc2UgY2hhcmFjdGVyc1xuICAgICAgbGV0IGNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW1lbnRBY3RpdmF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmIGVsZW0uY29uZGl0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICAgIFN0cmluZyhlbGVtLmNvbmRpdGlvbiksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4TGVuZ3RoOiBFTlNFTUJMRV9MSU1JVFMuTUFYX0NPTkRJVElPTl9MRU5HVEgsXG4gICAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICAgIGN1c3RvbVBhdHRlcm46IC9eW2EtekEtWjAtOVxcc1xcLV8uPSEmfDw+KCldKyQvICAvLyBBbGxvdyBjb21wYXJpc29uL2xvZ2ljYWwgb3BlcmF0b3JzXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmRpdGlvbiBhdCBpbmRleCAke2luZGV4fTogJHtjb25kaXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBkZXBlbmRlbmNpZXNcbiAgICAgIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW0uZGVwZW5kZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoZWxlbS5kZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZERlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbS5kZXBlbmRlbmNpZXMuc2xpY2UoMCwgRU5TRU1CTEVfTElNSVRTLk1BWF9ERVBFTkRFTkNJRVMpKSB7XG4gICAgICAgICAgY29uc3QgZGVwUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGRlcCksIHtcbiAgICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFkZXBSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcGVuZGVuY3kgXCIke2RlcH1cIiBhdCBpbmRleCAke2luZGV4fTogJHtkZXBSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0ZWREZXBlbmRlbmNpZXMucHVzaChkZXBSZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmNpZXMgPSB2YWxpZGF0ZWREZXBlbmRlbmNpZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgcHVycG9zZVxuICAgICAgbGV0IHB1cnBvc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtLnB1cnBvc2UpIHtcbiAgICAgICAgY29uc3QgcHVycG9zZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhlbGVtLnB1cnBvc2UpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgIC8vIEFsbG93IGZ1bGwgZGVzY3JpcHRpb24gcHVuY3R1YXRpb24gKGNvbW1hcywgZW0tZGFzaGVzLCBldGMuKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwdXJwb3NlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHVycG9zZSBhdCBpbmRleCAke2luZGV4fTogJHtwdXJwb3NlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBwdXJwb3NlID0gcHVycG9zZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcm9sZTogZWxlbWVudFJvbGUgYXMgRWxlbWVudFJvbGUsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtZW50QWN0aXZhdGlvbiBhcyBBY3RpdmF0aW9uTW9kZSxcbiAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2VcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IGNvdW50XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihFTlNFTUJMRV9FUlJPUlMuVE9PX01BTllfRUxFTUVOVFMpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIG5lc3RpbmcgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFsbG93TmVzdGVkID0gZGF0YS5hbGxvd19uZXN0ZWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICBCb29sZWFuKGRhdGEuYWxsb3dfbmVzdGVkKSA6XG4gICAgICAoZGF0YS5hbGxvd05lc3RlZCAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbihkYXRhLmFsbG93TmVzdGVkKSA6IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCk7XG5cbiAgICBjb25zdCBtYXhOZXN0aW5nRGVwdGggPSBkYXRhLm1heF9uZXN0aW5nX2RlcHRoIHx8IGRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRIO1xuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciB0YWdzIGFycmF5XG4gICAgbGV0IHRhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50YWdzKSkge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgZGF0YS50YWdzKSB7XG4gICAgICAgIGNvbnN0IHRhZ1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh0YWcpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGFnUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFnIFwiJHt0YWd9XCI6ICR7dGFnUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0YWdzLnB1c2godGFnUmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgb2JqZWN0IChjYW1lbENhc2UpXG4gICAgY29uc3QgbWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IGRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogZGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IGRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFncyxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogYWN0aXZhdGlvblN0cmF0ZWd5IGFzIEFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogY29uZmxpY3RSZXNvbHV0aW9uIGFzIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgICAgY29udGV4dFNoYXJpbmc6IGNvbnRleHRTaGFyaW5nIGFzICdub25lJyB8ICdzZWxlY3RpdmUnIHwgJ2Z1bGwnLFxuICAgICAgcmVzb3VyY2VMaW1pdHMsXG4gICAgICBhbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aCxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KGRhdGEuZ2F0ZWtlZXBlciwgbmFtZSwgJ2Vuc2VtYmxlJywgZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksICAvLyBJc3N1ZSAjNTI0XG4gICAgfTtcblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW5zZW1ibGUgaW5zdGFuY2UgZnJvbSBwYXJzZWQgbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gVmFsaWRhdGVkIGVuc2VtYmxlIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWFya2Rvd24gY29udGVudCAoZW5zZW1ibGUgaW5zdHJ1Y3Rpb25zL2RvY3VtZW50YXRpb24pXG4gICAqIEByZXR1cm5zIE5ldyBFbnNlbWJsZSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEsIF9jb250ZW50OiBzdHJpbmcpOiBFbnNlbWJsZSB7XG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gRml4ICM5MTI6IFN0cmlwIG1hcmtlciBmcm9tIHJ1bnRpbWUgbWV0YWRhdGFcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShtZXRhZGF0YSwgbWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAvLyBFeHRyYWN0IGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGlmIHByZXNlbnQgKHYyIGR1YWwtZmllbGQpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgZW5zZW1ibGUuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhbiBlbnNlbWJsZSB0byBmaWxlIGNvbnRlbnRcbiAgICpcbiAgICogRm9ybWF0OiBNYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogLSBGcm9udG1hdHRlcjogRW5zZW1ibGUgbWV0YWRhdGEgKyBlbGVtZW50IHJlZmVyZW5jZXNcbiAgICogLSBDb250ZW50OiBJbnN0cnVjdGlvbnMvZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGVuc2VtYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAobWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IEVuc2VtYmxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnQubWV0YWRhdGE7XG5cbiAgICAvLyBCdWlsZCBmcm9udG1hdHRlciBkYXRhICh1c2luZyBjYW1lbENhc2UpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXI6IGFueSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuRU5TRU1CTEUpLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgICAgdW5pcXVlX2lkOiBlbGVtZW50LmlkLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGEuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbixcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoXG4gICAgfTtcblxuICAgIC8vIHYyLjAgZHVhbC1maWVsZDogd3JpdGUgaW5zdHJ1Y3Rpb25zIHRvIFlBTUwgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudFxuICAgIGlmIChlbGVtZW50Lmluc3RydWN0aW9ucykge1xuICAgICAgZnJvbnRtYXR0ZXIuaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5pbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSByZXNvdXJjZSBsaW1pdHMgaWYgc3BlY2lmaWVkXG4gICAgaWYgKG1ldGFkYXRhLnJlc291cmNlTGltaXRzKSB7XG4gICAgICBmcm9udG1hdHRlci5yZXNvdXJjZUxpbWl0cyA9IG1ldGFkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEuZ2F0ZWtlZXBlcikge1xuICAgICAgZnJvbnRtYXR0ZXIuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSBlbGVtZW50cyBhcnJheSAodXNpbmcgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBmb3IgQVBJIGNvbnNpc3RlbmN5KVxuICAgIGZyb250bWF0dGVyLmVsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMubWFwKGVsZW0gPT4ge1xuICAgICAgY29uc3QgZWxlbURhdGE6IGFueSA9IHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtLmVsZW1lbnRfbmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgcm9sZTogZWxlbS5yb2xlLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uXG4gICAgICB9O1xuXG4gICAgICBpZiAoZWxlbS5jb25kaXRpb24pIHtcbiAgICAgICAgZWxlbURhdGEuY29uZGl0aW9uID0gZWxlbS5jb25kaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtLmRlcGVuZGVuY2llcyAmJiBlbGVtLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1EYXRhLmRlcGVuZGVuY2llcyA9IGVsZW0uZGVwZW5kZW5jaWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbS5wdXJwb3NlKSB7XG4gICAgICAgIGVsZW1EYXRhLnB1cnBvc2UgPSBlbGVtLnB1cnBvc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGVtRGF0YTtcbiAgICB9KTtcblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgY3JlYXRpb25cbiAgICAvLyBVc2UgQ09SRV9TQ0hFTUEgdG8gc3VwcG9ydCBudW1iZXJzIChwcmlvcml0eSkgYW5kIGJvb2xlYW5zIChhbGxvd05lc3RlZClcbiAgICBjb25zdCBib2R5ID0gZWxlbWVudC5jb250ZW50IHx8IHRoaXMuYnVpbGREZWZhdWx0Qm9keShlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5jcmVhdGVGcm9udG1hdHRlcihmcm9udG1hdHRlciwgYm9keSwge1xuICAgICAgbWV0aG9kOiAnbWFudWFsJyxcbiAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IHN0YW5kYXJkaXplIG9uIEpTT04gc2NoZW1hIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICAgIGNsZWFuTWV0YWRhdGE6IHRydWUsICAvLyBGaXggIzkxMzogc3RhbmRhcmRpemUgYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJyxcbiAgICAgIHNvcnRLZXlzOiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiAxMDAsXG4gICAgICBza2lwSW52YWxpZDogZmFsc2UgIC8vIERvbid0IHNraXAgaW52YWxpZCAtIHdlIHdhbnQgdG8gY2F0Y2ggZXJyb3JzXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoZWxlbWVudDogRW5zZW1ibGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoZWxlbWVudC5tZXRhZGF0YS5uYW1lID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZvciBlbnNlbWJsZSBmaWxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZW5zZW1ibGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICpcbiAgICogU3VwcG9ydHM6XG4gICAqIC0gWUFNTDogRnJvbnRtYXR0ZXItc3R5bGUgbWV0YWRhdGEgd2l0aCBvcHRpb25hbCBtYXJrZG93biBjb250ZW50XG4gICAqIC0gSlNPTjogRGlyZWN0IGVuc2VtYmxlIHN0cnVjdHVyZVxuICAgKiAtIE1hcmtkb3duOiBZQU1MIGZyb250bWF0dGVyICsgbWFya2Rvd24gY29udGVudFxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFN0cmluZyBjb250YWluaW5nIGVuc2VtYmxlIGRhdGFcbiAgICogQHBhcmFtIGZvcm1hdCAtIEZvcm1hdCBvZiB0aGUgZGF0YSAoanNvbiwgeWFtbCwgbWFya2Rvd24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGltcG9ydGVkIEVuc2VtYmxlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbXBvcnRFbGVtZW50KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nXG4gICk6IFByb21pc2U8RW5zZW1ibGU+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZDogYW55O1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBhcnNlIFlBTUwvTWFya2Rvd24gdXNpbmcgU2VyaWFsaXphdGlvblNlcnZpY2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogNTAwMDAsIC8vIDUwS0IgbGltaXQgZm9yIGVuc2VtYmxlIGZpbGVzXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgLy8gQ29udGVudCBpcyBwYXJzZWQgYnV0IG5vdCB1c2VkIGluIGVuc2VtYmxlIGNyZWF0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQpO1xuXG4gICAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKG1ldGFkYXRhLCBtZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBpbXBvcnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLklNUE9SVEVELFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEltcG9ydGVkIGVuc2VtYmxlOiAke21ldGFkYXRhLm5hbWV9IHdpdGggJHttZXRhZGF0YS5lbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzYFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbnNlbWJsZTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5JTVBPUlRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZW5zZW1ibGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0IChqc29uLCB5YW1sLCBtYXJrZG93bilcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gc2VyaWFsaXplZCBzdHJpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4cG9ydEVsZW1lbnQoXG4gICAgZWxlbWVudDogRW5zZW1ibGUsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIFlBTUwgYW5kIE1hcmtkb3duLCB1c2UgdGhlIHNhbWUgZm9ybWF0IChmcm9udG1hdHRlciArIGNvbnRlbnQpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW5zZW1ibGUgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBQYXJ0aWFsIG1ldGFkYXRhIGZvciB0aGUgZW5zZW1ibGVcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gbmV3IEVuc2VtYmxlIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBjcmVhdGUobWV0YWRhdGE6IFBhcnRpYWw8RW5zZW1ibGVNZXRhZGF0YT4gJiB7IGluc3RydWN0aW9ucz86IHN0cmluZzsgY29udGVudD86IHN0cmluZyB9KTogUHJvbWlzZTxFbnNlbWJsZT4ge1xuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb25cbiAgICAvLyBOb3RlOiBlbGVtZW50X3R5cGUgcmVzb2x1dGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBoYW5kbGVyIGxheWVyIGJlZm9yZSBjYWxsaW5nIGNyZWF0ZSgpLlxuICAgIC8vIEVsZW1lbnRzIHNob3VsZCBhbHJlYWR5IGhhdmUgZWxlbWVudF90eXBlIHNldCB3aGVuIHRoZXkgYXJyaXZlIGhlcmUuXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBlbGVtZW50czogbWV0YWRhdGEuZWxlbWVudHMgfHwgW10sXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIGxldCByYXdFbGVtZW50cyA9IG1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdO1xuXG4gICAgLy8gTWlncmF0ZSBsZWdhY3kgZWxlbWVudCBmaWVsZHMgKG5hbWUgLT4gZWxlbWVudF9uYW1lLCB0eXBlIC0+IGVsZW1lbnRfdHlwZSlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBBUEkgY2FsbHMgdXNpbmcgb2xkIGZpZWxkIG5hbWVzXG4gICAgY29uc3QgbWlncmF0ZWRFbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10gPSByYXdFbGVtZW50cy5tYXAoKGVsZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIWVsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAnbmFtZScgZmllbGQuIFVzZSAnZWxlbWVudF9uYW1lJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpXG4gICAgICAvLyBJc3N1ZSAjNDY2OiBObyBsb25nZXIgZGVmYXVsdHMgdG8gJ3NraWxsJyDigJQgY2FsbGVycyBtdXN0IHByb3ZpZGUgdHlwZVxuICAgICAgLy8gb3IgcGFzcyBtYW5hZ2VycyBmb3IgcG9ydGZvbGlvIHJlc29sdXRpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlO1xuICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBhdCBpbmRleCAke2luZGV4fSBoYXMgbm8gZWxlbWVudF90eXBlLiBgICtcbiAgICAgICAgICBgUHJvdmlkZSBlbGVtZW50X3R5cGUgZXhwbGljaXRseSBvciBlbnN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBwb3J0Zm9saW8uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICd0eXBlJyBmaWVsZFxuICAgICAgaWYgKGVsZW0udHlwZSAmJiAhZWxlbS5lbGVtZW50X3R5cGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICd0eXBlJyBmaWVsZC4gVXNlICdlbGVtZW50X3R5cGUnIGluc3RlYWQuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHJvbGU6IGVsZW0ucm9sZSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5FTEVNRU5UX1JPTEUsXG4gICAgICAgIHByaW9yaXR5OiBlbGVtLnByaW9yaXR5ID8/IEVOU0VNQkxFX0RFRkFVTFRTLlBSSU9SSVRZLFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtLmFjdGl2YXRpb24gfHwgJ2Fsd2F5cycsXG4gICAgICAgIGNvbmRpdGlvbjogZWxlbS5jb25kaXRpb24sXG4gICAgICAgIGRlcGVuZGVuY2llczogZWxlbS5kZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2U6IGVsZW0ucHVycG9zZVxuICAgICAgfSBhcyBFbnNlbWJsZUVsZW1lbnQ7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIGZpZWxkc1xuICAgIGNvbnN0IGZ1bGxNZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IG1ldGFkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MgfHwgW10sXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IG1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSB8fCAobWV0YWRhdGEgYXMgYW55KS5hY3RpdmF0aW9uX3N0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbiB8fCAobWV0YWRhdGEgYXMgYW55KS5jb25mbGljdF9yZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT04sXG4gICAgICBjb250ZXh0U2hhcmluZzogbWV0YWRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HLFxuICAgICAgcmVzb3VyY2VMaW1pdHM6IG1ldGFkYXRhLnJlc291cmNlTGltaXRzLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkID8/IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRILFxuICAgICAgZWxlbWVudHM6IG1pZ3JhdGVkRWxlbWVudHMsXG4gICAgICAvLyBJc3N1ZSAjNTI0IOKAlCBHYXRla2VlcGVyIHBvbGljeSAoc3ltbWV0cmljIHdpdGggYnVpbGRNZXRhZGF0YSBkZXNlcmlhbGl6YXRpb24pXG4gICAgICBnYXRla2VlcGVyOiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koKG1ldGFkYXRhIGFzIGFueSkuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSEsICdlbnNlbWJsZScsIG1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH07XG5cbiAgICAvLyBVc2UgaW5oZXJpdGVkIGdldEVsZW1lbnRGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIG5vcm1hbGl6YXRpb25cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGZ1bGxNZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgY29uc3QgZXhpc3RpbmdFbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ0Vuc2VtYmxlcy5maW5kKGUgPT5cbiAgICAgIGUubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBmdWxsTWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIGVuc2VtYmxlIG5hbWVkIFwiJHtmdWxsTWV0YWRhdGEubmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbnNlbWJsZVxuICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKGZ1bGxNZXRhZGF0YSwgZnVsbE1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBTZXQgaW5zdHJ1Y3Rpb25zIGFuZCBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGVuc2VtYmxlLmluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhLmNvbnRlbnQpIHtcbiAgICAgIGVuc2VtYmxlLmNvbnRlbnQgPSBtZXRhZGF0YS5jb250ZW50O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gZGlza1xuICAgIGF3YWl0IHRoaXMuc2F2ZShlbnNlbWJsZSwgZmlsZW5hbWUpO1xuICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIHNhdmUoKSBjYWNoZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgLy8gTG9nIGNyZWF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLlNBVkVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICBkZXRhaWxzOiBgQ3JlYXRlZCBlbnNlbWJsZTogJHtmdWxsTWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5zZW1ibGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZW5zZW1ibGVcbiAgICogRGVsZWdhdGVzIHRvIGVuc2VtYmxlJ3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSB2YWxpZGF0ZShlbGVtZW50OiBFbnNlbWJsZSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHNhdmUgdG8gdmFsaWRhdGUgYmVmb3JlIHBlcnNpc3RpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoZWxlbWVudDogRW5zZW1ibGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBWYWxpZGF0ZSBlbnNlbWJsZSBiZWZvcmUgc2F2aW5nXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGUoZWxlbWVudCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpIHx8ICdVbmtub3duIHZhbGlkYXRpb24gZXJyb3InO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2F2ZSBpbnZhbGlkIGVuc2VtYmxlOiAke2Vycm9yc31gKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJhc2UgaW1wbGVtZW50YXRpb25cbiAgICBhd2FpdCBzdXBlci5zYXZlKGVsZW1lbnQsIGZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkZWxldGUgdG8gYWRkIGVuc2VtYmxlLXNwZWNpZmljIGxvZ2dpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkRFTEVURUQsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgIGRldGFpbHM6IGBEZWxldGluZyBlbnNlbWJsZTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGUoZmlsZVBhdGgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkRFTEVURUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgZGVsZXRlZCBlbnNlbWJsZTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgbGlzdCB0byBhcHBseSBhY3RpdmUgc3RhdHVzIGJhc2VkIG9uIGFjdGl2ZUVuc2VtYmxlTmFtZXMgc2V0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8RW5zZW1ibGVbXT4ge1xuICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHN1cGVyLmxpc3QoKTtcblxuICAgIC8vIEFwcGx5IEFDVElWRSBzdGF0dXMgdG8gZW5zZW1ibGVzIGluIHRoZSBhY3RpdmVFbnNlbWJsZU5hbWVzIHNldFxuICAgIGZvciAoY29uc3QgZW5zZW1ibGUgb2YgZW5zZW1ibGVzKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmhhcyhlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSkge1xuICAgICAgICAvLyBDYWxsIGFjdGl2YXRlKCkgdG8gc2V0IHN0YXR1cyB0byBBQ1RJVkVcbiAgICAgICAgYXdhaXQgZW5zZW1ibGUuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5zZW1ibGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFuIGVuc2VtYmxlIGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENsZWFudXAgdHJpZ2dlciBmb3IgbWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVuc2VtYmxlIG5hbWUgb3IgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyBBY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUVuc2VtYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGVuc2VtYmxlPzogRW5zZW1ibGUgfT4ge1xuICAgIC8vIEV2aWN0IHN0YWxlIGNhY2hlIGJlZm9yZSBsb29rdXAgc28gZXh0ZXJuYWwgZmlsZSBlZGl0cyBhcmUgcGlja2VkIHVwICgjMTg5NSkuXG4gICAgLy8gZmluZEJ5TmFtZSgpIGhpdHMgdGhlIExSVSBjYWNoZSBmaXJzdCBhbmQgbmV2ZXIgY2FsbHMgbGlzdCgpLCBzbyB3aXRob3V0IHRoaXNcbiAgICAvLyB0aGUgc2NhbiBjb29sZG93biBwcmV2ZW50cyBtdGltZS1iYXNlZCBldmljdGlvbiBmcm9tIHJ1bm5pbmcuXG4gICAgYXdhaXQgdGhpcy5zY2FuQW5kRXZpY3QoKTtcblxuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuYWRkKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gU2V0IGVuc2VtYmxlIHN0YXR1cyB0byBhY3RpdmVcbiAgICBhd2FpdCBlbnNlbWJsZS5hY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuYWN0aXZhdGVFbnNlbWJsZScsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgYWN0aXZhdGVkOiAke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSksXG4gICAgICBlbnNlbWJsZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhbiBlbnNlbWJsZSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbnNlbWJsZSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgRGVhY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlRW5zZW1ibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgZW5zZW1ibGU/OiBFbnNlbWJsZSB9PiB7XG4gICAgLy8gTm8gc2NhbkFuZEV2aWN0KCkgaGVyZSDigJQgaW50ZW50aW9uYWwuIERlYWN0aXZhdGlvbiBvbmx5IG5lZWRzIHRoZSBlbnNlbWJsZSdzXG4gICAgLy8gbmFtZSAodG8gcmVtb3ZlIGZyb20gYWN0aXZlRW5zZW1ibGVOYW1lcykgYW5kIGNhbGxzIGRlYWN0aXZhdGUoKSB3aGljaCBzZXRzXG4gICAgLy8gYSBzdGF0dXMgZmxhZy4gSXQgZG9lcyBub3QgY29uc3VtZSB0aGUgZWxlbWVudHMgbGlzdCwgc28gc3RhbGUgY2FjaGVkIGVsZW1lbnRcbiAgICAvLyBkYXRhIGhhcyBubyBlZmZlY3Qgb24gY29ycmVjdG5lc3MuIENvbXBhcmUgd2l0aCBhY3RpdmF0ZUVuc2VtYmxlKCksIHdoaWNoXG4gICAgLy8gaW5nZXN0cyB0aGUgZnVsbCBlbGVtZW50IGxpc3QgdG8gb3JjaGVzdHJhdGUgc3ViLWVsZW1lbnQgbG9hZGluZyBhbmQgbXVzdFxuICAgIC8vIHRoZXJlZm9yZSBzZWUgdGhlIGxhdGVzdCBvbi1kaXNrIGRlZmluaXRpb24uICgjMTg5NSlcblxuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5kZWxldGUoZW5zZW1ibGUubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBTZXQgZW5zZW1ibGUgc3RhdHVzIHRvIGluYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVhY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSBkZWFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSksXG4gICAgICBlbnNlbWJsZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgZW5zZW1ibGVzXG4gICAqXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgYWN0aXZlIGVuc2VtYmxlc1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRW5zZW1ibGVzKCk6IFByb21pc2U8RW5zZW1ibGVbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEVuc2VtYmxlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzKSB7XG4gICAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShuYW1lKTtcbiAgICAgIGlmIChlbnNlbWJsZSkgcmVzdWx0cy5wdXNoKGVuc2VtYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2Vuc2VtYmxlcycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGVuc2VtYmxlcyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgZW5zZW1ibGVzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfRU5TRU1CTEVTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgZW5zZW1ibGVzIGxpbWl0IHJlYWNoZWQ6ICR7dGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemV9LyR7bWF4fWBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGFsZSBlbnRyaWVzIGZyb20gYWN0aXZlIGVuc2VtYmxlcyBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemU7XG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW5zZW1ibGVOYW1lcyA9IG5ldyBTZXQoZW5zZW1ibGVzLm1hcChlID0+IGUubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcykge1xuICAgICAgICBpZiAoIWV4aXN0aW5nRW5zZW1ibGVOYW1lcy5oYXMoYWN0aXZlTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemU7XG4gICAgICBjb25zdCByZW1vdmVkID0gc3RhcnRTaXplIC0gZW5kU2l6ZTtcblxuICAgICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDbGVhbmVkIHVwICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGVuc2VtYmxlIHJlZmVyZW5jZShzKS4gYCArXG4gICAgICAgICAgYEFjdGl2ZSBlbnNlbWJsZXM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgnZW5zZW1ibGVzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcycsXG4gICAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgZW5zZW1ibGUgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgZW5zZW1ibGVzOicsIGVycm9yKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
861
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxD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LENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSw2Q0FBNkM7b0JBQ3JELE9BQU8sRUFBRSxXQUFXLE9BQU8sbUNBQW1DO29CQUM5RCxjQUFjLEVBQUU7d0JBQ2QsWUFBWSxFQUFFLE9BQU87d0JBQ3JCLFdBQVcsRUFBRSxPQUFPO3dCQUNwQixVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQ2xDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFakUsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsNkNBQTZDO2dCQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTthQUNyRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnNlbWJsZU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIEVuc2VtYmxlIGVsZW1lbnRzXG4gKlxuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBlbnNlbWJsZXMgaW1wbGVtZW50aW5nIElFbGVtZW50XG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBFeHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlciBmb3IgdW5pZmllZCBlbGVtZW50IG1hbmFnZW1lbnRcbiAqIC0gRm9sbG93cyB0ZW1wbGF0ZSBtZXRob2QgcGF0dGVybiAocGFyc2VNZXRhZGF0YSwgY3JlYXRlRWxlbWVudCBob29rcylcbiAqIC0gUHVyZSBtYW5hZ2VyIGxheWVyIC0gZGVsZWdhdGVzIGJ1c2luZXNzIGxvZ2ljIHRvIEVuc2VtYmxlIGNsYXNzXG4gKiAtIFVzZXMgREkgZm9yIGRlcGVuZGVuY2llcyAoUG9ydGZvbGlvTWFuYWdlciwgRmlsZUxvY2tNYW5hZ2VyKVxuICpcbiAqIFNFQ1VSSVRZOlxuICogLSBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICogLSBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAtIElucHV0IHNhbml0aXphdGlvbiBmb3IgYWxsIHVzZXIgZGF0YVxuICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbHNcbiAqIC0gU2VjdXJlWWFtbFBhcnNlciBmb3Igc2FmZSBZQU1MIHBhcnNpbmdcbiAqL1xuXG5pbXBvcnQgeyBFbnNlbWJsZSwgRW5zZW1ibGVNZXRhZGF0YSwgRW5zZW1ibGVFbGVtZW50IH0gZnJvbSAnLi9FbnNlbWJsZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IHRvU2luZ3VsYXJMYWJlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBFTlNFTUJMRV9ERUZBVUxUUyxcbiAgRU5TRU1CTEVfTElNSVRTLFxuICBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMsXG4gIEVOU0VNQkxFX0VSUk9SUyxcbiAgQUNUSVZBVElPTl9TVFJBVEVHSUVTLFxuICBDT05GTElDVF9TVFJBVEVHSUVTLFxuICBFTEVNRU5UX1JPTEVTLFxuICBBQ1RJVkFUSU9OX01PREVTXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdGlvblN0cmF0ZWd5LCBDb25mbGljdFJlc29sdXRpb25TdHJhdGVneSwgRWxlbWVudFJvbGUsIEFjdGl2YXRpb25Nb2RlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgVkFMSURBVElPTl9QQVRURVJOUywgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxuLy8gSXNzdWUgIzgzOiBDZW50cmFsaXplZCBhY3RpdmUgZWxlbWVudCBsaW1pdHMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMpXG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcsIGdldE1heEFjdGl2ZUxpbWl0IH0gZnJvbSAnLi4vLi4vY29uZmlnL2FjdGl2ZS1lbGVtZW50LWxpbWl0cy5qcyc7XG5cbi8vIElzc3VlICM0NjY6IFNoYXJlZCBlbGVtZW50IHR5cGUgcmVzb2x2ZXIg4oCUIHJlLWV4cG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5pbXBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5leHBvcnQgeyByZXNvbHZlRWxlbWVudFR5cGVzLCB0eXBlIEVsZW1lbnRNYW5hZ2Vyc0ZvclJlc29sdXRpb24gfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcblxuLyoqIEBkZXByZWNhdGVkIFVzZSByZXNvbHZlRWxlbWVudFR5cGVzIGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVuc2VtYmxlRWxlbWVudFR5cGVzID0gcmVzb2x2ZUVsZW1lbnRUeXBlcztcblxuLyoqXG4gKiBFbnNlbWJsZU1hbmFnZXIgLSBNYW5hZ2VzIGVuc2VtYmxlIGVsZW1lbnQgbGlmZWN5Y2xlXG4gKlxuICogRXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXIgdG8gcHJvdmlkZSBlbnNlbWJsZS1zcGVjaWZpYyBvcGVyYXRpb25zOlxuICogLSBZQU1MIHBhcnNpbmcgd2l0aCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSBzdXBwb3J0XG4gKiAtIEVuc2VtYmxlIGNyZWF0aW9uIGFuZCB2YWxpZGF0aW9uXG4gKiAtIEVsZW1lbnQgcmVmZXJlbmNlIG1hbmFnZW1lbnRcbiAqIC0gSW1wb3J0L2V4cG9ydCBpbiBtdWx0aXBsZSBmb3JtYXRzXG4gKlxuICogTUVNT1JZIEJFSEFWSU9SOlxuICogLSBUcmFja3Mgd2FybmVkIGxlZ2FjeSBlbGVtZW50LWZpZWxkIGZpbmdlcnByaW50cyBpbiBtZW1vcnkgc28gcmVwZWF0ZWQgcGFyc2VzXG4gKiAgIG9mIHRoZSBzYW1lIGVuc2VtYmxlL2VsZW1lbnQvZmllbGQgY29tYmluYXRpb24gZG8gbm90IGtlZXAgc3BhbW1pbmcgbG9ncy5cbiAqIC0gRmluZ2VycHJpbnRzIGFyZSBzY29wZWQgdG8gdGhlIG1hbmFnZXIgbGlmZXRpbWUgYW5kIGdyb3cgd2l0aCB0aGUgbnVtYmVyIG9mXG4gKiAgIHVuaXF1ZSBsZWdhY3kgZmllbGQgc2lnaHRpbmdzLlxuICogLSBMb25nLXJ1bm5pbmcgc2VydmVycyBjYW4gY2xlYXIgdGhpcyBoaXN0b3J5IGV4cGxpY2l0bHkgd2l0aFxuICogICBjbGVhckxlZ2FjeUVsZW1lbnRXYXJuaW5nSGlzdG9yeSgpLCBhbmQgZGlzcG9zZSgpIGFsc28gY2xlYXJzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgRW5zZW1ibGVNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPEVuc2VtYmxlPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5zZW1ibGVzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBhY3RpdmVFbnNlbWJsZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWdhY3lFbGVtZW50RmllbGRXYXJuaW5nczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuRU5TRU1CTEUsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMuZW5zZW1ibGVzRGlyID0gdGhpcy5lbGVtZW50RGlyO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdlbnNlbWJsZSc7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgd2Fybi1vbmNlIHN0YXRlIGZvciBsZWdhY3kgZW5zZW1ibGUgZWxlbWVudCBmaWVsZHMuXG4gICAqXG4gICAqIFVzZWZ1bCBmb3IgbG9uZy1saXZlZCBwcm9jZXNzZXMgdGhhdCB3YW50IHRvIGNhcCBpbi1tZW1vcnkgd2FybmluZyBoaXN0b3J5XG4gICAqIG9yIGludGVudGlvbmFsbHkgcmUtZW1pdCBtaWdyYXRpb24gZ3VpZGFuY2UgYWZ0ZXIgYSBtYWludGVuYW5jZSBib3VuZGFyeS5cbiAgICovXG4gIHB1YmxpYyBjbGVhckxlZ2FjeUVsZW1lbnRXYXJuaW5nSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLmxlZ2FjeUVsZW1lbnRGaWVsZFdhcm5pbmdzLmNsZWFyKCk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmNsZWFyTGVnYWN5RWxlbWVudFdhcm5pbmdIaXN0b3J5KCk7XG4gIH1cblxuICBwcml2YXRlIHdhcm5PbmNlRm9yTGVnYWN5RWxlbWVudEZpZWxkKFxuICAgIGVuc2VtYmxlTmFtZTogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZmllbGQ6ICduYW1lJyB8ICd0eXBlJyxcbiAgICByZXBsYWNlbWVudDogJ2VsZW1lbnRfbmFtZScgfCAnZWxlbWVudF90eXBlJyxcbiAgKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgZmluZ2VycHJpbnQgc3RhYmxlIGFjcm9zcyBwYXJzZS9jcmVhdGUgcGF0aHMgZm9yIHRoZSBzYW1lIGVuc2VtYmxlIGVsZW1lbnQuXG4gICAgY29uc3QgZmluZ2VycHJpbnQgPSBgJHtlbnNlbWJsZU5hbWV9OiR7aW5kZXh9OiR7ZmllbGR9YDtcbiAgICBpZiAodGhpcy5sZWdhY3lFbGVtZW50RmllbGRXYXJuaW5ncy5oYXMoZmluZ2VycHJpbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sZWdhY3lFbGVtZW50RmllbGRXYXJuaW5ncy5hZGQoZmluZ2VycHJpbnQpO1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYEVuc2VtYmxlICcke2Vuc2VtYmxlTmFtZX0nIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICcke2ZpZWxkfScgZmllbGQuIFVzZSAnJHtyZXBsYWNlbWVudH0nIGluc3RlYWQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlclxuICAgKlxuICAgKiBOQU1JTkcgQ09OVkVOVElPTiBTVVBQT1JUOlxuICAgKiAtIFR5cGVTY3JpcHQgaW50ZXJmYWNlcyB1c2UgY2FtZWxDYXNlIChhY3RpdmF0aW9uU3RyYXRlZ3ksIGNvbmZsaWN0UmVzb2x1dGlvbilcbiAgICogLSBZQU1MIGZpbGVzIGNhbiB1c2Ugc25ha2VfY2FzZSAoYWN0aXZhdGlvbl9zdHJhdGVneSwgY29uZmxpY3RfcmVzb2x1dGlvbilcbiAgICogLSBUaGlzIG1ldGhvZCBtYXBzIHNuYWtlX2Nhc2Ug4oaSIGNhbWVsQ2FzZSBmb3IgdXNlciBjb252ZW5pZW5jZVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFJhdyBZQU1MIGRhdGEgZnJvbSBmcm9udG1hdHRlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgRW5zZW1ibGVNZXRhZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxFbnNlbWJsZU1ldGFkYXRhPiB7XG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIHZhbGlkYXRlTWV0YWRhdGFGaWVsZCBmb3IgZmllbGQtYXdhcmUgZXJyb3IgbWVzc2FnZXMgKCMzNjUpXG4gICAgY29uc3QgbmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCduYW1lJywgZGF0YS5uYW1lLCB7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSFxuICAgIH0pO1xuICAgIGlmICghbmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke25hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcblxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBtZXRhZGF0YSBtdXN0IGluY2x1ZGUgYSBuYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIHZhbGlkYXRlTWV0YWRhdGFGaWVsZCBmb3IgZmllbGQtYXdhcmUgZXJyb3IgbWVzc2FnZXMgKCMzNjUpXG4gICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlTWV0YWRhdGFGaWVsZCgnZGVzY3JpcHRpb24nLCBkYXRhLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgcGF0dGVybjogVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0RFU0NSSVBUSU9OXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZGVzY1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBkZXNjcmlwdGlvbiA9IGRlc2NSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBhY3RpdmF0aW9uIHN0cmF0ZWd5IChzdXBwb3J0IGJvdGggc25ha2VfY2FzZSBhbmQgY2FtZWxDYXNlKVxuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneVJhdyA9IGRhdGEuYWN0aXZhdGlvbl9zdHJhdGVneSB8fCBkYXRhLmFjdGl2YXRpb25TdHJhdGVneSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5BQ1RJVkFUSU9OX1NUUkFURUdZO1xuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhhY3RpdmF0aW9uU3RyYXRlZ3lSYXcpLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWFjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWN0aXZhdGlvbiBzdHJhdGVneTogJHthY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3kgPSBhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghQUNUSVZBVElPTl9TVFJBVEVHSUVTLmluY2x1ZGVzKGFjdGl2YXRpb25TdHJhdGVneSBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfU1RSQVRFR1l9OiAke2FjdGl2YXRpb25TdHJhdGVneX1gKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbmZsaWN0IHJlc29sdXRpb24gc3RyYXRlZ3lcbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb25SYXcgPSBkYXRhLmNvbmZsaWN0X3Jlc29sdXRpb24gfHwgZGF0YS5jb25mbGljdFJlc29sdXRpb24gfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09ORkxJQ1RfUkVTT0xVVElPTjtcbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoY29uZmxpY3RSZXNvbHV0aW9uUmF3KSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFjb25mbGljdFJlc29sdXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmZsaWN0IHJlc29sdXRpb24gc3RyYXRlZ3k6ICR7Y29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uID0gY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIUNPTkZMSUNUX1NUUkFURUdJRVMuaW5jbHVkZXMoY29uZmxpY3RSZXNvbHV0aW9uIGFzIGFueSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9DT05GTElDVF9SRVNPTFVUSU9OfTogJHtjb25mbGljdFJlc29sdXRpb259YCk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb250ZXh0IHNoYXJpbmcgbW9kZVxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nUmF3ID0gZGF0YS5jb250ZXh0X3NoYXJpbmcgfHwgZGF0YS5jb250ZXh0U2hhcmluZyB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05URVhUX1NIQVJJTkc7XG5cbiAgICAvLyBGSVg6IEhhbmRsZSBib29sZWFuIHZhbHVlcyAodHJ1ZSAtPiAnZnVsbCcsIGZhbHNlIC0+ICdub25lJylcbiAgICBsZXQgY29udGV4dFNoYXJpbmdWYWx1ZTogc3RyaW5nO1xuICAgIGlmICh0eXBlb2YgY29udGV4dFNoYXJpbmdSYXcgPT09ICdib29sZWFuJykge1xuICAgICAgY29udGV4dFNoYXJpbmdWYWx1ZSA9IGNvbnRleHRTaGFyaW5nUmF3ID8gJ2Z1bGwnIDogJ25vbmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0U2hhcmluZ1ZhbHVlID0gU3RyaW5nKGNvbnRleHRTaGFyaW5nUmF3KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0U2hhcmluZ1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KGNvbnRleHRTaGFyaW5nVmFsdWUsIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghY29udGV4dFNoYXJpbmdSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRleHQgc2hhcmluZyBtb2RlOiAke2NvbnRleHRTaGFyaW5nUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dFNoYXJpbmcgPSBjb250ZXh0U2hhcmluZ1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFbJ25vbmUnLCAnc2VsZWN0aXZlJywgJ2Z1bGwnXS5pbmNsdWRlcyhjb250ZXh0U2hhcmluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IHNoYXJpbmcgbW9kZTogJHtjb250ZXh0U2hhcmluZ31gKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSByZXNvdXJjZSBsaW1pdHMgKHN1cHBvcnQgc25ha2VfY2FzZSlcbiAgICBjb25zdCByZXNvdXJjZUxpbWl0c1JhdyA9IGRhdGEucmVzb3VyY2VfbGltaXRzIHx8IGRhdGEucmVzb3VyY2VMaW1pdHM7XG4gICAgbGV0IHJlc291cmNlTGltaXRzO1xuXG4gICAgaWYgKHJlc291cmNlTGltaXRzUmF3KSB7XG4gICAgICByZXNvdXJjZUxpbWl0cyA9IHtcbiAgICAgICAgbWF4QWN0aXZlRWxlbWVudHM6IHJlc291cmNlTGltaXRzUmF3Lm1heF9hY3RpdmVfZWxlbWVudHMgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4QWN0aXZlRWxlbWVudHMgfHwgRU5TRU1CTEVfTElNSVRTLk1BWF9FTEVNRU5UUyxcbiAgICAgICAgbWF4TWVtb3J5TWI6IHJlc291cmNlTGltaXRzUmF3Lm1heF9tZW1vcnlfbWIgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4TWVtb3J5TWIsXG4gICAgICAgIG1heEV4ZWN1dGlvblRpbWVNczogcmVzb3VyY2VMaW1pdHNSYXcubWF4X2V4ZWN1dGlvbl90aW1lX21zIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heEV4ZWN1dGlvblRpbWVNcyB8fCBFTlNFTUJMRV9MSU1JVFMuTUFYX0FDVElWQVRJT05fVElNRVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBlbGVtZW50cyBhcnJheVxuICAgIGNvbnN0IGVsZW1lbnRzUmF3ID0gZGF0YS5lbGVtZW50cyB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHNSYXcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIGVsZW1lbnRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10gPSBlbGVtZW50c1Jhdy5tYXAoKGVsZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IG5hbWVcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X25hbWUgKG5ldyBzdGFuZGFyZCkgYW5kIG5hbWUgKGxlZ2FjeSkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCByYXdFbGVtZW50TmFtZSA9IGVsZW0uZWxlbWVudF9uYW1lIHx8IGVsZW0ubmFtZTtcbiAgICAgIGlmICghcmF3RWxlbWVudE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IG11c3QgaGF2ZSBlbGVtZW50X25hbWUgKG9yIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KWApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICduYW1lJyBmaWVsZFxuICAgICAgaWYgKGVsZW0ubmFtZSAmJiAhZWxlbS5lbGVtZW50X25hbWUpIHtcbiAgICAgICAgdGhpcy53YXJuT25jZUZvckxlZ2FjeUVsZW1lbnRGaWVsZChuYW1lLCBpbmRleCwgJ25hbWUnLCAnZWxlbWVudF9uYW1lJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50TmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcocmF3RWxlbWVudE5hbWUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCwgYWxsb3dTcGFjZXM6IHRydWUgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudE5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBuYW1lIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnROYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgdHlwZVxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfdHlwZSAobmV3IHN0YW5kYXJkKSBhbmQgdHlwZSAobGVnYWN5KSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlIHx8ICdza2lsbCc7XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ3R5cGUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS50eXBlICYmICFlbGVtLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICB0aGlzLndhcm5PbmNlRm9yTGVnYWN5RWxlbWVudEZpZWxkKG5hbWUsIGluZGV4LCAndHlwZScsICdlbGVtZW50X3R5cGUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhyYXdFbGVtZW50VHlwZSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50VHlwZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudFR5cGVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCByb2xlXG4gICAgICBjb25zdCBlbGVtZW50Um9sZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcoZWxlbS5yb2xlIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkVMRU1FTlRfUk9MRSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudFJvbGVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCByb2xlIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRSb2xlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRSb2xlID0gZWxlbWVudFJvbGVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgICBpZiAoIUVMRU1FTlRfUk9MRVMuaW5jbHVkZXMoZWxlbWVudFJvbGUgYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfRUxFTUVOVF9ST0xFfTogJHtlbGVtZW50Um9sZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IGFjdGl2YXRpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRBY3RpdmF0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhlbGVtLmFjdGl2YXRpb24gfHwgJ2Fsd2F5cycpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgYWN0aXZhdGlvbiBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50QWN0aXZhdGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50QWN0aXZhdGlvbiA9IGVsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgICAgaWYgKCFBQ1RJVkFUSU9OX01PREVTLmluY2x1ZGVzKGVsZW1lbnRBY3RpdmF0aW9uIGFzIGFueSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0FDVElWQVRJT05fTU9ERX06ICR7ZWxlbWVudEFjdGl2YXRpb259YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHByaW9yaXR5ICgwLTEwMCwgZGVmYXVsdCA1MClcbiAgICAgIGxldCBwcmlvcml0eSA9IGVsZW0ucHJpb3JpdHkgPz8gRU5TRU1CTEVfREVGQVVMVFMuUFJJT1JJVFk7XG4gICAgICBpZiAodHlwZW9mIHByaW9yaXR5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBwcmlvcml0eSA9IHBhcnNlSW50KHByaW9yaXR5LCAxMCk7XG4gICAgICB9XG4gICAgICBwcmlvcml0eSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgcHJpb3JpdHkpKTtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb25kaXRpb24gKGlmIGNvbmRpdGlvbmFsIGFjdGl2YXRpb24pXG4gICAgICAvLyBDb25kaXRpb25zIG5lZWQgc3BlY2lhbCBoYW5kbGluZyAtIHRoZXkgY2FuIGNvbnRhaW4gb3BlcmF0b3JzIGxpa2UgPT0sICE9LCAmJiwgfHxcbiAgICAgIC8vIFNvIHdlIHVzZSBhIGN1c3RvbSBwYXR0ZXJuIHRoYXQgYWxsb3dzIHRoZXNlIGNoYXJhY3RlcnNcbiAgICAgIGxldCBjb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtZW50QWN0aXZhdGlvbiA9PT0gJ2NvbmRpdGlvbmFsJyAmJiBlbGVtLmNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgICBTdHJpbmcoZWxlbS5jb25kaXRpb24pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heExlbmd0aDogRU5TRU1CTEVfTElNSVRTLk1BWF9DT05ESVRJT05fTEVOR1RILFxuICAgICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgICAgICBjdXN0b21QYXR0ZXJuOiAvXlthLXpBLVowLTlcXHNcXC1fLj0hJnw8PigpXSskLyAgLy8gQWxsb3cgY29tcGFyaXNvbi9sb2dpY2FsIG9wZXJhdG9yc1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb25kaXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25kaXRpb24gYXQgaW5kZXggJHtpbmRleH06ICR7Y29uZGl0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZGVwZW5kZW5jaWVzXG4gICAgICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtLmRlcGVuZGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGVsZW0uZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGVsZW0uZGVwZW5kZW5jaWVzLnNsaWNlKDAsIEVOU0VNQkxFX0xJTUlUUy5NQVhfREVQRU5ERU5DSUVTKSkge1xuICAgICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhkZXApLCB7XG4gICAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghZGVwUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXBlbmRlbmN5IFwiJHtkZXB9XCIgYXQgaW5kZXggJHtpbmRleH06ICR7ZGVwUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsaWRhdGVkRGVwZW5kZW5jaWVzLnB1c2goZGVwUmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICAgIH1cbiAgICAgICAgZGVwZW5kZW5jaWVzID0gdmFsaWRhdGVkRGVwZW5kZW5jaWVzO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHB1cnBvc2VcbiAgICAgIGxldCBwdXJwb3NlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbS5wdXJwb3NlKSB7XG4gICAgICAgIGNvbnN0IHB1cnBvc2VSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoZWxlbS5wdXJwb3NlKSwge1xuICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nICAvLyBBbGxvdyBmdWxsIGRlc2NyaXB0aW9uIHB1bmN0dWF0aW9uIChjb21tYXMsIGVtLWRhc2hlcywgZXRjLilcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHVycG9zZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1cnBvc2UgYXQgaW5kZXggJHtpbmRleH06ICR7cHVycG9zZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcHVycG9zZSA9IHB1cnBvc2VSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHJvbGU6IGVsZW1lbnRSb2xlIGFzIEVsZW1lbnRSb2xlLFxuICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbWVudEFjdGl2YXRpb24gYXMgQWN0aXZhdGlvbk1vZGUsXG4gICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBwdXJwb3NlXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgZWxlbWVudCBjb3VudFxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiBFTlNFTUJMRV9MSU1JVFMuTUFYX0VMRU1FTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRU5TRU1CTEVfRVJST1JTLlRPT19NQU5ZX0VMRU1FTlRTKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBuZXN0aW5nIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBhbGxvd05lc3RlZCA9IGRhdGEuYWxsb3dfbmVzdGVkICE9PSB1bmRlZmluZWQgP1xuICAgICAgQm9vbGVhbihkYXRhLmFsbG93X25lc3RlZCkgOlxuICAgICAgKGRhdGEuYWxsb3dOZXN0ZWQgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4oZGF0YS5hbGxvd05lc3RlZCkgOiBFTlNFTUJMRV9ERUZBVUxUUy5BTExPV19ORVNURUQpO1xuXG4gICAgY29uc3QgbWF4TmVzdGluZ0RlcHRoID0gZGF0YS5tYXhfbmVzdGluZ19kZXB0aCB8fCBkYXRhLm1heE5lc3RpbmdEZXB0aCB8fCBFTlNFTUJMRV9ERUZBVUxUUy5NQVhfTkVTVElOR19ERVBUSDtcblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgdGFncyBhcnJheVxuICAgIGxldCB0YWdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEudGFncykpIHtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRhdGEudGFncykge1xuICAgICAgICBjb25zdCB0YWdSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcodGFnKSwge1xuICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9UQUdfTEVOR1RILFxuICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRhZ1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhZyBcIiR7dGFnfVwiOiAke3RhZ1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGFncy5wdXNoKHRhZ1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIG1ldGFkYXRhIG9iamVjdCAoY2FtZWxDYXNlKVxuICAgIGNvbnN0IG1ldGFkYXRhOiBFbnNlbWJsZU1ldGFkYXRhID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IGRhdGEuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3MsXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IGFjdGl2YXRpb25TdHJhdGVneSBhcyBBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IGNvbmZsaWN0UmVzb2x1dGlvbiBhcyBDb25mbGljdFJlc29sdXRpb25TdHJhdGVneSxcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBjb250ZXh0U2hhcmluZyBhcyAnbm9uZScgfCAnc2VsZWN0aXZlJyB8ICdmdWxsJyxcbiAgICAgIHJlc291cmNlTGltaXRzLFxuICAgICAgYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGgsXG4gICAgICBlbGVtZW50cyxcbiAgICAgIGdhdGVrZWVwZXI6IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeShkYXRhLmdhdGVrZWVwZXIsIG5hbWUsICdlbnNlbWJsZScsIGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAgLy8gSXNzdWUgIzUyNFxuICAgIH07XG5cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEVuc2VtYmxlIGluc3RhbmNlIGZyb20gcGFyc2VkIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFZhbGlkYXRlZCBlbnNlbWJsZSBtZXRhZGF0YVxuICAgKiBAcGFyYW0gY29udGVudCAtIE1hcmtkb3duIGNvbnRlbnQgKGVuc2VtYmxlIGluc3RydWN0aW9ucy9kb2N1bWVudGF0aW9uKVxuICAgKiBAcmV0dXJucyBOZXcgRW5zZW1ibGUgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBFbnNlbWJsZU1ldGFkYXRhLCBfY29udGVudDogc3RyaW5nKTogRW5zZW1ibGUge1xuICAgIGRlbGV0ZSAobWV0YWRhdGEgYXMgYW55KS5mb3JtYXRfdmVyc2lvbjsgIC8vIEZpeCAjOTEyOiBTdHJpcCBtYXJrZXIgZnJvbSBydW50aW1lIG1ldGFkYXRhXG4gICAgY29uc3QgZW5zZW1ibGUgPSBuZXcgRW5zZW1ibGUobWV0YWRhdGEsIG1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgLy8gRXh0cmFjdCBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSBpZiBwcmVzZW50ICh2MiBkdWFsLWZpZWxkKVxuICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGVuc2VtYmxlLmluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBlbnNlbWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYW4gZW5zZW1ibGUgdG8gZmlsZSBjb250ZW50XG4gICAqXG4gICAqIEZvcm1hdDogTWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gICAqIC0gRnJvbnRtYXR0ZXI6IEVuc2VtYmxlIG1ldGFkYXRhICsgZWxlbWVudCByZWZlcmVuY2VzXG4gICAqIC0gQ29udGVudDogSW5zdHJ1Y3Rpb25zL2RvY3VtZW50YXRpb24gZm9yIHRoZSBlbnNlbWJsZVxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcmV0dXJucyBGaWxlIGNvbnRlbnQgKG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBFbnNlbWJsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50Lm1ldGFkYXRhO1xuXG4gICAgLy8gQnVpbGQgZnJvbnRtYXR0ZXIgZGF0YSAodXNpbmcgY2FtZWxDYXNlKVxuICAgIGNvbnN0IGZyb250bWF0dGVyOiBhbnkgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgdHlwZTogdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLkVOU0VNQkxFKSxcbiAgICAgIGZvcm1hdF92ZXJzaW9uOiAndjInLCAgLy8gRml4ICM5MTI6IEV4cGxpY2l0IGZvcm1hdCBtYXJrZXJcbiAgICAgIHVuaXF1ZV9pZDogZWxlbWVudC5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IG1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhLmNyZWF0ZWQsXG4gICAgICBtb2RpZmllZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFnczogbWV0YWRhdGEudGFncyB8fCBbXSxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogbWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBtZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb24sXG4gICAgICBjb250ZXh0U2hhcmluZzogbWV0YWRhdGEuY29udGV4dFNoYXJpbmcsXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aFxuICAgIH07XG5cbiAgICAvLyB2Mi4wIGR1YWwtZmllbGQ6IHdyaXRlIGluc3RydWN0aW9ucyB0byBZQU1MIGZyb250bWF0dGVyIGlmIHByZXNlbnRcbiAgICBpZiAoZWxlbWVudC5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGZyb250bWF0dGVyLmluc3RydWN0aW9ucyA9IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cblxuICAgIC8vIEluY2x1ZGUgcmVzb3VyY2UgbGltaXRzIGlmIHNwZWNpZmllZFxuICAgIGlmIChtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cykge1xuICAgICAgZnJvbnRtYXR0ZXIucmVzb3VyY2VMaW1pdHMgPSBtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNTI0IOKAlCBHYXRla2VlcGVyIHBvbGljeSAoYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIGZyb250bWF0dGVyLmdhdGVrZWVwZXIgPSBtZXRhZGF0YS5nYXRla2VlcGVyO1xuICAgIH1cblxuICAgIC8vIEluY2x1ZGUgZWxlbWVudHMgYXJyYXkgKHVzaW5nIGVsZW1lbnRfbmFtZS9lbGVtZW50X3R5cGUgZm9yIEFQSSBjb25zaXN0ZW5jeSlcbiAgICBmcm9udG1hdHRlci5lbGVtZW50cyA9IG1ldGFkYXRhLmVsZW1lbnRzLm1hcChlbGVtID0+IHtcbiAgICAgIGNvbnN0IGVsZW1EYXRhOiBhbnkgPSB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbS5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbS5lbGVtZW50X3R5cGUsXG4gICAgICAgIHJvbGU6IGVsZW0ucm9sZSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW0ucHJpb3JpdHksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW0uYWN0aXZhdGlvblxuICAgICAgfTtcblxuICAgICAgaWYgKGVsZW0uY29uZGl0aW9uKSB7XG4gICAgICAgIGVsZW1EYXRhLmNvbmRpdGlvbiA9IGVsZW0uY29uZGl0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbS5kZXBlbmRlbmNpZXMgJiYgZWxlbS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBlbGVtRGF0YS5kZXBlbmRlbmNpZXMgPSBlbGVtLmRlcGVuZGVuY2llcztcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW0ucHVycG9zZSkge1xuICAgICAgICBlbGVtRGF0YS5wdXJwb3NlID0gZWxlbS5wdXJwb3NlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWxlbURhdGE7XG4gICAgfSk7XG5cbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIGNyZWF0aW9uXG4gICAgLy8gVXNlIENPUkVfU0NIRU1BIHRvIHN1cHBvcnQgbnVtYmVycyAocHJpb3JpdHkpIGFuZCBib29sZWFucyAoYWxsb3dOZXN0ZWQpXG4gICAgY29uc3QgYm9keSA9IGVsZW1lbnQuY29udGVudCB8fCB0aGlzLmJ1aWxkRGVmYXVsdEJvZHkoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuY3JlYXRlRnJvbnRtYXR0ZXIoZnJvbnRtYXR0ZXIsIGJvZHksIHtcbiAgICAgIG1ldGhvZDogJ21hbnVhbCcsXG4gICAgICBzY2hlbWE6ICdqc29uJywgIC8vIEZpeCAjOTE0OiBzdGFuZGFyZGl6ZSBvbiBKU09OIHNjaGVtYSBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAgICBjbGVhbk1ldGFkYXRhOiB0cnVlLCAgLy8gRml4ICM5MTM6IHN0YW5kYXJkaXplIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsXG4gICAgICBzb3J0S2V5czogdHJ1ZSxcbiAgICAgIGxpbmVXaWR0aDogMTAwLFxuICAgICAgc2tpcEludmFsaWQ6IGZhbHNlICAvLyBEb24ndCBza2lwIGludmFsaWQgLSB3ZSB3YW50IHRvIGNhdGNoIGVycm9yc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRCb2R5KGVsZW1lbnQ6IEVuc2VtYmxlKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKGVsZW1lbnQubWV0YWRhdGEubmFtZSA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGVsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGluZXMucHVzaChgIyAke25hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBsaW5lcy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWxlIGV4dGVuc2lvbiBmb3IgZW5zZW1ibGUgZmlsZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy5tZCc7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGVuc2VtYmxlIGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqXG4gICAqIFN1cHBvcnRzOlxuICAgKiAtIFlBTUw6IEZyb250bWF0dGVyLXN0eWxlIG1ldGFkYXRhIHdpdGggb3B0aW9uYWwgbWFya2Rvd24gY29udGVudFxuICAgKiAtIEpTT046IERpcmVjdCBlbnNlbWJsZSBzdHJ1Y3R1cmVcbiAgICogLSBNYXJrZG93bjogWUFNTCBmcm9udG1hdHRlciArIG1hcmtkb3duIGNvbnRlbnRcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTdHJpbmcgY29udGFpbmluZyBlbnNlbWJsZSBkYXRhXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBGb3JtYXQgb2YgdGhlIGRhdGEgKGpzb24sIHlhbWwsIG1hcmtkb3duKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBpbXBvcnRlZCBFbnNlbWJsZVxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgaW1wb3J0RWxlbWVudChcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJ1xuICApOiBQcm9taXNlPEVuc2VtYmxlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXJzZWQ6IGFueTtcblxuICAgICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHBhcnNlZCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VKc29uKGRhdGEsIHtcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQYXJzZSBZQU1ML01hcmtkb3duIHVzaW5nIFNlcmlhbGl6YXRpb25TZXJ2aWNlXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IDUwMDAwLCAvLyA1MEtCIGxpbWl0IGZvciBlbnNlbWJsZSBmaWxlc1xuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFyc2VkID0gcmVzdWx0LmRhdGE7XG4gICAgICAgIC8vIENvbnRlbnQgaXMgcGFyc2VkIGJ1dCBub3QgdXNlZCBpbiBlbnNlbWJsZSBjcmVhdGlvblxuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkKTtcblxuICAgICAgLy8gQ3JlYXRlIGVuc2VtYmxlXG4gICAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShtZXRhZGF0YSwgbWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgaW1wb3J0XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5JTVBPUlRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBJbXBvcnRlZCBlbnNlbWJsZTogJHttZXRhZGF0YS5uYW1lfSB3aXRoICR7bWV0YWRhdGEuZWxlbWVudHMubGVuZ3RofSBlbGVtZW50c2BcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZW5zZW1ibGU7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuSU1QT1JURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGltcG9ydCBlbnNlbWJsZTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGltcG9ydCBlbnNlbWJsZTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGVuc2VtYmxlIHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIGV4cG9ydFxuICAgKiBAcGFyYW0gZm9ybWF0IC0gT3V0cHV0IGZvcm1hdCAoanNvbiwgeWFtbCwgbWFya2Rvd24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHNlcmlhbGl6ZWQgc3RyaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleHBvcnRFbGVtZW50KFxuICAgIGVsZW1lbnQ6IEVuc2VtYmxlLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bidcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIC8vIEZvciBZQU1MIGFuZCBNYXJrZG93biwgdXNlIHRoZSBzYW1lIGZvcm1hdCAoZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVuc2VtYmxlIHdpdGggbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gUGFydGlhbCBtZXRhZGF0YSBmb3IgdGhlIGVuc2VtYmxlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG5ldyBFbnNlbWJsZSBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPEVuc2VtYmxlTWV0YWRhdGE+ICYgeyBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmcgfSk6IFByb21pc2U8RW5zZW1ibGU+IHtcbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBpbnB1dCB2YWxpZGF0aW9uXG4gICAgLy8gTm90ZTogZWxlbWVudF90eXBlIHJlc29sdXRpb24gaXMgaGFuZGxlZCBieSB0aGUgaGFuZGxlciBsYXllciBiZWZvcmUgY2FsbGluZyBjcmVhdGUoKS5cbiAgICAvLyBFbGVtZW50cyBzaG91bGQgYWxyZWFkeSBoYXZlIGVsZW1lbnRfdHlwZSBzZXQgd2hlbiB0aGV5IGFycml2ZSBoZXJlLlxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSh7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgZWxlbWVudHM6IG1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGhcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCFtZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICB9XG4gICAgY29uc3QgZW5zZW1ibGVOYW1lID0gbWV0YWRhdGEubmFtZTtcblxuICAgIGxldCByYXdFbGVtZW50cyA9IG1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdO1xuXG4gICAgLy8gTWlncmF0ZSBsZWdhY3kgZWxlbWVudCBmaWVsZHMgKG5hbWUgLT4gZWxlbWVudF9uYW1lLCB0eXBlIC0+IGVsZW1lbnRfdHlwZSlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBBUEkgY2FsbHMgdXNpbmcgb2xkIGZpZWxkIG5hbWVzXG4gICAgY29uc3QgbWlncmF0ZWRFbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10gPSByYXdFbGVtZW50cy5tYXAoKGVsZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIWVsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIHRoaXMud2Fybk9uY2VGb3JMZWdhY3lFbGVtZW50RmllbGQoZW5zZW1ibGVOYW1lLCBpbmRleCwgJ25hbWUnLCAnZWxlbWVudF9uYW1lJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X3R5cGUgKG5ldyBzdGFuZGFyZCkgYW5kIHR5cGUgKGxlZ2FjeSlcbiAgICAgIC8vIElzc3VlICM0NjY6IE5vIGxvbmdlciBkZWZhdWx0cyB0byAnc2tpbGwnIOKAlCBjYWxsZXJzIG11c3QgcHJvdmlkZSB0eXBlXG4gICAgICAvLyBvciBwYXNzIG1hbmFnZXJzIGZvciBwb3J0Zm9saW8gcmVzb2x1dGlvblxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtLmVsZW1lbnRfdHlwZSB8fCBlbGVtLnR5cGU7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGF0IGluZGV4ICR7aW5kZXh9IGhhcyBubyBlbGVtZW50X3R5cGUuIGAgK1xuICAgICAgICAgIGBQcm92aWRlIGVsZW1lbnRfdHlwZSBleHBsaWNpdGx5IG9yIGVuc3VyZSB0aGUgZWxlbWVudCBleGlzdHMgaW4gdGhlIHBvcnRmb2xpby5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ3R5cGUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS50eXBlICYmICFlbGVtLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICB0aGlzLndhcm5PbmNlRm9yTGVnYWN5RWxlbWVudEZpZWxkKGVuc2VtYmxlTmFtZSwgaW5kZXgsICd0eXBlJywgJ2VsZW1lbnRfdHlwZScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICByb2xlOiBlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uIHx8ICdhbHdheXMnLFxuICAgICAgICBjb25kaXRpb246IGVsZW0uY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IGVsZW0uZGVwZW5kZW5jaWVzLFxuICAgICAgICBwdXJwb3NlOiBlbGVtLnB1cnBvc2VcbiAgICAgIH0gYXMgRW5zZW1ibGVFbGVtZW50O1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzIGZvciBvcHRpb25hbCBmaWVsZHNcbiAgICBjb25zdCBmdWxsTWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YS5jcmVhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBtZXRhZGF0YS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgKG1ldGFkYXRhIGFzIGFueSkuYWN0aXZhdGlvbl9zdHJhdGVneSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5BQ1RJVkFUSU9OX1NUUkFURUdZLFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBtZXRhZGF0YS5jb25mbGljdFJlc29sdXRpb24gfHwgKG1ldGFkYXRhIGFzIGFueSkuY29uZmxpY3RfcmVzb2x1dGlvbiB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05GTElDVF9SRVNPTFVUSU9OLFxuICAgICAgY29udGV4dFNoYXJpbmc6IG1ldGFkYXRhLmNvbnRleHRTaGFyaW5nIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTlRFWFRfU0hBUklORyxcbiAgICAgIHJlc291cmNlTGltaXRzOiBtZXRhZGF0YS5yZXNvdXJjZUxpbWl0cyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCA/PyBFTlNFTUJMRV9ERUZBVUxUUy5BTExPV19ORVNURUQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aCB8fCBFTlNFTUJMRV9ERUZBVUxUUy5NQVhfTkVTVElOR19ERVBUSCxcbiAgICAgIGVsZW1lbnRzOiBtaWdyYXRlZEVsZW1lbnRzLFxuICAgICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKHN5bW1ldHJpYyB3aXRoIGJ1aWxkTWV0YWRhdGEgZGVzZXJpYWxpemF0aW9uKVxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KChtZXRhZGF0YSBhcyBhbnkpLmdhdGVrZWVwZXIsIG1ldGFkYXRhLm5hbWUhLCAnZW5zZW1ibGUnLCBtZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIGluaGVyaXRlZCBnZXRFbGVtZW50RmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBub3JtYWxpemF0aW9uXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShmdWxsTWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBJc3N1ZSAjNjEzOiBDaGVjayBtZXRhZGF0YSBuYW1lIHVuaXF1ZW5lc3MgKG5vdCBqdXN0IGZpbGVuYW1lKVxuICAgIGNvbnN0IGV4aXN0aW5nRW5zZW1ibGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdFbnNlbWJsZXMuZmluZChlID0+XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZnVsbE1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBlbnNlbWJsZSBuYW1lZCBcIiR7ZnVsbE1ldGFkYXRhLm5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShmdWxsTWV0YWRhdGEsIGZ1bGxNZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gU2V0IGluc3RydWN0aW9ucyBhbmQgY29udGVudCBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBlbnNlbWJsZS5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5jb250ZW50KSB7XG4gICAgICBlbnNlbWJsZS5jb250ZW50ID0gbWV0YWRhdGEuY29udGVudDtcbiAgICB9XG5cbiAgICAvLyBTYXZlIHRvIGRpc2tcbiAgICBhd2FpdCB0aGlzLnNhdmUoZW5zZW1ibGUsIGZpbGVuYW1lKTtcbiAgICAvLyBOb3RlOiBObyByZWxvYWQoKSBoZXJlIOKAlCBzYXZlKCkgY2FjaGVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgIC8vIExvZyBjcmVhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5TQVZFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYENyZWF0ZWQgZW5zZW1ibGU6ICR7ZnVsbE1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVuc2VtYmxlXG4gICAqIERlbGVnYXRlcyB0byBlbnNlbWJsZSdzIG93biB2YWxpZGF0ZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgb3ZlcnJpZGUgdmFsaWRhdGUoZWxlbWVudDogRW5zZW1ibGUpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBzYXZlIHRvIHZhbGlkYXRlIGJlZm9yZSBwZXJzaXN0aW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzYXZlKGVsZW1lbnQ6IEVuc2VtYmxlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmFsaWRhdGUgZW5zZW1ibGUgYmVmb3JlIHNhdmluZ1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRlKGVsZW1lbnQpO1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKSB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCBlbnNlbWJsZTogJHtlcnJvcnN9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBiYXNlIGltcGxlbWVudGF0aW9uXG4gICAgYXdhaXQgc3VwZXIuc2F2ZShlbGVtZW50LCBmaWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIGFkZCBlbnNlbWJsZS1zcGVjaWZpYyBsb2dnaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5ERUxFVEVELFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgRGVsZXRpbmcgZW5zZW1ibGU6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKGZpbGVQYXRoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5ERUxFVEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZW5zZW1ibGU6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGxpc3QgdG8gYXBwbHkgYWN0aXZlIHN0YXR1cyBiYXNlZCBvbiBhY3RpdmVFbnNlbWJsZU5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEVuc2VtYmxlW10+IHtcbiAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBBcHBseSBBQ1RJVkUgc3RhdHVzIHRvIGVuc2VtYmxlcyBpbiB0aGUgYWN0aXZlRW5zZW1ibGVOYW1lcyBzZXRcbiAgICBmb3IgKGNvbnN0IGVuc2VtYmxlIG9mIGVuc2VtYmxlcykge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5oYXMoZW5zZW1ibGUubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgLy8gQ2FsbCBhY3RpdmF0ZSgpIHRvIHNldCBzdGF0dXMgdG8gQUNUSVZFXG4gICAgICAgIGF3YWl0IGVuc2VtYmxlLmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuc2VtYmxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhbiBlbnNlbWJsZSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbnNlbWJsZSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgQWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVFbnNlbWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBlbnNlbWJsZT86IEVuc2VtYmxlIH0+IHtcbiAgICAvLyBFdmljdCBzdGFsZSBjYWNoZSBiZWZvcmUgbG9va3VwIHNvIGV4dGVybmFsIGZpbGUgZWRpdHMgYXJlIHBpY2tlZCB1cCAoIzE4OTUpLlxuICAgIC8vIGZpbmRCeU5hbWUoKSBoaXRzIHRoZSBMUlUgY2FjaGUgZmlyc3QgYW5kIG5ldmVyIGNhbGxzIGxpc3QoKSwgc28gd2l0aG91dCB0aGlzXG4gICAgLy8gdGhlIHNjYW4gY29vbGRvd24gcHJldmVudHMgbXRpbWUtYmFzZWQgZXZpY3Rpb24gZnJvbSBydW5uaW5nLlxuICAgIGF3YWl0IHRoaXMuc2NhbkFuZEV2aWN0KCk7XG5cbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghZW5zZW1ibGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBNRU1PUlkgTEVBSyBGSVg6IENoZWNrIGlmIGNsZWFudXAgaXMgbmVlZGVkIGJlZm9yZSBhZGRpbmdcbiAgICB0aGlzLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpO1xuXG4gICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmFkZChlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFNldCBlbnNlbWJsZSBzdGF0dXMgdG8gYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmFjdGl2YXRlRW5zZW1ibGUnLFxuICAgICAgZGV0YWlsczogYEVuc2VtYmxlIGFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpLFxuICAgICAgZW5zZW1ibGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gZW5zZW1ibGUgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRW5zZW1ibGUgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIERlYWN0aXZhdGlvbiByZXN1bHQgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgZGVhY3RpdmF0ZUVuc2VtYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGVuc2VtYmxlPzogRW5zZW1ibGUgfT4ge1xuICAgIC8vIE5vIHNjYW5BbmRFdmljdCgpIGhlcmUg4oCUIGludGVudGlvbmFsLiBEZWFjdGl2YXRpb24gb25seSBuZWVkcyB0aGUgZW5zZW1ibGUnc1xuICAgIC8vIG5hbWUgKHRvIHJlbW92ZSBmcm9tIGFjdGl2ZUVuc2VtYmxlTmFtZXMpIGFuZCBjYWxscyBkZWFjdGl2YXRlKCkgd2hpY2ggc2V0c1xuICAgIC8vIGEgc3RhdHVzIGZsYWcuIEl0IGRvZXMgbm90IGNvbnN1bWUgdGhlIGVsZW1lbnRzIGxpc3QsIHNvIHN0YWxlIGNhY2hlZCBlbGVtZW50XG4gICAgLy8gZGF0YSBoYXMgbm8gZWZmZWN0IG9uIGNvcnJlY3RuZXNzLiBDb21wYXJlIHdpdGggYWN0aXZhdGVFbnNlbWJsZSgpLCB3aGljaFxuICAgIC8vIGluZ2VzdHMgdGhlIGZ1bGwgZWxlbWVudCBsaXN0IHRvIG9yY2hlc3RyYXRlIHN1Yi1lbGVtZW50IGxvYWRpbmcgYW5kIG11c3RcbiAgICAvLyB0aGVyZWZvcmUgc2VlIHRoZSBsYXRlc3Qgb24tZGlzayBkZWZpbml0aW9uLiAoIzE4OTUpXG5cbiAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IFVzZSBmaW5kQnlOYW1lKCkgaW5zdGVhZCBvZiBsaXN0KClcbiAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghZW5zZW1ibGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBpZGVudGlmaWVyKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuZGVsZXRlKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gU2V0IGVuc2VtYmxlIHN0YXR1cyB0byBpbmFjdGl2ZVxuICAgIGF3YWl0IGVuc2VtYmxlLmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmRlYWN0aXZhdGVFbnNlbWJsZScsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgZGVhY3RpdmF0ZWQ6ICR7ZW5zZW1ibGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuZGVhY3RpdmF0ZWQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpLFxuICAgICAgZW5zZW1ibGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGVuc2VtYmxlc1xuICAgKlxuICAgKiBAcmV0dXJucyBMaXN0IG9mIGFjdGl2ZSBlbnNlbWJsZXNcbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZUVuc2VtYmxlcygpOiBQcm9taXNlPEVuc2VtYmxlW10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBFbnNlbWJsZVtdID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcykge1xuICAgICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICBpZiAoZW5zZW1ibGUpIHJlc3VsdHMucHVzaChlbnNlbWJsZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFjdGl2ZSBzZXQgY2xlYW51cCBpcyBuZWVkZWQgYW5kIHBlcmZvcm0gY2xlYW51cCBpZiBuZWNlc3NhcnlcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdlbnNlbWJsZXMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBlbnNlbWJsZXMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIGVuc2VtYmxlcyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX0VOU0VNQkxFUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIGVuc2VtYmxlcyBsaW1pdCByZWFjaGVkOiAke3RoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplfS8ke21heH1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBlbnNlbWJsZXMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplO1xuICAgICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0Vuc2VtYmxlTmFtZXMgPSBuZXcgU2V0KGVuc2VtYmxlcy5tYXAoZSA9PiBlLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0Vuc2VtYmxlTmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBlbnNlbWJsZSByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgZW5zZW1ibGVzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2Vuc2VtYmxlcycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGVuc2VtYmxlIHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGVuc2VtYmxlczonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "2.0.26";
6
- export declare const BUILD_TIMESTAMP = "2026-04-17T19:58:08.975Z";
5
+ export declare const PACKAGE_VERSION = "2.0.27-rc.2";
6
+ export declare const BUILD_TIMESTAMP = "2026-04-19T16:20:57.972Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/generated/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,UAAU,EAAE,KAAK,GAAG,KAAa,CAAC;AAC/C,eAAO,MAAM,YAAY,6BAA6B,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/generated/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,UAAU,EAAE,KAAK,GAAG,KAAa,CAAC;AAC/C,eAAO,MAAM,YAAY,6BAA6B,CAAC"}
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '2.0.26';
6
- export const BUILD_TIMESTAMP = '2026-04-17T19:58:08.975Z';
5
+ export const PACKAGE_VERSION = '2.0.27-rc.2';
6
+ export const BUILD_TIMESTAMP = '2026-04-19T16:20:57.972Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMjYnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTE3VDE5OjU4OjA4Ljk3NVonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMjctcmMuMic7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjYtMDQtMTlUMTY6MjA6NTcuOTcyWic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"LogHooks.d.ts","sourceRoot":"","sources":["../../src/logging/LogHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA0BlD,KAAK,qBAAqB,GAAG;IAAE,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAMxE,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,qBAAqB,GACrC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAcvG;AAMD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,qBAAqB,GACrC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAcvG;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE;IAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAA;CAAE,GACzC,CAAC,MAAM,IAAI,CAAC,EAAE,CA0PhB"}
1
+ {"version":3,"file":"LogHooks.d.ts","sourceRoot":"","sources":["../../src/logging/LogHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAyClD,KAAK,qBAAqB,GAAG;IAAE,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAMxE,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,qBAAqB,GACrC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAcvG;AAMD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,qBAAqB,GACrC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAcvG;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE;IAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAA;CAAE,GACzC,CAAC,MAAM,IAAI,CAAC,EAAE,CAuRhB"}