@workflow/core 5.0.0-beta.51 → 5.0.0-beta.53

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.
@@ -13,9 +13,11 @@ const DEFAULT_HEALTH_CHECK_TIMEOUT = 30_000;
13
13
  /**
14
14
  * Pattern for safe workflow names. Only allows alphanumeric characters,
15
15
  * underscores, hyphens, dots, forward slashes (for namespaced workflows),
16
- * and at signs (for scoped packages).
16
+ * at signs (for scoped packages), and parentheses and square brackets (for
17
+ * Next.js route groups and dynamic segments, which appear verbatim in the
18
+ * module path a workflow name is derived from).
17
19
  */
18
- const SAFE_WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9_\-./@]+$/;
20
+ const SAFE_WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9_\-./@()[\]]+$/;
19
21
  /**
20
22
  * Validates a workflow name and returns the corresponding queue name.
21
23
  * Ensures the workflow name only contains safe characters before
@@ -23,7 +25,7 @@ const SAFE_WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9_\-./@]+$/;
23
25
  */
24
26
  export function getWorkflowQueueName(workflowName, namespace) {
25
27
  if (!SAFE_WORKFLOW_NAME_PATTERN.test(workflowName)) {
26
- throw new Error(`Invalid workflow name "${workflowName}": must only contain alphanumeric characters, underscores, hyphens, dots, forward slashes, or at signs`);
28
+ throw new Error(`Invalid workflow name "${workflowName}": must only contain alphanumeric characters, underscores, hyphens, dots, forward slashes, at signs, parentheses, or square brackets`);
27
29
  }
28
30
  const prefix = getQueueTopicPrefix('workflow', resolveQueueNamespace(namespace));
29
31
  return `${prefix}${workflowName}`;
@@ -1022,4 +1024,4 @@ export function memoizeEncryptionKey(world, runOrId) {
1022
1024
  return cached;
1023
1025
  };
1024
1026
  }
