obsidian-dev-utils 19.7.0 → 19.7.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,11 @@ import {
11
11
  setNestedPropertyValue
12
12
  } from "../Object.mjs";
13
13
  import { resolveValue } from "../ValueProvider.mjs";
14
+ import {
15
+ isCanvasFileLink,
16
+ isCanvasTextLink,
17
+ parseCanvasLinkKey
18
+ } from "./Canvas.mjs";
14
19
  import {
15
20
  getPath,
16
21
  isCanvasFile
@@ -19,101 +24,199 @@ import {
19
24
  parseFrontmatter,
20
25
  setFrontmatter
21
26
  } from "./Frontmatter.mjs";
27
+ import {
28
+ getAllLinks,
29
+ parseMetadata
30
+ } from "./MetadataCache.mjs";
31
+ import { referenceToFileChange } from "./Reference.mjs";
22
32
  import { process } from "./Vault.mjs";
23
33
  async function applyFileChanges(app, pathOrFile, changesProvider, processOptions = {}) {
24
34
  await process(app, pathOrFile, async (content) => {
25
- let changes = await resolveValue(changesProvider);
26
- const frontmatter = isCanvasFile(app, pathOrFile) ? parseJsonSafe(content) : parseFrontmatter(content);
27
- for (const change of changes) {
28
- if (isContentChange(change)) {
29
- const actualContent = content.slice(change.startIndex, change.endIndex);
30
- if (actualContent !== change.oldContent) {
31
- console.warn("Content mismatch", {
32
- actualContent,
33
- endIndex: change.endIndex,
34
- expectedContent: change.oldContent,
35
- path: getPath(app, pathOrFile),
36
- startIndex: change.startIndex
37
- });
38
- return null;
39
- }
40
- } else if (isFrontmatterChange(change)) {
41
- const actualContent = getNestedPropertyValue(frontmatter, change.frontmatterKey);
42
- if (actualContent !== change.oldContent) {
43
- console.warn("Content mismatch", {
44
- actualContent,
45
- expectedContent: change.oldContent,
46
- frontmatterKey: change.frontmatterKey,
47
- path: getPath(app, pathOrFile)
48
- });
49
- return null;
50
- }
51
- }
35
+ if (isCanvasFile(app, pathOrFile)) {
36
+ return applyCanvasChanges(app, content, getPath(app, pathOrFile), changesProvider);
52
37
  }
53
- changes.sort((a, b) => {
54
- if (isContentChange(a) && isContentChange(b)) {
55
- return a.startIndex - b.startIndex;
56
- }
57
- if (isFrontmatterChange(a) && isFrontmatterChange(b)) {
58
- return a.frontmatterKey.localeCompare(b.frontmatterKey);
38
+ return await applyContentChanges(content, getPath(app, pathOrFile), changesProvider);
39
+ }, processOptions);
40
+ }
41
+ function isContentChange(fileChange) {
42
+ return fileChange.startIndex !== void 0;
43
+ }
44
+ function isFrontmatterChange(fileChange) {
45
+ return fileChange.frontmatterKey !== void 0;
46
+ }
47
+ async function applyCanvasChanges(app, content, path, changesProvider) {
48
+ const changes = await resolveValue(changesProvider);
49
+ const canvasData = parseJsonSafe(content);
50
+ const canvasTextChanges = /* @__PURE__ */ new Map();
51
+ for (const change of changes) {
52
+ if (!isFrontmatterChange(change)) {
53
+ console.warn("Only frontmatter changes are supported for canvas files", {
54
+ change,
55
+ path
56
+ });
57
+ return null;
58
+ }
59
+ const canvasLink = parseCanvasLinkKey(change.frontmatterKey);
60
+ if (!canvasLink) {
61
+ console.warn("Invalid canvas link", {
62
+ key: change.frontmatterKey,
63
+ path
64
+ });
65
+ return null;
66
+ }
67
+ const node = canvasData.nodes[canvasLink.nodeIndex];
68
+ if (!node) {
69
+ console.warn("Node not found", {
70
+ key: change.frontmatterKey,
71
+ path
72
+ });
73
+ return null;
74
+ }
75
+ if (isCanvasFileLink(canvasLink)) {
76
+ if (node.file !== change.oldContent) {
77
+ console.warn("Content mismatch", {
78
+ actualContent: node.file,
79
+ expectedContent: change.oldContent,
80
+ frontmatterKey: change.frontmatterKey,
81
+ path
82
+ });
83
+ return null;
59
84
  }
60
- return isContentChange(a) ? -1 : 1;
61
- });
62
- changes = changes.filter((change, index) => {
63
- if (change.oldContent === change.newContent) {
64
- return false;
85
+ node.file = change.newContent;
86
+ break;
87
+ } else if (isCanvasTextLink(canvasLink)) {
88
+ let canvasTextChangesForNode = canvasTextChanges.get(canvasLink.linkIndex);
89
+ if (!canvasTextChangesForNode) {
90
+ canvasTextChangesForNode = /* @__PURE__ */ new Map();
91
+ canvasTextChanges.set(canvasLink.linkIndex, canvasTextChangesForNode);
65
92
  }
66
- if (index === 0) {
67
- return true;
93
+ canvasTextChangesForNode.set(canvasLink.linkIndex, change);
94
+ break;
95
+ }
96
+ }
97
+ for (const [nodeIndex, canvasTextChangesForNode] of canvasTextChanges.entries()) {
98
+ const node = canvasData.nodes[nodeIndex];
99
+ if (!node) {
100
+ console.warn("Node not found", {
101
+ nodeIndex,
102
+ path
103
+ });
104
+ return null;
105
+ }
106
+ if (typeof node.text !== "string") {
107
+ console.warn("Node text is not a string", {
108
+ nodeIndex,
109
+ path
110
+ });
111
+ return null;
112
+ }
113
+ const cache = await parseMetadata(app, node.text);
114
+ const links = getAllLinks(cache);
115
+ const contentChanges = [];
116
+ for (let linkIndex = 0; linkIndex < links.length; linkIndex++) {
117
+ const link = links[linkIndex];
118
+ if (!link) {
119
+ console.warn("Missing link", {
120
+ linkIndex,
121
+ nodeIndex,
122
+ nodeText: node.text,
123
+ path
124
+ });
125
+ return null;
68
126
  }
69
- return !deepEqual(change, changes[index - 1]);
70
- });
71
- for (let i = 1; i < changes.length; i++) {
72
- const change = changes[i];
73
- if (!change) {
74
- continue;
127
+ const canvasTextChange = canvasTextChangesForNode.get(linkIndex);
128
+ if (canvasTextChange) {
129
+ const contentChange = referenceToFileChange(link, canvasTextChange.newContent);
130
+ contentChange.oldContent = canvasTextChange.oldContent;
131
+ contentChanges.push(contentChange);
75
132
  }
76
- const previousChange = changes[i - 1];
77
- if (!previousChange) {
78
- continue;
133
+ }
134
+ node.text = await applyContentChanges(node.text, `${path}.FAKE_TEXT.node${nodeIndex.toString()}.md`, contentChanges);
135
+ }
136
+ return JSON.stringify(canvasData, null, " ");
137
+ }
138
+ async function applyContentChanges(content, path, changesProvider) {
139
+ let changes = await resolveValue(changesProvider);
140
+ const frontmatter = parseFrontmatter(content);
141
+ for (const change of changes) {
142
+ if (isContentChange(change)) {
143
+ const actualContent = content.slice(change.startIndex, change.endIndex);
144
+ if (actualContent !== change.oldContent) {
145
+ console.warn("Content mismatch", {
146
+ actualContent,
147
+ endIndex: change.endIndex,
148
+ expectedContent: change.oldContent,
149
+ path,
150
+ startIndex: change.startIndex
151
+ });
152
+ return null;
79
153
  }
80
- if (isContentChange(previousChange) && isContentChange(change) && previousChange.endIndex && change.startIndex && previousChange.endIndex > change.startIndex) {
81
- console.warn("Overlapping changes", {
82
- change,
83
- previousChange
154
+ } else if (isFrontmatterChange(change)) {
155
+ const actualContent = getNestedPropertyValue(frontmatter, change.frontmatterKey);
156
+ if (actualContent !== change.oldContent) {
157
+ console.warn("Content mismatch", {
158
+ actualContent,
159
+ expectedContent: change.oldContent,
160
+ frontmatterKey: change.frontmatterKey,
161
+ path
84
162
  });
85
163
  return null;
86
164
  }
87
165
  }
88
- let newContent = "";
89
- let lastIndex = 0;
90
- let frontmatterChanged = false;
91
- for (const change of changes) {
92
- if (isContentChange(change)) {
93
- newContent += content.slice(lastIndex, change.startIndex);
94
- newContent += change.newContent;
95
- lastIndex = change.endIndex;
96
- } else if (isFrontmatterChange(change)) {
97
- setNestedPropertyValue(frontmatter, change.frontmatterKey, change.newContent);
98
- frontmatterChanged = true;
99
- }
166
+ }
167
+ changes.sort((a, b) => {
168
+ if (isContentChange(a) && isContentChange(b)) {
169
+ return a.startIndex - b.startIndex;
100
170
  }
101
- if (isCanvasFile(app, pathOrFile)) {
102
- newContent = JSON.stringify(frontmatter, null, " ");
103
- } else {
104
- newContent += content.slice(lastIndex);
105
- if (frontmatterChanged) {
106
- newContent = setFrontmatter(newContent, frontmatter);
107
- }
171
+ if (isFrontmatterChange(a) && isFrontmatterChange(b)) {
172
+ return a.frontmatterKey.localeCompare(b.frontmatterKey);
108
173
  }
109
- return newContent;
110
- }, processOptions);
111
- }
112
- function isContentChange(fileChange) {
113
- return fileChange.startIndex !== void 0;
114
- }
115
- function isFrontmatterChange(fileChange) {
116
- return fileChange.frontmatterKey !== void 0;
174
+ return isContentChange(a) ? -1 : 1;
175
+ });
176
+ changes = changes.filter((change, index) => {
177
+ if (change.oldContent === change.newContent) {
178
+ return false;
179
+ }
180
+ if (index === 0) {
181
+ return true;
182
+ }
183
+ return !deepEqual(change, changes[index - 1]);
184
+ });
185
+ for (let i = 1; i < changes.length; i++) {
186
+ const change = changes[i];
187
+ if (!change) {
188
+ continue;
189
+ }
190
+ const previousChange = changes[i - 1];
191
+ if (!previousChange) {
192
+ continue;
193
+ }
194
+ if (isContentChange(previousChange) && isContentChange(change) && previousChange.endIndex && change.startIndex && previousChange.endIndex > change.startIndex) {
195
+ console.warn("Overlapping changes", {
196
+ change,
197
+ previousChange
198
+ });
199
+ return null;
200
+ }
201
+ }
202
+ let newContent = "";
203
+ let lastIndex = 0;
204
+ let frontmatterChanged = false;
205
+ for (const change of changes) {
206
+ if (isContentChange(change)) {
207
+ newContent += content.slice(lastIndex, change.startIndex);
208
+ newContent += change.newContent;
209
+ lastIndex = change.endIndex;
210
+ } else if (isFrontmatterChange(change)) {
211
+ setNestedPropertyValue(frontmatter, change.frontmatterKey, change.newContent);
212
+ frontmatterChanged = true;
213
+ }
214
+ }
215
+ newContent += content.slice(lastIndex);
216
+ if (frontmatterChanged) {
217
+ newContent = setFrontmatter(newContent, frontmatter);
218
+ }
219
+ return newContent;
117
220
  }
118
221
  function parseJsonSafe(content) {
119
222
  let parsed;
@@ -132,4 +235,4 @@ export {
132
235
  isContentChange,
133
236
  isFrontmatterChange
134
237
  };
135
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0ZpbGVDaGFuZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIEZpbGVDaGFuZ2VcbiAqIENvbnRhaW5zIHV0aWxpdHkgdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgZmlsZSBjaGFuZ2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICcuLi9WYWx1ZVByb3ZpZGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmltcG9ydCB7XG4gIGRlZXBFcXVhbCxcbiAgZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSxcbiAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlRnJvbnRtYXR0ZXIsXG4gIHNldEZyb250bWF0dGVyXG59IGZyb20gJy4vRnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb250ZW50IGJvZHkgY2hhbmdlIGluIHRoZSBWYXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50Q2hhbmdlIGV4dGVuZHMgRmlsZUNoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgZW5kIGluZGV4IG9mIHRoZSBjaGFuZ2UgaW4gdGhlIGZpbGUgY29udGVudC5cbiAgICovXG4gIGVuZEluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgY2hhbmdlIGluIHRoZSBmaWxlIGNvbnRlbnQuXG4gICAqL1xuICBzdGFydEluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGZpbGUgY2hhbmdlIGluIHRoZSBWYXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlQ2hhbmdlIHtcbiAgLyoqXG4gICAqIFRoZSBuZXcgY29udGVudCB0byByZXBsYWNlIHRoZSBvbGQgY29udGVudC5cbiAgICovXG4gIG5ld0NvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZCBjb250ZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZC5cbiAgICovXG4gIG9sZENvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIGluIHRoZSBWYXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcm9udG1hdHRlckNoYW5nZSBleHRlbmRzIEZpbGVDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGtleSBpbiB0aGUgZnJvbnRtYXR0ZXIgdG8gdXNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIGZyb250bWF0dGVyS2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcmllcyBvZiBmaWxlIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlIG9yIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlIHdoZXJlIHRoZSBmaWxlIGNoYW5nZXMgd2lsbCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIGNoYW5nZXNQcm92aWRlciAtIEEgcHJvdmlkZXIgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGZpbGUgY2hhbmdlcyB0byBhcHBseS5cbiAqIEBwYXJhbSBwcm9jZXNzT3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgZm9yIHByb2Nlc3NpbmcvcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBhcHBsaWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlGaWxlQ2hhbmdlcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIGNoYW5nZXNQcm92aWRlcjogVmFsdWVQcm92aWRlcjxGaWxlQ2hhbmdlW10+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHByb2Nlc3MoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoY29udGVudCkgPT4ge1xuICAgIGxldCBjaGFuZ2VzID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNoYW5nZXNQcm92aWRlcik7XG4gICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBpc0NhbnZhc0ZpbGUoYXBwLCBwYXRoT3JGaWxlKSA/IHBhcnNlSnNvblNhZmUoY29udGVudCkgOiBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuXG4gICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgICAgaWYgKGlzQ29udGVudENoYW5nZShjaGFuZ2UpKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnNsaWNlKGNoYW5nZS5zdGFydEluZGV4LCBjaGFuZ2UuZW5kSW5kZXgpO1xuICAgICAgICBpZiAoYWN0dWFsQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgICBhY3R1YWxDb250ZW50LFxuICAgICAgICAgICAgZW5kSW5kZXg6IGNoYW5nZS5lbmRJbmRleCxcbiAgICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgICBwYXRoOiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSksXG4gICAgICAgICAgICBzdGFydEluZGV4OiBjaGFuZ2Uuc3RhcnRJbmRleFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShjaGFuZ2UpKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBjaGFuZ2UuZnJvbnRtYXR0ZXJLZXkpO1xuICAgICAgICBpZiAoYWN0dWFsQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgICBhY3R1YWxDb250ZW50LFxuICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UuZnJvbnRtYXR0ZXJLZXksXG4gICAgICAgICAgICBwYXRoOiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hhbmdlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoaXNDb250ZW50Q2hhbmdlKGEpICYmIGlzQ29udGVudENoYW5nZShiKSkge1xuICAgICAgICByZXR1cm4gYS5zdGFydEluZGV4IC0gYi5zdGFydEluZGV4O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShhKSAmJiBpc0Zyb250bWF0dGVyQ2hhbmdlKGIpKSB7XG4gICAgICAgIHJldHVybiBhLmZyb250bWF0dGVyS2V5LmxvY2FsZUNvbXBhcmUoYi5mcm9udG1hdHRlcktleSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0NvbnRlbnRDaGFuZ2UoYSkgPyAtMSA6IDE7XG4gICAgfSk7XG5cbiAgICAvLyBCVUc6IGh0dHBzOi8vZm9ydW0ub2JzaWRpYW4ubWQvdC9idWctZHVwbGljYXRlZC1saW5rcy1pbi1tZXRhZGF0YWNhY2hlLWluc2lkZS1mb290bm90ZXMvODU1NTFcbiAgICBjaGFuZ2VzID0gY2hhbmdlcy5maWx0ZXIoKGNoYW5nZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjaGFuZ2Uub2xkQ29udGVudCA9PT0gY2hhbmdlLm5ld0NvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICFkZWVwRXF1YWwoY2hhbmdlLCBjaGFuZ2VzW2luZGV4IC0gMV0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwcmV2aW91c0NoYW5nZSA9IGNoYW5nZXNbaSAtIDFdO1xuICAgICAgaWYgKCFwcmV2aW91c0NoYW5nZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc0NvbnRlbnRDaGFuZ2UocHJldmlvdXNDaGFuZ2UpICYmIGlzQ29udGVudENoYW5nZShjaGFuZ2UpICYmIHByZXZpb3VzQ2hhbmdlLmVuZEluZGV4ICYmIGNoYW5nZS5zdGFydEluZGV4XG4gICAgICAgICYmIHByZXZpb3VzQ2hhbmdlLmVuZEluZGV4ID4gY2hhbmdlLnN0YXJ0SW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ092ZXJsYXBwaW5nIGNoYW5nZXMnLCB7XG4gICAgICAgICAgY2hhbmdlLFxuICAgICAgICAgIHByZXZpb3VzQ2hhbmdlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9ICcnO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIGxldCBmcm9udG1hdHRlckNoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICAgIGlmIChpc0NvbnRlbnRDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgICBuZXdDb250ZW50ICs9IGNvbnRlbnQuc2xpY2UobGFzdEluZGV4LCBjaGFuZ2Uuc3RhcnRJbmRleCk7XG4gICAgICAgIG5ld0NvbnRlbnQgKz0gY2hhbmdlLm5ld0NvbnRlbnQ7XG4gICAgICAgIGxhc3RJbmRleCA9IGNoYW5nZS5lbmRJbmRleDtcbiAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShjaGFuZ2UpKSB7XG4gICAgICAgIHNldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIGNoYW5nZS5mcm9udG1hdHRlcktleSwgY2hhbmdlLm5ld0NvbnRlbnQpO1xuICAgICAgICBmcm9udG1hdHRlckNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBwYXRoT3JGaWxlKSkge1xuICAgICAgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGZyb250bWF0dGVyLCBudWxsLCAnXFx0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0NvbnRlbnQgKz0gY29udGVudC5zbGljZShsYXN0SW5kZXgpO1xuICAgICAgaWYgKGZyb250bWF0dGVyQ2hhbmdlZCkge1xuICAgICAgICBuZXdDb250ZW50ID0gc2V0RnJvbnRtYXR0ZXIobmV3Q29udGVudCwgZnJvbnRtYXR0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3Q29udGVudDtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgY29udGVudCBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGNvbnRlbnQgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIENvbnRlbnRDaGFuZ2Uge1xuICByZXR1cm4gKGZpbGVDaGFuZ2UgYXMgUGFydGlhbDxDb250ZW50Q2hhbmdlPikuc3RhcnRJbmRleCAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBmaWxlQ2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBmcm9udG1hdHRlciBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb250bWF0dGVyQ2hhbmdlKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIEZyb250bWF0dGVyQ2hhbmdlIHtcbiAgcmV0dXJuIChmaWxlQ2hhbmdlIGFzIFBhcnRpYWw8RnJvbnRtYXR0ZXJDaGFuZ2U+KS5mcm9udG1hdHRlcktleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb25TYWZlKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICB9IGNhdGNoIHtcbiAgICBwYXJzZWQgPSBudWxsO1xuICB9XG5cbiAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0Jykge1xuICAgIHBhcnNlZCA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFXQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBb0R4QixlQUFzQixpQkFDcEIsS0FDQSxZQUNBLGlCQUNBLGlCQUFpQyxDQUFDLEdBQ25CO0FBQ2YsUUFBTSxRQUFRLEtBQUssWUFBWSxPQUFPLFlBQVk7QUFDaEQsUUFBSSxVQUFVLE1BQU0sYUFBYSxlQUFlO0FBQ2hELFVBQU0sY0FBYyxhQUFhLEtBQUssVUFBVSxJQUFJLGNBQWMsT0FBTyxJQUFJLGlCQUFpQixPQUFPO0FBRXJHLGVBQVcsVUFBVSxTQUFTO0FBQzVCLFVBQUksZ0JBQWdCLE1BQU0sR0FBRztBQUMzQixjQUFNLGdCQUFnQixRQUFRLE1BQU0sT0FBTyxZQUFZLE9BQU8sUUFBUTtBQUN0RSxZQUFJLGtCQUFrQixPQUFPLFlBQVk7QUFDdkMsa0JBQVEsS0FBSyxvQkFBb0I7QUFBQSxZQUMvQjtBQUFBLFlBQ0EsVUFBVSxPQUFPO0FBQUEsWUFDakIsaUJBQWlCLE9B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
238
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0ZpbGVDaGFuZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIEZpbGVDaGFuZ2VcbiAqIENvbnRhaW5zIHV0aWxpdHkgdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgZmlsZSBjaGFuZ2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBDYW52YXNEYXRhIH0gZnJvbSAnb2JzaWRpYW4vQ2FudmFzLmQudHMnO1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICcuLi9WYWx1ZVByb3ZpZGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmltcG9ydCB7XG4gIGRlZXBFcXVhbCxcbiAgZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSxcbiAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVMaW5rLFxuICBpc0NhbnZhc1RleHRMaW5rLFxuICBwYXJzZUNhbnZhc0xpbmtLZXlcbn0gZnJvbSAnLi9DYW52YXMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlXG59IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyLFxuICBzZXRGcm9udG1hdHRlclxufSBmcm9tICcuL0Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBwYXJzZU1ldGFkYXRhXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQgeyByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UgfSBmcm9tICcuL1JlZmVyZW5jZS50cyc7XG5pbXBvcnQgeyBwcm9jZXNzIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbnRlbnQgYm9keSBjaGFuZ2UgaW4gdGhlIFZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRDaGFuZ2UgZXh0ZW5kcyBGaWxlQ2hhbmdlIHtcbiAgLyoqXG4gICAqIFRoZSBlbmQgaW5kZXggb2YgdGhlIGNoYW5nZSBpbiB0aGUgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgZW5kSW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBjaGFuZ2UgaW4gdGhlIGZpbGUgY29udGVudC5cbiAgICovXG4gIHN0YXJ0SW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZmlsZSBjaGFuZ2UgaW4gdGhlIFZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIG5ldyBjb250ZW50IHRvIHJlcGxhY2UgdGhlIG9sZCBjb250ZW50LlxuICAgKi9cbiAgbmV3Q29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgb2xkQ29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBmcm9udG1hdHRlciBjaGFuZ2UgaW4gdGhlIFZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyb250bWF0dGVyQ2hhbmdlIGV4dGVuZHMgRmlsZUNoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUga2V5IGluIHRoZSBmcm9udG1hdHRlciB0byB1c2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJLZXk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2VyaWVzIG9mIGZpbGUgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2Ugd2hlcmUgdGhlIGZpbGUgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gY2hhbmdlc1Byb3ZpZGVyIC0gQSBwcm92aWRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgZmlsZSBjaGFuZ2VzIHRvIGFwcGx5LlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcHJvY2Vzc2luZy9yZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgY2hhbmdlcyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUZpbGVDaGFuZ2VzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgY2hhbmdlc1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPEZpbGVDaGFuZ2VbXT4sXG4gIHByb2Nlc3NPcHRpb25zOiBQcm9jZXNzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcHJvY2VzcyhhcHAsIHBhdGhPckZpbGUsIGFzeW5jIChjb250ZW50KSA9PiB7XG4gICAgaWYgKGlzQ2FudmFzRmlsZShhcHAsIHBhdGhPckZpbGUpKSB7XG4gICAgICByZXR1cm4gYXBwbHlDYW52YXNDaGFuZ2VzKGFwcCwgY29udGVudCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLCBjaGFuZ2VzUHJvdmlkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKGNvbnRlbnQsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSwgY2hhbmdlc1Byb3ZpZGVyKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgY29udGVudCBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGNvbnRlbnQgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIENvbnRlbnRDaGFuZ2Uge1xuICByZXR1cm4gKGZpbGVDaGFuZ2UgYXMgUGFydGlhbDxDb250ZW50Q2hhbmdlPikuc3RhcnRJbmRleCAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBmaWxlQ2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBmcm9udG1hdHRlciBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb250bWF0dGVyQ2hhbmdlKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UpOiBmaWxlQ2hhbmdlIGlzIEZyb250bWF0dGVyQ2hhbmdlIHtcbiAgcmV0dXJuIChmaWxlQ2hhbmdlIGFzIFBhcnRpYWw8RnJvbnRtYXR0ZXJDaGFuZ2U+KS5mcm9udG1hdHRlcktleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNhbnZhc0NoYW5nZXMoYXBwOiBBcHAsIGNvbnRlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nLCBjaGFuZ2VzUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8RmlsZUNoYW5nZVtdPik6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNoYW5nZXNQcm92aWRlcik7XG4gIGNvbnN0IGNhbnZhc0RhdGEgPSBwYXJzZUpzb25TYWZlKGNvbnRlbnQpIGFzIENhbnZhc0RhdGE7XG5cbiAgY29uc3QgY2FudmFzVGV4dENoYW5nZXMgPSBuZXcgTWFwPG51bWJlciwgTWFwPG51bWJlciwgRnJvbnRtYXR0ZXJDaGFuZ2U+PigpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICBpZiAoIWlzRnJvbnRtYXR0ZXJDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdPbmx5IGZyb250bWF0dGVyIGNoYW5nZXMgYXJlIHN1cHBvcnRlZCBmb3IgY2FudmFzIGZpbGVzJywge1xuICAgICAgICBjaGFuZ2UsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY2FudmFzTGluayA9IHBhcnNlQ2FudmFzTGlua0tleShjaGFuZ2UuZnJvbnRtYXR0ZXJLZXkpO1xuXG4gICAgaWYgKCFjYW52YXNMaW5rKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgY2FudmFzIGxpbmsnLCB7XG4gICAgICAgIGtleTogY2hhbmdlLmZyb250bWF0dGVyS2V5LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBjYW52YXNEYXRhLm5vZGVzW2NhbnZhc0xpbmsubm9kZUluZGV4XTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm9kZSBub3QgZm91bmQnLCB7XG4gICAgICAgIGtleTogY2hhbmdlLmZyb250bWF0dGVyS2V5LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0NhbnZhc0ZpbGVMaW5rKGNhbnZhc0xpbmspKSB7XG4gICAgICBpZiAobm9kZS5maWxlICE9PSBjaGFuZ2Uub2xkQ29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudDogbm9kZS5maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UuZnJvbnRtYXR0ZXJLZXksXG4gICAgICAgICAgcGF0aFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIG5vZGUuZmlsZSA9IGNoYW5nZS5uZXdDb250ZW50O1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChpc0NhbnZhc1RleHRMaW5rKGNhbnZhc0xpbmspKSB7XG4gICAgICBsZXQgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlID0gY2FudmFzVGV4dENoYW5nZXMuZ2V0KGNhbnZhc0xpbmsubGlua0luZGV4KTtcbiAgICAgIGlmICghY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlKSB7XG4gICAgICAgIGNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZSA9IG5ldyBNYXA8bnVtYmVyLCBGcm9udG1hdHRlckNoYW5nZT4oKTtcbiAgICAgICAgY2FudmFzVGV4dENoYW5nZXMuc2V0KGNhbnZhc0xpbmsubGlua0luZGV4LCBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUpO1xuICAgICAgfVxuXG4gICAgICBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUuc2V0KGNhbnZhc0xpbmsubGlua0luZGV4LCBjaGFuZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBbbm9kZUluZGV4LCBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGVdIG9mIGNhbnZhc1RleHRDaGFuZ2VzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5vZGUgPSBjYW52YXNEYXRhLm5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vZGUgbm90IGZvdW5kJywge1xuICAgICAgICBub2RlSW5kZXgsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5vZGUudGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm9kZSB0ZXh0IGlzIG5vdCBhIHN0cmluZycsIHtcbiAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgbm9kZS50ZXh0KTtcbiAgICBjb25zdCBsaW5rcyA9IGdldEFsbExpbmtzKGNhY2hlKTtcbiAgICBjb25zdCBjb250ZW50Q2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgICBmb3IgKGxldCBsaW5rSW5kZXggPSAwOyBsaW5rSW5kZXggPCBsaW5rcy5sZW5ndGg7IGxpbmtJbmRleCsrKSB7XG4gICAgICBjb25zdCBsaW5rID0gbGlua3NbbGlua0luZGV4XTtcbiAgICAgIGlmICghbGluaykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ01pc3NpbmcgbGluaycsIHtcbiAgICAgICAgICBsaW5rSW5kZXgsXG4gICAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICAgIG5vZGVUZXh0OiBub2RlLnRleHQsXG4gICAgICAgICAgcGF0aFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FudmFzVGV4dENoYW5nZSA9IGNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZS5nZXQobGlua0luZGV4KTtcbiAgICAgIGlmIChjYW52YXNUZXh0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgY2FudmFzVGV4dENoYW5nZS5uZXdDb250ZW50KTtcbiAgICAgICAgY29udGVudENoYW5nZS5vbGRDb250ZW50ID0gY2FudmFzVGV4dENoYW5nZS5vbGRDb250ZW50O1xuICAgICAgICBjb250ZW50Q2hhbmdlcy5wdXNoKGNvbnRlbnRDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUudGV4dCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMobm9kZS50ZXh0LCBgJHtwYXRofS5GQUtFX1RFWFQubm9kZSR7bm9kZUluZGV4LnRvU3RyaW5nKCl9Lm1kYCwgY29udGVudENoYW5nZXMpO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNhbnZhc0RhdGEsIG51bGwsICdcXHQnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb250ZW50Q2hhbmdlcyhjb250ZW50OiBzdHJpbmcsIHBhdGg6IHN0cmluZywgY2hhbmdlc1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPEZpbGVDaGFuZ2VbXT4pOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgbGV0IGNoYW5nZXMgPSBhd2FpdCByZXNvbHZlVmFsdWUoY2hhbmdlc1Byb3ZpZGVyKTtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICBpZiAoaXNDb250ZW50Q2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnNsaWNlKGNoYW5nZS5zdGFydEluZGV4LCBjaGFuZ2UuZW5kSW5kZXgpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ29udGVudCBtaXNtYXRjaCcsIHtcbiAgICAgICAgICBhY3R1YWxDb250ZW50LFxuICAgICAgICAgIGVuZEluZGV4OiBjaGFuZ2UuZW5kSW5kZXgsXG4gICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHN0YXJ0SW5kZXg6IGNoYW5nZS5zdGFydEluZGV4XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShjaGFuZ2UpKSB7XG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwgY2hhbmdlLmZyb250bWF0dGVyS2V5KTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ICE9PSBjaGFuZ2Uub2xkQ29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UuZnJvbnRtYXR0ZXJLZXksXG4gICAgICAgICAgcGF0aFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoaXNDb250ZW50Q2hhbmdlKGEpICYmIGlzQ29udGVudENoYW5nZShiKSkge1xuICAgICAgcmV0dXJuIGEuc3RhcnRJbmRleCAtIGIuc3RhcnRJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckNoYW5nZShhKSAmJiBpc0Zyb250bWF0dGVyQ2hhbmdlKGIpKSB7XG4gICAgICByZXR1cm4gYS5mcm9udG1hdHRlcktleS5sb2NhbGVDb21wYXJlKGIuZnJvbnRtYXR0ZXJLZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBpc0NvbnRlbnRDaGFuZ2UoYSkgPyAtMSA6IDE7XG4gIH0pO1xuXG4gIC8vIEJVRzogaHR0cHM6Ly9mb3J1bS5vYnNpZGlhbi5tZC90L2J1Zy1kdXBsaWNhdGVkLWxpbmtzLWluLW1ldGFkYXRhY2FjaGUtaW5zaWRlLWZvb3Rub3Rlcy84NTU1MVxuICBjaGFuZ2VzID0gY2hhbmdlcy5maWx0ZXIoKGNoYW5nZSwgaW5kZXgpID0+IHtcbiAgICBpZiAoY2hhbmdlLm9sZENvbnRlbnQgPT09IGNoYW5nZS5uZXdDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhZGVlcEVxdWFsKGNoYW5nZSwgY2hhbmdlc1tpbmRleCAtIDFdKTtcbiAgfSk7XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhbmdlID0gY2hhbmdlc1tpXTtcbiAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzQ2hhbmdlID0gY2hhbmdlc1tpIC0gMV07XG4gICAgaWYgKCFwcmV2aW91c0NoYW5nZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaXNDb250ZW50Q2hhbmdlKHByZXZpb3VzQ2hhbmdlKSAmJiBpc0NvbnRlbnRDaGFuZ2UoY2hhbmdlKSAmJiBwcmV2aW91c0NoYW5nZS5lbmRJbmRleCAmJiBjaGFuZ2Uuc3RhcnRJbmRleFxuICAgICAgJiYgcHJldmlvdXNDaGFuZ2UuZW5kSW5kZXggPiBjaGFuZ2Uuc3RhcnRJbmRleFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdPdmVybGFwcGluZyBjaGFuZ2VzJywge1xuICAgICAgICBjaGFuZ2UsXG4gICAgICAgIHByZXZpb3VzQ2hhbmdlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGxldCBuZXdDb250ZW50ID0gJyc7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBsZXQgZnJvbnRtYXR0ZXJDaGFuZ2VkID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgIGlmIChpc0NvbnRlbnRDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgbmV3Q29udGVudCArPSBjb250ZW50LnNsaWNlKGxhc3RJbmRleCwgY2hhbmdlLnN0YXJ0SW5kZXgpO1xuICAgICAgbmV3Q29udGVudCArPSBjaGFuZ2UubmV3Q29udGVudDtcbiAgICAgIGxhc3RJbmRleCA9IGNoYW5nZS5lbmRJbmRleDtcbiAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwgY2hhbmdlLmZyb250bWF0dGVyS2V5LCBjaGFuZ2UubmV3Q29udGVudCk7XG4gICAgICBmcm9udG1hdHRlckNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG5ld0NvbnRlbnQgKz0gY29udGVudC5zbGljZShsYXN0SW5kZXgpO1xuICBpZiAoZnJvbnRtYXR0ZXJDaGFuZ2VkKSB7XG4gICAgbmV3Q29udGVudCA9IHNldEZyb250bWF0dGVyKG5ld0NvbnRlbnQsIGZyb250bWF0dGVyKTtcbiAgfVxuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb25TYWZlKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICB9IGNhdGNoIHtcbiAgICBwYXJzZWQgPSBudWxsO1xuICB9XG5cbiAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0Jykge1xuICAgIHBhcnNlZCA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFZQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGVBQWU7QUFvRHhCLGVBQXNCLGlCQUNwQixLQUNBLFlBQ0EsaUJBQ0EsaUJBQWlDLENBQUMsR0FDbkI7QUFDZixRQUFNLFFBQVEsS0FBSyxZQUFZLE9BQU8sWUFBWTtBQUNoRCxRQUFJLGFBQWEsS0FBSyxVQUFVLEdBQUc7QUFDakMsYUFBTyxtQkFBbUIsS0FBSyxTQUFTLFFBQVEsS0FBSyxVQUFVLEdBQUcsZUFBZTtBQUFBLElBQ25GO0FBRUEsV0FBTyxNQUFNLG9CQUFvQixTQUFTLFFBQVEsS0FBSyxVQUFVLEdBQUcsZUFBZTtBQUFBLEVBQ3JGLEdBQUcsY0FBYztBQUNuQjtBQVFPLFNBQVMsZ0JBQWdCLFlBQXFEO0FBQ25GLFNBQVEsV0FBc0MsZUFBZTtBQUMvRDtBQVFPLFNBQVMsb0JBQW9CLFlBQXlEO0FBQzNGLFNBQVEsV0FBMEMsbUJBQW1CO0FBQ3ZFO0FBRUEsZUFBZSxtQkFBbUIsS0FBVSxTQUFpQixN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QVEsT0FBTyxDQUFDLFFBQVEsVUFBVTtBQUMxQyxRQUFJLE9BQU8sZUFBZSxPQUFPLFlBQVk7QUFDM0MsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLFVBQVUsR0FBRztBQUNmLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxDQUFDLFVBQVUsUUFBUSxRQUFRLFFBQVEsQ0FBQyxDQUFDO0FBQUEsRUFDOUMsQ0FBQztBQUVELFdBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFDdkMsVUFBTSxTQUFTLFFBQVEsQ0FBQztBQUN4QixRQUFJLENBQUMsUUFBUTtBQUNYO0FBQUEsSUFDRjtBQUNBLFVBQU0saUJBQWlCLFFBQVEsSUFBSSxDQUFDO0FBQ3BDLFFBQUksQ0FBQyxnQkFBZ0I7QUFDbkI7QUFBQSxJQUNGO0FBRUEsUUFDRSxnQkFBZ0IsY0FBYyxLQUFLLGdCQUFnQixNQUFNLEtBQUssZUFBZSxZQUFZLE9BQU8sY0FDN0YsZUFBZSxXQUFXLE9BQU8sWUFDcEM7QUFDQSxjQUFRLEtBQUssdUJBQXVCO0FBQUEsUUFDbEM7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBQ0QsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsTUFBSSxhQUFhO0FBQ2pCLE1BQUksWUFBWTtBQUNoQixNQUFJLHFCQUFxQjtBQUV6QixhQUFXLFVBQVUsU0FBUztBQUM1QixRQUFJLGdCQUFnQixNQUFNLEdBQUc7QUFDM0Isb0JBQWMsUUFBUSxNQUFNLFdBQVcsT0FBTyxVQUFVO0FBQ3hELG9CQUFjLE9BQU87QUFDckIsa0JBQVksT0FBTztBQUFBLElBQ3JCLFdBQVcsb0JBQW9CLE1BQU0sR0FBRztBQUN0Qyw2QkFBdUIsYUFBYSxPQUFPLGdCQUFnQixPQUFPLFVBQVU7QUFDNUUsMkJBQXFCO0FBQUEsSUFDdkI7QUFBQSxFQUNGO0FBRUEsZ0JBQWMsUUFBUSxNQUFNLFNBQVM7QUFDckMsTUFBSSxvQkFBb0I7QUFDdEIsaUJBQWEsZUFBZSxZQUFZLFdBQVc7QUFBQSxFQUNyRDtBQUVBLFNBQU87QUFDVDtBQUVBLFNBQVMsY0FBYyxTQUEwQztBQUMvRCxNQUFJO0FBQ0osTUFBSTtBQUNGLGFBQVMsS0FBSyxNQUFNLE9BQU87QUFBQSxFQUM3QixRQUFRO0FBQ04sYUFBUztBQUFBLEVBQ1g7QUFFQSxNQUFJLFdBQVcsUUFBUSxPQUFPLFdBQVcsVUFBVTtBQUNqRCxhQUFTLENBQUM7QUFBQSxFQUNaO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -9,7 +9,10 @@ import {
9
9
  normalizePath,
10
10
  parseLinktext
11
11
  } from "obsidian";
12
- import { InternalPluginName } from "obsidian-typings/implementations";
12
+ import {
13
+ InternalPluginName,
14
+ isFrontmatterLinkCache
15
+ } from "obsidian-typings/implementations";
13
16
  import { remark } from "remark";
14
17
  import remarkParse from "remark-parse";
15
18
  import { wikiLinkPlugin } from "remark-wiki-link";
@@ -30,6 +33,10 @@ import {
30
33
  trimStart
31
34
  } from "../String.mjs";
32
35
  import { isUrl } from "../url.mjs";
36
+ import {
37
+ isCanvasFileLink,
38
+ parseCanvasLinkKey
39
+ } from "./Canvas.mjs";
33
40
  import { applyFileChanges } from "./FileChange.mjs";
34
41
  import {
35
42
  getFile,
@@ -245,7 +252,13 @@ function updateLink(options) {
245
252
  const { subpath } = splitSubpath(link.link);
246
253
  let shouldKeepAlias = !shouldUpdateFilenameAlias;
247
254
  if (isCanvasFile(app, newSourcePathOrFile)) {
248
- return targetFile.path + subpath;
255
+ const canvasLink = isFrontmatterLinkCache(link) ? parseCanvasLinkKey(link.key) : null;
256
+ if (!canvasLink) {
257
+ throw new Error("Invalid canvas link");
258
+ }
259
+ if (isCanvasFileLink(canvasLink)) {
260
+ return targetFile.path + subpath;
261
+ }
249
262
  }
250
263
  let alias;
251
264
  if (isWikilink) {
@@ -460,4 +473,4 @@ export {
460
473
  updateLink,
461
474
  updateLinksInFile
462
475
  };
463
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIExpbmtcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgYW5kIHVwZGF0aW5nIGxpbmtzIHdpdGhpbiBPYnNpZGlhbiB2YXVsdHMuIEl0IGluY2x1ZGVzXG4gKiBmdW5jdGlvbnMgdG8gc3BsaXQgcGF0aHMsIHVwZGF0ZSBsaW5rcyBpbiBmaWxlcywgYW5kIGdlbmVyYXRlIG1hcmtkb3duIGxpbmtzIHdpdGggdmFyaW91cyBvcHRpb25zLlxuICogVGhlIGZ1bmN0aW9ucyBpbnRlZ3JhdGUgd2l0aCBPYnNpZGlhbidzIEFQSSB0byBlbnN1cmUgdGhhdCBsaW5rcyBhcmUgbWFuYWdlZCBjb3JyZWN0bHkgd2l0aGluIHRoZSB2YXVsdC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIExpbmssXG4gIFRleHRcbn0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUHJvbWlzZSB9IGZyb20gJy4uL0FzeW5jLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL1BhdGgudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplLFxuICByZXBsYWNlQWxsLFxuICB0cmltU3RhcnRcbn0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IGlzVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7IGFwcGx5RmlsZUNoYW5nZXMgfSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgdHJpbU1hcmtkb3duRXh0ZW5zaW9uXG59IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgdGVtcFJlZ2lzdGVyRmlsZUFuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5pbXBvcnQgeyByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UgfSBmcm9tICcuL1JlZmVyZW5jZS50cyc7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIGxpbmsgc3ltYm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG5jb25zdCBXSUtJTElOS19ESVZJREVSID0gJ3wnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnZlcnRpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zV3JhcHBlciB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGZvciBnZW5lcmF0aW5nIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgZGVmYXVsdE9wdGlvbnNGbjogKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgYSBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYWxpYXMgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqL1xuICBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy4gSWYgYGZhbHNlYCBhbmQgYHBhdGhPckZpbGVgIGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBsaW5rIHRleHQuIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZiBgaXNFbWJlZGAsIGBpc1dpa2lsaW5rYCwgYHVzZUxlYWRpbmdEb3RgLCBhbmQgYHVzZUFuZ2xlQnJhY2tldHNgLlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIHJlbGF0aXZlLiBJZiBub3QgcHJvdmlkZWQgb3IgYGZhbHNlYCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBzaG91bGRGb3JjZVJlbGF0aXZlUGF0aD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLiBIYXMgbm8gZWZmZWN0IGlmIGBhbGxvd0VtcHR5RW1iZWRBbGlhc2AgaXMgYHRydWVgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gSGFzIG5vIGVmZmVjdCBpZiBgaXNXaWtpbGlua2AgaXMgYHRydWVgXG4gICAqL1xuICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gSGFzIG5vIGVmZmVjdCBpZiBgaXNXaWtpbGlua2AgaXMgYHRydWVgIG9yIGBpc1JlbGF0aXZlYCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkVXNlTGVhZGluZ0RvdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaGFzIGFuZ2xlIGJyYWNrZXRzLlxuICAgKi9cbiAgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKi9cbiAgaXNFbWJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKi9cbiAgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgbGluayBwYXRoLlxuICAgKi9cbiAgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1YnBhdGguXG4gICAqL1xuICBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIG9sZFRhcmdldFBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHVwZGF0aW5nIGxpbmtzIGluIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZU9wdGlvbnMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgb2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSB0aGUgbGlua3MgdG8gYmUgaW4gTWFya2Rvd24gZm9ybWF0LlxuICAgKi9cbiAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIGlzRW1iZWQ6IGJvb2xlYW47XG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHNob3VsZEZvcmNlUmVsYXRpdmVQYXRoOiBib29sZWFuO1xuICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuICBzaG91bGRVc2VMZWFkaW5nRG90OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIHtcbiAgZGF0YToge1xuICAgIGFsaWFzOiBzdHJpbmc7XG4gIH07XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKG9wdGlvbnM6IENvbnZlcnRMaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0TGlua0ZpbGUob3B0aW9ucy5hcHAsIG9wdGlvbnMubGluaywgb3B0aW9ucy5vbGRTb3VyY2VQYXRoT3JGaWxlID8/IG9wdGlvbnMubmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGlmICghdGFyZ2V0RmlsZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxpbmsub3JpZ2luYWw7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua09wdGlvbnM+KHtcbiAgICBhcHA6IG9wdGlvbnMuYXBwLFxuICAgIGxpbms6IG9wdGlvbnMubGluayxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBvcHRpb25zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBvcHRpb25zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzOiBvcHRpb25zLnNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzOiBvcHRpb25zLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW52YWxpZC12b2lkLXR5cGVcbiAgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gTWF5YmVQcm9taXNlPHN0cmluZyB8IHZvaWQ+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkgPz8gW107XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IHRvSnNvbihsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IHRvSnNvbihsaW5rKTtcbiAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICB9LCBwcm9jZXNzT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gbGlua0NvbnZlcnRlciAtIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAqIEBwYXJhbSBwcm9jZXNzT3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgZm9yIHJldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW52YWxpZC12b2lkLXR5cGVcbiAgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gTWF5YmVQcm9taXNlPHN0cmluZyB8IHZvaWQ+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBpZiAoIWNhY2hlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChyZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9LCBwcm9jZXNzT3B0aW9ucyk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGxpbmsgLSBUaGUgcmVmZXJlbmNlIGNhY2hlIGZvciB0aGUgbGluay5cbiAqIEBwYXJhbSBzb3VyY2VQYXRoT3JGaWxlIC0gVGhlIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgcmV0dXJuIGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSkpO1xufVxuXG4vKipcbiAqIEZpeGVzIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgY2FjaGUuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG1ldGFkYXRhIGNhY2hlIHRvIGZpeCB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyB3ZXJlIGZpeGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICByZXR1cm4gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyhjYWNoZS5mcm9udG1hdHRlciwgJycsIGNhY2hlKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGluayhvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcblxuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9uc0ZuID0gKGFwcC5maWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayBhcyBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNXcmFwcGVyPikuZGVmYXVsdE9wdGlvbnNGblxuICAgID8/ICgoKTogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0+ICh7fSkpO1xuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9ucyA9IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4oKTtcblxuICBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBvcHRpb25zID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLmNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBvcHRpb25zLnRhcmdldFBhdGhPckZpbGUsIG9wdGlvbnMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkKTtcblxuICByZXR1cm4gdGVtcFJlZ2lzdGVyRmlsZUFuZFJ1bihhcHAsIHRhcmdldEZpbGUsICgpID0+IGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChvcHRpb25zKSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGluayhzdHI6IHN0cmluZyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBwYXJzZUxpbmtVcmwoc3RyKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb25zdCBFTUJFRF9QUkVGSVggPSAnISc7XG5cbiAgY29uc3QgaXNFbWJlZCA9IHN0ci5zdGFydHNXaXRoKEVNQkVEX1BSRUZJWCk7XG4gIGlmIChpc0VtYmVkKSB7XG4gICAgc3RyID0gdHJpbVN0YXJ0KHN0ciwgRU1CRURfUFJFRklYKTtcbiAgfVxuICBjb25zdCBwcm9jZXNzb3IgPSByZW1hcmsoKS51c2UocmVtYXJrUGFyc2UpLnVzZSh3aWtpTGlua1BsdWdpbiwgeyBhbGlhc0RpdmlkZXI6IFdJS0lMSU5LX0RJVklERVIgfSk7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzb3IucGFyc2Uoc3RyKTtcblxuICBpZiAocm9vdC5jaGlsZHJlbi5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcmFncmFwaCA9IHJvb3QuY2hpbGRyZW5bMF07XG5cbiAgaWYgKHBhcmFncmFwaD8udHlwZSAhPT0gJ3BhcmFncmFwaCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChwYXJhZ3JhcGguY2hpbGRyZW4ubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub2RlID0gcGFyYWdyYXBoLmNoaWxkcmVuWzBdO1xuXG4gIGlmIChub2RlPy5wb3NpdGlvbj8uc3RhcnQub2Zmc2V0ICE9PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobm9kZS5wb3NpdGlvbi5lbmQub2Zmc2V0ICE9PSBzdHIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKG5vZGUudHlwZSBhcyBzdHJpbmcpIHtcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHJldHVybiBwYXJzZUxpbmtOb2RlKG5vZGUgYXMgTGluaywgc3RyLCBpc0VtYmVkKTtcbiAgICBjYXNlICd3aWtpTGluayc6XG4gICAgICByZXR1cm4gcGFyc2VXaWtpbGlua05vZGUobm9kZSBhcyB1bmtub3duIGFzIFdpa2lMaW5rTm9kZSwgc3RyLCBpc0VtYmVkKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKG9wdGlvbnM6IFNob3VsZFJlc2V0QWxpYXNPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQsXG4gICAgaXNXaWtpbGluayxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlXG4gIH0gPSBvcHRpb25zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIHRhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZURpciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZURpciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VEaXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRGlyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbChub3JtYWxpemVQYXRoKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnKVswXSA/PyAnJyksIC9eXFwuXFwvL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlc1RvUmVzZXQpIHtcbiAgICBpZiAoYWxpYXMudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyID0gZGlybmFtZShhbGlhcyk7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGFsaWFzLCBleHRuYW1lKGFsaWFzKSk7XG4gICAgaWYgKGpvaW4oZGlyLCBiYXNlKS50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN1YnBhdGgobGluazogc3RyaW5nKTogU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VMaW5rdGV4dChub3JtYWxpemUobGluaykpO1xuICByZXR1cm4ge1xuICAgIGxpbmtQYXRoOiBwYXJzZWQucGF0aCxcbiAgICBzdWJwYXRoOiBwYXJzZWQuc3VicGF0aFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RW1iZWQobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNFbWJlZCA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIGRvdCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1suL2xpbmtdXWAsIGBbdGl0bGVdKC4vbGluaylgLCBgW3RpdGxlXSg8Li9saW5rPilgLFxuICogYCFbWy4vbGlua11dYCwgYCFbdGl0bGVdKC4vbGluaylgLCBgIVt0aXRsZV0oPC4vbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIGRvdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0V2lraWxpbmsobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNXaWtpbGluayA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKG9wdGlvbnM6IFVwZGF0ZUxpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBsaW5rLm9yaWdpbmFsO1xuICB9XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgbmV3VGFyZ2V0UGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHRlc3RXaWtpbGluayhsaW5rLm9yaWdpbmFsKSAmJiBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MgIT09IHRydWU7XG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGxldCBzaG91bGRLZWVwQWxpYXMgPSAhc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhcztcblxuICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0RmlsZS5wYXRoICsgc3VicGF0aDtcbiAgfVxuXG4gIGxldCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgICBhbGlhcyA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICAgIHNob3VsZEtlZXBBbGlhcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNPcHRpb25zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IGxpbmsuZGlzcGxheVRleHQ7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgsIGV4dG5hbWUob2xkVGFyZ2V0UGF0aCkpKSB7XG4gICAgICBhbGlhcyA9IHRhcmdldEZpbGUuYmFzZW5hbWU7XG4gICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCkpIHtcbiAgICAgIGFsaWFzID0gdGFyZ2V0RmlsZS5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzV2lraWxpbms6IHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyA/IGZhbHNlIDogdW5kZWZpbmVkLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5GaWxlKG9wdGlvbnM6IFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcblxuICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlLCAobGluaykgPT4ge1xuICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rT3B0aW9ucz4oe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICAgIH0pKTtcbiAgfSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIF9maXhGcm9udG1hdHRlck1hcmtkb3duTGlua3ModmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsodmFsdWUpO1xuICAgIGlmICghcGFyc2VMaW5rUmVzdWx0IHx8IHBhcnNlTGlua1Jlc3VsdC5pc1dpa2lsaW5rIHx8IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/Pz0gW107XG4gICAgbGV0IGxpbmsgPSBjYWNoZS5mcm9udG1hdHRlckxpbmtzLmZpbmQoKGZyb250bWF0dGVyTGluaykgPT4gZnJvbnRtYXR0ZXJMaW5rLmtleSA9PT0ga2V5KTtcblxuICAgIGlmICghbGluaykge1xuICAgICAgbGluayA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICB9O1xuICAgICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5wdXNoKGxpbmspO1xuICAgIH1cblxuICAgIGxpbmsubGluayA9IHBhcnNlTGlua1Jlc3VsdC51cmw7XG4gICAgbGluay5vcmlnaW5hbCA9IHZhbHVlO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluay5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0Zyb250bWF0dGVyTGlua3MgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgY29uc3QgaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzID0gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyhjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCBjYWNoZSk7XG4gICAgaGFzRnJvbnRtYXR0ZXJMaW5rcyB8fD0gaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzO1xuICB9XG5cbiAgcmV0dXJuIGhhc0Zyb250bWF0dGVyTGlua3M7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQoYXBwOiBBcHAsIHRhcmdldEZpbGU6IFRGaWxlLCBzb3VyY2VQYXRoOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZywgY29uZmlnOiBMaW5rQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldEZpbGUucGF0aCA9PT0gc291cmNlUGF0aCAmJiBzdWJwYXRoKSB7XG4gICAgbGlua1RleHQgPSBzdWJwYXRoO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5zaG91bGRGb3JjZVJlbGF0aXZlUGF0aCkge1xuICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgY29uZmlnLmlzV2lraWxpbmsgPyB0cmltTWFya2Rvd25FeHRlbnNpb24oYXBwLCB0YXJnZXRGaWxlKSA6IHRhcmdldEZpbGUucGF0aCkgKyBzdWJwYXRoO1xuICB9IGVsc2Uge1xuICAgIGxpbmtUZXh0ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgY29uZmlnLmlzV2lraWxpbmspICsgc3VicGF0aDtcbiAgfVxuXG4gIGlmIChjb25maWcuc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGggJiYgY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3QgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gIH1cblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBvcHRpb25zLnRhcmdldFBhdGhPckZpbGUsIG9wdGlvbnMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvcHRpb25zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gb3B0aW9ucy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKG9wdGlvbnMsIHRhcmdldEZpbGUpO1xuICBjb25zdCBsaW5rVGV4dCA9IGdlbmVyYXRlTGlua1RleHQoYXBwLCB0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBzdWJwYXRoLCBsaW5rQ29uZmlnKTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKGxpbmtUZXh0LCBvcHRpb25zLmFsaWFzLCBsaW5rQ29uZmlnLmlzRW1iZWQpXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0LCB0YXJnZXRGaWxlLCBvcHRpb25zLCBsaW5rQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhsaW5rVGV4dDogc3RyaW5nLCB0YXJnZXRGaWxlOiBURmlsZSwgb3B0aW9uczogR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBjb25maWcuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGNvbnN0IHByb2Nlc3NlZExpbmtUZXh0ID0gY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtsaW5rVGV4dH0+YFxuICAgIDogcmVwbGFjZUFsbChsaW5rVGV4dCwgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQLCAoeyBzdWJzdHJpbmc6IHNwZWNpYWxMaW5rU3ltYm9sIH0pID0+IGVuY29kZVVSSUNvbXBvbmVudChzcGVjaWFsTGlua1N5bWJvbCkpO1xuXG4gIGxldCBhbGlhcyA9IG9wdGlvbnMuYWxpYXMgPz8gJyc7XG4gIGlmICghYWxpYXMgJiYgKCFjb25maWcuaXNFbWJlZCB8fCAhb3B0aW9ucy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhb3B0aW9ucy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICB9XG5cbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7cHJvY2Vzc2VkTGlua1RleHR9KWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQ6IHN0cmluZywgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgaXNFbWJlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gaXNFbWJlZCA/ICchJyA6ICcnO1xuICBjb25zdCBub3JtYWxpemVkQWxpYXMgPSBhbGlhcyA/PyAnJztcblxuICBpZiAobm9ybWFsaXplZEFsaWFzICYmIG5vcm1hbGl6ZWRBbGlhcy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtub3JtYWxpemVkQWxpYXN9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXNQYXJ0ID0gbm9ybWFsaXplZEFsaWFzID8gYHwke25vcm1hbGl6ZWRBbGlhc31gIDogJyc7XG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7bGlua1RleHR9JHthbGlhc1BhcnR9XV1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucywgdGFyZ2V0RmlsZTogVEZpbGUpOiBMaW5rQ29uZmlnIHtcbiAgY29uc3QgeyBhcHAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogb3B0aW9ucy5pc0VtYmVkID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RFbWJlZChvcHRpb25zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/ICFpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpLFxuICAgIGlzV2lraWxpbms6IG9wdGlvbnMuaXNXaWtpbGluayA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0V2lraWxpbmsob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKSxcbiAgICBzaG91bGRGb3JjZVJlbGF0aXZlUGF0aDogb3B0aW9ucy5zaG91bGRGb3JjZVJlbGF0aXZlUGF0aCA/PyBzaG91bGRVc2VSZWxhdGl2ZUxpbmtzKGFwcCksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogb3B0aW9ucy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdDogb3B0aW9ucy5zaG91bGRVc2VMZWFkaW5nRG90ID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nRG90KG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rTm9kZShub2RlOiBMaW5rLCBzdHI6IHN0cmluZywgaXNFbWJlZDogYm9vbGVhbik6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IE9QRU5fQU5HTEVfQlJBQ0tFVCA9ICc8JztcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcblxuICBjb25zdCBhbGlhc05vZGUgPSBub2RlLmNoaWxkcmVuWzBdIGFzIFRleHQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhd1VybCA9IHN0ci5zbGljZSgoYWxpYXNOb2RlPy5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAxKSArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgKG5vZGUucG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMCkgLSBMSU5LX1NVRkZJWC5sZW5ndGgpO1xuICBjb25zdCBoYXNBbmdsZUJyYWNrZXRzID0gc3RyLnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xuICBjb25zdCBpc0V4dGVybmFsID0gaXNVcmwobm9kZS51cmwpO1xuICBsZXQgdXJsID0gbm9kZS51cmw7XG4gIGlmICghaXNFeHRlcm5hbCkge1xuICAgIGlmICghaGFzQW5nbGVCcmFja2V0cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IGFsaWFzTm9kZT8udmFsdWUsXG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0VtYmVkLFxuICAgIGlzRXh0ZXJuYWwsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgdGl0bGU6IG5vZGUudGl0bGUgPz8gdW5kZWZpbmVkLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rVXJsKHN0cjogc3RyaW5nKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGlmICghaXNVcmwoc3RyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHVybDogc3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcsIGlzRW1iZWQ6IGJvb2xlYW4pOiBQYXJzZUxpbmtSZXN1bHQge1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgaXNFbWJlZCxcbiAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHVybDogbm9kZS52YWx1ZVxuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFrQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGNBQWM7QUFDdkIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxzQkFBc0I7QUFPL0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsYUFBYTtBQUN0QixTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsNkJBQTZCO0FBTXRDLE1BQU0sOEJBQThCO0FBS3BDLE1BQU0sc0NBQXNDO0FBRTVDLE1BQU0sbUJBQW1CO0FBK1RsQixTQUFTLFlBQVksU0FBcUM7QUFDL0QsUUFBTSxhQUFhLGdCQUFnQixRQUFRLEtBQUssUUFBUSxNQUFNLFFBQVEsdUJBQXVCLFFBQVEsbUJBQW1CO0FBQ3hILE1BQUksQ0FBQyxZQUFZO0FBQ2YsV0FBTyxRQUFRLEtBQUs7QUFBQSxFQUN0QjtBQUVBLFNBQU8sV0FBVyw0QkFBK0M7QUFBQSxJQUMvRCxLQUFLLFFBQVE7QUFBQSxJQUNiLE1BQU0sUUFBUTtBQUFBLElBQ2QscUJBQXFCLFFBQVE7QUFBQSxJQUM3QixxQkFBcUI7QUFBQSxJQUNyQixxQkFBcUIsUUFBUTtBQUFBLElBQzdCLDBCQUEwQixRQUFRO0FBQUEsSUFDbEMsMkJBQTJCLFFBQVE7QUFBQSxFQUNyQyxDQUFDLENBQUM7QUFDSjtBQVdBLGVBQXNCLGNBQ3BCLEtBQ0EsWUFFQSxlQUNBLGlCQUFpQyxDQUFDLEdBQ25CO0FBQ2YsUUFBTSxZQUFZLE1BQU0sd0JBQXdCLEtBQUssWUFBWSxjQUFjO0FBQy9FLGFBQVcsb0JBQW9CLFVBQVUsS0FBSyxHQUFHO0FBQy9DLFVBQU0sZUFBZSxVQUFVLElBQUksZ0JBQWdCLEtBQUssQ0FBQztBQUN6RCxVQUFNLFlBQVksSUFBSSxJQUFZLGFBQWEsSUFBSSxDQUFDLFNBQVMsT0FBTyxJQUFJLENBQUMsQ0FBQztBQUMxRSxVQUFNLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO0FBQy9DLFlBQU0sV0FBVyxPQUFPLElBQUk7QUFDNUIsVUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEdBQUc7QUFDNUI7QUFBQSxNQUNGO0FBRUEsYUFBTyxjQUFjLElBQUk7QUFBQSxJQUMzQixHQUFHLGNBQWM7QUFBQSxFQUNuQjtBQUNGO0FBV0EsZUFBc0IsVUFDcEIsS0FDQSxZQUVBLGVBQ0EsaUJBQWlDLENBQUMsR0FDbkI7QUFDZixRQUFNLGlCQUFpQixLQUFLLFlBQVksWUFBWTtBQUNsRCxVQUFNLFFBQVEsTUFBTSxhQUFhLEtBQUssVUFBVTtBQUNoRCxRQUFJLENBQUMsT0FBTztBQUNWLGFBQU8sQ0FBQztBQUFBLElBQ1Y7QUFFQSxVQUFNLFVBQXdCLENBQUM7QUFFL0IsZUFBVyxRQUFRLFlBQVksS0FBSyxHQUFHO0FBQ3JDLFlBQU0sYUFBYSxNQUFNLGNBQWMsSUFBSTtBQUMzQyxVQUFJLGVBQWUsUUFBVztBQUM1QjtBQUFBLE1BQ0Y7QUFFQSxjQUFRLEtBQUssc0JBQXNCLE1BQU0sVUFBVSxDQUFDO0FBQUEsSUFDdEQ7QUFFQSxXQUFPO0FBQUEsRUFDVCxHQUFHLGNBQWM7QUFDbkI7QUFVTyxTQUFTLGdCQUFnQixLQUFVLE1BQWlCLGtCQUE0QztBQUNyRyxRQUFNLEVBQUUsU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJO0FBQzNDLFNBQU8sSUFBSSxjQUFjLHFCQUFxQixVQUFVLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQztBQUN4RjtBQVFPLFNBQVMsNEJBQTRCLE9BQWdDO0FBQzFFLFNBQU8sNkJBQTZCLE1BQU0sYUFBYSxJQUFJLEtBQUs7QUFDbEU7QUFRTyxTQUFTLHFCQUFxQixTQUE4QztBQUNqRixRQUFNLEVBQUUsSUFBSSxJQUFJO0FBRWhCLFFBQU0sK0JBQWdDLElBQUksWUFBWSxxQkFBNEUscUJBQzVILE9BQTZDLENBQUM7QUFDcEQsUUFBTSw2QkFBNkIsNkJBQTZCO0FBRWhFLFFBQU0sa0JBQXdEO0FBQUEsSUFDNUQsMEJBQTBCO0FBQUEsRUFDNUI7QUFFQSxZQUFVLEVBQUUsR0FBRyxpQkFBaUIsR0FBRyw0QkFBNEIsR0FBRyxRQUFRO0FBRTFFLFFBQU0sYUFBYSxRQUFRLEtBQUssUUFBUSxrQkFBa0IsUUFBUSx3QkFBd0I7QUFFMUYsU0FBTyx1QkFBdUIsS0FBSyxZQUFZLE1BQU0seUJBQXlCLE9BQU8sQ0FBQztBQUN4RjtBQVFPLFNBQVMsVUFBVSxLQUFxQztBQUM3RCxRQUFNLFNBQVMsYUFBYSxHQUFHO0FBQy9CLE1BQUksUUFBUTtBQUNWLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlO0FBRXJCLFFBQU0sVUFBVSxJQUFJLFdBQVcsWUFBWTtBQUMzQyxNQUFJLFNBQVM7QUFDWCxVQUFNLFVBQVUsS0FBSyxZQUFZO0FBQUEsRUFDbkM7QUFDQSxRQUFNLFlBQVksT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxpQkFBaUIsQ0FBQztBQUNsRyxRQUFNLE9BQU8sVUFBVSxNQUFNLEdBQUc7QUFFaEMsTUFBSSxLQUFLLFNBQVMsV0FBVyxHQUFHO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxZQUFZLEtBQUssU0FBUyxDQUFDO0FBRWpDLE1BQUksV0FBVyxTQUFTLGFBQWE7QUFDbkMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFVBQVUsU0FBUyxXQUFXLEdBQUc7QUFDbkMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLE9BQU8sVUFBVSxTQUFTLENBQUM7QUFFakMsTUFBSSxNQUFNLFVBQVUsTUFBTSxXQUFXLEdBQUc7QUFDdEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLEtBQUssU0FBUyxJQUFJLFdBQVcsSUFBSSxRQUFRO0FBQzNDLFdBQU87QUFBQSxFQUNUO0FBRUEsVUFBUSxLQUFLLE1BQWdCO0FBQUEsSUFDM0IsS0FBSztBQUNILGFBQU8sY0FBYyxNQUFjLEtBQUssT0FBTztBQUFBLElBQ2pELEtBQUs7QUFDSCxhQUFPLGtCQUFrQixNQUFpQyxLQUFLLE9BQU87QUFBQSxJQUN4RTtBQUNFLGFBQU87QUFBQSxFQUNYO0FBQ0Y7QUFRTyxTQUFTLGlCQUFpQixTQUEyQztBQUMxRSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLE1BQUksZUFBZSxPQUFPO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxDQUFDLGFBQWE7QUFDaEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGFBQWEsUUFBUSxLQUFLLGtCQUFrQixJQUFJO0FBQ3RELFFBQU0sZ0JBQWdCLFFBQVEsS0FBSyxtQkFBbUI7QUFDdEQsUUFBTSxnQkFBZ0IsUUFBUSxLQUFLLHVCQUF1QixtQkFBbUI7QUFDN0UsUUFBTSxlQUFlLFFBQVEsYUFBYTtBQUMxQyxRQUFNLGVBQWUsUUFBUSxhQUFhO0FBQzFDLFFBQU0saUJBQWlCLG9CQUFJLElBQVk7QUFFdkMsYUFBVyxjQUFjLENBQUMsV0FBVyxNQUFNLGFBQWEsR0FBRztBQUN6RCxRQUFJLENBQUMsWUFBWTtBQUNmO0FBQUEsSUFDRjtBQUVBLFVBQU0sT0FBTyxRQUFRLEtBQUssVUFBVTtBQUNwQyxtQkFBZSxJQUFJLElBQUk7QUFDdkIsbUJBQWUsSUFBSSxTQUFTLElBQUksQ0FBQztBQUNqQyxtQkFBZSxJQUFJLFNBQVMsY0FBYyxJQUFJLENBQUM7QUFDL0MsbUJBQWUsSUFBSSxTQUFTLGNBQWMsSUFBSSxDQUFDO0FBQUEsRUFDakQ7QUFFQSxhQUFXLGNBQWMsQ0FBQyxlQUFlLGFBQWEsR0FBRztBQUN2RCxtQkFBZSxJQUFJLElBQUksY0FBYyxlQUFlLFlBQVksWUFBWSxLQUFLLENBQUM7QUFBQSxFQUNwRjtBQUVBLFFBQU0sbUJBQW1CLFdBQVcsY0FBYyxZQUFZLE1BQU0sS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsWUFBWTtBQUVoSCxhQUFXLFNBQVMsZ0JBQWdCO0FBQ2xDLFFBQUksTUFBTSxZQUFZLE1BQU0sa0JBQWtCO0FBQzVDLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxNQUFNLFFBQVEsS0FBSztBQUN6QixVQUFNLE9BQU8sU0FBUyxPQUFPLFFBQVEsS0FBSyxDQUFDO0FBQzNDLFFBQUksS0FBSyxLQUFLLElBQUksRUFBRSxZQUFZLE1BQU0sa0JBQWtCO0FBQ3RELGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsYUFBYSxNQUFrQztBQUM3RCxRQUFNLFNBQVMsY0FBYyxVQUFVLElBQUksQ0FBQztBQUM1QyxTQUFPO0FBQUEsSUFDTCxVQUFVLE9BQU87QUFBQSxJQUNqQixTQUFTLE9BQU87QUFBQSxFQUNsQjtBQUNGO0FBU08sU0FBUyxrQkFBa0IsTUFBdUI7QUFDdkQsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLG9CQUFvQjtBQUM5QztBQVNPLFNBQVMsVUFBVSxNQUF1QjtBQUMvQyxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsV0FBVztBQUNyQztBQVVPLFNBQVMsZUFBZSxNQUF1QjtBQUNwRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsSUFBSSxXQUFXLElBQUksS0FBSztBQUNsRDtBQVNPLFNBQVMsYUFBYSxNQUF1QjtBQUNsRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsY0FBYztBQUN4QztBQVFPLFNBQVMsV0FBVyxTQUFvQztBQUM3RCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLENBQUMscUJBQXFCO0FBQ3hCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDQSxRQUFNLGFBQWEsUUFBUSxLQUFLLHFCQUFxQixJQUFJO0FBQ3pELFFBQU0sZ0JBQWdCLFFBQVEsS0FBSyx1QkFBdUIsbUJBQW1CO0FBQzdFLFFBQU0sYUFBYSxhQUFhLEtBQUssUUFBUSxLQUFLLDZCQUE2QjtBQUMvRSxRQUFNLEVBQUUsUUFBUSxJQUFJLGFBQWEsS0FBSyxJQUFJO0FBQzFDLE1BQUksa0JBQWtCLENBQUM7QUFFdkIsTUFBSSxhQUFhLEtBQUssbUJBQW1CLEdBQUc7QUFDMUMsV0FBTyxXQUFXLE9BQU87QUFBQSxFQUMzQjtBQUVBLE1BQUk7QUFFSixNQUFJLFlBQVk7QUFDZCxVQUFNLGtCQUFrQixVQUFVLEtBQUssUUFBUTtBQUMvQyxRQUFJLGlCQUFpQixPQUFPO0FBQzFCLGNBQVEsZ0JBQWdCO0FBQ3hCLHdCQUFrQjtBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUVBLFlBQVUsaUJBQWlCLDRCQUFxRDtBQUFBLElBQzVFO0FBQUEsSUFDQSxhQUFhLEtBQUs7QUFBQSxJQUNsQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsRUFDcEIsQ0FBQyxDQUFDLElBQ0EsU0FDQSxLQUFLO0FBRVQsTUFBSSxDQUFDLGlCQUFpQjtBQUNwQixRQUFJLFVBQVUsU0FBUyxlQUFlLFFBQVEsYUFBYSxDQUFDLEdBQUc7QUFDN0QsY0FBUSxXQUFXO0FBQUEsSUFDckIsV0FBVyxVQUFVLFNBQVMsYUFBYSxHQUFHO0FBQzVDLGNBQVEsV0FBVztBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUVBLFFBQU0sVUFBVSxxQkFBcUIsNEJBQXlEO0FBQUEsSUFDNUY7QUFBQSxJQUNBO0FBQUEsSUFDQSxZQUFZLDJCQUEyQixRQUFRO0FBQUEsSUFDL0MsY0FBYyxLQUFLO0FBQUEsSUFDbkIsa0JBQWtCO0FBQUEsSUFDbEI7QUFBQSxJQUNBLGtCQUFrQjtBQUFBLEVBQ3BCLENBQUMsQ0FBQztBQUNGLFNBQU87QUFDVDtBQVFBLGVBQXNCLGtCQUFrQixTQUFrRDtBQUN4RixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosTUFBSSxhQUFhLEtBQUssbUJBQW1CLEtBQUssQ0FBQyxJQUFJLGdCQUFnQixxQkFBcUIsbUJBQW1CLE1BQU0sR0FBRztBQUNsSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxTQUFTO0FBQ2xELFVBQU0sY0FBYyxVQUFVLEtBQUssUUFBUTtBQUMzQyxRQUFJLCtCQUErQixVQUFhLCtCQUErQixhQUFhO0FBQzFGO0FBQUEsSUFDRjtBQUNBLFdBQU8sWUFBWSw0QkFBZ0Q7QUFBQSxNQUNqRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDLENBQUM7QUFBQSxFQUNKLEdBQUcsT0FBTztBQUNaO0FBRUEsU0FBUyw2QkFBNkIsT0FBZ0IsS0FBYSxPQUFnQztBQUNqRyxNQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFVBQU0sa0JBQWtCLFVBQVUsS0FBSztBQUN2QyxRQUFJLENBQUMsbUJBQW1CLGdCQUFnQixjQUFjLGdCQUFnQixZQUFZO0FBQ2hGLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxxQkFBcUIsQ0FBQztBQUM1QixRQUFJLE9BQU8sTUFBTSxpQkFBaUIsS0FBSyxDQUFDLG9CQUFvQixnQkFBZ0IsUUFBUSxHQUFHO0FBRXZGLFFBQUksQ0FBQyxNQUFNO0FBQ1QsYUFBTztBQUFBLFFBQ0w7QUFBQSxRQUNBLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxNQUNaO0FBQ0EsWUFBTSxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsSUFDbEM7QUFFQSxTQUFLLE9BQU8sZ0JBQWdCO0FBQzVCLFNBQUssV0FBVztBQUNoQixRQUFJLGdCQUFnQixVQUFVLFFBQVc7QUFDdkMsV0FBSyxjQUFjLGdCQUFnQjtBQUFBLElBQ3JDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUMvQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksc0JBQXNCO0FBRTFCLGFBQVcsQ0FBQyxVQUFVLFVBQVUsS0FBSyxPQUFPLFFBQVEsS0FBZ0MsR0FBRztBQUNyRixVQUFNLDJCQUEyQiw2QkFBNkIsWUFBWSxNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFDdEgsNEJBQXdCO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixLQUFVLFlBQW1CLFlBQW9CLFNBQWlCLFFBQTRCO0FBQ3RILE1BQUk7QUFFSixNQUFJLFdBQVcsU0FBUyxjQUFjLFNBQVM7QUFDN0MsZUFBVztBQUFBLEVBQ2IsV0FBVyxPQUFPLHlCQUF5QjtBQUN6QyxlQUFXLFNBQVMsUUFBUSxVQUFVLEdBQUcsT0FBTyxhQUFhLHNCQUFzQixLQUFLLFVBQVUsSUFBSSxXQUFXLElBQUksSUFBSTtBQUFBLEVBQzNILE9BQU87QUFDTCxlQUFXLElBQUksY0FBYyxlQUFlLFlBQVksWUFBWSxPQUFPLFVBQVUsSUFBSTtBQUFBLEVBQzNGO0FBRUEsTUFBSSxPQUFPLDJCQUEyQixPQUFPLHVCQUF1QixDQUFDLFNBQVMsV0FBVyxHQUFHLEtBQUssQ0FBQyxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQzFILGVBQVcsS0FBSyxRQUFRO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHlCQUF5QixTQUE4QztBQUM5RSxRQUFNLEVBQUUsSUFBSSxJQUFJO0FBQ2hCLFFBQU0sYUFBYSxRQUFRLEtBQUssUUFBUSxrQkFBa0IsUUFBUSx3QkFBd0I7QUFDMUYsUUFBTSxhQUFhLFFBQVEsS0FBSyxRQUFRLGdCQUFnQjtBQUN4RCxRQUFNLFVBQVUsUUFBUSxXQUFXO0FBRW5DLFFBQU0sYUFBYSxjQUFjLFNBQVMsVUFBVTtBQUNwRCxRQUFNLFdBQVcsaUJBQWlCLEtBQUssWUFBWSxZQUFZLFNBQVMsVUFBVTtBQUVsRixTQUFPLFdBQVcsYUFDZCxpQkFBaUIsVUFBVSxRQUFRLE9BQU8sV0FBVyxPQUFPLElBQzVELDBCQUEwQixVQUFVLFlBQVksU0FBUyxVQUFVO0FBQ3pFO0FBRUEsU0FBUywwQkFBMEIsVUFBa0IsWUFBbUIsU0FBc0MsUUFBNEI7QUFDeEksUUFBTSxFQUFFLElBQUksSUFBSTtBQUNoQixRQUFNLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFM0MsUUFBTSxvQkFBb0IsT0FBTyx5QkFDN0IsSUFBSSxRQUFRLE1BQ1osV0FBVyxVQUFVLDZCQUE2QixDQUFDLEVBQUUsV0FBVyxrQkFBa0IsTUFBTSxtQkFBbUIsaUJBQWlCLENBQUM7QUFFakksTUFBSSxRQUFRLFFBQVEsU0FBUztBQUM3QixNQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sV0FBVyxDQUFDLFFBQVEsMkJBQTJCO0FBQ3BFLFlBQVEsQ0FBQyxRQUFRLGdEQUFnRCxlQUFlLEtBQUssVUFBVSxJQUMzRixXQUFXLFdBQ1gsV0FBVztBQUFBLEVBQ2pCO0FBRUEsUUFBTSxlQUFlLFdBQVcsT0FBTyxxQ0FBcUMsTUFBTTtBQUNsRixTQUFPLEdBQUcsV0FBVyxJQUFJLFlBQVksS0FBSyxpQkFBaUI7QUFDN0Q7QUFFQSxTQUFTLGlCQUFpQixVQUFrQixPQUEyQixTQUEwQjtBQUMvRixRQUFNLGNBQWMsVUFBVSxNQUFNO0FBQ3BDLFFBQU0sa0JBQWtCLFNBQVM7QUFFakMsTUFBSSxtQkFBbUIsZ0JBQWdCLFlBQVksTUFBTSxTQUFTLFlBQVksR0FBRztBQUMvRSxXQUFPLEdBQUcsV0FBVyxLQUFLLGVBQWU7QUFBQSxFQUMzQztBQUVBLFFBQU0sWUFBWSxrQkFBa0IsSUFBSSxlQUFlLEtBQUs7QUFDNUQsU0FBTyxHQUFHLFdBQVcsS0FBSyxRQUFRLEdBQUcsU0FBUztBQUNoRDtBQUVBLFNBQVMsY0FBYyxTQUFzQyxZQUErQjtBQUMxRixRQUFNLEVBQUUsSUFBSSxJQUFJO0FBQ2hCLFNBQU87QUFBQSxJQUNMLFNBQVMsUUFBUSxZQUFZLFFBQVEsZUFBZSxVQUFVLFFBQVEsWUFBWSxJQUFJLFdBQWMsQ0FBQyxlQUFlLEtBQUssVUFBVTtBQUFBLElBQ25JLFlBQVksUUFBUSxlQUFlLFFBQVEsZUFBZSxhQUFhLFFBQVEsWUFBWSxJQUFJLFdBQWMsbUJBQW1CLEdBQUc7QUFBQSxJQUNuSSx5QkFBeUIsUUFBUSwyQkFBMkIsdUJBQXVCLEdBQUc7QUFBQSxJQUN0Rix3QkFBd0IsUUFBUSwyQkFBMkIsUUFBUSxlQUFlLGtCQUFrQixRQUFRLFlBQVksSUFBSSxXQUFjO0FBQUEsSUFDMUkscUJBQXFCLFFBQVEsd0JBQXdCLFFBQVEsZUFBZSxlQUFlLFFBQVEsWUFBWSxJQUFJLFdBQWM7QUFBQSxFQUNuSTtBQUNGO0FBRUEsU0FBUyxjQUFjLE1BQVksS0FBYSxTQUFtQztBQUNqRixRQUFNLHFCQUFxQjtBQUMzQixRQUFNLG9CQUFvQjtBQUMxQixRQUFNLGNBQWM7QUFFcEIsUUFBTSxZQUFZLEtBQUssU0FBUyxDQUFDO0FBQ2pDLFFBQU0sU0FBUyxJQUFJLE9BQU8sV0FBVyxVQUFVLElBQUksVUFBVSxLQUFLLGtCQUFrQixTQUFTLEtBQUssVUFBVSxJQUFJLFVBQVUsS0FBSyxZQUFZLE1BQU07QUFDakosUUFBTSxtQkFBbUIsSUFBSSxXQUFXLGtCQUFrQixLQUFLLE9BQU8sV0FBVyxrQkFBa0I7QUFDbkcsUUFBTSxhQUFhLE1BQU0sS0FBSyxHQUFHO0FBQ2pDLE1BQUksTUFBTSxLQUFLO0FBQ2YsTUFBSSxDQUFDLFlBQVk7QUFDZixRQUFJLENBQUMsa0JBQWtCO0FBQ3JCLFVBQUk7QUFDRixjQUFNLG1CQUFtQixHQUFHO0FBQUEsTUFDOUIsU0FBUyxPQUFPO0FBQ2QsZ0JBQVEsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEtBQUs7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTyw0QkFBNkM7QUFBQSxJQUNsRCxPQUFPLFdBQVc7QUFBQSxJQUNsQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxZQUFZO0FBQUEsSUFDWixPQUFPLEtBQUssU0FBUztBQUFBLElBQ3JCO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFFQSxTQUFTLGFBQWEsS0FBcUM7QUFDekQsTUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHO0FBQ2YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsSUFDVCxZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsSUFDWixLQUFLO0FBQUEsRUFDUDtBQUNGO0FBRUEsU0FBUyxrQkFBa0IsTUFBb0IsS0FBYSxTQUFtQztBQUM3RixTQUFPLDRCQUE2QztBQUFBLElBQ2xELE9BQU8sSUFBSSxTQUFTLGdCQUFnQixJQUFJLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDMUQ7QUFBQSxJQUNBLFlBQVk7QUFBQSxJQUNaLFlBQVk7QUFBQSxJQUNaLEtBQUssS0FBSztBQUFBLEVBQ1osQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=
476
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIExpbmtcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgYW5kIHVwZGF0aW5nIGxpbmtzIHdpdGhpbiBPYnNpZGlhbiB2YXVsdHMuIEl0IGluY2x1ZGVzXG4gKiBmdW5jdGlvbnMgdG8gc3BsaXQgcGF0aHMsIHVwZGF0ZSBsaW5rcyBpbiBmaWxlcywgYW5kIGdlbmVyYXRlIG1hcmtkb3duIGxpbmtzIHdpdGggdmFyaW91cyBvcHRpb25zLlxuICogVGhlIGZ1bmN0aW9ucyBpbnRlZ3JhdGUgd2l0aCBPYnNpZGlhbidzIEFQSSB0byBlbnN1cmUgdGhhdCBsaW5rcyBhcmUgbWFuYWdlZCBjb3JyZWN0bHkgd2l0aGluIHRoZSB2YXVsdC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIExpbmssXG4gIFRleHRcbn0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge1xuICBJbnRlcm5hbFBsdWdpbk5hbWUsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVcbn0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcblxuaW1wb3J0IHR5cGUgeyBNYXliZVByb21pc2UgfSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL1ZhdWx0LnRzJztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnLi4vT2JqZWN0LnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJy4uL1N0cmluZy50cyc7XG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVMaW5rLFxuICBwYXJzZUNhbnZhc0xpbmtLZXlcbn0gZnJvbSAnLi9DYW52YXMudHMnO1xuaW1wb3J0IHsgYXBwbHlGaWxlQ2hhbmdlcyB9IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICB0cmltTWFya2Rvd25FeHRlbnNpb25cbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQge1xuICBzaG91bGRVc2VSZWxhdGl2ZUxpbmtzLFxuICBzaG91bGRVc2VXaWtpbGlua3Ncbn0gZnJvbSAnLi9PYnNpZGlhblNldHRpbmdzLnRzJztcbmltcG9ydCB7IHJlZmVyZW5jZVRvRmlsZUNoYW5nZSB9IGZyb20gJy4vUmVmZXJlbmNlLnRzJztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQID0gL1tcXFxcXFx4MDBcXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRiBdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIG1hcmtkb3duIGxpbmsgc3ltYm9scy5cbiAqL1xuY29uc3QgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVggPSAvW1xcXFxbXFxdPD5fKn49YCRdL2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29udmVydGluZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydExpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3IgZGVmYXVsdCBvcHRpb25zIGZvciBnZW5lcmF0aW5nIG1hcmtkb3duIGxpbmtzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNXcmFwcGVyIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBkZWZhdWx0T3B0aW9uc0ZuOiAoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucz47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBhIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICovXG4gIGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBJZiBgZmFsc2VgIGFuZCBgcGF0aE9yRmlsZWAgaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGxpbmsgdGV4dC4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mIGBpc0VtYmVkYCwgYGlzV2lraWxpbmtgLCBgdXNlTGVhZGluZ0RvdGAsIGFuZCBgdXNlQW5nbGVCcmFja2V0c2AuXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgcmVsYXRpdmUuIElmIG5vdCBwcm92aWRlZCBvciBgZmFsc2VgLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIHNob3VsZEZvcmNlUmVsYXRpdmVQYXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIEhhcyBubyBlZmZlY3QgaWYgYGFsbG93RW1wdHlFbWJlZEFsaWFzYCBpcyBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLiBIYXMgbm8gZWZmZWN0IGlmIGBpc1dpa2lsaW5rYCBpcyBgdHJ1ZWBcbiAgICovXG4gIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LiBEZWZhdWx0cyB0byBgZmFsc2VgLiBIYXMgbm8gZWZmZWN0IGlmIGBpc1dpa2lsaW5rYCBpcyBgdHJ1ZWAgb3IgYGlzUmVsYXRpdmVgIGlzIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRVc2VMZWFkaW5nRG90PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICBoYXNBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqL1xuICBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBsaW5rIHBhdGguXG4gICAqL1xuICBsaW5rUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VicGF0aC5cbiAgICovXG4gIHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB1cGRhdGluZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuXG4gICAqL1xuICBuZXdUYXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgb2xkVGFyZ2V0UGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgbGlua3MgaW4gYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBvYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIHRoZSBsaW5rcyB0byBiZSBpbiBNYXJrZG93biBmb3JtYXQuXG4gICAqL1xuICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgaXNFbWJlZDogYm9vbGVhbjtcbiAgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg6IGJvb2xlYW47XG4gIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHNob3VsZFVzZUxlYWRpbmdEb3Q6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGUge1xuICBkYXRhOiB7XG4gICAgYWxpYXM6IHN0cmluZztcbiAgfTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsob3B0aW9uczogQ29udmVydExpbmtPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShvcHRpb25zLmFwcCwgb3B0aW9ucy5saW5rLCBvcHRpb25zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gb3B0aW9ucy5uZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubGluay5vcmlnaW5hbDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rT3B0aW9ucz4oe1xuICAgIGFwcDogb3B0aW9ucy5hcHAsXG4gICAgbGluazogb3B0aW9ucy5saW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG9wdGlvbnMubmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IG9wdGlvbnMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M6IG9wdGlvbnMuc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IG9wdGlvbnMuc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0QmFja2xpbmtzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZVxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBNYXliZVByb21pc2U8c3RyaW5nIHwgdm9pZD4sXG4gIHByb2Nlc3NPcHRpb25zOiBQcm9jZXNzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCBwcm9jZXNzT3B0aW9ucyk7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSA/PyBbXTtcbiAgICBjb25zdCBsaW5rSnNvbnMgPSBuZXcgU2V0PHN0cmluZz4oY3VycmVudExpbmtzLm1hcCgobGluaykgPT4gdG9Kc29uKGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKGFwcCwgYmFja2xpbmtOb3RlUGF0aCwgKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGxpbmtKc29uID0gdG9Kc29uKGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZVxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBNYXliZVByb21pc2U8c3RyaW5nIHwgdm9pZD4sXG4gIHByb2Nlc3NPcHRpb25zOiBQcm9jZXNzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXBwbHlGaWxlQ2hhbmdlcyhhcHAsIHBhdGhPckZpbGUsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICAgIGlmICghY2FjaGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbGluayBvZiBnZXRBbGxMaW5rcyhjYWNoZSkpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgICAgaWYgKG5ld0NvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKHJlZmVyZW5jZVRvRmlsZUNoYW5nZShsaW5rLCBuZXdDb250ZW50KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH0sIHByb2Nlc3NPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlua0ZpbGUoYXBwOiBBcHAsIGxpbms6IFJlZmVyZW5jZSwgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHsgbGlua1BhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICByZXR1cm4gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua1BhdGgsIGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBfZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4gPSAoYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rIGFzIFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc1dyYXBwZXI+KS5kZWZhdWx0T3B0aW9uc0ZuXG4gICAgPz8gKCgpOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucz4gPT4gKHt9KSk7XG4gIGNvbnN0IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zID0gY29uZmlndXJhYmxlRGVmYXVsdE9wdGlvbnNGbigpO1xuXG4gIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIG9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4uY29uZmlndXJhYmxlRGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG9wdGlvbnMudGFyZ2V0UGF0aE9yRmlsZSwgb3B0aW9ucy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuXG4gIHJldHVybiB0ZW1wUmVnaXN0ZXJGaWxlQW5kUnVuKGFwcCwgdGFyZ2V0RmlsZSwgKCkgPT4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBsaW5rIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBsaW5rIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rKHN0cjogc3RyaW5nKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlTGlua1VybChzdHIpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IEVNQkVEX1BSRUZJWCA9ICchJztcblxuICBjb25zdCBpc0VtYmVkID0gc3RyLnN0YXJ0c1dpdGgoRU1CRURfUFJFRklYKTtcbiAgaWYgKGlzRW1iZWQpIHtcbiAgICBzdHIgPSB0cmltU3RhcnQoc3RyLCBFTUJFRF9QUkVGSVgpO1xuICB9XG4gIGNvbnN0IHByb2Nlc3NvciA9IHJlbWFyaygpLnVzZShyZW1hcmtQYXJzZSkudXNlKHdpa2lMaW5rUGx1Z2luLCB7IGFsaWFzRGl2aWRlcjogV0lLSUxJTktfRElWSURFUiB9KTtcbiAgY29uc3Qgcm9vdCA9IHByb2Nlc3Nvci5wYXJzZShzdHIpO1xuXG4gIGlmIChyb290LmNoaWxkcmVuLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyYWdyYXBoID0gcm9vdC5jaGlsZHJlblswXTtcblxuICBpZiAocGFyYWdyYXBoPy50eXBlICE9PSAncGFyYWdyYXBoJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHBhcmFncmFwaC5jaGlsZHJlbi5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG5vZGUgPSBwYXJhZ3JhcGguY2hpbGRyZW5bMF07XG5cbiAgaWYgKG5vZGU/LnBvc2l0aW9uPy5zdGFydC5vZmZzZXQgIT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChub2RlLnBvc2l0aW9uLmVuZC5vZmZzZXQgIT09IHN0ci5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAobm9kZS50eXBlIGFzIHN0cmluZykge1xuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgcmV0dXJuIHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCBzdHIsIGlzRW1iZWQpO1xuICAgIGNhc2UgJ3dpa2lMaW5rJzpcbiAgICAgIHJldHVybiBwYXJzZVdpa2lsaW5rTm9kZShub2RlIGFzIHVua25vd24gYXMgV2lraUxpbmtOb2RlLCBzdHIsIGlzRW1iZWQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMob3B0aW9uczogU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IG9wdGlvbnM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgdGFyZ2V0UGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRGlyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRGlyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZURpciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VEaXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKG5vcm1hbGl6ZVBhdGgoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcpWzBdID8/ICcnKSwgL15cXC5cXC8vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihkaXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZShsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFbWJlZChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RXaWtpbGluayhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsob3B0aW9uczogVXBkYXRlTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBuZXdUYXJnZXRQYXRoT3JGaWxlLCB0cnVlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gdGVzdFdpa2lsaW5rKGxpbmsub3JpZ2luYWwpICYmIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyAhPT0gdHJ1ZTtcbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgbGV0IHNob3VsZEtlZXBBbGlhcyA9ICFzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKSkge1xuICAgIGNvbnN0IGNhbnZhc0xpbmsgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlKGxpbmspID8gcGFyc2VDYW52YXNMaW5rS2V5KGxpbmsua2V5KSA6IG51bGw7XG4gICAgaWYgKCFjYW52YXNMaW5rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2FudmFzIGxpbmsnKTtcbiAgICB9XG4gICAgaWYgKGlzQ2FudmFzRmlsZUxpbmsoY2FudmFzTGluaykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgfVxuXG4gIGxldCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgICBhbGlhcyA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICAgIHNob3VsZEtlZXBBbGlhcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNPcHRpb25zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IGxpbmsuZGlzcGxheVRleHQ7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgsIGV4dG5hbWUob2xkVGFyZ2V0UGF0aCkpKSB7XG4gICAgICBhbGlhcyA9IHRhcmdldEZpbGUuYmFzZW5hbWU7XG4gICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCkpIHtcbiAgICAgIGFsaWFzID0gdGFyZ2V0RmlsZS5uYW1lO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzV2lraWxpbms6IHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyA/IGZhbHNlIDogdW5kZWZpbmVkLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5GaWxlKG9wdGlvbnM6IFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcblxuICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlLCAobGluaykgPT4ge1xuICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rT3B0aW9ucz4oe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc1xuICAgIH0pKTtcbiAgfSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIF9maXhGcm9udG1hdHRlck1hcmtkb3duTGlua3ModmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsodmFsdWUpO1xuICAgIGlmICghcGFyc2VMaW5rUmVzdWx0IHx8IHBhcnNlTGlua1Jlc3VsdC5pc1dpa2lsaW5rIHx8IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/Pz0gW107XG4gICAgbGV0IGxpbmsgPSBjYWNoZS5mcm9udG1hdHRlckxpbmtzLmZpbmQoKGZyb250bWF0dGVyTGluaykgPT4gZnJvbnRtYXR0ZXJMaW5rLmtleSA9PT0ga2V5KTtcblxuICAgIGlmICghbGluaykge1xuICAgICAgbGluayA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICB9O1xuICAgICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5wdXNoKGxpbmspO1xuICAgIH1cblxuICAgIGxpbmsubGluayA9IHBhcnNlTGlua1Jlc3VsdC51cmw7XG4gICAgbGluay5vcmlnaW5hbCA9IHZhbHVlO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluay5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0Zyb250bWF0dGVyTGlua3MgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgY29uc3QgaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzID0gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyhjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCBjYWNoZSk7XG4gICAgaGFzRnJvbnRtYXR0ZXJMaW5rcyB8fD0gaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzO1xuICB9XG5cbiAgcmV0dXJuIGhhc0Zyb250bWF0dGVyTGlua3M7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQoYXBwOiBBcHAsIHRhcmdldEZpbGU6IFRGaWxlLCBzb3VyY2VQYXRoOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZywgY29uZmlnOiBMaW5rQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldEZpbGUucGF0aCA9PT0gc291cmNlUGF0aCAmJiBzdWJwYXRoKSB7XG4gICAgbGlua1RleHQgPSBzdWJwYXRoO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5zaG91bGRGb3JjZVJlbGF0aXZlUGF0aCkge1xuICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgY29uZmlnLmlzV2lraWxpbmsgPyB0cmltTWFya2Rvd25FeHRlbnNpb24oYXBwLCB0YXJnZXRGaWxlKSA6IHRhcmdldEZpbGUucGF0aCkgKyBzdWJwYXRoO1xuICB9IGVsc2Uge1xuICAgIGxpbmtUZXh0ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgY29uZmlnLmlzV2lraWxpbmspICsgc3VicGF0aDtcbiAgfVxuXG4gIGlmIChjb25maWcuc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGggJiYgY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3QgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gIH1cblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBvcHRpb25zLnRhcmdldFBhdGhPckZpbGUsIG9wdGlvbnMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvcHRpb25zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gb3B0aW9ucy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKG9wdGlvbnMsIHRhcmdldEZpbGUpO1xuICBjb25zdCBsaW5rVGV4dCA9IGdlbmVyYXRlTGlua1RleHQoYXBwLCB0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBzdWJwYXRoLCBsaW5rQ29uZmlnKTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKGxpbmtUZXh0LCBvcHRpb25zLmFsaWFzLCBsaW5rQ29uZmlnLmlzRW1iZWQpXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0LCB0YXJnZXRGaWxlLCBvcHRpb25zLCBsaW5rQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhsaW5rVGV4dDogc3RyaW5nLCB0YXJnZXRGaWxlOiBURmlsZSwgb3B0aW9uczogR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBjb25maWcuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGNvbnN0IHByb2Nlc3NlZExpbmtUZXh0ID0gY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtsaW5rVGV4dH0+YFxuICAgIDogcmVwbGFjZUFsbChsaW5rVGV4dCwgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQLCAoeyBzdWJzdHJpbmc6IHNwZWNpYWxMaW5rU3ltYm9sIH0pID0+IGVuY29kZVVSSUNvbXBvbmVudChzcGVjaWFsTGlua1N5bWJvbCkpO1xuXG4gIGxldCBhbGlhcyA9IG9wdGlvbnMuYWxpYXMgPz8gJyc7XG4gIGlmICghYWxpYXMgJiYgKCFjb25maWcuaXNFbWJlZCB8fCAhb3B0aW9ucy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhb3B0aW9ucy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICB9XG5cbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7cHJvY2Vzc2VkTGlua1RleHR9KWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQ6IHN0cmluZywgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgaXNFbWJlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gaXNFbWJlZCA/ICchJyA6ICcnO1xuICBjb25zdCBub3JtYWxpemVkQWxpYXMgPSBhbGlhcyA/PyAnJztcblxuICBpZiAobm9ybWFsaXplZEFsaWFzICYmIG5vcm1hbGl6ZWRBbGlhcy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtub3JtYWxpemVkQWxpYXN9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXNQYXJ0ID0gbm9ybWFsaXplZEFsaWFzID8gYHwke25vcm1hbGl6ZWRBbGlhc31gIDogJyc7XG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7bGlua1RleHR9JHthbGlhc1BhcnR9XV1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucywgdGFyZ2V0RmlsZTogVEZpbGUpOiBMaW5rQ29uZmlnIHtcbiAgY29uc3QgeyBhcHAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogb3B0aW9ucy5pc0VtYmVkID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RFbWJlZChvcHRpb25zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/ICFpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpLFxuICAgIGlzV2lraWxpbms6IG9wdGlvbnMuaXNXaWtpbGluayA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0V2lraWxpbmsob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKSxcbiAgICBzaG91bGRGb3JjZVJlbGF0aXZlUGF0aDogb3B0aW9ucy5zaG91bGRGb3JjZVJlbGF0aXZlUGF0aCA/PyBzaG91bGRVc2VSZWxhdGl2ZUxpbmtzKGFwcCksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogb3B0aW9ucy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdDogb3B0aW9ucy5zaG91bGRVc2VMZWFkaW5nRG90ID8/IChvcHRpb25zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nRG90KG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rTm9kZShub2RlOiBMaW5rLCBzdHI6IHN0cmluZywgaXNFbWJlZDogYm9vbGVhbik6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IE9QRU5fQU5HTEVfQlJBQ0tFVCA9ICc8JztcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcblxuICBjb25zdCBhbGlhc05vZGUgPSBub2RlLmNoaWxkcmVuWzBdIGFzIFRleHQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhd1VybCA9IHN0ci5zbGljZSgoYWxpYXNOb2RlPy5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAxKSArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgKG5vZGUucG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMCkgLSBMSU5LX1NVRkZJWC5sZW5ndGgpO1xuICBjb25zdCBoYXNBbmdsZUJyYWNrZXRzID0gc3RyLnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xuICBjb25zdCBpc0V4dGVybmFsID0gaXNVcmwobm9kZS51cmwpO1xuICBsZXQgdXJsID0gbm9kZS51cmw7XG4gIGlmICghaXNFeHRlcm5hbCkge1xuICAgIGlmICghaGFzQW5nbGVCcmFja2V0cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IGFsaWFzTm9kZT8udmFsdWUsXG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0VtYmVkLFxuICAgIGlzRXh0ZXJuYWwsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgdGl0bGU6IG5vZGUudGl0bGUgPz8gdW5kZWZpbmVkLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rVXJsKHN0cjogc3RyaW5nKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGlmICghaXNVcmwoc3RyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHVybDogc3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcsIGlzRW1iZWQ6IGJvb2xlYW4pOiBQYXJzZUxpbmtSZXN1bHQge1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgaXNFbWJlZCxcbiAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHVybDogbm9kZS52YWx1ZVxuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFrQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixPQUFPLGlCQUFpQjtBQUN4QixTQUFTLHNCQUFzQjtBQU8vQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxhQUFhO0FBQ3RCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx3QkFBd0I7QUFDakM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDZCQUE2QjtBQU10QyxNQUFNLDhCQUE4QjtBQUtwQyxNQUFNLHNDQUFzQztBQUU1QyxNQUFNLG1CQUFtQjtBQStUbEIsU0FBUyxZQUFZLFNBQXFDO0FBQy9ELFFBQU0sYUFBYSxnQkFBZ0IsUUFBUSxLQUFLLFFBQVEsTUFBTSxRQUFRLHVCQUF1QixRQUFRLG1CQUFt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