obsidian-dev-utils 39.0.0 → 40.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/lib/cjs/Async.cjs +16 -22
- package/dist/lib/cjs/Library.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.cjs +3 -2
- package/dist/lib/cjs/obsidian/AttachmentPath.cjs +52 -23
- package/dist/lib/cjs/obsidian/AttachmentPath.d.cts +98 -23
- package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +7 -2
- package/dist/lib/esm/Async.mjs +16 -22
- package/dist/lib/esm/Library.mjs +1 -1
- package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.mjs +3 -2
- package/dist/lib/esm/obsidian/AttachmentPath.d.mts +98 -23
- package/dist/lib/esm/obsidian/AttachmentPath.mjs +53 -24
- package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +7 -2
- package/package.json +1 -1
|
@@ -3,42 +3,122 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides utility functions for working with attachment paths.
|
|
5
5
|
*/
|
|
6
|
-
import type { App,
|
|
6
|
+
import type { App, FileStats } from 'obsidian';
|
|
7
7
|
import type { PathOrFile } from './FileSystem.cjs';
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* An overridden wrapper.
|
|
10
10
|
*/
|
|
11
11
|
export interface ExtendedWrapper {
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* An extended function.
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
extended: GetAvailablePathForAttachmentsExtendedFn;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* Get available path for attachments function.
|
|
18
|
+
* Get available path for attachments extended function.
|
|
19
19
|
*
|
|
20
|
-
* @param
|
|
21
|
-
* @param attachmentFileExtension - File extension of the attachment.
|
|
22
|
-
* @param noteFile - The note file to attach to.
|
|
23
|
-
* @param shouldSkipMissingAttachmentFolderCreation - Should missing attachment folder creation be skipped.
|
|
24
|
-
* @param shouldSkipDuplicateCheck - Should the duplicate check be skipped.
|
|
20
|
+
* @param options - Options for the get available path for attachments extended function.
|
|
25
21
|
* @returns A {@link Promise} that resolves to the available path for attachments.
|
|
26
22
|
*/
|
|
27
|
-
export type GetAvailablePathForAttachmentsExtendedFn = (
|
|
23
|
+
export type GetAvailablePathForAttachmentsExtendedFn = (options: GetAvailablePathForAttachmentsExtendedFnOptions) => Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Options for the get available path for attachments extended function.
|
|
26
|
+
*/
|
|
27
|
+
export interface GetAvailablePathForAttachmentsExtendedFnOptions {
|
|
28
|
+
/**
|
|
29
|
+
* A base name of the attachment.
|
|
30
|
+
*/
|
|
31
|
+
attachmentFileBaseName: string;
|
|
32
|
+
/**
|
|
33
|
+
* A content of the attachment file.
|
|
34
|
+
*/
|
|
35
|
+
attachmentFileContent?: ArrayBuffer | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* An extension of the attachment.
|
|
38
|
+
*/
|
|
39
|
+
attachmentFileExtension: string;
|
|
40
|
+
/**
|
|
41
|
+
* A stats of the attachment file.
|
|
42
|
+
*/
|
|
43
|
+
attachmentFileStat?: FileStats | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* A path or file of the note.
|
|
46
|
+
*/
|
|
47
|
+
notePathOrFile: null | PathOrFile;
|
|
48
|
+
/**
|
|
49
|
+
* Should the duplicate check be skipped.
|
|
50
|
+
*/
|
|
51
|
+
shouldSkipDuplicateCheck?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Should the generated attachment file name be skipped.
|
|
54
|
+
*/
|
|
55
|
+
shouldSkipGeneratedAttachmentFileName?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Should missing attachment folder creation be skipped.
|
|
58
|
+
*/
|
|
59
|
+
shouldSkipMissingAttachmentFolderCreation: boolean | undefined;
|
|
60
|
+
}
|
|
28
61
|
/**
|
|
29
62
|
* Dummy path.
|
|
30
63
|
*/
|
|
31
64
|
export declare const DUMMY_PATH = "__DUMMY__";
|
|
65
|
+
/**
|
|
66
|
+
* Options for the getAttachmentFilePath function.
|
|
67
|
+
*/
|
|
68
|
+
export interface GetAttachmentFilePathOptions {
|
|
69
|
+
/**
|
|
70
|
+
* An Obsidian application instance.
|
|
71
|
+
*/
|
|
72
|
+
app: App;
|
|
73
|
+
/**
|
|
74
|
+
* A path of the attachment.
|
|
75
|
+
*/
|
|
76
|
+
attachmentPathOrFile: PathOrFile;
|
|
77
|
+
/**
|
|
78
|
+
* A path of the note.
|
|
79
|
+
*/
|
|
80
|
+
notePathOrFile: PathOrFile;
|
|
81
|
+
/**
|
|
82
|
+
* Should the duplicate check be skipped.
|
|
83
|
+
*/
|
|
84
|
+
shouldSkipDuplicateCheck: boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Options for the getAvailablePathForAttachments function.
|
|
88
|
+
*/
|
|
89
|
+
export interface GetAvailablePathForAttachmentsOptions {
|
|
90
|
+
/**
|
|
91
|
+
* An Obsidian application instance.
|
|
92
|
+
*/
|
|
93
|
+
app: App;
|
|
94
|
+
/**
|
|
95
|
+
* A base name of the attachment.
|
|
96
|
+
*/
|
|
97
|
+
attachmentFileBaseName: string;
|
|
98
|
+
/**
|
|
99
|
+
* An extension of the attachment.
|
|
100
|
+
*/
|
|
101
|
+
attachmentFileExtension: string;
|
|
102
|
+
/**
|
|
103
|
+
* A file to attach to.
|
|
104
|
+
*/
|
|
105
|
+
notePathOrFile: null | PathOrFile;
|
|
106
|
+
/**
|
|
107
|
+
* Should the duplicate check be skipped.
|
|
108
|
+
*/
|
|
109
|
+
shouldSkipDuplicateCheck?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Should missing attachment folder creation be skipped.
|
|
112
|
+
*/
|
|
113
|
+
shouldSkipMissingAttachmentFolderCreation?: boolean;
|
|
114
|
+
}
|
|
32
115
|
/**
|
|
33
116
|
* Retrieves the file path for an attachment within a note.
|
|
34
117
|
*
|
|
35
|
-
* @param
|
|
36
|
-
* @param attachmentPathOrFile - The path of the attachment.
|
|
37
|
-
* @param notePathOrFile - The path of the note.
|
|
38
|
-
* @param shouldSkipDuplicateCheck - Should the duplicate check be skipped.
|
|
118
|
+
* @param options - Options for the get attachment file path function.
|
|
39
119
|
* @returns A {@link Promise} that resolves to the file path of the attachment.
|
|
40
120
|
*/
|
|
41
|
-
export declare function getAttachmentFilePath(
|
|
121
|
+
export declare function getAttachmentFilePath(options: GetAttachmentFilePathOptions): Promise<string>;
|
|
42
122
|
/**
|
|
43
123
|
* Retrieves the attachment folder path for a given note.
|
|
44
124
|
*
|
|
@@ -50,15 +130,10 @@ export declare function getAttachmentFolderPath(app: App, notePathOrFile: PathOr
|
|
|
50
130
|
/**
|
|
51
131
|
* Retrieves the available path for attachments.
|
|
52
132
|
*
|
|
53
|
-
* @param
|
|
54
|
-
* @param attachmentFileBaseName - File name of the attachment.
|
|
55
|
-
* @param attachmentFileExtension - Extension of the attachment.
|
|
56
|
-
* @param noteFile - The file to attach to.
|
|
57
|
-
* @param shouldSkipMissingAttachmentFolderCreation - Should missing attachment folder creation be skipped.
|
|
58
|
-
* @param shouldSkipDuplicateCheck - Should the duplicate check be skipped.
|
|
133
|
+
* @param options - Options for the get available path for attachments function.
|
|
59
134
|
* @returns A {@link Promise} that resolves to the available path for attachments.
|
|
60
135
|
*/
|
|
61
|
-
export declare function getAvailablePathForAttachments(
|
|
136
|
+
export declare function getAvailablePathForAttachments(options: GetAvailablePathForAttachmentsOptions): Promise<string>;
|
|
62
137
|
/**
|
|
63
138
|
* Checks if a note has its own attachment folder.
|
|
64
139
|
*
|
|
@@ -161,7 +161,12 @@ async function fillRenameMap(app, oldPath, newPath, renameMap, oldPathLinks, abo
|
|
|
161
161
|
}
|
|
162
162
|
let newAttachmentFilePath;
|
|
163
163
|
if (settings.shouldRenameAttachmentFiles) {
|
|
164
|
-
newAttachmentFilePath = await (0, import_AttachmentPath.getAttachmentFilePath)(
|
|
164
|
+
newAttachmentFilePath = await (0, import_AttachmentPath.getAttachmentFilePath)({
|
|
165
|
+
app,
|
|
166
|
+
attachmentPathOrFile: oldAttachmentFile,
|
|
167
|
+
notePathOrFile: newPath,
|
|
168
|
+
shouldSkipDuplicateCheck: true
|
|
169
|
+
});
|
|
165
170
|
abortSignal.throwIfAborted();
|
|
166
171
|
} else {
|
|
167
172
|
const relativePath = isOldAttachmentFolderAtRoot ? oldAttachmentFile.path : (0, import_Path.relative)(oldAttachmentFolderPath, oldAttachmentFile.path);
|
|
@@ -542,4 +547,4 @@ function shouldInvokeHandler(plugin) {
|
|
|
542
547
|
EmptyAttachmentFolderBehavior,
|
|
543
548
|
registerRenameDeleteHandlers
|
|
544
549
|
});
|
|
545
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5cbmltcG9ydCB7IFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtPcHRpb25zLFxuICBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnNcbn0gZnJvbSAnLi9MaW5rLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vQXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3RVdGlscy50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQge1xuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYXRjaCB9IGZyb20gJy4vTW9ua2V5QXJvdW5kLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuL1F1ZXVlLnRzJztcbmltcG9ydCB7XG4gIGdldFNhZmVSZW5hbWVQYXRoLFxuICByZW5hbWVTYWZlXG59IGZyb20gJy4vVmF1bHQudHMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHksXG4gIGRlbGV0ZVNhZmVcbn0gZnJvbSAnLi9WYXVsdEV4LnRzJztcblxuY29uc3QgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5jb25zdCBoYW5kbGVkUmVuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbi8qKlxuICogQSBiZWhhdmlvciBvZiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHdoZW4gZGVsZXRpbmcgZW1wdHkgYXR0YWNobWVudCBmb2xkZXJzLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgYXR0YWNobWVudCBmb2xkZXIgYW5kIGFsbCBpdHMgZW1wdHkgcGFyZW50cy5cbiAgICovXG4gIERlbGV0ZVdpdGhFbXB0eVBhcmVudHMgPSAnRGVsZXRlV2l0aEVtcHR5UGFyZW50cycsXG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVyLlxuICAgKi9cbiAgS2VlcCA9ICdLZWVwJ1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBhdHRhY2htZW50IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcjogRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhdGggaXMgYSBub3RlLlxuICAgKi9cbiAgaXNOb3RlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBwYXRoLlxuICAgKi9cbiAgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBYm9ydGFibGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxudHlwZSBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9IEZpbGVNYW5hZ2VyWydydW5Bc3luY0xpbmtVcGRhdGUnXTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2V0dGluZ3NCdWlsZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVuYW1lIGRlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZW5hbWVEZWxldGVIYW5kbGVycyhwbHVnaW46IEFib3J0YWJsZVBsdWdpbiwgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChwbHVnaW4uYXBwKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHBsdWdpbklkLCBzZXR0aW5nc0J1aWxkZXIpO1xuICBsb2dSZWdpc3RlcmVkSGFuZGxlcnMocGx1Z2luLmFwcCk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUocGx1Z2luSWQpO1xuICAgIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhwbHVnaW4uYXBwKTtcbiAgfSk7XG5cbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgY29uc3QgYWJvcnRTaWduYWwgPSBwbHVnaW4uYWJvcnRTaWduYWwgPz8gYWJvcnRTaWduYWxOZXZlcigpO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpID0+IHtcbiAgICAgIGhhbmRsZURlbGV0ZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUsIGFib3J0U2lnbmFsKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUsIG9sZFBhdGgsIGFib3J0U2lnbmFsKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgKGZpbGUsIHByZXZDYWNoZSkgPT4ge1xuICAgICAgaGFuZGxlTWV0YWRhdGFEZWxldGVkSWZFbmFibGVkKHBsdWdpbiwgZmlsZSwgcHJldkNhY2hlKTtcbiAgICB9KVxuICApO1xuXG4gIHJlZ2lzdGVyUGF0Y2gocGx1Z2luLCBhcHAuZmlsZU1hbmFnZXIsIHtcbiAgICBydW5Bc3luY0xpbmtVcGRhdGU6IChuZXh0OiBSdW5Bc3luY0xpbmtVcGRhdGVGbik6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuID0+IHtcbiAgICAgIHJldHVybiAobGlua1VwZGF0ZXNIYW5kbGVyKSA9PiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwLCBuZXh0LCBsaW5rVXBkYXRlc0hhbmRsZXIpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBQYXJlbnRGb2xkZXJzKGFwcDogQXBwLCBwYXJlbnRGb2xkZXJQYXRoczogc3RyaW5nW10sIG5vdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgPT09IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBwYXJlbnRGb2xkZXJQYXRoIG9mIHBhcmVudEZvbGRlclBhdGhzKSB7XG4gICAgc3dpdGNoIChzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcikge1xuICAgICAgY2FzZSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5EZWxldGU6XG4gICAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBwYXJlbnRGb2xkZXJQYXRoLCBub3RlUGF0aCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLkRlbGV0ZVdpdGhFbXB0eVBhcmVudHM6XG4gICAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcCwgcGFyZW50Rm9sZGVyUGF0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IGludGVycnVwdGVkUmVuYW1lc01hcC5nZXQob2xkUGF0aCk7XG4gIGlmIChpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKG9sZFBhdGgpO1xuICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcywgaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxsUmVuYW1lTWFwKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXSxcbiAgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgcmVuYW1lTWFwLnNldChvbGRQYXRoLCBuZXdQYXRoKTtcblxuICBpZiAoIWlzTm90ZUV4KGFwcCwgb2xkUGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIG9sZFBhdGgpO1xuICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgbmV3UGF0aClcbiAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICBpZiAoYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcihhcHAsIG9sZFBhdGgpKSB7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIG9sZFBhdGhMaW5rcykge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgb2xkUGF0aExpbmssIG9sZFBhdGgpO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAoaXNOb3RlRXgoYXBwLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IG5ld0F0dGFjaG1lbnRGaWxlUGF0aDogc3RyaW5nO1xuICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aChhcHAsIG9sZEF0dGFjaG1lbnRGaWxlLCBuZXdQYXRoLCB0cnVlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgIH1cblxuICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHQpO1xuICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXIsIGJhc2VOYW1lKSwgZXh0LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcDogQXBwKTogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoYXBwLCAncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0dGluZ3MoYXBwOiBBcHApOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4ge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IHNldHRpbmdzQnVpbGRlcnMgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnZhbHVlcygpKS5yZXZlcnNlKCk7XG5cbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc05vdGUoYXBwLCBwYXRoKTtcbiAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9ICgpOiBib29sZWFuID0+IGZhbHNlO1xuXG4gIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgIHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgPz8gZmFsc2U7XG4gICAgaWYgKG5ld1NldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yKSB7XG4gICAgICBzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciA/Pz0gbmV3U2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3I7XG4gICAgfVxuICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICBjb25zdCBpc1BhdGhJZ25vcmVkID0gc2V0dGluZ3MuaXNQYXRoSWdub3JlZDtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNQYXRoSWdub3JlZChwYXRoKSB8fCAobmV3U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlKTtcbiAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1cnJlbnRJc05vdGUocGF0aCkgJiYgKG5ld1NldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IHRydWUpO1xuICB9XG5cbiAgc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgPz89IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXA7XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2FzZUNvbGxpc2lvbihcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIWFwcC52YXVsdC5hZGFwdGVyLmluc2Vuc2l0aXZlIHx8IG9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdGVtcFBhdGggPSBqb2luKGRpcm5hbWUobmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUobmV3UGF0aCl9YCk7XG4gIGF3YWl0IHJlbmFtZUhhbmRsZWQoYXBwLCBuZXdQYXRoLCB0ZW1wUGF0aCk7XG4gIGF3YWl0IGhhbmRsZVJlbmFtZUFzeW5jKGFwcCwgb2xkUGF0aCwgdGVtcFBhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGF3YWl0IGFwcC52YXVsdC5yZW5hbWUoZ2V0RmlsZShhcHAsIHRlbXBQYXRoKSwgbmV3UGF0aCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVEZWxldGUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7cGF0aH1gKTtcbiAgaWYgKCFpc05vdGVFeChhcHAsIHBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7cGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldChwYXRoKTtcbiAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHBhdGgpO1xuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IGdldEFsbExpbmtzKGNhY2hlKTtcblxuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBsaW5rLCBwYXRoKTtcbiAgICAgIGlmICghYXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05vdGVFeChhcHAsIGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50RmlsZSwgcGF0aCwgZmFsc2UsIHNldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5LZWVwKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnMoYXBwLCBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKSwgcGF0aCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIHBhdGgpO1xuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgYXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghKGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoYXBwLCBwYXRoKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50Rm9sZGVyLCBwYXRoLCBmYWxzZSwgc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXApO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVEZWxldGVJZkVuYWJsZWQocGx1Z2luOiBBYm9ydGFibGVQbHVnaW4sIGZpbGU6IFRBYnN0cmFjdEZpbGUsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYXRoID0gZmlsZS5wYXRoO1xuICBhZGRUb1F1ZXVlKGFwcCwgKGFib3J0U2lnbmFsMikgPT4gaGFuZGxlRGVsZXRlKGFwcCwgcGF0aCwgYWJvcnRTaWduYWwyKSwgYWJvcnRTaWduYWwpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoYXBwOiBBcHAsIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke2ZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNNYXJrZG93bkZpbGUoYXBwLCBmaWxlKSAmJiBwcmV2Q2FjaGUpIHtcbiAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQoZmlsZS5wYXRoLCBwcmV2Q2FjaGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZElmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaGFuZGxlTWV0YWRhdGFEZWxldGVkKHBsdWdpbi5hcHAsIGZpbGUsIHByZXZDYWNoZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBrZXkgPSBtYWtlS2V5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke2tleX1gKTtcbiAgaWYgKGhhbmRsZWRSZW5hbWVzLmhhcyhrZXkpKSB7XG4gICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBvbGQgcGF0aCAke29sZFBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihuZXdQYXRoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gIGNvbnN0IG9sZFBhdGhMaW5rcyA9IGNhY2hlID8gZ2V0QWxsTGlua3MoY2FjaGUpIDogW107XG4gIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgYWRkVG9RdWV1ZShhcHAsIChhYm9ydFNpZ25hbDIpID0+IGhhbmRsZVJlbmFtZUFzeW5jKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzLCB1bmRlZmluZWQsIGFib3J0U2lnbmFsMiksIGFib3J0U2lnbmFsKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVuYW1lQXN5bmMoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdLFxuICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBhd2FpdCBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGF3YWl0IHJlZnJlc2hMaW5rcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGlmIChhd2FpdCBoYW5kbGVDYXNlQ29sbGlzaW9uKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGF3YWl0IGZpbGxSZW5hbWVNYXAoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCByZW5hbWVNYXAsIG9sZFBhdGhMaW5rcywgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIGluaXRCYWNrbGlua3NNYXAob2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgb2xkUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgYXR0YWNobWVudE9sZFBhdGgpKS5kYXRhO1xuICAgICAgaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgYXR0YWNobWVudE9sZFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCByZW5hbWVIYW5kbGVkKGFwcCwgb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBjbGVhbnVwUGFyZW50Rm9sZGVycyhhcHAsIEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpLCBvbGRQYXRoKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICAgIGZvciAoXG4gICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgQXJyYXkuZnJvbShpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPy5lbnRyaWVzKCkgPz8gW10pXG4gICAgICApXG4gICAgKSB7XG4gICAgICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdCYWNrbGlua1BhdGgsIChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpO1xuICAgICAgICBpZiAoIW5ld0F0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7XG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cblxuICAgIGlmIChpc05vdGVFeChhcHAsIG5ld1BhdGgpKSB7XG4gICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVPcHRpb25zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3UGF0aCxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogb2xkUGF0aCxcbiAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgIH0pKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKCFnZXRGaWxlT3JOdWxsKGFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KG5ld1BhdGgpO1xuICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcC5zZXQobmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgIH1cbiAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIG9sZFBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbShoYW5kbGVkUmVuYW1lcyk7XG4gICAgYWRkVG9RdWV1ZShhcHAsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSwgYWJvcnRTaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcbiAgaGFuZGxlUmVuYW1lKHBsdWdpbi5hcHAsIG9sZFBhdGgsIG5ld1BhdGgsIGFib3J0U2lnbmFsKTtcbn1cblxuZnVuY3Rpb24gaW5pdEJhY2tsaW5rc01hcChcbiAgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+LFxuICBwYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcmVuYW1lTWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgbGlua0pzb25Ub1BhdGhNYXAuc2V0KHRvSnNvbihsaW5rKSwgcGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm90ZUV4KGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhhcHA6IEFwcCk6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmxvZ1JlZ2lzdGVyZWRIYW5kbGVycycpKFxuICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKSl9YFxuICApO1xufVxuXG5mdW5jdGlvbiBtYWtlS2V5KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoTGlua3MoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgY29uc3Qgb2xkUGF0aExpbmtzUmVmcmVzaGVkID0gY2FjaGUgPyBnZXRBbGxMaW5rcyhjYWNoZSkgOiBbXTtcbiAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKGFwcCwgb2xkUGF0aCwgdHJ1ZSk7XG4gIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPigpO1xuICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bihhcHAsIFtmYWtlT2xkRmlsZV0sIGFzeW5jICgpID0+IHtcbiAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2Ygb2xkUGF0aExpbmtzUmVmcmVzaGVkKSB7XG4gICAgaWYgKG9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG9sZFBhdGhMaW5rcy5wdXNoKGxpbmspO1xuICB9XG5cbiAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICBsZXQgb2xkTGlua3MgPSBvbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgIG9sZExpbmtzID0gW107XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmFtZUhhbmRsZWQoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaGFuZGxlZFJlbmFtZXMuYWRkKGtleSk7XG4gIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIHJldHVybiBuZXdQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwOiBBcHAsIG5leHQ6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXh0LmNhbGwoYXBwLmZpbGVNYW5hZ2VyLCB3cmFwcGVkSGFuZGxlcik7XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlZEhhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICBpZiAoaXNSZW5hbWVDYWxsZWQgJiYgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgZmlsdGVySW5QbGFjZShcbiAgICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2Ygc291cmNlIGZpbGUgJHtsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKCdiYWNrbGluay1jYWNoZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09ICdjYW52YXMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSAnY2FudmFzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbjogUGx1Z2luKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMua2V5cygpKVswXTtcbiAgaWYgKG1haW5QbHVnaW5JZCAhPT0gcGx1Z2luSWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBLHNCQUFzQjtBQUN0Qiw2QkFBbUM7QUFPbkMsNkJBQWlDO0FBQ2pDLG1CQUE4QjtBQUM5QixtQkFBK0I7QUFDL0IseUJBR087QUFDUCxrQkFNTztBQUNQLGlCQUF5QztBQUN6Qyw0QkFJTztBQUNQLHdCQU9PO0FBQ1Asa0JBS087QUFDUCwyQkFLTztBQUNQLDBCQUE4QjtBQUM5QixtQkFBMkI7QUFDM0IsbUJBR087QUFDUCxxQkFHTztBQUVQLE1BQU0sMEJBQTBCLG9CQUFJLElBQTRCO0FBQ2hFLE1BQU0saUJBQWlCLG9CQUFJLElBQVk7QUFDdkMsTUFBTSx3QkFBd0Isb0JBQUksSUFBaUM7QUFLNUQsSUFBSyxnQ0FBTCxrQkFBS0EsbUNBQUw7QUFJTCxFQUFBQSwrQkFBQSxZQUFTO0FBS1QsRUFBQUEsK0JBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLCtCQUFBLFVBQU87QUFkRyxTQUFBQTtBQUFBLEdBQUE7QUFvRkwsU0FBUyw2QkFBNkIsUUFBeUIsaUJBQW1FO0FBQ3ZJLFFBQU0sMEJBQTBCLDJCQUEyQixPQUFPLEdBQUc7QUFDckUsUUFBTSxXQUFXLE9BQU8sU0FBUztBQUVqQywwQkFBd0IsSUFBSSxVQUFVLGVBQWU7QUFDckQsd0JBQXNCLE9BQU8sR0FBRztBQUVoQyxTQUFPLFNBQVMsTUFBTTtBQUNwQiw0QkFBd0IsT0FBTyxRQUFRO0FBQ3ZDLDBCQUFzQixPQUFPLEdBQUc7QUFBQSxFQUNsQyxDQUFDO0FBRUQsUUFBTSxNQUFNLE9BQU87QUFDbkIsUUFBTSxj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R0FBRztBQUN0QixZQUFVLFVBQU0seUJBQVcsS0FBSyxTQUFTLE9BQU87QUFDaEQsU0FBTztBQUNUO0FBRUEsZUFBZSxtQkFBbUIsS0FBVSxNQUE0QixvQkFBdUQ7QUFDN0gsUUFBTSxLQUFLLEtBQUssSUFBSSxhQUFhLGNBQWM7QUFFL0MsaUJBQWUsZUFBZSxhQUEwQztBQUN0RSxRQUFJLGlCQUFpQjtBQUNyQixVQUFNLFdBQVcsSUFBSSxNQUFNLEdBQUcsVUFBVSxNQUFNO0FBQzVDLHVCQUFpQjtBQUFBLElBQ25CLENBQUM7QUFDRCxRQUFJO0FBQ0YsWUFBTSxtQkFBbUIsV0FBVztBQUFBLElBQ3RDLFVBQUU7QUFDQSxVQUFJLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDM0I7QUFDQSxVQUFNLFdBQVcsWUFBWSxHQUFHO0FBRWhDLFFBQUksa0JBQWtCLFNBQVMscUJBQXFCO0FBQ2xEO0FBQUEsUUFDRTtBQUFBLFFBQ0EsQ0FBQyxlQUFlO0FBQ2QsY0FBSSxTQUFTLGdCQUFnQixXQUFXLFdBQVcsSUFBSSxHQUFHO0FBQ3hELG9CQUFRLEtBQUssbURBQW1ELFdBQVcsV0FBVyxJQUFJLDBCQUEwQjtBQUNwSCxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLFNBQVMsZ0JBQWdCLFdBQVcsYUFBYSxJQUFJLEdBQUc7QUFDMUQsb0JBQVEsS0FBSyxxREFBcUQsV0FBVyxhQUFhLElBQUksMEJBQTBCO0FBQ3hILG1CQUFPO0FBQUEsVUFDVDtBQUVBLGNBQUksQ0FBQyxJQUFJLGdCQUFnQixxQkFBcUIsMENBQW1CLE1BQU0sR0FBRztBQUN4RSxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLElBQUksUUFBUSxVQUFVLGdCQUFnQixHQUFHO0FBQzNDLG1CQUFPO0FBQUEsVUFDVDtBQUVBLGNBQUksV0FBVyxXQUFXLGNBQWMsVUFBVTtBQUNoRCxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLFdBQVcsYUFBYSxjQUFjLFVBQVU7QUFDbEQsbUJBQU87QUFBQSxVQUNUO0FBRUEsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLG9CQUFvQixRQUF5QjtBQUNwRCxRQUFNLE1BQU0sT0FBTztBQUNuQixRQUFNLFdBQVcsT0FBTyxTQUFTO0FBRWpDLFFBQU0sK0JBQStCLDJCQUEyQixHQUFHO0FBQ25FLFFBQU0sZUFBZSxNQUFNLEtBQUssNkJBQTZCLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDdEUsTUFBSSxpQkFBaUIsVUFBVTtBQUM3QixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IiXQp9Cg==
|
|
550
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncyc7XG5cbmltcG9ydCB7IFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtPcHRpb25zLFxuICBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnNcbn0gZnJvbSAnLi9MaW5rLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vQXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3RVdGlscy50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQge1xuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYXRjaCB9IGZyb20gJy4vTW9ua2V5QXJvdW5kLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuL1F1ZXVlLnRzJztcbmltcG9ydCB7XG4gIGdldFNhZmVSZW5hbWVQYXRoLFxuICByZW5hbWVTYWZlXG59IGZyb20gJy4vVmF1bHQudHMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHksXG4gIGRlbGV0ZVNhZmVcbn0gZnJvbSAnLi9WYXVsdEV4LnRzJztcblxuY29uc3QgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5jb25zdCBoYW5kbGVkUmVuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbi8qKlxuICogQSBiZWhhdmlvciBvZiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHdoZW4gZGVsZXRpbmcgZW1wdHkgYXR0YWNobWVudCBmb2xkZXJzLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgYXR0YWNobWVudCBmb2xkZXIgYW5kIGFsbCBpdHMgZW1wdHkgcGFyZW50cy5cbiAgICovXG4gIERlbGV0ZVdpdGhFbXB0eVBhcmVudHMgPSAnRGVsZXRlV2l0aEVtcHR5UGFyZW50cycsXG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGVtcHR5IGF0dGFjaG1lbnQgZm9sZGVyLlxuICAgKi9cbiAgS2VlcCA9ICdLZWVwJ1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBhdHRhY2htZW50IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcjogRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhdGggaXMgYSBub3RlLlxuICAgKi9cbiAgaXNOb3RlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBwYXRoLlxuICAgKi9cbiAgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBYm9ydGFibGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxudHlwZSBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9IEZpbGVNYW5hZ2VyWydydW5Bc3luY0xpbmtVcGRhdGUnXTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2V0dGluZ3NCdWlsZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVuYW1lIGRlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZW5hbWVEZWxldGVIYW5kbGVycyhwbHVnaW46IEFib3J0YWJsZVBsdWdpbiwgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChwbHVnaW4uYXBwKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHBsdWdpbklkLCBzZXR0aW5nc0J1aWxkZXIpO1xuICBsb2dSZWdpc3RlcmVkSGFuZGxlcnMocGx1Z2luLmFwcCk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUocGx1Z2luSWQpO1xuICAgIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhwbHVnaW4uYXBwKTtcbiAgfSk7XG5cbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgY29uc3QgYWJvcnRTaWduYWwgPSBwbHVnaW4uYWJvcnRTaWduYWwgPz8gYWJvcnRTaWduYWxOZXZlcigpO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpID0+IHtcbiAgICAgIGhhbmRsZURlbGV0ZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUsIGFib3J0U2lnbmFsKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUsIG9sZFBhdGgsIGFib3J0U2lnbmFsKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgKGZpbGUsIHByZXZDYWNoZSkgPT4ge1xuICAgICAgaGFuZGxlTWV0YWRhdGFEZWxldGVkSWZFbmFibGVkKHBsdWdpbiwgZmlsZSwgcHJldkNhY2hlKTtcbiAgICB9KVxuICApO1xuXG4gIHJlZ2lzdGVyUGF0Y2gocGx1Z2luLCBhcHAuZmlsZU1hbmFnZXIsIHtcbiAgICBydW5Bc3luY0xpbmtVcGRhdGU6IChuZXh0OiBSdW5Bc3luY0xpbmtVcGRhdGVGbik6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuID0+IHtcbiAgICAgIHJldHVybiAobGlua1VwZGF0ZXNIYW5kbGVyKSA9PiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwLCBuZXh0LCBsaW5rVXBkYXRlc0hhbmRsZXIpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBQYXJlbnRGb2xkZXJzKGFwcDogQXBwLCBwYXJlbnRGb2xkZXJQYXRoczogc3RyaW5nW10sIG5vdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgPT09IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBwYXJlbnRGb2xkZXJQYXRoIG9mIHBhcmVudEZvbGRlclBhdGhzKSB7XG4gICAgc3dpdGNoIChzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvcikge1xuICAgICAgY2FzZSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5EZWxldGU6XG4gICAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBwYXJlbnRGb2xkZXJQYXRoLCBub3RlUGF0aCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLkRlbGV0ZVdpdGhFbXB0eVBhcmVudHM6XG4gICAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcCwgcGFyZW50Rm9sZGVyUGF0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IGludGVycnVwdGVkUmVuYW1lc01hcC5nZXQob2xkUGF0aCk7XG4gIGlmIChpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKG9sZFBhdGgpO1xuICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcywgaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxsUmVuYW1lTWFwKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXSxcbiAgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgcmVuYW1lTWFwLnNldChvbGRQYXRoLCBuZXdQYXRoKTtcblxuICBpZiAoIWlzTm90ZUV4KGFwcCwgb2xkUGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIG9sZFBhdGgpO1xuICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgbmV3UGF0aClcbiAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICBpZiAoYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcihhcHAsIG9sZFBhdGgpKSB7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIG9sZFBhdGhMaW5rcykge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgb2xkUGF0aExpbmssIG9sZFBhdGgpO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAoaXNOb3RlRXgoYXBwLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IG5ld0F0dGFjaG1lbnRGaWxlUGF0aDogc3RyaW5nO1xuICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgIGFwcCxcbiAgICAgICAgYXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICBub3RlUGF0aE9yRmlsZTogbmV3UGF0aCxcbiAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgIH1cblxuICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHQpO1xuICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXIsIGJhc2VOYW1lKSwgZXh0LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcDogQXBwKTogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoYXBwLCAncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0dGluZ3MoYXBwOiBBcHApOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4ge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IHNldHRpbmdzQnVpbGRlcnMgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnZhbHVlcygpKS5yZXZlcnNlKCk7XG5cbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc05vdGUoYXBwLCBwYXRoKTtcbiAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9ICgpOiBib29sZWFuID0+IGZhbHNlO1xuXG4gIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgIHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgPz8gZmFsc2U7XG4gICAgaWYgKG5ld1NldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yKSB7XG4gICAgICBzZXR0aW5ncy5lbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvciA/Pz0gbmV3U2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3I7XG4gICAgfVxuICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICBjb25zdCBpc1BhdGhJZ25vcmVkID0gc2V0dGluZ3MuaXNQYXRoSWdub3JlZDtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNQYXRoSWdub3JlZChwYXRoKSB8fCAobmV3U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlKTtcbiAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1cnJlbnRJc05vdGUocGF0aCkgJiYgKG5ld1NldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IHRydWUpO1xuICB9XG5cbiAgc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgPz89IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXA7XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2FzZUNvbGxpc2lvbihcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIWFwcC52YXVsdC5hZGFwdGVyLmluc2Vuc2l0aXZlIHx8IG9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdGVtcFBhdGggPSBqb2luKGRpcm5hbWUobmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUobmV3UGF0aCl9YCk7XG4gIGF3YWl0IHJlbmFtZUhhbmRsZWQoYXBwLCBuZXdQYXRoLCB0ZW1wUGF0aCk7XG4gIGF3YWl0IGhhbmRsZVJlbmFtZUFzeW5jKGFwcCwgb2xkUGF0aCwgdGVtcFBhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGF3YWl0IGFwcC52YXVsdC5yZW5hbWUoZ2V0RmlsZShhcHAsIHRlbXBQYXRoKSwgbmV3UGF0aCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVEZWxldGUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7cGF0aH1gKTtcbiAgaWYgKCFpc05vdGVFeChhcHAsIHBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7cGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldChwYXRoKTtcbiAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHBhdGgpO1xuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IGdldEFsbExpbmtzKGNhY2hlKTtcblxuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBsaW5rLCBwYXRoKTtcbiAgICAgIGlmICghYXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05vdGVFeChhcHAsIGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50RmlsZSwgcGF0aCwgZmFsc2UsIHNldHRpbmdzLmVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUF0dGFjaG1lbnRGb2xkZXJCZWhhdmlvci5LZWVwKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnMoYXBwLCBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKSwgcGF0aCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIHBhdGgpO1xuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgYXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghKGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoYXBwLCBwYXRoKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IGRlbGV0ZVNhZmUoYXBwLCBhdHRhY2htZW50Rm9sZGVyLCBwYXRoLCBmYWxzZSwgc2V0dGluZ3MuZW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5QXR0YWNobWVudEZvbGRlckJlaGF2aW9yLktlZXApO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVEZWxldGVJZkVuYWJsZWQocGx1Z2luOiBBYm9ydGFibGVQbHVnaW4sIGZpbGU6IFRBYnN0cmFjdEZpbGUsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYXRoID0gZmlsZS5wYXRoO1xuICBhZGRUb1F1ZXVlKGFwcCwgKGFib3J0U2lnbmFsMikgPT4gaGFuZGxlRGVsZXRlKGFwcCwgcGF0aCwgYWJvcnRTaWduYWwyKSwgYWJvcnRTaWduYWwpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoYXBwOiBBcHAsIGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke2ZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNNYXJrZG93bkZpbGUoYXBwLCBmaWxlKSAmJiBwcmV2Q2FjaGUpIHtcbiAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQoZmlsZS5wYXRoLCBwcmV2Q2FjaGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZElmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaGFuZGxlTWV0YWRhdGFEZWxldGVkKHBsdWdpbi5hcHAsIGZpbGUsIHByZXZDYWNoZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBrZXkgPSBtYWtlS2V5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke2tleX1gKTtcbiAgaWYgKGhhbmRsZWRSZW5hbWVzLmhhcyhrZXkpKSB7XG4gICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBvbGQgcGF0aCAke29sZFBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihuZXdQYXRoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gIGNvbnN0IG9sZFBhdGhMaW5rcyA9IGNhY2hlID8gZ2V0QWxsTGlua3MoY2FjaGUpIDogW107XG4gIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgYWRkVG9RdWV1ZShhcHAsIChhYm9ydFNpZ25hbDIpID0+IGhhbmRsZVJlbmFtZUFzeW5jKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzLCB1bmRlZmluZWQsIGFib3J0U2lnbmFsMiksIGFib3J0U2lnbmFsKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVuYW1lQXN5bmMoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdLFxuICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBhd2FpdCBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGF3YWl0IHJlZnJlc2hMaW5rcyhhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGlmIChhd2FpdCBoYW5kbGVDYXNlQ29sbGlzaW9uKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGF3YWl0IGZpbGxSZW5hbWVNYXAoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCByZW5hbWVNYXAsIG9sZFBhdGhMaW5rcywgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIGluaXRCYWNrbGlua3NNYXAob2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgb2xkUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgYXR0YWNobWVudE9sZFBhdGgpKS5kYXRhO1xuICAgICAgaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgYXR0YWNobWVudE9sZFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCByZW5hbWVIYW5kbGVkKGFwcCwgb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBjbGVhbnVwUGFyZW50Rm9sZGVycyhhcHAsIEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpLCBvbGRQYXRoKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICAgIGZvciAoXG4gICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgQXJyYXkuZnJvbShpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPy5lbnRyaWVzKCkgPz8gW10pXG4gICAgICApXG4gICAgKSB7XG4gICAgICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdCYWNrbGlua1BhdGgsIChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpO1xuICAgICAgICBpZiAoIW5ld0F0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7XG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cblxuICAgIGlmIChpc05vdGVFeChhcHAsIG5ld1BhdGgpKSB7XG4gICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVPcHRpb25zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3UGF0aCxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogb2xkUGF0aCxcbiAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgIH0pKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKCFnZXRGaWxlT3JOdWxsKGFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KG5ld1BhdGgpO1xuICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcC5zZXQobmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgIH1cbiAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIG9sZFBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbShoYW5kbGVkUmVuYW1lcyk7XG4gICAgYWRkVG9RdWV1ZShhcHAsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSwgYWJvcnRTaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW46IFBsdWdpbiwgZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcbiAgaGFuZGxlUmVuYW1lKHBsdWdpbi5hcHAsIG9sZFBhdGgsIG5ld1BhdGgsIGFib3J0U2lnbmFsKTtcbn1cblxuZnVuY3Rpb24gaW5pdEJhY2tsaW5rc01hcChcbiAgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+LFxuICBwYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcmVuYW1lTWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgbGlua0pzb25Ub1BhdGhNYXAuc2V0KHRvSnNvbihsaW5rKSwgcGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm90ZUV4KGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhhcHA6IEFwcCk6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmxvZ1JlZ2lzdGVyZWRIYW5kbGVycycpKFxuICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKSl9YFxuICApO1xufVxuXG5mdW5jdGlvbiBtYWtlS2V5KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoTGlua3MoXG4gIGFwcDogQXBwLFxuICBvbGRQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyBhcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgY29uc3Qgb2xkUGF0aExpbmtzUmVmcmVzaGVkID0gY2FjaGUgPyBnZXRBbGxMaW5rcyhjYWNoZSkgOiBbXTtcbiAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKGFwcCwgb2xkUGF0aCwgdHJ1ZSk7XG4gIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPigpO1xuICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bihhcHAsIFtmYWtlT2xkRmlsZV0sIGFzeW5jICgpID0+IHtcbiAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2Ygb2xkUGF0aExpbmtzUmVmcmVzaGVkKSB7XG4gICAgaWYgKG9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG9sZFBhdGhMaW5rcy5wdXNoKGxpbmspO1xuICB9XG5cbiAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICBsZXQgb2xkTGlua3MgPSBvbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgIG9sZExpbmtzID0gW107XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmFtZUhhbmRsZWQoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaGFuZGxlZFJlbmFtZXMuYWRkKGtleSk7XG4gIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIHJldHVybiBuZXdQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Bc3luY0xpbmtVcGRhdGUoYXBwOiBBcHAsIG5leHQ6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXh0LmNhbGwoYXBwLmZpbGVNYW5hZ2VyLCB3cmFwcGVkSGFuZGxlcik7XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlZEhhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICBpZiAoaXNSZW5hbWVDYWxsZWQgJiYgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgZmlsdGVySW5QbGFjZShcbiAgICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2Ygc291cmNlIGZpbGUgJHtsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKCdiYWNrbGluay1jYWNoZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09ICdjYW52YXMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSAnY2FudmFzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbjogUGx1Z2luKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMua2V5cygpKVswXTtcbiAgaWYgKG1haW5QbHVnaW5JZCAhPT0gcGx1Z2luSWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBLHNCQUFzQjtBQUN0Qiw2QkFBbUM7QUFPbkMsNkJBQWlDO0FBQ2pDLG1CQUE4QjtBQUM5QixtQkFBK0I7QUFDL0IseUJBR087QUFDUCxrQkFNTztBQUNQLGlCQUF5QztBQUN6Qyw0QkFJTztBQUNQLHdCQU9PO0FBQ1Asa0JBS087QUFDUCwyQkFLTztBQUNQLDBCQUE4QjtBQUM5QixtQkFBMkI7QUFDM0IsbUJBR087QUFDUCxxQkFHTztBQUVQLE1BQU0sMEJBQTBCLG9CQUFJLElBQTRCO0FBQ2hFLE1BQU0saUJBQWlCLG9CQUFJLElBQVk7QUFDdkMsTUFBTSx3QkFBd0Isb0JBQUksSUFBaUM7QUFLNUQsSUFBSyxnQ0FBTCxrQkFBS0EsbUNBQUw7QUFJTCxFQUFBQSwrQkFBQSxZQUFTO0FBS1QsRUFBQUEsK0JBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLCtCQUFBLFVBQU87QUFkRyxTQUFBQTtBQUFBLEdBQUE7QUFvRkwsU0FBUyw2QkFBNkIsUUFBeUIsaUJBQW1FO0FBQ3ZJLFFBQU0sMEJBQTBCLDJCQUEyQixPQUFPLEdBQUc7QUFDckUsUUFBTSxXQUFXLE9BQU8sU0FBUztBQUVqQywwQkFBd0IsSUFBSSxVQUFVLGVBQWU7QUFDckQsd0JBQXNCLE9BQU8sR0FBRztBQUVo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LGdCQUFnQixHQUFHO0FBQzNDLG1CQUFPO0FBQUEsVUFDVDtBQUVBLGNBQUksV0FBVyxXQUFXLGNBQWMsVUFBVTtBQUNoRCxtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLFdBQVcsYUFBYSxjQUFjLFVBQVU7QUFDbEQsbUJBQU87QUFBQSxVQUNUO0FBRUEsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLG9CQUFvQixRQUF5QjtBQUNwRCxRQUFNLE1BQU0sT0FBTztBQUNuQixRQUFNLFdBQVcsT0FBTyxTQUFTO0FBRWpDLFFBQU0sK0JBQStCLDJCQUEyQixHQUFHO0FBQ25FLFFBQU0sZUFBZSxNQUFNLEtBQUssNkJBQTZCLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDdEUsTUFBSSxpQkFBaUIsVUFBVTtBQUM3QixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiRW1wdHlBdHRhY2htZW50Rm9sZGVyQmVoYXZpb3IiXQp9Cg==
|
package/dist/lib/esm/Async.mjs
CHANGED
|
@@ -213,46 +213,40 @@ async function retryWithTimeout(fn, retryOptions, stackTrace) {
|
|
|
213
213
|
);
|
|
214
214
|
}
|
|
215
215
|
async function runWithTimeout(timeoutInMilliseconds, fn, context, stackTrace) {
|
|
216
|
-
class Wrapper {
|
|
217
|
-
/**
|
|
218
|
-
* Creates a new wrapper.
|
|
219
|
-
*
|
|
220
|
-
* @param value - The value to wrap.
|
|
221
|
-
*/
|
|
222
|
-
constructor(value) {
|
|
223
|
-
this.value = value;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
216
|
stackTrace ??= getStackTrace(1);
|
|
227
217
|
const startTime = performance.now();
|
|
228
|
-
const
|
|
218
|
+
const runAbortController = new AbortController();
|
|
219
|
+
const timeoutAbortController = new AbortController();
|
|
220
|
+
let result = null;
|
|
221
|
+
let hasResult = false;
|
|
229
222
|
await Promise.race([run(), innerTimeout()]);
|
|
230
|
-
if (
|
|
231
|
-
return
|
|
223
|
+
if (hasResult) {
|
|
224
|
+
return result;
|
|
232
225
|
}
|
|
233
|
-
throw new CustomStackTraceError("Run with timeout failed", stackTrace,
|
|
226
|
+
throw new CustomStackTraceError("Run with timeout failed", stackTrace, runAbortController.signal.reason);
|
|
234
227
|
async function run() {
|
|
235
228
|
try {
|
|
236
|
-
|
|
229
|
+
result = await fn(runAbortController.signal);
|
|
237
230
|
const duration = performance.now() - startTime;
|
|
238
231
|
const runWithTimeoutDebugger = getLibDebugger("Async:runWithTimeout");
|
|
239
232
|
printWithStackTrace(runWithTimeoutDebugger, stackTrace ?? "", `Execution time: ${String(duration)} milliseconds`, { context, fn });
|
|
240
|
-
|
|
233
|
+
timeoutAbortController.abort(new Error("Run with timeout completed successfully"));
|
|
234
|
+
hasResult = true;
|
|
241
235
|
} catch (e) {
|
|
242
|
-
|
|
236
|
+
runAbortController.abort(e);
|
|
243
237
|
}
|
|
244
238
|
}
|
|
245
239
|
async function innerTimeout() {
|
|
246
|
-
while (!
|
|
247
|
-
await sleep(timeoutInMilliseconds,
|
|
248
|
-
if (
|
|
240
|
+
while (!hasResult) {
|
|
241
|
+
await sleep(timeoutInMilliseconds, timeoutAbortController.signal);
|
|
242
|
+
if (hasResult) {
|
|
249
243
|
return;
|
|
250
244
|
}
|
|
251
245
|
const duration = performance.now() - startTime;
|
|
252
246
|
console.warn(`Timed out after ${String(duration)} milliseconds`, { context, fn });
|
|
253
247
|
const timeoutDebugger = getLibDebugger("Async:runWithTimeout:timeout");
|
|
254
248
|
if (!timeoutDebugger.enabled) {
|
|
255
|
-
|
|
249
|
+
runAbortController.abort(new Error(`Timed out after ${String(duration)} milliseconds`));
|
|
256
250
|
return;
|
|
257
251
|
}
|
|
258
252
|
timeoutDebugger(
|
|
@@ -316,4 +310,4 @@ export {
|
|
|
316
310
|
timeout,
|
|
317
311
|
toArray
|
|
318
312
|
};
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBhYm9ydFNpZ25hbEFueSxcbiAgYWJvcnRTaWduYWxOZXZlcixcbiAgYWJvcnRTaWduYWxUaW1lb3V0LFxuICB3YWl0Rm9yQWJvcnRcbn0gZnJvbSAnLi9BYm9ydENvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TGliRGVidWdnZXIsXG4gIHByaW50V2l0aFN0YWNrVHJhY2Vcbn0gZnJvbSAnLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gIEN1c3RvbVN0YWNrVHJhY2VFcnJvcixcbiAgZW1pdEFzeW5jRXJyb3JFdmVudCxcbiAgZ2V0U3RhY2tUcmFjZSxcbiAgcHJpbnRFcnJvcixcbiAgU2lsZW50RXJyb3Jcbn0gZnJvbSAnLi9FcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9GdW5jdGlvbi50cyc7XG5cbi8qKlxuICogQSB0eXBlIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgYSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBQcm9taXNlUmVzb2x2ZTxUPiA9IHVuZGVmaW5lZCBleHRlbmRzIFQgPyAodmFsdWU/OiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWRcbiAgOiAodmFsdWU6IFByb21pc2VMaWtlPFQ+IHwgVCkgPT4gdm9pZDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmV0cnlXaXRoVGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYWJvcnQgc2lnbmFsIHRvIGNhbmNlbCB0aGUgcmV0cnkgb3BlcmF0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXRyeSBhdHRlbXB0cy5cbiAgICovXG4gIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXRyeSB0aGUgZnVuY3Rpb24gb24gZXJyb3IuXG4gICAqL1xuICBzaG91bGRSZXRyeU9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJldHJ5aW5nLlxuICAgKi9cbiAgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gZXJyb3IgaGFuZGxlciB0byBhIHtAbGluayBQcm9taXNlfSB0aGF0IGNhdGNoZXMgYW55IGVycm9ycyBhbmQgZW1pdHMgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIHRvLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBvciBlbWl0cyBhc3luYyBlcnJvciBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcihhc3luY0ZuOiAoKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXN5bmNGbigpO1xuICB9IGNhdGNoIChhc3luY0Vycm9yKSB7XG4gICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcihBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsIHN0YWNrVHJhY2UsIGFzeW5jRXJyb3IpO1xuICAgIGlmIChoYW5kbGVTaWxlbnRFcnJvcih3cmFwcGVkRXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVtaXRBc3luY0Vycm9yRXZlbnQod3JhcHBlZEVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVyPFQ+KGFycjogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGFuczogVFtdID0gW107XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnIsIGkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtID0gYXJyW2ldIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtLCBpLCBhcnIpKSB7XG4gICAgICBhbnMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYW5zO1xufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHkgaW4gcGxhY2UsIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXJyYXkgaXMgZmlsdGVyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlckluUGxhY2U8VD4oYXJyOiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gIGxldCB3cml0ZUluZGV4ID0gMDtcbiAgZm9yIChsZXQgcmVhZEluZGV4ID0gMDsgcmVhZEluZGV4IDwgbGVuZ3RoOyByZWFkSW5kZXgrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnIsIHJlYWRJbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJbcmVhZEluZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoY3VycmVudCwgcmVhZEluZGV4LCBhcnIpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgYXJyW3dyaXRlSW5kZXgrK10gPSBjdXJyZW50O1xuICAgIH1cbiAgfVxuICBhcnIubGVuZ3RoID0gd3JpdGVJbmRleDtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQsIGFuZCB0aGVuIGZsYXR0ZW5zIHRoZSByZXN1bHRzIGludG8gYSBzaW5nbGUgYXJyYXkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnIgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIgYW5kIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGEgZmxhdHRlbmVkIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmxhdE1hcDxULCBVPihhcnI6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVW10+KTogUHJvbWlzZTxVW10+IHtcbiAgcmV0dXJuIChhd2FpdCBhc3luY01hcChhcnIsIGNhbGxiYWNrKSkuZmxhdCgpO1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBtYXAgb3Zlci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNNYXA8VCwgVT4oYXJyOiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VT4pOiBQcm9taXNlPFVbXT4ge1xuICByZXR1cm4gYXdhaXQgcHJvbWlzZUFsbFNlcXVlbnRpYWxseShhcnIubWFwKGNhbGxiYWNrKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGEgc3luY2hyb25vdXMgb25lIGJ5IGF1dG9tYXRpY2FsbHkgaGFuZGxpbmcgdGhlIFByb21pc2UgcmVqZWN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHBhcmFtIGFzeW5jRnVuYyAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBpbiBhIHN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBc3luY1RvU3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihhc3luY0Z1bmM6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLmFyZ3M6IEFyZ3MpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgPSBgJHtzdGFja1RyYWNlID8/ICcnfVxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuYyguLi5hcmdzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0ZuIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRm46ICguLi5hcmdzOiBBcmdzKSA9PiBSZXN1bHQpOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgcmV0dXJuIGFzeW5jICguLi5hcmdzOiBBcmdzKTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICByZXR1cm4gc3luY0ZuKC4uLmFyZ3MpO1xuICB9O1xufVxuXG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gQWx3YXlzIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPiwgZmFsbGJhY2tWYWx1ZT86IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGlnbm9yZUVycm9yRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6aWdub3JlRXJyb3InKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZ25vcmVFcnJvckRlYnVnZ2VyKCdJZ25vcmVkIGVycm9yJywgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcignSWdub3JlZCBlcnJvcicsIHN0YWNrVHJhY2UsIGUpKTtcbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHkoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICB2b2lkIGFkZEVycm9ySGFuZGxlcihhc3luY0ZuLCBzdGFja1RyYWNlKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBhZnRlciBhIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBhc3luY0ZuIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0gZGVsYXlJbk1pbGxpc2Vjb25kcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXkoXG4gIGFzeW5jRm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD4sXG4gIGRlbGF5SW5NaWxsaXNlY29uZHMgPSAwLFxuICBzdGFja1RyYWNlPzogc3RyaW5nLFxuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsXG4pOiB2b2lkIHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMsIGFib3J0U2lnbmFsLCB0cnVlKTtcbiAgICBhd2FpdCBhc3luY0ZuKGFib3J0U2lnbmFsKTtcbiAgfSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYXN5bmMgZnVuY3Rpb25zIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gYXN5bmNGbnMgLSBUaGUgYXN5bmMgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBhc3luYyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHk8VD4oYXN5bmNGbnM6ICgoKSA9PiBQcm9taXNhYmxlPFQ+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGZvciAoY29uc3QgYXN5bmNGbiBvZiBhc3luY0Zucykge1xuICAgIHJlc3VsdHMucHVzaChhd2FpdCBhc3luY0ZuKCkpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHByb21pc2VzIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBUaGUgcHJvbWlzZXMgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIHByb21pc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbFNlcXVlbnRpYWxseTxUPihwcm9taXNlczogUHJvbWlzYWJsZTxUPltdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxBc3luY0Zuc1NlcXVlbnRpYWxseShwcm9taXNlcy5tYXAoKHByb21pc2UpID0+ICgpID0+IHByb21pc2UpKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2lsZW50RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgbGV0IGNhdXNlID0gZXJyb3I7XG4gIHdoaWxlICghKGNhdXNlIGluc3RhbmNlb2YgU2lsZW50RXJyb3IpKSB7XG4gICAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYXVzZSA9IGNhdXNlLmNhdXNlO1xuICB9XG5cbiAgZ2V0TGliRGVidWdnZXIoJ0FzeW5jOmhhbmRsZVNpbGVudEVycm9yJykoZXJyb3IpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgdGVybWluYXRlUmV0cnlFcnJvcnMgPSBuZXcgV2Vha1NldDxFcnJvcj4oKTtcblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5ldmVyIGhhcHBlbicpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgdGljay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHRpY2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV4dFRpY2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcXVldWUgbWljcm90YXNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcXVldWUgbWljcm90YXNrIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWljcm90YXNrQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1bnRpbCBpdCByZXR1cm5zIHRydWUgb3IgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgcGFyYW1ldGVycyB0byBjb25maWd1cmUgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBPcHRpb25hbCBzdGFjayB0cmFjZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIG9yIHJlamVjdHMgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlXaXRoVGltZW91dChmbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxib29sZWFuPiwgcmV0cnlPcHRpb25zPzogUmV0cnlPcHRpb25zLCBzdGFja1RyYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpyZXRyeVdpdGhUaW1lb3V0Jyk7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kczogMTAwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucmV0cnlPcHRpb25zIH07XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IHJ1bldpdGhUaW1lb3V0KFxuICAgIGZ1bGxPcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiB7XG4gICAgICBjb25zdCBjb21iaW5lZEFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsKTtcbiAgICAgIGNvbWJpbmVkQWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgIHdoaWxlICghY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBhd2FpdCBmbihjb21iaW5lZEFib3J0U2lnbmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgIGlmIChjb21iaW5lZEFib3J0U2lnbmFsLmFib3J0ZWQgfHwgIWZ1bGxPcHRpb25zLnNob3VsZFJldHJ5T25FcnJvciB8fCB0ZXJtaW5hdGVSZXRyeUVycm9ycy5oYXMoZXJyb3IgYXMgRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKCdyZXRyeVdpdGhUaW1lb3V0IGZhaWxlZCcsIHN0YWNrVHJhY2UsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRFcnJvcihlcnJvcik7XG4gICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2UocmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLCBzdGFja1RyYWNlLCBgUmV0cnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke1N0cmluZyhhdHRlbXB0KX0gYXR0ZW1wdHNgLCB7XG4gICAgICAgICAgICBmblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2UoXG4gICAgICAgICAgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICAgIHN0YWNrVHJhY2UsXG4gICAgICAgICAgYFJldHJ5IGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9IGNvbXBsZXRlZCB1bnN1Y2Nlc3NmdWxseS4gVHJ5aW5nIGFnYWluIGluICR7U3RyaW5nKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZm5cbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzLCBhYm9ydFNpZ25hbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IHJldHJ5Rm46IGZuIH0sXG4gICAgc3RhY2tUcmFjZVxuICApO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQuIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgdGltZWQgb3V0LlxuICpcbiAqIElmIGBERUJVRz1vYnNpZGlhbi1kZXYtdXRpbHM6QXN5bmM6cnVuV2l0aFRpbWVvdXRgIGlzIHNldCwgdGhlIGV4ZWN1dGlvbiBpcyBub3QgdGVybWluYXRlZCBhZnRlciB0aGUgdGltZW91dCBhbmQgdGhlIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gcnVuIGluZGVmaW5pdGVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IGZyb20gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHJlamVjdHMgaWYgaXQgdGltZXMgb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFRpbWVvdXQ8UmVzdWx0PihcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIsXG4gIGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPFJlc3VsdD4sXG4gIGNvbnRleHQ/OiB1bmtub3duLFxuICBzdGFja1RyYWNlPzogc3RyaW5nXG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBjbGFzcyBXcmFwcGVyIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBSZXN1bHQpIHt9XG4gIH1cblxuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtydW4oKSwgaW5uZXJUaW1lb3V0KCldKTtcbiAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uIGluc3RhbmNlb2YgV3JhcHBlcikge1xuICAgIHJldHVybiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24gYXMgV3JhcHBlcikudmFsdWU7XG4gIH1cblxuICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKCdSdW4gd2l0aCB0aW1lb3V0IGZhaWxlZCcsIHN0YWNrVHJhY2UsIGFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uIGFzIHVua25vd24pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgcnVuV2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dCcpO1xuICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZShydW5XaXRoVGltZW91dERlYnVnZ2VyLCBzdGFja1RyYWNlID8/ICcnLCBgRXhlY3V0aW9uIHRpbWU6ICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCwgeyBjb250ZXh0LCBmbiB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydChuZXcgV3JhcHBlcihyZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdoaWxlICghYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBhd2FpdCBzbGVlcCh0aW1lb3V0SW5NaWxsaXNlY29uZHMsIGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGNvbnNvbGUud2FybihgVGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCwgeyBjb250ZXh0LCBmbiB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dDp0aW1lb3V0Jyk7XG4gICAgICBpZiAoIXRpbWVvdXREZWJ1Z2dlci5lbmFibGVkKSB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2ApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aW1lb3V0RGVidWdnZXIoXG4gICAgICAgIGBUaGUgZXhlY3V0aW9uIGlzIG5vdCB0ZXJtaW5hdGVkIGJlY2F1c2UgZGVidWdnZXIgJHt0aW1lb3V0RGVidWdnZXIubmFtZXNwYWNlfSBpcyBlbmFibGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWRldi11dGlscy9ibG9iL21haW4vZG9jcy9kZWJ1Z2dpbmcubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBkZWxheSAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VGltZW91dEFzeW5jKGRlbGF5PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIG1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gKiBAcGFyYW0gc2hvdWxkVGhyb3dPbkFib3J0IC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlciwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCwgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3YWl0Rm9yQWJvcnQoYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsVGltZW91dChtaWxsaXNlY29uZHMpKSk7XG4gIGlmIChzaG91bGRUaHJvd09uQWJvcnQpIHtcbiAgICBhYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZWplY3RzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCBwZXJpb2QuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAqIEBwYXJhbSBzaG91bGRUaHJvd09uQWJvcnQgLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgYWx3YXlzIHJlamVjdHMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lb3V0KHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyLCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLCBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuKTogUHJvbWlzZTxuZXZlcj4ge1xuICBhd2FpdCBzbGVlcCh0aW1lb3V0SW5NaWxsaXNlY29uZHMsIGFib3J0U2lnbmFsLCBzaG91bGRUaHJvd09uQWJvcnQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyOiBUW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXIpIHtcbiAgICBhcnIucHVzaChpdGVtKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQTBDckIsZUFBc0IsZ0JBQWdCLFNBQWlDLFlBQW9DO0FBQ3pHLGlCQUFlLGNBQWMsQ0FBQztBQUM5QixNQUFJO0FBQ0YsVUFBTSxRQUFRO0FBQUEsRUFDaEIsU0FBUyxZQUFZO0FBQ25CLFVBQU0sZUFBZSxJQUFJLHNCQUFzQiw2QkFBNkIsWUFBWSxVQUFVO0FBQ2xHLFFBQUksa0JBQWtCLFlBQVksR0FBRztBQUNuQztBQUFBLElBQ0Y7QUFDQSx3QkFBb0IsWUFBWTtBQUFBLEVBQ2xDO0FBQ0Y7QUFVQSxlQUFzQixZQUFlLEtBQVUsV0FBdUY7QUFDcEksUUFBTSxNQUFXLENBQUM7QUFFbEIsUUFBTSxTQUFTLElBQUk7QUFDbkIsV0FBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDL0IsUUFBSSxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsR0FBRztBQUMxQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLFFBQUksTUFBTSxVQUFVLE1BQU0sR0FBRyxHQUFHLEdBQUc7QUFDakMsVUFBSSxLQUFLLElBQUk7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVVBLGVBQXNCLG1CQUFzQixLQUFVLFdBQXdGO0FBQzVJLFFBQU0sU0FBUyxJQUFJO0FB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
|
|
313
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBhYm9ydFNpZ25hbEFueSxcbiAgYWJvcnRTaWduYWxOZXZlcixcbiAgYWJvcnRTaWduYWxUaW1lb3V0LFxuICB3YWl0Rm9yQWJvcnRcbn0gZnJvbSAnLi9BYm9ydENvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TGliRGVidWdnZXIsXG4gIHByaW50V2l0aFN0YWNrVHJhY2Vcbn0gZnJvbSAnLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gIEN1c3RvbVN0YWNrVHJhY2VFcnJvcixcbiAgZW1pdEFzeW5jRXJyb3JFdmVudCxcbiAgZ2V0U3RhY2tUcmFjZSxcbiAgcHJpbnRFcnJvcixcbiAgU2lsZW50RXJyb3Jcbn0gZnJvbSAnLi9FcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9GdW5jdGlvbi50cyc7XG5cbi8qKlxuICogQSB0eXBlIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgYSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBQcm9taXNlUmVzb2x2ZTxUPiA9IHVuZGVmaW5lZCBleHRlbmRzIFQgPyAodmFsdWU/OiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWRcbiAgOiAodmFsdWU6IFByb21pc2VMaWtlPFQ+IHwgVCkgPT4gdm9pZDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmV0cnlXaXRoVGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYWJvcnQgc2lnbmFsIHRvIGNhbmNlbCB0aGUgcmV0cnkgb3BlcmF0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXRyeSBhdHRlbXB0cy5cbiAgICovXG4gIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXRyeSB0aGUgZnVuY3Rpb24gb24gZXJyb3IuXG4gICAqL1xuICBzaG91bGRSZXRyeU9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJldHJ5aW5nLlxuICAgKi9cbiAgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gZXJyb3IgaGFuZGxlciB0byBhIHtAbGluayBQcm9taXNlfSB0aGF0IGNhdGNoZXMgYW55IGVycm9ycyBhbmQgZW1pdHMgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIHRvLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBvciBlbWl0cyBhc3luYyBlcnJvciBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcihhc3luY0ZuOiAoKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXN5bmNGbigpO1xuICB9IGNhdGNoIChhc3luY0Vycm9yKSB7XG4gICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcihBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsIHN0YWNrVHJhY2UsIGFzeW5jRXJyb3IpO1xuICAgIGlmIChoYW5kbGVTaWxlbnRFcnJvcih3cmFwcGVkRXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVtaXRBc3luY0Vycm9yRXZlbnQod3JhcHBlZEVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVyPFQ+KGFycjogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGFuczogVFtdID0gW107XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnIsIGkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtID0gYXJyW2ldIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtLCBpLCBhcnIpKSB7XG4gICAgICBhbnMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYW5zO1xufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHkgaW4gcGxhY2UsIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXJyYXkgaXMgZmlsdGVyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlckluUGxhY2U8VD4oYXJyOiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gIGxldCB3cml0ZUluZGV4ID0gMDtcbiAgZm9yIChsZXQgcmVhZEluZGV4ID0gMDsgcmVhZEluZGV4IDwgbGVuZ3RoOyByZWFkSW5kZXgrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnIsIHJlYWRJbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJbcmVhZEluZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoY3VycmVudCwgcmVhZEluZGV4LCBhcnIpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgYXJyW3dyaXRlSW5kZXgrK10gPSBjdXJyZW50O1xuICAgIH1cbiAgfVxuICBhcnIubGVuZ3RoID0gd3JpdGVJbmRleDtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQsIGFuZCB0aGVuIGZsYXR0ZW5zIHRoZSByZXN1bHRzIGludG8gYSBzaW5nbGUgYXJyYXkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnIgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIgYW5kIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGEgZmxhdHRlbmVkIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmxhdE1hcDxULCBVPihhcnI6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVW10+KTogUHJvbWlzZTxVW10+IHtcbiAgcmV0dXJuIChhd2FpdCBhc3luY01hcChhcnIsIGNhbGxiYWNrKSkuZmxhdCgpO1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBtYXAgb3Zlci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNNYXA8VCwgVT4oYXJyOiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VT4pOiBQcm9taXNlPFVbXT4ge1xuICByZXR1cm4gYXdhaXQgcHJvbWlzZUFsbFNlcXVlbnRpYWxseShhcnIubWFwKGNhbGxiYWNrKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGEgc3luY2hyb25vdXMgb25lIGJ5IGF1dG9tYXRpY2FsbHkgaGFuZGxpbmcgdGhlIFByb21pc2UgcmVqZWN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHBhcmFtIGFzeW5jRnVuYyAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBpbiBhIHN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBc3luY1RvU3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihhc3luY0Z1bmM6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLmFyZ3M6IEFyZ3MpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgPSBgJHtzdGFja1RyYWNlID8/ICcnfVxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuYyguLi5hcmdzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0ZuIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRm46ICguLi5hcmdzOiBBcmdzKSA9PiBSZXN1bHQpOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgcmV0dXJuIGFzeW5jICguLi5hcmdzOiBBcmdzKTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICByZXR1cm4gc3luY0ZuKC4uLmFyZ3MpO1xuICB9O1xufVxuXG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gQWx3YXlzIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPiwgZmFsbGJhY2tWYWx1ZT86IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGlnbm9yZUVycm9yRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6aWdub3JlRXJyb3InKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZ25vcmVFcnJvckRlYnVnZ2VyKCdJZ25vcmVkIGVycm9yJywgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcignSWdub3JlZCBlcnJvcicsIHN0YWNrVHJhY2UsIGUpKTtcbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHkoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICB2b2lkIGFkZEVycm9ySGFuZGxlcihhc3luY0ZuLCBzdGFja1RyYWNlKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBhZnRlciBhIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBhc3luY0ZuIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0gZGVsYXlJbk1pbGxpc2Vjb25kcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXkoXG4gIGFzeW5jRm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD4sXG4gIGRlbGF5SW5NaWxsaXNlY29uZHMgPSAwLFxuICBzdGFja1RyYWNlPzogc3RyaW5nLFxuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsXG4pOiB2b2lkIHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMsIGFib3J0U2lnbmFsLCB0cnVlKTtcbiAgICBhd2FpdCBhc3luY0ZuKGFib3J0U2lnbmFsKTtcbiAgfSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYXN5bmMgZnVuY3Rpb25zIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gYXN5bmNGbnMgLSBUaGUgYXN5bmMgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBhc3luYyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHk8VD4oYXN5bmNGbnM6ICgoKSA9PiBQcm9taXNhYmxlPFQ+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGZvciAoY29uc3QgYXN5bmNGbiBvZiBhc3luY0Zucykge1xuICAgIHJlc3VsdHMucHVzaChhd2FpdCBhc3luY0ZuKCkpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHByb21pc2VzIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBUaGUgcHJvbWlzZXMgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIHByb21pc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbFNlcXVlbnRpYWxseTxUPihwcm9taXNlczogUHJvbWlzYWJsZTxUPltdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxBc3luY0Zuc1NlcXVlbnRpYWxseShwcm9taXNlcy5tYXAoKHByb21pc2UpID0+ICgpID0+IHByb21pc2UpKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2lsZW50RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgbGV0IGNhdXNlID0gZXJyb3I7XG4gIHdoaWxlICghKGNhdXNlIGluc3RhbmNlb2YgU2lsZW50RXJyb3IpKSB7XG4gICAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYXVzZSA9IGNhdXNlLmNhdXNlO1xuICB9XG5cbiAgZ2V0TGliRGVidWdnZXIoJ0FzeW5jOmhhbmRsZVNpbGVudEVycm9yJykoZXJyb3IpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgdGVybWluYXRlUmV0cnlFcnJvcnMgPSBuZXcgV2Vha1NldDxFcnJvcj4oKTtcblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5ldmVyIGhhcHBlbicpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgdGljay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHRpY2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV4dFRpY2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcXVldWUgbWljcm90YXNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcXVldWUgbWljcm90YXNrIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWljcm90YXNrQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1bnRpbCBpdCByZXR1cm5zIHRydWUgb3IgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zIC0gT3B0aW9uYWwgcGFyYW1ldGVycyB0byBjb25maWd1cmUgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBPcHRpb25hbCBzdGFjayB0cmFjZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIG9yIHJlamVjdHMgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlXaXRoVGltZW91dChmbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxib29sZWFuPiwgcmV0cnlPcHRpb25zPzogUmV0cnlPcHRpb25zLCBzdGFja1RyYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpyZXRyeVdpdGhUaW1lb3V0Jyk7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kczogMTAwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucmV0cnlPcHRpb25zIH07XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IHJ1bldpdGhUaW1lb3V0KFxuICAgIGZ1bGxPcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiB7XG4gICAgICBjb25zdCBjb21iaW5lZEFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsKTtcbiAgICAgIGNvbWJpbmVkQWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgIHdoaWxlICghY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBhd2FpdCBmbihjb21iaW5lZEFib3J0U2lnbmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgIGlmIChjb21iaW5lZEFib3J0U2lnbmFsLmFib3J0ZWQgfHwgIWZ1bGxPcHRpb25zLnNob3VsZFJldHJ5T25FcnJvciB8fCB0ZXJtaW5hdGVSZXRyeUVycm9ycy5oYXMoZXJyb3IgYXMgRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKCdyZXRyeVdpdGhUaW1lb3V0IGZhaWxlZCcsIHN0YWNrVHJhY2UsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRFcnJvcihlcnJvcik7XG4gICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2UocmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLCBzdGFja1RyYWNlLCBgUmV0cnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke1N0cmluZyhhdHRlbXB0KX0gYXR0ZW1wdHNgLCB7XG4gICAgICAgICAgICBmblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2UoXG4gICAgICAgICAgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICAgIHN0YWNrVHJhY2UsXG4gICAgICAgICAgYFJldHJ5IGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9IGNvbXBsZXRlZCB1bnN1Y2Nlc3NmdWxseS4gVHJ5aW5nIGFnYWluIGluICR7U3RyaW5nKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZm5cbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzLCBhYm9ydFNpZ25hbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IHJldHJ5Rm46IGZuIH0sXG4gICAgc3RhY2tUcmFjZVxuICApO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQuIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgdGltZWQgb3V0LlxuICpcbiAqIElmIGBERUJVRz1vYnNpZGlhbi1kZXYtdXRpbHM6QXN5bmM6cnVuV2l0aFRpbWVvdXRgIGlzIHNldCwgdGhlIGV4ZWN1dGlvbiBpcyBub3QgdGVybWluYXRlZCBhZnRlciB0aGUgdGltZW91dCBhbmQgdGhlIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gcnVuIGluZGVmaW5pdGVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IGZyb20gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHJlamVjdHMgaWYgaXQgdGltZXMgb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFRpbWVvdXQ8UmVzdWx0PihcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIsXG4gIGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPFJlc3VsdD4sXG4gIGNvbnRleHQ/OiB1bmtub3duLFxuICBzdGFja1RyYWNlPzogc3RyaW5nXG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICBjb25zdCBydW5BYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgbGV0IHJlc3VsdDogbnVsbCB8IFJlc3VsdCA9IG51bGw7XG4gIGxldCBoYXNSZXN1bHQgPSBmYWxzZTtcblxuICBhd2FpdCBQcm9taXNlLnJhY2UoW3J1bigpLCBpbm5lclRpbWVvdXQoKV0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICBpZiAoaGFzUmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKCdSdW4gd2l0aCB0aW1lb3V0IGZhaWxlZCcsIHN0YWNrVHJhY2UsIHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uKTtcblxuICBhc3luYyBmdW5jdGlvbiBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGZuKHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQnKTtcbiAgICAgIHByaW50V2l0aFN0YWNrVHJhY2UocnVuV2l0aFRpbWVvdXREZWJ1Z2dlciwgc3RhY2tUcmFjZSA/PyAnJywgYEV4ZWN1dGlvbiB0aW1lOiAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsIHsgY29udGV4dCwgZm4gfSk7XG4gICAgICB0aW1lb3V0QWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignUnVuIHdpdGggdGltZW91dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JykpO1xuICAgICAgaGFzUmVzdWx0ID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBydW5BYm9ydENvbnRyb2xsZXIuYWJvcnQoZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uXG4gICAgd2hpbGUgKCFoYXNSZXN1bHQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHRpbWVvdXRJbk1pbGxpc2Vjb25kcywgdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIGlmIChoYXNSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGNvbnNvbGUud2FybihgVGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCwgeyBjb250ZXh0LCBmbiB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dDp0aW1lb3V0Jyk7XG4gICAgICBpZiAoIXRpbWVvdXREZWJ1Z2dlci5lbmFibGVkKSB7XG4gICAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2ApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aW1lb3V0RGVidWdnZXIoXG4gICAgICAgIGBUaGUgZXhlY3V0aW9uIGlzIG5vdCB0ZXJtaW5hdGVkIGJlY2F1c2UgZGVidWdnZXIgJHt0aW1lb3V0RGVidWdnZXIubmFtZXNwYWNlfSBpcyBlbmFibGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWRldi11dGlscy9ibG9iL21haW4vZG9jcy9kZWJ1Z2dpbmcubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBkZWxheSAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VGltZW91dEFzeW5jKGRlbGF5PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIG1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gKiBAcGFyYW0gc2hvdWxkVGhyb3dPbkFib3J0IC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlciwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCwgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3YWl0Rm9yQWJvcnQoYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsVGltZW91dChtaWxsaXNlY29uZHMpKSk7XG4gIGlmIChzaG91bGRUaHJvd09uQWJvcnQpIHtcbiAgICBhYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZWplY3RzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCBwZXJpb2QuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAqIEBwYXJhbSBzaG91bGRUaHJvd09uQWJvcnQgLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgYWx3YXlzIHJlamVjdHMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lb3V0KHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyLCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLCBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuKTogUHJvbWlzZTxuZXZlcj4ge1xuICBhd2FpdCBzbGVlcCh0aW1lb3V0SW5NaWxsaXNlY29uZHMsIGFib3J0U2lnbmFsLCBzaG91bGRUaHJvd09uQWJvcnQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyOiBUW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXIpIHtcbiAgICBhcnIucHVzaChpdGVtKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQTBDckIsZUFBc0IsZ0JBQWdCLFNBQWlDLFlBQW9DO0FBQ3pHLGlCQUFlLGNBQWMsQ0FBQztBQUM5QixNQUFJO0FBQ0YsVUFBTSxRQUFRO0FBQUEsRUFDaEIsU0FBUyxZQUFZO0FBQ25CLFVBQU0sZUFBZSxJQUFJLHNCQUFzQiw2QkFBNkIsWUFBWSxVQUFVO0FBQ2xHLFFBQUksa0JBQWtCLFlBQVksR0FBRztBQUNuQztBQUFBLElBQ0Y7QUFDQSx3QkFBb0IsWUFBWTtBQUFBLEVBQ2xDO0FBQ0Y7QUFVQSxlQUFzQixZQUFlLEtBQVUsV0FBdUY7QUFDcEksUUFBTSxNQUFXLENBQUM7QUFFbEIsUUFBTSxTQUFTLElBQUk7QUFDbkIsV0FBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDL0IsUUFBSSxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsR0FBRztBQUMxQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sSUFBSSxDQUFDO0FBQ2xCLFFBQUksTUFBTSxVQUFVLE1BQU0sR0FBRyxHQUFHLEdBQUc7QUFDakMsVUFBSSxLQUFLLElBQUk7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVVBLGVBQXNCLG1CQUFzQixL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
|