@dollhousemcp/mcp-server 1.9.13 → 1.9.14

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.
@@ -112,7 +112,7 @@ export class ElementFormatter {
112
112
  async formatContent(filePath, content, result) {
113
113
  const elementType = this.detectElementType(filePath);
114
114
  if (elementType === ElementType.MEMORY) {
115
- return await this.formatMemory(content, result);
115
+ return await this.formatMemory(content, filePath, result);
116
116
  }
117
117
  else {
118
118
  return await this.formatStandardElement(content, result);
@@ -129,8 +129,9 @@ export class ElementFormatter {
129
129
  const yamlToValidate = elementType === ElementType.MEMORY
130
130
  ? `---\n${formatted}\n---\n`
131
131
  : formatted;
132
+ // FIX (Issue #1211): Local files are pre-trusted (same as MemoryManager PR #1207)
132
133
  SecureYamlParser.parse(yamlToValidate, {
133
- validateContent: true,
134
+ validateContent: false,
134
135
  validateFields: false
135
136
  });
136
137
  result.fixed.push('YAML validation passed');
@@ -305,7 +306,7 @@ export class ElementFormatter {
305
306
  * Format a memory YAML file
306
307
  * Refactored to reduce cognitive complexity
307
308
  */
308
- async formatMemory(content, result) {
309
+ async formatMemory(content, filePath, result) {
309
310
  try {
310
311
  const data = await this.parseMemoryContent(content);
311
312
  // Process entries if they exist
@@ -313,7 +314,7 @@ export class ElementFormatter {
313
314
  await this.processMemoryEntries(data.entries, data, result);
314
315
  }
315
316
  // Ensure proper structure
316
- this.ensureMemoryStructure(data, result);
317
+ this.ensureMemoryStructure(data, filePath, result);
317
318
  // Format as clean YAML
318
319
  return this.formatAsYaml(data);
319
320
  }
@@ -327,8 +328,9 @@ export class ElementFormatter {
327
328
  */
328
329
  async parseMemoryContent(content) {
329
330
  const wrappedContent = `---\n${content}\n---\n`;
331
+ // FIX (Issue #1211): Local files are pre-trusted (same as MemoryManager PR #1207)
330
332
  const parsed = SecureYamlParser.parse(wrappedContent, {
331
- validateContent: true,
333
+ validateContent: false,
332
334
  validateFields: false
333
335
  });
334
336
  return parsed.data;
@@ -396,11 +398,14 @@ export class ElementFormatter {
396
398
  }
397
399
  /**
398
400
  * Ensure memory has proper structure
401
+ * FIX (Issue #1211): Derive name from filename instead of auto-generated entry ID
399
402
  */
400
- ensureMemoryStructure(data, result) {
401
- if (!data.name && data.entries?.[0]?.id) {
402
- data.name = data.entries[0].id;
403
- result.fixed.push('Added name field from entry ID');
403
+ ensureMemoryStructure(data, filePath, result) {
404
+ if (!data.name) {
405
+ // Derive name from filename, removing extension and normalizing
406
+ const filename = path.basename(filePath, path.extname(filePath));
407
+ data.name = filename;
408
+ result.fixed.push(`Added name field from filename: ${filename}`);
404
409
  }
405
410
  }
406
411
  /**
@@ -442,9 +447,10 @@ export class ElementFormatter {
442
447
  }
443
448
  const [, frontmatterStr, body] = match;
444
449
  // FIX: HIGH - Use SecureYamlParser for frontmatter
450
+ // FIX (Issue #1211): Local files are pre-trusted (same as MemoryManager PR #1207)
445
451
  const tempDoc = `---\n${frontmatterStr}\n---\n`;
446
452
  const parsed = SecureYamlParser.parse(tempDoc, {
447
- validateContent: true,
453
+ validateContent: false,
448
454
  validateFields: false
449
455
  });
450
456
  const frontmatter = parsed.data;
@@ -504,9 +510,10 @@ export class ElementFormatter {
504
510
  const metadataStr = trimmed.slice(startPos, altEndPos).trim();
505
511
  const cleanContent = trimmed.slice(altEndPos + altEndMarker.length).trim();
506
512
  try {
513
+ // FIX (Issue #1211): Local files are pre-trusted (same as MemoryManager PR #1207)
507
514
  const tempDoc = `---\n${metadataStr}\n---\n`;
508
515
  const parsed = SecureYamlParser.parse(tempDoc, {
509
- validateContent: true,
516
+ validateContent: false,
510
517
  validateFields: false
511
518
  });
512
519
  return { metadata: parsed.data, content: cleanContent };
@@ -520,9 +527,10 @@ export class ElementFormatter {
520
527
  const cleanContent = unescaped.slice(endPos + endMarker.length).trim();
521
528
  try {
522
529
  // FIX: HIGH - Use SecureYamlParser for metadata extraction
530
+ // FIX (Issue #1211): Local files are pre-trusted (same as MemoryManager PR #1207)
523
531
  const tempDoc = `---\n${metadataStr}\n---\n`;
524
532
  const parsed = SecureYamlParser.parse(tempDoc, {
525
- validateContent: true,
533
+ validateContent: false,
526
534
  validateFields: false
527
535
  });
528
536
  const metadata = parsed.data;
@@ -627,4 +635,4 @@ export class ElementFormatter {
627
635
  return path.join(dir, `${base}.formatted${ext}`);
628
636
  }
629
637
  }
630
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudEZvcm1hdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9FbGVtZW50Rm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxvREFBb0Q7QUFDcEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUEwQnZDLE1BQU0sT0FBTyxnQkFBZ0I7SUFDVixPQUFPLENBQW9DO0lBRTVELFlBQVksVUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSTtZQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLO1lBQ2pDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDbEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTtZQUNsQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxhQUFhO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQseUZBQXlGO0lBRXpGOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLHVFQUF1RTtRQUN2RSxPQUFPLEtB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UUFBUSxFQUFFLE1BQU07b0JBQ2hCLE1BQU0sRUFBRSxrQkFBa0I7b0JBQzFCLE9BQU8sRUFBRSwyQkFBMkIsUUFBUSxFQUFFO29CQUM5QyxjQUFjLEVBQUU7d0JBQ2QsYUFBYSxFQUFFLFFBQVE7d0JBQ3ZCLFdBQVc7d0JBQ1gsWUFBWSxFQUFFLFFBQVE7cUJBQ3ZCO2lCQUNGLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFFRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGVtZW50IEZvcm1hdHRlci9DbGVhbmVyIFRvb2xcbiAqXG4gKiBGaXhlcyBjb21tb24gaXNzdWVzIHdpdGggbWFsZm9ybWVkIERvbGxob3VzZU1DUCBlbGVtZW50czpcbiAqIC0gRXNjYXBlZCBuZXdsaW5lcyAoXFxuIGluc3RlYWQgb2YgYWN0dWFsIGxpbmUgYnJlYWtzKVxuICogLSBNYWxmb3JtZWQgbWV0YWRhdGEgKGVtYmVkZGVkIGluIGNvbnRlbnQgaW5zdGVhZCBvZiB0b3AtbGV2ZWwpXG4gKiAtIEJyb2tlbiBZQU1MIHN0cnVjdHVyZVxuICogLSBNYWtlcyBlbGVtZW50cyBodW1hbi1yZWFkYWJsZSBhbmQgZWRpdGFibGVcbiAqXG4gKiBGSVhFUyBJTVBMRU1FTlRFRCAoSXNzdWUgIzExOTApOlxuICogMS4gQ1JJVElDQUw6IFVuZXNjYXBlcyBuZXdsaW5lIGNoYXJhY3RlcnMgZm9yIHJlYWRhYmlsaXR5XG4gKiAyLiBISUdIOiBFeHRyYWN0cyBlbWJlZGRlZCBtZXRhZGF0YSB0byBwcm9wZXIgWUFNTCBzdHJ1Y3R1cmVcbiAqIDMuIEVOSEFOQ0VNRU5UOiBGb3JtYXRzIFlBTUwgZm9yIGNvbnNpc3RlbmN5IGFuZCByZWFkYWJpbGl0eVxuICovXG5cbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5cbi8vIFNlY3VyaXR5OiBNYXhpbXVtIGZpbGUgc2l6ZSBmb3IgcHJvY2Vzc2luZyAoMTBNQilcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBOb3RlOiBEaXJlY3QgYXVkaXRMb2cgcmVtb3ZlZCAtIHVzaW5nIFNlY3VyaXR5TW9uaXRvciBkaXJlY3RseSBmb3IgYWxsIGF1ZGl0IGxvZ2dpbmdcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50Rm9ybWF0dGVyT3B0aW9ucyB7XG4gIC8qKiBXaGV0aGVyIHRvIGNyZWF0ZSBiYWNrdXAgZmlsZXMgYmVmb3JlIGZvcm1hdHRpbmcgKi9cbiAgYmFja3VwPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gZml4IGZpbGVzIGluIHBsYWNlIG9yIGNyZWF0ZSBuZXcgZmlsZXMgKi9cbiAgaW5QbGFjZT86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIHZhbGlkYXRlIFlBTUwgYWZ0ZXIgZm9ybWF0dGluZyAqL1xuICB2YWxpZGF0ZT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gb3V0cHV0IGRpcmVjdG9yeSBmb3IgZm9ybWF0dGVkIGZpbGVzICovXG4gIG91dHB1dERpcj86IHN0cmluZztcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIHRvIHByb2Nlc3MgKGJ5dGVzKSAqL1xuICBtYXhGaWxlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZXJSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICBpc3N1ZXM6IHN0cmluZ1tdO1xuICBmaXhlZDogc3RyaW5nW107XG4gIGVycm9yPzogc3RyaW5nO1xuICBiYWNrdXBQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudEZvcm1hdHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUmVxdWlyZWQ8RWxlbWVudEZvcm1hdHRlck9wdGlvbnM+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVsZW1lbnRGb3JtYXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBiYWNrdXA6IG9wdGlvbnMuYmFja3VwID8/IHRydWUsXG4gICAgICBpblBsYWNlOiBvcHRpb25zLmluUGxhY2UgPz8gZmFsc2UsXG4gICAgICB2YWxpZGF0ZTogb3B0aW9ucy52YWxpZGF0ZSA/PyB0cnVlLFxuICAgICAgb3V0cHV0RGlyOiBvcHRpb25zLm91dHB1dERpciA/PyAnJyxcbiAgICAgIG1heEZpbGVTaXplOiBvcHRpb25zLm1heEZpbGVTaXplID8/IE1BWF9GSUxFX1NJWkVcbiAgICB9O1xuICB9XG5cbiAgLy8gTm90ZTogdmFsaWRhdGVZYW1sQ29udGVudCByZW1vdmVkIC0gU2VjdXJlWWFtbFBhcnNlciBoYW5kbGVzIGFsbCB2YWxpZGF0aW9uIGludGVybmFsbHlcblxuICAvKipcbiAgICogTm9ybWFsaXplIFVuaWNvZGUgaW4gdXNlciBpbnB1dFxuICAgKlxuICAgKiBGSVg6IE1FRElVTSBQUklPUklUWSAtIE5vcm1hbGl6ZXMgVW5pY29kZSB0byBwcmV2ZW50IGhvbW9ncmFwaCBhdHRhY2tzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVVuaWNvZGUoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVXNlIE5GQyAoQ2Fub25pY2FsIERlY29tcG9zaXRpb24sIGZvbGxvd2VkIGJ5IENhbm9uaWNhbCBDb21wb3NpdGlvbilcbiAgICByZXR1cm4gaW5wdXQubm9ybWFsaXplKCdORkMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBzaW5nbGUgZWxlbWVudCBmaWxlXG4gICAqIFJlZmFjdG9yZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IGJ5IGV4dHJhY3RpbmcgbWV0aG9kc1xuICAgKi9cbiAgYXN5bmMgZm9ybWF0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGb3JtYXR0ZXJSZXN1bHQ+IHtcbiAgICAvLyBGSVg6IE1FRElVTSAtIE5vcm1hbGl6ZSBVbmljb2RlIGluIGZpbGUgcGF0aFxuICAgIGZpbGVQYXRoID0gdGhpcy5ub3JtYWxpemVVbmljb2RlKGZpbGVQYXRoKTtcbiAgICBjb25zdCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCA9IHtcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBpc3N1ZXM6IFtdLFxuICAgICAgZml4ZWQ6IFtdXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBmaWxlIHNpemVcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy52YWxpZGF0ZUZpbGVTaXplKGZpbGVQYXRoLCByZXN1bHQpO1xuICAgICAgaWYgKHN0YXRzID09PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAvLyBSZWFkIGFuZCBub3JtYWxpemUgY29udGVudFxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMucmVhZEFuZE5vcm1hbGl6ZUZpbGUoZmlsZVBhdGgsIHN0YXRzKTtcblxuICAgICAgLy8gRm9ybWF0IGNvbnRlbnRcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IHRoaXMuZm9ybWF0Q29udGVudChmaWxlUGF0aCwgY29udGVudCwgcmVzdWx0KTtcblxuICAgICAgLy8gVmFsaWRhdGUgaWYgbmVlZGVkXG4gICAgICBpZiAoIWF3YWl0IHRoaXMudmFsaWRhdGVGb3JtYXR0ZWRDb250ZW50KGZvcm1hdHRlZCwgZmlsZVBhdGgsIHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGJhY2t1cCBpZiByZXF1ZXN0ZWRcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwSWZOZWVkZWQoZmlsZVBhdGgsIHJlc3VsdCk7XG5cbiAgICAgIC8vIFdyaXRlIGZvcm1hdHRlZCBjb250ZW50XG4gICAgICBhd2FpdCB0aGlzLndyaXRlRm9ybWF0dGVkRmlsZShmaWxlUGF0aCwgZm9ybWF0dGVkLCByZXN1bHQpO1xuXG4gICAgICByZXN1bHQuc3VjY2VzcyA9IHRydWU7XG4gICAgICByZXN1bHQuZml4ZWQucHVzaChgRm9ybWF0dGVkIGZpbGUgd3JpdHRlbiB0byAke3RoaXMuZ2V0T3V0cHV0UGF0aChmaWxlUGF0aCl9YCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVGb3JtYXRFcnJvcihlcnJvciwgcmVzdWx0LCBmaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBmaWxlIHNpemVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVGaWxlU2l6ZShmaWxlUGF0aDogc3RyaW5nLCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuc2l6ZSA+IHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gYEZpbGUgc2l6ZSAoJHtzdGF0cy5zaXplfSBieXRlcykgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKCR7dGhpcy5vcHRpb25zLm1heEZpbGVTaXplfSBieXRlcylgO1xuICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKCdGaWxlIHRvbyBsYXJnZSBmb3IgcHJvY2Vzc2luZycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzdGF0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGFuZCBub3JtYWxpemUgZmlsZSBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRBbmROb3JtYWxpemVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIHN0YXRzOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnRlbnQgPSB0aGlzLm5vcm1hbGl6ZVVuaWNvZGUoY29udGVudCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRWxlbWVudEZvcm1hdHRlcicsXG4gICAgICBkZXRhaWxzOiBgUHJvY2Vzc2luZyBmaWxlOiAke2ZpbGVQYXRofSAoJHtzdGF0cy5zaXplfSBieXRlcylgXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgY29udGVudCBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZm9ybWF0Q29udGVudChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMuZGV0ZWN0RWxlbWVudFR5cGUoZmlsZVBhdGgpO1xuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcm1hdE1lbW9yeShjb250ZW50LCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3JtYXRTdGFuZGFyZEVsZW1lbnQoY29udGVudCwgcmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZm9ybWF0dGVkIGNvbnRlbnQgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRm9ybWF0dGVkQ29udGVudChmb3JtYXR0ZWQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZywgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52YWxpZGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSB0aGlzLmRldGVjdEVsZW1lbnRUeXBlKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IHlhbWxUb1ZhbGlkYXRlID0gZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWVxuICAgICAgICA/IGAtLS1cXG4ke2Zvcm1hdHRlZH1cXG4tLS1cXG5gXG4gICAgICAgIDogZm9ybWF0dGVkO1xuXG4gICAgICBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKHlhbWxUb1ZhbGlkYXRlLCB7XG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LmZpeGVkLnB1c2goJ1lBTUwgdmFsaWRhdGlvbiBwYXNzZWQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXN1bHQuaXNzdWVzLnB1c2goYFlBTUwgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRGb3JtYXR0ZXInLFxuICAgICAgICBkZXRhaWxzOiBgWUFNTCB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJHtmaWxlUGF0aH1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBiYWNrdXAgaWYgcmVxdWVzdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUJhY2t1cElmTmVlZGVkKGZpbGVQYXRoOiBzdHJpbmcsIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuYmFja3VwKSByZXR1cm47XG5cbiAgICBjb25zdCBiYWNrdXBQYXRoID0gZmlsZVBhdGggKyAnLmJhY2t1cCc7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoZmlsZVBhdGgsIGJhY2t1cFBhdGgpO1xuICAgIHJlc3VsdC5iYWNrdXBQYXRoID0gYmFja3VwUGF0aDtcbiAgICByZXN1bHQuZml4ZWQucHVzaChgQ3JlYXRlZCBiYWNrdXAgYXQgJHtiYWNrdXBQYXRofWApO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0ZJTEVfQ09QSUVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0VsZW1lbnRGb3JtYXR0ZXInLFxuICAgICAgZGV0YWlsczogYEJhY2t1cCBjcmVhdGVkOiAke2JhY2t1cFBhdGh9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIG9yaWdpbmFsRmlsZTogZmlsZVBhdGgsXG4gICAgICAgIGJhY2t1cEZpbGU6IGJhY2t1cFBhdGhcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBmb3JtYXR0ZWQgY29udGVudCB0byBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdyaXRlRm9ybWF0dGVkRmlsZShmaWxlUGF0aDogc3RyaW5nLCBmb3JtYXR0ZWQ6IHN0cmluZywgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gdGhpcy5nZXRPdXRwdXRQYXRoKGZpbGVQYXRoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0UGF0aCwgZm9ybWF0dGVkLCAndXRmLTgnKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbGVtZW50Rm9ybWF0dGVyJyxcbiAgICAgIGRldGFpbHM6IGBGaWxlIGZvcm1hdHRlZCBzdWNjZXNzZnVsbHk6ICR7b3V0cHV0UGF0aH1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgaW5wdXRQYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgb3V0cHV0UGF0aCxcbiAgICAgICAgYmFja3VwOiByZXN1bHQuYmFja3VwUGF0aCB8fCAnbm9uZSdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZm9ybWF0dGluZyBlcnJvcnNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRm9ybWF0RXJyb3IoZXJyb3I6IHVua25vd24sIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0LCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IGVycm9yLm1lc3NhZ2U7XG5cbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFTk9FTlQnKSkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goJ0ZpbGUgbm90IGZvdW5kJyk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VBQ0NFUycpKSB7XG4gICAgICAgIHJlc3VsdC5pc3N1ZXMucHVzaCgnUGVybWlzc2lvbiBkZW5pZWQnKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnUGF0aCB0cmF2ZXJzYWwnKSkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goJ1NlY3VyaXR5OiBQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGJsb2NrZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmVycm9yID0gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBmb3JtYXQgZmlsZScsIHtcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgZXJyb3I6IHJlc3VsdC5lcnJvcixcbiAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiB0eXBlb2YgZXJyb3JcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgbXVsdGlwbGUgZmlsZXNcbiAgICpcbiAgICogRklYOiBBZGRlZCBwYXJhbGxlbCBwcm9jZXNzaW5nIHdpdGggY29uY3VycmVuY3kgbGltaXQgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKi9cbiAgYXN5bmMgZm9ybWF0RmlsZXMoZmlsZVBhdGhzOiBzdHJpbmdbXSwgY29uY3VycmVuY3lMaW1pdCA9IDUpOiBQcm9taXNlPEZvcm1hdHRlclJlc3VsdFtdPiB7XG4gICAgY29uc3QgcmVzdWx0czogRm9ybWF0dGVyUmVzdWx0W10gPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgZmlsZXMgaW4gYmF0Y2hlcyBmb3IgY29udHJvbGxlZCBwYXJhbGxlbGlzbVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZVBhdGhzLmxlbmd0aDsgaSArPSBjb25jdXJyZW5jeUxpbWl0KSB7XG4gICAgICBjb25zdCBiYXRjaCA9IGZpbGVQYXRocy5zbGljZShpLCBpICsgY29uY3VycmVuY3lMaW1pdCk7XG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgYmF0Y2gubWFwKGZpbGVQYXRoID0+IHRoaXMuZm9ybWF0RmlsZShmaWxlUGF0aCkpXG4gICAgICApO1xuICAgICAgcmVzdWx0cy5wdXNoKC4uLmJhdGNoUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGFsbCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGVcbiAgICovXG4gIGFzeW5jIGZvcm1hdEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgcG9ydGZvbGlvRGlyOiBzdHJpbmcpOiBQcm9taXNlPEZvcm1hdHRlclJlc3VsdFtdPiB7XG4gICAgY29uc3QgcmVzdWx0czogRm9ybWF0dGVyUmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBlbGVtZW50RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0RpciwgZWxlbWVudFR5cGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgIC8vIEhhbmRsZSBtZW1vcnktc3BlY2lmaWMgc3RydWN0dXJlIChkYXRlIGZvbGRlcnMpXG4gICAgICAgIHJlc3VsdHMucHVzaCguLi5hd2FpdCB0aGlzLmZvcm1hdE1lbW9yeURpcmVjdG9yeShlbGVtZW50RGlyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgc3RhbmRhcmQgZWxlbWVudCBzdHJ1Y3R1cmUgKC5tZCBmaWxlcyBpbiByb290KVxuICAgICAgICByZXN1bHRzLnB1c2goLi4uYXdhaXQgdGhpcy5mb3JtYXRTdGFuZGFyZERpcmVjdG9yeShlbGVtZW50RGlyKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGZvcm1hdCBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCwgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgbWVtb3J5IGVsZW1lbnRzIGluIGRhdGUgZm9sZGVyIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmb3JtYXRNZW1vcnlEaXJlY3RvcnkobWVtb3J5RGlyOiBzdHJpbmcpOiBQcm9taXNlPEZvcm1hdHRlclJlc3VsdFtdPiB7XG4gICAgY29uc3QgcmVzdWx0czogRm9ybWF0dGVyUmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihtZW1vcnlEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgICAgLy8gUHJvY2VzcyByb290IC55YW1sIGZpbGVzXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55YW1sJykpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihtZW1vcnlEaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChhd2FpdCB0aGlzLmZvcm1hdEZpbGUoZmlsZVBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIGRhdGUgZm9sZGVyc1xuICAgICAgLy8gVXNlIFJlZ0V4cC50ZXN0KCkgZGlyZWN0bHkgYXMgcGVyIFNvbmFyQ2xvdWQgUzY1OTRcbiAgICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBlbnRyaWVzLmZpbHRlcihlID0+XG4gICAgICAgIGUuaXNEaXJlY3RvcnkoKSAmJiBkYXRlUGF0dGVybi50ZXN0KGUubmFtZSlcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgIGNvbnN0IGZvbGRlclBhdGggPSBwYXRoLmpvaW4obWVtb3J5RGlyLCBmb2xkZXIubmFtZSk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihmb2xkZXJQYXRoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMuZmlsdGVyKGYgPT4gZi5lbmRzV2l0aCgnLnlhbWwnKSkpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goYXdhaXQgdGhpcy5mb3JtYXRGaWxlKGZpbGVQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZm9ybWF0IG1lbW9yeSBkaXJlY3RvcnknLCB7IG1lbW9yeURpciwgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHN0YW5kYXJkIGVsZW1lbnRzICgubWQgZmlsZXMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZvcm1hdFN0YW5kYXJkRGlyZWN0b3J5KGVsZW1lbnREaXI6IHN0cmluZyk6IFByb21pc2U8Rm9ybWF0dGVyUmVzdWx0W10+IHtcbiAgICBjb25zdCByZXN1bHRzOiBGb3JtYXR0ZXJSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihlbGVtZW50RGlyKTtcbiAgICAgIGNvbnN0IG1kRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcubWQnKSk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBtZEZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGVsZW1lbnREaXIsIGZpbGUpO1xuICAgICAgICByZXN1bHRzLnB1c2goYXdhaXQgdGhpcy5mb3JtYXRGaWxlKGZpbGVQYXRoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGZvcm1hdCBzdGFuZGFyZCBkaXJlY3RvcnknLCB7IGVsZW1lbnREaXIsIGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhIG1lbW9yeSBZQU1MIGZpbGVcbiAgICogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZm9ybWF0TWVtb3J5KGNvbnRlbnQ6IHN0cmluZywgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1lbW9yeUNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIC8vIFByb2Nlc3MgZW50cmllcyBpZiB0aGV5IGV4aXN0XG4gICAgICBpZiAoZGF0YS5lbnRyaWVzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5lbnRyaWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNZW1vcnlFbnRyaWVzKGRhdGEuZW50cmllcywgZGF0YSwgcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHByb3BlciBzdHJ1Y3R1cmVcbiAgICAgIHRoaXMuZW5zdXJlTWVtb3J5U3RydWN0dXJlKGRhdGEsIHJlc3VsdCk7XG5cbiAgICAgIC8vIEZvcm1hdCBhcyBjbGVhbiBZQU1MXG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRBc1lhbWwoZGF0YSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGBGYWlsZWQgdG8gcGFyc2UgWUFNTDogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBjb250ZW50OyAvLyBSZXR1cm4gb3JpZ2luYWwgY29udGVudCBpZiB3ZSBjYW4ndCBwYXJzZSBpdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZW1vcnkgY29udGVudCB1c2luZyBTZWN1cmVZYW1sUGFyc2VyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcnNlTWVtb3J5Q29udGVudChjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHdyYXBwZWRDb250ZW50ID0gYC0tLVxcbiR7Y29udGVudH1cXG4tLS1cXG5gO1xuICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2Uod3JhcHBlZENvbnRlbnQsIHtcbiAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIG1lbW9yeSBlbnRyaWVzIHRvIGZpeCBpc3N1ZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01lbW9yeUVudHJpZXMoZW50cmllczogYW55W10sIGRhdGE6IGFueSwgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZW50cnkuY29udGVudCAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBOb3JtYWxpemUgVW5pY29kZVxuICAgICAgZW50cnkuY29udGVudCA9IHRoaXMubm9ybWFsaXplVW5pY29kZShlbnRyeS5jb250ZW50KTtcblxuICAgICAgLy8gSGFuZGxlIGVtYmVkZGVkIG1ldGFkYXRhXG4gICAgICBpZiAodGhpcy5oYXNFbWJlZGRlZE1ldGFkYXRhKGVudHJ5LmNvbnRlbnQpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRW1iZWRkZWRNZXRhZGF0YShlbnRyeSwgZGF0YSwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5lc2NhcGVFbnRyeUNvbnRlbnQoZW50cnksIHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgaGFzIGVtYmVkZGVkIG1ldGFkYXRhXG4gICAqL1xuICBwcml2YXRlIGhhc0VtYmVkZGVkTWV0YWRhdGEoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgZm9yIGJvdGggYWN0dWFsIG5ld2xpbmVzIGFuZCBlc2NhcGVkIG5ld2xpbmVzXG4gICAgLy8gVXNpbmcgU3RyaW5nLnJhdyB0byBwcm9wZXJseSBoYW5kbGUgZXNjYXBlIHNlcXVlbmNlcyAoU29uYXJDbG91ZCBjb21wbGlhbmNlKVxuICAgIGNvbnN0IGFjdHVhbE5ld2xpbmUgPSAnLS0tXFxuJztcbiAgICBjb25zdCBlc2NhcGVkTmV3bGluZSA9IFN0cmluZy5yYXdgLS0tXFxuYDsgIC8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGl0ZXJhbCBzdHJpbmcgXCItLS1cXG5cIlxuXG4gICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoYWN0dWFsTmV3bGluZSkgfHxcbiAgICAgICAgICAgY29udGVudC5pbmNsdWRlcyhlc2NhcGVkTmV3bGluZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGVtYmVkZGVkIG1ldGFkYXRhIGV4dHJhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRW1iZWRkZWRNZXRhZGF0YShlbnRyeTogYW55LCBkYXRhOiBhbnksIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogdm9pZCB7XG4gICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKCdGb3VuZCBlbWJlZGRlZCBtZXRhZGF0YSBpbiBjb250ZW50Jyk7XG5cbiAgICAvLyBGaXJzdCB1bmVzY2FwZSB0aGUgY29udGVudCB0byBtYWtlIGl0IHBhcnNlYWJsZVxuICAgIGNvbnN0IHVuZXNjYXBlZENvbnRlbnQgPSB0aGlzLnVuZXNjYXBlTmV3bGluZXMoZW50cnkuY29udGVudCk7XG5cbiAgICAvLyBUaGVuIHRyeSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gdGhlIHVuZXNjYXBlZCBjb250ZW50XG4gICAgY29uc3QgZXh0cmFjdGVkID0gdGhpcy5leHRyYWN0RW1iZWRkZWRNZXRhZGF0YSh1bmVzY2FwZWRDb250ZW50KTtcblxuICAgIGlmIChleHRyYWN0ZWQubWV0YWRhdGEpIHtcbiAgICAgIC8vIE1lcmdlIGV4dHJhY3RlZCBtZXRhZGF0YSB0byB0b3AgbGV2ZWxcbiAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgZXh0cmFjdGVkLm1ldGFkYXRhKTtcbiAgICAgIC8vIFVwZGF0ZSBlbnRyeSB3aXRoIGNsZWFuIGNvbnRlbnRcbiAgICAgIGVudHJ5LmNvbnRlbnQgPSBleHRyYWN0ZWQuY29udGVudDtcbiAgICAgIHJlc3VsdC5maXhlZC5wdXNoKCdFeHRyYWN0ZWQgZW1iZWRkZWQgbWV0YWRhdGEgdG8gdG9wIGxldmVsJywgJ1VuZXNjYXBlZCBuZXdsaW5lcyBpbiBjb250ZW50Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEp1c3QgdW5lc2NhcGUgaWYgbm8gbWV0YWRhdGEgZm91bmRcbiAgICAgIGVudHJ5LmNvbnRlbnQgPSB1bmVzY2FwZWRDb250ZW50O1xuICAgICAgcmVzdWx0LmZpeGVkLnB1c2goJ1VuZXNjYXBlZCBuZXdsaW5lcyBpbiBjb250ZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZXNjYXBlIGVudHJ5IGNvbnRlbnRcbiAgICovXG4gIHByaXZhdGUgdW5lc2NhcGVFbnRyeUNvbnRlbnQoZW50cnk6IGFueSwgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGVudHJ5LmNvbnRlbnQ7XG4gICAgZW50cnkuY29udGVudCA9IHRoaXMudW5lc2NhcGVOZXdsaW5lcyhlbnRyeS5jb250ZW50KTtcbiAgICBpZiAob3JpZ2luYWwgIT09IGVudHJ5LmNvbnRlbnQpIHtcbiAgICAgIHJlc3VsdC5maXhlZC5wdXNoKCdVbmVzY2FwZWQgbmV3bGluZXMgaW4gY29udGVudCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgbWVtb3J5IGhhcyBwcm9wZXIgc3RydWN0dXJlXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZU1lbW9yeVN0cnVjdHVyZShkYXRhOiBhbnksIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogdm9pZCB7XG4gICAgaWYgKCFkYXRhLm5hbWUgJiYgZGF0YS5lbnRyaWVzPy5bMF0/LmlkKSB7XG4gICAgICBkYXRhLm5hbWUgPSBkYXRhLmVudHJpZXNbMF0uaWQ7XG4gICAgICByZXN1bHQuZml4ZWQucHVzaCgnQWRkZWQgbmFtZSBmaWVsZCBmcm9tIGVudHJ5IElEJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRhIGFzIGNsZWFuIFlBTUxcbiAgICogRklYOiBJbXByb3ZlZCBZQU1MIGZvcm1hdHRpbmcgZm9yIGNvbnNpc3RlbmN5IGFuZCBzcGVjaWFsIGNoYXJhY3RlciBoYW5kbGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRBc1lhbWwoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4geWFtbC5kdW1wKGRhdGEsIHtcbiAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IGZhbHNlLFxuICAgICAgcXVvdGluZ1R5cGU6ICdcIicsXG4gICAgICBmb3JjZVF1b3RlczogZmFsc2UsXG4gICAgICAvLyBVc2UgYmxvY2sgc2NhbGFyIHN0eWxlIGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgbmV3bGluZXNcbiAgICAgIC8vIFRoaXMgcHJlc2VydmVzIGZvcm1hdHRpbmcgd2hpbGUga2VlcGluZyB0YWJzL3JldHVybnMgcmVhZGFibGVcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFzdHInOiAoc3RyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAvLyBVc2UgYmxvY2sgc2NhbGFyIGZvciBtdWx0aWxpbmUgc3RyaW5nc1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xpdGVyYWwnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVc2UgZGVmYXVsdCAocXVvdGVkKSBmb3Igb3RoZXIgc3RyaW5ncywgaW5jbHVkaW5nIHRob3NlIHdpdGggdGFicy9yZXR1cm5zXG4gICAgICAgICAgcmV0dXJuICdwbGFpbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBzdGFuZGFyZCBlbGVtZW50IChtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmb3JtYXRTdGFuZGFyZEVsZW1lbnQoY29udGVudDogc3RyaW5nLCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNwbGl0IGZyb250bWF0dGVyIGFuZCBjb250ZW50IHVzaW5nIFJlZ0V4cC5leGVjKCkgYXMgcGVyIFNvbmFyQ2xvdWQgUzY1OTRcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLVxcbihbXFxzXFxTXSopJC87XG4gICAgICBjb25zdCBtYXRjaCA9IGZyb250bWF0dGVyUmVnZXguZXhlYyhjb250ZW50KTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goJ05vIGZyb250bWF0dGVyIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCBmcm9udG1hdHRlclN0ciwgYm9keV0gPSBtYXRjaDtcblxuICAgICAgLy8gRklYOiBISUdIIC0gVXNlIFNlY3VyZVlhbWxQYXJzZXIgZm9yIGZyb250bWF0dGVyXG4gICAgICBjb25zdCB0ZW1wRG9jID0gYC0tLVxcbiR7ZnJvbnRtYXR0ZXJTdHJ9XFxuLS0tXFxuYDtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UodGVtcERvYywge1xuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IHBhcnNlZC5kYXRhIGFzIGFueTtcblxuICAgICAgLy8gQ2xlYW4gZnJvbnRtYXR0ZXJcbiAgICAgIGlmIChmcm9udG1hdHRlci5jb250ZW50ICYmIHR5cGVvZiBmcm9udG1hdHRlci5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICBmcm9udG1hdHRlci5jb250ZW50ID0gdGhpcy51bmVzY2FwZU5ld2xpbmVzKGZyb250bWF0dGVyLmNvbnRlbnQpO1xuICAgICAgICByZXN1bHQuZml4ZWQucHVzaCgnVW5lc2NhcGVkIG5ld2xpbmVzIGluIGZyb250bWF0dGVyIGNvbnRlbnQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW4gYm9keVxuICAgICAgY29uc3QgY2xlYW5Cb2R5ID0gdGhpcy51bmVzY2FwZU5ld2xpbmVzKGJvZHkpO1xuICAgICAgaWYgKGJvZHkgIT09IGNsZWFuQm9keSkge1xuICAgICAgICByZXN1bHQuZml4ZWQucHVzaCgnVW5lc2NhcGVkIG5ld2xpbmVzIGluIGJvZHknKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVjb25zdHJ1Y3Qgd2l0aCBjbGVhbiBZQU1MXG4gICAgICBjb25zdCBjbGVhbkZyb250bWF0dGVyID0geWFtbC5kdW1wKGZyb250bWF0dGVyLCB7XG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgLS0tXFxuJHtjbGVhbkZyb250bWF0dGVyfS0tLVxcbiR7Y2xlYW5Cb2R5fWA7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGBGYWlsZWQgdG8gcGFyc2UgZWxlbWVudDogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGVtYmVkZGVkIG1ldGFkYXRhIGZyb20gY29udGVudCBzdHJpbmdcbiAgICpcbiAgICogRklYOiBTZWN1cml0eSBob3RzcG90IC0gUmVwbGFjZWQgcmVnZXggdnVsbmVyYWJsZSB0byBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nXG4gICAqIHdpdGggYSBsaW5lYXItdGltZSBzdHJpbmcgcGFyc2luZyBhcHByb2FjaCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEVtYmVkZGVkTWV0YWRhdGEoY29udGVudDogc3RyaW5nKTogeyBtZXRhZGF0YTogYW55OyBjb250ZW50OiBzdHJpbmcgfSB7XG4gICAgLy8gQ29udGVudCBzaG91bGQgYWxyZWFkeSBiZSB1bmVzY2FwZWQgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmVcbiAgICBjb25zdCB1bmVzY2FwZWQgPSBjb250ZW50O1xuXG4gICAgLy8gVXNlIGluZGV4T2YgZm9yIGxpbmVhci10aW1lIHBhcnNpbmcgaW5zdGVhZCBvZiByZWdleCB0byBwcmV2ZW50IFJlRG9TXG4gICAgY29uc3Qgc3RhcnRNYXJrZXIgPSAnLS0tJztcbiAgICBjb25zdCBlbmRNYXJrZXIgPSAnXFxuLS0tXFxuJztcblxuICAgIC8vIFRyeSB0byBmaW5kIHRoZSBzdGFydCBtYXJrZXIgYW55d2hlcmUgaW4gdGhlIGNvbnRlbnRcbiAgICBjb25zdCB0cmltbWVkID0gdW5lc2NhcGVkLnRyaW0oKTtcbiAgICBjb25zdCBzdGFydElkeCA9IHRyaW1tZWQuaW5kZXhPZihzdGFydE1hcmtlcik7XG5cbiAgICBpZiAoc3RhcnRJZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4geyBtZXRhZGF0YTogbnVsbCwgY29udGVudCB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGFmdGVyIGZpcnN0IG1hcmtlclxuICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RhcnRJZHggKyBzdGFydE1hcmtlci5sZW5ndGg7XG5cbiAgICAvLyBMb29rIGZvciB0aGUgZW5kIG1hcmtlclxuICAgIGNvbnN0IGVuZFBvcyA9IHRyaW1tZWQuaW5kZXhPZihlbmRNYXJrZXIsIHN0YXJ0UG9zKTtcblxuICAgIGlmIChlbmRQb3MgPT09IC0xKSB7XG4gICAgICAvLyBUcnkgYWx0ZXJuYXRpdmUgZW5kIG1hcmtlciBmb3IgZWRnZSBjYXNlc1xuICAgICAgY29uc3QgYWx0RW5kTWFya2VyID0gJy0tLVxcbic7XG4gICAgICBjb25zdCBhbHRFbmRQb3MgPSB0cmltbWVkLmluZGV4T2YoYWx0RW5kTWFya2VyLCBzdGFydFBvcyArIDEpO1xuICAgICAgaWYgKGFsdEVuZFBvcyA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgbWV0YWRhdGE6IG51bGwsIGNvbnRlbnQgfTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBhbHRlcm5hdGl2ZSBlbmQgcG9zaXRpb25cbiAgICAgIGNvbnN0IG1ldGFkYXRhU3RyID0gdHJpbW1lZC5zbGljZShzdGFydFBvcywgYWx0RW5kUG9zKS50cmltKCk7XG4gICAgICBjb25zdCBjbGVhbkNvbnRlbnQgPSB0cmltbWVkLnNsaWNlKGFsdEVuZFBvcyArIGFsdEVuZE1hcmtlci5sZW5ndGgpLnRyaW0oKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcERvYyA9IGAtLS1cXG4ke21ldGFkYXRhU3RyfVxcbi0tLVxcbmA7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UodGVtcERvYywge1xuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IG1ldGFkYXRhOiBwYXJzZWQuZGF0YSwgY29udGVudDogY2xlYW5Db250ZW50IH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHsgbWV0YWRhdGE6IG51bGwsIGNvbnRlbnQgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IG1ldGFkYXRhIGFuZCBjb250ZW50IHNlY3Rpb25zXG4gICAgY29uc3QgbWV0YWRhdGFTdHIgPSB1bmVzY2FwZWQuc2xpY2Uoc3RhcnRQb3MsIGVuZFBvcykudHJpbSgpO1xuICAgIGNvbnN0IGNsZWFuQ29udGVudCA9IHVuZXNjYXBlZC5zbGljZShlbmRQb3MgKyBlbmRNYXJrZXIubGVuZ3RoKS50cmltKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRklYOiBISUdIIC0gVXNlIFNlY3VyZVlhbWxQYXJzZXIgZm9yIG1ldGFkYXRhIGV4dHJhY3Rpb25cbiAgICAgIGNvbnN0IHRlbXBEb2MgPSBgLS0tXFxuJHttZXRhZGF0YVN0cn1cXG4tLS1cXG5gO1xuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSh0ZW1wRG9jLCB7XG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkLmRhdGE7XG5cbiAgICAgIHJldHVybiB7IG1ldGFkYXRhLCBjb250ZW50OiBjbGVhbkNvbnRlbnQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElmIFlBTUwgcGFyc2luZyBmYWlscywgcmV0dXJuIGFzLWlzXG4gICAgICByZXR1cm4geyBtZXRhZGF0YTogbnVsbCwgY29udGVudCB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmVzY2FwZSBuZXdsaW5lIGNoYXJhY3RlcnNcbiAgICogVXNpbmcgcmVwbGFjZUFsbCBhcyBwZXIgU29uYXJDbG91ZCBTNzc4MVxuICAgKiBVc2luZyBjaGFyYWN0ZXIgbWFwIHRvIGF2b2lkIGVzY2FwZSBzZXF1ZW5jZSBpc3N1ZXNcbiAgICovXG4gIHByaXZhdGUgdW5lc2NhcGVOZXdsaW5lcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE1hcCBvZiBlc2NhcGUgc2VxdWVuY2VzIHRvIHRoZWlyIGFjdHVhbCBjaGFyYWN0ZXJzXG4gICAgLy8gVGhpcyBhdm9pZHMgU29uYXJDbG91ZCdzIFN0cmluZy5yYXcgd2FybmluZ3NcbiAgICBjb25zdCBlc2NhcGVNYXA6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW1xuICAgICAgW1N0cmluZy5yYXdgXFxuYCwgJ1xcbiddLCAgLy8gTmV3bGluZVxuICAgICAgW1N0cmluZy5yYXdgXFxyYCwgJ1xcciddLCAgLy8gQ2FycmlhZ2UgcmV0dXJuXG4gICAgICBbU3RyaW5nLnJhd2BcXHRgLCAnXFx0J10sICAvLyBUYWJcbiAgICAgIFtTdHJpbmcucmF3YFxcXFxgLCAnXFxcXCddICAgLy8gQmFja3NsYXNoIChtdXN0IGJlIGxhc3QgdG8gYXZvaWQgZG91YmxlLXVuZXNjYXBpbmcpXG4gICAgXTtcblxuICAgIGxldCByZXN1bHQgPSB0ZXh0O1xuICAgIGZvciAoY29uc3QgW2VzY2FwZWQsIGFjdHVhbF0gb2YgZXNjYXBlTWFwKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChlc2NhcGVkLCBhY3R1YWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBlbGVtZW50IHR5cGUgZnJvbSBmaWxlIHBhdGhcbiAgICogRW5oYW5jZWQgd2l0aCBtb3JlIGV4cGxpY2l0IGFuZCByb2J1c3QgcGF0aCBtYXRjaGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RFbGVtZW50VHlwZShmaWxlUGF0aDogc3RyaW5nKTogRWxlbWVudFR5cGUge1xuICAgIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuXG4gICAgLy8gTWFwIG9mIGVsZW1lbnQgdHlwZSBkaXJlY3RvcnkgbmFtZXMgdG8gRWxlbWVudFR5cGUgZW51bSB2YWx1ZXNcbiAgICAvLyBNb3JlIGV4cGxpY2l0IHRoYW4gaXRlcmF0aW5nIHRocm91Z2ggZW51bSB2YWx1ZXNcbiAgICBjb25zdCBlbGVtZW50VHlwZU1hcDogUmVjb3JkPHN0cmluZywgRWxlbWVudFR5cGU+ID0ge1xuICAgICAgJ3BlcnNvbmFzJzogRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgICdza2lsbHMnOiBFbGVtZW50VHlwZS5TS0lMTCxcbiAgICAgICd0ZW1wbGF0ZXMnOiBFbGVtZW50VHlwZS5URU1QTEFURSxcbiAgICAgICdhZ2VudHMnOiBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICdtZW1vcmllcyc6IEVsZW1lbnRUeXBlLk1FTU9SWSxcbiAgICAgICdlbnNlbWJsZXMnOiBFbGVtZW50VHlwZS5FTlNFTUJMRVxuICAgIH07XG5cbiAgICAvLyBTcGxpdCBpbnRvIHBhdGggc2VnbWVudHMgZm9yIGFjY3VyYXRlIG1hdGNoaW5nXG4gICAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdCgnLycpLmZpbHRlcihzID0+IHMubGVuZ3RoID4gMCk7XG5cbiAgICAvLyBGaW5kIHRoZSBlbGVtZW50IHR5cGUgYnkgY2hlY2tpbmcgZWFjaCBzZWdtZW50IGFnYWluc3Qgb3VyIGV4cGxpY2l0IG1hcFxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZU1hcFtzZWdtZW50LnRvTG93ZXJDYXNlKCldO1xuICAgICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50VHlwZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogVXNlIGZpbGUgZXh0ZW5zaW9uIGFzIGEgaGludFxuICAgIC8vIC55YW1sIGZpbGVzIGFyZSB0eXBpY2FsbHkgbWVtb3JpZXMsIC5tZCBmaWxlcyBhcmUgc3RhbmRhcmQgZWxlbWVudHNcbiAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy55YW1sJykgfHwgZmlsZVBhdGguZW5kc1dpdGgoJy55bWwnKSkge1xuICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FTU9SWTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIFBFUlNPTkEgZm9yIC5tZCBmaWxlcyBvciB1bmtub3duIHR5cGVzXG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLlBFUlNPTkE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG91dHB1dCBwYXRoIGZvciBmb3JtYXR0ZWQgZmlsZVxuICAgKlxuICAgKiBGSVg6IEFkZGVkIHBhdGggdHJhdmVyc2FsIHByb3RlY3Rpb24gdG8gcHJldmVudCBkaXJlY3RvcnkgZXNjYXBlIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgZ2V0T3V0cHV0UGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmluUGxhY2UpIHtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm91dHB1dERpcikge1xuICAgICAgLy8gU2VjdXJpdHk6IFZhbGlkYXRlIG91dHB1dCBkaXJlY3RvcnkgdG8gcHJldmVudCBwYXRoIHRyYXZlcnNhbFxuICAgICAgLy8gRklYOiBNRURJVU0gLSBOb3JtYWxpemUgVW5pY29kZSBpbiBmaWxlbmFtZVxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZVVuaWNvZGUocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkpO1xuICAgICAgY29uc3Qgc2FmZVBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLm91dHB1dERpciwgZmlsZW5hbWUpO1xuICAgICAgY29uc3QgZXhwZWN0ZWREaXIgPSBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLm91dHB1dERpcik7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgcmVzb2x2ZWQgcGF0aCBpcyB3aXRoaW4gdGhlIGV4cGVjdGVkIGRpcmVjdG9yeVxuICAgICAgaWYgKCFzYWZlUGF0aC5zdGFydHNXaXRoKGV4cGVjdGVkRGlyKSkge1xuICAgICAgICAvLyBGSVg6IExPVyAtIFVzZSBTZWN1cml0eU1vbml0b3IgZm9yIGF1ZGl0IGxvZ2dpbmdcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0VsZW1lbnRGb3JtYXR0ZXInLFxuICAgICAgICAgIGRldGFpbHM6IGBQYXRoIHRyYXZlcnNhbCBibG9ja2VkOiAke2ZpbGVuYW1lfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGF0dGVtcHRlZFBhdGg6IGZpbGVuYW1lLFxuICAgICAgICAgICAgZXhwZWN0ZWREaXIsXG4gICAgICAgICAgICByZXNvbHZlZFBhdGg6IHNhZmVQYXRoXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkOiAke2ZpbGVuYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2FmZVBhdGg7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdDogYWRkIC5mb3JtYXR0ZWQgYmVmb3JlIGV4dGVuc2lvblxuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKTtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgZXh0KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKGRpciwgYCR7YmFzZX0uZm9ybWF0dGVkJHtleHR9YCk7XG4gIH1cbn0iXX0=
638
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudEZvcm1hdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9FbGVtZW50Rm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxvREFBb0Q7QUFDcEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUEwQnZDLE1BQU0sT0FBTyxnQkFBZ0I7SUFDVixPQUFPLENBQW9DO0lBRTVELFlBQVksVUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSTtZQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLO1lBQ2pDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDbEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTtZQUNsQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxhQUFhO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQseUZBQXlGO0lBRXpGOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLHVFQUF1RTtRQUN2RSxPQUFPLEtB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NERBQTREO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLG1EQUFtRDtnQkFDbkQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixRQUFRLEVBQUUsTUFBTTtvQkFDaEIsTUFBTSxFQUFFLGtCQUFrQjtvQkFDMUIsT0FBTyxFQUFFLDJCQUEyQixRQUFRLEVBQUU7b0JBQzlDLGNBQWMsRUFBRTt3QkFDZCxhQUFhLEVBQUUsUUFBUTt3QkFDdkIsV0FBVzt3QkFDWCxZQUFZLEVBQUUsUUFBUTtxQkFDdkI7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCwyQ0FBMkM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsZW1lbnQgRm9ybWF0dGVyL0NsZWFuZXIgVG9vbFxuICpcbiAqIEZpeGVzIGNvbW1vbiBpc3N1ZXMgd2l0aCBtYWxmb3JtZWQgRG9sbGhvdXNlTUNQIGVsZW1lbnRzOlxuICogLSBFc2NhcGVkIG5ld2xpbmVzIChcXG4gaW5zdGVhZCBvZiBhY3R1YWwgbGluZSBicmVha3MpXG4gKiAtIE1hbGZvcm1lZCBtZXRhZGF0YSAoZW1iZWRkZWQgaW4gY29udGVudCBpbnN0ZWFkIG9mIHRvcC1sZXZlbClcbiAqIC0gQnJva2VuIFlBTUwgc3RydWN0dXJlXG4gKiAtIE1ha2VzIGVsZW1lbnRzIGh1bWFuLXJlYWRhYmxlIGFuZCBlZGl0YWJsZVxuICpcbiAqIEZJWEVTIElNUExFTUVOVEVEIChJc3N1ZSAjMTE5MCk6XG4gKiAxLiBDUklUSUNBTDogVW5lc2NhcGVzIG5ld2xpbmUgY2hhcmFjdGVycyBmb3IgcmVhZGFiaWxpdHlcbiAqIDIuIEhJR0g6IEV4dHJhY3RzIGVtYmVkZGVkIG1ldGFkYXRhIHRvIHByb3BlciBZQU1MIHN0cnVjdHVyZVxuICogMy4gRU5IQU5DRU1FTlQ6IEZvcm1hdHMgWUFNTCBmb3IgY29uc2lzdGVuY3kgYW5kIHJlYWRhYmlsaXR5XG4gKi9cblxuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuLy8gU2VjdXJpdHk6IE1heGltdW0gZmlsZSBzaXplIGZvciBwcm9jZXNzaW5nICgxME1CKVxuY29uc3QgTUFYX0ZJTEVfU0laRSA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8vIE5vdGU6IERpcmVjdCBhdWRpdExvZyByZW1vdmVkIC0gdXNpbmcgU2VjdXJpdHlNb25pdG9yIGRpcmVjdGx5IGZvciBhbGwgYXVkaXQgbG9nZ2luZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRGb3JtYXR0ZXJPcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdG8gY3JlYXRlIGJhY2t1cCBmaWxlcyBiZWZvcmUgZm9ybWF0dGluZyAqL1xuICBiYWNrdXA/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBmaXggZmlsZXMgaW4gcGxhY2Ugb3IgY3JlYXRlIG5ldyBmaWxlcyAqL1xuICBpblBsYWNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gdmFsaWRhdGUgWUFNTCBhZnRlciBmb3JtYXR0aW5nICovXG4gIHZhbGlkYXRlPzogYm9vbGVhbjtcbiAgLyoqIEN1c3RvbSBvdXRwdXQgZGlyZWN0b3J5IGZvciBmb3JtYXR0ZWQgZmlsZXMgKi9cbiAgb3V0cHV0RGlyPzogc3RyaW5nO1xuICAvKiogTWF4aW11bSBmaWxlIHNpemUgdG8gcHJvY2VzcyAoYnl0ZXMpICovXG4gIG1heEZpbGVTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlclJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIGlzc3Vlczogc3RyaW5nW107XG4gIGZpeGVkOiBzdHJpbmdbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGJhY2t1cFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Rm9ybWF0dGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxFbGVtZW50Rm9ybWF0dGVyT3B0aW9ucz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRWxlbWVudEZvcm1hdHRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGJhY2t1cDogb3B0aW9ucy5iYWNrdXAgPz8gdHJ1ZSxcbiAgICAgIGluUGxhY2U6IG9wdGlvbnMuaW5QbGFjZSA/PyBmYWxzZSxcbiAgICAgIHZhbGlkYXRlOiBvcHRpb25zLnZhbGlkYXRlID8/IHRydWUsXG4gICAgICBvdXRwdXREaXI6IG9wdGlvbnMub3V0cHV0RGlyID8/ICcnLFxuICAgICAgbWF4RmlsZVNpemU6IG9wdGlvbnMubWF4RmlsZVNpemUgPz8gTUFYX0ZJTEVfU0laRVxuICAgIH07XG4gIH1cblxuICAvLyBOb3RlOiB2YWxpZGF0ZVlhbWxDb250ZW50IHJlbW92ZWQgLSBTZWN1cmVZYW1sUGFyc2VyIGhhbmRsZXMgYWxsIHZhbGlkYXRpb24gaW50ZXJuYWxseVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgVW5pY29kZSBpbiB1c2VyIGlucHV0XG4gICAqXG4gICAqIEZJWDogTUVESVVNIFBSSU9SSVRZIC0gTm9ybWFsaXplcyBVbmljb2RlIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplVW5pY29kZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgTkZDIChDYW5vbmljYWwgRGVjb21wb3NpdGlvbiwgZm9sbG93ZWQgYnkgQ2Fub25pY2FsIENvbXBvc2l0aW9uKVxuICAgIHJldHVybiBpbnB1dC5ub3JtYWxpemUoJ05GQycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhIHNpbmdsZSBlbGVtZW50IGZpbGVcbiAgICogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgYnkgZXh0cmFjdGluZyBtZXRob2RzXG4gICAqL1xuICBhc3luYyBmb3JtYXRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEZvcm1hdHRlclJlc3VsdD4ge1xuICAgIC8vIEZJWDogTUVESVVNIC0gTm9ybWFsaXplIFVuaWNvZGUgaW4gZmlsZSBwYXRoXG4gICAgZmlsZVBhdGggPSB0aGlzLm5vcm1hbGl6ZVVuaWNvZGUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0ID0ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGlzc3VlczogW10sXG4gICAgICBmaXhlZDogW11cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRmlsZVNpemUoZmlsZVBhdGgsIHJlc3VsdCk7XG4gICAgICBpZiAoc3RhdHMgPT09IG51bGwpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgIC8vIFJlYWQgYW5kIG5vcm1hbGl6ZSBjb250ZW50XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5yZWFkQW5kTm9ybWFsaXplRmlsZShmaWxlUGF0aCwgc3RhdHMpO1xuXG4gICAgICAvLyBGb3JtYXQgY29udGVudFxuICAgICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgdGhpcy5mb3JtYXRDb250ZW50KGZpbGVQYXRoLCBjb250ZW50LCByZXN1bHQpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBpZiBuZWVkZWRcbiAgICAgIGlmICghYXdhaXQgdGhpcy52YWxpZGF0ZUZvcm1hdHRlZENvbnRlbnQoZm9ybWF0dGVkLCBmaWxlUGF0aCwgcmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYmFja3VwIGlmIHJlcXVlc3RlZFxuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBJZk5lZWRlZChmaWxlUGF0aCwgcmVzdWx0KTtcblxuICAgICAgLy8gV3JpdGUgZm9ybWF0dGVkIGNvbnRlbnRcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGb3JtYXR0ZWRGaWxlKGZpbGVQYXRoLCBmb3JtYXR0ZWQsIHJlc3VsdCk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gdHJ1ZTtcbiAgICAgIHJlc3VsdC5maXhlZC5wdXNoKGBGb3JtYXR0ZWQgZmlsZSB3cml0dGVuIHRvICR7dGhpcy5nZXRPdXRwdXRQYXRoKGZpbGVQYXRoKX1gKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmhhbmRsZUZvcm1hdEVycm9yKGVycm9yLCByZXN1bHQsIGZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZpbGVTaXplKGZpbGVQYXRoOiBzdHJpbmcsIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5zaXplID4gdGhpcy5vcHRpb25zLm1heEZpbGVTaXplKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSBgRmlsZSBzaXplICgke3N0YXRzLnNpemV9IGJ5dGVzKSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCAoJHt0aGlzLm9wdGlvbnMubWF4RmlsZVNpemV9IGJ5dGVzKWA7XG4gICAgICByZXN1bHQuaXNzdWVzLnB1c2goJ0ZpbGUgdG9vIGxhcmdlIGZvciBwcm9jZXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIG5vcm1hbGl6ZSBmaWxlIGNvbnRlbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEFuZE5vcm1hbGl6ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgc3RhdHM6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29udGVudCA9IHRoaXMubm9ybWFsaXplVW5pY29kZShjb250ZW50KTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbGVtZW50Rm9ybWF0dGVyJyxcbiAgICAgIGRldGFpbHM6IGBQcm9jZXNzaW5nIGZpbGU6ICR7ZmlsZVBhdGh9ICgke3N0YXRzLnNpemV9IGJ5dGVzKWBcbiAgICB9KTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBjb250ZW50IGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmb3JtYXRDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gdGhpcy5kZXRlY3RFbGVtZW50VHlwZShmaWxlUGF0aCk7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9ybWF0TWVtb3J5KGNvbnRlbnQsIGZpbGVQYXRoLCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3JtYXRTdGFuZGFyZEVsZW1lbnQoY29udGVudCwgcmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZm9ybWF0dGVkIGNvbnRlbnQgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRm9ybWF0dGVkQ29udGVudChmb3JtYXR0ZWQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZywgcmVzdWx0OiBGb3JtYXR0ZXJSZXN1bHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52YWxpZGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSB0aGlzLmRldGVjdEVsZW1lbnRUeXBlKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IHlhbWxUb1ZhbGlkYXRlID0gZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWVxuICAgICAgICA/IGAtLS1cXG4ke2Zvcm1hdHRlZH1cXG4tLS1cXG5gXG4gICAgICAgIDogZm9ybWF0dGVkO1xuXG4gICAgICAvLyBGSVggKElzc3VlICMxMjExKTogTG9jYWwgZmlsZXMgYXJlIHByZS10cnVzdGVkIChzYW1lIGFzIE1lbW9yeU1hbmFnZXIgUFIgIzEyMDcpXG4gICAgICBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKHlhbWxUb1ZhbGlkYXRlLCB7XG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5maXhlZC5wdXNoKCdZQU1MIHZhbGlkYXRpb24gcGFzc2VkJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKGBZQU1MIHZhbGlkYXRpb24gZmFpbGVkOiAke2Vycm9yfWApO1xuICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbGVtZW50Rm9ybWF0dGVyJyxcbiAgICAgICAgZGV0YWlsczogYFlBTUwgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmFja3VwIGlmIHJlcXVlc3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYWNrdXBJZk5lZWRlZChmaWxlUGF0aDogc3RyaW5nLCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmJhY2t1cCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFja3VwUGF0aCA9IGZpbGVQYXRoICsgJy5iYWNrdXAnO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGZpbGVQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICByZXN1bHQuYmFja3VwUGF0aCA9IGJhY2t1cFBhdGg7XG4gICAgcmVzdWx0LmZpeGVkLnB1c2goYENyZWF0ZWQgYmFja3VwIGF0ICR7YmFja3VwUGF0aH1gKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbGVtZW50Rm9ybWF0dGVyJyxcbiAgICAgIGRldGFpbHM6IGBCYWNrdXAgY3JlYXRlZDogJHtiYWNrdXBQYXRofWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBvcmlnaW5hbEZpbGU6IGZpbGVQYXRoLFxuICAgICAgICBiYWNrdXBGaWxlOiBiYWNrdXBQYXRoXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZm9ybWF0dGVkIGNvbnRlbnQgdG8gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUZvcm1hdHRlZEZpbGUoZmlsZVBhdGg6IHN0cmluZywgZm9ybWF0dGVkOiBzdHJpbmcsIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHRoaXMuZ2V0T3V0cHV0UGF0aChmaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dFBhdGgsIGZvcm1hdHRlZCwgJ3V0Zi04Jyk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRWxlbWVudEZvcm1hdHRlcicsXG4gICAgICBkZXRhaWxzOiBgRmlsZSBmb3JtYXR0ZWQgc3VjY2Vzc2Z1bGx5OiAke291dHB1dFBhdGh9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGlucHV0UGF0aDogZmlsZVBhdGgsXG4gICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgIGJhY2t1cDogcmVzdWx0LmJhY2t1cFBhdGggfHwgJ25vbmUnXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGZvcm1hdHRpbmcgZXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUZvcm1hdEVycm9yKGVycm9yOiB1bmtub3duLCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSBlcnJvci5tZXNzYWdlO1xuXG4gICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRU5PRU5UJykpIHtcbiAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKCdGaWxlIG5vdCBmb3VuZCcpO1xuICAgICAgfSBlbHNlIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFQUNDRVMnKSkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goJ1Blcm1pc3Npb24gZGVuaWVkJyk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1BhdGggdHJhdmVyc2FsJykpIHtcbiAgICAgICAgcmVzdWx0Lmlzc3Vlcy5wdXNoKCdTZWN1cml0eTogUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBibG9ja2VkJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZm9ybWF0IGZpbGUnLCB7XG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGVycm9yOiByZXN1bHQuZXJyb3IsXG4gICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lIDogdHlwZW9mIGVycm9yXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IG11bHRpcGxlIGZpbGVzXG4gICAqXG4gICAqIEZJWDogQWRkZWQgcGFyYWxsZWwgcHJvY2Vzc2luZyB3aXRoIGNvbmN1cnJlbmN5IGxpbWl0IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIGFzeW5jIGZvcm1hdEZpbGVzKGZpbGVQYXRoczogc3RyaW5nW10sIGNvbmN1cnJlbmN5TGltaXQgPSA1KTogUHJvbWlzZTxGb3JtYXR0ZXJSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEZvcm1hdHRlclJlc3VsdFtdID0gW107XG5cbiAgICAvLyBQcm9jZXNzIGZpbGVzIGluIGJhdGNoZXMgZm9yIGNvbnRyb2xsZWQgcGFyYWxsZWxpc21cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVQYXRocy5sZW5ndGg7IGkgKz0gY29uY3VycmVuY3lMaW1pdCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBmaWxlUGF0aHMuc2xpY2UoaSwgaSArIGNvbmN1cnJlbmN5TGltaXQpO1xuICAgICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGJhdGNoLm1hcChmaWxlUGF0aCA9PiB0aGlzLmZvcm1hdEZpbGUoZmlsZVBhdGgpKVxuICAgICAgKTtcbiAgICAgIHJlc3VsdHMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhbGwgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlXG4gICAqL1xuICBhc3luYyBmb3JtYXRFbGVtZW50VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIHBvcnRmb2xpb0Rpcjogc3RyaW5nKTogUHJvbWlzZTxGb3JtYXR0ZXJSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEZvcm1hdHRlclJlc3VsdFtdID0gW107XG4gICAgY29uc3QgZWxlbWVudERpciA9IHBhdGguam9pbihwb3J0Zm9saW9EaXIsIGVsZW1lbnRUeXBlKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICAvLyBIYW5kbGUgbWVtb3J5LXNwZWNpZmljIHN0cnVjdHVyZSAoZGF0ZSBmb2xkZXJzKVxuICAgICAgICByZXN1bHRzLnB1c2goLi4uYXdhaXQgdGhpcy5mb3JtYXRNZW1vcnlEaXJlY3RvcnkoZWxlbWVudERpcikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHN0YW5kYXJkIGVsZW1lbnQgc3RydWN0dXJlICgubWQgZmlsZXMgaW4gcm9vdClcbiAgICAgICAgcmVzdWx0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZm9ybWF0U3RhbmRhcmREaXJlY3RvcnkoZWxlbWVudERpcikpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBmb3JtYXQgZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWAsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IG1lbW9yeSBlbGVtZW50cyBpbiBkYXRlIGZvbGRlciBzdHJ1Y3R1cmVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZm9ybWF0TWVtb3J5RGlyZWN0b3J5KG1lbW9yeURpcjogc3RyaW5nKTogUHJvbWlzZTxGb3JtYXR0ZXJSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEZvcm1hdHRlclJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIobWVtb3J5RGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICAgIC8vIFByb2Nlc3Mgcm9vdCAueWFtbCBmaWxlc1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcueWFtbCcpKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obWVtb3J5RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goYXdhaXQgdGhpcy5mb3JtYXRGaWxlKGZpbGVQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBkYXRlIGZvbGRlcnNcbiAgICAgIC8vIFVzZSBSZWdFeHAudGVzdCgpIGRpcmVjdGx5IGFzIHBlciBTb25hckNsb3VkIFM2NTk0XG4gICAgICBjb25zdCBkYXRlUGF0dGVybiA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLztcbiAgICAgIGNvbnN0IGRhdGVGb2xkZXJzID0gZW50cmllcy5maWx0ZXIoZSA9PlxuICAgICAgICBlLmlzRGlyZWN0b3J5KCkgJiYgZGF0ZVBhdHRlcm4udGVzdChlLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBkYXRlRm9sZGVycykge1xuICAgICAgICBjb25zdCBmb2xkZXJQYXRoID0gcGF0aC5qb2luKG1lbW9yeURpciwgZm9sZGVyLm5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZm9sZGVyUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgZmlsZSk7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGF3YWl0IHRoaXMuZm9ybWF0RmlsZShmaWxlUGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGZvcm1hdCBtZW1vcnkgZGlyZWN0b3J5JywgeyBtZW1vcnlEaXIsIGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBzdGFuZGFyZCBlbGVtZW50cyAoLm1kIGZpbGVzKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmb3JtYXRTdGFuZGFyZERpcmVjdG9yeShlbGVtZW50RGlyOiBzdHJpbmcpOiBQcm9taXNlPEZvcm1hdHRlclJlc3VsdFtdPiB7XG4gICAgY29uc3QgcmVzdWx0czogRm9ybWF0dGVyUmVzdWx0W10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZWxlbWVudERpcik7XG4gICAgICBjb25zdCBtZEZpbGVzID0gZmlsZXMuZmlsdGVyKGYgPT4gZi5lbmRzV2l0aCgnLm1kJykpO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbWRGaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihlbGVtZW50RGlyLCBmaWxlKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGF3YWl0IHRoaXMuZm9ybWF0RmlsZShmaWxlUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBmb3JtYXQgc3RhbmRhcmQgZGlyZWN0b3J5JywgeyBlbGVtZW50RGlyLCBlcnJvciB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBtZW1vcnkgWUFNTCBmaWxlXG4gICAqIFJlZmFjdG9yZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZvcm1hdE1lbW9yeShjb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcsIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZW1vcnlDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICAvLyBQcm9jZXNzIGVudHJpZXMgaWYgdGhleSBleGlzdFxuICAgICAgaWYgKGRhdGEuZW50cmllcyAmJiBBcnJheS5pc0FycmF5KGRhdGEuZW50cmllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzTWVtb3J5RW50cmllcyhkYXRhLmVudHJpZXMsIGRhdGEsIHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBwcm9wZXIgc3RydWN0dXJlXG4gICAgICB0aGlzLmVuc3VyZU1lbW9yeVN0cnVjdHVyZShkYXRhLCBmaWxlUGF0aCwgcmVzdWx0KTtcblxuICAgICAgLy8gRm9ybWF0IGFzIGNsZWFuIFlBTUxcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdEFzWWFtbChkYXRhKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXN1bHQuaXNzdWVzLnB1c2goYEZhaWxlZCB0byBwYXJzZSBZQU1MOiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7IC8vIFJldHVybiBvcmlnaW5hbCBjb250ZW50IGlmIHdlIGNhbid0IHBhcnNlIGl0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1lbW9yeSBjb250ZW50IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyc2VNZW1vcnlDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgd3JhcHBlZENvbnRlbnQgPSBgLS0tXFxuJHtjb250ZW50fVxcbi0tLVxcbmA7XG4gICAgLy8gRklYIChJc3N1ZSAjMTIxMSk6IExvY2FsIGZpbGVzIGFyZSBwcmUtdHJ1c3RlZCAoc2FtZSBhcyBNZW1vcnlNYW5hZ2VyIFBSICMxMjA3KVxuICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2Uod3JhcHBlZENvbnRlbnQsIHtcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyc2VkLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBtZW1vcnkgZW50cmllcyB0byBmaXggaXNzdWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNZW1vcnlFbnRyaWVzKGVudHJpZXM6IGFueVtdLCBkYXRhOiBhbnksIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5LmNvbnRlbnQgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcblxuICAgICAgLy8gTm9ybWFsaXplIFVuaWNvZGVcbiAgICAgIGVudHJ5LmNvbnRlbnQgPSB0aGlzLm5vcm1hbGl6ZVVuaWNvZGUoZW50cnkuY29udGVudCk7XG5cbiAgICAgIC8vIEhhbmRsZSBlbWJlZGRlZCBtZXRhZGF0YVxuICAgICAgaWYgKHRoaXMuaGFzRW1iZWRkZWRNZXRhZGF0YShlbnRyeS5jb250ZW50KSkge1xuICAgICAgICB0aGlzLmhhbmRsZUVtYmVkZGVkTWV0YWRhdGEoZW50cnksIGRhdGEsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZXNjYXBlRW50cnlDb250ZW50KGVudHJ5LCByZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb250ZW50IGhhcyBlbWJlZGRlZCBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNFbWJlZGRlZE1ldGFkYXRhKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBib3RoIGFjdHVhbCBuZXdsaW5lcyBhbmQgZXNjYXBlZCBuZXdsaW5lc1xuICAgIC8vIFVzaW5nIFN0cmluZy5yYXcgdG8gcHJvcGVybHkgaGFuZGxlIGVzY2FwZSBzZXF1ZW5jZXMgKFNvbmFyQ2xvdWQgY29tcGxpYW5jZSlcbiAgICBjb25zdCBhY3R1YWxOZXdsaW5lID0gJy0tLVxcbic7XG4gICAgY29uc3QgZXNjYXBlZE5ld2xpbmUgPSBTdHJpbmcucmF3YC0tLVxcbmA7ICAvLyBUaGlzIHJlcHJlc2VudHMgdGhlIGxpdGVyYWwgc3RyaW5nIFwiLS0tXFxuXCJcblxuICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKGFjdHVhbE5ld2xpbmUpIHx8XG4gICAgICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoZXNjYXBlZE5ld2xpbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBlbWJlZGRlZCBtZXRhZGF0YSBleHRyYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUVtYmVkZGVkTWV0YWRhdGEoZW50cnk6IGFueSwgZGF0YTogYW55LCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCk6IHZvaWQge1xuICAgIHJlc3VsdC5pc3N1ZXMucHVzaCgnRm91bmQgZW1iZWRkZWQgbWV0YWRhdGEgaW4gY29udGVudCcpO1xuXG4gICAgLy8gRmlyc3QgdW5lc2NhcGUgdGhlIGNvbnRlbnQgdG8gbWFrZSBpdCBwYXJzZWFibGVcbiAgICBjb25zdCB1bmVzY2FwZWRDb250ZW50ID0gdGhpcy51bmVzY2FwZU5ld2xpbmVzKGVudHJ5LmNvbnRlbnQpO1xuXG4gICAgLy8gVGhlbiB0cnkgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIHRoZSB1bmVzY2FwZWQgY29udGVudFxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IHRoaXMuZXh0cmFjdEVtYmVkZGVkTWV0YWRhdGEodW5lc2NhcGVkQ29udGVudCk7XG5cbiAgICBpZiAoZXh0cmFjdGVkLm1ldGFkYXRhKSB7XG4gICAgICAvLyBNZXJnZSBleHRyYWN0ZWQgbWV0YWRhdGEgdG8gdG9wIGxldmVsXG4gICAgICBPYmplY3QuYXNzaWduKGRhdGEsIGV4dHJhY3RlZC5tZXRhZGF0YSk7XG4gICAgICAvLyBVcGRhdGUgZW50cnkgd2l0aCBjbGVhbiBjb250ZW50XG4gICAgICBlbnRyeS5jb250ZW50ID0gZXh0cmFjdGVkLmNvbnRlbnQ7XG4gICAgICByZXN1bHQuZml4ZWQucHVzaCgnRXh0cmFjdGVkIGVtYmVkZGVkIG1ldGFkYXRhIHRvIHRvcCBsZXZlbCcsICdVbmVzY2FwZWQgbmV3bGluZXMgaW4gY29udGVudCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKdXN0IHVuZXNjYXBlIGlmIG5vIG1ldGFkYXRhIGZvdW5kXG4gICAgICBlbnRyeS5jb250ZW50ID0gdW5lc2NhcGVkQ29udGVudDtcbiAgICAgIHJlc3VsdC5maXhlZC5wdXNoKCdVbmVzY2FwZWQgbmV3bGluZXMgaW4gY29udGVudCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmVzY2FwZSBlbnRyeSBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHVuZXNjYXBlRW50cnlDb250ZW50KGVudHJ5OiBhbnksIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBlbnRyeS5jb250ZW50O1xuICAgIGVudHJ5LmNvbnRlbnQgPSB0aGlzLnVuZXNjYXBlTmV3bGluZXMoZW50cnkuY29udGVudCk7XG4gICAgaWYgKG9yaWdpbmFsICE9PSBlbnRyeS5jb250ZW50KSB7XG4gICAgICByZXN1bHQuZml4ZWQucHVzaCgnVW5lc2NhcGVkIG5ld2xpbmVzIGluIGNvbnRlbnQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIG1lbW9yeSBoYXMgcHJvcGVyIHN0cnVjdHVyZVxuICAgKiBGSVggKElzc3VlICMxMjExKTogRGVyaXZlIG5hbWUgZnJvbSBmaWxlbmFtZSBpbnN0ZWFkIG9mIGF1dG8tZ2VuZXJhdGVkIGVudHJ5IElEXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZU1lbW9yeVN0cnVjdHVyZShkYXRhOiBhbnksIGZpbGVQYXRoOiBzdHJpbmcsIHJlc3VsdDogRm9ybWF0dGVyUmVzdWx0KTogdm9pZCB7XG4gICAgaWYgKCFkYXRhLm5hbWUpIHtcbiAgICAgIC8vIERlcml2ZSBuYW1lIGZyb20gZmlsZW5hbWUsIHJlbW92aW5nIGV4dGVuc2lvbiBhbmQgbm9ybWFsaXppbmdcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgcGF0aC5leHRuYW1lKGZpbGVQYXRoKSk7XG4gICAgICBkYXRhLm5hbWUgPSBmaWxlbmFtZTtcbiAgICAgIHJlc3VsdC5maXhlZC5wdXNoKGBBZGRlZCBuYW1lIGZpZWxkIGZyb20gZmlsZW5hbWU6ICR7ZmlsZW5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRhIGFzIGNsZWFuIFlBTUxcbiAgICogRklYOiBJbXByb3ZlZCBZQU1MIGZvcm1hdHRpbmcgZm9yIGNvbnNpc3RlbmN5IGFuZCBzcGVjaWFsIGNoYXJhY3RlciBoYW5kbGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRBc1lhbWwoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4geWFtbC5kdW1wKGRhdGEsIHtcbiAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IGZhbHNlLFxuICAgICAgcXVvdGluZ1R5cGU6ICdcIicsXG4gICAgICBmb3JjZVF1b3RlczogZmFsc2UsXG4gICAgICAvLyBVc2UgYmxvY2sgc2NhbGFyIHN0eWxlIGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgbmV3bGluZXNcbiAgICAgIC8vIFRoaXMgcHJlc2VydmVzIGZvcm1hdHRpbmcgd2hpbGUga2VlcGluZyB0YWJzL3JldHVybnMgcmVhZGFibGVcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFzdHInOiAoc3RyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAvLyBVc2UgYmxvY2sgc2NhbGFyIGZvciBtdWx0aWxpbmUgc3RyaW5nc1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xpdGVyYWwnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVc2UgZGVmYXVsdCAocXVvdGVkKSBmb3Igb3RoZXIgc3RyaW5ncywgaW5jbHVkaW5nIHRob3NlIHdpdGggdGFicy9yZXR1cm5zXG4gICAgICAgICAgcmV0dXJuICdwbGFpbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBzdGFuZGFyZCBlbGVtZW50IChtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmb3JtYXRTdGFuZGFyZEVsZW1lbnQoY29udGVudDogc3RyaW5nLCByZXN1bHQ6IEZvcm1hdHRlclJlc3VsdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNwbGl0IGZyb250bWF0dGVyIGFuZCBjb250ZW50IHVzaW5nIFJlZ0V4cC5leGVjKCkgYXMgcGVyIFNvbmFyQ2xvdWQgUzY1OTRcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLVxcbihbXFxzXFxTXSopJC87XG4gICAgICBjb25zdCBtYXRjaCA9IGZyb250bWF0dGVyUmVnZXguZXhlYyhjb250ZW50KTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXN1bHQuaXNzdWVzLnB1c2goJ05vIGZyb250bWF0dGVyIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCBmcm9udG1hdHRlclN0ciwgYm9keV0gPSBtYXRjaDtcblxuICAgICAgLy8gRklYOiBISUdIIC0gVXNlIFNlY3VyZVlhbWxQYXJzZXIgZm9yIGZyb250bWF0dGVyXG4gICAgICAvLyBGSVggKElzc3VlICMxMjExKTogTG9jYWwgZmlsZXMgYXJlIHByZS10cnVzdGVkIChzYW1lIGFzIE1lbW9yeU1hbmFnZXIgUFIgIzEyMDcpXG4gICAgICBjb25zdCB0ZW1wRG9jID0gYC0tLVxcbiR7ZnJvbnRtYXR0ZXJTdHJ9XFxuLS0tXFxuYDtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UodGVtcERvYywge1xuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBwYXJzZWQuZGF0YSBhcyBhbnk7XG5cbiAgICAgIC8vIENsZWFuIGZyb250bWF0dGVyXG4gICAgICBpZiAoZnJvbnRtYXR0ZXIuY29udGVudCAmJiB0eXBlb2YgZnJvbnRtYXR0ZXIuY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZnJvbnRtYXR0ZXIuY29udGVudCA9IHRoaXMudW5lc2NhcGVOZXdsaW5lcyhmcm9udG1hdHRlci5jb250ZW50KTtcbiAgICAgICAgcmVzdWx0LmZpeGVkLnB1c2goJ1VuZXNjYXBlZCBuZXdsaW5lcyBpbiBmcm9udG1hdHRlciBjb250ZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIGJvZHlcbiAgICAgIGNvbnN0IGNsZWFuQm9keSA9IHRoaXMudW5lc2NhcGVOZXdsaW5lcyhib2R5KTtcbiAgICAgIGlmIChib2R5ICE9PSBjbGVhbkJvZHkpIHtcbiAgICAgICAgcmVzdWx0LmZpeGVkLnB1c2goJ1VuZXNjYXBlZCBuZXdsaW5lcyBpbiBib2R5Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IHdpdGggY2xlYW4gWUFNTFxuICAgICAgY29uc3QgY2xlYW5Gcm9udG1hdHRlciA9IHlhbWwuZHVtcChmcm9udG1hdHRlciwge1xuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYC0tLVxcbiR7Y2xlYW5Gcm9udG1hdHRlcn0tLS1cXG4ke2NsZWFuQm9keX1gO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlc3VsdC5pc3N1ZXMucHVzaChgRmFpbGVkIHRvIHBhcnNlIGVsZW1lbnQ6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBlbWJlZGRlZCBtZXRhZGF0YSBmcm9tIGNvbnRlbnQgc3RyaW5nXG4gICAqXG4gICAqIEZJWDogU2VjdXJpdHkgaG90c3BvdCAtIFJlcGxhY2VkIHJlZ2V4IHZ1bG5lcmFibGUgdG8gY2F0YXN0cm9waGljIGJhY2t0cmFja2luZ1xuICAgKiB3aXRoIGEgbGluZWFyLXRpbWUgc3RyaW5nIHBhcnNpbmcgYXBwcm9hY2ggdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbWJlZGRlZE1ldGFkYXRhKGNvbnRlbnQ6IHN0cmluZyk6IHsgbWV0YWRhdGE6IGFueTsgY29udGVudDogc3RyaW5nIH0ge1xuICAgIC8vIENvbnRlbnQgc2hvdWxkIGFscmVhZHkgYmUgdW5lc2NhcGVkIGJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlXG4gICAgY29uc3QgdW5lc2NhcGVkID0gY29udGVudDtcblxuICAgIC8vIFVzZSBpbmRleE9mIGZvciBsaW5lYXItdGltZSBwYXJzaW5nIGluc3RlYWQgb2YgcmVnZXggdG8gcHJldmVudCBSZURvU1xuICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gJy0tLSc7XG4gICAgY29uc3QgZW5kTWFya2VyID0gJ1xcbi0tLVxcbic7XG5cbiAgICAvLyBUcnkgdG8gZmluZCB0aGUgc3RhcnQgbWFya2VyIGFueXdoZXJlIGluIHRoZSBjb250ZW50XG4gICAgY29uc3QgdHJpbW1lZCA9IHVuZXNjYXBlZC50cmltKCk7XG4gICAgY29uc3Qgc3RhcnRJZHggPSB0cmltbWVkLmluZGV4T2Yoc3RhcnRNYXJrZXIpO1xuXG4gICAgaWYgKHN0YXJ0SWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIHsgbWV0YWRhdGE6IG51bGwsIGNvbnRlbnQgfTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBzdGFydGluZyBwb3NpdGlvbiBhZnRlciBmaXJzdCBtYXJrZXJcbiAgICBjb25zdCBzdGFydFBvcyA9IHN0YXJ0SWR4ICsgc3RhcnRNYXJrZXIubGVuZ3RoO1xuXG4gICAgLy8gTG9vayBmb3IgdGhlIGVuZCBtYXJrZXJcbiAgICBjb25zdCBlbmRQb3MgPSB0cmltbWVkLmluZGV4T2YoZW5kTWFya2VyLCBzdGFydFBvcyk7XG5cbiAgICBpZiAoZW5kUG9zID09PSAtMSkge1xuICAgICAgLy8gVHJ5IGFsdGVybmF0aXZlIGVuZCBtYXJrZXIgZm9yIGVkZ2UgY2FzZXNcbiAgICAgIGNvbnN0IGFsdEVuZE1hcmtlciA9ICctLS1cXG4nO1xuICAgICAgY29uc3QgYWx0RW5kUG9zID0gdHJpbW1lZC5pbmRleE9mKGFsdEVuZE1hcmtlciwgc3RhcnRQb3MgKyAxKTtcbiAgICAgIGlmIChhbHRFbmRQb3MgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7IG1ldGFkYXRhOiBudWxsLCBjb250ZW50IH07XG4gICAgICB9XG4gICAgICAvLyBVc2UgYWx0ZXJuYXRpdmUgZW5kIHBvc2l0aW9uXG4gICAgICBjb25zdCBtZXRhZGF0YVN0ciA9IHRyaW1tZWQuc2xpY2Uoc3RhcnRQb3MsIGFsdEVuZFBvcykudHJpbSgpO1xuICAgICAgY29uc3QgY2xlYW5Db250ZW50ID0gdHJpbW1lZC5zbGljZShhbHRFbmRQb3MgKyBhbHRFbmRNYXJrZXIubGVuZ3RoKS50cmltKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEZJWCAoSXNzdWUgIzEyMTEpOiBMb2NhbCBmaWxlcyBhcmUgcHJlLXRydXN0ZWQgKHNhbWUgYXMgTWVtb3J5TWFuYWdlciBQUiAjMTIwNylcbiAgICAgICAgY29uc3QgdGVtcERvYyA9IGAtLS1cXG4ke21ldGFkYXRhU3RyfVxcbi0tLVxcbmA7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UodGVtcERvYywge1xuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBtZXRhZGF0YTogcGFyc2VkLmRhdGEsIGNvbnRlbnQ6IGNsZWFuQ29udGVudCB9O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IG1ldGFkYXRhOiBudWxsLCBjb250ZW50IH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBtZXRhZGF0YSBhbmQgY29udGVudCBzZWN0aW9uc1xuICAgIGNvbnN0IG1ldGFkYXRhU3RyID0gdW5lc2NhcGVkLnNsaWNlKHN0YXJ0UG9zLCBlbmRQb3MpLnRyaW0oKTtcbiAgICBjb25zdCBjbGVhbkNvbnRlbnQgPSB1bmVzY2FwZWQuc2xpY2UoZW5kUG9zICsgZW5kTWFya2VyLmxlbmd0aCkudHJpbSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogSElHSCAtIFVzZSBTZWN1cmVZYW1sUGFyc2VyIGZvciBtZXRhZGF0YSBleHRyYWN0aW9uXG4gICAgICAvLyBGSVggKElzc3VlICMxMjExKTogTG9jYWwgZmlsZXMgYXJlIHByZS10cnVzdGVkIChzYW1lIGFzIE1lbW9yeU1hbmFnZXIgUFIgIzEyMDcpXG4gICAgICBjb25zdCB0ZW1wRG9jID0gYC0tLVxcbiR7bWV0YWRhdGFTdHJ9XFxuLS0tXFxuYDtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UodGVtcERvYywge1xuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YTtcblxuICAgICAgcmV0dXJuIHsgbWV0YWRhdGEsIGNvbnRlbnQ6IGNsZWFuQ29udGVudCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgWUFNTCBwYXJzaW5nIGZhaWxzLCByZXR1cm4gYXMtaXNcbiAgICAgIHJldHVybiB7IG1ldGFkYXRhOiBudWxsLCBjb250ZW50IH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZXNjYXBlIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgKiBVc2luZyByZXBsYWNlQWxsIGFzIHBlciBTb25hckNsb3VkIFM3NzgxXG4gICAqIFVzaW5nIGNoYXJhY3RlciBtYXAgdG8gYXZvaWQgZXNjYXBlIHNlcXVlbmNlIGlzc3Vlc1xuICAgKi9cbiAgcHJpdmF0ZSB1bmVzY2FwZU5ld2xpbmVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gTWFwIG9mIGVzY2FwZSBzZXF1ZW5jZXMgdG8gdGhlaXIgYWN0dWFsIGNoYXJhY3RlcnNcbiAgICAvLyBUaGlzIGF2b2lkcyBTb25hckNsb3VkJ3MgU3RyaW5nLnJhdyB3YXJuaW5nc1xuICAgIGNvbnN0IGVzY2FwZU1hcDogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICBbU3RyaW5nLnJhd2BcXG5gLCAnXFxuJ10sICAvLyBOZXdsaW5lXG4gICAgICBbU3RyaW5nLnJhd2BcXHJgLCAnXFxyJ10sICAvLyBDYXJyaWFnZSByZXR1cm5cbiAgICAgIFtTdHJpbmcucmF3YFxcdGAsICdcXHQnXSwgIC8vIFRhYlxuICAgICAgW1N0cmluZy5yYXdgXFxcXGAsICdcXFxcJ10gICAvLyBCYWNrc2xhc2ggKG11c3QgYmUgbGFzdCB0byBhdm9pZCBkb3VibGUtdW5lc2NhcGluZylcbiAgICBdO1xuXG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBbZXNjYXBlZCwgYWN0dWFsXSBvZiBlc2NhcGVNYXApIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKGVzY2FwZWQsIGFjdHVhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IGVsZW1lbnQgdHlwZSBmcm9tIGZpbGUgcGF0aFxuICAgKiBFbmhhbmNlZCB3aXRoIG1vcmUgZXhwbGljaXQgYW5kIHJvYnVzdCBwYXRoIG1hdGNoaW5nXG4gICAqL1xuICBwcml2YXRlIGRldGVjdEVsZW1lbnRUeXBlKGZpbGVQYXRoOiBzdHJpbmcpOiBFbGVtZW50VHlwZSB7XG4gICAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gZmlsZVBhdGgucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG5cbiAgICAvLyBNYXAgb2YgZWxlbWVudCB0eXBlIGRpcmVjdG9yeSBuYW1lcyB0byBFbGVtZW50VHlwZSBlbnVtIHZhbHVlc1xuICAgIC8vIE1vcmUgZXhwbGljaXQgdGhhbiBpdGVyYXRpbmcgdGhyb3VnaCBlbnVtIHZhbHVlc1xuICAgIGNvbnN0IGVsZW1lbnRUeXBlTWFwOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50VHlwZT4gPSB7XG4gICAgICAncGVyc29uYXMnOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgJ3NraWxscyc6IEVsZW1lbnRUeXBlLlNLSUxMLFxuICAgICAgJ3RlbXBsYXRlcyc6IEVsZW1lbnRUeXBlLlRFTVBMQVRFLFxuICAgICAgJ2FnZW50cyc6IEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgJ21lbW9yaWVzJzogRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgJ2Vuc2VtYmxlcyc6IEVsZW1lbnRUeXBlLkVOU0VNQkxFXG4gICAgfTtcblxuICAgIC8vIFNwbGl0IGludG8gcGF0aCBzZWdtZW50cyBmb3IgYWNjdXJhdGUgbWF0Y2hpbmdcbiAgICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHMgPT4gcy5sZW5ndGggPiAwKTtcblxuICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgdHlwZSBieSBjaGVja2luZyBlYWNoIHNlZ21lbnQgYWdhaW5zdCBvdXIgZXhwbGljaXQgbWFwXG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlTWFwW3NlZ21lbnQudG9Mb3dlckNhc2UoKV07XG4gICAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBVc2UgZmlsZSBleHRlbnNpb24gYXMgYSBoaW50XG4gICAgLy8gLnlhbWwgZmlsZXMgYXJlIHR5cGljYWxseSBtZW1vcmllcywgLm1kIGZpbGVzIGFyZSBzdGFuZGFyZCBlbGVtZW50c1xuICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnLnlhbWwnKSB8fCBmaWxlUGF0aC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICByZXR1cm4gRWxlbWVudFR5cGUuTUVNT1JZO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gUEVSU09OQSBmb3IgLm1kIGZpbGVzIG9yIHVua25vd24gdHlwZXNcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuUEVSU09OQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3V0cHV0IHBhdGggZm9yIGZvcm1hdHRlZCBmaWxlXG4gICAqXG4gICAqIEZJWDogQWRkZWQgcGF0aCB0cmF2ZXJzYWwgcHJvdGVjdGlvbiB0byBwcmV2ZW50IGRpcmVjdG9yeSBlc2NhcGUgYXR0YWNrc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRPdXRwdXRQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaW5QbGFjZSkge1xuICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3V0cHV0RGlyKSB7XG4gICAgICAvLyBTZWN1cml0eTogVmFsaWRhdGUgb3V0cHV0IGRpcmVjdG9yeSB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsXG4gICAgICAvLyBGSVg6IE1FRElVTSAtIE5vcm1hbGl6ZSBVbmljb2RlIGluIGZpbGVuYW1lXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMubm9ybWFsaXplVW5pY29kZShwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSk7XG4gICAgICBjb25zdCBzYWZlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLm9wdGlvbnMub3V0cHV0RGlyLCBmaWxlbmFtZSk7XG4gICAgICBjb25zdCBleHBlY3RlZERpciA9IHBhdGgucmVzb2x2ZSh0aGlzLm9wdGlvbnMub3V0cHV0RGlyKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSByZXNvbHZlZCBwYXRoIGlzIHdpdGhpbiB0aGUgZXhwZWN0ZWQgZGlyZWN0b3J5XG4gICAgICBpZiAoIXNhZmVQYXRoLnN0YXJ0c1dpdGgoZXhwZWN0ZWREaXIpKSB7XG4gICAgICAgIC8vIEZJWDogTE9XIC0gVXNlIFNlY3VyaXR5TW9uaXRvciBmb3IgYXVkaXQgbG9nZ2luZ1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnRWxlbWVudEZvcm1hdHRlcicsXG4gICAgICAgICAgZGV0YWlsczogYFBhdGggdHJhdmVyc2FsIGJsb2NrZWQ6ICR7ZmlsZW5hbWV9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgYXR0ZW1wdGVkUGF0aDogZmlsZW5hbWUsXG4gICAgICAgICAgICBleHBlY3RlZERpcixcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aDogc2FmZVBhdGhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQ6ICR7ZmlsZW5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzYWZlUGF0aDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBhZGQgLmZvcm1hdHRlZCBiZWZvcmUgZXh0ZW5zaW9uXG4gICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCBleHQpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oZGlyLCBgJHtiYXNlfS5mb3JtYXR0ZWQke2V4dH1gKTtcbiAgfVxufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "1.9.13",
3
+ "version": "1.9.14",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",