1025
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFZMUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsd0RBQXdEO0FBQ3hELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFlBQW9CLEVBQ3BCLFNBQWtCO0lBRWxCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsWUFB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O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQVksRUFDWixPQUE2QjtJQUU3QixJQUFJLE1BQW1ELENBQUM7SUFDeEQsT0FBTyxHQUFHLEVBQUU7UUFDVixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlRXZlbnRQYXJhbXMsXG4gIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIZWFsdGhDaGVja1BheWxvYWQsXG4gIFJ1bkRpc3BhdGNoQ29udGV4dCxcbiAgVmFsaWRRdWV1ZU5hbWUsXG4gIFdvcmtmbG93UnVuLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEZJUlNUX0VWRU5UX1NMT1QsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIEhlYWx0aENoZWNrUGF5bG9hZFNjaGVtYSxcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICByZXF1aXJlRXZlbnRTbG90LFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0LCBkZXJpdmVSdW5LZXlQYWlyIH0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRTcGFuS2luZCwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcblxuLyoqIERlZmF1bHQgdGltZW91dCBmb3IgaGVhbHRoIGNoZWNrcyBpbiBtaWxsaXNlY29uZHMgKi9cbmNvbnN0IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQgPSAzMF8wMDA7XG5cbi8qKlxuICogUGF0dGVybiBmb3Igc2FmZSB3b3JrZmxvdyBuYW1lcy4gT25seSBhbGxvd3MgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsXG4gKiB1bmRlcnNjb3JlcywgaHlwaGVucywgZG90cywgZm9yd2FyZCBzbGFzaGVzIChmb3IgbmFtZXNwYWNlZCB3b3JrZmxvd3MpLFxuICogYW5kIGF0IHNpZ25zIChmb3Igc2NvcGVkIHBhY2thZ2VzKS5cbiAqL1xuY29uc3QgU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4gPSAvXlthLXpBLVowLTlfXFwtLi9AXSskLztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB3b3JrZmxvdyBuYW1lIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXVlIG5hbWUuXG4gKiBFbnN1cmVzIHRoZSB3b3JrZmxvdyBuYW1lIG9ubHkgY29udGFpbnMgc2FmZSBjaGFyYWN0ZXJzIGJlZm9yZVxuICogaW50ZXJwb2xhdGluZyBpdCBpbnRvIHRoZSBxdWV1ZSBuYW1lIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UXVldWVOYW1lKFxuICB3b3JrZmxvd05hbWU6IHN0cmluZyxcbiAgbmFtZXNwYWNlPzogc3RyaW5nXG4pOiBWYWxpZFF1ZXVlTmFtZSB7XG4gIGlmICghU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4udGVzdCh3b3JrZmxvd05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgd29ya2Zsb3cgbmFtZSBcIiR7d29ya2Zsb3dOYW1lfVwiOiBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcywgb3IgYXQgc2lnbnNgXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KFxuICAgICd3b3JrZmxvdycsXG4gICAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgKTtcbiAgcmV0dXJuIGAke3ByZWZpeH0ke3dvcmtmbG93TmFtZX1gIGFzIFZhbGlkUXVldWVOYW1lO1xufVxuXG5jb25zdCBnZW5lcmF0ZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmVhbSBuYW1lIGZvciBhIGhlYWx0aCBjaGVjayB3aXRoIHRoZSBnaXZlbiBjb3JyZWxhdGlvbiBJRC5cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgX19oZWFsdGhfY2hlY2tfXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIGhlYWx0aCBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tSZXN1bHQge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSBpZiBoZWFsdGggY2hlY2sgZmFpbGVkICovXG4gIGVycm9yPzogc3RyaW5nO1xuICAvKiogTGF0ZW5jeSBpZiB0aGUgaGVhbHRoIGNoZWNrIHdhcyBzdWNjZXNzZnVsICovXG4gIGxhdGVuY3lNcz86IG51bWJlcjtcbiAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50ICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQsIHVzZWQgZm9yXG4gICAqIGNhcGFiaWxpdHkgZGV0ZWN0aW9uIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2ApLiBPbWl0dGVkIHdoZW4gdGhlXG4gICAqIHJlc3BvbmRpbmcgZGVwbG95bWVudCBkaWQgbm90IHByb3ZpZGUgdGhlIGZpZWxkIGFzIGEgc3RyaW5nOlxuICAgKiBmb3IgZXhhbXBsZSwgYW4gb2xkZXIgYEB3b3JrZmxvdy9jb3JlYCB0aGF0IHByZWRhdGVzIHRoaXMgZmllbGQsXG4gICAqIG9yIGEgbm9uLUpTT04gcGxhaW4tdGV4dCBoZWFsdGggcmVzcG9uc2UuXG4gICAqL1xuICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRhcmdldCBydW4ncyBYMjU1MTkgcHVibGljIGtleSAoYmFzZTY0KSwgcmV0dXJuZWQgb25seSB3aGVuIHRoZSBwcm9iZVxuICAgKiBjYXJyaWVkIGEgYHJ1bklkYCBhbmQgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCBoYXMgZW5jcnlwdGlvbiBlbmFibGVkLlxuICAgKlxuICAgKiBMZXRzIGEgY3Jvc3MtZGVwbG95bWVudCBgc3RhcnQoKWAgc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHVzaW5nIGFcbiAgICogcmVzcG9uc2UgaXQgd2FzIGFscmVhZHkgd2FpdGluZyBvbiwgaW5zdGVhZCBvZiBtYWtpbmcgYSBzZXBhcmF0ZVxuICAgKiBrZXktbG9va3VwIHJlcXVlc3QuXG4gICAqL1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCdzIGBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OYDogdGhlIHByb3RvY29sXG4gICAqIHZlcnNpb24gYXQgd2hpY2ggdGhlICpjb25zdW1lciogKHF1ZXVlLW1lc3NhZ2UgdGFyZ2V0KSBtYXRlcmlhbGl6ZXMgdGhlXG4gICAqIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQSBjcm9zcy1kZXBsb3ltZW50XG4gICAqIGBzdGFydCgpYCBzdGFtcHMgdGhlICp0YXJnZXQncyogdmFsdWUgKG5vdCB0aGUgY2FsbGVyJ3MpIGludG8gdGhlIG5ld1xuICAgKiBydW4ncyBgZXhlY3V0aW9uQ29udGV4dC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uYC4gQ3VycmVudCBwcm9kdWNlcnMgd3JpdGVcbiAgICogdGhlIGV2ZW50IGR1cmFibHkgYmVmb3JlIHB1Ymxpc2hpbmcgdGhlIHdha2UgYW5kIGRvIG5vdCByZWFkIHRoZSBtYXJrZXI7XG4gICAqIE9MREVSIHByb2R1Y2VycyBzdGlsbCBnYXRlIHRoZWlyIGxhenkgcGF0aCBvbiBpdCwgc28gaXQga2VlcHMgYmVpbmdcbiAgICogc3RhbXBlZC4gT21pdHRlZCB3aGVuIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgcHJlZGF0ZXMgdGhpcyBmaWVsZCxcbiAgICogd2hpY2ggZmFpbHMgdGhhdCBnYXRlIGNsb3NlZC5cbiAgICovXG4gIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgaGVhbHRoIGNoZWNrIHBheWxvYWQuXG4gKiBJZiBzbywgcmV0dXJucyB0aGUgcGFyc2VkIHBheWxvYWQuIE90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKFxuICBtZXNzYWdlOiB1bmtub3duXG4pOiBIZWFsdGhDaGVja1BheWxvYWQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQgPSBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEuc2FmZVBhcnNlKG1lc3NhZ2UpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZm9yIGhlYWx0aCBjaGVjayBzdHJlYW1zLlxuICogQm90aCB0aGUgd3JpdGVyIChoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UpIGFuZCByZWFkZXIgKGhlYWx0aENoZWNrKSBkZXJpdmVcbiAqIHRoZSBzYW1lIHJ1bklkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzY29wZVxuICogc3RyZWFtIHJlYWRzIGJ5IHJ1bklkIHN0aWxsIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB3cnVuX2hjXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZSBieSB3cml0aW5nIHRoZSByZXN1bHQgdG8gdGhlIHdvcmxkJ3Mgc3RyZWFtLlxuICogVGhlIGNhbGxlciBjYW4gbGlzdGVuIHRvIHRoaXMgc3RyZWFtIHRvIGdldCB0aGUgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBoZWFsdGhDaGVjayAtIFRoZSBwYXJzZWQgaGVhbHRoIGNoZWNrIHBheWxvYWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgaGVhbHRoQ2hlY2s6IEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG5cbiAgLy8gV2hlbiB0aGUgcHJvYmUgbmFtZXMgYSBydW4gdGhlIGNhbGxlciBpcyBhYm91dCB0byBjcmVhdGUsIHB1Ymxpc2ggdGhhdFxuICAvLyBydW4ncyBwdWJsaWMga2V5LiBXZSBhcmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIGl0c1xuICAvLyBrZXkgbWF0ZXJpYWwgaXMgYXZhaWxhYmxlIGxvY2FsbHkgKG5vIEFQSSBjYWxsKSwgYW5kIHRoZSBjYWxsZXIgY2FuIHRoZW5cbiAgLy8gc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHN0cmFpZ2h0IGZyb20gdGhpcyByZXNwb25zZSByYXRoZXIgdGhhblxuICAvLyBtYWtpbmcgYSBzZXBhcmF0ZSBrZXktbG9va3VwIHJlcXVlc3QuXG4gIC8vXG4gIC8vIE9ubHkgYSAqcHVibGljKiBrZXkgbWF5IHRyYXZlbCB0aGlzIHdheTogdGhlIHByb2JlIHJlc3BvbnNlIHN0cmVhbSBpc1xuICAvLyBkZWxpYmVyYXRlbHkgdW5hdXRoZW50aWNhdGVkLCBzbyBhbnl0aGluZyBzZWNyZXQgd291bGQgYmUgZXhwb3NlZC5cbiAgLy8gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGhlYWx0aCBjaGVjayBpdHNlbGYsIHdoaWNoXG4gIC8vIGNhbGxlcnMgYWxzbyByZWx5IG9uIGZvciBwbGFpbiBjYXBhYmlsaXR5IGRldGVjdGlvbi5cbiAgbGV0IGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGhlYWx0aENoZWNrLnJ1bklkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihoZWFsdGhDaGVjay5ydW5JZCk7XG4gICAgICBpZiAocmF3S2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25QdWJsaWNLZXkgPSBieXRlc1RvQmFzZTY0KFxuICAgICAgICAgIChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSGVhbHRoIGNoZWNrIGNvdWxkIG5vdCBkZXJpdmUgYSBydW4gcHVibGljIGtleTsgdGhlIGNhbGxlciB3aWxsIGZhbGwgYmFjayB0byBhIGtleSBsb29rdXAnLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGhlYWx0aHk6IHRydWUsXG4gICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gdGhpcyBjb25zdGFudCByZWZsZWN0c1xuICAgIC8vIHRoZSAqY29uc3VtZXIncyogaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiwgZXhhY3RseSB3aGF0IGFcbiAgICAvLyBjcm9zcy1kZXBsb3ltZW50IGNhbGxlciBuZWVkcyB0byBnYXRlIGl0cyBwYXJhbGxlbCByZXN1bWUgcGF0aCBvbi5cbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICB9KTtcbiAgLy8gVXNlIGEgZGV0ZXJtaW5pc3RpYyBmYWtlIHJ1bklkIGRlcml2ZWQgZnJvbSB0aGUgY29ycmVsYXRpb25JZCBzbyB0aGF0XG4gIC8vIHRoZSByZWFkZXIgc2lkZSBwcm9kdWNlcyB0aGUgc2FtZSB2YWx1ZS5cbiAgY29uc3QgZmFrZVJ1bklkID0gZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSwgcmVzcG9uc2UpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tPcHRpb25zIHtcbiAgLyoqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZS4gRGVmYXVsdDogMzAwMDAgKDMwcykgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIERlcGxveW1lbnQgSUQgdG8gc2VuZCB0aGUgaGVhbHRoIGNoZWNrIHRvLiBGYWxscyBiYWNrIHRvIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lELiAqL1xuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuIGlkIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gY3JlYXRlLiBXaGVuIHNldCwgdGhlIHJlc3BvbmRpbmdcbiAgICogZGVwbG95bWVudCBkZXJpdmVzIHRoYXQgcnVuJ3MgcHVibGljIGtleSBsb2NhbGx5IGFuZCByZXR1cm5zIGl0IGFzXG4gICAqIGBlbmNyeXB0aW9uUHVibGljS2V5YCwgbGV0dGluZyBhIGNyb3NzLWRlcGxveW1lbnQgYHN0YXJ0KClgIHNlYWwgdGhlXG4gICAqIHdvcmtmbG93IGFyZ3VtZW50cyB3aXRob3V0IGEgc2VwYXJhdGUga2V5IGxvb2t1cC5cbiAgICovXG4gIHJ1bklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIG9mIHRoZSB0YXJnZXQgZGVwbG95bWVudCAoZS5nLiBgJ2V2ZSdgIGZvciB0b3BpY3MgbGlrZVxuICAgKiBgX19ldmVfd2tmX3dvcmtmbG93XypgKS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLiBDcm9zcy1jb250ZXh0IGNhbGxlcnMgKGUuZy4gdGhlIG9ic2VydmFiaWxpdHlcbiAgICogZGFzaGJvYXJkKSBtdXN0IHBhc3MgdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgbmFtZXNwYWNlIGV4cGxpY2l0bHk6XG4gICAqIHRoZSBlbnYgZmFsbGJhY2sgcmVzb2x2ZXMgaW4gdGhlIGNhbGxlcidzIHByb2Nlc3MsIGFuZCBhIG1lc3NhZ2VcbiAgICogcHVibGlzaGVkIHRvIGEgbWlzbWF0Y2hlZCB0b3BpYyBoYXMgbm8gY29uc3VtZXIsIHNvIHRoZSBjaGVjayB3b3VsZFxuICAgKiBhbHdheXMgdGltZSBvdXQuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBoZWFsdGggY2hlY2sgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgcXVldWUgcGlwZWxpbmVcbiAqIGFuZCB2ZXJpZnlpbmcgaXQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBjb21iaW5lZCB3b3JrZmxvdyBlbmRwb2ludC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ5cGFzc2VzIERlcGxveW1lbnQgUHJvdGVjdGlvbiBvbiBWZXJjZWwgYmVjYXVzZSBpdCBnb2VzXG4gKiB0aHJvdWdoIHRoZSBxdWV1ZSBpbmZyYXN0cnVjdHVyZSByYXRoZXIgdGhhbiBkaXJlY3QgSFRUUC5cbiAqXG4gKiBAcGFyYW0gd29ybGQgLSBUaGUgV29ybGQgaW5zdGFuY2UgdG8gdXNlIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlYWx0aCBjaGVjayByZXN1bHRcbiAqL1xuLy8gUG9sbCBpbnRlcnZhbCBmb3IgaGVhbHRoIGNoZWNrIHJldHJpZXMgKG1zKVxuY29uc3QgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwgPSAxMDA7XG4vLyBQZXItcmVhZCB0aW1lb3V0IHRvIHByZXZlbnQgYmxvY2tpbmcgZm9yZXZlciBvbiBsb2NhbCB3b3JsZCdzIEV2ZW50RW1pdHRlclxuLy8gKHdoaWNoIGRvZXNuJ3Qgd29yayBhY3Jvc3MgcHJvY2Vzc2VzKVxuY29uc3QgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVCA9IDUwMDtcblxuLyoqXG4gKiBSZWFkIGNodW5rcyBmcm9tIGEgc3RyZWFtIHdpdGggYSB0aW1lb3V0IHBlciByZWFkIG9wZXJhdGlvbi5cbiAqIFJldHVybnMgeyBjaHVua3MsIHRpbWVkT3V0IH0gd2hlcmUgdGltZWRPdXQgaW5kaWNhdGVzIGlmIGEgcmVhZCB0aW1lZCBvdXQuXG4gKi9cbi8qKlxuICogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhIGRlYWRsaW5lLiBSZWplY3RzIHdpdGggYSB0aW1lb3V0IGVycm9yIHdoZW4gdGhlXG4gKiBkZWFkbGluZSBlbGFwc2VzIGZpcnN0LiBVc2VkIHRvIGJvdW5kIGB3b3JsZC5zdHJlYW1zLmdldCgpYCBpbnNpZGUgdGhlXG4gKiBoZWFsdGgtY2hlY2sgcG9sbCBsb29wOiBzb21lIHdvcmxkcyBob2xkIHRoYXQgcmVxdWVzdCBvcGVuIHVudGlsIHRoZVxuICogc3RyZWFtIGhhcyBkYXRhIChlLmcuIHdvcmtmbG93LXNlcnZlciBob2xkcyB1bndyaXR0ZW4gc3RyZWFtcyBvcGVuIGZvclxuICogfjIgbWludXRlcyksIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBibG93IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgaGVhbHRoXG4gKiBjaGVjayB0aW1lb3V0LCBzaW5jZSB0aGUgYHdoaWxlYCBjb25kaXRpb24gaXMgb25seSByZS1jaGVja2VkIGJldHdlZW5cbiAqIGl0ZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHdpdGhEZWFkbGluZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHByb21pc2UsXG4gICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgT3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciAke21zfW1zYCkpLFxuICAgICAgICBtc1xuICAgICAgKTtcbiAgICB9KSxcbiAgXSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbVdpdGhUaW1lb3V0KFxuICByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PixcbiAgcmVhZFRpbWVvdXQ6IG51bWJlclxuKTogUHJvbWlzZTx7IGNodW5rczogVWludDhBcnJheVtdOyB0aW1lZE91dDogYm9vbGVhbiB9PiB7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGxldCB0aW1lZE91dCA9IGZhbHNlO1xuXG4gIHdoaWxlICghZG9uZSAmJiAhdGltZWRPdXQpIHtcbiAgICBjb25zdCByZWFkUHJvbWlzZSA9IHJlYWRlci5yZWFkKCk7XG4gICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTx7IGRvbmU6IHRydWU7IHZhbHVlOiB1bmRlZmluZWQgfT4oXG4gICAgICAocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZWRPdXQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9LCByZWFkVGltZW91dClcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZWFkUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBkb25lID0gcmVzdWx0LmRvbmU7XG4gICAgaWYgKHJlc3VsdC52YWx1ZSkgY2h1bmtzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7IGNodW5rcywgdGltZWRPdXQgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBoZWFsdGggY2hlY2sgcmVzcG9uc2UgZnJvbSBzdHJlYW0gY2h1bmtzLlxuICogUmV0dXJucyB0aGUgcGFyc2VkIHJlc3BvbnNlIG9yIG51bGwgaWYgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VIZWFsdGhDaGVja1Jlc3BvbnNlKGNodW5rczogVWludDhBcnJheVtdKToge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbn0gfCBudWxsIHtcbiAgaWYgKGNodW5rcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgoc3VtLCBjaHVuaykgPT4gc3VtICsgY2h1bmsubGVuZ3RoLCAwKTtcbiAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGNvbWJpbmVkLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb21iaW5lZCk7XG5cbiAgbGV0IHJlc3BvbnNlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBPbGQgZGVwbG95bWVudHMgKHNwZWNWZXJzaW9uIDwgMykgcmV0dXJuIHBsYWluIHRleHQgbGlrZVxuICAgIC8vICdXb3JrZmxvdyBTREsgXCIuLi5cIiBlbmRwb2ludCBpcyBoZWFsdGh5Jy4gVHJlYXQgYW55IG5vbi1lbXB0eVxuICAgIC8vIHRleHQgcmVzcG9uc2UgYXMgYSBoZWFsdGh5IGRlcGxveW1lbnQgd2l0aCB1bmtub3duIHNwZWNWZXJzaW9uLlxuICAgIGlmIChyZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgaGVhbHRoeTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcmVzcG9uc2UgIT09ICdvYmplY3QnIHx8XG4gICAgcmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAhKCdoZWFsdGh5JyBpbiByZXNwb25zZSkgfHxcbiAgICB0eXBlb2YgKHJlc3BvbnNlIGFzIHsgaGVhbHRoeTogdW5rbm93biB9KS5oZWFsdGh5ICE9PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByID0gcmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHBhcnNlZDoge1xuICAgIGhlYWx0aHk6IGJvb2xlYW47XG4gICAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG4gIH0gPSB7XG4gICAgaGVhbHRoeTogci5oZWFsdGh5IGFzIGJvb2xlYW4sXG4gIH07XG4gIGlmICh0eXBlb2Ygci5zcGVjVmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJzZWQuc3BlY1ZlcnNpb24gPSByLnNwZWNWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci53b3JrZmxvd0NvcmVWZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC53b3JrZmxvd0NvcmVWZXJzaW9uID0gci53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci5lbmNyeXB0aW9uUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC5lbmNyeXB0aW9uUHVibGljS2V5ID0gci5lbmNyeXB0aW9uUHVibGljS2V5O1xuICB9XG4gIGlmICh0eXBlb2Ygci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoZWFsdGhDaGVjayhcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRpb25zPzogSGVhbHRoQ2hlY2tPcHRpb25zXG4pOiBQcm9taXNlPEhlYWx0aENoZWNrUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQ7XG4gIC8vIFVzZSB0aGUgd29ybGQncyBJRCBnZW5lcmF0b3Igd2hlbiBhdmFpbGFibGUgc28gdGhlIGNvcnJlbGF0aW9uSWQgaXMgYVxuICAvLyByZWdpb24tdGFnZ2VkIFVMSUQuIFRoZSBoZWFsdGgtY2hlY2sgcmVzcG9uc2UgaXMgZGVsaXZlcmVkIG92ZXIgYSBzdHJlYW1cbiAgLy8gd2hvc2UgbmFtZSBlbWJlZHMgdGhpcyBjb3JyZWxhdGlvbklkOyB1bmRlciBwbGF0Zm9ybS1kaXJlY3RlZCByb3V0aW5nIHRoZVxuICAvLyByZWFkZXIgYW5kIHRoZSByZXNwb25kaW5nIGVuZHBvaW50IGNhbiBiZSBzZXJ2ZWQgZnJvbSBkaWZmZXJlbnQgcGh5c2ljYWxcbiAgLy8gcmVnaW9ucywgc28gdGhlIHJlZ2lvbiBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIElEIGl0c2VsZiBmb3IgYm90aCBzaWRlcyB0b1xuICAvLyByZXNvbHZlIHRoZSBzYW1lIChyZWdpb24tcGlubmVkKSBiYWNrZW5kLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gVUxJRCBmb3JcbiAgLy8gd29ybGRzIHRoYXQgZG9uJ3QgdGFnIElEcyAoZS5nLiBsb2NhbCksIHdoaWNoIHJlc29sdmUgdG8gdGhlIGRlZmF1bHRcbiAgLy8gcmVnaW9uIG9uIGJvdGggc2lkZXMuXG4gIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB3b3JsZC5jcmVhdGVSdW5JZD8uKCkgPz8gZ2VuZXJhdGVJZCgpO1xuICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQpO1xuXG4gIGNvbnN0IHF1ZXVlTmFtZSA9XG4gICAgYCR7Z2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKSl9aGVhbHRoX2NoZWNrYCBhcyBWYWxpZFF1ZXVlTmFtZTtcblxuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICBxdWV1ZU5hbWUsXG4gICAgICB7XG4gICAgICAgIF9faGVhbHRoQ2hlY2s6IHRydWUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIC4uLihvcHRpb25zPy5ydW5JZCA/IHsgcnVuSWQ6IG9wdGlvbnMucnVuSWQgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFVzZSBKU09OIHRyYW5zcG9ydCBzbyB0aGUgaGVhbHRoIGNoZWNrIHdvcmtzIGFnYWluc3QgYm90aFxuICAgICAgICAvLyBvbGQgKEpTT04tb25seSkgYW5kIG5ldyAoZHVhbCkgZGVwbG95bWVudHMuXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICBkZXBsb3ltZW50SWQ6IG9wdGlvbnM/LmRlcGxveW1lbnRJZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aW1lb3V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdpdGhEZWFkbGluZShcbiAgICAgICAgICB3b3JsZC5zdHJlYW1zLmdldChcbiAgICAgICAgICAgIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkKSxcbiAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlbWFpbmluZ01zXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgeyBjaHVua3MsIHRpbWVkT3V0IH0gPSBhd2FpdCByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gICAgICAgICAgcmVhZGVyLFxuICAgICAgICAgIEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNhbmNlbCBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3MpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBIZWFsdGggY2hlY2sgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2AsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICByZXR1cm4gbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICBgRXZlbnQgcGFnaW5hdGlvbiAke21lc3NhZ2V9IGZvciB3b3JrZmxvdyBydW4gXCIke3J1bklkfVwiLmAsXG4gICAgeyBjb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmRSZXF1ZXN0ZWRFdmVudEN1cnNvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICByZXF1ZXN0ZWRDdXJzb3JzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmICghY3Vyc29yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWRDdXJzb3JzLmhhcyhjdXJzb3IpKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihydW5JZCwgJ2RpZCBub3QgYWR2YW5jZScpO1xuICB9XG4gIHJlcXVlc3RlZEN1cnNvcnMuYWRkKGN1cnNvcik7XG59XG5cbi8qKlxuICogQXBwZW5kcyBldmVudHMgd2hvc2UgSURzIGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluIGB0YXJnZXRgLlxuICpcbiAqIFBhc3MgdGhlIElEcyBjdXJyZW50bHkgcHJlc2VudCBpbiBgdGFyZ2V0YCB3aGVuIGFwcGVuZGluZyByZXBlYXRlZGx5IHRvIHRoZVxuICogc2FtZSBhcnJheS4gVGhlIHNldCBpcyB1cGRhdGVkIGFsb25nc2lkZSBgdGFyZ2V0YC5cbiAqXG4gKiBFdmVudHMgYXJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGUgV29ybGQgcmV0dXJuZWQgdGhlbSwgYW5kIGFyZSBub3RcbiAqIHJlLXNvcnRlZC4gRXZlcnkgYXBwZW5kIHNvdXJjZSBpcyBhbHJlYWR5IGluIGNhbm9uaWNhbCBvcmRlciByZWxhdGl2ZSB0byB0aGVcbiAqIHRhaWwgKGEgY3Vyc29yLWRlbGltaXRlZCBwYWdlLCBvciBhIHdyaXRlLXJlc3BvbnNlIGRlbHRhKSwgc28gcmVjZWlwdCBvcmRlciBpc1xuICogdGhlIG9yZGVyIHRvIGtlZXAsIGFuZCByZS1zb3J0aW5nIGhlcmUgd291bGQgb25seSBjb3N0IGEgcGFzcyBvdmVyIHRoZSBsb2cuXG4gKiBOb3RoaW5nIGRvd25zdHJlYW0gbWF5IGFzc3VtZSB0aGUgdGFpbCBpcyB0aGUgbmV3ZXN0IGV2ZW50LiBTZWVcbiAqIHtAbGluayBtYXhFdmVudFNsb3R9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kVW5pcXVlRXZlbnRzKFxuICB0YXJnZXQ6IEV2ZW50W10sXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSxcbiAgdGFyZ2V0SWRzPzogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IHRhcmdldElkcyA/PyBuZXcgU2V0KHRhcmdldC5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKSk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGlkcy5oYXMoZXZlbnQuZXZlbnRJZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZHMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIHRhcmdldC5wdXNoKGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydHMgYGV2ZW50YCBpbnRvIGB0YXJnZXRgIGF0IHRoZSBwb3NpdGlvbiB0aGF0IGtlZXBzIGB0YXJnZXRgIG9yZGVyZWQgYnlcbiAqIGFzY2VuZGluZyBgZXZlbnRJZGAsIG9yIG5vLW9wcyBpZiBhbiBldmVudCB3aXRoIHRoZSBzYW1lIGBldmVudElkYCBpcyBhbHJlYWR5XG4gKiBwcmVzZW50IChpZGVtcG90ZW50KS5cbiAqXG4gKiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBsb2FkZWQgYHNvcnRPcmRlcjogJ2FzYydgIGFuZCBpcyBuZXZlciByZS1zb3J0ZWRcbiAqIGNsaWVudC1zaWRlLCBzbyBhIGBob29rX3JlY2VpdmVkYCBzcGxpY2VkIGluIGJ5IHRoZSBsYXp5LXJlc3VtZSBjb25zdW1lciBtdXN0XG4gKiBsYW5kIGluIGBldmVudElkYCBvcmRlcjogYSBwbGFpbiBgcHVzaGAgd291bGQgcGxhY2UgYSBsYXRlLWNvbW1pdHRpbmdcbiAqIGVhcmxpZXIgZXZlbnQgYWZ0ZXIgZXZlbnRzIHRoYXQgc29ydCBiZWZvcmUgaXQsIGNvcnJ1cHRpbmcgcmVwbGF5LlxuICpcbiAqIExleGljb2dyYXBoaWMgc3RyaW5nIG9yZGVyIGlzIHRoZSBsb2cncyBvcmRlcjogYSBzbG90IGlkIGlzIGEgZml4ZWQtd2lkdGhcbiAqIHplcm8tcGFkZGVkIHBvc2l0aW9uLCBzbyBjb21wYXJpbmcgdGhlIHN0cmluZ3MgY29tcGFyZXMgdGhlIHBvc2l0aW9ucy4gVGhpc1xuICogbmVlZHMgbm8gcGFyc2Ugb2YgaXRzIG93biBmb3IgdGhhdCByZWFzb24sIGFuZCB0aGUgY29tcGFyaXNvbiBpcyBleGFjdCByYXRoZXJcbiAqIHRoYW4gYSByZWNvbnN0cnVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEV2ZW50QnlFdmVudElkKHRhcmdldDogRXZlbnRbXSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIC8vIExpbmVhciBzY2FuIGZyb20gdGhlIGVuZDogdGhlIHNwbGljZWQgZXZlbnQgaXMgYWxtb3N0IGFsd2F5cyB0aGUgbmV3ZXN0XG4gIC8vIChpdCBzb3J0cyBhdCBvciBuZWFyIHRoZSB0YWlsKSwgc28gdGhpcyBmaW5kcyB0aGUgc2xvdCBpbiBPKDEp4oCTTyhrKSBmb3IgdGhlXG4gIC8vIGNvbW1vbiBjYXNlIHdoaWxlIHN0aWxsIGhhbmRsaW5nIGFuIG91dC1vZi1vcmRlciBsYXRlIGFycml2YWwgY29ycmVjdGx5LlxuICBsZXQgaSA9IHRhcmdldC5sZW5ndGg7XG4gIHdoaWxlIChpID4gMCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGFyZ2V0W2kgLSAxXTtcbiAgICBpZiAoZXhpc3RpbmcuZXZlbnRJZCA9PT0gZXZlbnQuZXZlbnRJZCkge1xuICAgICAgLy8gQWxyZWFkeSBwcmVzZW50OiBrZWVwIHRoZSBzcGxpY2UgaWRlbXBvdGVudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV4aXN0aW5nLmV2ZW50SWQgPCBldmVudC5ldmVudElkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaS0tO1xuICB9XG4gIHRhcmdldC5zcGxpY2UoaSwgMCwgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRFdmVudFBhZ2luYXRpb25Qcm9ncmVzcyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaGFzTW9yZTogYm9vbGVhbixcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICByZXF1ZXN0ZWRDdXJzb3JzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmICghaGFzTW9yZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY3Vyc29yID09PSBudWxsKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihcbiAgICAgIHJ1bklkLFxuICAgICAgJ3JldHVybmVkIG1vcmUgcGFnZXMgd2l0aG91dCBhIGN1cnNvcidcbiAgICApO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWRDdXJzb3JzLmhhcyhjdXJzb3IpKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihydW5JZCwgJ3JlcGVhdGVkIGEgY3Vyc29yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUmV0cnlXaXRob3V0RXZlbnRDdXJzb3IoXG4gIGVycm9yOiB1bmtub3duLFxuICBjdXJzb3I6IHN0cmluZyB8IG51bGwsXG4gIGFscmVhZHlSZXRyaWVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjdXJzb3IgIT09IG51bGwgJiZcbiAgICAhYWxyZWFkeVJldHJpZWQgJiZcbiAgICBXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyb3IpICYmXG4gICAgZXJyb3Iuc3RhdHVzID09PSA0MDBcbiAgKTtcbn1cblxuLyoqXG4gKiBMb2FkcyB3b3JrZmxvdyBydW4gZXZlbnRzIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBwYWdlcyBvZiBwYWdpbmF0ZWRcbiAqIHJlc3VsdHMuIEV2ZW50cyBhcmUgcmV0dXJuZWQgaW4gY2hyb25vbG9naWNhbCAoYXNjZW5kaW5nKSBvcmRlciBmb3JcbiAqIGRldGVybWluaXN0aWMgd29ya2Zsb3cgcmVwbGF5LlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQuXG4gKiBAcGFyYW0gYWZ0ZXJDdXJzb3IgLSBJZiBwcm92aWRlZCwgb25seSBldmVudHMgYWZ0ZXIgdGhpcyBjdXJzb3IgYXJlXG4gKiAgIHJldHVybmVkIChpbmNyZW1lbnRhbCBsb2FkKS4gSWYgb21pdHRlZCwgYWxsIGV2ZW50cyBhcmUgcmV0dXJuZWQuXG4gKiAgIFRoZSByZXR1cm5lZCBjdXJzb3IgY2FuIGJlIHBhc3NlZCBiYWNrIGluIG9uIGEgc3Vic2VxdWVudCBjYWxsIGZvclxuICogICBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICBydW5JZDogc3RyaW5nLFxuICBhZnRlckN1cnNvcj86IHN0cmluZ1xuKTogUHJvbWlzZTxMb2FkZWRFdmVudExvZz4ge1xuICBjb25zdCBpbmNyZW1lbnRhbCA9IGFmdGVyQ3Vyc29yICE9PSB1bmRlZmluZWQ7XG4gIHJldHVybiB0cmFjZSgnd29ya2Zsb3cucmVwbGF5LmxvYWQnLCBhc3luYyAoc3BhbikgPT4ge1xuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UmVwbGF5TG9hZFNvdXJjZShcbiAgICAgICAgaW5jcmVtZW50YWwgPyAnZXZlbnRzX2xpc3RfaW5jcmVtZW50YWwnIDogJ2V2ZW50c19saXN0J1xuICAgICAgKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGxvYWRlZEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGNvbnN0IGxvYWRlZEV2ZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBhZnRlckN1cnNvciA/PyBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcbiAgICBsZXQgcGFnZXNMb2FkZWQgPSAwO1xuICAgIGxldCByZXRyaWVkV2l0aG91dEN1cnNvciA9IGZhbHNlO1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgbG9hZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoaGFzTW9yZSkge1xuICAgICAgLy8gVE9ETzogd2UncmUgY3VycmVudGx5IGxvYWRpbmcgYWxsIHRoZSBkYXRhIHdpdGggcmVzb2x2ZVJlZiBiZWhhdmlvci4gV2UgbmVlZCB0byB1cGRhdGUgdGhpc1xuICAgICAgLy8gdG8gbGF6eWxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgd29ybGQgaW5zdGVhZCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBhbmQgbWFrZSB0aGUgZXZlbnQgbG9nIGxvYWRpbmdcbiAgICAgIC8vIG11Y2ggZmFzdGVyIGFuZCBtZW1vcnkgZWZmaWNpZW50XG4gICAgICBjb25zdCBwYWdlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29yID0gY3Vyc29yO1xuICAgICAgcmVjb3JkUmVxdWVzdGVkRXZlbnRDdXJzb3IocnVuSWQsIHJlcXVlc3RlZEN1cnNvciwgcmVxdWVzdGVkQ3Vyc29ycyk7XG5cbiAgICAgIGxldCByZXNwb25zZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB3b3JsZC5ldmVudHMubGlzdD4+O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogcmVxdWVzdGVkQ3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzaG91bGRSZXRyeVdpdGhvdXRFdmVudEN1cnNvcihcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcmVxdWVzdGVkQ3Vyc29yLFxuICAgICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3JcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdFdmVudCBjdXJzb3Igd2FzIHJlamVjdGVkOyByZXRyeWluZyB3aXRoIGEgZnVsbCBldmVudCByZWxvYWQuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9hZGVkRXZlbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgbG9hZGVkRXZlbnRJZHMuY2xlYXIoKTtcbiAgICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzLmNsZWFyKCk7XG4gICAgICAgICAgY3Vyc29yID0gbnVsbDtcbiAgICAgICAgICByZXRyaWVkV2l0aG91dEN1cnNvciA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGFwcGVuZFVuaXF1ZUV2ZW50cyhsb2FkZWRFdmVudHMsIHJlc3BvbnNlLmRhdGEsIGxvYWRlZEV2ZW50SWRzKTtcbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5oYXNNb3JlO1xuICAgICAgYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBoYXNNb3JlLFxuICAgICAgICByZXNwb25zZS5jdXJzb3IsXG4gICAgICAgIHJlcXVlc3RlZEN1cnNvcnNcbiAgICAgICk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgbGFzdCBub24tbnVsbCBjdXJzb3IgYWNyb3NzIHBhZ2VzLiBBIFdvcmxkIG1heVxuICAgICAgLy8gbGVnaXRpbWF0ZWx5IHJldHVybiBgeyBkYXRhOiBbXSwgY3Vyc29yOiBudWxsLCBoYXNNb3JlOiBmYWxzZSB9YFxuICAgICAgLy8gb24gYSB0cmFpbGluZyBlbXB0eSBwYWdlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBwcmV2aW91cyBwYWdlJ3NcbiAgICAgIC8vIHVuZGVybHlpbmcgREIgcXVlcnkgaGl0IHRoZSBsaW1pdCBleGFjdGx5IGFuZCByZXR1cm5lZCBhXG4gICAgICAvLyBwcmVjYXV0aW9uYXJ5IGBMYXN0RXZhbHVhdGVkS2V5YC4gT3ZlcndyaXRpbmcgd2l0aCB0aGF0IG51bGxcbiAgICAgIC8vIHdvdWxkIGxvc2UgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3QgcmVhbCBldmVudCB3ZSBsb2FkZWQgYW5kXG4gICAgICAvLyBmb3JjZSB0aGUgcnVudGltZSBpbnRvIHRoZSBcIm5vIGN1cnNvciBhZnRlciBpbml0aWFsIGxvYWRcIiBmdWxsLVxuICAgICAgLy8gcmVsb2FkIGZhbGxiYWNrIG9uIGV2ZXJ5IHN1YnNlcXVlbnQgcmVwbGF5IGl0ZXJhdGlvbi5cbiAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvciA/PyBjdXJzb3I7XG4gICAgICBwYWdlc0xvYWRlZCsrO1xuXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdMb2FkZWQgZXZlbnQgcGFnZScsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICBwYWdlOiBwYWdlc0xvYWRlZCxcbiAgICAgICAgcGFnZUV2ZW50czogcmVzcG9uc2UuZGF0YS5sZW5ndGgsXG4gICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICBoYXNNb3JlLFxuICAgICAgICBwYWdlTXM6IERhdGUubm93KCkgLSBwYWdlU3RhcnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdFdmVudCBsb2FkIGNvbXBsZXRlJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBpbmNyZW1lbnRhbCxcbiAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgcGFnZXNMb2FkZWQsXG4gICAgICB0b3RhbE1zOiBEYXRlLm5vdygpIC0gbG9hZFN0YXJ0LFxuICAgIH0pO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNDb3VudChsb2FkZWRFdmVudHMubGVuZ3RoKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkKHBhZ2VzTG9hZGVkKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGV2ZW50czogbG9hZGVkRXZlbnRzLCBjdXJzb3IgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIHJ1bnRpbWUncyBsb2FkZWQgZXZlbnQtbG9nIHNuYXBzaG90OiB0aGUgZXZlbnRzIHJlcGxheWVkIHNvIGZhciBhbmQgdGhlXG4gKiBjdXJzb3IgcG9zaXRpb25lZCBhZnRlciB0aGVtLiBIYW5kZWQgdG8gaGVscGVycyB0aGF0IGRlcml2ZSB0aGUgcHJlY29uZGl0aW9uXG4gKiBzbmFwc2hvdCBmcm9tIGl0OyB0aGV5IGRvIG5vdCBtdXRhdGUgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRXZlbnRMb2cge1xuICBldmVudHM6IEV2ZW50W107XG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBFeHRlbmQgYSBsb2FkZWQgbG9nIHdpdGggYSBwYWdlIHRoYXQgY29udGludWVzIGl0IOKAlCBhIGxpc3RlZCBwYWdlLCBvciB0aGVcbiAqIGlubGluZSBkZWx0YSBhIHdyaXRlIGhhbmRlZCBiYWNrIOKAlCBhbmQgbW92ZSBpdHMgcmVhZCBwb3NpdGlvbiB3aXRoIGl0LlxuICpcbiAqIFRoZSBjdXJzb3IgaXMgb25seSBhZHZhbmNlZCB3aGVuIHRoZSBwYWdlIGNhcnJpZXMgb25lLCBzbyBhIHNvdXJjZSB3aXRoIG5vXG4gKiBwb3NpdGlvbiBvZiBpdHMgb3duIChhIHNraXBwZWQtc2xvdCByZXBvcnQpIGNhbm5vdCB3YWxrIHRoZSByZWFkIHBvc2l0aW9uXG4gKiBwYXN0IGV2ZW50cyBpdCBkaWQgbm90IGNhcnJ5LiBBcHBlbmRpbmcgZG9lcyBub3QgcmUtc29ydDsgc2VlXG4gKiB7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSBmb3Igd2h5IHJlY2VpcHQgb3JkZXIgaXMgdGhlIG9yZGVyIHRvIGtlZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRFdmVudExvZyhcbiAgbG9nOiBMb2FkZWRFdmVudExvZyxcbiAgYXBwZW5kZWQ6IHsgZXZlbnRzOiByZWFkb25seSBFdmVudFtdOyBjdXJzb3I/OiBzdHJpbmcgfCBudWxsIH1cbik6IHZvaWQge1xuICBhcHBlbmRVbmlxdWVFdmVudHMobG9nLmV2ZW50cywgYXBwZW5kZWQuZXZlbnRzKTtcbiAgbG9nLmN1cnNvciA9IGFwcGVuZGVkLmN1cnNvciA/PyBsb2cuY3Vyc29yO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSByZXBsYXkgcmVmdXNlcyB0byBydW4gb3ZlciBhIGxvZyB3aXRoIGEgaG9sZSBpbiBpdCAoc2VlXG4gKiB7QGxpbmsgZmluZEV2ZW50U2xvdEdhcH0pLiAqKk9uIGJ5IGRlZmF1bHQqKjsgc2V0XG4gKiBgV09SS0ZMT1dfU0xPVF9HQVBfQ0hFQ0s9MGAgdG8gcmVwbGF5IGFjcm9zcyBob2xlcyBpbnN0ZWFkLlxuICpcbiAqIEEgV29ybGQgdGhhdCBhbGxvY2F0ZXMgYSBwb3NpdGlvbiBhdCB0aGUgbW9tZW50IGl0IGNvbW1pdHMgbGVhdmVzIG5vIGhvbGVcbiAqIGJlaGluZCB3aGVuIGEgd3JpdGUgZmFpbHMsIHNvIGRlbnNpdHkgaXMgYSBwcm9wZXJ0eSB0aGUgbG9nIGhhcyBieVxuICogY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIG9uZSB0aGlzIGNoZWNrIG1haW50YWlucy4gV2hhdCB0aGUgY2hlY2sgaXMgZm9yIGlzXG4gKiB0aGUgcmVhZHMgYW5kIHRoZSBXb3JsZHMgd2hlcmUgdGhhdCBkb2VzIG5vdCBob2xkLCBhbmQgYnkgdGhlIHRpbWUgaXQgcnVuc1xuICogdGhlIGJlbmlnbiBleHBsYW5hdGlvbnMgYXJlIHNwZW50OiBhIHBvc2l0aW9uIG1pc3NpbmcgYmVjYXVzZSBhIGNvbmN1cnJlbnRcbiAqIGNvbW1pdCBpcyBub3QgdmlzaWJsZSB5ZXQgY2xlYXJzIG9uIGEgcmUtcmVhZCwgd2hpY2ggaXMgd2hhdFxuICoge0BsaW5rIHNldHRsZUV2ZW50U2xvdEdhcH0gZG9lcyBmaXJzdC5cbiAqXG4gKiBXaGF0IGlzIGxlZnQgaXMgYSBob2xlIHRoYXQgcGVyc2lzdHMsIGFuZCBpdHMgdHdvIGNhdXNlcyBhcmVcbiAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGxvZy4gRWl0aGVyIGEgV29ybGQgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBvdXRzaWRlXG4gKiB0aGUgY29tbWl0IGFuZCBsb3N0IHRoZSB3cml0ZSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIGhhcHBlbmVkIHRoZXJlIGFuZFxuICogcmVwbGF5aW5nIHBhc3QgaXQgaXMgY29ycmVjdCwgb3IgYW4gZXZlbnQgdGhhdCBkaWQgaGFwcGVuIGlzIG1pc3NpbmcsIGluXG4gKiB3aGljaCBjYXNlIHJlcGxheWluZyBwYXN0IGl0IGRlY2lkZXMgYSBicmFuY2ggb24gYWJzZW5jZSBhbmQgcHJvZHVjZXMgYSB3cm9uZ1xuICogcmVzdWx0IHdpdGggbm90aGluZyB0byBzaG93IGZvciBpdC4gRmFpbGluZyBpcyB0aGUgcmVjb3ZlcmFibGUgc2lkZSBvZiB0aGF0XG4gKiB0cmFkZSwgYW5kIHRoaXMgaXMgdGhlIHdheSBiYWNrIG91dCBpZiBhIGZsZWV0IHR1cm5zIG91dCB0byBjYXJyeSBob2xlcyBvZlxuICogdGhlIGZpcnN0IGtpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Nsb3RHYXBDaGVja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19TTE9UX0dBUF9DSEVDSyAhPT0gJzAnO1xufVxuXG4vKlxuICogTWVyZ2luZyBpbnRvIGEgbG9nIGEgcmVwbGF5IGlzIG1pZHdheSB0aHJvdWdoIHJlYWRpbmcuXG4gKlxuICogVGhyZWUgcGF0aHMgYWRkIGV2ZW50cyB0byBhIGxvYWRlZCBsb2cgYWZ0ZXIgdGhlIHJlcGxheSBoYXMgc3RhcnRlZDogYVxuICogYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRzIGJhY2sgdGhlIHNsb3RzIGl0IHNraXBwZWQgKHtAbGlua1xuICogbWVyZ2VSZXBvcnRlZEV2ZW50c30pLCBhbiBpbmxpbmUgZGVsdGEgZXh0ZW5kcyB0aGUgdGFpbCAoYGFic29yYkNyZWF0ZURlbHRhYFxuICogaW4gYHJ1bnRpbWUudHNgKSwgYW5kIGEgbGlzdGVkIHBhZ2UgYXBwZW5kcyAoe0BsaW5rIGFwcGVuZFVuaXF1ZUV2ZW50c30pLlxuICogVGhleSBsb29rIGFsYXJtaW5nICh0aGUgcmVwbGF5IGlzIHJlYWRpbmcgYW4gYXJyYXkgd2hpbGUgc29tZXRoaW5nIGVsc2VcbiAqIHdyaXRlcyB0byBpdCkgYW5kIHRoZXkgYXJlIHNhZmUgZm9yIG9uZSByZWFzb24gd29ydGggc3RhdGluZyBwbGFpbmx5LCBzaW5jZVxuICogZXZlcnkgY29ycmVjdG5lc3MgYXJndW1lbnQgaW4gdGhpcyBmaWxlIGxlYW5zIG9uIGl0LlxuICpcbiAqICoqQW4gZXZlbnQgaW4gdGhlIGxvZyBpcyBhIGZhY3QsIGFuZCBhIGxvbmdlciBsb2cgY2Fubm90IHJldHJhY3Qgb25lLioqIFRoZVxuICogbG9nIGlzIGFwcGVuZC1vbmx5IGFuZCBwb3NpdGlvbnMgYXJlIG5ldmVyIHJldXNlZCwgc28gYSByZXBsYXkgdGhhdCBwcm9kdWNlZFxuICogZXZlbnQgRSBmcm9tIHRoZSBwcmVmaXggaXQgaGFkIGxvYWRlZCBoYXMgbWFkZSBFIHRydWUgZm9yIGV2ZXJ5IHJlcGxheSB0aGF0XG4gKiBmb2xsb3dzLiBBIGxhdGVyIHJlcGxheSByZWFkaW5nIGEgZnVsbGVyIGxvZyBkb2VzIG5vdCBnZXQgdG8gZGVjaWRlIEUgc2hvdWxkXG4gKiBub3QgYmUgdGhlcmU7IGl0IGNvbnN1bWVzIEUgYW5kIHJlY29uY2lsZXMgdG8gaXQsIHdoaWNoIGlzIHdoYXQgdGhlIGV2ZW50c1xuICogY29uc3VtZXIgZG9lcyB3aGVuIGl0IHdhbGtzIGEgbG9nIGhvbGRpbmcgd3JpdGVzIGZyb20gYSByZXBsYXkgdGhhdCByYWNlZCBpdC5cbiAqXG4gKiBNZXJnaW5nIGlzIHRoZXJlZm9yZSBtb25vdG9uZTogaXQgY2FuIG9ubHkgYWRkIGZhY3RzIHRoaXMgcmVwbGF5IGhhcyB5ZXQgdG9cbiAqIHJlY29uY2lsZSB0bywgbmV2ZXIgcmVtb3ZlIG9uZSBpdCBhbHJlYWR5IGhhcy4gVGhhdCBpcyB3aHkgYWJzb3JiaW5nIGlzXG4gKiBhbHdheXMgb3B0aW9uYWwgYW5kIG5ldmVyIHdyb25nIHRvIGRlY2xpbmUgKGFuIHVuYWJzb3JiZWQgZXZlbnQgaXMgb25lIHRoZVxuICogbmV4dCByZWFkIHJldHVybnMpLCBhbmQgd2h5IHRoZSBndWFyZHMgYmVsb3cgY2FuIGFmZm9yZCB0byBiZSBzdHJpY3QuXG4gKi9cblxuLyoqXG4gKiBNZXJnZSB0aGUgZXZlbnRzIGEgYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRlZCBiYWNrIGludG8gdGhlIGxvZyBpdCB3YXNcbiAqIGRlcml2ZWQgZnJvbSwgYW5kIGFuc3dlciBob3cgbWFueSBvZiB0aGVtIHdlcmUgbmV3LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSwgdGhpcyByZS1zb3J0cy4gVGhlIHJlcG9ydGVkIGV2ZW50cyBvY2N1cHlcbiAqIHNsb3RzICpiZWxvdyogdGhlIHdyaXRlIHRoYXQgcmVwb3J0ZWQgdGhlbSwgc28gYXBwZW5kaW5nIHRoZW0gd291bGQgcHV0IHRoZW1cbiAqIGFmdGVyIGV2ZW50cyB0aGV5IHByZWNlZGUuIFNvcnRpbmcgYnkgaWQgcmVzdG9yZXMgdGhlIFdvcmxkJ3MgY2Fub25pY2FsIG9yZGVyXG4gKiByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBpdDogYSBzbG90IGlkIGlzIHRoYXQgb3JkZXIsIHdyaXR0ZW4gZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUmVwb3J0ZWRFdmVudHMoXG4gIHRhcmdldDogRXZlbnRbXSxcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBudW1iZXIge1xuICBjb25zdCBiZWZvcmUgPSB0YXJnZXQubGVuZ3RoO1xuICBhcHBlbmRVbmlxdWVFdmVudHModGFyZ2V0LCBldmVudHMpO1xuICBjb25zdCBhZGRlZCA9IHRhcmdldC5sZW5ndGggLSBiZWZvcmU7XG4gIGlmIChhZGRlZCA+IDApIHtcbiAgICB0YXJnZXQuc29ydCgoYSwgYikgPT5cbiAgICAgIGEuZXZlbnRJZCA8IGIuZXZlbnRJZCA/IC0xIDogYS5ldmVudElkID4gYi5ldmVudElkID8gMSA6IDBcbiAgICApO1xuICB9XG4gIHJldHVybiBhZGRlZDtcbn1cblxuLyoqIFdoYXQge0BsaW5rIGFic29yYlNraXBwZWRTbG90UmVwb3J0fSBkaWQgd2l0aCBhIHdyaXRlJ3MgcmVwb3J0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2lwcGVkU2xvdFJlcG9ydCB7XG4gIC8qKiBIb3cgbWFueSBvZiB0aGUgcmVwb3J0ZWQgZXZlbnRzIHdlcmUgbmV3IHRvIHRoZSBsb2cuIFplcm8gaWYgZHJvcHBlZC4gKi9cbiAgYWRkZWQ6IG51bWJlcjtcbiAgLyoqIEhvdyBtYW55IGV2ZW50cyB0aGUgcmVwb3J0IG9mZmVyZWQsIHdoZXRoZXIgb3Igbm90IHRoZXkgd2VyZSB0YWtlbi4gKi9cbiAgb2ZmZXJlZDogbnVtYmVyO1xuICAvKiogVGhlIHJlcG9ydCB3YXMgdHJ1bmNhdGVkLCBzbyBpdCB3YXMgZHJvcHBlZCB3aG9sZSBpbnN0ZWFkIG9mIG1lcmdlZC4gKi9cbiAgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgd3JpdGUncyBza2lwcGVkLXNsb3QgcmVwb3J0IHRvIHRoZSBsb2cgaXQgd2FzIGRlcml2ZWQgZnJvbSwgZGVjaWRpbmdcbiAqIHdoZXRoZXIgdGhlIHJlcG9ydCBtYXkgYmUgdGFrZW4gYXQgYWxsLlxuICpcbiAqIEV2ZXJ5IHJlcGxheS1jb250ZXh0IHdyaXRlIGNhbiBjb21lIGJhY2sgY2FycnlpbmcgdGhlIGV2ZW50cyBvbiB0aGUgc2xvdHMgaXRcbiAqIHNraXBwZWQgb3ZlciwgYW5kIGV2ZXJ5IGNhbGxlciB3YW50cyB0aGUgc2FtZSB0aGluZyBmcm9tIHRoZW06IGZvbGQgdGhlbSBpblxuICogc28gdGhlIHdyaXRlcyB0aGF0IGZvbGxvdyBuYW1lIGEgcG9zaXRpb24gYWJvdmUgdGhlbSwgYW5kIHNvIHRoZSByZXBsYXlcbiAqIHJlc3VtaW5nIGZyb20gdGhpcyBsb2cgc2VlcyB0aGVtIHdpdGhvdXQgYSByZWxvYWQuXG4gKlxuICogVGhlIG9uZSBwb2xpY3kgaXMgdGhhdCBhICoqdHJ1bmNhdGVkIHJlcG9ydCBpcyBkcm9wcGVkIHdob2xlKiouIEl0IGNvdmVycyBhXG4gKiBzcGFuIG9mIHBvc2l0aW9ucyBidXQgY2FycmllcyBvbmx5IHNvbWUgb2YgdGhlIGV2ZW50cyBvbiB0aGVtLCBzbyBtZXJnaW5nIGl0XG4gKiB3b3VsZCByYWlzZSB0aGUgbG9nJ3MgaGlnaGVzdCBwb3NpdGlvbiBwYXN0IGEgcG9zaXRpb24gd2hvc2UgZXZlbnQgaXNcbiAqIG1pc3NpbmcuIExhdGVyIHdyaXRlcyByZWFkIHRoYXQgbWF4aW11bSB0byBzYXkgd2hhdCB0aGV5IGhhdmUgc2Vlbiwgc28gZWFjaFxuICogd291bGQgY2xhaW0gYSBwb3NpdGlvbiBpdCBuZXZlciBzYXcsIGFuZCB0aGUgV29ybGQgb25seSByZXBvcnRzIHRoZSBzcGFuIGFcbiAqIHdyaXRlIHNraXBzOiBpdCB3b3VsZCBuZXZlciBzZW5kIHRoZSBtaXNzaW5nIG9uZS4gRHJvcHBpbmcgY29zdHMgb25lIG1vcmVcbiAqIHJvdW5kIG9mIHRoZSBzYW1lIGV2ZW50cyBvbiB0aGUgbmV4dCB3cml0ZSBhbmQga2VlcHMgdGhlIGxvZyBhIHByZWZpeCBvZiB0aGVcbiAqIHRydXRoLCB3aGljaCB0aGUgbm90ZSBhYm92ZSB7QGxpbmsgbWVyZ2VSZXBvcnRlZEV2ZW50c30gZXhwbGFpbnMgaXMgYWx3YXlzIGFuXG4gKiBhdmFpbGFibGUgYW5zd2VyLlxuICpcbiAqIENhbGxlcnMgdGhhdCBsb2cgZG8gc28gZnJvbSB0aGUgcmV0dXJuZWQgY291bnRzOyB0aGUgZGVjaXNpb24gaXMgbm90IHRoZWlyc1xuICogdG8gcmUtZGVyaXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQoXG4gIHRhcmdldDogRXZlbnRbXSxcbiAgcmVzdWx0OiB7IGV2ZW50cz86IHJlYWRvbmx5IEV2ZW50W107IGhhc01vcmU/OiBib29sZWFuIH1cbik6IFNraXBwZWRTbG90UmVwb3J0IHtcbiAgY29uc3Qgb2ZmZXJlZCA9IHJlc3VsdC5ldmVudHM/Lmxlbmd0aCA/PyAwO1xuICBpZiAob2ZmZXJlZCA9PT0gMCkge1xuICAgIHJldHVybiB7IGFkZGVkOiAwLCBvZmZlcmVkOiAwLCB0cnVuY2F0ZWQ6IGZhbHNlIH07XG4gIH1cbiAgaWYgKHJlc3VsdC5oYXNNb3JlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IDAsIG9mZmVyZWQsIHRydW5jYXRlZDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYWRkZWQ6IG1lcmdlUmVwb3J0ZWRFdmVudHModGFyZ2V0LCByZXN1bHQuZXZlbnRzID8/IFtdKSxcbiAgICBvZmZlcmVkLFxuICAgIHRydW5jYXRlZDogZmFsc2UsXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgbG9hZGVkIGxvZyBvY2N1cGllcywgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIGVtcHR5IGxvZy5cbiAqXG4gKiBUaGUgbWF4aW11bSwgbm90IHRoZSBjb3VudCwgYW5kIHRoZSB0d28gYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUgZXZlbiB0aG91Z2hcbiAqIGEgaGVhbHRoeSBsb2cgbWFrZXMgdGhlbSBlcXVhbC4gQSBXb3JsZCBoYW5kcyBhIHBvc2l0aW9uIHRvIHRoZSBpbnNlcnQgdGhhdFxuICogb2NjdXBpZXMgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBsYW5kcyBsZWF2ZXMgbm8gaG9sZSBiZWhpbmQgYW5kIHRoZSBsb2dcbiAqIHN0YXlzIGRlbnNlLiBXaGF0IHRoZSBjb3VudCBjYW5ub3Qgc3Vydml2ZSBpcyBhICpwYXJ0aWFsKiByZWFkOiBhIGxvZ1xuICogYXNzZW1ibGVkIGZyb20gYSB0cnVuY2F0ZWQgcmVwb3J0LCBvciByZWFkIHdoaWxlIGEgY29uY3VycmVudCB3cml0ZSBpc1xuICogY29tbWl0dGluZywgaG9sZHMgZmV3ZXIgZXZlbnRzIHRoYW4gaXRzIGhpZ2hlc3QgcG9zaXRpb24uIENvdW50aW5nIHRob3NlXG4gKiB3b3VsZCBtYWtlIHRoZSBuZXh0IHdyaXRlIGNsYWltIHRvIGhhdmUgc2VlbiBsZXNzIHRoYW4gaXQgaGFzLCBzbyB0aGUgV29ybGRcbiAqIHdvdWxkIHJlcG9ydCB0aGUgc2FtZSBldmVudHMgYmFjayB0byBpdCBvbiBldmVyeSBhdHRlbXB0LlxuICpcbiAqIEEgaG9sZSBiZWxvdyB0aGUgbWF4aW11bSBpcyB0aGVyZWZvcmUgYSBwcm9wZXJ0eSBvZiB0aGUgcmVhZCwgbm90IG9mIHRoZSBsb2csXG4gKiB3aGljaCBpcyB3aGF0IGxldHMge0BsaW5rIHNldHRsZUV2ZW50U2xvdEdhcH0gcmUtcmVhZCBpbnN0ZWFkIG9mIGdpdmluZyB1cC5cbiAqXG4gKiBAdGhyb3dzIGlmIGFueSBldmVudCBpZCBjYXJyaWVzIG5vIHNsb3QuIEV2ZXJ5IFdvcmxkIHRoZSBydW50aW1lIHJlcGxheXNcbiAqIGFnYWluc3QgbnVtYmVycyBldmVudHMgYnkgc2xvdCwgc28gYW4gaWQgdGhhdCBkb2VzIG5vdCBpcyBhIGJyb2tlbiBsb2cgcmF0aGVyXG4gKiB0aGFuIGFuIG9sZGVyIG9uZSwgYW5kIGEgbWF4aW11bSBkZXJpdmVkIGJ5IHNraXBwaW5nIGl0IHdvdWxkIHVuZGVyc3RhdGUgdGhlXG4gKiBsb2cgdG8gZXZlcnkgd3JpdGUgdGhhdCByZWFkcyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heEV2ZW50U2xvdChldmVudHM6IHJlYWRvbmx5IEV2ZW50W10pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBsZXQgbWF4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3Qgc2xvdCA9IHJlcXVpcmVFdmVudFNsb3QoZXZlbnQuZXZlbnRJZCk7XG4gICAgaWYgKG1heCA9PT0gdW5kZWZpbmVkIHx8IHNsb3QgPiBtYXgpIHtcbiAgICAgIG1heCA9IHNsb3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG5cbi8qKiBBIHBvc2l0aW9uIHRoZSBsb2cgc2tpcHMgb3ZlciwgZGVzY3JpYmVkIHdlbGwgZW5vdWdoIHRvIG5hbWUgaW4gYW4gZXJyb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U2xvdEdhcCB7XG4gIC8qKiBUaGUgbG93ZXN0IHNsb3QgYmVsb3cgdGhlIGxvZydzIG1heGltdW0gdGhhdCBubyBldmVudCBvY2N1cGllcy4gKi9cbiAgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgc2xvdHMgYmVsb3cgdGhlIG1heGltdW0gbm8gZXZlbnQgb2NjdXBpZXMuICovXG4gIG1pc3NpbmdDb3VudDogbnVtYmVyO1xuICAvKiogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgbG9nIG9jY3VwaWVzLiAqL1xuICBtYXhTbG90OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGhvbGUgaW4gYSBsb2FkZWQgbG9nLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gZmluZC5cbiAqXG4gKiBUaGUgV29ybGQgYWxsb2NhdGVzIGV2ZXJ5IHBvc2l0aW9uLCBzbyBhIGxvZyB0aGF0IGhvbGRzIGBuYCBldmVudHMgYmVsb3cgc2xvdFxuICogYG5gIGlzIG1pc3Npbmcgb25lLiBUaGF0IG1hdHRlcnMgYmVmb3JlIGEgcmVwbGF5XG4gKiBhbmQgbm93aGVyZSBlbHNlOiB0aGUgcmVwbGF5IHJlYWRzIHRoZSBsb2cgYXMgdGhlIGNvbXBsZXRlIHJlY29yZCBvZiB3aGF0IGhhc1xuICogaGFwcGVuZWQsIGFuZCBhbiBhYnNlbnQgcG9zaXRpb24gaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBldmVudCB0aGF0XG4gKiBuZXZlciBvY2N1cnJlZC4gVGhlIGJyYW5jaCBpdCB3b3VsZCBoYXZlIGRlY2lkZWQgZ2V0cyBkZWNpZGVkIHRoZSBvdGhlciB3YXksXG4gKiBhbmQgdGhlIHJ1biBkaXZlcmdlcyBxdWlldGx5IHJhdGhlciB0aGFuIGZhaWxpbmcuXG4gKlxuICogT3JkZXItaW5kZXBlbmRlbnQsIHVubGlrZSB0aGUgZXF1aXZhbGVudCBhdWRpdCB0aGUgV29ybGQgcnVucyBvdmVyIGEgcGFnZSBpdFxuICoganVzdCByZWFkLiBBIGxvYWRlZCBsb2cgaXMgYXNzZW1ibGVkIGZyb20gbGlzdGVkIHBhZ2VzIHBsdXMgd2hhdGV2ZXIgYVxuICogYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRlZCBiYWNrLCBhbmQgd2hpbGUge0BsaW5rIG1lcmdlUmVwb3J0ZWRFdmVudHN9XG4gKiByZXN0b3JlcyBpZCBvcmRlciwgYSBjaGVjayB0aGF0IGNhbiBmYWlsIGEgaGVhbHRoeSBydW4gc2hvdWxkIG5vdCBkZXBlbmQgb25cbiAqIHRoYXQgaGF2aW5nIGhhcHBlbmVkLlxuICpcbiAqIFRoZSBmaXJzdCBzbG90IGlzIG5ldmVyIGNvdW50ZWQuIEl0IGJlbG9uZ3MgdG8gYHJ1bl9jcmVhdGVkYCwgd2hpY2ggYHN0YXJ0KClgXG4gKiBwb3N0cyBjb25jdXJyZW50bHkgd2l0aCB0aGUgcXVldWUgc2VuZCwgc28gYSBsb2cgcmVhZCBpbiB0aGF0IHdpbmRvd1xuICogbGVnaXRpbWF0ZWx5IGJlZ2lucyBhdCB0aGUgc2Vjb25kIHNsb3QgYW5kIGZpbGxzIGluIG9uIGl0cyBvd24uIEV2ZXJ5IHJlcGxheVxuICogdGhhdCByYWNlcyBhIHJ1bidzIG93biBzdGFydCB3b3VsZCBvdGhlcndpc2UgcmVwb3J0IGEgaG9sZS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbiBlbXB0eSBsb2csIHdoaWNoIGhhcyBubyBkZW5zaXR5IHRvIGNoZWNrLlxuICpcbiAqIEB0aHJvd3MgaWYgYW55IGV2ZW50IGlkIGNhcnJpZXMgbm8gc2xvdCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEV2ZW50U2xvdEdhcChcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBFdmVudFNsb3RHYXAgfCB1bmRlZmluZWQge1xuICBjb25zdCBvY2N1cGllZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsZXQgbWF4U2xvdCA9IDA7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3Qgc2xvdCA9IHJlcXVpcmVFdmVudFNsb3QoZXZlbnQuZXZlbnRJZCk7XG4gICAgb2NjdXBpZWQuYWRkKHNsb3QpO1xuICAgIGlmIChzbG90ID4gbWF4U2xvdCkge1xuICAgICAgbWF4U2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG4gIGlmIChtYXhTbG90ID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBmbG9vciA9IG9jY3VwaWVkLmhhcyhGSVJTVF9FVkVOVF9TTE9UKVxuICAgID8gRklSU1RfRVZFTlRfU0xPVFxuICAgIDogRklSU1RfRVZFTlRfU0xPVCArIDE7XG4gIC8vIEV2ZXJ5IHNsb3QgaXMgYXQgb3IgYWJvdmUgYGZsb29yYCBieSBjb25zdHJ1Y3Rpb24sIHNvIHRoZSBsb2cgaXMgZGVuc2VcbiAgLy8gZXhhY3RseSB3aGVuIGl0IGhvbGRzIG9uZSBldmVudCBwZXIgcG9zaXRpb24gaW4gYFtmbG9vciwgbWF4U2xvdF1gLiBUaGVcbiAgLy8gc2NhbiBiZWxvdyBvbmx5IHJ1bnMgb25jZSB0aGF0IGhhcyBhbHJlYWR5IGFuc3dlcmVkIG5vLlxuICBpZiAob2NjdXBpZWQuc2l6ZSA9PT0gbWF4U2xvdCAtIGZsb29yICsgMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IGZpcnN0TWlzc2luZ1Nsb3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IG1pc3NpbmdDb3VudCA9IDA7XG4gIGZvciAobGV0IHNsb3QgPSBmbG9vcjsgc2xvdCA8PSBtYXhTbG90OyBzbG90KyspIHtcbiAgICBpZiAoIW9jY3VwaWVkLmhhcyhzbG90KSkge1xuICAgICAgZmlyc3RNaXNzaW5nU2xvdCA/Pz0gc2xvdDtcbiAgICAgIG1pc3NpbmdDb3VudCsrO1xuICAgIH1cbiAgfVxuICBpZiAoZmlyc3RNaXNzaW5nU2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBmaXJzdE1pc3NpbmdTbG90LCBtaXNzaW5nQ291bnQsIG1heFNsb3QgfTtcbn1cblxuLyoqXG4gKiBIb3cgbWFueSB0aW1lcyBhIGRldGVjdGVkIGhvbGUgaXMgcmUtcmVhZCBiZWZvcmUgdGhlIGxvZyBpcyB0YWtlbiBhdCBpdHNcbiAqIHdvcmQsIGFuZCB0aGUgYmFja29mZiBiZWZvcmUgZWFjaCByZS1yZWFkIChkb3VibGluZyBwZXIgYXR0ZW1wdCkuXG4gKlxuICogQSBob2xlIGNhbiBiZSB0cmFuc2llbnQuIFRoZSBXb3JsZCBhbGxvY2F0ZXMgYSBzbG90IGluc2lkZSB0aGUgaW5zZXJ0IHRoYXRcbiAqIG9jY3VwaWVzIGl0LCBzbyB0d28gY29uY3VycmVudCB3cml0ZXJzIGNhbiBjb2xsaWRlLCBvbmUgcmV0cnkgcGFzdCB0aGUgb3RoZXIsXG4gKiBhbmQgdGhlIGhpZ2hlciBzbG90IGNvbW1pdCBmaXJzdCwgbGVhdmluZyBhIHdpbmRvdyBpbiB3aGljaCB0aGUgbG93ZXIgb25lIGlzXG4gKiBnZW51aW5lbHkgYWJzZW50IGZyb20gYSBzdHJvbmdseS1jb25zaXN0ZW50IHJlYWQgYW5kIGZpbGxzIGluIGEgbW9tZW50IGxhdGVyLlxuICogVGhlIHdpbmRvdyBpcyBvbmUgY29tbWl0IHdpZGUsIHNvIGEgc2hvcnQgYmFja29mZiBjbGVhcnMgaXQ7IGFueXRoaW5nIHRoYXRcbiAqIHN1cnZpdmVzIGFsbCB0aHJlZSByZS1yZWFkcyBpcyBhIHBvc2l0aW9uIG5vIHdyaXRlIHdpbGwgZXZlciBvY2N1cHkuXG4gKi9cbmV4cG9ydCBjb25zdCBTTE9UX0dBUF9SRUNIRUNLX0FUVEVNUFRTID0gMztcbmNvbnN0IFNMT1RfR0FQX1JFQ0hFQ0tfQkFTRV9ERUxBWV9NUyA9IDI1O1xuXG4vKipcbiAqIFJlLXJlYWQgYSBsb2cgdGhhdCBsb29rcyBob2xleSB1bnRpbCB0aGUgaG9sZSBmaWxscyBpbiBvciB0aGUgcmUtcmVhZHMgcnVuXG4gKiBvdXQsIGFuZCByZXR1cm4gdGhlIHNldHRsZWQgbG9nIGFsb25nc2lkZSB0aGUgaG9sZSB0aGF0IHN1cnZpdmVkLlxuICpcbiAqIFJlYWRzIGFyZSBzdHJvbmdseSBjb25zaXN0ZW50LCBzbyBhIGhvbGUgaXMgbm90IGFuIGFydGlmYWN0IG9mICp3aGVuKiB0aGUgbG9nXG4gKiB3YXMgcmVhZCwgYnV0IGl0IGNhbiBiZSBhbiBhcnRpZmFjdCBvZiBhIHdyaXRlIHRoYXQgaGFkIG5vdCBjb21taXR0ZWQgeWV0XG4gKiAoc2VlIHtAbGluayBTTE9UX0dBUF9SRUNIRUNLX0FUVEVNUFRTfSkuIERpc3Rpbmd1aXNoaW5nIHRoZSB0d28gY29zdHMgYVxuICogcmUtcmVhZCwgd2hpY2ggaXMgb25seSBldmVyIHBhaWQgYnkgYSByZXBsYXkgdGhhdCBhbHJlYWR5IGZvdW5kIGEgaG9sZS5cbiAqXG4gKiBUaGUgcmVsb2FkIGlzIGZ1bGwgcmF0aGVyIHRoYW4gaW5jcmVtZW50YWw6IHRoZSBtaXNzaW5nIHBvc2l0aW9uIGlzIGJlbG93IHRoZVxuICogbG9nJ3MgbWF4aW11bSwgc28gYSBjdXJzb3ItYW5jaG9yZWQgcmVhZCBzdGFydHMgcGFzdCBpdCBhbmQgY2FuIG5ldmVyIHNlZSBpdFxuICogYXJyaXZlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dGxlRXZlbnRTbG90R2FwKFxuICBydW5JZDogc3RyaW5nLFxuICBsb2FkZWQ6IExvYWRlZEV2ZW50TG9nXG4pOiBQcm9taXNlPHsgbG9nOiBMb2FkZWRFdmVudExvZzsgZ2FwOiBFdmVudFNsb3RHYXAgfCB1bmRlZmluZWQgfT4ge1xuICBsZXQgbG9nID0gbG9hZGVkO1xuICBsZXQgZ2FwID0gZmluZEV2ZW50U2xvdEdhcChsb2cuZXZlbnRzKTtcbiAgZm9yIChcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgZ2FwICE9PSB1bmRlZmluZWQgJiYgYXR0ZW1wdCA8IFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFM7XG4gICAgYXR0ZW1wdCsrXG4gICkge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBTTE9UX0dBUF9SRUNIRUNLX0JBU0VfREVMQVlfTVMgKiAyICoqIGF0dGVtcHQpXG4gICAgKTtcbiAgICBsb2cgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgIGdhcCA9IGZpbmRFdmVudFNsb3RHYXAobG9nLmV2ZW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgbG9nLCBnYXAgfTtcbn1cblxuLyoqXG4gKiBIb3cgbXVjaCBvZiBpdHMgcnVuJ3MgbG9nIGEgcmVwbGF5LWNvbnRleHQgZXZlbnQgY3JlYXRpb24gaGFkIGxvYWRlZCB3aGVuIGl0XG4gKiBkZWNpZGVkIHRvIHdyaXRlLCBhcyB0aGUgaGlnaGVzdCBzbG90IHRoYXQgbG9nIG9jY3VwaWVzLlxuICpcbiAqIE9uZSBpbnRlZ2VyIHNheXMgaXQgYmVjYXVzZSB0aGUgV29ybGQga2VlcHMgaXRzIHBvc2l0aW9ucyBkZW5zZTogYSB3cml0ZXJcbiAqIHRoYXQgbmFtZXMgc2xvdCBOIGlzIGNsYWltaW5nIHRvIGhvbGQgZXZlcnkgZXZlbnQgZnJvbSAxIHRvIE4gYW5kIG5vdGhpbmdcbiAqIGFib3ZlLiBUaGUgV29ybGQgYW5zd2VycyBieSBudW1iZXJpbmcgdGhlIHdyaXRlIGFib3ZlIHdoYXRldmVyIHRoZSBsb2cgaGFzXG4gKiBhY3R1YWxseSByZWFjaGVkIGFuZCBoYW5kaW5nIGJhY2sgdGhlIGV2ZW50cyBvbiB0aGUgc2xvdHMgaW4gYmV0d2VlbjogdGhlXG4gKiBvbmVzIHRoaXMgd3JpdGVyIGRlY2lkZWQgd2l0aG91dC5cbiAqXG4gKiBEZW5zaXR5IGlzIHRoZSBXb3JsZCdzIGludmFyaWFudCwgbm90IGEgY2xhaW0gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIHJlYWQuIEFcbiAqIHJlYWRlciB0aGF0IGlzIHNob3J0IG9mIGEgcG9zaXRpb24gaXQgaG9sZHMgbm8gZXZlbnQgZm9yIG5hbWVzIGEgbG93ZXIgTixcbiAqIHdoaWNoIHVuZGVyc3RhdGVzIHdoYXQgaXQgaGFzIHNlZW4gYW5kIG9ubHkgY29zdHMgaXQgYSB3aWRlciByZXBvcnQuIE5hbWluZ1xuICogYSBwb3NpdGlvbiBpdCBjYW5ub3QgYWNjb3VudCBmb3IgaXMgdGhlIGRpcmVjdGlvbiB0aGF0IGlzIHVuc2FmZSwgd2hpY2ggaXNcbiAqIHdoeSB7QGxpbmsgc2xvdFNuYXBzaG90UGFyYW1zfSB0YWtlcyB0aGUgbWF4aW11bSByYXRoZXIgdGhhbiB0aGUgY291bnQuXG4gKlxuICogSXRzIG93biBvYmplY3QgcmF0aGVyIHRoYW4gYSBiYXJlIG51bWJlciBzbyBhIGNhbGwgc2l0ZSBjYW5ub3QgaGFsZi1zZW5kIGl0LFxuICogYW5kIHNvIHRoZSBlbXB0eSBjYXNlIHNwcmVhZHMgdG8gbm90aGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbG90U25hcHNob3RQYXJhbXMge1xuICBldmVudENvdW50PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzbG90IHNuYXBzaG90IHRvIGF0dGFjaCB0byBhIHJlcGxheS1jb250ZXh0IGV2ZW50IGNyZWF0aW9uLlxuICpcbiAqIEVtcHR5IGZvciBhbiBlbXB0eSBsb2csIHdoaWNoIGlzIHRoZSBzdGF0ZSBhIGBydW5fY3JlYXRlZGAgd3JpdGUgaXMgaXNzdWVkXG4gKiBmcm9tOiB0aGVyZSBpcyBubyBwb3NpdGlvbiBoZWxkIHlldCB0byBuYW1lLlxuICpcbiAqICMjIFdobyBuYW1lcyBhIHBvc2l0aW9uXG4gKlxuICogQSBXb3JsZCBjYW4gaGFuZCBldmVudHMgYmFjayBvbiBhIHdyaXRlJ3Mgc3VjY2VzcyByZXNwb25zZSB0aHJvdWdoIHR3b1xuICogcGFyYW1zIChgQ3JlYXRlRXZlbnRQYXJhbXNgIGluIGBAd29ya2Zsb3cvd29ybGRgKTogYGV2ZW50Q291bnRgLCB3aGljaCBpc1xuICogYW5zd2VyZWQgd2l0aCB0aGUgZXZlbnRzIG9uIHRoZSBwb3NpdGlvbnMgdGhlIHdyaXRlIHNraXBwZWQgb3ZlciAodGhlXG4gKiBza2lwcGVkLXNsb3QgcmVwb3J0KSwgYW5kIGBzaW5jZUN1cnNvcmAsIHdoaWNoIGlzIGFuc3dlcmVkIHdpdGggZXZlcnl0aGluZ1xuICogYWZ0ZXIgdGhhdCBjdXJzb3IgKHRoZSBpbmxpbmUgZGVsdGEpLiBCb3RoIGV4aXN0IHRvIHNhdmUgdGhlIHdyaXRlciBhXG4gKiByZWxvYWQuIFNvIHRoZSBydWxlIGZvciB3aGljaCB3cml0ZXMgc2VuZCB0aGVtIGlzIG5vdCBhYm91dCB0aGUgZXZlbnQgdHlwZTtcbiAqIGl0IGlzIGFib3V0IHdoZXRoZXIgKip0aGUgcHJvY2VzcyB0aGF0IHdyaXRlcyBob2xkcyBhIGxvYWRlZCBsb2cgaXQgd2lsbFxuICoga2VlcCBkZWNpZGluZyBmcm9tKiosIGl0cyBvd24gbmV4dCB3cml0ZXMgb3IgdGhlIHJlcGxheSBpdCByZXN1bWVzLiBBIHdyaXRlclxuICogd2l0aCBubyBsb2cgaGFzIG5vdGhpbmcgdG8gbWVyZ2UgYSBwYWdlIGludG8sIGFuZCB3aG9ldmVyIGRlY2lkZXMgbmV4dCBpcyBhXG4gKiBmcmVzaCByZXBsYXkgdGhhdCBsb2FkcyB0aGUgbG9nIGFueXdheS5cbiAqXG4gKiBUaHJlZSBnYXRlcywgYWxsIG9mIHdoaWNoIG11c3QgcGFzcyBmb3IgYSBwYWdlIHRvIGNvbWUgYmFjazpcbiAqXG4gKiAxLiBUaGUgd3JpdGVyIG5hbWVzIGEgcG9zaXRpb24uIE9ubHkgdGhlIHJlcGxheSBsb29wJ3MgYGNyZWF0ZUV2ZW50YCBzZWFtXG4gKiAgICAocnVudGltZS50cykgYW5kIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIncyBgY3JlYXRlR3VhcmRlZGAgZG87IHRoZSBRdWlja0pTXG4gKiAgICBlbmdpbmUncyBgY3JlYXRlRXZlbnRgIChxdWlja2pzLWVudHJ5cG9pbnQudHMpIGZvbGxvd3MgdGhlIHNhbWUgcnVsZS4gUmF3XG4gKiAgICBgd29ybGQuZXZlbnRzLmNyZWF0ZWAgY2FsbHMgc2VuZCBub3RoaW5nLlxuICogMi4gVGhlIFdvcmxkIHJlYWRzIGEgcGFnZSBmb3IgdGhhdCBldmVudCB0eXBlLiBBIFdvcmxkIG1heSBkZWNsaW5lIGZvciB0eXBlc1xuICogICAgd2hvc2Ugd3JpdGVyIG5ldmVyIGhvbGRzIGEgbG9nIChzdGVwIGV4ZWN1dG9yIHdyaXRlcywgcnVuLXRlcm1pbmFsXG4gKiAgICB3cml0ZXMpLCB3aGF0ZXZlciB0aGUgY2xpZW50IHNlbnQuXG4gKiAzLiBUaGVyZSBpcyBzb21ldGhpbmcgdG8gaGFuZCBiYWNrOiB0aGUgcmVwb3J0IG9ubHkgd2hlbiB0aGUgd3JpdGUgbGFuZGVkXG4gKiAgICBtb3JlIHRoYW4gb25lIHBvc2l0aW9uIGFib3ZlIGBldmVudENvdW50YDsgdGhlIGRlbHRhIGFsd2F5cy5cbiAqXG4gKiB8IEV2ZW50IHwgV3JpdGVyIHwgU2VuZHMgfCBXaHkgfFxuICogfC0tLXwtLS18LS0tfC0tLXxcbiAqIHwgYHJ1bl9jcmVhdGVkYCB8IGBzdGFydCgpYCB8IG5vdGhpbmcgfCBubyBsb2cgZXhpc3RzIHlldCB8XG4gKiB8IGBydW5fc3RhcnRlZGAgfCByZXBsYXkgbG9vcCwgZmlyc3Qgd3JpdGUgb2YgYSBkZWxpdmVyeSB8IGBldmVudENvdW50YCB3aGVuIGEgbG9nIGlzIGxvYWRlZDsgbm8gY3Vyc29yLCB0aGUgYHJ1bl9zdGFydGVkYCBwcmVsb2FkIG93bnMgdGhlIHJlc3BvbnNlIGZpZWxkcyB8IHRoZSBwcmVsb2FkIGFscmVhZHkgcmV0dXJucyB0aGUgZnVsbCBsb2cgfFxuICogfCBgc3RlcF9jcmVhdGVkYCwgYHdhaXRfY3JlYXRlZGAsIGBob29rX2Rpc3Bvc2VkYCwgYGF0dHJfc2V0YCB8IHN1c3BlbnNpb24gaGFuZGxlciAoYGNyZWF0ZUd1YXJkZWRgKSB8IGBldmVudENvdW50YCB8IHRoZSBoYW5kbGVyIGtlZXBzIHdyaXRpbmcgZnJvbSwgYW5kIHJlc3VtZXMgcmVwbGF5IGZyb20sIHRoaXMgbG9nIHxcbiAqIHwgYHN0ZXBfY3JlYXRlZGAgfCBxdWV1ZS1jb25zdW1lciByZS1lbnN1cmUgKHJhdykgfCBub3RoaW5nIHwgcnVucyBmcm9tIGEgcXVldWUgbWVzc2FnZSwgbm8gbG9nIHxcbiAqIHwgYGhvb2tfY3JlYXRlZGAgfCBzdXNwZW5zaW9uIGhhbmRsZXIgKG5vZGUpLCBgZGlzcGF0Y2hQZW5kaW5nT3BzYCAoUXVpY2tKUykgfCBgZXZlbnRDb3VudGAgKyBgc2luY2VDdXJzb3JgIChvbmx5IHdoZW4gdGhlIHN1c3BlbnNpb24gY3JlYXRlcyBleGFjdGx5IG9uZSBob29rKSB8IHRoZSBkZWx0YSBpcyBob3cgYW4gYWxyZWFkeS1yZWNlaXZlZCBob29rIHJlc29sdmVzIHdpdGhvdXQgYSByZS1pbnZvY2F0aW9uOyB0d28gY3JlYXRlcyBhZ2FpbnN0IG9uZSBjdXJzb3Igd291bGQgZ2l2ZSB0d28gZGVsdGFzIG9mIHdoaWNoIG9ubHkgdGhlIGZpcnN0IGNvdWxkIGJlIHRha2VuIHxcbiAqIHwgYGhvb2tfcmVjZWl2ZWRgIHwgcmVwbGF5IGxvb3AgbGF6eSByZXN1bWU7IGhhbmRsZXIgaW4tc3VzcGVuc2lvbiByZXN1bWUgfCBgZXZlbnRDb3VudGAgKHByZWxvYWQgb3ducyB0aGUgY3Vyc29yIGZpZWxkcykgfCBib3RoIHJlcGxheSBmcm9tIHRoZSBsb2cgcmlnaHQgYWZ0ZXIgfFxuICogfCBgaG9va19yZWNlaXZlZGAgfCB3ZWJob29rIC8gYHJlc3VtZUhvb2tgIChyYXcpIHwgbm90aGluZyB8IG91dC1vZi1iYW5kLCBlbnF1ZXVlcyBhIGRlbGl2ZXJ5IHRoYXQgbG9hZHMgdGhlIGxvZyB8XG4gKiB8IGB3YWl0X2NvbXBsZXRlZGAgfCByZXBsYXkgbG9vcCB0aW1lciBwYXRoIHwgYGV2ZW50Q291bnRgIHwgdGhlIGxvb3Aga2VlcHMgcmVwbGF5aW5nIGZyb20gdGhlIGxvZyB8XG4gKiB8IGB3YWl0X2NvbXBsZXRlZGAgfCBgcnVucy4qYCBvdXQtb2YtYmFuZCAocmF3KSB8IG5vdGhpbmcgfCBubyBsb2cgfFxuICogfCBgc3RlcF9zdGFydGVkYCwgYHN0ZXBfcmV0cnlpbmdgIHwgc3RlcCBleGVjdXRvciB8IG5vdGhpbmcgfCBubyBsb2c7IHRoZSBuZXh0IGRlY2lzaW9uIGlzIGEgcmVwbGF5IHRoYXQgcmVsb2FkcyBvciByZWNlaXZlcyB0aGUgZGVsdGEgYmVsb3cgfFxuICogfCBgc3RlcF9jb21wbGV0ZWRgLCBgc3RlcF9mYWlsZWRgIHwgc3RlcCBleGVjdXRvciB8IGBzaW5jZUN1cnNvcmAgb25seSwgb3V0c2lkZSB0dXJibywgc2luZ2xlIGlubGluZSBzdGVwIHwgdGhpcyBpcyB3aGVyZSB0aGUgaW5saW5lIGV4ZWN1dGlvbiBsb29wIGdldHMgaXRzIGxvZyBiYWNrOyBpbiB0dXJibyBvciBmcm9tIGEgcXVldWVkIGRlbGl2ZXJ5IGEgZnJlc2ggcmVwbGF5IGxvYWRzIGl0IGFueXdheSB8XG4gKiB8IGBzdGVwX2ZhaWxlZGAgfCBzdXNwZW5zaW9uIGhhbmRsZXIsIHVuc2VyaWFsaXphYmxlIGlucHV0IHwgYGV2ZW50Q291bnRgIHwgdGhlIGhhbmRsZXIgaG9sZHMgYSBsb2c7IHJhcmUsIGFuZCBmb2xsb3dzIGEgYHN0ZXBfY3JlYXRlZGAgdGhhdCBkcmV3IHRoZSBwYWdlIHxcbiAqIHwgYGF0dHJfc2V0YCB8IGBzZXRBdHRyaWJ1dGVzKClgIEFQSSAocmF3KSB8IG5vdGhpbmcgfCBvdXQtb2YtYmFuZCB8XG4gKiB8IGBydW5fY29tcGxldGVkYCwgYHJ1bl9mYWlsZWRgLCBgcnVuX2NhbmNlbGxlZGAgfCByZXBsYXkgbG9vcCwgcmVwbGF5IGJ1ZGdldCwgYHJ1bnMuY2FuY2VsYCB8IGBldmVudENvdW50YCB3aGVyZSB0aGUgbm9kZSBsb29wJ3Mgc2VhbSBzdGFtcHMgaXQgKHRoZSBRdWlja0pTIGVuZ2luZSBzZW5kcyBub3RoaW5nKTsgbmV2ZXIgYHNpbmNlQ3Vyc29yYCAoYGRlbHRhUmVxdWVzdEN1cnNvcmAgZXhjbHVkZXMgdGVybWluYWwgdHlwZXMpIHwgdGVybWluYWw6IG5vdGhpbmcgcmVwbGF5cyB0aGUgbG9nIGFmdGVyd2FyZHMsIHNvIGEgV29ybGQgcmVhZHMgbm8gcGFnZSBmb3IgdGhlbSB8XG4gKlxuICogQmF0Y2hlZCB3cml0ZXMgKGBldmVudHMuY3JlYXRlQmF0Y2hgKSBhcmUgb3V0c2lkZSBhbGwgb2YgdGhpczogYSBiYXRjaCBjYXJyaWVzXG4gKiBubyBwZXItZXZlbnQgcG9zaXRpb24gYW5kIGdldHMgbm8gcGFnZS4gVGhlIHVzZXItZmFjaW5nIHZlcnNpb24gb2YgdGhpcyB0YWJsZVxuICogaXMgaW4gYGRvY3MvY29udGVudC9kb2NzL3Y1L2hvdy1pdC13b3Jrcy9ldmVudC1zb3VyY2luZy5tZHhgOyBrZWVwIHRoZSB0d28gaW5cbiAqIHN0ZXAuXG4gKlxuICogVGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIGxlbmd0aCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzOiBhIHBhcnRpYWxseS1yZWFkIGxvZyBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbiwgYW5kXG4gKiBjb3VudGluZyB0aG9zZSB3b3VsZCBtYWtlIHRoZSB3cml0ZSBjbGFpbSB0byBoYXZlIHNlZW4gbGVzcyB0aGFuIGl0IGhhcywgc29cbiAqIHRoZSBXb3JsZCB3b3VsZCByZXBvcnQgdGhlIHNhbWUgZXZlbnRzIGJhY2sgb24gZXZlcnkgYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsb3RTbmFwc2hvdFBhcmFtcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBTbG90U25hcHNob3RQYXJhbXMge1xuICBjb25zdCBldmVudENvdW50ID0gbWF4RXZlbnRTbG90KGV2ZW50cyk7XG4gIHJldHVybiBldmVudENvdW50ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnRDb3VudCB9O1xufVxuXG4vKipcbiAqIFRoZSBldmVudHMgYSByZWplY3RpbmcgV29ybGQgYXR0YWNoZWQgdG8gYSBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgLCB3aGVuIGl0XG4gKiByZXR1cm5lZCB0aGUgb25lcyB0aGUgY2xpZW50J3Mgc25hcHNob3Qgd2FzIG1pc3NpbmcgaW5saW5lLlxuICpcbiAqIFJldHVybnMgYG51bGxgIGZvciBhbnl0aGluZyBlbHNlOiBubyBkZXRhaWxzLCBhIFdvcmxkIHRoYXQgZGlkIG5vdCBpbXBsZW1lbnRcbiAqIHRoaXMsIG9yIGEgcGF5bG9hZCB0aGF0IGRvZXMgbm90IG5hcnJvdyBjbGVhbmx5LiBDYWxsZXJzIGZhbGwgYmFjayB0b1xuICogcmVsb2FkaW5nIHRoZSBldmVudCBsb2csIHdoaWNoIGlzIGFsd2F5cyBjb3JyZWN0OyB0aGlzIGlzIHVudHJ1c3RlZC1zaGFwZWRcbiAqIGRhdGEgb24gYSBmYWlsdXJlIHBhdGgsIHNvIG5vdGhpbmcgaGVyZSBpcyByZXBhaXJlZC5cbiAqXG4gKiBgcnVuSWRgIGlzIHRoZSBjYWxsZXIncyBydW4uIEV2ZXJ5IGV2ZW50IG11c3QgYmVsb25nIHRvIGl0OiB0aGUgZGVsdGEgaXNcbiAqIG1lcmdlZCBzdHJhaWdodCBpbnRvIHRoZSByZXBsYXkncyBsb2csIGFuZCBvbmUgZm9yZWlnbiBldmVudCB0aGVyZSBpcyBhXG4gKiBjb3JydXB0IGxvZyByYXRoZXIgdGhhbiBhIGNvcnJlY3RlZCBvbmU6IHRoZSByZXBsYXkgd291bGQgY29uc3VtZSBhXG4gKiBjb3JyZWxhdGlvbiBpZCBmb3IgYW4gZXZlbnQgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoXG4gIGVycm9yOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nXG4pOiB7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsIHtcbiAgaWYgKCFQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkZXRhaWxzID0gZXJyb3IuZGV0YWlscztcbiAgaWYgKHR5cGVvZiBkZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBkZXRhaWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBldmVudHMsIGN1cnNvciB9ID0gZGV0YWlscyBhcyB7IGV2ZW50cz86IHVua25vd247IGN1cnNvcj86IHVua25vd24gfTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgZXZlbnQgPT09IG51bGwgfHxcbiAgICAgIHR5cGVvZiAoZXZlbnQgYXMgeyBldmVudElkPzogdW5rbm93biB9KS5ldmVudElkICE9PSAnc3RyaW5nJyB8fFxuICAgICAgKGV2ZW50IGFzIHsgcnVuSWQ/OiB1bmtub3duIH0pLnJ1bklkICE9PSBydW5JZFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBldmVudHMgYXMgRXZlbnRbXSxcbiAgICBjdXJzb3I6IHR5cGVvZiBjdXJzb3IgPT09ICdzdHJpbmcnID8gY3Vyc29yIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgb25lIGV2ZW50IG9uIGEgYm91bmQgcnVuLCBjYXJyeWluZyByZXBsYXktcmVjb3ZlcnkgdGVsZW1ldHJ5LiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRDcmVhdG9yID0gKFxuICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4pID0+IFByb21pc2U8RXZlbnRSZXN1bHQ+O1xuXG4vKipcbiAqIENPUlMgaGVhZGVycyBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcy5cbiAqIEFsbG93cyB0aGUgb2JzZXJ2YWJpbGl0eSBVSSB0byBjaGVjayBlbmRwb2ludCBoZWFsdGggZnJvbSBhIGRpZmZlcmVudCBvcmlnaW4uXG4gKi9cbmNvbnN0IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMgPSB7XG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ1BPU1QsIE9QVElPTlMsIEdFVCwgSEVBRCcsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZScsXG59O1xuXG4vKipcbiAqIFdyYXBzIGEgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGVyIGFuZCBhZGRzIGEgaGVhbHRoIGNoZWNrIFwibW9kZVwiXG4gKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBgX19oZWFsdGhgIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhIZWFsdGhDaGVjayhcbiAgaGFuZGxlcjogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgIGNvbnN0IGlzSGVhbHRoQ2hlY2sgPSB1cmwuc2VhcmNoUGFyYW1zLmhhcygnX19oZWFsdGgnKTtcbiAgICBpZiAoaXNIZWFsdGhDaGVjaykge1xuICAgICAgLy8gSGFuZGxlIENPUlMgcHJlZmxpZ2h0IGZvciBoZWFsdGggY2hlY2tcbiAgICAgIGlmIChyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgaGVhZGVyczogSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGVhbHRoeTogdHJ1ZSxcbiAgICAgICAgICBlbmRwb2ludDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIC4uLkhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RSdW5JZEZyb20oXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsXG4gIHJ1bklkOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBhdHRyaWJ1dGVzPy5bUk9PVF9SVU5fSURfQVRUUklCVVRFXSA/PyBydW5JZDtcbn1cblxuLyoqXG4gKiBUaGUgaW1tdXRhYmxlIHJ1biBpZGVudGl0eSBhIHN0ZXAtZXhlY3V0aW9uIG1lc3NhZ2UgY2FycmllcyBzbyBpdHMgY29uc3VtZXJcbiAqIGNhbiBzdGFydCB0aGUgc3RlcCB3aXRob3V0IGEgYmxvY2tpbmcgYHJ1bnMuZ2V0YCDigJQgc2VlXG4gKiBgUnVuRGlzcGF0Y2hDb250ZXh0U2NoZW1hYCBpbiBAd29ya2Zsb3cvd29ybGQuIEJ1aWx0IGF0IGRpc3BhdGNoIHRpbWUgZnJvbVxuICogdGhlIHJ1biByb3cgdGhlIHByb2R1Y2VyIGFscmVhZHkgaG9sZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5EaXNwYXRjaENvbnRleHQoXG4gIHJ1bjogUGljazxcbiAgICBXb3JrZmxvd1J1bixcbiAgICAncnVuSWQnIHwgJ2RlcGxveW1lbnRJZCcgfCAnc3BlY1ZlcnNpb24nIHwgJ3N0YXJ0ZWRBdCcgfCAnYXR0cmlidXRlcydcbiAgPlxuKTogUnVuRGlzcGF0Y2hDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBkZXBsb3ltZW50SWQ6IHJ1bi5kZXBsb3ltZW50SWQsXG4gICAgc3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbiA/PyAwLFxuICAgIC4uLihydW4uc3RhcnRlZEF0ID8geyBzdGFydGVkQXQ6ICtydW4uc3RhcnRlZEF0IH0gOiB7fSksXG4gICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKHJ1bi5hdHRyaWJ1dGVzLCBydW4ucnVuSWQpLFxuICB9O1xufVxuXG4vKiogRk5WLTFhIDMyLWJpdCBoYXNoIG9mIGEgc3RyaW5nLCBhcyA4IGhleCBjaGFycy4gVGlueSwgZGV0ZXJtaW5pc3RpYywgYW5kXG4gKiAgZGVwZW5kZW5jeS1mcmVlLiBVc2VkIG9ubHkgdG8gc2NvcGUgaWRlbXBvdGVuY3kga2V5cywgbm90IGZvciBzZWN1cml0eS4gKi9cbmZ1bmN0aW9uIGZudjFhMzJIZXgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBoYXNoID0gMHg4MTFjOWRjNTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGhhc2ggXj0gdmFsdWUuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDB4MDEwMDAxOTMpO1xuICB9XG4gIHJldHVybiAoaGFzaCA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICcwJyk7XG59XG5cbi8qKlxuICogSWRlbXBvdGVuY3kga2V5IGZvciBhIHN0ZXAncyBiYWNrZ3JvdW5kLWRpc3BhdGNoIHF1ZXVlIG1lc3NhZ2UsIHNjb3BlZCB0b1xuICogdGhlIHN0ZXAncyBJREVOVElUWSwgY29ycmVsYXRpb24gaWQgcGx1cyAoaGFzaGVkKSBzdGVwIG5hbWUsIHJhdGhlciB0aGFuXG4gKiB0aGUgYmFyZSBjb3JyZWxhdGlvbiBpZC5cbiAqXG4gKiBUaGUgc2NvcGluZyBtYXR0ZXJzIGZvciByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCB1bmRlciB0aGUgcHJlY29uZGl0aW9uXG4gKiBndWFyZDogYSBndWFyZC1yZWplY3RlZCBgc3RlcF9jcmVhdGVkYCBsZWF2ZXMgaXRzIChyZXZva2VkKSBzdGVwIG1lc3NhZ2UgaW5cbiAqIGZsaWdodCwgYW5kIHRoZSBjb3JyZWN0ZWQgcmVwbGF5IG1heSByZS1kZXJpdmUgdGhlIHNhbWUgY29ycmVsYXRpb24gaWQgZm9yXG4gKiBhIERJRkZFUkVOVCBzdGVwLiBVbmRlciBhIGJhcmUtY29ycmVsYXRpb25JZCBrZXkgdGhlIGNvcnJlY3RlZCByZXBsYXknc1xuICogZGlzcGF0Y2ggd291bGQgc2lsZW50bHkgZGVkdXBlIGFnYWluc3QgdGhlIHJldm9rZWQgaW4tZmxpZ2h0IG1lc3NhZ2UsXG4gKiB3aGljaCB0aGVuIHJlc29sdmVzIGBza2lwcGVkYCBhZ2FpbnN0IHRoZSByZS1jcmVhdGVkIGVudGl0eSAodGhlIHNlcnZlcidzXG4gKiBzdGVwTmFtZSBmZW5jZSByZWplY3RzIGl0cyBiYXJlIHN0YXJ0KSwgYW5kIHRoZSBsZWdpdGltYXRlIHN0ZXAgd291bGRcbiAqIG5ldmVyIGJlIGV4ZWN1dGVkLiBTY29waW5nIGJ5IHN0ZXAgbmFtZSBrZWVwcyBldmVyeSBkZWR1cCBwcm9wZXJ0eSB0aGF0XG4gKiBtYXR0ZXJzIChjcmFzaCByZWNvdmVyeSByZS1kaXNwYXRjaCwgY29uY3VycmVudCBoYW5kbGVycywgdGhlIGRlbGF5ZWRcbiAqIHJldHJ5IHNoYXJpbmcgdGhlIHN1c3BlbnNpb24gcmUtZGlzcGF0Y2gncyBrZXk6IGFsbCBuYW1lIHRoZSBzYW1lIHN0ZXApXG4gKiB3aGlsZSBsZXR0aW5nIHRoZSBjb3JyZWN0ZWQgc2NoZWR1bGUncyBkaXNwYXRjaCB0aHJvdWdoLlxuICpcbiAqIEV2ZXJ5IHByb2R1Y2VyIG9mIGEgc3RlcC1kaXNwYXRjaCAob3Igc3RlcC1yZXRyeSkgbWVzc2FnZSBtdXN0IHVzZSB0aGlzXG4gKiBrZXkuIENyb3NzLXZlcnNpb24gbWl4aW5nIGlzIG5vdCBhIGNvbmNlcm46IHF1ZXVlIG1lc3NhZ2VzIGFyZSBwaW5uZWQgdG9cbiAqIHRoZSBkZXBsb3ltZW50IHRoYXQgcHJvZHVjZWQgdGhlbSwgc28gb25lIHJ1biBuZXZlciBzZWVzIHR3byBrZXkgc2NoZW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gIHN0ZXBOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjb3JyZWxhdGlvbklkfToke2ZudjFhMzJIZXgoc3RlcE5hbWUpfWA7XG59XG5cbi8qKlxuICogUXVldWVzIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlIHdpdGggdHJhY2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWVzc2FnZShcbiAgd29ybGQ6IFdvcmxkLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5cbikge1xuICBjb25zdCBxdWV1ZU5hbWUgPSBhcmdzWzBdO1xuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUocXVldWVOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3B1Ymxpc2gnKSxcbiAgICAgICAgLy8gUGVlciBzZXJ2aWNlIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwc1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUGVlclNlcnZpY2UoJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1NlcnZpY2UoJ3ZxcycpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjTWV0aG9kKCdwdWJsaXNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlSWQgfSA9IGF3YWl0IHdvcmxkLnF1ZXVlKC4uLmFyZ3MpO1xuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWVzc2FnZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzZXZlcmFsIG1lc3NhZ2VzIHRvIG9uZSBsb2dpY2FsIHF1ZXVlLCB1c2luZyB0aGUgV29ybGQncyBiYXRjaFxuICogc2VuZCB3aGVuIGl0IGhhcyBvbmUgYW5kIGZhbGxpbmcgYmFjayB0byBjb25jdXJyZW50IHNpbmdsZSBzZW5kcyB3aGVuIGl0XG4gKiBkb2VzIG5vdC5cbiAqXG4gKiBSZWplY3RzIGlmIEFOWSBtZXNzYWdlIGZhaWxlZCB0byBwdWJsaXNoLCBiZWNhdXNlIGV2ZXJ5IGNhbGxlciBzbyBmYXIgd2FudHNcbiAqIGFsbC1vci1ub3RoaW5nOiB0aGUgcmVjb3ZlcnkgaXMgdG8gZmFpbCB0aGUgZGVsaXZlcnkgYW5kIGxldCByZWRlbGl2ZXJ5XG4gKiByZXB1Ymxpc2ggdGhlIHdob2xlIHNldCwgZGVkdXBlZCBieSB0aGUgcGVyLW1lc3NhZ2UgYGlkZW1wb3RlbmN5S2V5YC4gVGhhdFxuICogbWVhbnMgYSBwYXJ0aWFsIGJhdGNoIGNhbiBsZWF2ZSBzb21lIG1lc3NhZ2VzIGFscmVhZHkgb3V0IOKAlCB3aGljaCBpc1xuICogZXhhY3RseSB3aHkgdGhlIGtleXMgYXJlIHJlcXVpcmVkIHJhdGhlciB0aGFuIGFkdmlzb3J5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVNZXNzYWdlcyhcbiAgd29ybGQ6IFdvcmxkLFxuICBxdWV1ZU5hbWU6IFBhcmFtZXRlcnM8dHlwZW9mIHdvcmxkLnF1ZXVlPlswXSxcbiAgbWVzc2FnZXM6IHJlYWRvbmx5IHtcbiAgICBtZXNzYWdlOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5bMV07XG4gICAgb3B0cz86IFBhcmFtZXRlcnM8dHlwZW9mIHdvcmxkLnF1ZXVlPlsyXTtcbiAgfVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBiYXRjaCA9IHdvcmxkLnF1ZXVlQmF0Y2g/LmJpbmQod29ybGQpO1xuICBpZiAoIWJhdGNoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZXNzYWdlcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICBxdWV1ZU1lc3NhZ2Uod29ybGQsIHF1ZXVlTmFtZSwgZW50cnkubWVzc2FnZSwgZW50cnkub3B0cylcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShxdWV1ZU5hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHVibGlzaCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nQmF0Y2hNZXNzYWdlQ291bnQobWVzc2FnZXMubGVuZ3RoKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlBlZXJTZXJ2aWNlKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNTZXJ2aWNlKCd2cXMnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY01ldGhvZCgncHVibGlzaEJhdGNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgYmF0Y2gocXVldWVOYW1lLCBtZXNzYWdlcyk7XG4gICAgICAvLyBBIFdvcmxkIHRoYXQgYW5zd2VycyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgcmVzdWx0cyBoYXMgdG9sZCB1c1xuICAgICAgLy8gbm90aGluZyBhYm91dCB0aGUgbWVzc2FnZXMgaXQgbGVmdCBvdXQuIFRyZWF0ZWQgYXMgYSBmYWlsdXJlIG9mIHRoZVxuICAgICAgLy8gd2hvbGUgYmF0Y2ggcmF0aGVyIHRoYW4gcmVhZCBhcyBzdWNjZXNzIGZvciB0aGUgZW50cmllcyB0aGF0IEFSRVxuICAgICAgLy8gcHJlc2VudDogcmVwdWJsaXNoaW5nIHVuZGVyIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleXMgaXMgc2FmZSxcbiAgICAgIC8vIHNpbGVudGx5IG5ldmVyIGRpc3BhdGNoaW5nIGEgc3RlcCBpcyBub3QgKHRoZSBydW4gbWFrZXMgbm8gcHJvZ3Jlc3NcbiAgICAgIC8vIGFuZCBub3RoaW5nIHN1cmZhY2VzIGFuIGVycm9yKS5cbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPT0gbWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFF1ZXVlIGJhdGNoIGZvciAke3F1ZXVlTmFtZX0gcmV0dXJuZWQgJHtyZXN1bHRzLmxlbmd0aH0gYCArXG4gICAgICAgICAgICAgIGByZXN1bHQocykgZm9yICR7bWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlKHMpYFxuICAgICAgICAgICksXG4gICAgICAgICAgeyByZXRyeWFibGU6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmFpbHVyZXMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQuZXJyb3IgIT09IHVuZGVmaW5lZCk7XG4gICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBjb25zdCByZXRyeWFibGUgPSBmYWlsdXJlcy5zb21lKFxuICAgICAgICAoZmFpbHVyZSkgPT4gZmFpbHVyZS5lcnJvciAhPT0gdW5kZWZpbmVkICYmIGZhaWx1cmUucmV0cnlhYmxlXG4gICAgICApO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcHVibGlzaCAke2ZhaWx1cmVzLmxlbmd0aH0gb2YgJHttZXNzYWdlcy5sZW5ndGh9IHF1ZXVlIGAgK1xuICAgICAgICAgIGBtZXNzYWdlKHMpIHRvICR7cXVldWVOYW1lfTogJHtmYWlsdXJlc1swXT8uZXJyb3J9YFxuICAgICAgKTtcbiAgICAgIC8vIENhcnJpZWQgb24gdGhlIGVycm9yIHNvIGEgY2FsbGVyIENBTiB0ZWxsIGEgdHJhbnNpZW50IHBhcnRpYWwgYmF0Y2hcbiAgICAgIC8vIGZyb20gYSBwZXJtYW5lbnQgcmVqZWN0aW9uLiBOb3RoaW5nIHJlYWRzIGl0IHlldDogdG9kYXkgZXZlcnkgY2FsbGVyXG4gICAgICAvLyByZWplY3RzIHRoZSBkZWxpdmVyeSBlaXRoZXIgd2F5LCBzbyBhIHBlcm1hbmVudGx5IHJlamVjdGVkIGVudHJ5XG4gICAgICAvLyBzdGlsbCBjb3N0cyB0aGUgZnVsbCByZWRlbGl2ZXJ5IGJ1ZGdldC4gTGVmdCBpbiBwbGFjZSBiZWNhdXNlIHRoZVxuICAgICAgLy8gaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaGVyZSwgYW5kIGEgZmFzdC1mYWlsIG9uXG4gICAgICAvLyBgcmV0cnlhYmxlOiBmYWxzZWAgbmVlZHMgaXQuXG4gICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IHJldHJ5YWJsZSB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBxdWV1ZSBvdmVyaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgYSBnaXZlbiBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVldWVPdmVyaGVhZChtZXNzYWdlOiB7IHJlcXVlc3RlZEF0PzogRGF0ZSB9KSB7XG4gIGlmICghbWVzc2FnZS5yZXF1ZXN0ZWRBdCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHJldHVybiBBdHRyaWJ1dGUuUXVldWVPdmVyaGVhZE1zKFxuICAgICAgRGF0ZS5ub3coKSAtIG1lc3NhZ2UucmVxdWVzdGVkQXQuZ2V0VGltZSgpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcnVuJ3MgZnVsbCBwYXlsb2FkLWVuY3J5cHRpb24gY2FwYWJpbGl0eS4gVGhpcyBpbmNsdWRlcyB0aGVcbiAqIHN5bW1ldHJpYyBrZXkgYW5kIFgyNTUxOSBrZXlwYWlyIG5lZWRlZCB0byBvcGVuIGNyb3NzLXJ1biBzZWFsZWQgcGF5bG9hZHMuXG4gKiBNaXNzaW5nIHdvcmxkIHN1cHBvcnQgb3Iga2V5IG1hdGVyaWFsIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgOyBsb29rdXAgYW5kXG4gKiBkZXJpdmF0aW9uIGZhaWx1cmVzIHByb3BhZ2F0ZSByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWxsaW5nIGJhY2sgdG8gcGxhaW50ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmcsXG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJhd0tleSA9XG4gICAgdHlwZW9mIHJ1bk9ySWQgPT09ICdzdHJpbmcnXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkLCBjb250ZXh0KVxuICAgICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZCk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGxhenksIG1lbW9pemVkIGFjY2Vzc29yIGFyb3VuZCB7QGxpbmsgcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXl9LlxuICogQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBzYW1lIHByb21pc2UsIGluY2x1ZGluZyBpdHMgcmVqZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmdcbik6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBsZXQgY2FjaGVkOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSByZXNvbHZlUnVuRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuT3JJZCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH07XG59XG4iXX0=
1027
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFZMUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsd0RBQXdEO0FBQ3hELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7Ozs7R0FNRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsMkJBQTJCLENBQUM7QUFFL0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsWUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZ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Ozs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsS0FBWSxFQUNaLE9BQTZCO0lBRTdCLElBQUksTUFBbUQsQ0FBQztJQUN4RCxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVFdmVudFBhcmFtcyxcbiAgQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgUnVuRGlzcGF0Y2hDb250ZXh0LFxuICBWYWxpZFF1ZXVlTmFtZSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgRklSU1RfRVZFTlRfU0xPVCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLFxuICBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHJlcXVpcmVFdmVudFNsb3QsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGJ5dGVzVG9CYXNlNjQsIGRlcml2ZVJ1bktleVBhaXIgfSBmcm9tICcuLi9zZWFsZWQtYm94LmpzJztcbmltcG9ydCB7XG4gIGRlcml2ZVJ1blBheWxvYWRLZXlzLFxuICB0eXBlIFBheWxvYWRLZXksXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldFNwYW5LaW5kLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IGZvciBoZWFsdGggY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAqL1xuY29uc3QgREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVCA9IDMwXzAwMDtcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBzYWZlIHdvcmtmbG93IG5hbWVzLiBPbmx5IGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAqIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMgKGZvciBuYW1lc3BhY2VkIHdvcmtmbG93cyksXG4gKiBhdCBzaWducyAoZm9yIHNjb3BlZCBwYWNrYWdlcyksIGFuZCBwYXJlbnRoZXNlcyBhbmQgc3F1YXJlIGJyYWNrZXRzIChmb3JcbiAqIE5leHQuanMgcm91dGUgZ3JvdXBzIGFuZCBkeW5hbWljIHNlZ21lbnRzLCB3aGljaCBhcHBlYXIgdmVyYmF0aW0gaW4gdGhlXG4gKiBtb2R1bGUgcGF0aCBhIHdvcmtmbG93IG5hbWUgaXMgZGVyaXZlZCBmcm9tKS5cbiAqL1xuY29uc3QgU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4gPSAvXlthLXpBLVowLTlfXFwtLi9AKClbXFxdXSskLztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB3b3JrZmxvdyBuYW1lIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXVlIG5hbWUuXG4gKiBFbnN1cmVzIHRoZSB3b3JrZmxvdyBuYW1lIG9ubHkgY29udGFpbnMgc2FmZSBjaGFyYWN0ZXJzIGJlZm9yZVxuICogaW50ZXJwb2xhdGluZyBpdCBpbnRvIHRoZSBxdWV1ZSBuYW1lIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UXVldWVOYW1lKFxuICB3b3JrZmxvd05hbWU6IHN0cmluZyxcbiAgbmFtZXNwYWNlPzogc3RyaW5nXG4pOiBWYWxpZFF1ZXVlTmFtZSB7XG4gIGlmICghU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4udGVzdCh3b3JrZmxvd05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgd29ya2Zsb3cgbmFtZSBcIiR7d29ya2Zsb3dOYW1lfVwiOiBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcywgYXQgc2lnbnMsIHBhcmVudGhlc2VzLCBvciBzcXVhcmUgYnJhY2tldHNgXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KFxuICAgICd3b3JrZmxvdycsXG4gICAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgKTtcbiAgcmV0dXJuIGAke3ByZWZpeH0ke3dvcmtmbG93TmFtZX1gIGFzIFZhbGlkUXVldWVOYW1lO1xufVxuXG5jb25zdCBnZW5lcmF0ZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmVhbSBuYW1lIGZvciBhIGhlYWx0aCBjaGVjayB3aXRoIHRoZSBnaXZlbiBjb3JyZWxhdGlvbiBJRC5cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgX19oZWFsdGhfY2hlY2tfXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIGhlYWx0aCBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tSZXN1bHQge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSBpZiBoZWFsdGggY2hlY2sgZmFpbGVkICovXG4gIGVycm9yPzogc3RyaW5nO1xuICAvKiogTGF0ZW5jeSBpZiB0aGUgaGVhbHRoIGNoZWNrIHdhcyBzdWNjZXNzZnVsICovXG4gIGxhdGVuY3lNcz86IG51bWJlcjtcbiAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50ICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQsIHVzZWQgZm9yXG4gICAqIGNhcGFiaWxpdHkgZGV0ZWN0aW9uIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2ApLiBPbWl0dGVkIHdoZW4gdGhlXG4gICAqIHJlc3BvbmRpbmcgZGVwbG95bWVudCBkaWQgbm90IHByb3ZpZGUgdGhlIGZpZWxkIGFzIGEgc3RyaW5nOlxuICAgKiBmb3IgZXhhbXBsZSwgYW4gb2xkZXIgYEB3b3JrZmxvdy9jb3JlYCB0aGF0IHByZWRhdGVzIHRoaXMgZmllbGQsXG4gICAqIG9yIGEgbm9uLUpTT04gcGxhaW4tdGV4dCBoZWFsdGggcmVzcG9uc2UuXG4gICAqL1xuICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRhcmdldCBydW4ncyBYMjU1MTkgcHVibGljIGtleSAoYmFzZTY0KSwgcmV0dXJuZWQgb25seSB3aGVuIHRoZSBwcm9iZVxuICAgKiBjYXJyaWVkIGEgYHJ1bklkYCBhbmQgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCBoYXMgZW5jcnlwdGlvbiBlbmFibGVkLlxuICAgKlxuICAgKiBMZXRzIGEgY3Jvc3MtZGVwbG95bWVudCBgc3RhcnQoKWAgc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHVzaW5nIGFcbiAgICogcmVzcG9uc2UgaXQgd2FzIGFscmVhZHkgd2FpdGluZyBvbiwgaW5zdGVhZCBvZiBtYWtpbmcgYSBzZXBhcmF0ZVxuICAgKiBrZXktbG9va3VwIHJlcXVlc3QuXG4gICAqL1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCdzIGBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OYDogdGhlIHByb3RvY29sXG4gICAqIHZlcnNpb24gYXQgd2hpY2ggdGhlICpjb25zdW1lciogKHF1ZXVlLW1lc3NhZ2UgdGFyZ2V0KSBtYXRlcmlhbGl6ZXMgdGhlXG4gICAqIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQSBjcm9zcy1kZXBsb3ltZW50XG4gICAqIGBzdGFydCgpYCBzdGFtcHMgdGhlICp0YXJnZXQncyogdmFsdWUgKG5vdCB0aGUgY2FsbGVyJ3MpIGludG8gdGhlIG5ld1xuICAgKiBydW4ncyBgZXhlY3V0aW9uQ29udGV4dC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uYC4gQ3VycmVudCBwcm9kdWNlcnMgd3JpdGVcbiAgICogdGhlIGV2ZW50IGR1cmFibHkgYmVmb3JlIHB1Ymxpc2hpbmcgdGhlIHdha2UgYW5kIGRvIG5vdCByZWFkIHRoZSBtYXJrZXI7XG4gICAqIE9MREVSIHByb2R1Y2VycyBzdGlsbCBnYXRlIHRoZWlyIGxhenkgcGF0aCBvbiBpdCwgc28gaXQga2VlcHMgYmVpbmdcbiAgICogc3RhbXBlZC4gT21pdHRlZCB3aGVuIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgcHJlZGF0ZXMgdGhpcyBmaWVsZCxcbiAgICogd2hpY2ggZmFpbHMgdGhhdCBnYXRlIGNsb3NlZC5cbiAgICovXG4gIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgaGVhbHRoIGNoZWNrIHBheWxvYWQuXG4gKiBJZiBzbywgcmV0dXJucyB0aGUgcGFyc2VkIHBheWxvYWQuIE90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKFxuICBtZXNzYWdlOiB1bmtub3duXG4pOiBIZWFsdGhDaGVja1BheWxvYWQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQgPSBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEuc2FmZVBhcnNlKG1lc3NhZ2UpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZm9yIGhlYWx0aCBjaGVjayBzdHJlYW1zLlxuICogQm90aCB0aGUgd3JpdGVyIChoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UpIGFuZCByZWFkZXIgKGhlYWx0aENoZWNrKSBkZXJpdmVcbiAqIHRoZSBzYW1lIHJ1bklkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzY29wZVxuICogc3RyZWFtIHJlYWRzIGJ5IHJ1bklkIHN0aWxsIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB3cnVuX2hjXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZSBieSB3cml0aW5nIHRoZSByZXN1bHQgdG8gdGhlIHdvcmxkJ3Mgc3RyZWFtLlxuICogVGhlIGNhbGxlciBjYW4gbGlzdGVuIHRvIHRoaXMgc3RyZWFtIHRvIGdldCB0aGUgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBoZWFsdGhDaGVjayAtIFRoZSBwYXJzZWQgaGVhbHRoIGNoZWNrIHBheWxvYWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgaGVhbHRoQ2hlY2s6IEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG5cbiAgLy8gV2hlbiB0aGUgcHJvYmUgbmFtZXMgYSBydW4gdGhlIGNhbGxlciBpcyBhYm91dCB0byBjcmVhdGUsIHB1Ymxpc2ggdGhhdFxuICAvLyBydW4ncyBwdWJsaWMga2V5LiBXZSBhcmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIGl0c1xuICAvLyBrZXkgbWF0ZXJpYWwgaXMgYXZhaWxhYmxlIGxvY2FsbHkgKG5vIEFQSSBjYWxsKSwgYW5kIHRoZSBjYWxsZXIgY2FuIHRoZW5cbiAgLy8gc2VhbCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzIHN0cmFpZ2h0IGZyb20gdGhpcyByZXNwb25zZSByYXRoZXIgdGhhblxuICAvLyBtYWtpbmcgYSBzZXBhcmF0ZSBrZXktbG9va3VwIHJlcXVlc3QuXG4gIC8vXG4gIC8vIE9ubHkgYSAqcHVibGljKiBrZXkgbWF5IHRyYXZlbCB0aGlzIHdheTogdGhlIHByb2JlIHJlc3BvbnNlIHN0cmVhbSBpc1xuICAvLyBkZWxpYmVyYXRlbHkgdW5hdXRoZW50aWNhdGVkLCBzbyBhbnl0aGluZyBzZWNyZXQgd291bGQgYmUgZXhwb3NlZC5cbiAgLy8gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGhlYWx0aCBjaGVjayBpdHNlbGYsIHdoaWNoXG4gIC8vIGNhbGxlcnMgYWxzbyByZWx5IG9uIGZvciBwbGFpbiBjYXBhYmlsaXR5IGRldGVjdGlvbi5cbiAgbGV0IGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGhlYWx0aENoZWNrLnJ1bklkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihoZWFsdGhDaGVjay5ydW5JZCk7XG4gICAgICBpZiAocmF3S2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25QdWJsaWNLZXkgPSBieXRlc1RvQmFzZTY0KFxuICAgICAgICAgIChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSGVhbHRoIGNoZWNrIGNvdWxkIG5vdCBkZXJpdmUgYSBydW4gcHVibGljIGtleTsgdGhlIGNhbGxlciB3aWxsIGZhbGwgYmFjayB0byBhIGtleSBsb29rdXAnLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGhlYWx0aHk6IHRydWUsXG4gICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gdGhpcyBjb25zdGFudCByZWZsZWN0c1xuICAgIC8vIHRoZSAqY29uc3VtZXIncyogaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiwgZXhhY3RseSB3aGF0IGFcbiAgICAvLyBjcm9zcy1kZXBsb3ltZW50IGNhbGxlciBuZWVkcyB0byBnYXRlIGl0cyBwYXJhbGxlbCByZXN1bWUgcGF0aCBvbi5cbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OLFxuICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICB9KTtcbiAgLy8gVXNlIGEgZGV0ZXJtaW5pc3RpYyBmYWtlIHJ1bklkIGRlcml2ZWQgZnJvbSB0aGUgY29ycmVsYXRpb25JZCBzbyB0aGF0XG4gIC8vIHRoZSByZWFkZXIgc2lkZSBwcm9kdWNlcyB0aGUgc2FtZSB2YWx1ZS5cbiAgY29uc3QgZmFrZVJ1bklkID0gZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSwgcmVzcG9uc2UpO1xuICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKGZha2VSdW5JZCwgc3RyZWFtTmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tPcHRpb25zIHtcbiAgLyoqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZS4gRGVmYXVsdDogMzAwMDAgKDMwcykgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIERlcGxveW1lbnQgSUQgdG8gc2VuZCB0aGUgaGVhbHRoIGNoZWNrIHRvLiBGYWxscyBiYWNrIHRvIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lELiAqL1xuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuIGlkIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gY3JlYXRlLiBXaGVuIHNldCwgdGhlIHJlc3BvbmRpbmdcbiAgICogZGVwbG95bWVudCBkZXJpdmVzIHRoYXQgcnVuJ3MgcHVibGljIGtleSBsb2NhbGx5IGFuZCByZXR1cm5zIGl0IGFzXG4gICAqIGBlbmNyeXB0aW9uUHVibGljS2V5YCwgbGV0dGluZyBhIGNyb3NzLWRlcGxveW1lbnQgYHN0YXJ0KClgIHNlYWwgdGhlXG4gICAqIHdvcmtmbG93IGFyZ3VtZW50cyB3aXRob3V0IGEgc2VwYXJhdGUga2V5IGxvb2t1cC5cbiAgICovXG4gIHJ1bklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIG9mIHRoZSB0YXJnZXQgZGVwbG95bWVudCAoZS5nLiBgJ2V2ZSdgIGZvciB0b3BpY3MgbGlrZVxuICAgKiBgX19ldmVfd2tmX3dvcmtmbG93XypgKS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLiBDcm9zcy1jb250ZXh0IGNhbGxlcnMgKGUuZy4gdGhlIG9ic2VydmFiaWxpdHlcbiAgICogZGFzaGJvYXJkKSBtdXN0IHBhc3MgdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgbmFtZXNwYWNlIGV4cGxpY2l0bHk6XG4gICAqIHRoZSBlbnYgZmFsbGJhY2sgcmVzb2x2ZXMgaW4gdGhlIGNhbGxlcidzIHByb2Nlc3MsIGFuZCBhIG1lc3NhZ2VcbiAgICogcHVibGlzaGVkIHRvIGEgbWlzbWF0Y2hlZCB0b3BpYyBoYXMgbm8gY29uc3VtZXIsIHNvIHRoZSBjaGVjayB3b3VsZFxuICAgKiBhbHdheXMgdGltZSBvdXQuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBoZWFsdGggY2hlY2sgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgcXVldWUgcGlwZWxpbmVcbiAqIGFuZCB2ZXJpZnlpbmcgaXQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBjb21iaW5lZCB3b3JrZmxvdyBlbmRwb2ludC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ5cGFzc2VzIERlcGxveW1lbnQgUHJvdGVjdGlvbiBvbiBWZXJjZWwgYmVjYXVzZSBpdCBnb2VzXG4gKiB0aHJvdWdoIHRoZSBxdWV1ZSBpbmZyYXN0cnVjdHVyZSByYXRoZXIgdGhhbiBkaXJlY3QgSFRUUC5cbiAqXG4gKiBAcGFyYW0gd29ybGQgLSBUaGUgV29ybGQgaW5zdGFuY2UgdG8gdXNlIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlYWx0aCBjaGVjayByZXN1bHRcbiAqL1xuLy8gUG9sbCBpbnRlcnZhbCBmb3IgaGVhbHRoIGNoZWNrIHJldHJpZXMgKG1zKVxuY29uc3QgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwgPSAxMDA7XG4vLyBQZXItcmVhZCB0aW1lb3V0IHRvIHByZXZlbnQgYmxvY2tpbmcgZm9yZXZlciBvbiBsb2NhbCB3b3JsZCdzIEV2ZW50RW1pdHRlclxuLy8gKHdoaWNoIGRvZXNuJ3Qgd29yayBhY3Jvc3MgcHJvY2Vzc2VzKVxuY29uc3QgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVCA9IDUwMDtcblxuLyoqXG4gKiBSZWFkIGNodW5rcyBmcm9tIGEgc3RyZWFtIHdpdGggYSB0aW1lb3V0IHBlciByZWFkIG9wZXJhdGlvbi5cbiAqIFJldHVybnMgeyBjaHVua3MsIHRpbWVkT3V0IH0gd2hlcmUgdGltZWRPdXQgaW5kaWNhdGVzIGlmIGEgcmVhZCB0aW1lZCBvdXQuXG4gKi9cbi8qKlxuICogUmFjZSBhIHByb21pc2UgYWdhaW5zdCBhIGRlYWRsaW5lLiBSZWplY3RzIHdpdGggYSB0aW1lb3V0IGVycm9yIHdoZW4gdGhlXG4gKiBkZWFkbGluZSBlbGFwc2VzIGZpcnN0LiBVc2VkIHRvIGJvdW5kIGB3b3JsZC5zdHJlYW1zLmdldCgpYCBpbnNpZGUgdGhlXG4gKiBoZWFsdGgtY2hlY2sgcG9sbCBsb29wOiBzb21lIHdvcmxkcyBob2xkIHRoYXQgcmVxdWVzdCBvcGVuIHVudGlsIHRoZVxuICogc3RyZWFtIGhhcyBkYXRhIChlLmcuIHdvcmtmbG93LXNlcnZlciBob2xkcyB1bndyaXR0ZW4gc3RyZWFtcyBvcGVuIGZvclxuICogfjIgbWludXRlcyksIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBibG93IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgaGVhbHRoXG4gKiBjaGVjayB0aW1lb3V0LCBzaW5jZSB0aGUgYHdoaWxlYCBjb25kaXRpb24gaXMgb25seSByZS1jaGVja2VkIGJldHdlZW5cbiAqIGl0ZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHdpdGhEZWFkbGluZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHByb21pc2UsXG4gICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgT3BlcmF0aW9uIHRpbWVkIG91dCBhZnRlciAke21zfW1zYCkpLFxuICAgICAgICBtc1xuICAgICAgKTtcbiAgICB9KSxcbiAgXSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbVdpdGhUaW1lb3V0KFxuICByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PixcbiAgcmVhZFRpbWVvdXQ6IG51bWJlclxuKTogUHJvbWlzZTx7IGNodW5rczogVWludDhBcnJheVtdOyB0aW1lZE91dDogYm9vbGVhbiB9PiB7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGxldCB0aW1lZE91dCA9IGZhbHNlO1xuXG4gIHdoaWxlICghZG9uZSAmJiAhdGltZWRPdXQpIHtcbiAgICBjb25zdCByZWFkUHJvbWlzZSA9IHJlYWRlci5yZWFkKCk7XG4gICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTx7IGRvbmU6IHRydWU7IHZhbHVlOiB1bmRlZmluZWQgfT4oXG4gICAgICAocmVzb2x2ZSkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZWRPdXQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9LCByZWFkVGltZW91dClcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZWFkUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICBkb25lID0gcmVzdWx0LmRvbmU7XG4gICAgaWYgKHJlc3VsdC52YWx1ZSkgY2h1bmtzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7IGNodW5rcywgdGltZWRPdXQgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBoZWFsdGggY2hlY2sgcmVzcG9uc2UgZnJvbSBzdHJlYW0gY2h1bmtzLlxuICogUmV0dXJucyB0aGUgcGFyc2VkIHJlc3BvbnNlIG9yIG51bGwgaWYgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VIZWFsdGhDaGVja1Jlc3BvbnNlKGNodW5rczogVWludDhBcnJheVtdKToge1xuICBoZWFsdGh5OiBib29sZWFuO1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbn0gfCBudWxsIHtcbiAgaWYgKGNodW5rcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgoc3VtLCBjaHVuaykgPT4gc3VtICsgY2h1bmsubGVuZ3RoLCAwKTtcbiAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGNvbWJpbmVkLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb21iaW5lZCk7XG5cbiAgbGV0IHJlc3BvbnNlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBPbGQgZGVwbG95bWVudHMgKHNwZWNWZXJzaW9uIDwgMykgcmV0dXJuIHBsYWluIHRleHQgbGlrZVxuICAgIC8vICdXb3JrZmxvdyBTREsgXCIuLi5cIiBlbmRwb2ludCBpcyBoZWFsdGh5Jy4gVHJlYXQgYW55IG5vbi1lbXB0eVxuICAgIC8vIHRleHQgcmVzcG9uc2UgYXMgYSBoZWFsdGh5IGRlcGxveW1lbnQgd2l0aCB1bmtub3duIHNwZWNWZXJzaW9uLlxuICAgIGlmIChyZXNwb25zZVRleHQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgaGVhbHRoeTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcmVzcG9uc2UgIT09ICdvYmplY3QnIHx8XG4gICAgcmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAhKCdoZWFsdGh5JyBpbiByZXNwb25zZSkgfHxcbiAgICB0eXBlb2YgKHJlc3BvbnNlIGFzIHsgaGVhbHRoeTogdW5rbm93biB9KS5oZWFsdGh5ICE9PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByID0gcmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHBhcnNlZDoge1xuICAgIGhlYWx0aHk6IGJvb2xlYW47XG4gICAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb24/OiBudW1iZXI7XG4gIH0gPSB7XG4gICAgaGVhbHRoeTogci5oZWFsdGh5IGFzIGJvb2xlYW4sXG4gIH07XG4gIGlmICh0eXBlb2Ygci5zcGVjVmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJzZWQuc3BlY1ZlcnNpb24gPSByLnNwZWNWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci53b3JrZmxvd0NvcmVWZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC53b3JrZmxvd0NvcmVWZXJzaW9uID0gci53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICB9XG4gIGlmICh0eXBlb2Ygci5lbmNyeXB0aW9uUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgIHBhcnNlZC5lbmNyeXB0aW9uUHVibGljS2V5ID0gci5lbmNyeXB0aW9uUHVibGljS2V5O1xuICB9XG4gIGlmICh0eXBlb2Ygci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gci5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoZWFsdGhDaGVjayhcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRpb25zPzogSGVhbHRoQ2hlY2tPcHRpb25zXG4pOiBQcm9taXNlPEhlYWx0aENoZWNrUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQ7XG4gIC8vIFVzZSB0aGUgd29ybGQncyBJRCBnZW5lcmF0b3Igd2hlbiBhdmFpbGFibGUgc28gdGhlIGNvcnJlbGF0aW9uSWQgaXMgYVxuICAvLyByZWdpb24tdGFnZ2VkIFVMSUQuIFRoZSBoZWFsdGgtY2hlY2sgcmVzcG9uc2UgaXMgZGVsaXZlcmVkIG92ZXIgYSBzdHJlYW1cbiAgLy8gd2hvc2UgbmFtZSBlbWJlZHMgdGhpcyBjb3JyZWxhdGlvbklkOyB1bmRlciBwbGF0Zm9ybS1kaXJlY3RlZCByb3V0aW5nIHRoZVxuICAvLyByZWFkZXIgYW5kIHRoZSByZXNwb25kaW5nIGVuZHBvaW50IGNhbiBiZSBzZXJ2ZWQgZnJvbSBkaWZmZXJlbnQgcGh5c2ljYWxcbiAgLy8gcmVnaW9ucywgc28gdGhlIHJlZ2lvbiBtdXN0IGJlIGVuY29kZWQgaW4gdGhlIElEIGl0c2VsZiBmb3IgYm90aCBzaWRlcyB0b1xuICAvLyByZXNvbHZlIHRoZSBzYW1lIChyZWdpb24tcGlubmVkKSBiYWNrZW5kLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gVUxJRCBmb3JcbiAgLy8gd29ybGRzIHRoYXQgZG9uJ3QgdGFnIElEcyAoZS5nLiBsb2NhbCksIHdoaWNoIHJlc29sdmUgdG8gdGhlIGRlZmF1bHRcbiAgLy8gcmVnaW9uIG9uIGJvdGggc2lkZXMuXG4gIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB3b3JsZC5jcmVhdGVSdW5JZD8uKCkgPz8gZ2VuZXJhdGVJZCgpO1xuICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGNvcnJlbGF0aW9uSWQpO1xuXG4gIGNvbnN0IHF1ZXVlTmFtZSA9XG4gICAgYCR7Z2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKSl9aGVhbHRoX2NoZWNrYCBhcyBWYWxpZFF1ZXVlTmFtZTtcblxuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICBxdWV1ZU5hbWUsXG4gICAgICB7XG4gICAgICAgIF9faGVhbHRoQ2hlY2s6IHRydWUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIC4uLihvcHRpb25zPy5ydW5JZCA/IHsgcnVuSWQ6IG9wdGlvbnMucnVuSWQgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFVzZSBKU09OIHRyYW5zcG9ydCBzbyB0aGUgaGVhbHRoIGNoZWNrIHdvcmtzIGFnYWluc3QgYm90aFxuICAgICAgICAvLyBvbGQgKEpTT04tb25seSkgYW5kIG5ldyAoZHVhbCkgZGVwbG95bWVudHMuXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICBkZXBsb3ltZW50SWQ6IG9wdGlvbnM/LmRlcGxveW1lbnRJZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aW1lb3V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdpdGhEZWFkbGluZShcbiAgICAgICAgICB3b3JsZC5zdHJlYW1zLmdldChcbiAgICAgICAgICAgIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkKSxcbiAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlbWFpbmluZ01zXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgeyBjaHVua3MsIHRpbWVkT3V0IH0gPSBhd2FpdCByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gICAgICAgICAgcmVhZGVyLFxuICAgICAgICAgIEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNhbmNlbCBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3MpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBIZWFsdGggY2hlY2sgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2AsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICByZXR1cm4gbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICBgRXZlbnQgcGFnaW5hdGlvbiAke21lc3NhZ2V9IGZvciB3b3JrZmxvdyBydW4gXCIke3J1bklkfVwiLmAsXG4gICAgeyBjb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmRSZXF1ZXN0ZWRFdmVudEN1cnNvcihcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICByZXF1ZXN0ZWRDdXJzb3JzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmICghY3Vyc29yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWRDdXJzb3JzLmhhcyhjdXJzb3IpKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihydW5JZCwgJ2RpZCBub3QgYWR2YW5jZScpO1xuICB9XG4gIHJlcXVlc3RlZEN1cnNvcnMuYWRkKGN1cnNvcik7XG59XG5cbi8qKlxuICogQXBwZW5kcyBldmVudHMgd2hvc2UgSURzIGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluIGB0YXJnZXRgLlxuICpcbiAqIFBhc3MgdGhlIElEcyBjdXJyZW50bHkgcHJlc2VudCBpbiBgdGFyZ2V0YCB3aGVuIGFwcGVuZGluZyByZXBlYXRlZGx5IHRvIHRoZVxuICogc2FtZSBhcnJheS4gVGhlIHNldCBpcyB1cGRhdGVkIGFsb25nc2lkZSBgdGFyZ2V0YC5cbiAqXG4gKiBFdmVudHMgYXJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGUgV29ybGQgcmV0dXJuZWQgdGhlbSwgYW5kIGFyZSBub3RcbiAqIHJlLXNvcnRlZC4gRXZlcnkgYXBwZW5kIHNvdXJjZSBpcyBhbHJlYWR5IGluIGNhbm9uaWNhbCBvcmRlciByZWxhdGl2ZSB0byB0aGVcbiAqIHRhaWwgKGEgY3Vyc29yLWRlbGltaXRlZCBwYWdlLCBvciBhIHdyaXRlLXJlc3BvbnNlIGRlbHRhKSwgc28gcmVjZWlwdCBvcmRlciBpc1xuICogdGhlIG9yZGVyIHRvIGtlZXAsIGFuZCByZS1zb3J0aW5nIGhlcmUgd291bGQgb25seSBjb3N0IGEgcGFzcyBvdmVyIHRoZSBsb2cuXG4gKiBOb3RoaW5nIGRvd25zdHJlYW0gbWF5IGFzc3VtZSB0aGUgdGFpbCBpcyB0aGUgbmV3ZXN0IGV2ZW50LiBTZWVcbiAqIHtAbGluayBtYXhFdmVudFNsb3R9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kVW5pcXVlRXZlbnRzKFxuICB0YXJnZXQ6IEV2ZW50W10sXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSxcbiAgdGFyZ2V0SWRzPzogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IHRhcmdldElkcyA/PyBuZXcgU2V0KHRhcmdldC5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKSk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGlkcy5oYXMoZXZlbnQuZXZlbnRJZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZHMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIHRhcmdldC5wdXNoKGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydHMgYGV2ZW50YCBpbnRvIGB0YXJnZXRgIGF0IHRoZSBwb3NpdGlvbiB0aGF0IGtlZXBzIGB0YXJnZXRgIG9yZGVyZWQgYnlcbiAqIGFzY2VuZGluZyBgZXZlbnRJZGAsIG9yIG5vLW9wcyBpZiBhbiBldmVudCB3aXRoIHRoZSBzYW1lIGBldmVudElkYCBpcyBhbHJlYWR5XG4gKiBwcmVzZW50IChpZGVtcG90ZW50KS5cbiAqXG4gKiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBsb2FkZWQgYHNvcnRPcmRlcjogJ2FzYydgIGFuZCBpcyBuZXZlciByZS1zb3J0ZWRcbiAqIGNsaWVudC1zaWRlLCBzbyBhIGBob29rX3JlY2VpdmVkYCBzcGxpY2VkIGluIGJ5IHRoZSBsYXp5LXJlc3VtZSBjb25zdW1lciBtdXN0XG4gKiBsYW5kIGluIGBldmVudElkYCBvcmRlcjogYSBwbGFpbiBgcHVzaGAgd291bGQgcGxhY2UgYSBsYXRlLWNvbW1pdHRpbmdcbiAqIGVhcmxpZXIgZXZlbnQgYWZ0ZXIgZXZlbnRzIHRoYXQgc29ydCBiZWZvcmUgaXQsIGNvcnJ1cHRpbmcgcmVwbGF5LlxuICpcbiAqIExleGljb2dyYXBoaWMgc3RyaW5nIG9yZGVyIGlzIHRoZSBsb2cncyBvcmRlcjogYSBzbG90IGlkIGlzIGEgZml4ZWQtd2lkdGhcbiAqIHplcm8tcGFkZGVkIHBvc2l0aW9uLCBzbyBjb21wYXJpbmcgdGhlIHN0cmluZ3MgY29tcGFyZXMgdGhlIHBvc2l0aW9ucy4gVGhpc1xuICogbmVlZHMgbm8gcGFyc2Ugb2YgaXRzIG93biBmb3IgdGhhdCByZWFzb24sIGFuZCB0aGUgY29tcGFyaXNvbiBpcyBleGFjdCByYXRoZXJcbiAqIHRoYW4gYSByZWNvbnN0cnVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEV2ZW50QnlFdmVudElkKHRhcmdldDogRXZlbnRbXSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIC8vIExpbmVhciBzY2FuIGZyb20gdGhlIGVuZDogdGhlIHNwbGljZWQgZXZlbnQgaXMgYWxtb3N0IGFsd2F5cyB0aGUgbmV3ZXN0XG4gIC8vIChpdCBzb3J0cyBhdCBvciBuZWFyIHRoZSB0YWlsKSwgc28gdGhpcyBmaW5kcyB0aGUgc2xvdCBpbiBPKDEp4oCTTyhrKSBmb3IgdGhlXG4gIC8vIGNvbW1vbiBjYXNlIHdoaWxlIHN0aWxsIGhhbmRsaW5nIGFuIG91dC1vZi1vcmRlciBsYXRlIGFycml2YWwgY29ycmVjdGx5LlxuICBsZXQgaSA9IHRhcmdldC5sZW5ndGg7XG4gIHdoaWxlIChpID4gMCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGFyZ2V0W2kgLSAxXTtcbiAgICBpZiAoZXhpc3RpbmcuZXZlbnRJZCA9PT0gZXZlbnQuZXZlbnRJZCkge1xuICAgICAgLy8gQWxyZWFkeSBwcmVzZW50OiBrZWVwIHRoZSBzcGxpY2UgaWRlbXBvdGVudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV4aXN0aW5nLmV2ZW50SWQgPCBldmVudC5ldmVudElkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaS0tO1xuICB9XG4gIHRhcmdldC5zcGxpY2UoaSwgMCwgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRFdmVudFBhZ2luYXRpb25Qcm9ncmVzcyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaGFzTW9yZTogYm9vbGVhbixcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICByZXF1ZXN0ZWRDdXJzb3JzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmICghaGFzTW9yZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY3Vyc29yID09PSBudWxsKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihcbiAgICAgIHJ1bklkLFxuICAgICAgJ3JldHVybmVkIG1vcmUgcGFnZXMgd2l0aG91dCBhIGN1cnNvcidcbiAgICApO1xuICB9XG4gIGlmIChyZXF1ZXN0ZWRDdXJzb3JzLmhhcyhjdXJzb3IpKSB7XG4gICAgdGhyb3cgZXZlbnRQYWdpbmF0aW9uQ29udHJhY3RFcnJvcihydW5JZCwgJ3JlcGVhdGVkIGEgY3Vyc29yJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUmV0cnlXaXRob3V0RXZlbnRDdXJzb3IoXG4gIGVycm9yOiB1bmtub3duLFxuICBjdXJzb3I6IHN0cmluZyB8IG51bGwsXG4gIGFscmVhZHlSZXRyaWVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjdXJzb3IgIT09IG51bGwgJiZcbiAgICAhYWxyZWFkeVJldHJpZWQgJiZcbiAgICBXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyb3IpICYmXG4gICAgZXJyb3Iuc3RhdHVzID09PSA0MDBcbiAgKTtcbn1cblxuLyoqXG4gKiBMb2FkcyB3b3JrZmxvdyBydW4gZXZlbnRzIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBwYWdlcyBvZiBwYWdpbmF0ZWRcbiAqIHJlc3VsdHMuIEV2ZW50cyBhcmUgcmV0dXJuZWQgaW4gY2hyb25vbG9naWNhbCAoYXNjZW5kaW5nKSBvcmRlciBmb3JcbiAqIGRldGVybWluaXN0aWMgd29ya2Zsb3cgcmVwbGF5LlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQuXG4gKiBAcGFyYW0gYWZ0ZXJDdXJzb3IgLSBJZiBwcm92aWRlZCwgb25seSBldmVudHMgYWZ0ZXIgdGhpcyBjdXJzb3IgYXJlXG4gKiAgIHJldHVybmVkIChpbmNyZW1lbnRhbCBsb2FkKS4gSWYgb21pdHRlZCwgYWxsIGV2ZW50cyBhcmUgcmV0dXJuZWQuXG4gKiAgIFRoZSByZXR1cm5lZCBjdXJzb3IgY2FuIGJlIHBhc3NlZCBiYWNrIGluIG9uIGEgc3Vic2VxdWVudCBjYWxsIGZvclxuICogICBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICBydW5JZDogc3RyaW5nLFxuICBhZnRlckN1cnNvcj86IHN0cmluZ1xuKTogUHJvbWlzZTxMb2FkZWRFdmVudExvZz4ge1xuICBjb25zdCBpbmNyZW1lbnRhbCA9IGFmdGVyQ3Vyc29yICE9PSB1bmRlZmluZWQ7XG4gIHJldHVybiB0cmFjZSgnd29ya2Zsb3cucmVwbGF5LmxvYWQnLCBhc3luYyAoc3BhbikgPT4ge1xuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UmVwbGF5TG9hZFNvdXJjZShcbiAgICAgICAgaW5jcmVtZW50YWwgPyAnZXZlbnRzX2xpc3RfaW5jcmVtZW50YWwnIDogJ2V2ZW50c19saXN0J1xuICAgICAgKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGxvYWRlZEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGNvbnN0IGxvYWRlZEV2ZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBhZnRlckN1cnNvciA/PyBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcbiAgICBsZXQgcGFnZXNMb2FkZWQgPSAwO1xuICAgIGxldCByZXRyaWVkV2l0aG91dEN1cnNvciA9IGZhbHNlO1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgbG9hZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoaGFzTW9yZSkge1xuICAgICAgLy8gVE9ETzogd2UncmUgY3VycmVudGx5IGxvYWRpbmcgYWxsIHRoZSBkYXRhIHdpdGggcmVzb2x2ZVJlZiBiZWhhdmlvci4gV2UgbmVlZCB0byB1cGRhdGUgdGhpc1xuICAgICAgLy8gdG8gbGF6eWxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgd29ybGQgaW5zdGVhZCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBhbmQgbWFrZSB0aGUgZXZlbnQgbG9nIGxvYWRpbmdcbiAgICAgIC8vIG11Y2ggZmFzdGVyIGFuZCBtZW1vcnkgZWZmaWNpZW50XG4gICAgICBjb25zdCBwYWdlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29yID0gY3Vyc29yO1xuICAgICAgcmVjb3JkUmVxdWVzdGVkRXZlbnRDdXJzb3IocnVuSWQsIHJlcXVlc3RlZEN1cnNvciwgcmVxdWVzdGVkQ3Vyc29ycyk7XG5cbiAgICAgIGxldCByZXNwb25zZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB3b3JsZC5ldmVudHMubGlzdD4+O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogcmVxdWVzdGVkQ3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzaG91bGRSZXRyeVdpdGhvdXRFdmVudEN1cnNvcihcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcmVxdWVzdGVkQ3Vyc29yLFxuICAgICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3JcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdFdmVudCBjdXJzb3Igd2FzIHJlamVjdGVkOyByZXRyeWluZyB3aXRoIGEgZnVsbCBldmVudCByZWxvYWQuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9hZGVkRXZlbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgbG9hZGVkRXZlbnRJZHMuY2xlYXIoKTtcbiAgICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzLmNsZWFyKCk7XG4gICAgICAgICAgY3Vyc29yID0gbnVsbDtcbiAgICAgICAgICByZXRyaWVkV2l0aG91dEN1cnNvciA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGFwcGVuZFVuaXF1ZUV2ZW50cyhsb2FkZWRFdmVudHMsIHJlc3BvbnNlLmRhdGEsIGxvYWRlZEV2ZW50SWRzKTtcbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5oYXNNb3JlO1xuICAgICAgYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBoYXNNb3JlLFxuICAgICAgICByZXNwb25zZS5jdXJzb3IsXG4gICAgICAgIHJlcXVlc3RlZEN1cnNvcnNcbiAgICAgICk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgbGFzdCBub24tbnVsbCBjdXJzb3IgYWNyb3NzIHBhZ2VzLiBBIFdvcmxkIG1heVxuICAgICAgLy8gbGVnaXRpbWF0ZWx5IHJldHVybiBgeyBkYXRhOiBbXSwgY3Vyc29yOiBudWxsLCBoYXNNb3JlOiBmYWxzZSB9YFxuICAgICAgLy8gb24gYSB0cmFpbGluZyBlbXB0eSBwYWdlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBwcmV2aW91cyBwYWdlJ3NcbiAgICAgIC8vIHVuZGVybHlpbmcgREIgcXVlcnkgaGl0IHRoZSBsaW1pdCBleGFjdGx5IGFuZCByZXR1cm5lZCBhXG4gICAgICAvLyBwcmVjYXV0aW9uYXJ5IGBMYXN0RXZhbHVhdGVkS2V5YC4gT3ZlcndyaXRpbmcgd2l0aCB0aGF0IG51bGxcbiAgICAgIC8vIHdvdWxkIGxvc2UgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3QgcmVhbCBldmVudCB3ZSBsb2FkZWQgYW5kXG4gICAgICAvLyBmb3JjZSB0aGUgcnVudGltZSBpbnRvIHRoZSBcIm5vIGN1cnNvciBhZnRlciBpbml0aWFsIGxvYWRcIiBmdWxsLVxuICAgICAgLy8gcmVsb2FkIGZhbGxiYWNrIG9uIGV2ZXJ5IHN1YnNlcXVlbnQgcmVwbGF5IGl0ZXJhdGlvbi5cbiAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvciA/PyBjdXJzb3I7XG4gICAgICBwYWdlc0xvYWRlZCsrO1xuXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdMb2FkZWQgZXZlbnQgcGFnZScsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICBwYWdlOiBwYWdlc0xvYWRlZCxcbiAgICAgICAgcGFnZUV2ZW50czogcmVzcG9uc2UuZGF0YS5sZW5ndGgsXG4gICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICBoYXNNb3JlLFxuICAgICAgICBwYWdlTXM6IERhdGUubm93KCkgLSBwYWdlU3RhcnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdFdmVudCBsb2FkIGNvbXBsZXRlJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBpbmNyZW1lbnRhbCxcbiAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgcGFnZXNMb2FkZWQsXG4gICAgICB0b3RhbE1zOiBEYXRlLm5vdygpIC0gbG9hZFN0YXJ0LFxuICAgIH0pO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNDb3VudChsb2FkZWRFdmVudHMubGVuZ3RoKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkKHBhZ2VzTG9hZGVkKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGV2ZW50czogbG9hZGVkRXZlbnRzLCBjdXJzb3IgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIHJ1bnRpbWUncyBsb2FkZWQgZXZlbnQtbG9nIHNuYXBzaG90OiB0aGUgZXZlbnRzIHJlcGxheWVkIHNvIGZhciBhbmQgdGhlXG4gKiBjdXJzb3IgcG9zaXRpb25lZCBhZnRlciB0aGVtLiBIYW5kZWQgdG8gaGVscGVycyB0aGF0IGRlcml2ZSB0aGUgcHJlY29uZGl0aW9uXG4gKiBzbmFwc2hvdCBmcm9tIGl0OyB0aGV5IGRvIG5vdCBtdXRhdGUgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRXZlbnRMb2cge1xuICBldmVudHM6IEV2ZW50W107XG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBFeHRlbmQgYSBsb2FkZWQgbG9nIHdpdGggYSBwYWdlIHRoYXQgY29udGludWVzIGl0IOKAlCBhIGxpc3RlZCBwYWdlLCBvciB0aGVcbiAqIGlubGluZSBkZWx0YSBhIHdyaXRlIGhhbmRlZCBiYWNrIOKAlCBhbmQgbW92ZSBpdHMgcmVhZCBwb3NpdGlvbiB3aXRoIGl0LlxuICpcbiAqIFRoZSBjdXJzb3IgaXMgb25seSBhZHZhbmNlZCB3aGVuIHRoZSBwYWdlIGNhcnJpZXMgb25lLCBzbyBhIHNvdXJjZSB3aXRoIG5vXG4gKiBwb3NpdGlvbiBvZiBpdHMgb3duIChhIHNraXBwZWQtc2xvdCByZXBvcnQpIGNhbm5vdCB3YWxrIHRoZSByZWFkIHBvc2l0aW9uXG4gKiBwYXN0IGV2ZW50cyBpdCBkaWQgbm90IGNhcnJ5LiBBcHBlbmRpbmcgZG9lcyBub3QgcmUtc29ydDsgc2VlXG4gKiB7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSBmb3Igd2h5IHJlY2VpcHQgb3JkZXIgaXMgdGhlIG9yZGVyIHRvIGtlZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRFdmVudExvZyhcbiAgbG9nOiBMb2FkZWRFdmVudExvZyxcbiAgYXBwZW5kZWQ6IHsgZXZlbnRzOiByZWFkb25seSBFdmVudFtdOyBjdXJzb3I/OiBzdHJpbmcgfCBudWxsIH1cbik6IHZvaWQge1xuICBhcHBlbmRVbmlxdWVFdmVudHMobG9nLmV2ZW50cywgYXBwZW5kZWQuZXZlbnRzKTtcbiAgbG9nLmN1cnNvciA9IGFwcGVuZGVkLmN1cnNvciA/PyBsb2cuY3Vyc29yO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSByZXBsYXkgcmVmdXNlcyB0byBydW4gb3ZlciBhIGxvZyB3aXRoIGEgaG9sZSBpbiBpdCAoc2VlXG4gKiB7QGxpbmsgZmluZEV2ZW50U2xvdEdhcH0pLiAqKk9uIGJ5IGRlZmF1bHQqKjsgc2V0XG4gKiBgV09SS0ZMT1dfU0xPVF9HQVBfQ0hFQ0s9MGAgdG8gcmVwbGF5IGFjcm9zcyBob2xlcyBpbnN0ZWFkLlxuICpcbiAqIEEgV29ybGQgdGhhdCBhbGxvY2F0ZXMgYSBwb3NpdGlvbiBhdCB0aGUgbW9tZW50IGl0IGNvbW1pdHMgbGVhdmVzIG5vIGhvbGVcbiAqIGJlaGluZCB3aGVuIGEgd3JpdGUgZmFpbHMsIHNvIGRlbnNpdHkgaXMgYSBwcm9wZXJ0eSB0aGUgbG9nIGhhcyBieVxuICogY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIG9uZSB0aGlzIGNoZWNrIG1haW50YWlucy4gV2hhdCB0aGUgY2hlY2sgaXMgZm9yIGlzXG4gKiB0aGUgcmVhZHMgYW5kIHRoZSBXb3JsZHMgd2hlcmUgdGhhdCBkb2VzIG5vdCBob2xkLCBhbmQgYnkgdGhlIHRpbWUgaXQgcnVuc1xuICogdGhlIGJlbmlnbiBleHBsYW5hdGlvbnMgYXJlIHNwZW50OiBhIHBvc2l0aW9uIG1pc3NpbmcgYmVjYXVzZSBhIGNvbmN1cnJlbnRcbiAqIGNvbW1pdCBpcyBub3QgdmlzaWJsZSB5ZXQgY2xlYXJzIG9uIGEgcmUtcmVhZCwgd2hpY2ggaXMgd2hhdFxuICoge0BsaW5rIHNldHRsZUV2ZW50U2xvdEdhcH0gZG9lcyBmaXJzdC5cbiAqXG4gKiBXaGF0IGlzIGxlZnQgaXMgYSBob2xlIHRoYXQgcGVyc2lzdHMsIGFuZCBpdHMgdHdvIGNhdXNlcyBhcmVcbiAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGxvZy4gRWl0aGVyIGEgV29ybGQgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBvdXRzaWRlXG4gKiB0aGUgY29tbWl0IGFuZCBsb3N0IHRoZSB3cml0ZSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIGhhcHBlbmVkIHRoZXJlIGFuZFxuICogcmVwbGF5aW5nIHBhc3QgaXQgaXMgY29ycmVjdCwgb3IgYW4gZXZlbnQgdGhhdCBkaWQgaGFwcGVuIGlzIG1pc3NpbmcsIGluXG4gKiB3aGljaCBjYXNlIHJlcGxheWluZyBwYXN0IGl0IGRlY2lkZXMgYSBicmFuY2ggb24gYWJzZW5jZSBhbmQgcHJvZHVjZXMgYSB3cm9uZ1xuICogcmVzdWx0IHdpdGggbm90aGluZyB0byBzaG93IGZvciBpdC4gRmFpbGluZyBpcyB0aGUgcmVjb3ZlcmFibGUgc2lkZSBvZiB0aGF0XG4gKiB0cmFkZSwgYW5kIHRoaXMgaXMgdGhlIHdheSBiYWNrIG91dCBpZiBhIGZsZWV0IHR1cm5zIG91dCB0byBjYXJyeSBob2xlcyBvZlxuICogdGhlIGZpcnN0IGtpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Nsb3RHYXBDaGVja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19TTE9UX0dBUF9DSEVDSyAhPT0gJzAnO1xufVxuXG4vKlxuICogTWVyZ2luZyBpbnRvIGEgbG9nIGEgcmVwbGF5IGlzIG1pZHdheSB0aHJvdWdoIHJlYWRpbmcuXG4gKlxuICogVGhyZWUgcGF0aHMgYWRkIGV2ZW50cyB0byBhIGxvYWRlZCBsb2cgYWZ0ZXIgdGhlIHJlcGxheSBoYXMgc3RhcnRlZDogYVxuICogYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRzIGJhY2sgdGhlIHNsb3RzIGl0IHNraXBwZWQgKHtAbGlua1xuICogbWVyZ2VSZXBvcnRlZEV2ZW50c30pLCBhbiBpbmxpbmUgZGVsdGEgZXh0ZW5kcyB0aGUgdGFpbCAoYGFic29yYkNyZWF0ZURlbHRhYFxuICogaW4gYHJ1bnRpbWUudHNgKSwgYW5kIGEgbGlzdGVkIHBhZ2UgYXBwZW5kcyAoe0BsaW5rIGFwcGVuZFVuaXF1ZUV2ZW50c30pLlxuICogVGhleSBsb29rIGFsYXJtaW5nICh0aGUgcmVwbGF5IGlzIHJlYWRpbmcgYW4gYXJyYXkgd2hpbGUgc29tZXRoaW5nIGVsc2VcbiAqIHdyaXRlcyB0byBpdCkgYW5kIHRoZXkgYXJlIHNhZmUgZm9yIG9uZSByZWFzb24gd29ydGggc3RhdGluZyBwbGFpbmx5LCBzaW5jZVxuICogZXZlcnkgY29ycmVjdG5lc3MgYXJndW1lbnQgaW4gdGhpcyBmaWxlIGxlYW5zIG9uIGl0LlxuICpcbiAqICoqQW4gZXZlbnQgaW4gdGhlIGxvZyBpcyBhIGZhY3QsIGFuZCBhIGxvbmdlciBsb2cgY2Fubm90IHJldHJhY3Qgb25lLioqIFRoZVxuICogbG9nIGlzIGFwcGVuZC1vbmx5IGFuZCBwb3NpdGlvbnMgYXJlIG5ldmVyIHJldXNlZCwgc28gYSByZXBsYXkgdGhhdCBwcm9kdWNlZFxuICogZXZlbnQgRSBmcm9tIHRoZSBwcmVmaXggaXQgaGFkIGxvYWRlZCBoYXMgbWFkZSBFIHRydWUgZm9yIGV2ZXJ5IHJlcGxheSB0aGF0XG4gKiBmb2xsb3dzLiBBIGxhdGVyIHJlcGxheSByZWFkaW5nIGEgZnVsbGVyIGxvZyBkb2VzIG5vdCBnZXQgdG8gZGVjaWRlIEUgc2hvdWxkXG4gKiBub3QgYmUgdGhlcmU7IGl0IGNvbnN1bWVzIEUgYW5kIHJlY29uY2lsZXMgdG8gaXQsIHdoaWNoIGlzIHdoYXQgdGhlIGV2ZW50c1xuICogY29uc3VtZXIgZG9lcyB3aGVuIGl0IHdhbGtzIGEgbG9nIGhvbGRpbmcgd3JpdGVzIGZyb20gYSByZXBsYXkgdGhhdCByYWNlZCBpdC5cbiAqXG4gKiBNZXJnaW5nIGlzIHRoZXJlZm9yZSBtb25vdG9uZTogaXQgY2FuIG9ubHkgYWRkIGZhY3RzIHRoaXMgcmVwbGF5IGhhcyB5ZXQgdG9cbiAqIHJlY29uY2lsZSB0bywgbmV2ZXIgcmVtb3ZlIG9uZSBpdCBhbHJlYWR5IGhhcy4gVGhhdCBpcyB3aHkgYWJzb3JiaW5nIGlzXG4gKiBhbHdheXMgb3B0aW9uYWwgYW5kIG5ldmVyIHdyb25nIHRvIGRlY2xpbmUgKGFuIHVuYWJzb3JiZWQgZXZlbnQgaXMgb25lIHRoZVxuICogbmV4dCByZWFkIHJldHVybnMpLCBhbmQgd2h5IHRoZSBndWFyZHMgYmVsb3cgY2FuIGFmZm9yZCB0byBiZSBzdHJpY3QuXG4gKi9cblxuLyoqXG4gKiBNZXJnZSB0aGUgZXZlbnRzIGEgYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRlZCBiYWNrIGludG8gdGhlIGxvZyBpdCB3YXNcbiAqIGRlcml2ZWQgZnJvbSwgYW5kIGFuc3dlciBob3cgbWFueSBvZiB0aGVtIHdlcmUgbmV3LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSwgdGhpcyByZS1zb3J0cy4gVGhlIHJlcG9ydGVkIGV2ZW50cyBvY2N1cHlcbiAqIHNsb3RzICpiZWxvdyogdGhlIHdyaXRlIHRoYXQgcmVwb3J0ZWQgdGhlbSwgc28gYXBwZW5kaW5nIHRoZW0gd291bGQgcHV0IHRoZW1cbiAqIGFmdGVyIGV2ZW50cyB0aGV5IHByZWNlZGUuIFNvcnRpbmcgYnkgaWQgcmVzdG9yZXMgdGhlIFdvcmxkJ3MgY2Fub25pY2FsIG9yZGVyXG4gKiByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBpdDogYSBzbG90IGlkIGlzIHRoYXQgb3JkZXIsIHdyaXR0ZW4gZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUmVwb3J0ZWRFdmVudHMoXG4gIHRhcmdldDogRXZlbnRbXSxcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBudW1iZXIge1xuICBjb25zdCBiZWZvcmUgPSB0YXJnZXQubGVuZ3RoO1xuICBhcHBlbmRVbmlxdWVFdmVudHModGFyZ2V0LCBldmVudHMpO1xuICBjb25zdCBhZGRlZCA9IHRhcmdldC5sZW5ndGggLSBiZWZvcmU7XG4gIGlmIChhZGRlZCA+IDApIHtcbiAgICB0YXJnZXQuc29ydCgoYSwgYikgPT5cbiAgICAgIGEuZXZlbnRJZCA8IGIuZXZlbnRJZCA/IC0xIDogYS5ldmVudElkID4gYi5ldmVudElkID8gMSA6IDBcbiAgICApO1xuICB9XG4gIHJldHVybiBhZGRlZDtcbn1cblxuLyoqIFdoYXQge0BsaW5rIGFic29yYlNraXBwZWRTbG90UmVwb3J0fSBkaWQgd2l0aCBhIHdyaXRlJ3MgcmVwb3J0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2lwcGVkU2xvdFJlcG9ydCB7XG4gIC8qKiBIb3cgbWFueSBvZiB0aGUgcmVwb3J0ZWQgZXZlbnRzIHdlcmUgbmV3IHRvIHRoZSBsb2cuIFplcm8gaWYgZHJvcHBlZC4gKi9cbiAgYWRkZWQ6IG51bWJlcjtcbiAgLyoqIEhvdyBtYW55IGV2ZW50cyB0aGUgcmVwb3J0IG9mZmVyZWQsIHdoZXRoZXIgb3Igbm90IHRoZXkgd2VyZSB0YWtlbi4gKi9cbiAgb2ZmZXJlZDogbnVtYmVyO1xuICAvKiogVGhlIHJlcG9ydCB3YXMgdHJ1bmNhdGVkLCBzbyBpdCB3YXMgZHJvcHBlZCB3aG9sZSBpbnN0ZWFkIG9mIG1lcmdlZC4gKi9cbiAgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgd3JpdGUncyBza2lwcGVkLXNsb3QgcmVwb3J0IHRvIHRoZSBsb2cgaXQgd2FzIGRlcml2ZWQgZnJvbSwgZGVjaWRpbmdcbiAqIHdoZXRoZXIgdGhlIHJlcG9ydCBtYXkgYmUgdGFrZW4gYXQgYWxsLlxuICpcbiAqIEV2ZXJ5IHJlcGxheS1jb250ZXh0IHdyaXRlIGNhbiBjb21lIGJhY2sgY2FycnlpbmcgdGhlIGV2ZW50cyBvbiB0aGUgc2xvdHMgaXRcbiAqIHNraXBwZWQgb3ZlciwgYW5kIGV2ZXJ5IGNhbGxlciB3YW50cyB0aGUgc2FtZSB0aGluZyBmcm9tIHRoZW06IGZvbGQgdGhlbSBpblxuICogc28gdGhlIHdyaXRlcyB0aGF0IGZvbGxvdyBuYW1lIGEgcG9zaXRpb24gYWJvdmUgdGhlbSwgYW5kIHNvIHRoZSByZXBsYXlcbiAqIHJlc3VtaW5nIGZyb20gdGhpcyBsb2cgc2VlcyB0aGVtIHdpdGhvdXQgYSByZWxvYWQuXG4gKlxuICogVGhlIG9uZSBwb2xpY3kgaXMgdGhhdCBhICoqdHJ1bmNhdGVkIHJlcG9ydCBpcyBkcm9wcGVkIHdob2xlKiouIEl0IGNvdmVycyBhXG4gKiBzcGFuIG9mIHBvc2l0aW9ucyBidXQgY2FycmllcyBvbmx5IHNvbWUgb2YgdGhlIGV2ZW50cyBvbiB0aGVtLCBzbyBtZXJnaW5nIGl0XG4gKiB3b3VsZCByYWlzZSB0aGUgbG9nJ3MgaGlnaGVzdCBwb3NpdGlvbiBwYXN0IGEgcG9zaXRpb24gd2hvc2UgZXZlbnQgaXNcbiAqIG1pc3NpbmcuIExhdGVyIHdyaXRlcyByZWFkIHRoYXQgbWF4aW11bSB0byBzYXkgd2hhdCB0aGV5IGhhdmUgc2Vlbiwgc28gZWFjaFxuICogd291bGQgY2xhaW0gYSBwb3NpdGlvbiBpdCBuZXZlciBzYXcsIGFuZCB0aGUgV29ybGQgb25seSByZXBvcnRzIHRoZSBzcGFuIGFcbiAqIHdyaXRlIHNraXBzOiBpdCB3b3VsZCBuZXZlciBzZW5kIHRoZSBtaXNzaW5nIG9uZS4gRHJvcHBpbmcgY29zdHMgb25lIG1vcmVcbiAqIHJvdW5kIG9mIHRoZSBzYW1lIGV2ZW50cyBvbiB0aGUgbmV4dCB3cml0ZSBhbmQga2VlcHMgdGhlIGxvZyBhIHByZWZpeCBvZiB0aGVcbiAqIHRydXRoLCB3aGljaCB0aGUgbm90ZSBhYm92ZSB7QGxpbmsgbWVyZ2VSZXBvcnRlZEV2ZW50c30gZXhwbGFpbnMgaXMgYWx3YXlzIGFuXG4gKiBhdmFpbGFibGUgYW5zd2VyLlxuICpcbiAqIENhbGxlcnMgdGhhdCBsb2cgZG8gc28gZnJvbSB0aGUgcmV0dXJuZWQgY291bnRzOyB0aGUgZGVjaXNpb24gaXMgbm90IHRoZWlyc1xuICogdG8gcmUtZGVyaXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQoXG4gIHRhcmdldDogRXZlbnRbXSxcbiAgcmVzdWx0OiB7IGV2ZW50cz86IHJlYWRvbmx5IEV2ZW50W107IGhhc01vcmU/OiBib29sZWFuIH1cbik6IFNraXBwZWRTbG90UmVwb3J0IHtcbiAgY29uc3Qgb2ZmZXJlZCA9IHJlc3VsdC5ldmVudHM/Lmxlbmd0aCA/PyAwO1xuICBpZiAob2ZmZXJlZCA9PT0gMCkge1xuICAgIHJldHVybiB7IGFkZGVkOiAwLCBvZmZlcmVkOiAwLCB0cnVuY2F0ZWQ6IGZhbHNlIH07XG4gIH1cbiAgaWYgKHJlc3VsdC5oYXNNb3JlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IDAsIG9mZmVyZWQsIHRydW5jYXRlZDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYWRkZWQ6IG1lcmdlUmVwb3J0ZWRFdmVudHModGFyZ2V0LCByZXN1bHQuZXZlbnRzID8/IFtdKSxcbiAgICBvZmZlcmVkLFxuICAgIHRydW5jYXRlZDogZmFsc2UsXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgbG9hZGVkIGxvZyBvY2N1cGllcywgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIGVtcHR5IGxvZy5cbiAqXG4gKiBUaGUgbWF4aW11bSwgbm90IHRoZSBjb3VudCwgYW5kIHRoZSB0d28gYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUgZXZlbiB0aG91Z2hcbiAqIGEgaGVhbHRoeSBsb2cgbWFrZXMgdGhlbSBlcXVhbC4gQSBXb3JsZCBoYW5kcyBhIHBvc2l0aW9uIHRvIHRoZSBpbnNlcnQgdGhhdFxuICogb2NjdXBpZXMgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBsYW5kcyBsZWF2ZXMgbm8gaG9sZSBiZWhpbmQgYW5kIHRoZSBsb2dcbiAqIHN0YXlzIGRlbnNlLiBXaGF0IHRoZSBjb3VudCBjYW5ub3Qgc3Vydml2ZSBpcyBhICpwYXJ0aWFsKiByZWFkOiBhIGxvZ1xuICogYXNzZW1ibGVkIGZyb20gYSB0cnVuY2F0ZWQgcmVwb3J0LCBvciByZWFkIHdoaWxlIGEgY29uY3VycmVudCB3cml0ZSBpc1xuICogY29tbWl0dGluZywgaG9sZHMgZmV3ZXIgZXZlbnRzIHRoYW4gaXRzIGhpZ2hlc3QgcG9zaXRpb24uIENvdW50aW5nIHRob3NlXG4gKiB3b3VsZCBtYWtlIHRoZSBuZXh0IHdyaXRlIGNsYWltIHRvIGhhdmUgc2VlbiBsZXNzIHRoYW4gaXQgaGFzLCBzbyB0aGUgV29ybGRcbiAqIHdvdWxkIHJlcG9ydCB0aGUgc2FtZSBldmVudHMgYmFjayB0byBpdCBvbiBldmVyeSBhdHRlbXB0LlxuICpcbiAqIEEgaG9sZSBiZWxvdyB0aGUgbWF4aW11bSBpcyB0aGVyZWZvcmUgYSBwcm9wZXJ0eSBvZiB0aGUgcmVhZCwgbm90IG9mIHRoZSBsb2csXG4gKiB3aGljaCBpcyB3aGF0IGxldHMge0BsaW5rIHNldHRsZUV2ZW50U2xvdEdhcH0gcmUtcmVhZCBpbnN0ZWFkIG9mIGdpdmluZyB1cC5cbiAqXG4gKiBAdGhyb3dzIGlmIGFueSBldmVudCBpZCBjYXJyaWVzIG5vIHNsb3QuIEV2ZXJ5IFdvcmxkIHRoZSBydW50aW1lIHJlcGxheXNcbiAqIGFnYWluc3QgbnVtYmVycyBldmVudHMgYnkgc2xvdCwgc28gYW4gaWQgdGhhdCBkb2VzIG5vdCBpcyBhIGJyb2tlbiBsb2cgcmF0aGVyXG4gKiB0aGFuIGFuIG9sZGVyIG9uZSwgYW5kIGEgbWF4aW11bSBkZXJpdmVkIGJ5IHNraXBwaW5nIGl0IHdvdWxkIHVuZGVyc3RhdGUgdGhlXG4gKiBsb2cgdG8gZXZlcnkgd3JpdGUgdGhhdCByZWFkcyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heEV2ZW50U2xvdChldmVudHM6IHJlYWRvbmx5IEV2ZW50W10pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBsZXQgbWF4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3Qgc2xvdCA9IHJlcXVpcmVFdmVudFNsb3QoZXZlbnQuZXZlbnRJZCk7XG4gICAgaWYgKG1heCA9PT0gdW5kZWZpbmVkIHx8IHNsb3QgPiBtYXgpIHtcbiAgICAgIG1heCA9IHNsb3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG5cbi8qKiBBIHBvc2l0aW9uIHRoZSBsb2cgc2tpcHMgb3ZlciwgZGVzY3JpYmVkIHdlbGwgZW5vdWdoIHRvIG5hbWUgaW4gYW4gZXJyb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U2xvdEdhcCB7XG4gIC8qKiBUaGUgbG93ZXN0IHNsb3QgYmVsb3cgdGhlIGxvZydzIG1heGltdW0gdGhhdCBubyBldmVudCBvY2N1cGllcy4gKi9cbiAgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgc2xvdHMgYmVsb3cgdGhlIG1heGltdW0gbm8gZXZlbnQgb2NjdXBpZXMuICovXG4gIG1pc3NpbmdDb3VudDogbnVtYmVyO1xuICAvKiogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgbG9nIG9jY3VwaWVzLiAqL1xuICBtYXhTbG90OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGhvbGUgaW4gYSBsb2FkZWQgbG9nLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gZmluZC5cbiAqXG4gKiBUaGUgV29ybGQgYWxsb2NhdGVzIGV2ZXJ5IHBvc2l0aW9uLCBzbyBhIGxvZyB0aGF0IGhvbGRzIGBuYCBldmVudHMgYmVsb3cgc2xvdFxuICogYG5gIGlzIG1pc3Npbmcgb25lLiBUaGF0IG1hdHRlcnMgYmVmb3JlIGEgcmVwbGF5XG4gKiBhbmQgbm93aGVyZSBlbHNlOiB0aGUgcmVwbGF5IHJlYWRzIHRoZSBsb2cgYXMgdGhlIGNvbXBsZXRlIHJlY29yZCBvZiB3aGF0IGhhc1xuICogaGFwcGVuZWQsIGFuZCBhbiBhYnNlbnQgcG9zaXRpb24gaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBldmVudCB0aGF0XG4gKiBuZXZlciBvY2N1cnJlZC4gVGhlIGJyYW5jaCBpdCB3b3VsZCBoYXZlIGRlY2lkZWQgZ2V0cyBkZWNpZGVkIHRoZSBvdGhlciB3YXksXG4gKiBhbmQgdGhlIHJ1biBkaXZlcmdlcyBxdWlldGx5IHJhdGhlciB0aGFuIGZhaWxpbmcuXG4gKlxuICogT3JkZXItaW5kZXBlbmRlbnQsIHVubGlrZSB0aGUgZXF1aXZhbGVudCBhdWRpdCB0aGUgV29ybGQgcnVucyBvdmVyIGEgcGFnZSBpdFxuICoganVzdCByZWFkLiBBIGxvYWRlZCBsb2cgaXMgYXNzZW1ibGVkIGZyb20gbGlzdGVkIHBhZ2VzIHBsdXMgd2hhdGV2ZXIgYVxuICogYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRlZCBiYWNrLCBhbmQgd2hpbGUge0BsaW5rIG1lcmdlUmVwb3J0ZWRFdmVudHN9XG4gKiByZXN0b3JlcyBpZCBvcmRlciwgYSBjaGVjayB0aGF0IGNhbiBmYWlsIGEgaGVhbHRoeSBydW4gc2hvdWxkIG5vdCBkZXBlbmQgb25cbiAqIHRoYXQgaGF2aW5nIGhhcHBlbmVkLlxuICpcbiAqIFRoZSBmaXJzdCBzbG90IGlzIG5ldmVyIGNvdW50ZWQuIEl0IGJlbG9uZ3MgdG8gYHJ1bl9jcmVhdGVkYCwgd2hpY2ggYHN0YXJ0KClgXG4gKiBwb3N0cyBjb25jdXJyZW50bHkgd2l0aCB0aGUgcXVldWUgc2VuZCwgc28gYSBsb2cgcmVhZCBpbiB0aGF0IHdpbmRvd1xuICogbGVnaXRpbWF0ZWx5IGJlZ2lucyBhdCB0aGUgc2Vjb25kIHNsb3QgYW5kIGZpbGxzIGluIG9uIGl0cyBvd24uIEV2ZXJ5IHJlcGxheVxuICogdGhhdCByYWNlcyBhIHJ1bidzIG93biBzdGFydCB3b3VsZCBvdGhlcndpc2UgcmVwb3J0IGEgaG9sZS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbiBlbXB0eSBsb2csIHdoaWNoIGhhcyBubyBkZW5zaXR5IHRvIGNoZWNrLlxuICpcbiAqIEB0aHJvd3MgaWYgYW55IGV2ZW50IGlkIGNhcnJpZXMgbm8gc2xvdCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEV2ZW50U2xvdEdhcChcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBFdmVudFNsb3RHYXAgfCB1bmRlZmluZWQge1xuICBjb25zdCBvY2N1cGllZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsZXQgbWF4U2xvdCA9IDA7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3Qgc2xvdCA9IHJlcXVpcmVFdmVudFNsb3QoZXZlbnQuZXZlbnRJZCk7XG4gICAgb2NjdXBpZWQuYWRkKHNsb3QpO1xuICAgIGlmIChzbG90ID4gbWF4U2xvdCkge1xuICAgICAgbWF4U2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG4gIGlmIChtYXhTbG90ID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBmbG9vciA9IG9jY3VwaWVkLmhhcyhGSVJTVF9FVkVOVF9TTE9UKVxuICAgID8gRklSU1RfRVZFTlRfU0xPVFxuICAgIDogRklSU1RfRVZFTlRfU0xPVCArIDE7XG4gIC8vIEV2ZXJ5IHNsb3QgaXMgYXQgb3IgYWJvdmUgYGZsb29yYCBieSBjb25zdHJ1Y3Rpb24sIHNvIHRoZSBsb2cgaXMgZGVuc2VcbiAgLy8gZXhhY3RseSB3aGVuIGl0IGhvbGRzIG9uZSBldmVudCBwZXIgcG9zaXRpb24gaW4gYFtmbG9vciwgbWF4U2xvdF1gLiBUaGVcbiAgLy8gc2NhbiBiZWxvdyBvbmx5IHJ1bnMgb25jZSB0aGF0IGhhcyBhbHJlYWR5IGFuc3dlcmVkIG5vLlxuICBpZiAob2NjdXBpZWQuc2l6ZSA9PT0gbWF4U2xvdCAtIGZsb29yICsgMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IGZpcnN0TWlzc2luZ1Nsb3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IG1pc3NpbmdDb3VudCA9IDA7XG4gIGZvciAobGV0IHNsb3QgPSBmbG9vcjsgc2xvdCA8PSBtYXhTbG90OyBzbG90KyspIHtcbiAgICBpZiAoIW9jY3VwaWVkLmhhcyhzbG90KSkge1xuICAgICAgZmlyc3RNaXNzaW5nU2xvdCA/Pz0gc2xvdDtcbiAgICAgIG1pc3NpbmdDb3VudCsrO1xuICAgIH1cbiAgfVxuICBpZiAoZmlyc3RNaXNzaW5nU2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBmaXJzdE1pc3NpbmdTbG90LCBtaXNzaW5nQ291bnQsIG1heFNsb3QgfTtcbn1cblxuLyoqXG4gKiBIb3cgbWFueSB0aW1lcyBhIGRldGVjdGVkIGhvbGUgaXMgcmUtcmVhZCBiZWZvcmUgdGhlIGxvZyBpcyB0YWtlbiBhdCBpdHNcbiAqIHdvcmQsIGFuZCB0aGUgYmFja29mZiBiZWZvcmUgZWFjaCByZS1yZWFkIChkb3VibGluZyBwZXIgYXR0ZW1wdCkuXG4gKlxuICogQSBob2xlIGNhbiBiZSB0cmFuc2llbnQuIFRoZSBXb3JsZCBhbGxvY2F0ZXMgYSBzbG90IGluc2lkZSB0aGUgaW5zZXJ0IHRoYXRcbiAqIG9jY3VwaWVzIGl0LCBzbyB0d28gY29uY3VycmVudCB3cml0ZXJzIGNhbiBjb2xsaWRlLCBvbmUgcmV0cnkgcGFzdCB0aGUgb3RoZXIsXG4gKiBhbmQgdGhlIGhpZ2hlciBzbG90IGNvbW1pdCBmaXJzdCwgbGVhdmluZyBhIHdpbmRvdyBpbiB3aGljaCB0aGUgbG93ZXIgb25lIGlzXG4gKiBnZW51aW5lbHkgYWJzZW50IGZyb20gYSBzdHJvbmdseS1jb25zaXN0ZW50IHJlYWQgYW5kIGZpbGxzIGluIGEgbW9tZW50IGxhdGVyLlxuICogVGhlIHdpbmRvdyBpcyBvbmUgY29tbWl0IHdpZGUsIHNvIGEgc2hvcnQgYmFja29mZiBjbGVhcnMgaXQ7IGFueXRoaW5nIHRoYXRcbiAqIHN1cnZpdmVzIGFsbCB0aHJlZSByZS1yZWFkcyBpcyBhIHBvc2l0aW9uIG5vIHdyaXRlIHdpbGwgZXZlciBvY2N1cHkuXG4gKi9cbmV4cG9ydCBjb25zdCBTTE9UX0dBUF9SRUNIRUNLX0FUVEVNUFRTID0gMztcbmNvbnN0IFNMT1RfR0FQX1JFQ0hFQ0tfQkFTRV9ERUxBWV9NUyA9IDI1O1xuXG4vKipcbiAqIFJlLXJlYWQgYSBsb2cgdGhhdCBsb29rcyBob2xleSB1bnRpbCB0aGUgaG9sZSBmaWxscyBpbiBvciB0aGUgcmUtcmVhZHMgcnVuXG4gKiBvdXQsIGFuZCByZXR1cm4gdGhlIHNldHRsZWQgbG9nIGFsb25nc2lkZSB0aGUgaG9sZSB0aGF0IHN1cnZpdmVkLlxuICpcbiAqIFJlYWRzIGFyZSBzdHJvbmdseSBjb25zaXN0ZW50LCBzbyBhIGhvbGUgaXMgbm90IGFuIGFydGlmYWN0IG9mICp3aGVuKiB0aGUgbG9nXG4gKiB3YXMgcmVhZCwgYnV0IGl0IGNhbiBiZSBhbiBhcnRpZmFjdCBvZiBhIHdyaXRlIHRoYXQgaGFkIG5vdCBjb21taXR0ZWQgeWV0XG4gKiAoc2VlIHtAbGluayBTTE9UX0dBUF9SRUNIRUNLX0FUVEVNUFRTfSkuIERpc3Rpbmd1aXNoaW5nIHRoZSB0d28gY29zdHMgYVxuICogcmUtcmVhZCwgd2hpY2ggaXMgb25seSBldmVyIHBhaWQgYnkgYSByZXBsYXkgdGhhdCBhbHJlYWR5IGZvdW5kIGEgaG9sZS5cbiAqXG4gKiBUaGUgcmVsb2FkIGlzIGZ1bGwgcmF0aGVyIHRoYW4gaW5jcmVtZW50YWw6IHRoZSBtaXNzaW5nIHBvc2l0aW9uIGlzIGJlbG93IHRoZVxuICogbG9nJ3MgbWF4aW11bSwgc28gYSBjdXJzb3ItYW5jaG9yZWQgcmVhZCBzdGFydHMgcGFzdCBpdCBhbmQgY2FuIG5ldmVyIHNlZSBpdFxuICogYXJyaXZlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dGxlRXZlbnRTbG90R2FwKFxuICBydW5JZDogc3RyaW5nLFxuICBsb2FkZWQ6IExvYWRlZEV2ZW50TG9nXG4pOiBQcm9taXNlPHsgbG9nOiBMb2FkZWRFdmVudExvZzsgZ2FwOiBFdmVudFNsb3RHYXAgfCB1bmRlZmluZWQgfT4ge1xuICBsZXQgbG9nID0gbG9hZGVkO1xuICBsZXQgZ2FwID0gZmluZEV2ZW50U2xvdEdhcChsb2cuZXZlbnRzKTtcbiAgZm9yIChcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgZ2FwICE9PSB1bmRlZmluZWQgJiYgYXR0ZW1wdCA8IFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFM7XG4gICAgYXR0ZW1wdCsrXG4gICkge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBTTE9UX0dBUF9SRUNIRUNLX0JBU0VfREVMQVlfTVMgKiAyICoqIGF0dGVtcHQpXG4gICAgKTtcbiAgICBsb2cgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgIGdhcCA9IGZpbmRFdmVudFNsb3RHYXAobG9nLmV2ZW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgbG9nLCBnYXAgfTtcbn1cblxuLyoqXG4gKiBIb3cgbXVjaCBvZiBpdHMgcnVuJ3MgbG9nIGEgcmVwbGF5LWNvbnRleHQgZXZlbnQgY3JlYXRpb24gaGFkIGxvYWRlZCB3aGVuIGl0XG4gKiBkZWNpZGVkIHRvIHdyaXRlLCBhcyB0aGUgaGlnaGVzdCBzbG90IHRoYXQgbG9nIG9jY3VwaWVzLlxuICpcbiAqIE9uZSBpbnRlZ2VyIHNheXMgaXQgYmVjYXVzZSB0aGUgV29ybGQga2VlcHMgaXRzIHBvc2l0aW9ucyBkZW5zZTogYSB3cml0ZXJcbiAqIHRoYXQgbmFtZXMgc2xvdCBOIGlzIGNsYWltaW5nIHRvIGhvbGQgZXZlcnkgZXZlbnQgZnJvbSAxIHRvIE4gYW5kIG5vdGhpbmdcbiAqIGFib3ZlLiBUaGUgV29ybGQgYW5zd2VycyBieSBudW1iZXJpbmcgdGhlIHdyaXRlIGFib3ZlIHdoYXRldmVyIHRoZSBsb2cgaGFzXG4gKiBhY3R1YWxseSByZWFjaGVkIGFuZCBoYW5kaW5nIGJhY2sgdGhlIGV2ZW50cyBvbiB0aGUgc2xvdHMgaW4gYmV0d2VlbjogdGhlXG4gKiBvbmVzIHRoaXMgd3JpdGVyIGRlY2lkZWQgd2l0aG91dC5cbiAqXG4gKiBEZW5zaXR5IGlzIHRoZSBXb3JsZCdzIGludmFyaWFudCwgbm90IGEgY2xhaW0gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIHJlYWQuIEFcbiAqIHJlYWRlciB0aGF0IGlzIHNob3J0IG9mIGEgcG9zaXRpb24gaXQgaG9sZHMgbm8gZXZlbnQgZm9yIG5hbWVzIGEgbG93ZXIgTixcbiAqIHdoaWNoIHVuZGVyc3RhdGVzIHdoYXQgaXQgaGFzIHNlZW4gYW5kIG9ubHkgY29zdHMgaXQgYSB3aWRlciByZXBvcnQuIE5hbWluZ1xuICogYSBwb3NpdGlvbiBpdCBjYW5ub3QgYWNjb3VudCBmb3IgaXMgdGhlIGRpcmVjdGlvbiB0aGF0IGlzIHVuc2FmZSwgd2hpY2ggaXNcbiAqIHdoeSB7QGxpbmsgc2xvdFNuYXBzaG90UGFyYW1zfSB0YWtlcyB0aGUgbWF4aW11bSByYXRoZXIgdGhhbiB0aGUgY291bnQuXG4gKlxuICogSXRzIG93biBvYmplY3QgcmF0aGVyIHRoYW4gYSBiYXJlIG51bWJlciBzbyBhIGNhbGwgc2l0ZSBjYW5ub3QgaGFsZi1zZW5kIGl0LFxuICogYW5kIHNvIHRoZSBlbXB0eSBjYXNlIHNwcmVhZHMgdG8gbm90aGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbG90U25hcHNob3RQYXJhbXMge1xuICBldmVudENvdW50PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzbG90IHNuYXBzaG90IHRvIGF0dGFjaCB0byBhIHJlcGxheS1jb250ZXh0IGV2ZW50IGNyZWF0aW9uLlxuICpcbiAqIEVtcHR5IGZvciBhbiBlbXB0eSBsb2csIHdoaWNoIGlzIHRoZSBzdGF0ZSBhIGBydW5fY3JlYXRlZGAgd3JpdGUgaXMgaXNzdWVkXG4gKiBmcm9tOiB0aGVyZSBpcyBubyBwb3NpdGlvbiBoZWxkIHlldCB0byBuYW1lLlxuICpcbiAqICMjIFdobyBuYW1lcyBhIHBvc2l0aW9uXG4gKlxuICogQSBXb3JsZCBjYW4gaGFuZCBldmVudHMgYmFjayBvbiBhIHdyaXRlJ3Mgc3VjY2VzcyByZXNwb25zZSB0aHJvdWdoIHR3b1xuICogcGFyYW1zIChgQ3JlYXRlRXZlbnRQYXJhbXNgIGluIGBAd29ya2Zsb3cvd29ybGRgKTogYGV2ZW50Q291bnRgLCB3aGljaCBpc1xuICogYW5zd2VyZWQgd2l0aCB0aGUgZXZlbnRzIG9uIHRoZSBwb3NpdGlvbnMgdGhlIHdyaXRlIHNraXBwZWQgb3ZlciAodGhlXG4gKiBza2lwcGVkLXNsb3QgcmVwb3J0KSwgYW5kIGBzaW5jZUN1cnNvcmAsIHdoaWNoIGlzIGFuc3dlcmVkIHdpdGggZXZlcnl0aGluZ1xuICogYWZ0ZXIgdGhhdCBjdXJzb3IgKHRoZSBpbmxpbmUgZGVsdGEpLiBCb3RoIGV4aXN0IHRvIHNhdmUgdGhlIHdyaXRlciBhXG4gKiByZWxvYWQuIFNvIHRoZSBydWxlIGZvciB3aGljaCB3cml0ZXMgc2VuZCB0aGVtIGlzIG5vdCBhYm91dCB0aGUgZXZlbnQgdHlwZTtcbiAqIGl0IGlzIGFib3V0IHdoZXRoZXIgKip0aGUgcHJvY2VzcyB0aGF0IHdyaXRlcyBob2xkcyBhIGxvYWRlZCBsb2cgaXQgd2lsbFxuICoga2VlcCBkZWNpZGluZyBmcm9tKiosIGl0cyBvd24gbmV4dCB3cml0ZXMgb3IgdGhlIHJlcGxheSBpdCByZXN1bWVzLiBBIHdyaXRlclxuICogd2l0aCBubyBsb2cgaGFzIG5vdGhpbmcgdG8gbWVyZ2UgYSBwYWdlIGludG8sIGFuZCB3aG9ldmVyIGRlY2lkZXMgbmV4dCBpcyBhXG4gKiBmcmVzaCByZXBsYXkgdGhhdCBsb2FkcyB0aGUgbG9nIGFueXdheS5cbiAqXG4gKiBUaHJlZSBnYXRlcywgYWxsIG9mIHdoaWNoIG11c3QgcGFzcyBmb3IgYSBwYWdlIHRvIGNvbWUgYmFjazpcbiAqXG4gKiAxLiBUaGUgd3JpdGVyIG5hbWVzIGEgcG9zaXRpb24uIE9ubHkgdGhlIHJlcGxheSBsb29wJ3MgYGNyZWF0ZUV2ZW50YCBzZWFtXG4gKiAgICAocnVudGltZS50cykgYW5kIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIncyBgY3JlYXRlR3VhcmRlZGAgZG87IHRoZSBRdWlja0pTXG4gKiAgICBlbmdpbmUncyBgY3JlYXRlRXZlbnRgIChxdWlja2pzLWVudHJ5cG9pbnQudHMpIGZvbGxvd3MgdGhlIHNhbWUgcnVsZS4gUmF3XG4gKiAgICBgd29ybGQuZXZlbnRzLmNyZWF0ZWAgY2FsbHMgc2VuZCBub3RoaW5nLlxuICogMi4gVGhlIFdvcmxkIHJlYWRzIGEgcGFnZSBmb3IgdGhhdCBldmVudCB0eXBlLiBBIFdvcmxkIG1heSBkZWNsaW5lIGZvciB0eXBlc1xuICogICAgd2hvc2Ugd3JpdGVyIG5ldmVyIGhvbGRzIGEgbG9nIChzdGVwIGV4ZWN1dG9yIHdyaXRlcywgcnVuLXRlcm1pbmFsXG4gKiAgICB3cml0ZXMpLCB3aGF0ZXZlciB0aGUgY2xpZW50IHNlbnQuXG4gKiAzLiBUaGVyZSBpcyBzb21ldGhpbmcgdG8gaGFuZCBiYWNrOiB0aGUgcmVwb3J0IG9ubHkgd2hlbiB0aGUgd3JpdGUgbGFuZGVkXG4gKiAgICBtb3JlIHRoYW4gb25lIHBvc2l0aW9uIGFib3ZlIGBldmVudENvdW50YDsgdGhlIGRlbHRhIGFsd2F5cy5cbiAqXG4gKiB8IEV2ZW50IHwgV3JpdGVyIHwgU2VuZHMgfCBXaHkgfFxuICogfC0tLXwtLS18LS0tfC0tLXxcbiAqIHwgYHJ1bl9jcmVhdGVkYCB8IGBzdGFydCgpYCB8IG5vdGhpbmcgfCBubyBsb2cgZXhpc3RzIHlldCB8XG4gKiB8IGBydW5fc3RhcnRlZGAgfCByZXBsYXkgbG9vcCwgZmlyc3Qgd3JpdGUgb2YgYSBkZWxpdmVyeSB8IGBldmVudENvdW50YCB3aGVuIGEgbG9nIGlzIGxvYWRlZDsgbm8gY3Vyc29yLCB0aGUgYHJ1bl9zdGFydGVkYCBwcmVsb2FkIG93bnMgdGhlIHJlc3BvbnNlIGZpZWxkcyB8IHRoZSBwcmVsb2FkIGFscmVhZHkgcmV0dXJucyB0aGUgZnVsbCBsb2cgfFxuICogfCBgc3RlcF9jcmVhdGVkYCwgYHdhaXRfY3JlYXRlZGAsIGBob29rX2Rpc3Bvc2VkYCwgYGF0dHJfc2V0YCB8IHN1c3BlbnNpb24gaGFuZGxlciAoYGNyZWF0ZUd1YXJkZWRgKSB8IGBldmVudENvdW50YCB8IHRoZSBoYW5kbGVyIGtlZXBzIHdyaXRpbmcgZnJvbSwgYW5kIHJlc3VtZXMgcmVwbGF5IGZyb20sIHRoaXMgbG9nIHxcbiAqIHwgYHN0ZXBfY3JlYXRlZGAgfCBxdWV1ZS1jb25zdW1lciByZS1lbnN1cmUgKHJhdykgfCBub3RoaW5nIHwgcnVucyBmcm9tIGEgcXVldWUgbWVzc2FnZSwgbm8gbG9nIHxcbiAqIHwgYGhvb2tfY3JlYXRlZGAgfCBzdXNwZW5zaW9uIGhhbmRsZXIgKG5vZGUpLCBgZGlzcGF0Y2hQZW5kaW5nT3BzYCAoUXVpY2tKUykgfCBgZXZlbnRDb3VudGAgKyBgc2luY2VDdXJzb3JgIChvbmx5IHdoZW4gdGhlIHN1c3BlbnNpb24gY3JlYXRlcyBleGFjdGx5IG9uZSBob29rKSB8IHRoZSBkZWx0YSBpcyBob3cgYW4gYWxyZWFkeS1yZWNlaXZlZCBob29rIHJlc29sdmVzIHdpdGhvdXQgYSByZS1pbnZvY2F0aW9uOyB0d28gY3JlYXRlcyBhZ2FpbnN0IG9uZSBjdXJzb3Igd291bGQgZ2l2ZSB0d28gZGVsdGFzIG9mIHdoaWNoIG9ubHkgdGhlIGZpcnN0IGNvdWxkIGJlIHRha2VuIHxcbiAqIHwgYGhvb2tfcmVjZWl2ZWRgIHwgcmVwbGF5IGxvb3AgbGF6eSByZXN1bWU7IGhhbmRsZXIgaW4tc3VzcGVuc2lvbiByZXN1bWUgfCBgZXZlbnRDb3VudGAgKHByZWxvYWQgb3ducyB0aGUgY3Vyc29yIGZpZWxkcykgfCBib3RoIHJlcGxheSBmcm9tIHRoZSBsb2cgcmlnaHQgYWZ0ZXIgfFxuICogfCBgaG9va19yZWNlaXZlZGAgfCB3ZWJob29rIC8gYHJlc3VtZUhvb2tgIChyYXcpIHwgbm90aGluZyB8IG91dC1vZi1iYW5kLCBlbnF1ZXVlcyBhIGRlbGl2ZXJ5IHRoYXQgbG9hZHMgdGhlIGxvZyB8XG4gKiB8IGB3YWl0X2NvbXBsZXRlZGAgfCByZXBsYXkgbG9vcCB0aW1lciBwYXRoIHwgYGV2ZW50Q291bnRgIHwgdGhlIGxvb3Aga2VlcHMgcmVwbGF5aW5nIGZyb20gdGhlIGxvZyB8XG4gKiB8IGB3YWl0X2NvbXBsZXRlZGAgfCBgcnVucy4qYCBvdXQtb2YtYmFuZCAocmF3KSB8IG5vdGhpbmcgfCBubyBsb2cgfFxuICogfCBgc3RlcF9zdGFydGVkYCwgYHN0ZXBfcmV0cnlpbmdgIHwgc3RlcCBleGVjdXRvciB8IG5vdGhpbmcgfCBubyBsb2c7IHRoZSBuZXh0IGRlY2lzaW9uIGlzIGEgcmVwbGF5IHRoYXQgcmVsb2FkcyBvciByZWNlaXZlcyB0aGUgZGVsdGEgYmVsb3cgfFxuICogfCBgc3RlcF9jb21wbGV0ZWRgLCBgc3RlcF9mYWlsZWRgIHwgc3RlcCBleGVjdXRvciB8IGBzaW5jZUN1cnNvcmAgb25seSwgb3V0c2lkZSB0dXJibywgc2luZ2xlIGlubGluZSBzdGVwIHwgdGhpcyBpcyB3aGVyZSB0aGUgaW5saW5lIGV4ZWN1dGlvbiBsb29wIGdldHMgaXRzIGxvZyBiYWNrOyBpbiB0dXJibyBvciBmcm9tIGEgcXVldWVkIGRlbGl2ZXJ5IGEgZnJlc2ggcmVwbGF5IGxvYWRzIGl0IGFueXdheSB8XG4gKiB8IGBzdGVwX2ZhaWxlZGAgfCBzdXNwZW5zaW9uIGhhbmRsZXIsIHVuc2VyaWFsaXphYmxlIGlucHV0IHwgYGV2ZW50Q291bnRgIHwgdGhlIGhhbmRsZXIgaG9sZHMgYSBsb2c7IHJhcmUsIGFuZCBmb2xsb3dzIGEgYHN0ZXBfY3JlYXRlZGAgdGhhdCBkcmV3IHRoZSBwYWdlIHxcbiAqIHwgYGF0dHJfc2V0YCB8IGBzZXRBdHRyaWJ1dGVzKClgIEFQSSAocmF3KSB8IG5vdGhpbmcgfCBvdXQtb2YtYmFuZCB8XG4gKiB8IGBydW5fY29tcGxldGVkYCwgYHJ1bl9mYWlsZWRgLCBgcnVuX2NhbmNlbGxlZGAgfCByZXBsYXkgbG9vcCwgcmVwbGF5IGJ1ZGdldCwgYHJ1bnMuY2FuY2VsYCB8IGBldmVudENvdW50YCB3aGVyZSB0aGUgbm9kZSBsb29wJ3Mgc2VhbSBzdGFtcHMgaXQgKHRoZSBRdWlja0pTIGVuZ2luZSBzZW5kcyBub3RoaW5nKTsgbmV2ZXIgYHNpbmNlQ3Vyc29yYCAoYGRlbHRhUmVxdWVzdEN1cnNvcmAgZXhjbHVkZXMgdGVybWluYWwgdHlwZXMpIHwgdGVybWluYWw6IG5vdGhpbmcgcmVwbGF5cyB0aGUgbG9nIGFmdGVyd2FyZHMsIHNvIGEgV29ybGQgcmVhZHMgbm8gcGFnZSBmb3IgdGhlbSB8XG4gKlxuICogQmF0Y2hlZCB3cml0ZXMgKGBldmVudHMuY3JlYXRlQmF0Y2hgKSBhcmUgb3V0c2lkZSBhbGwgb2YgdGhpczogYSBiYXRjaCBjYXJyaWVzXG4gKiBubyBwZXItZXZlbnQgcG9zaXRpb24gYW5kIGdldHMgbm8gcGFnZS4gVGhlIHVzZXItZmFjaW5nIHZlcnNpb24gb2YgdGhpcyB0YWJsZVxuICogaXMgaW4gYGRvY3MvY29udGVudC9kb2NzL3Y1L2hvdy1pdC13b3Jrcy9ldmVudC1zb3VyY2luZy5tZHhgOyBrZWVwIHRoZSB0d28gaW5cbiAqIHN0ZXAuXG4gKlxuICogVGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIGxlbmd0aCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzOiBhIHBhcnRpYWxseS1yZWFkIGxvZyBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbiwgYW5kXG4gKiBjb3VudGluZyB0aG9zZSB3b3VsZCBtYWtlIHRoZSB3cml0ZSBjbGFpbSB0byBoYXZlIHNlZW4gbGVzcyB0aGFuIGl0IGhhcywgc29cbiAqIHRoZSBXb3JsZCB3b3VsZCByZXBvcnQgdGhlIHNhbWUgZXZlbnRzIGJhY2sgb24gZXZlcnkgYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsb3RTbmFwc2hvdFBhcmFtcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBTbG90U25hcHNob3RQYXJhbXMge1xuICBjb25zdCBldmVudENvdW50ID0gbWF4RXZlbnRTbG90KGV2ZW50cyk7XG4gIHJldHVybiBldmVudENvdW50ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnRDb3VudCB9O1xufVxuXG4vKipcbiAqIFRoZSBldmVudHMgYSByZWplY3RpbmcgV29ybGQgYXR0YWNoZWQgdG8gYSBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgLCB3aGVuIGl0XG4gKiByZXR1cm5lZCB0aGUgb25lcyB0aGUgY2xpZW50J3Mgc25hcHNob3Qgd2FzIG1pc3NpbmcgaW5saW5lLlxuICpcbiAqIFJldHVybnMgYG51bGxgIGZvciBhbnl0aGluZyBlbHNlOiBubyBkZXRhaWxzLCBhIFdvcmxkIHRoYXQgZGlkIG5vdCBpbXBsZW1lbnRcbiAqIHRoaXMsIG9yIGEgcGF5bG9hZCB0aGF0IGRvZXMgbm90IG5hcnJvdyBjbGVhbmx5LiBDYWxsZXJzIGZhbGwgYmFjayB0b1xuICogcmVsb2FkaW5nIHRoZSBldmVudCBsb2csIHdoaWNoIGlzIGFsd2F5cyBjb3JyZWN0OyB0aGlzIGlzIHVudHJ1c3RlZC1zaGFwZWRcbiAqIGRhdGEgb24gYSBmYWlsdXJlIHBhdGgsIHNvIG5vdGhpbmcgaGVyZSBpcyByZXBhaXJlZC5cbiAqXG4gKiBgcnVuSWRgIGlzIHRoZSBjYWxsZXIncyBydW4uIEV2ZXJ5IGV2ZW50IG11c3QgYmVsb25nIHRvIGl0OiB0aGUgZGVsdGEgaXNcbiAqIG1lcmdlZCBzdHJhaWdodCBpbnRvIHRoZSByZXBsYXkncyBsb2csIGFuZCBvbmUgZm9yZWlnbiBldmVudCB0aGVyZSBpcyBhXG4gKiBjb3JydXB0IGxvZyByYXRoZXIgdGhhbiBhIGNvcnJlY3RlZCBvbmU6IHRoZSByZXBsYXkgd291bGQgY29uc3VtZSBhXG4gKiBjb3JyZWxhdGlvbiBpZCBmb3IgYW4gZXZlbnQgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoXG4gIGVycm9yOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nXG4pOiB7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsIHtcbiAgaWYgKCFQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkZXRhaWxzID0gZXJyb3IuZGV0YWlscztcbiAgaWYgKHR5cGVvZiBkZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBkZXRhaWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBldmVudHMsIGN1cnNvciB9ID0gZGV0YWlscyBhcyB7IGV2ZW50cz86IHVua25vd247IGN1cnNvcj86IHVua25vd24gfTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgZXZlbnQgPT09IG51bGwgfHxcbiAgICAgIHR5cGVvZiAoZXZlbnQgYXMgeyBldmVudElkPzogdW5rbm93biB9KS5ldmVudElkICE9PSAnc3RyaW5nJyB8fFxuICAgICAgKGV2ZW50IGFzIHsgcnVuSWQ/OiB1bmtub3duIH0pLnJ1bklkICE9PSBydW5JZFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBldmVudHMgYXMgRXZlbnRbXSxcbiAgICBjdXJzb3I6IHR5cGVvZiBjdXJzb3IgPT09ICdzdHJpbmcnID8gY3Vyc29yIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgb25lIGV2ZW50IG9uIGEgYm91bmQgcnVuLCBjYXJyeWluZyByZXBsYXktcmVjb3ZlcnkgdGVsZW1ldHJ5LiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRDcmVhdG9yID0gKFxuICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4pID0+IFByb21pc2U8RXZlbnRSZXN1bHQ+O1xuXG4vKipcbiAqIENPUlMgaGVhZGVycyBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcy5cbiAqIEFsbG93cyB0aGUgb2JzZXJ2YWJpbGl0eSBVSSB0byBjaGVjayBlbmRwb2ludCBoZWFsdGggZnJvbSBhIGRpZmZlcmVudCBvcmlnaW4uXG4gKi9cbmNvbnN0IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMgPSB7XG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ1BPU1QsIE9QVElPTlMsIEdFVCwgSEVBRCcsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZScsXG59O1xuXG4vKipcbiAqIFdyYXBzIGEgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGVyIGFuZCBhZGRzIGEgaGVhbHRoIGNoZWNrIFwibW9kZVwiXG4gKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBgX19oZWFsdGhgIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhIZWFsdGhDaGVjayhcbiAgaGFuZGxlcjogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgIGNvbnN0IGlzSGVhbHRoQ2hlY2sgPSB1cmwuc2VhcmNoUGFyYW1zLmhhcygnX19oZWFsdGgnKTtcbiAgICBpZiAoaXNIZWFsdGhDaGVjaykge1xuICAgICAgLy8gSGFuZGxlIENPUlMgcHJlZmxpZ2h0IGZvciBoZWFsdGggY2hlY2tcbiAgICAgIGlmIChyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgaGVhZGVyczogSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGVhbHRoeTogdHJ1ZSxcbiAgICAgICAgICBlbmRwb2ludDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIC4uLkhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RSdW5JZEZyb20oXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsXG4gIHJ1bklkOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBhdHRyaWJ1dGVzPy5bUk9PVF9SVU5fSURfQVRUUklCVVRFXSA/PyBydW5JZDtcbn1cblxuLyoqXG4gKiBUaGUgaW1tdXRhYmxlIHJ1biBpZGVudGl0eSBhIHN0ZXAtZXhlY3V0aW9uIG1lc3NhZ2UgY2FycmllcyBzbyBpdHMgY29uc3VtZXJcbiAqIGNhbiBzdGFydCB0aGUgc3RlcCB3aXRob3V0IGEgYmxvY2tpbmcgYHJ1bnMuZ2V0YCDigJQgc2VlXG4gKiBgUnVuRGlzcGF0Y2hDb250ZXh0U2NoZW1hYCBpbiBAd29ya2Zsb3cvd29ybGQuIEJ1aWx0IGF0IGRpc3BhdGNoIHRpbWUgZnJvbVxuICogdGhlIHJ1biByb3cgdGhlIHByb2R1Y2VyIGFscmVhZHkgaG9sZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5EaXNwYXRjaENvbnRleHQoXG4gIHJ1bjogUGljazxcbiAgICBXb3JrZmxvd1J1bixcbiAgICAncnVuSWQnIHwgJ2RlcGxveW1lbnRJZCcgfCAnc3BlY1ZlcnNpb24nIHwgJ3N0YXJ0ZWRBdCcgfCAnYXR0cmlidXRlcydcbiAgPlxuKTogUnVuRGlzcGF0Y2hDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBkZXBsb3ltZW50SWQ6IHJ1bi5kZXBsb3ltZW50SWQsXG4gICAgc3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbiA/PyAwLFxuICAgIC4uLihydW4uc3RhcnRlZEF0ID8geyBzdGFydGVkQXQ6ICtydW4uc3RhcnRlZEF0IH0gOiB7fSksXG4gICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKHJ1bi5hdHRyaWJ1dGVzLCBydW4ucnVuSWQpLFxuICB9O1xufVxuXG4vKiogRk5WLTFhIDMyLWJpdCBoYXNoIG9mIGEgc3RyaW5nLCBhcyA4IGhleCBjaGFycy4gVGlueSwgZGV0ZXJtaW5pc3RpYywgYW5kXG4gKiAgZGVwZW5kZW5jeS1mcmVlLiBVc2VkIG9ubHkgdG8gc2NvcGUgaWRlbXBvdGVuY3kga2V5cywgbm90IGZvciBzZWN1cml0eS4gKi9cbmZ1bmN0aW9uIGZudjFhMzJIZXgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBoYXNoID0gMHg4MTFjOWRjNTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGhhc2ggXj0gdmFsdWUuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDB4MDEwMDAxOTMpO1xuICB9XG4gIHJldHVybiAoaGFzaCA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICcwJyk7XG59XG5cbi8qKlxuICogSWRlbXBvdGVuY3kga2V5IGZvciBhIHN0ZXAncyBiYWNrZ3JvdW5kLWRpc3BhdGNoIHF1ZXVlIG1lc3NhZ2UsIHNjb3BlZCB0b1xuICogdGhlIHN0ZXAncyBJREVOVElUWSwgY29ycmVsYXRpb24gaWQgcGx1cyAoaGFzaGVkKSBzdGVwIG5hbWUsIHJhdGhlciB0aGFuXG4gKiB0aGUgYmFyZSBjb3JyZWxhdGlvbiBpZC5cbiAqXG4gKiBUaGUgc2NvcGluZyBtYXR0ZXJzIGZvciByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCB1bmRlciB0aGUgcHJlY29uZGl0aW9uXG4gKiBndWFyZDogYSBndWFyZC1yZWplY3RlZCBgc3RlcF9jcmVhdGVkYCBsZWF2ZXMgaXRzIChyZXZva2VkKSBzdGVwIG1lc3NhZ2UgaW5cbiAqIGZsaWdodCwgYW5kIHRoZSBjb3JyZWN0ZWQgcmVwbGF5IG1heSByZS1kZXJpdmUgdGhlIHNhbWUgY29ycmVsYXRpb24gaWQgZm9yXG4gKiBhIERJRkZFUkVOVCBzdGVwLiBVbmRlciBhIGJhcmUtY29ycmVsYXRpb25JZCBrZXkgdGhlIGNvcnJlY3RlZCByZXBsYXknc1xuICogZGlzcGF0Y2ggd291bGQgc2lsZW50bHkgZGVkdXBlIGFnYWluc3QgdGhlIHJldm9rZWQgaW4tZmxpZ2h0IG1lc3NhZ2UsXG4gKiB3aGljaCB0aGVuIHJlc29sdmVzIGBza2lwcGVkYCBhZ2FpbnN0IHRoZSByZS1jcmVhdGVkIGVudGl0eSAodGhlIHNlcnZlcidzXG4gKiBzdGVwTmFtZSBmZW5jZSByZWplY3RzIGl0cyBiYXJlIHN0YXJ0KSwgYW5kIHRoZSBsZWdpdGltYXRlIHN0ZXAgd291bGRcbiAqIG5ldmVyIGJlIGV4ZWN1dGVkLiBTY29waW5nIGJ5IHN0ZXAgbmFtZSBrZWVwcyBldmVyeSBkZWR1cCBwcm9wZXJ0eSB0aGF0XG4gKiBtYXR0ZXJzIChjcmFzaCByZWNvdmVyeSByZS1kaXNwYXRjaCwgY29uY3VycmVudCBoYW5kbGVycywgdGhlIGRlbGF5ZWRcbiAqIHJldHJ5IHNoYXJpbmcgdGhlIHN1c3BlbnNpb24gcmUtZGlzcGF0Y2gncyBrZXk6IGFsbCBuYW1lIHRoZSBzYW1lIHN0ZXApXG4gKiB3aGlsZSBsZXR0aW5nIHRoZSBjb3JyZWN0ZWQgc2NoZWR1bGUncyBkaXNwYXRjaCB0aHJvdWdoLlxuICpcbiAqIEV2ZXJ5IHByb2R1Y2VyIG9mIGEgc3RlcC1kaXNwYXRjaCAob3Igc3RlcC1yZXRyeSkgbWVzc2FnZSBtdXN0IHVzZSB0aGlzXG4gKiBrZXkuIENyb3NzLXZlcnNpb24gbWl4aW5nIGlzIG5vdCBhIGNvbmNlcm46IHF1ZXVlIG1lc3NhZ2VzIGFyZSBwaW5uZWQgdG9cbiAqIHRoZSBkZXBsb3ltZW50IHRoYXQgcHJvZHVjZWQgdGhlbSwgc28gb25lIHJ1biBuZXZlciBzZWVzIHR3byBrZXkgc2NoZW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gIHN0ZXBOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjb3JyZWxhdGlvbklkfToke2ZudjFhMzJIZXgoc3RlcE5hbWUpfWA7XG59XG5cbi8qKlxuICogUXVldWVzIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlIHdpdGggdHJhY2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWVzc2FnZShcbiAgd29ybGQ6IFdvcmxkLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5cbikge1xuICBjb25zdCBxdWV1ZU5hbWUgPSBhcmdzWzBdO1xuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUocXVldWVOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3B1Ymxpc2gnKSxcbiAgICAgICAgLy8gUGVlciBzZXJ2aWNlIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwc1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUGVlclNlcnZpY2UoJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1NlcnZpY2UoJ3ZxcycpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjTWV0aG9kKCdwdWJsaXNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlSWQgfSA9IGF3YWl0IHdvcmxkLnF1ZXVlKC4uLmFyZ3MpO1xuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWVzc2FnZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBzZXZlcmFsIG1lc3NhZ2VzIHRvIG9uZSBsb2dpY2FsIHF1ZXVlLCB1c2luZyB0aGUgV29ybGQncyBiYXRjaFxuICogc2VuZCB3aGVuIGl0IGhhcyBvbmUgYW5kIGZhbGxpbmcgYmFjayB0byBjb25jdXJyZW50IHNpbmdsZSBzZW5kcyB3aGVuIGl0XG4gKiBkb2VzIG5vdC5cbiAqXG4gKiBSZWplY3RzIGlmIEFOWSBtZXNzYWdlIGZhaWxlZCB0byBwdWJsaXNoLCBiZWNhdXNlIGV2ZXJ5IGNhbGxlciBzbyBmYXIgd2FudHNcbiAqIGFsbC1vci1ub3RoaW5nOiB0aGUgcmVjb3ZlcnkgaXMgdG8gZmFpbCB0aGUgZGVsaXZlcnkgYW5kIGxldCByZWRlbGl2ZXJ5XG4gKiByZXB1Ymxpc2ggdGhlIHdob2xlIHNldCwgZGVkdXBlZCBieSB0aGUgcGVyLW1lc3NhZ2UgYGlkZW1wb3RlbmN5S2V5YC4gVGhhdFxuICogbWVhbnMgYSBwYXJ0aWFsIGJhdGNoIGNhbiBsZWF2ZSBzb21lIG1lc3NhZ2VzIGFscmVhZHkgb3V0IOKAlCB3aGljaCBpc1xuICogZXhhY3RseSB3aHkgdGhlIGtleXMgYXJlIHJlcXVpcmVkIHJhdGhlciB0aGFuIGFkdmlzb3J5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVNZXNzYWdlcyhcbiAgd29ybGQ6IFdvcmxkLFxuICBxdWV1ZU5hbWU6IFBhcmFtZXRlcnM8dHlwZW9mIHdvcmxkLnF1ZXVlPlswXSxcbiAgbWVzc2FnZXM6IHJlYWRvbmx5IHtcbiAgICBtZXNzYWdlOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5bMV07XG4gICAgb3B0cz86IFBhcmFtZXRlcnM8dHlwZW9mIHdvcmxkLnF1ZXVlPlsyXTtcbiAgfVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBiYXRjaCA9IHdvcmxkLnF1ZXVlQmF0Y2g/LmJpbmQod29ybGQpO1xuICBpZiAoIWJhdGNoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZXNzYWdlcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICBxdWV1ZU1lc3NhZ2Uod29ybGQsIHF1ZXVlTmFtZSwgZW50cnkubWVzc2FnZSwgZW50cnkub3B0cylcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShxdWV1ZU5hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHVibGlzaCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nQmF0Y2hNZXNzYWdlQ291bnQobWVzc2FnZXMubGVuZ3RoKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlBlZXJTZXJ2aWNlKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNTZXJ2aWNlKCd2cXMnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY01ldGhvZCgncHVibGlzaEJhdGNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgYmF0Y2gocXVldWVOYW1lLCBtZXNzYWdlcyk7XG4gICAgICAvLyBBIFdvcmxkIHRoYXQgYW5zd2VycyB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgcmVzdWx0cyBoYXMgdG9sZCB1c1xuICAgICAgLy8gbm90aGluZyBhYm91dCB0aGUgbWVzc2FnZXMgaXQgbGVmdCBvdXQuIFRyZWF0ZWQgYXMgYSBmYWlsdXJlIG9mIHRoZVxuICAgICAgLy8gd2hvbGUgYmF0Y2ggcmF0aGVyIHRoYW4gcmVhZCBhcyBzdWNjZXNzIGZvciB0aGUgZW50cmllcyB0aGF0IEFSRVxuICAgICAgLy8gcHJlc2VudDogcmVwdWJsaXNoaW5nIHVuZGVyIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleXMgaXMgc2FmZSxcbiAgICAgIC8vIHNpbGVudGx5IG5ldmVyIGRpc3BhdGNoaW5nIGEgc3RlcCBpcyBub3QgKHRoZSBydW4gbWFrZXMgbm8gcHJvZ3Jlc3NcbiAgICAgIC8vIGFuZCBub3RoaW5nIHN1cmZhY2VzIGFuIGVycm9yKS5cbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPT0gbWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFF1ZXVlIGJhdGNoIGZvciAke3F1ZXVlTmFtZX0gcmV0dXJuZWQgJHtyZXN1bHRzLmxlbmd0aH0gYCArXG4gICAgICAgICAgICAgIGByZXN1bHQocykgZm9yICR7bWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlKHMpYFxuICAgICAgICAgICksXG4gICAgICAgICAgeyByZXRyeWFibGU6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmFpbHVyZXMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQuZXJyb3IgIT09IHVuZGVmaW5lZCk7XG4gICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBjb25zdCByZXRyeWFibGUgPSBmYWlsdXJlcy5zb21lKFxuICAgICAgICAoZmFpbHVyZSkgPT4gZmFpbHVyZS5lcnJvciAhPT0gdW5kZWZpbmVkICYmIGZhaWx1cmUucmV0cnlhYmxlXG4gICAgICApO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcHVibGlzaCAke2ZhaWx1cmVzLmxlbmd0aH0gb2YgJHttZXNzYWdlcy5sZW5ndGh9IHF1ZXVlIGAgK1xuICAgICAgICAgIGBtZXNzYWdlKHMpIHRvICR7cXVldWVOYW1lfTogJHtmYWlsdXJlc1swXT8uZXJyb3J9YFxuICAgICAgKTtcbiAgICAgIC8vIENhcnJpZWQgb24gdGhlIGVycm9yIHNvIGEgY2FsbGVyIENBTiB0ZWxsIGEgdHJhbnNpZW50IHBhcnRpYWwgYmF0Y2hcbiAgICAgIC8vIGZyb20gYSBwZXJtYW5lbnQgcmVqZWN0aW9uLiBOb3RoaW5nIHJlYWRzIGl0IHlldDogdG9kYXkgZXZlcnkgY2FsbGVyXG4gICAgICAvLyByZWplY3RzIHRoZSBkZWxpdmVyeSBlaXRoZXIgd2F5LCBzbyBhIHBlcm1hbmVudGx5IHJlamVjdGVkIGVudHJ5XG4gICAgICAvLyBzdGlsbCBjb3N0cyB0aGUgZnVsbCByZWRlbGl2ZXJ5IGJ1ZGdldC4gTGVmdCBpbiBwbGFjZSBiZWNhdXNlIHRoZVxuICAgICAgLy8gaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaGVyZSwgYW5kIGEgZmFzdC1mYWlsIG9uXG4gICAgICAvLyBgcmV0cnlhYmxlOiBmYWxzZWAgbmVlZHMgaXQuXG4gICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IHJldHJ5YWJsZSB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBxdWV1ZSBvdmVyaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgYSBnaXZlbiBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVldWVPdmVyaGVhZChtZXNzYWdlOiB7IHJlcXVlc3RlZEF0PzogRGF0ZSB9KSB7XG4gIGlmICghbWVzc2FnZS5yZXF1ZXN0ZWRBdCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHJldHVybiBBdHRyaWJ1dGUuUXVldWVPdmVyaGVhZE1zKFxuICAgICAgRGF0ZS5ub3coKSAtIG1lc3NhZ2UucmVxdWVzdGVkQXQuZ2V0VGltZSgpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcnVuJ3MgZnVsbCBwYXlsb2FkLWVuY3J5cHRpb24gY2FwYWJpbGl0eS4gVGhpcyBpbmNsdWRlcyB0aGVcbiAqIHN5bW1ldHJpYyBrZXkgYW5kIFgyNTUxOSBrZXlwYWlyIG5lZWRlZCB0byBvcGVuIGNyb3NzLXJ1biBzZWFsZWQgcGF5bG9hZHMuXG4gKiBNaXNzaW5nIHdvcmxkIHN1cHBvcnQgb3Iga2V5IG1hdGVyaWFsIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgOyBsb29rdXAgYW5kXG4gKiBkZXJpdmF0aW9uIGZhaWx1cmVzIHByb3BhZ2F0ZSByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWxsaW5nIGJhY2sgdG8gcGxhaW50ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmcsXG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJhd0tleSA9XG4gICAgdHlwZW9mIHJ1bk9ySWQgPT09ICdzdHJpbmcnXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkLCBjb250ZXh0KVxuICAgICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZCk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGxhenksIG1lbW9pemVkIGFjY2Vzc29yIGFyb3VuZCB7QGxpbmsgcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXl9LlxuICogQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBzYW1lIHByb21pc2UsIGluY2x1ZGluZyBpdHMgcmVqZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmdcbik6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBsZXQgY2FjaGVkOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSByZXNvbHZlUnVuRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuT3JJZCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAqBA,OAAO,EAGL,KAAK,KAAK,EAaV,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AA4GzB,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,UAAU,EACV,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,MAAM,EACN,GAAG,EACH,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,GACtC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,gBAAgB,EACrB,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,UAAU,EACV,uBAAuB,EACvB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AA2e5B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAg+IrC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAqBA,OAAO,EAGL,KAAK,KAAK,EAaV,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAiHzB,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,UAAU,EACV,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,MAAM,EACN,GAAG,EACH,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,GACtC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,gBAAgB,EACrB,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,UAAU,EACV,uBAAuB,EACvB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AA2e5B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA0+IrC"}