@datagrok-libraries/utils 2.1.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,10 +12,59 @@ import * as grok from 'datagrok-api/grok';
12
12
  import * as ui from 'datagrok-api/ui';
13
13
  import * as DG from 'datagrok-api/dg';
14
14
  import dayjs from 'dayjs';
15
+ import wu from 'wu';
15
16
  import { BehaviorSubject, Subject } from 'rxjs';
16
- import { defaultUsersIds } from '../function-view';
17
17
  import { historyUtils } from '../history-utils';
18
18
  import '../../css/history-panel.css';
19
+ export const defaultUsersIds = {
20
+ 'Test': 'ca1e672e-e3be-40e0-b79b-d2c68e68d380',
21
+ 'Admin': '878c42b0-9a50-11e6-c537-6bf8e9ab02ee',
22
+ 'System': '3e32c5fa-ac9c-4d39-8b4b-4db3e576b3c3',
23
+ };
24
+ export const defaultGroupsIds = {
25
+ 'All users': 'a4b45840-9a50-11e6-9cc9-8546b8bf62e6',
26
+ 'Developers': 'ba9cd191-9a50-11e6-9cc9-910bf827f0ab',
27
+ 'Need to create': '00000000-0000-0000-0000-000000000000',
28
+ 'Test': 'ca1e672e-e3be-40e0-b79b-8546b8bf62e6',
29
+ 'Admin': 'a4b45840-9a50-11e6-c537-6bf8e9ab02ee',
30
+ 'System': 'a4b45840-ac9c-4d39-8b4b-4db3e576b3c3',
31
+ 'Administrators': '1ab8b38d-9c4e-4b1e-81c3-ae2bde3e12c5',
32
+ };
33
+ class HistoryPanelStore {
34
+ constructor() {
35
+ this.filteringOptions = { text: '' };
36
+ this.allRuns = new BehaviorSubject([]);
37
+ }
38
+ get myRuns() {
39
+ return this.allRuns.value.filter((run) => run.author.id === grok.shell.user.id);
40
+ }
41
+ get favoriteRuns() {
42
+ return this.allRuns.value.filter((run) => run.options['isFavorite'] && !run.options['isImported']);
43
+ }
44
+ get sharedRuns() {
45
+ return this.allRuns.value.filter((run) => run.options['isShared']);
46
+ }
47
+ get filteredMyRuns() {
48
+ return this.myRuns.filter((val) => (this.filteringOptions.startedAfter ? val.started > this.filteringOptions.startedAfter : true));
49
+ }
50
+ get filteredFavoriteRuns() {
51
+ return this.favoriteRuns.filter((val) => {
52
+ const startedAfter = (this.filteringOptions.startedAfter ? val.started > this.filteringOptions.startedAfter : true);
53
+ const titleContainsText = (!this.filteringOptions.text.length) ? true : (!!val.options['title']) ? val.options['title'].includes(this.filteringOptions.text) : false;
54
+ const descContainsText = (!this.filteringOptions.text.length) ? true : (!!val.options['description']) ? val.options['description'].includes(this.filteringOptions.text) : false;
55
+ return (titleContainsText || descContainsText) && startedAfter;
56
+ });
57
+ }
58
+ get filteredSharedRuns() {
59
+ return this.sharedRuns.filter((val) => {
60
+ const isAuthored = this.filteringOptions.author ? val.author.id === this.filteringOptions.author.id : true;
61
+ const startedAfter = (this.filteringOptions.startedAfter ? val.started > this.filteringOptions.startedAfter : true);
62
+ const titleContainsText = (!this.filteringOptions.text.length) ? true : (!!val.options['title']) ? val.options['title'].includes(this.filteringOptions.text) : false;
63
+ const descContainsText = (!this.filteringOptions.text.length) ? true : (!!val.options['description']) ? val.options['description'].includes(this.filteringOptions.text) : false;
64
+ return (titleContainsText || descContainsText) && startedAfter && isAuthored;
65
+ });
66
+ }
67
+ }
19
68
  export class HistoryPanel {
20
69
  constructor(func) {
21
70
  this.func = func;
@@ -41,23 +90,11 @@ export class HistoryPanel {
41
90
  this.afterRunRemoveFromShared = new Subject();
42
91
  // Emitted when FuncCall is deleted
43
92
  this.afterRunDeleted = new Subject();
44
- this.store = {
45
- filteringOptions: { text: '' },
46
- allRuns: new Subject(),
47
- myRuns: new BehaviorSubject([]),
48
- favoriteRuns: new BehaviorSubject([]),
49
- sharedRuns: new BehaviorSubject([]),
50
- filteredMyRuns: new BehaviorSubject([]),
51
- filteredFavoriteRuns: new BehaviorSubject([]),
52
- filteredSharedRuns: new BehaviorSubject([]),
53
- };
93
+ this.store = new HistoryPanelStore();
54
94
  this.myRunsFilter = new Subject();
55
95
  this.favRunsFilter = new Subject();
56
96
  this.sharedRunsFilter = new Subject();
57
97
  this.allRunsFetch = new Subject();
58
- this.myRunsFetch = new Subject();
59
- this.favRunsFetch = new Subject();
60
- this.sharedRunsFetch = new Subject();
61
98
  this.historyTab = ui.div();
62
99
  this.favTab = ui.div();
63
100
  this.sharedTab = ui.div();
@@ -80,100 +117,52 @@ export class HistoryPanel {
80
117
  this.sharedCards = [];
81
118
  this.tabs.root.style.width = '100%';
82
119
  this.tabs.root.style.height = '100%';
83
- this.store.myRuns.subscribe((myRuns) => this.store.filteredMyRuns.next(myRuns));
84
- this.store.favoriteRuns.subscribe((favoriteRuns) => this.store.filteredFavoriteRuns.next(favoriteRuns));
85
- this.store.sharedRuns.subscribe((sharedRuns) => this.store.filteredSharedRuns.next(sharedRuns));
86
- this.store.filteredMyRuns.subscribe((myRuns) => this.updateMyPane(myRuns));
87
- this.store.filteredFavoriteRuns.subscribe((newFavoriteRuns) => this.updateFavoritesPane(newFavoriteRuns));
88
- this.store.filteredSharedRuns.subscribe((sharedRuns) => this.updateSharedPane(sharedRuns));
89
- this.myRunsFilter.subscribe(() => {
90
- const filteredMyRuns = this.store.myRuns.value.filter((val) => {
91
- const startedAfter = (this.store.filteringOptions.startedAfter ? val.started > this.store.filteringOptions.startedAfter : true);
92
- return startedAfter;
93
- });
94
- this.store.filteredMyRuns.next(filteredMyRuns);
95
- });
96
- this.favRunsFilter.subscribe(() => {
97
- const filteredFavRuns = this.store.favoriteRuns.value.filter((val) => {
98
- const startedAfter = (this.store.filteringOptions.startedAfter ? val.started > this.store.filteringOptions.startedAfter : true);
99
- const titleContainsText = (this.store.filteringOptions.text.length && !!val.options['title']) ? val.options['title'].includes(this.store.filteringOptions.text) : true;
100
- const descContainsText = (this.store.filteringOptions.text.length && !!val.options['description']) ? val.options['description'].includes(this.store.filteringOptions.text) : true;
101
- return (titleContainsText || descContainsText) && startedAfter;
102
- });
103
- this.store.filteredFavoriteRuns.next(filteredFavRuns);
104
- });
105
- this.sharedRunsFilter.subscribe(() => {
106
- const filteredSharedRuns = this.store.sharedRuns.value.filter((val) => {
107
- const isAuthored = this.store.filteringOptions.author ? val.author.id === this.store.filteringOptions.author.id : true;
108
- const startedAfter = (this.store.filteringOptions.startedAfter ? val.started > this.store.filteringOptions.startedAfter : true);
109
- const titleContainsText = (this.store.filteringOptions.text.length && !!val.options['title']) ? val.options['title'].includes(this.store.filteringOptions.text) : true;
110
- const descContainsText = (this.store.filteringOptions.text.length && !!val.options['description']) ? val.options['description'].includes(this.store.filteringOptions.text) : true;
111
- return (titleContainsText || descContainsText) && startedAfter && isAuthored;
112
- });
113
- this.store.filteredSharedRuns.next(filteredSharedRuns);
114
- });
115
- this.store.allRuns.subscribe((allRuns) => {
116
- this.store.myRuns.next(allRuns.filter((run) => run.author.id === grok.shell.user.id));
117
- this.store.favoriteRuns.next(allRuns.filter((run) => run.options['isFavorite'] && !run.options['isImported']));
118
- this.store.sharedRuns.next(allRuns.filter((run) => run.options['isShared']));
120
+ this.myRunsFilter.subscribe(() => this.updateMyPane(this.store.filteredMyRuns));
121
+ this.favRunsFilter.subscribe(() => this.updateFavoritesPane(this.store.filteredFavoriteRuns));
122
+ this.sharedRunsFilter.subscribe(() => this.updateSharedPane(this.store.filteredSharedRuns));
123
+ this.store.allRuns.subscribe(() => {
124
+ this.updateMyPane(this.store.filteredMyRuns);
125
+ this.updateFavoritesPane(this.store.filteredFavoriteRuns);
126
+ this.updateSharedPane(this.store.filteredSharedRuns);
119
127
  });
120
128
  this.allRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
121
129
  const allRuns = (yield historyUtils.pullRunsByName(this.func.name, [], { order: 'started' }, ['session.user', 'options'])).reverse();
122
130
  this.store.allRuns.next(allRuns);
123
131
  }));
124
- this.myRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
125
- ui.setUpdateIndicator(this.tabs.root, true);
126
- const myRuns = (yield historyUtils.pullRunsByName(this.func.name, [{ author: grok.shell.user }], { order: 'started' }, ['session.user', 'options'])).reverse();
127
- this.store.myRuns.next(myRuns);
128
- ui.setUpdateIndicator(this.tabs.root, false);
129
- }));
130
- this.favRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
131
- ui.setUpdateIndicator(this.tabs.root, true);
132
- const myRuns = (yield historyUtils.pullRunsByName(this.func.name, [{ author: grok.shell.user }], { order: 'started' }, ['session.user', 'options'])).reverse();
133
- this.store.favoriteRuns.next(myRuns.filter((run) => run.options['isFavorite'] && !run.options['isImported']));
134
- ui.setUpdateIndicator(this.tabs.root, false);
135
- }));
136
- this.sharedRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
137
- const sharedRuns = (yield historyUtils.pullRunsByName(this.func.name, [], { order: 'started' }, ['session.user', 'options'])).reverse();
138
- this.store.sharedRuns.next(sharedRuns.filter((run) => run.options['isShared']));
139
- ui.setUpdateIndicator(this.tabs.root, false);
140
- }));
132
+ const clearMetadata = (funcCall) => {
133
+ if (!funcCall.options['isFavorite'] && !funcCall.options['isShared']) {
134
+ funcCall.options['title'] = null;
135
+ funcCall.options['description'] = null;
136
+ }
137
+ };
141
138
  this.afterRunAddToFavorites.subscribe((added) => {
142
- const editedRun = this.store.myRuns.value.find((call) => call.id === added.id);
143
- editedRun.options['isFavorite'] = true;
139
+ const editedRun = this.store.allRuns.value.find((call) => call.id === added.id);
144
140
  editedRun.options['title'] = added.options['title'];
145
141
  editedRun.options['description'] = added.options['description'];
146
- this.store.myRuns.next(this.store.myRuns.value);
147
- this.store.favoriteRuns.next([...this.store.favoriteRuns.value, editedRun]);
142
+ editedRun.options['isFavorite'] = true;
143
+ this.store.allRuns.next(this.store.allRuns.value);
148
144
  });
149
145
  this.afterRunAddToShared.subscribe((added) => {
150
- const editedRun = this.store.myRuns.value.find((call) => call.id === added.id);
151
- editedRun.options['isShared'] = true;
146
+ const editedRun = this.store.allRuns.value.find((call) => call.id === added.id);
152
147
  editedRun.options['title'] = added.options['title'];
153
148
  editedRun.options['description'] = added.options['description'];
154
- this.store.myRuns.next(this.store.myRuns.value);
155
- this.store.sharedRuns.next([...this.store.sharedRuns.value, editedRun]);
149
+ editedRun.options['isShared'] = true;
150
+ this.store.allRuns.next(this.store.allRuns.value);
156
151
  });
157
- this.afterRunRemoveFromFavorites.subscribe((id) => {
158
- this.store.favoriteRuns.next(this.store.favoriteRuns.value.filter((call) => call.id !== id));
159
- const editedRun = this.store.myRuns.value.find((call) => call.id === id);
160
- editedRun.options['title'] = null;
161
- editedRun.options['description'] = null;
152
+ this.afterRunRemoveFromFavorites.subscribe((removed) => {
153
+ const editedRun = this.store.allRuns.value.find((call) => call.id === removed.id);
162
154
  editedRun.options['isFavorite'] = false;
163
- this.store.myRuns.next(this.store.myRuns.value);
155
+ clearMetadata(editedRun);
156
+ this.store.allRuns.next(this.store.allRuns.value);
164
157
  });
165
- this.afterRunRemoveFromShared.subscribe((id) => {
166
- this.store.sharedRuns.next(this.store.sharedRuns.value.filter((call) => call.id !== id));
167
- const editedRun = this.store.myRuns.value.find((call) => call.id === id);
168
- editedRun.options['title'] = null;
169
- editedRun.options['description'] = null;
158
+ this.afterRunRemoveFromShared.subscribe((removed) => {
159
+ const editedRun = this.store.allRuns.value.find((call) => call.id === removed.id);
170
160
  editedRun.options['isShared'] = false;
171
- this.store.myRuns.next(this.store.myRuns.value);
161
+ clearMetadata(editedRun);
162
+ this.store.allRuns.next(this.store.allRuns.value);
172
163
  });
173
164
  this.afterRunDeleted.subscribe((id) => {
174
- this.store.myRuns.next(this.store.myRuns.value.filter((call) => call.id !== id));
175
- this.store.favoriteRuns.next(this.store.favoriteRuns.value.filter((call) => call.id !== id));
176
- this.store.sharedRuns.next(this.store.sharedRuns.value.filter((call) => call.id !== id));
165
+ this.store.allRuns.next(this.store.allRuns.value.filter((call) => call.id !== id));
177
166
  });
178
167
  this.allRunsFetch.next();
179
168
  this.updateFilterPane();
@@ -236,40 +225,6 @@ export class HistoryPanel {
236
225
  this.filterPane = newFilterPane;
237
226
  }
238
227
  ;
239
- showAddToFavoritesDialog(funcCall) {
240
- var _a, _b;
241
- let title = (_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : '';
242
- let annotation = (_b = funcCall.options['annotation']) !== null && _b !== void 0 ? _b : '';
243
- const titleInput = ui.stringInput('Title', title, (s) => {
244
- title = s;
245
- if (s.length === 0) {
246
- titleInput.setTooltip('Title cannot be empty');
247
- setTimeout(() => titleInput.input.classList.add('d4-invalid'), 100);
248
- }
249
- else {
250
- titleInput.setTooltip('');
251
- setTimeout(() => titleInput.input.classList.remove('d4-invalid'), 100);
252
- }
253
- });
254
- ui.dialog({ title: 'Add to favorites' })
255
- .add(ui.form([
256
- titleInput,
257
- ui.stringInput('Annotation', annotation, (s) => { annotation = s; }),
258
- ]))
259
- .onOK(() => __awaiter(this, void 0, void 0, function* () {
260
- if (title.length > 0) {
261
- funcCall = yield historyUtils.loadRun(funcCall.id, true);
262
- funcCall.options['title'] = title;
263
- funcCall.options['annotation'] = annotation;
264
- this.beforeRunAddToFavorites.next(funcCall);
265
- }
266
- else {
267
- grok.shell.warning('Title cannot be empty');
268
- }
269
- }))
270
- .show({ center: true });
271
- }
272
- ;
273
228
  showDeleteRunDialog(funcCall) {
274
229
  ui.dialog({ title: 'Delete run' })
275
230
  .add(ui.divText('The deleted run is impossible to restore. Are you sure?'))
@@ -279,40 +234,6 @@ export class HistoryPanel {
279
234
  .show({ center: true });
280
235
  }
281
236
  ;
282
- showAddToSharedDialog(funcCall) {
283
- var _a, _b;
284
- let title = (_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : '';
285
- let annotation = (_b = funcCall.options['annotation']) !== null && _b !== void 0 ? _b : '';
286
- const titleInput = ui.stringInput('Title', title, (s) => {
287
- title = s;
288
- if (s.length === 0) {
289
- titleInput.setTooltip('Title cannot be empty');
290
- setTimeout(() => titleInput.input.classList.add('d4-invalid'), 100);
291
- }
292
- else {
293
- titleInput.setTooltip('');
294
- setTimeout(() => titleInput.input.classList.remove('d4-invalid'), 100);
295
- }
296
- });
297
- ui.dialog({ title: 'Add to shared' })
298
- .add(ui.form([
299
- titleInput,
300
- ui.stringInput('Annotation', annotation, (s) => { annotation = s; }),
301
- ]))
302
- .onOK(() => __awaiter(this, void 0, void 0, function* () {
303
- if (title.length > 0) {
304
- funcCall = yield historyUtils.loadRun(funcCall.id);
305
- funcCall.options['title'] = title;
306
- funcCall.options['annotation'] = annotation;
307
- this.beforeRunAddToShared.next(funcCall);
308
- }
309
- else {
310
- grok.shell.warning('Title cannot be empty');
311
- }
312
- }))
313
- .show({ center: true });
314
- }
315
- ;
316
237
  updateSharedPane(sharedRuns) {
317
238
  const newTab = (sharedRuns.length > 0) ? this.renderSharedCards(sharedRuns) : ui.divText('No runs are marked as shared', 'no-elements-label');
318
239
  this.sharedTab.replaceWith(newTab);
@@ -331,140 +252,190 @@ export class HistoryPanel {
331
252
  this.historyTab = newTab;
332
253
  }
333
254
  ;
334
- renderFavoriteCards(funcCalls) {
335
- this.favoriteCards = funcCalls.map((funcCall) => {
336
- var _a;
337
- const unstarIcon = ui.iconFA('star', (ev) => __awaiter(this, void 0, void 0, function* () {
338
- ev.stopPropagation();
339
- this.beforeRunRemoveFromFavorites.next(funcCall.id);
340
- }), 'Unfavorite the run');
341
- unstarIcon.classList.add('fas');
342
- const shareIcon = ui.iconFA('eye', (ev) => __awaiter(this, void 0, void 0, function* () {
343
- ev.stopPropagation();
344
- this.showAddToSharedDialog(funcCall);
345
- }), 'Add to shared');
346
- shareIcon.classList.add('fal');
347
- const card = ui.divH([
255
+ renderCard(funcCall) {
256
+ var _a;
257
+ const icon = funcCall.author.picture;
258
+ icon.style.width = '25px';
259
+ icon.style.height = '25px';
260
+ icon.style.fontSize = '20px';
261
+ const cardLabel = ui.label((_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : funcCall.author.friendlyName, { style: { 'color': 'var(--blue-1)' } });
262
+ ui.bind(funcCall.author, icon);
263
+ const editIcon = ui.iconFA('edit', (ev) => {
264
+ ev.stopPropagation();
265
+ this.showEditDialog(funcCall);
266
+ });
267
+ editIcon.classList.add('cv-funccall-card-hover-icon');
268
+ const deleteIcon = ui.iconFA('trash-alt', (ev) => __awaiter(this, void 0, void 0, function* () {
269
+ ev.stopPropagation();
270
+ this.showDeleteRunDialog(funcCall);
271
+ }), 'Delete the run');
272
+ deleteIcon.classList.add('cv-funccall-card-hover-icon');
273
+ const favoritedIcon = ui.iconFA('star', null, 'Unfavorite the run');
274
+ favoritedIcon.classList.add('fas', 'cv-funccall-card-def-icon');
275
+ const sharedIcon = ui.iconFA('share-alt', null, 'Add to shared');
276
+ sharedIcon.classList.add('fas', 'cv-funccall-card-def-icon');
277
+ sharedIcon.style.color = 'var(--blue-1)';
278
+ const dateStarted = new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' });
279
+ const card = ui.divH([
280
+ ui.divH([
281
+ icon,
348
282
  ui.divV([
349
- ui.divText((_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : 'Default title', 'title'),
350
- ...(funcCall.options['annotation']) ? [ui.divText(funcCall.options['annotation'], 'description')] : [],
351
- ui.divH([ui.render(funcCall.author), ui.span([new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' })], 'date')]),
283
+ cardLabel,
284
+ ui.span([dateStarted]),
285
+ ...(funcCall.options['description']) ? [ui.divText(funcCall.options['description'], 'description')] : [],
352
286
  ], 'cv-card-content'),
353
- ui.divH([
354
- shareIcon,
355
- ui.iconFA('pen', (ev) => __awaiter(this, void 0, void 0, function* () {
356
- ev.stopPropagation();
357
- this.showAddToFavoritesDialog(funcCall);
358
- }), 'Edit run metadata'),
359
- unstarIcon
360
- ], 'cv-funccall-card-icons')
361
- ], 'cv-funccall-card');
362
- card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
363
- this.onRunChosen.next(funcCall.id);
364
- card.classList.add('clicked');
365
- }));
366
- return card;
287
+ ]),
288
+ ui.divH([
289
+ editIcon, deleteIcon,
290
+ ...(funcCall.options['isFavorite']) ? [favoritedIcon] : [],
291
+ ...(funcCall.options['isShared']) ? [sharedIcon] : [],
292
+ ])
293
+ ], 'cv-funccall-card');
294
+ card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
295
+ this.onRunChosen.next(funcCall.id);
296
+ const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
297
+ allCards.forEach((c) => c.classList.remove('clicked'));
298
+ card.classList.add('clicked');
299
+ }));
300
+ ui.tooltip.bind(card, () => ui.tableFromMap(Object.assign(Object.assign({ Author: grok.shell.user.toMarkup(), Date: dateStarted }, (funcCall.options['title']) ? { 'Title': funcCall.options['title'] } : {}), (funcCall.options['description']) ? { 'Description': funcCall.options['description'] } : {})));
301
+ return card;
302
+ }
303
+ showEditDialog(funcCall) {
304
+ var _a, _b, _c, _d;
305
+ const dlg = ui.dialog({ title: 'Edit run' });
306
+ let title = (_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : '';
307
+ let description = (_b = funcCall.options['description']) !== null && _b !== void 0 ? _b : '';
308
+ const titleInput = ui.stringInput('Title', title, (s) => {
309
+ title = s;
310
+ if (s.length === 0) {
311
+ titleInput.setTooltip('Title cannot be empty');
312
+ setTimeout(() => titleInput.input.classList.add('d4-invalid'), 100);
313
+ dlg.getButton('OK').disabled = true;
314
+ }
315
+ else {
316
+ titleInput.setTooltip('');
317
+ setTimeout(() => titleInput.input.classList.remove('d4-invalid'), 100);
318
+ dlg.getButton('OK').disabled = false;
319
+ }
367
320
  });
368
- const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
369
- allCards.forEach((card) => card.addEventListener('click', () => allCards.forEach((c) => c.classList.remove('clicked'))));
321
+ let isShared = (_c = funcCall.options['isShared']) !== null && _c !== void 0 ? _c : false;
322
+ let isFavorite = (_d = funcCall.options['isFavorite']) !== null && _d !== void 0 ? _d : false;
323
+ dlg.add(ui.form([
324
+ titleInput,
325
+ ui.stringInput('Description', description, (s) => { description = s; }),
326
+ ui.boolInput('Favorites', isFavorite, (b) => isFavorite = b),
327
+ ui.boolInput('Share', isShared, (b) => isShared = b),
328
+ ]))
329
+ .onOK(() => __awaiter(this, void 0, void 0, function* () {
330
+ funcCall = yield historyUtils.loadRun(funcCall.id);
331
+ funcCall.options['title'] = title;
332
+ funcCall.options['description'] = description;
333
+ if (isShared === funcCall.options['isShared'] && isFavorite === funcCall.options['isFavorite']) {
334
+ yield historyUtils.saveRun(funcCall);
335
+ const editedRun = this.store.allRuns.value.find((call) => call.id === funcCall.id);
336
+ editedRun.options['title'] = funcCall.options['title'];
337
+ editedRun.options['description'] = funcCall.options['description'];
338
+ this.store.allRuns.next(this.store.allRuns.value);
339
+ return;
340
+ }
341
+ if (isShared && !funcCall.options['isShared']) {
342
+ funcCall.options['isShared'] = isShared;
343
+ ui.setUpdateIndicator(this.tabs.root, true);
344
+ yield this.addRunToShared(funcCall);
345
+ ui.setUpdateIndicator(this.tabs.root, false);
346
+ }
347
+ if (!isShared && funcCall.options['isShared']) {
348
+ funcCall.options['isShared'] = isShared;
349
+ ui.setUpdateIndicator(this.tabs.root, true);
350
+ yield this.removeRunFromShared(funcCall);
351
+ ui.setUpdateIndicator(this.tabs.root, false);
352
+ }
353
+ if (isFavorite && !funcCall.options['isFavorite']) {
354
+ funcCall.options['isFavorite'] = isFavorite;
355
+ ui.setUpdateIndicator(this.tabs.root, true);
356
+ yield this.addRunToFavorites(funcCall);
357
+ ui.setUpdateIndicator(this.tabs.root, false);
358
+ }
359
+ if (!isFavorite && funcCall.options['isFavorite']) {
360
+ funcCall.options['isFavorite'] = isFavorite;
361
+ ui.setUpdateIndicator(this.tabs.root, true);
362
+ yield this.removeRunFromFavorites(funcCall);
363
+ ui.setUpdateIndicator(this.tabs.root, false);
364
+ }
365
+ }))
366
+ .show({ center: true });
367
+ titleInput.fireChanged();
368
+ }
369
+ renderFavoriteCards(funcCalls) {
370
+ this.favoriteCards = funcCalls.map((funcCall) => this.renderCard(funcCall));
370
371
  return ui.divV(this.favoriteCards);
371
372
  }
372
373
  ;
373
374
  renderSharedCards(funcCalls) {
374
- this.sharedCards = funcCalls.map((funcCall) => {
375
- var _a;
376
- const unshareIcon = ui.iconFA('eye-slash', (ev) => __awaiter(this, void 0, void 0, function* () {
377
- ev.stopPropagation();
378
- this.beforeRunRemoveFromShared.next(funcCall.id);
379
- }), 'Hide from shared');
380
- const card = ui.divH([
381
- ui.divV([
382
- ui.divText((_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : 'Default title', 'title'),
383
- ...(funcCall.options['annotation']) ? [ui.divText(funcCall.options['annotation'], 'description')] : [],
384
- ui.divH([ui.render(funcCall.author), ui.span([new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' })], 'date')]),
385
- ], 'cv-card-content'),
386
- ui.divH([
387
- ui.iconFA('link', (ev) => __awaiter(this, void 0, void 0, function* () {
388
- ev.stopPropagation();
389
- yield navigator.clipboard.writeText(`${window.location.origin}${window.location.pathname}?id=${funcCall.id}`);
390
- }), 'Copy link to the run'),
391
- ...(funcCall.author.id === grok.shell.user.id) ? [
392
- ui.iconFA('pen', (ev) => __awaiter(this, void 0, void 0, function* () {
393
- ev.stopPropagation();
394
- this.showAddToSharedDialog(funcCall);
395
- }), 'Edit run metadata'),
396
- unshareIcon
397
- ] : [],
398
- ], 'cv-funccall-card-icons')
399
- ], 'cv-funccall-card');
400
- card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
401
- this.onRunChosen.next(funcCall.id);
402
- card.classList.add('clicked');
403
- }));
404
- return card;
405
- });
406
- const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
407
- allCards.forEach((card) => card.addEventListener('click', () => allCards.forEach((c) => c.classList.remove('clicked'))));
375
+ this.sharedCards = funcCalls.map((funcCall) => this.renderCard(funcCall));
408
376
  return ui.divV(this.sharedCards);
409
377
  }
410
378
  ;
411
379
  renderHistoryCards(funcCalls) {
412
- this.myCards = funcCalls.map((funcCall) => {
413
- const icon = funcCall.author.picture;
414
- icon.style.width = '25px';
415
- icon.style.height = '25px';
416
- icon.style.fontSize = '20px';
417
- icon.style.marginRight = '3px';
418
- icon.style.alignSelf = 'center';
419
- const userLabel = ui.label(funcCall.author.friendlyName, 'd4-link-label');
420
- ui.bind(funcCall.author, icon);
421
- const shareIcon = ui.iconFA('eye', (ev) => __awaiter(this, void 0, void 0, function* () {
422
- ev.stopPropagation();
423
- this.showAddToSharedDialog(funcCall);
424
- }), 'Add to shared');
425
- shareIcon.classList.add('fal');
426
- const unshareIcon = ui.iconFA('eye-slash', (ev) => __awaiter(this, void 0, void 0, function* () {
427
- ev.stopPropagation();
428
- this.beforeRunRemoveFromShared.next(funcCall.id);
429
- }), 'Hide from shared');
430
- const unstar = ui.iconFA('star', (ev) => __awaiter(this, void 0, void 0, function* () {
431
- ev.stopPropagation();
432
- this.beforeRunRemoveFromFavorites.next(funcCall.id);
433
- }), 'Unfavorite the run');
434
- unstar.classList.add('fas');
435
- const card = ui.divH([
436
- ui.divH([
437
- icon,
438
- ui.divV([
439
- userLabel,
440
- ui.span([new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' })])
441
- ], 'cv-card-content'),
442
- ]),
443
- ui.divH([
444
- ...(funcCall.options['isShared']) ? [unshareIcon] : [shareIcon],
445
- ...(funcCall.options['isFavorite']) ? [unstar] : [ui.iconFA('star', (ev) => __awaiter(this, void 0, void 0, function* () {
446
- ev.stopPropagation();
447
- this.showAddToFavoritesDialog(funcCall);
448
- }), 'Add to favorites')],
449
- ui.iconFA('trash-alt', (ev) => __awaiter(this, void 0, void 0, function* () {
450
- ev.stopPropagation();
451
- this.showDeleteRunDialog(funcCall);
452
- }), 'Delete the run'),
453
- ], 'cv-funccall-card-icons')
454
- ], 'cv-funccall-card');
455
- card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
456
- this.onRunChosen.next(funcCall.id);
457
- card.classList.add('clicked');
458
- }));
459
- return card;
460
- });
461
- const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
462
- allCards.forEach((card) => card.addEventListener('click', () => allCards.forEach((c) => c.classList.remove('clicked'))));
380
+ this.myCards = funcCalls.map((funcCall) => this.renderCard(funcCall));
463
381
  return ui.divV(this.myCards, { style: { height: '100%' } });
464
382
  }
465
383
  ;
384
+ addRunToFavorites(callToFavorite) {
385
+ return __awaiter(this, void 0, void 0, function* () {
386
+ callToFavorite.options['isFavorite'] = true;
387
+ this.beforeRunAddToFavorites.next(callToFavorite);
388
+ const savedFavorite = yield grok.dapi.functions.calls.allPackageVersions().save(callToFavorite);
389
+ this.afterRunAddToFavorites.next(savedFavorite);
390
+ return savedFavorite;
391
+ });
392
+ }
393
+ removeRunFromFavorites(callToUnfavorite) {
394
+ return __awaiter(this, void 0, void 0, function* () {
395
+ callToUnfavorite.options['title'] = null;
396
+ callToUnfavorite.options['description'] = null;
397
+ callToUnfavorite.options['isFavorite'] = false;
398
+ this.beforeRunRemoveFromFavorites.next(callToUnfavorite);
399
+ const favoriteSave = yield grok.dapi.functions.calls.allPackageVersions().save(callToUnfavorite);
400
+ this.afterRunRemoveFromFavorites.next(favoriteSave);
401
+ return favoriteSave;
402
+ });
403
+ }
404
+ addRunToShared(callToShare) {
405
+ return __awaiter(this, void 0, void 0, function* () {
406
+ callToShare.options['isShared'] = true;
407
+ this.beforeRunAddToShared.next(callToShare);
408
+ const allGroup = yield grok.dapi.groups.find(defaultGroupsIds['All users']);
409
+ const dfOutputs = wu(callToShare.outputParams.values())
410
+ .filter((output) => output.property.propertyType === DG.TYPE.DATA_FRAME);
411
+ for (const output of dfOutputs) {
412
+ const df = callToShare.outputs[output.name];
413
+ yield grok.dapi.permissions.grant(df.getTableInfo(), allGroup, false);
414
+ }
415
+ const dfInputs = wu(callToShare.inputParams.values())
416
+ .filter((input) => input.property.propertyType === DG.TYPE.DATA_FRAME);
417
+ for (const input of dfInputs) {
418
+ const df = callToShare.inputs[input.name];
419
+ yield grok.dapi.permissions.grant(df.getTableInfo(), allGroup, false);
420
+ }
421
+ const savedShared = yield grok.dapi.functions.calls.allPackageVersions().save(callToShare);
422
+ this.afterRunAddToShared.next(savedShared);
423
+ return savedShared;
424
+ });
425
+ }
426
+ removeRunFromShared(callToUnshare) {
427
+ return __awaiter(this, void 0, void 0, function* () {
428
+ callToUnshare.options['title'] = null;
429
+ callToUnshare.options['description'] = null;
430
+ callToUnshare.options['isShared'] = false;
431
+ this.beforeRunRemoveFromShared.next(callToUnshare);
432
+ const savedShared = yield grok.dapi.functions.calls.allPackageVersions().save(callToUnshare);
433
+ this.afterRunRemoveFromShared.next(savedShared);
434
+ return savedShared;
435
+ });
436
+ }
466
437
  get root() {
467
438
  return this._root;
468
439
  }
469
440
  }
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhpc3RvcnktcGFuZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sNkJBQTZCLENBQUM7QUFFckMsTUFBTSxPQUFPLFlBQVk7SUFtWXZCLFlBQ1UsSUFBYTtRQUFiLFNBQUksR0FBSixJQUFJLENBQVM7UUFuWXZCLCtEQUErRDtRQUN4RCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFM0MsOENBQThDO1FBQ3ZDLDRCQUF1QixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFFNUQsMkNBQTJDO1FBQ3BDLHlCQUFvQixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFFekQsa0RBQWtEO1FBQzNDLGlDQUE0QixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFNUQsK0NBQStDO1FBQ3hDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFekQsbUNBQW1DO1FBQzVCLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFaEQsOENBQThDO1FBQ3ZDLDJCQUFzQixHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFFM0QsMkNBQTJDO1FBQ3BDLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFl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QUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVmYXVsdFVzZXJzSWRzfSBmcm9tICcuLi9mdW5jdGlvbi12aWV3JztcbmltcG9ydCB7aGlzdG9yeVV0aWxzfSBmcm9tICcuLi9oaXN0b3J5LXV0aWxzJztcbmltcG9ydCAnLi4vLi4vY3NzL2hpc3RvcnktcGFuZWwuY3NzJztcblxuZXhwb3J0IGNsYXNzIEhpc3RvcnlQYW5lbCB7XG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBzaG91bGQgaXMgY2hvc2VuLiBDb250YWlucyBGdW5jQ2FsbCBJRFxuICBwdWJsaWMgb25SdW5DaG9zZW4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIGFkZGVkIHRvIGZhdm9yaXRlc1xuICBwdWJsaWMgYmVmb3JlUnVuQWRkVG9GYXZvcml0ZXMgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgYWRkZWQgdG8gc2hhcmVkXG4gIHB1YmxpYyBiZWZvcmVSdW5BZGRUb1NoYXJlZCA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyByZW1vdmVkIGZyb20gZmF2b3JpdGVzXG4gIHB1YmxpYyBiZWZvcmVSdW5SZW1vdmVGcm9tRmF2b3JpdGVzID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyByZW1vdmVkIGZyb20gc2hhcmVkXG4gIHB1YmxpYyBiZWZvcmVSdW5SZW1vdmVGcm9tU2hhcmVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBkZWxldGVkXG4gIHB1YmxpYyBiZWZvcmVSdW5EZWxldGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBhZGRlZCB0byBmYXZvcml0ZXNcbiAgcHVibGljIGFmdGVyUnVuQWRkVG9GYXZvcml0ZXMgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgYWRkZWQgdG8gc2hhcmVkXG4gIHB1YmxpYyBhZnRlclJ1bkFkZFRvU2hhcmVkID0gbmV3IFN1YmplY3Q8REcuRnVuY0NhbGw+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXNcbiAgcHVibGljIGFmdGVyUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcyA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgcmVtb3ZlZCBmcm9tIHNoYXJlZFxuICBwdWJsaWMgYWZ0ZXJSdW5SZW1vdmVGcm9tU2hhcmVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBkZWxldGVkXG4gIHB1YmxpYyBhZnRlclJ1bkRlbGV0ZWQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBzdG9yZSA9IHtcbiAgICBmaWx0ZXJpbmdPcHRpb25zOiB7dGV4dDogJyd9IGFzIHtcbiAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgIGF1dGhvcj86IERHLlVzZXIsXG4gICAgICBzdGFydGVkQWZ0ZXI/OiBkYXlqcy5EYXlqcyxcbiAgICB9LFxuICAgIGFsbFJ1bnM6IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsW10+KCksXG5cbiAgICBteVJ1bnM6IG5ldyBCZWhhdmlvclN1YmplY3Q8REcuRnVuY0NhbGxbXT4oW10pLFxuICAgIGZhdm9yaXRlUnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG4gICAgc2hhcmVkUnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG5cbiAgICBmaWx0ZXJlZE15UnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG4gICAgZmlsdGVyZWRGYXZvcml0ZVJ1bnM6IG5ldyBCZWhhdmlvclN1YmplY3Q8REcuRnVuY0NhbGxbXT4oW10pLFxuICAgIGZpbHRlcmVkU2hhcmVkUnVuczogbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSksXG4gIH07XG5cbiAgcHJpdmF0ZSBteVJ1bnNGaWx0ZXIgPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwcml2YXRlIGZhdlJ1bnNGaWx0ZXIgPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwcml2YXRlIHNoYXJlZFJ1bnNGaWx0ZXIgPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuXG4gIHB1YmxpYyBhbGxSdW5zRmV0Y2ggPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwdWJsaWMgbXlSdW5zRmV0Y2ggPSBuZXcgU3ViamVjdDx0cnVlPigpO1xuICBwdWJsaWMgZmF2UnVuc0ZldGNoID0gbmV3IFN1YmplY3Q8dHJ1ZT4oKTtcbiAgcHVibGljIHNoYXJlZFJ1bnNGZXRjaCA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG5cbiAgaGlzdG9yeVRhYiA9IHVpLmRpdigpO1xuICBmYXZUYWIgPSB1aS5kaXYoKTtcbiAgc2hhcmVkVGFiID0gdWkuZGl2KCk7XG4gIHRhYnMgPSB1aS50YWJDb250cm9sKHtcbiAgICAnSElTVE9SWSc6IHVpLmJveCh0aGlzLmhpc3RvcnlUYWIpLFxuICAgICdGQVZPUklURVMnOiB1aS5ib3godGhpcy5mYXZUYWIpLFxuICAgICdTSEFSRUQnOiB1aS5ib3godGhpcy5zaGFyZWRUYWIpLFxuICB9KTtcbiAgZmlsdGVyUGFuZSA9IHVpLmRpdigpO1xuXG4gIHByaXZhdGUgX3Jvb3QgPSB1aS5kaXZWKFtcbiAgICB1aS5wYW5lbChbXG4gICAgICB1aS5oMignSGlzdG9yeScpLFxuICAgICAgdGhpcy5maWx0ZXJQYW5lLFxuICAgIF0pLFxuICAgIHVpLmVsZW1lbnQoJ2RpdicsICdzcGxpdGJhci1ob3Jpem9udGFsJyksXG4gICAgdGhpcy50YWJzLnJvb3QsXG4gIF0sIHtzdHlsZToge3dpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfX0pO1xuXG4gIG15Q2FyZHMgPSBbXSBhcyBIVE1MRWxlbWVudFtdO1xuICBmYXZvcml0ZUNhcmRzID0gW10gYXMgSFRNTEVsZW1lbnRbXTtcbiAgc2hhcmVkQ2FyZHMgPSBbXSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gIHVwZGF0ZUZpbHRlclBhbmUoKSB7XG4gICAgY29uc3QgYnVpbGRGaWx0ZXJQYW5lID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHVpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUZXh0ID0gbmV3IFN1YmplY3QoKTtcblxuICAgICAgICBjb25zdCB0ZXh0SW5wdXQgPSB1aS5zdHJpbmdJbnB1dCgnU2VhcmNoJywgJycsICh2OiBzdHJpbmcpID0+IGZpbHRlcmluZ1RleHQubmV4dCh2KSk7XG4gICAgICAgIHRleHRJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIERHLmRlYm91bmNlKGZpbHRlcmluZ1RleHQuYXNPYnNlcnZhYmxlKCksIDYwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCA9IHRleHRJbnB1dC5zdHJpbmdWYWx1ZTtcbiAgICAgICAgICB0aGlzLmZhdlJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICAgIHRoaXMuc2hhcmVkUnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRhdGVJbnB1dCA9IHVpLmRhdGVJbnB1dCgnU3RhcnRlZCBhZnRlcicsIGRheWpzKCkuc3VidHJhY3QoMSwgJ3dlZWsnKSwgKHY6IGRheWpzLkRheWpzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA9IHY7XG4gICAgICAgICAgdGhpcy5teVJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICAgIHRoaXMuZmF2UnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFVzZXJzID0gT2JqZWN0LnZhbHVlcyhkZWZhdWx0VXNlcnNJZHMpO1xuICAgICAgICBjb25zdCBhbGxVc2VycyA9IGF3YWl0IGdyb2suZGFwaS51c2Vycy5saXN0KCkgYXMgREcuVXNlcltdO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFVzZXJzID0gYWxsVXNlcnMuZmlsdGVyKCh1c2VyKSA9PiAhZGVmYXVsdFVzZXJzLmluY2x1ZGVzKHVzZXIuaWQpKTtcblxuICAgICAgICBjb25zdCBhdXRob3JJbnB1dCA9IHVpLmNob2ljZUlucHV0PERHLlVzZXIgfCBzdHJpbmc+KCdBdXRob3InLCAnQW55b25lJywgWydBbnlvbmUnLCAuLi5maWx0ZXJlZFVzZXJzXSwgKHY6IERHLlVzZXIgfCBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuYXV0aG9yID0gKHYgPT09ICdBbnlvbmUnKSA/IHVuZGVmaW5lZCA6IHYgYXMgREcuVXNlcjtcbiAgICAgICAgICB0aGlzLnNoYXJlZFJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGRhdGVJbnB1dC5hZGRQYXR0ZXJuTWVudSgnZGF0ZXRpbWUnKTtcbiAgICAgICAgY29uc3QgZm9ybSA9IHVpLmRpdlYoW1xuICAgICAgICAgIHRleHRJbnB1dCxcbiAgICAgICAgICBkYXRlSW5wdXQsXG4gICAgICAgICAgYXV0aG9ySW5wdXQsXG4gICAgICAgIF0sICd1aS1mb3JtIHVpLWZvcm0td2lkZSB1aS1mb3JtLWxlZnQnKTtcbiAgICAgICAgZm9ybS5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG5cbiAgICAgICAgdGhpcy50YWJzLm9uVGFiQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJOYW1lID0gdGhpcy50YWJzLmN1cnJlbnRQYW5lLm5hbWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRUYWJOYW1lID09PSAnSElTVE9SWScpIHtcbiAgICAgICAgICAgIHRleHRJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBkYXRlSW5wdXQucm9vdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFRhYk5hbWUgPT09ICdGQVZPUklURVMnKSB7XG4gICAgICAgICAgICB0ZXh0SW5wdXQucm9vdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgICAgICAgZGF0ZUlucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgICAgIGF1dGhvcklucHV0LnJvb3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRUYWJOYW1lID09PSAnU0hBUkVEJykge1xuICAgICAgICAgICAgdGV4dElucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgICAgIGRhdGVJbnB1dC5yb290LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgICAgICAgICBhdXRob3JJbnB1dC5yb290LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBuZXdGaWx0ZXJQYW5lID0gYnVpbGRGaWx0ZXJQYW5lKCk7XG4gICAgdGhpcy5maWx0ZXJQYW5lLnJlcGxhY2VXaXRoKG5ld0ZpbHRlclBhbmUpO1xuICAgIHRoaXMuZmlsdGVyUGFuZSA9IG5ld0ZpbHRlclBhbmU7XG4gIH07XG5cbiAgc2hvd0FkZFRvRmF2b3JpdGVzRGlhbG9nKGZ1bmNDYWxsOiBERy5GdW5jQ2FsbCkge1xuICAgIGxldCB0aXRsZSA9IGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPz8gJyc7XG4gICAgbGV0IGFubm90YXRpb24gPSBmdW5jQ2FsbC5vcHRpb25zWydhbm5vdGF0aW9uJ10gPz8gJyc7XG4gICAgY29uc3QgdGl0bGVJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCdUaXRsZScsIHRpdGxlLCAoczogc3RyaW5nKSA9PiB7XG4gICAgICB0aXRsZSA9IHM7XG4gICAgICBpZiAocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGl0bGVJbnB1dC5zZXRUb29sdGlwKCdUaXRsZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aXRsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5hZGQoJ2Q0LWludmFsaWQnKSwgMTAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpdGxlSW5wdXQuc2V0VG9vbHRpcCgnJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGl0bGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdkNC1pbnZhbGlkJyksIDEwMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB1aS5kaWFsb2coe3RpdGxlOiAnQWRkIHRvIGZhdm9yaXRlcyd9KVxuICAgICAgLmFkZCh1aS5mb3JtKFtcbiAgICAgICAgdGl0bGVJbnB1dCxcbiAgICAgICAgdWkuc3RyaW5nSW5wdXQoJ0Fubm90YXRpb24nLCBhbm5vdGF0aW9uLCAoczogc3RyaW5nKSA9PiB7IGFubm90YXRpb24gPSBzOyB9KSxcbiAgICAgIF0pKVxuICAgICAgLm9uT0soYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGl0bGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZ1bmNDYWxsID0gYXdhaXQgaGlzdG9yeVV0aWxzLmxvYWRSdW4oZnVuY0NhbGwuaWQsIHRydWUpO1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPSB0aXRsZTtcbiAgICAgICAgICBmdW5jQ2FsbC5vcHRpb25zWydhbm5vdGF0aW9uJ10gPSBhbm5vdGF0aW9uO1xuICAgICAgICAgIHRoaXMuYmVmb3JlUnVuQWRkVG9GYXZvcml0ZXMubmV4dChmdW5jQ2FsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdUaXRsZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5zaG93KHtjZW50ZXI6IHRydWV9KTtcbiAgfTtcblxuICBzaG93RGVsZXRlUnVuRGlhbG9nKGZ1bmNDYWxsOiBERy5GdW5jQ2FsbCkge1xuICAgIHVpLmRpYWxvZyh7dGl0bGU6ICdEZWxldGUgcnVuJ30pXG4gICAgICAuYWRkKHVpLmRpdlRleHQoJ1RoZSBkZWxldGVkIHJ1biBpcyBpbXBvc3NpYmxlIHRvIHJlc3RvcmUuIEFyZSB5b3Ugc3VyZT8nKSlcbiAgICAgIC5vbk9LKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5iZWZvcmVSdW5EZWxldGVkLm5leHQoZnVuY0NhbGwuaWQpO1xuICAgICAgfSlcbiAgICAgIC5zaG93KHtjZW50ZXI6IHRydWV9KTtcbiAgfTtcblxuICBzaG93QWRkVG9TaGFyZWREaWFsb2coZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgbGV0IHRpdGxlID0gZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA/PyAnJztcbiAgICBsZXQgYW5ub3RhdGlvbiA9IGZ1bmNDYWxsLm9wdGlvbnNbJ2Fubm90YXRpb24nXSA/PyAnJztcbiAgICBjb25zdCB0aXRsZUlucHV0ID0gdWkuc3RyaW5nSW5wdXQoJ1RpdGxlJywgdGl0bGUsIChzOiBzdHJpbmcpID0+IHtcbiAgICAgIHRpdGxlID0gcztcbiAgICAgIGlmIChzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aXRsZUlucHV0LnNldFRvb2x0aXAoJ1RpdGxlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRpdGxlSW5wdXQuaW5wdXQuY2xhc3NMaXN0LmFkZCgnZDQtaW52YWxpZCcpLCAxMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVJbnB1dC5zZXRUb29sdGlwKCcnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aXRsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ2Q0LWludmFsaWQnKSwgMTAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHVpLmRpYWxvZyh7dGl0bGU6ICdBZGQgdG8gc2hhcmVkJ30pXG4gICAgICAuYWRkKHVpLmZvcm0oW1xuICAgICAgICB0aXRsZUlucHV0LFxuICAgICAgICB1aS5zdHJpbmdJbnB1dCgnQW5ub3RhdGlvbicsIGFubm90YXRpb24sIChzOiBzdHJpbmcpID0+IHsgYW5ub3RhdGlvbiA9IHM7IH0pLFxuICAgICAgXSkpXG4gICAgICAub25PSyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aXRsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZnVuY0NhbGwgPSBhd2FpdCBoaXN0b3J5VXRpbHMubG9hZFJ1bihmdW5jQ2FsbC5pZCk7XG4gICAgICAgICAgZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA9IHRpdGxlO1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2Fubm90YXRpb24nXSA9IGFubm90YXRpb247XG4gICAgICAgICAgdGhpcy5iZWZvcmVSdW5BZGRUb1NoYXJlZC5uZXh0KGZ1bmNDYWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ1RpdGxlIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnNob3coe2NlbnRlcjogdHJ1ZX0pO1xuICB9O1xuXG4gIHVwZGF0ZVNoYXJlZFBhbmUoc2hhcmVkUnVuczogREcuRnVuY0NhbGxbXSkge1xuICAgIGNvbnN0IG5ld1RhYiA9IChzaGFyZWRSdW5zLmxlbmd0aCA+IDApID8gdGhpcy5yZW5kZXJTaGFyZWRDYXJkcyhzaGFyZWRSdW5zKSA6IHVpLmRpdlRleHQoJ05vIHJ1bnMgYXJlIG1hcmtlZCBhcyBzaGFyZWQnLCAnbm8tZWxlbWVudHMtbGFiZWwnKTtcbiAgICB0aGlzLnNoYXJlZFRhYi5yZXBsYWNlV2l0aChuZXdUYWIpO1xuICAgIHRoaXMuc2hhcmVkVGFiID0gbmV3VGFiO1xuICB9O1xuXG4gIHVwZGF0ZUZhdm9yaXRlc1BhbmUoZmF2b3JpdGVSdW5zOiBERy5GdW5jQ2FsbFtdKSB7XG4gICAgY29uc3QgbmV3VGFiID0gKGZhdm9yaXRlUnVucy5sZW5ndGggPiAwKSA/IHRoaXMucmVuZGVyRmF2b3JpdGVDYXJkcyhmYXZvcml0ZVJ1bnMpIDogdWkuZGl2VGV4dCgnTm8gcnVucyBhcmUgbWFya2VkIGFzIGZhdm9yaXRlcycsICduby1lbGVtZW50cy1sYWJlbCcpO1xuICAgIHRoaXMuZmF2VGFiLnJlcGxhY2VXaXRoKG5ld1RhYik7XG4gICAgdGhpcy5mYXZUYWIgPSBuZXdUYWI7XG4gIH07XG5cbiAgdXBkYXRlTXlQYW5lKG15UnVuczogREcuRnVuY0NhbGxbXSkge1xuICAgIGNvbnN0IG5ld1RhYiA9IChteVJ1bnMubGVuZ3RoID4gMCkgPyB0aGlzLnJlbmRlckhpc3RvcnlDYXJkcyhteVJ1bnMpIDogdWkuZGl2VGV4dCgnTm8gcnVucyBhcmUgZm91bmQgaW4gaGlzdG9yeScsICduby1lbGVtZW50cy1sYWJlbCcpO1xuICAgIHRoaXMuaGlzdG9yeVRhYi5yZXBsYWNlV2l0aChuZXdUYWIpO1xuICAgIHRoaXMuaGlzdG9yeVRhYiA9IG5ld1RhYjtcbiAgfTtcblxuICByZW5kZXJGYXZvcml0ZUNhcmRzKGZ1bmNDYWxsczogREcuRnVuY0NhbGxbXSkge1xuICAgIHRoaXMuZmF2b3JpdGVDYXJkcyA9IGZ1bmNDYWxscy5tYXAoKGZ1bmNDYWxsKSA9PiB7XG4gICAgICBjb25zdCB1bnN0YXJJY29uID0gdWkuaWNvbkZBKCdzdGFyJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmJlZm9yZVJ1blJlbW92ZUZyb21GYXZvcml0ZXMubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICB9LCAnVW5mYXZvcml0ZSB0aGUgcnVuJyk7XG4gICAgICB1bnN0YXJJY29uLmNsYXNzTGlzdC5hZGQoJ2ZhcycpO1xuXG4gICAgICBjb25zdCBzaGFyZUljb24gPSB1aS5pY29uRkEoJ2V5ZScsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zaG93QWRkVG9TaGFyZWREaWFsb2coZnVuY0NhbGwpO1xuICAgICAgfSwgJ0FkZCB0byBzaGFyZWQnKTtcbiAgICAgIHNoYXJlSWNvbi5jbGFzc0xpc3QuYWRkKCdmYWwnKTtcblxuICAgICAgY29uc3QgY2FyZCA9IHVpLmRpdkgoW1xuICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICB1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPz8gJ0RlZmF1bHQgdGl0bGUnLCAndGl0bGUnKSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snYW5ub3RhdGlvbiddKSA/IFt1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ2Fubm90YXRpb24nXSwgJ2Rlc2NyaXB0aW9uJyldOiBbXSxcbiAgICAgICAgICB1aS5kaXZIKFt1aS5yZW5kZXIoZnVuY0NhbGwuYXV0aG9yKSwgdWkuc3BhbihbbmV3IERhdGUoZnVuY0NhbGwuc3RhcnRlZC50b1N0cmluZygpKS50b0xvY2FsZVN0cmluZygnZW4tdXMnLCB7bW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJ251bWVyaWMnfSldLCAnZGF0ZScpXSksXG4gICAgICAgIF0sICdjdi1jYXJkLWNvbnRlbnQnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgc2hhcmVJY29uLFxuICAgICAgICAgIHVpLmljb25GQSgncGVuJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0FkZFRvRmF2b3JpdGVzRGlhbG9nKGZ1bmNDYWxsKTtcbiAgICAgICAgICB9LCAnRWRpdCBydW4gbWV0YWRhdGEnKSxcbiAgICAgICAgICB1bnN0YXJJY29uXG4gICAgICAgIF0sICdjdi1mdW5jY2FsbC1jYXJkLWljb25zJylcbiAgICAgIF0sICdjdi1mdW5jY2FsbC1jYXJkJyk7XG5cbiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMub25SdW5DaG9zZW4ubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FyZDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFsbENhcmRzID0gWy4uLnRoaXMubXlDYXJkcywgLi4udGhpcy5mYXZvcml0ZUNhcmRzLCAuLi50aGlzLnNoYXJlZENhcmRzXTtcbiAgICBhbGxDYXJkcy5mb3JFYWNoKChjYXJkKSA9PiBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYWxsQ2FyZHMuZm9yRWFjaCgoYykgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2VkJykpKSk7XG5cbiAgICByZXR1cm4gdWkuZGl2Vih0aGlzLmZhdm9yaXRlQ2FyZHMpO1xuICB9O1xuXG4gIHJlbmRlclNoYXJlZENhcmRzKGZ1bmNDYWxsczogREcuRnVuY0NhbGxbXSkge1xuICAgIHRoaXMuc2hhcmVkQ2FyZHMgPSBmdW5jQ2FsbHMubWFwKChmdW5jQ2FsbCkgPT4ge1xuICAgICAgY29uc3QgdW5zaGFyZUljb24gPSB1aS5pY29uRkEoJ2V5ZS1zbGFzaCcsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5iZWZvcmVSdW5SZW1vdmVGcm9tU2hhcmVkLm5leHQoZnVuY0NhbGwuaWQpO1xuICAgICAgfSwgJ0hpZGUgZnJvbSBzaGFyZWQnKTtcblxuICAgICAgY29uc3QgY2FyZCA9IHVpLmRpdkgoW1xuICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICB1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPz8gJ0RlZmF1bHQgdGl0bGUnLCAndGl0bGUnKSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snYW5ub3RhdGlvbiddKSA/IFt1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ2Fubm90YXRpb24nXSwgJ2Rlc2NyaXB0aW9uJyldOiBbXSxcbiAgICAgICAgICB1aS5kaXZIKFt1aS5yZW5kZXIoZnVuY0NhbGwuYXV0aG9yKSwgdWkuc3BhbihbbmV3IERhdGUoZnVuY0NhbGwuc3RhcnRlZC50b1N0cmluZygpKS50b0xvY2FsZVN0cmluZygnZW4tdXMnLCB7bW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJ251bWVyaWMnfSldLCAnZGF0ZScpXSksXG4gICAgICAgIF0sICdjdi1jYXJkLWNvbnRlbnQnKSxcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgdWkuaWNvbkZBKCdsaW5rJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59JHt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9P2lkPSR7ZnVuY0NhbGwuaWR9YCk7XG4gICAgICAgICAgfSwgJ0NvcHkgbGluayB0byB0aGUgcnVuJyksXG4gICAgICAgICAgLi4uKGZ1bmNDYWxsLmF1dGhvci5pZCA9PT0gZ3Jvay5zaGVsbC51c2VyLmlkKSA/IFtcbiAgICAgICAgICAgIHVpLmljb25GQSgncGVuJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICB0aGlzLnNob3dBZGRUb1NoYXJlZERpYWxvZyhmdW5jQ2FsbCk7XG4gICAgICAgICAgICB9LCAnRWRpdCBydW4gbWV0YWRhdGEnKSxcbiAgICAgICAgICAgIHVuc2hhcmVJY29uXTogW10sXG4gICAgICAgIF0sICdjdi1mdW5jY2FsbC1jYXJkLWljb25zJylcbiAgICAgIF0sICdjdi1mdW5jY2FsbC1jYXJkJyk7XG5cbiAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMub25SdW5DaG9zZW4ubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FyZDtcbiAgICB9KTtcblxuXG4gICAgY29uc3QgYWxsQ2FyZHMgPSBbLi4udGhpcy5teUNhcmRzLCAuLi50aGlzLmZhdm9yaXRlQ2FyZHMsIC4uLnRoaXMuc2hhcmVkQ2FyZHNdO1xuICAgIGFsbENhcmRzLmZvckVhY2goKGNhcmQpID0+IGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBhbGxDYXJkcy5mb3JFYWNoKChjKSA9PiBjLmNsYXNzTGlzdC5yZW1vdmUoJ2NsaWNrZWQnKSkpKTtcblxuICAgIHJldHVybiB1aS5kaXZWKHRoaXMuc2hhcmVkQ2FyZHMpO1xuICB9O1xuXG4gIHJlbmRlckhpc3RvcnlDYXJkcyhmdW5jQ2FsbHM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICB0aGlzLm15Q2FyZHMgPSBmdW5jQ2FsbHMubWFwKChmdW5jQ2FsbCkgPT4ge1xuICAgICAgY29uc3QgaWNvbiA9IGZ1bmNDYWxsLmF1dGhvci5waWN0dXJlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWNvbi5zdHlsZS53aWR0aCA9ICcyNXB4JztcbiAgICAgIGljb24uc3R5bGUuaGVpZ2h0ID0gJzI1cHgnO1xuICAgICAgaWNvbi5zdHlsZS5mb250U2l6ZSA9ICcyMHB4JztcbiAgICAgIGljb24uc3R5bGUubWFyZ2luUmlnaHQgPSAnM3B4JztcbiAgICAgIGljb24uc3R5bGUuYWxpZ25TZWxmID0gJ2NlbnRlcic7XG4gICAgICBjb25zdCB1c2VyTGFiZWwgPSB1aS5sYWJlbChmdW5jQ2FsbC5hdXRob3IuZnJpZW5kbHlOYW1lLCAnZDQtbGluay1sYWJlbCcpO1xuICAgICAgdWkuYmluZChmdW5jQ2FsbC5hdXRob3IsIGljb24pO1xuXG4gICAgICBjb25zdCBzaGFyZUljb24gPSB1aS5pY29uRkEoJ2V5ZScsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zaG93QWRkVG9TaGFyZWREaWFsb2coZnVuY0NhbGwpO1xuICAgICAgfSwgJ0FkZCB0byBzaGFyZWQnKTtcbiAgICAgIHNoYXJlSWNvbi5jbGFzc0xpc3QuYWRkKCdmYWwnKTtcblxuICAgICAgY29uc3QgdW5zaGFyZUljb24gPSB1aS5pY29uRkEoJ2V5ZS1zbGFzaCcsIGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5iZWZvcmVSdW5SZW1vdmVGcm9tU2hhcmVkLm5leHQoZnVuY0NhbGwuaWQpO1xuICAgICAgfSwgJ0hpZGUgZnJvbSBzaGFyZWQnKTtcblxuICAgICAgY29uc3QgdW5zdGFyID0gdWkuaWNvbkZBKCdzdGFyJywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmJlZm9yZVJ1blJlbW92ZUZyb21GYXZvcml0ZXMubmV4dChmdW5jQ2FsbC5pZCk7XG4gICAgICB9LCAnVW5mYXZvcml0ZSB0aGUgcnVuJyk7XG4gICAgICB1bnN0YXIuY2xhc3NMaXN0LmFkZCgnZmFzJyk7XG5cbiAgICAgIGNvbnN0IGNhcmQgPSB1aS5kaXZIKFtcbiAgICAgICAgdWkuZGl2SChbXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICB1aS5kaXZWKFtcbiAgICAgICAgICAgIHVzZXJMYWJlbCxcbiAgICAgICAgICAgIHVpLnNwYW4oW25ldyBEYXRlKGZ1bmNDYWxsLnN0YXJ0ZWQudG9TdHJpbmcoKSkudG9Mb2NhbGVTdHJpbmcoJ2VuLXVzJywge21vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICdudW1lcmljJ30pXSlcbiAgICAgICAgICBdLCAnY3YtY2FyZC1jb250ZW50JyksXG4gICAgICAgIF0pLFxuICAgICAgICB1aS5kaXZIKFtcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSkgPyBbdW5zaGFyZUljb25dOiBbc2hhcmVJY29uXSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSA/IFt1bnN0YXJdIDogW3VpLmljb25GQSgnc3RhcicsIGFzeW5jIChldikgPT4ge1xuICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnNob3dBZGRUb0Zhdm9yaXRlc0RpYWxvZyhmdW5jQ2FsbCk7XG4gICAgICAgICAgfSwgJ0FkZCB0byBmYXZvcml0ZXMnKV0sXG4gICAgICAgICAgdWkuaWNvbkZBKCd0cmFzaC1hbHQnLCBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5zaG93RGVsZXRlUnVuRGlhbG9nKGZ1bmNDYWxsKTtcbiAgICAgICAgICB9LCAnRGVsZXRlIHRoZSBydW4nKSxcbiAgICAgICAgXSwgJ2N2LWZ1bmNjYWxsLWNhcmQtaWNvbnMnKVxuICAgICAgXSwgJ2N2LWZ1bmNjYWxsLWNhcmQnKTtcblxuICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5vblJ1bkNob3Nlbi5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdjbGlja2VkJyk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNhcmQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxDYXJkcyA9IFsuLi50aGlzLm15Q2FyZHMsIC4uLnRoaXMuZmF2b3JpdGVDYXJkcywgLi4udGhpcy5zaGFyZWRDYXJkc107XG4gICAgYWxsQ2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4gY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGFsbENhcmRzLmZvckVhY2goKGMpID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpKSkpO1xuXG4gICAgcmV0dXJuIHVpLmRpdlYodGhpcy5teUNhcmRzLCB7c3R5bGU6IHtoZWlnaHQ6ICcxMDAlJ319KTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZ1bmM6IERHLkZ1bmNcbiAgKSB7XG4gICAgdGhpcy50YWJzLnJvb3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy50YWJzLnJvb3Quc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuXG4gICAgdGhpcy5zdG9yZS5teVJ1bnMuc3Vic2NyaWJlKChteVJ1bnMpID0+IHRoaXMuc3RvcmUuZmlsdGVyZWRNeVJ1bnMubmV4dChteVJ1bnMpKTtcbiAgICB0aGlzLnN0b3JlLmZhdm9yaXRlUnVucy5zdWJzY3JpYmUoKGZhdm9yaXRlUnVucykgPT4gdGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucy5uZXh0KGZhdm9yaXRlUnVucykpO1xuICAgIHRoaXMuc3RvcmUuc2hhcmVkUnVucy5zdWJzY3JpYmUoKHNoYXJlZFJ1bnMpID0+IHRoaXMuc3RvcmUuZmlsdGVyZWRTaGFyZWRSdW5zLm5leHQoc2hhcmVkUnVucykpO1xuXG4gICAgdGhpcy5zdG9yZS5maWx0ZXJlZE15UnVucy5zdWJzY3JpYmUoKG15UnVucykgPT4gdGhpcy51cGRhdGVNeVBhbmUobXlSdW5zKSk7XG4gICAgdGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucy5zdWJzY3JpYmUoKG5ld0Zhdm9yaXRlUnVucykgPT4gdGhpcy51cGRhdGVGYXZvcml0ZXNQYW5lKG5ld0Zhdm9yaXRlUnVucykpO1xuICAgIHRoaXMuc3RvcmUuZmlsdGVyZWRTaGFyZWRSdW5zLnN1YnNjcmliZSgoc2hhcmVkUnVucykgPT4gdGhpcy51cGRhdGVTaGFyZWRQYW5lKHNoYXJlZFJ1bnMpKTtcblxuICAgIHRoaXMubXlSdW5zRmlsdGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJlZE15UnVucyA9IHRoaXMuc3RvcmUubXlSdW5zLnZhbHVlLmZpbHRlcigodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ZWRBZnRlciA9ICh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyID8gdmFsLnN0YXJ0ZWQgPiB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyIDogdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHN0YXJ0ZWRBZnRlcjtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9yZS5maWx0ZXJlZE15UnVucy5uZXh0KGZpbHRlcmVkTXlSdW5zKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmF2UnVuc0ZpbHRlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRGYXZSdW5zID0gdGhpcy5zdG9yZS5mYXZvcml0ZVJ1bnMudmFsdWUuZmlsdGVyKCh2YWwpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRlZEFmdGVyID0gKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgPyB2YWwuc3RhcnRlZCA+IHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgOiB0cnVlKTtcbiAgICAgICAgY29uc3QgdGl0bGVDb250YWluc1RleHQgPSAodGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnRleHQubGVuZ3RoICYmICEhdmFsLm9wdGlvbnNbJ3RpdGxlJ10pID8gdmFsLm9wdGlvbnNbJ3RpdGxlJ10uaW5jbHVkZXModGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiB0cnVlO1xuICAgICAgICBjb25zdCBkZXNjQ29udGFpbnNUZXh0ID0gKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCAmJiAhIXZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddKSA/IHZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTogdHJ1ZTtcblxuICAgICAgICByZXR1cm4gKHRpdGxlQ29udGFpbnNUZXh0IHx8IGRlc2NDb250YWluc1RleHQpICYmIHN0YXJ0ZWRBZnRlcjtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucy5uZXh0KGZpbHRlcmVkRmF2UnVucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNoYXJlZFJ1bnNGaWx0ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkU2hhcmVkUnVucyA9IHRoaXMuc3RvcmUuc2hhcmVkUnVucy52YWx1ZS5maWx0ZXIoKHZhbCkgPT4ge1xuICAgICAgICBjb25zdCBpc0F1dGhvcmVkID0gdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLmF1dGhvciA/IHZhbC5hdXRob3IuaWQgPT09IHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy5hdXRob3IuaWQ6IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0ZWRBZnRlciA9ICh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyID8gdmFsLnN0YXJ0ZWQgPiB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyIDogdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRpdGxlQ29udGFpbnNUZXh0ID0gKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCAmJiAhIXZhbC5vcHRpb25zWyd0aXRsZSddKSA/IHZhbC5vcHRpb25zWyd0aXRsZSddLmluY2x1ZGVzKHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTogdHJ1ZTtcbiAgICAgICAgY29uc3QgZGVzY0NvbnRhaW5zVGV4dCA9ICh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dC5sZW5ndGggJiYgISF2YWwub3B0aW9uc1snZGVzY3JpcHRpb24nXSkgPyB2YWwub3B0aW9uc1snZGVzY3JpcHRpb24nXS5pbmNsdWRlcyh0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCk6IHRydWU7XG5cbiAgICAgICAgcmV0dXJuICh0aXRsZUNvbnRhaW5zVGV4dCB8fCBkZXNjQ29udGFpbnNUZXh0KSAmJiBzdGFydGVkQWZ0ZXIgJiYgaXNBdXRob3JlZDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdG9yZS5maWx0ZXJlZFNoYXJlZFJ1bnMubmV4dChmaWx0ZXJlZFNoYXJlZFJ1bnMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdG9yZS5hbGxSdW5zLnN1YnNjcmliZSgoYWxsUnVucykgPT4ge1xuICAgICAgdGhpcy5zdG9yZS5teVJ1bnMubmV4dChhbGxSdW5zLmZpbHRlcigocnVuKSA9PiBydW4uYXV0aG9yLmlkID09PSBncm9rLnNoZWxsLnVzZXIuaWQpKTtcbiAgICAgIHRoaXMuc3RvcmUuZmF2b3JpdGVSdW5zLm5leHQoYWxsUnVucy5maWx0ZXIoKHJ1bikgPT4gcnVuLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSAmJiAhcnVuLm9wdGlvbnNbJ2lzSW1wb3J0ZWQnXSkpO1xuICAgICAgdGhpcy5zdG9yZS5zaGFyZWRSdW5zLm5leHQoYWxsUnVucy5maWx0ZXIoKHJ1bikgPT4gcnVuLm9wdGlvbnNbJ2lzU2hhcmVkJ10pKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWxsUnVuc0ZldGNoLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxSdW5zID0gKGF3YWl0IGhpc3RvcnlVdGlscy5wdWxsUnVuc0J5TmFtZSh0aGlzLmZ1bmMubmFtZSwgW10sIHtvcmRlcjogJ3N0YXJ0ZWQnfSwgWydzZXNzaW9uLnVzZXInLCAnb3B0aW9ucyddKSkucmV2ZXJzZSgpO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQoYWxsUnVucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm15UnVuc0ZldGNoLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIHRydWUpO1xuICAgICAgY29uc3QgbXlSdW5zID0gKGF3YWl0IGhpc3RvcnlVdGlscy5wdWxsUnVuc0J5TmFtZSh0aGlzLmZ1bmMubmFtZSwgW3thdXRob3I6IGdyb2suc2hlbGwudXNlcn1dLCB7b3JkZXI6ICdzdGFydGVkJ30sIFsnc2Vzc2lvbi51c2VyJywgJ29wdGlvbnMnXSkpLnJldmVyc2UoKTtcbiAgICAgIHRoaXMuc3RvcmUubXlSdW5zLm5leHQobXlSdW5zKTtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mYXZSdW5zRmV0Y2guc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgdHJ1ZSk7XG4gICAgICBjb25zdCBteVJ1bnMgPSAoYXdhaXQgaGlzdG9yeVV0aWxzLnB1bGxSdW5zQnlOYW1lKHRoaXMuZnVuYy5uYW1lLCBbe2F1dGhvcjogZ3Jvay5zaGVsbC51c2VyfV0sIHtvcmRlcjogJ3N0YXJ0ZWQnfSwgWydzZXNzaW9uLnVzZXInLCAnb3B0aW9ucyddKSkucmV2ZXJzZSgpO1xuICAgICAgdGhpcy5zdG9yZS5mYXZvcml0ZVJ1bnMubmV4dChteVJ1bnMuZmlsdGVyKChydW4pID0+IHJ1bi5vcHRpb25zWydpc0Zhdm9yaXRlJ10gJiYgIXJ1bi5vcHRpb25zWydpc0ltcG9ydGVkJ10pKTtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zaGFyZWRSdW5zRmV0Y2guc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZFJ1bnMgPSAoYXdhaXQgaGlzdG9yeVV0aWxzLnB1bGxSdW5zQnlOYW1lKHRoaXMuZnVuYy5uYW1lLCBbXSwge29yZGVyOiAnc3RhcnRlZCd9LCBbJ3Nlc3Npb24udXNlcicsICdvcHRpb25zJ10pKS5yZXZlcnNlKCk7XG4gICAgICB0aGlzLnN0b3JlLnNoYXJlZFJ1bnMubmV4dChzaGFyZWRSdW5zLmZpbHRlcigocnVuKSA9PiBydW4ub3B0aW9uc1snaXNTaGFyZWQnXSkpO1xuICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCBmYWxzZSk7XG4gICAgfSk7XG5cblxuICAgIHRoaXMuYWZ0ZXJSdW5BZGRUb0Zhdm9yaXRlcy5zdWJzY3JpYmUoKGFkZGVkKSA9PiB7XG4gICAgICBjb25zdCBlZGl0ZWRSdW4gPSB0aGlzLnN0b3JlLm15UnVucy52YWx1ZS5maW5kKChjYWxsKSA9PiBjYWxsLmlkID09PSBhZGRlZC5pZCk7XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSA9IHRydWU7XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ3RpdGxlJ10gPSBhZGRlZC5vcHRpb25zWyd0aXRsZSddO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWydkZXNjcmlwdGlvbiddID0gYWRkZWQub3B0aW9uc1snZGVzY3JpcHRpb24nXTtcbiAgICAgIHRoaXMuc3RvcmUubXlSdW5zLm5leHQodGhpcy5zdG9yZS5teVJ1bnMudmFsdWUpO1xuXG4gICAgICB0aGlzLnN0b3JlLmZhdm9yaXRlUnVucy5uZXh0KFsuLi50aGlzLnN0b3JlLmZhdm9yaXRlUnVucy52YWx1ZSwgZWRpdGVkUnVuIV0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZnRlclJ1bkFkZFRvU2hhcmVkLnN1YnNjcmliZSgoYWRkZWQpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRlZFJ1biA9IHRoaXMuc3RvcmUubXlSdW5zLnZhbHVlLmZpbmQoKGNhbGwpID0+IGNhbGwuaWQgPT09IGFkZGVkLmlkKTtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1snaXNTaGFyZWQnXSA9IHRydWU7XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ3RpdGxlJ10gPSBhZGRlZC5vcHRpb25zWyd0aXRsZSddO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWydkZXNjcmlwdGlvbiddID0gYWRkZWQub3B0aW9uc1snZGVzY3JpcHRpb24nXTtcbiAgICAgIHRoaXMuc3RvcmUubXlSdW5zLm5leHQodGhpcy5zdG9yZS5teVJ1bnMudmFsdWUpO1xuXG4gICAgICB0aGlzLnN0b3JlLnNoYXJlZFJ1bnMubmV4dChbLi4udGhpcy5zdG9yZS5zaGFyZWRSdW5zLnZhbHVlLCBlZGl0ZWRSdW4hXSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcy5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLmZhdm9yaXRlUnVucy5uZXh0KHRoaXMuc3RvcmUuZmF2b3JpdGVSdW5zLnZhbHVlLmZpbHRlcigoY2FsbCkgPT4gY2FsbC5pZCAhPT0gaWQpKTtcblxuICAgICAgY29uc3QgZWRpdGVkUnVuID0gdGhpcy5zdG9yZS5teVJ1bnMudmFsdWUuZmluZCgoY2FsbCkgPT4gY2FsbC5pZCA9PT0gaWQpO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWyd0aXRsZSddID0gbnVsbDtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1snZGVzY3JpcHRpb24nXSA9IG51bGw7XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdG9yZS5teVJ1bnMubmV4dCh0aGlzLnN0b3JlLm15UnVucy52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuUmVtb3ZlRnJvbVNoYXJlZC5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLnNoYXJlZFJ1bnMubmV4dCh0aGlzLnN0b3JlLnNoYXJlZFJ1bnMudmFsdWUuZmlsdGVyKChjYWxsKSA9PiBjYWxsLmlkICE9PSBpZCkpO1xuXG4gICAgICBjb25zdCBlZGl0ZWRSdW4gPSB0aGlzLnN0b3JlLm15UnVucy52YWx1ZS5maW5kKChjYWxsKSA9PiBjYWxsLmlkID09PSBpZCk7XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ3RpdGxlJ10gPSBudWxsO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWydkZXNjcmlwdGlvbiddID0gbnVsbDtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1snaXNTaGFyZWQnXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdG9yZS5teVJ1bnMubmV4dCh0aGlzLnN0b3JlLm15UnVucy52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuRGVsZXRlZC5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLm15UnVucy5uZXh0KHRoaXMuc3RvcmUubXlSdW5zLnZhbHVlLmZpbHRlcigoY2FsbCkgPT4gY2FsbC5pZCAhPT0gaWQpKTtcbiAgICAgIHRoaXMuc3RvcmUuZmF2b3JpdGVSdW5zLm5leHQodGhpcy5zdG9yZS5mYXZvcml0ZVJ1bnMudmFsdWUuZmlsdGVyKChjYWxsKSA9PiBjYWxsLmlkICE9PSBpZCkpO1xuICAgICAgdGhpcy5zdG9yZS5zaGFyZWRSdW5zLm5leHQodGhpcy5zdG9yZS5zaGFyZWRSdW5zLnZhbHVlLmZpbHRlcigoY2FsbCkgPT4gY2FsbC5pZCAhPT0gaWQpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWxsUnVuc0ZldGNoLm5leHQoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBhbmUoKTtcbiAgfVxuXG4gIGdldCByb290KCkge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG59XG4iXX0=
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhpc3RvcnktcGFuZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sNkJBQTZCLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLE1BQU0sRUFBRSxzQ0FBc0M7SUFDOUMsT0FBTyxFQUFFLHNDQUFzQztJQUMvQyxRQUFRLEVBQUUsc0NBQXNDO0NBQ2pELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELFlBQVksRUFBRSxzQ0FBc0M7SUFDcEQsZ0JBQWdCLEVBQUUsc0NBQXNDO0lBQ3hELE1BQU0sRUFBRSxzQ0FBc0M7SUFDOUMsT0FBTyxFQUFFLHNDQUFzQztJQUMvQyxRQUFRLEVBQUUsc0NBQXNDO0lBQ2hELGdCQUFnQixFQUFFLHNDQUFzQztDQUN6RCxDQUFDO0FBRUYsTUFBTSxpQkFBaUI7SUFBdkI7UUFDRSxxQkFBZ0IsR0FBRyxFQUFDLElBQUksRUFBRSxFQUFFLEVBSTNCLENBQUM7UUFFRixZQUFPLEdBQUcsSUFBSSxlQUFlLENBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBc0NuRCxDQUFDO0lBcENDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFB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SSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7S0FBQTtJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB3dSBmcm9tICd3dSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2hpc3RvcnlVdGlsc30gZnJvbSAnLi4vaGlzdG9yeS11dGlscyc7XG5pbXBvcnQgJy4uLy4uL2Nzcy9oaXN0b3J5LXBhbmVsLmNzcyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0VXNlcnNJZHMgPSB7XG4gICdUZXN0JzogJ2NhMWU2NzJlLWUzYmUtNDBlMC1iNzliLWQyYzY4ZTY4ZDM4MCcsXG4gICdBZG1pbic6ICc4NzhjNDJiMC05YTUwLTExZTYtYzUzNy02YmY4ZTlhYjAyZWUnLFxuICAnU3lzdGVtJzogJzNlMzJjNWZhLWFjOWMtNGQzOS04YjRiLTRkYjNlNTc2YjNjMycsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3Vwc0lkcyA9IHtcbiAgJ0FsbCB1c2Vycyc6ICdhNGI0NTg0MC05YTUwLTExZTYtOWNjOS04NTQ2YjhiZjYyZTYnLFxuICAnRGV2ZWxvcGVycyc6ICdiYTljZDE5MS05YTUwLTExZTYtOWNjOS05MTBiZjgyN2YwYWInLFxuICAnTmVlZCB0byBjcmVhdGUnOiAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJyxcbiAgJ1Rlc3QnOiAnY2ExZTY3MmUtZTNiZS00MGUwLWI3OWItODU0NmI4YmY2MmU2JyxcbiAgJ0FkbWluJzogJ2E0YjQ1ODQwLTlhNTAtMTFlNi1jNTM3LTZiZjhlOWFiMDJlZScsXG4gICdTeXN0ZW0nOiAnYTRiNDU4NDAtYWM5Yy00ZDM5LThiNGItNGRiM2U1NzZiM2MzJyxcbiAgJ0FkbWluaXN0cmF0b3JzJzogJzFhYjhiMzhkLTljNGUtNGIxZS04MWMzLWFlMmJkZTNlMTJjNScsXG59O1xuXG5jbGFzcyBIaXN0b3J5UGFuZWxTdG9yZSB7XG4gIGZpbHRlcmluZ09wdGlvbnMgPSB7dGV4dDogJyd9IGFzIHtcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgYXV0aG9yPzogREcuVXNlcixcbiAgICBzdGFydGVkQWZ0ZXI/OiBkYXlqcy5EYXlqcyxcbiAgfTtcblxuICBhbGxSdW5zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxERy5GdW5jQ2FsbFtdPihbXSk7XG5cbiAgZ2V0IG15UnVucygpIHtcbiAgICByZXR1cm4gdGhpcy5hbGxSdW5zLnZhbHVlLmZpbHRlcigocnVuKSA9PiBydW4uYXV0aG9yLmlkID09PSBncm9rLnNoZWxsLnVzZXIuaWQpO1xuICB9XG5cbiAgZ2V0IGZhdm9yaXRlUnVucygpIHtcbiAgICByZXR1cm4gdGhpcy5hbGxSdW5zLnZhbHVlLmZpbHRlcigocnVuKSA9PiBydW4ub3B0aW9uc1snaXNGYXZvcml0ZSddICYmICFydW4ub3B0aW9uc1snaXNJbXBvcnRlZCddKTtcbiAgfVxuXG4gIGdldCBzaGFyZWRSdW5zKCkge1xuICAgIHJldHVybiB0aGlzLmFsbFJ1bnMudmFsdWUuZmlsdGVyKChydW4pID0+IHJ1bi5vcHRpb25zWydpc1NoYXJlZCddKTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJlZE15UnVucygpIHtcbiAgICByZXR1cm4gdGhpcy5teVJ1bnMuZmlsdGVyKCh2YWwpID0+ICh0aGlzLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyID8gdmFsLnN0YXJ0ZWQgPiB0aGlzLmZpbHRlcmluZ09wdGlvbnMuc3RhcnRlZEFmdGVyIDogdHJ1ZSkpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkRmF2b3JpdGVSdW5zKCkge1xuICAgIHJldHVybiB0aGlzLmZhdm9yaXRlUnVucy5maWx0ZXIoKHZhbCkgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRlZEFmdGVyID0gKHRoaXMuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgPyB2YWwuc3RhcnRlZCA+IHRoaXMuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgOiB0cnVlKTtcbiAgICAgIGNvbnN0IHRpdGxlQ29udGFpbnNUZXh0ID0gKCF0aGlzLmZpbHRlcmluZ09wdGlvbnMudGV4dC5sZW5ndGgpID8gdHJ1ZSA6ICghIXZhbC5vcHRpb25zWyd0aXRsZSddKSA/IHZhbC5vcHRpb25zWyd0aXRsZSddLmluY2x1ZGVzKHRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTogZmFsc2U7XG4gICAgICBjb25zdCBkZXNjQ29udGFpbnNUZXh0ID0gKCF0aGlzLmZpbHRlcmluZ09wdGlvbnMudGV4dC5sZW5ndGgpID8gdHJ1ZSA6ICghIXZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddKSA/IHZhbC5vcHRpb25zWydkZXNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTogZmFsc2U7XG5cbiAgICAgIHJldHVybiAodGl0bGVDb250YWluc1RleHQgfHwgZGVzY0NvbnRhaW5zVGV4dCkgJiYgc3RhcnRlZEFmdGVyO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkU2hhcmVkUnVucygpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRSdW5zLmZpbHRlcigodmFsKSA9PiB7XG4gICAgICBjb25zdCBpc0F1dGhvcmVkID0gdGhpcy5maWx0ZXJpbmdPcHRpb25zLmF1dGhvciA/IHZhbC5hdXRob3IuaWQgPT09IHRoaXMuZmlsdGVyaW5nT3B0aW9ucy5hdXRob3IuaWQ6IHRydWU7XG4gICAgICBjb25zdCBzdGFydGVkQWZ0ZXIgPSAodGhpcy5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA/IHZhbC5zdGFydGVkID4gdGhpcy5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA6IHRydWUpO1xuICAgICAgY29uc3QgdGl0bGVDb250YWluc1RleHQgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCkgPyB0cnVlIDogKCEhdmFsLm9wdGlvbnNbJ3RpdGxlJ10pID8gdmFsLm9wdGlvbnNbJ3RpdGxlJ10uaW5jbHVkZXModGhpcy5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiBmYWxzZTtcbiAgICAgIGNvbnN0IGRlc2NDb250YWluc1RleHQgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCkgPyB0cnVlIDogKCEhdmFsLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10pID8gdmFsLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uaW5jbHVkZXModGhpcy5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiBmYWxzZTtcblxuICAgICAgcmV0dXJuICh0aXRsZUNvbnRhaW5zVGV4dCB8fCBkZXNjQ29udGFpbnNUZXh0KSAmJiBzdGFydGVkQWZ0ZXIgJiYgaXNBdXRob3JlZDtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGlzdG9yeVBhbmVsIHtcbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIHNob3VsZCBpcyBjaG9zZW4uIENvbnRhaW5zIEZ1bmNDYWxsIElEXG4gIHB1YmxpYyBvblJ1bkNob3NlbiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgYWRkZWQgdG8gZmF2b3JpdGVzXG4gIHB1YmxpYyBiZWZvcmVSdW5BZGRUb0Zhdm9yaXRlcyA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBhZGRlZCB0byBzaGFyZWRcbiAgcHVibGljIGJlZm9yZVJ1bkFkZFRvU2hhcmVkID0gbmV3IFN1YmplY3Q8REcuRnVuY0NhbGw+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXNcbiAgcHVibGljIGJlZm9yZVJ1blJlbW92ZUZyb21GYXZvcml0ZXMgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgcmVtb3ZlZCBmcm9tIHNoYXJlZFxuICBwdWJsaWMgYmVmb3JlUnVuUmVtb3ZlRnJvbVNoYXJlZCA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBkZWxldGVkXG4gIHB1YmxpYyBiZWZvcmVSdW5EZWxldGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBhZGRlZCB0byBmYXZvcml0ZXNcbiAgcHVibGljIGFmdGVyUnVuQWRkVG9GYXZvcml0ZXMgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgYWRkZWQgdG8gc2hhcmVkXG4gIHB1YmxpYyBhZnRlclJ1bkFkZFRvU2hhcmVkID0gbmV3IFN1YmplY3Q8REcuRnVuY0NhbGw+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXNcbiAgcHVibGljIGFmdGVyUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcyA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyByZW1vdmVkIGZyb20gc2hhcmVkXG4gIHB1YmxpYyBhZnRlclJ1blJlbW92ZUZyb21TaGFyZWQgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgZGVsZXRlZFxuICBwdWJsaWMgYWZ0ZXJSdW5EZWxldGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgc3RvcmUgPSBuZXcgSGlzdG9yeVBhbmVsU3RvcmUoKTtcblxuICBwcml2YXRlIG15UnVuc0ZpbHRlciA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG4gIHByaXZhdGUgZmF2UnVuc0ZpbHRlciA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG4gIHByaXZhdGUgc2hhcmVkUnVuc0ZpbHRlciA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG5cbiAgcHVibGljIGFsbFJ1bnNGZXRjaCA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG5cbiAgaGlzdG9yeVRhYiA9IHVpLmRpdigpO1xuICBmYXZUYWIgPSB1aS5kaXYoKTtcbiAgc2hhcmVkVGFiID0gdWkuZGl2KCk7XG4gIHRhYnMgPSB1aS50YWJDb250cm9sKHtcbiAgICAnSElTVE9SWSc6IHVpLmJveCh0aGlzLmhpc3RvcnlUYWIpLFxuICAgICdGQVZPUklURVMnOiB1aS5ib3godGhpcy5mYXZUYWIpLFxuICAgICdTSEFSRUQnOiB1aS5ib3godGhpcy5zaGFyZWRUYWIpLFxuICB9KTtcbiAgZmlsdGVyUGFuZSA9IHVpLmRpdigpO1xuXG4gIHByaXZhdGUgX3Jvb3QgPSB1aS5kaXZWKFtcbiAgICB1aS5wYW5lbChbXG4gICAgICB1aS5oMignSGlzdG9yeScpLFxuICAgICAgdGhpcy5maWx0ZXJQYW5lLFxuICAgIF0pLFxuICAgIHVpLmVsZW1lbnQoJ2RpdicsICdzcGxpdGJhci1ob3Jpem9udGFsJyksXG4gICAgdGhpcy50YWJzLnJvb3QsXG4gIF0sIHtzdHlsZToge3dpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfX0pO1xuXG4gIG15Q2FyZHMgPSBbXSBhcyBIVE1MRWxlbWVudFtdO1xuICBmYXZvcml0ZUNhcmRzID0gW10gYXMgSFRNTEVsZW1lbnRbXTtcbiAgc2hhcmVkQ2FyZHMgPSBbXSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gIHVwZGF0ZUZpbHRlclBhbmUoKSB7XG4gICAgY29uc3QgYnVpbGRGaWx0ZXJQYW5lID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHVpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdUZXh0ID0gbmV3IFN1YmplY3QoKTtcblxuICAgICAgICBjb25zdCB0ZXh0SW5wdXQgPSB1aS5zdHJpbmdJbnB1dCgnU2VhcmNoJywgJycsICh2OiBzdHJpbmcpID0+IGZpbHRlcmluZ1RleHQubmV4dCh2KSk7XG4gICAgICAgIHRleHRJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIERHLmRlYm91bmNlKGZpbHRlcmluZ1RleHQuYXNPYnNlcnZhYmxlKCksIDYwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCA9IHRleHRJbnB1dC5zdHJpbmdWYWx1ZTtcbiAgICAgICAgICB0aGlzLmZhdlJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICAgIHRoaXMuc2hhcmVkUnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRhdGVJbnB1dCA9IHVpLmRhdGVJbnB1dCgnU3RhcnRlZCBhZnRlcicsIGRheWpzKCkuc3VidHJhY3QoMSwgJ3dlZWsnKSwgKHY6IGRheWpzLkRheWpzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA9IHY7XG4gICAgICAgICAgdGhpcy5teVJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICAgIHRoaXMuZmF2UnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFVzZXJzID0gT2JqZWN0LnZhbHVlcyhkZWZhdWx0VXNlcnNJZHMpO1xuICAgICAgICBjb25zdCBhbGxVc2VycyA9IGF3YWl0IGdyb2suZGFwaS51c2Vycy5saXN0KCkgYXMgREcuVXNlcltdO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFVzZXJzID0gYWxsVXNlcnMuZmlsdGVyKCh1c2VyKSA9PiAhZGVmYXVsdFVzZXJzLmluY2x1ZGVzKHVzZXIuaWQpKTtcblxuICAgICAgICBjb25zdCBhdXRob3JJbnB1dCA9IHVpLmNob2ljZUlucHV0PERHLlVzZXIgfCBzdHJpbmc+KCdBdXRob3InLCAnQW55b25lJywgWydBbnlvbmUnLCAuLi5maWx0ZXJlZFVzZXJzXSwgKHY6IERHLlVzZXIgfCBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMuYXV0aG9yID0gKHYgPT09ICdBbnlvbmUnKSA/IHVuZGVmaW5lZCA6IHYgYXMgREcuVXNlcjtcbiAgICAgICAgICB0aGlzLnNoYXJlZFJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGRhdGVJbnB1dC5hZGRQYXR0ZXJuTWVudSgnZGF0ZXRpbWUnKTtcbiAgICAgICAgY29uc3QgZm9ybSA9IHVpLmRpdlYoW1xuICAgICAgICAgIHRleHRJbnB1dCxcbiAgICAgICAgICBkYXRlSW5wdXQsXG4gICAgICAgICAgYXV0aG9ySW5wdXQsXG4gICAgICAgIF0sICd1aS1mb3JtIHVpLWZvcm0td2lkZSB1aS1mb3JtLWxlZnQnKTtcbiAgICAgICAgZm9ybS5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG5cbiAgICAgICAgdGhpcy50YWJzLm9uVGFiQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJOYW1lID0gdGhpcy50YWJzLmN1cnJlbnRQYW5lLm5hbWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRUYWJOYW1lID09PSAnSElTVE9SWScpIHtcbiAgICAgICAgICAgIHRleHRJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBkYXRlSW5wdXQucm9vdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFRhYk5hbWUgPT09ICdGQVZPUklURVMnKSB7XG4gICAgICAgICAgICB0ZXh0SW5wdXQucm9vdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgICAgICAgZGF0ZUlucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgICAgIGF1dGhvcklucHV0LnJvb3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRUYWJOYW1lID09PSAnU0hBUkVEJykge1xuICAgICAgICAgICAgdGV4dElucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgICAgIGRhdGVJbnB1dC5yb290LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgICAgICAgICBhdXRob3JJbnB1dC5yb290LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBuZXdGaWx0ZXJQYW5lID0gYnVpbGRGaWx0ZXJQYW5lKCk7XG4gICAgdGhpcy5maWx0ZXJQYW5lLnJlcGxhY2VXaXRoKG5ld0ZpbHRlclBhbmUpO1xuICAgIHRoaXMuZmlsdGVyUGFuZSA9IG5ld0ZpbHRlclBhbmU7XG4gIH07XG5cbiAgc2hvd0RlbGV0ZVJ1bkRpYWxvZyhmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICB1aS5kaWFsb2coe3RpdGxlOiAnRGVsZXRlIHJ1bid9KVxuICAgICAgLmFkZCh1aS5kaXZUZXh0KCdUaGUgZGVsZXRlZCBydW4gaXMgaW1wb3NzaWJsZSB0byByZXN0b3JlLiBBcmUgeW91IHN1cmU/JykpXG4gICAgICAub25PSyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuYmVmb3JlUnVuRGVsZXRlZC5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgIH0pXG4gICAgICAuc2hvdyh7Y2VudGVyOiB0cnVlfSk7XG4gIH07XG5cbiAgdXBkYXRlU2hhcmVkUGFuZShzaGFyZWRSdW5zOiBERy5GdW5jQ2FsbFtdKSB7XG4gICAgY29uc3QgbmV3VGFiID0gKHNoYXJlZFJ1bnMubGVuZ3RoID4gMCkgPyB0aGlzLnJlbmRlclNoYXJlZENhcmRzKHNoYXJlZFJ1bnMpIDogdWkuZGl2VGV4dCgnTm8gcnVucyBhcmUgbWFya2VkIGFzIHNoYXJlZCcsICduby1lbGVtZW50cy1sYWJlbCcpO1xuICAgIHRoaXMuc2hhcmVkVGFiLnJlcGxhY2VXaXRoKG5ld1RhYik7XG4gICAgdGhpcy5zaGFyZWRUYWIgPSBuZXdUYWI7XG4gIH07XG5cbiAgdXBkYXRlRmF2b3JpdGVzUGFuZShmYXZvcml0ZVJ1bnM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICBjb25zdCBuZXdUYWIgPSAoZmF2b3JpdGVSdW5zLmxlbmd0aCA+IDApID8gdGhpcy5yZW5kZXJGYXZvcml0ZUNhcmRzKGZhdm9yaXRlUnVucykgOiB1aS5kaXZUZXh0KCdObyBydW5zIGFyZSBtYXJrZWQgYXMgZmF2b3JpdGVzJywgJ25vLWVsZW1lbnRzLWxhYmVsJyk7XG4gICAgdGhpcy5mYXZUYWIucmVwbGFjZVdpdGgobmV3VGFiKTtcbiAgICB0aGlzLmZhdlRhYiA9IG5ld1RhYjtcbiAgfTtcblxuICB1cGRhdGVNeVBhbmUobXlSdW5zOiBERy5GdW5jQ2FsbFtdKSB7XG4gICAgY29uc3QgbmV3VGFiID0gKG15UnVucy5sZW5ndGggPiAwKSA/IHRoaXMucmVuZGVySGlzdG9yeUNhcmRzKG15UnVucykgOiB1aS5kaXZUZXh0KCdObyBydW5zIGFyZSBmb3VuZCBpbiBoaXN0b3J5JywgJ25vLWVsZW1lbnRzLWxhYmVsJyk7XG4gICAgdGhpcy5oaXN0b3J5VGFiLnJlcGxhY2VXaXRoKG5ld1RhYik7XG4gICAgdGhpcy5oaXN0b3J5VGFiID0gbmV3VGFiO1xuICB9O1xuXG4gIHJlbmRlckNhcmQoZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgY29uc3QgaWNvbiA9IGZ1bmNDYWxsLmF1dGhvci5waWN0dXJlIGFzIEhUTUxFbGVtZW50O1xuICAgIGljb24uc3R5bGUud2lkdGggPSAnMjVweCc7XG4gICAgaWNvbi5zdHlsZS5oZWlnaHQgPSAnMjVweCc7XG4gICAgaWNvbi5zdHlsZS5mb250U2l6ZSA9ICcyMHB4JztcbiAgICBjb25zdCBjYXJkTGFiZWwgPSB1aS5sYWJlbChmdW5jQ2FsbC5vcHRpb25zWyd0aXRsZSddID8/IGZ1bmNDYWxsLmF1dGhvci5mcmllbmRseU5hbWUsIHtzdHlsZTogeydjb2xvcic6ICd2YXIoLS1ibHVlLTEpJ319KTtcbiAgICB1aS5iaW5kKGZ1bmNDYWxsLmF1dGhvciwgaWNvbik7XG5cbiAgICBjb25zdCBlZGl0SWNvbiA9IHVpLmljb25GQSgnZWRpdCcsIChldikgPT4ge1xuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnNob3dFZGl0RGlhbG9nKGZ1bmNDYWxsKTtcbiAgICB9KTtcbiAgICBlZGl0SWNvbi5jbGFzc0xpc3QuYWRkKCdjdi1mdW5jY2FsbC1jYXJkLWhvdmVyLWljb24nKTtcblxuICAgIGNvbnN0IGRlbGV0ZUljb24gPSB1aS5pY29uRkEoJ3RyYXNoLWFsdCcsIGFzeW5jIChldikgPT4ge1xuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnNob3dEZWxldGVSdW5EaWFsb2coZnVuY0NhbGwpO1xuICAgIH0sICdEZWxldGUgdGhlIHJ1bicpO1xuICAgIGRlbGV0ZUljb24uY2xhc3NMaXN0LmFkZCgnY3YtZnVuY2NhbGwtY2FyZC1ob3Zlci1pY29uJyk7XG5cbiAgICBjb25zdCBmYXZvcml0ZWRJY29uID0gdWkuaWNvbkZBKCdzdGFyJywgbnVsbCwgJ1VuZmF2b3JpdGUgdGhlIHJ1bicpO1xuICAgIGZhdm9yaXRlZEljb24uY2xhc3NMaXN0LmFkZCgnZmFzJywgJ2N2LWZ1bmNjYWxsLWNhcmQtZGVmLWljb24nKTtcblxuICAgIGNvbnN0IHNoYXJlZEljb24gPSB1aS5pY29uRkEoJ3NoYXJlLWFsdCcsIG51bGwsICdBZGQgdG8gc2hhcmVkJyk7XG4gICAgc2hhcmVkSWNvbi5jbGFzc0xpc3QuYWRkKCdmYXMnLCAnY3YtZnVuY2NhbGwtY2FyZC1kZWYtaWNvbicpO1xuICAgIHNoYXJlZEljb24uc3R5bGUuY29sb3IgPSAndmFyKC0tYmx1ZS0xKSc7XG5cbiAgICBjb25zdCBkYXRlU3RhcnRlZCA9IG5ldyBEYXRlKGZ1bmNDYWxsLnN0YXJ0ZWQudG9TdHJpbmcoKSkudG9Mb2NhbGVTdHJpbmcoJ2VuLXVzJywge21vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICdudW1lcmljJ30pO1xuXG4gICAgY29uc3QgY2FyZCA9IHVpLmRpdkgoW1xuICAgICAgdWkuZGl2SChbXG4gICAgICAgIGljb24sXG4gICAgICAgIHVpLmRpdlYoW1xuICAgICAgICAgIGNhcmRMYWJlbCxcbiAgICAgICAgICB1aS5zcGFuKFtkYXRlU3RhcnRlZF0pLFxuICAgICAgICAgIC4uLihmdW5jQ2FsbC5vcHRpb25zWydkZXNjcmlwdGlvbiddKSA/IFt1aS5kaXZUZXh0KGZ1bmNDYWxsLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10sICdkZXNjcmlwdGlvbicpXTogW10sXG4gICAgICAgIF0sICdjdi1jYXJkLWNvbnRlbnQnKSxcbiAgICAgIF0pLFxuICAgICAgdWkuZGl2SChbXG4gICAgICAgIGVkaXRJY29uLCBkZWxldGVJY29uLFxuICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSA/IFtmYXZvcml0ZWRJY29uXSA6IFtdLFxuICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSkgPyBbc2hhcmVkSWNvbl06IFtdLFxuICAgICAgXSlcbiAgICBdLCAnY3YtZnVuY2NhbGwtY2FyZCcpO1xuXG4gICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMub25SdW5DaG9zZW4ubmV4dChmdW5jQ2FsbC5pZCk7XG5cbiAgICAgIGNvbnN0IGFsbENhcmRzID0gWy4uLnRoaXMubXlDYXJkcywgLi4udGhpcy5mYXZvcml0ZUNhcmRzLCAuLi50aGlzLnNoYXJlZENhcmRzXTtcbiAgICAgIGFsbENhcmRzLmZvckVhY2goKGMpID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpKTtcblxuICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdjbGlja2VkJyk7XG4gICAgfSk7XG4gICAgdWkudG9vbHRpcC5iaW5kKGNhcmQsICgpID0+IHVpLnRhYmxlRnJvbU1hcCh7XG4gICAgICBBdXRob3I6IGdyb2suc2hlbGwudXNlci50b01hcmt1cCgpLFxuICAgICAgRGF0ZTogZGF0ZVN0YXJ0ZWQsXG4gICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSkgPyB7J1RpdGxlJzogZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXX06e30sXG4gICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snZGVzY3JpcHRpb24nXSkgPyB7J0Rlc2NyaXB0aW9uJzogZnVuY0NhbGwub3B0aW9uc1snZGVzY3JpcHRpb24nXX06e30sXG4gICAgfSkpO1xuICAgIHJldHVybiBjYXJkO1xuICB9XG5cbiAgc2hvd0VkaXREaWFsb2coZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgY29uc3QgZGxnID0gdWkuZGlhbG9nKHt0aXRsZTogJ0VkaXQgcnVuJ30pO1xuXG4gICAgbGV0IHRpdGxlID0gZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA/PyAnJztcbiAgICBsZXQgZGVzY3JpcHRpb24gPSBmdW5jQ2FsbC5vcHRpb25zWydkZXNjcmlwdGlvbiddID8/ICcnO1xuICAgIGNvbnN0IHRpdGxlSW5wdXQgPSB1aS5zdHJpbmdJbnB1dCgnVGl0bGUnLCB0aXRsZSwgKHM6IHN0cmluZykgPT4ge1xuICAgICAgdGl0bGUgPSBzO1xuICAgICAgaWYgKHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRpdGxlSW5wdXQuc2V0VG9vbHRpcCgnVGl0bGUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGl0bGVJbnB1dC5pbnB1dC5jbGFzc0xpc3QuYWRkKCdkNC1pbnZhbGlkJyksIDEwMCk7XG4gICAgICAgIGRsZy5nZXRCdXR0b24oJ09LJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVJbnB1dC5zZXRUb29sdGlwKCcnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aXRsZUlucHV0LmlucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ2Q0LWludmFsaWQnKSwgMTAwKTtcbiAgICAgICAgZGxnLmdldEJ1dHRvbignT0snKS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBpc1NoYXJlZCA9IGZ1bmNDYWxsLm9wdGlvbnNbJ2lzU2hhcmVkJ10gPz8gZmFsc2U7XG4gICAgbGV0IGlzRmF2b3JpdGUgPSBmdW5jQ2FsbC5vcHRpb25zWydpc0Zhdm9yaXRlJ10gPz8gZmFsc2U7XG5cbiAgICBkbGcuYWRkKHVpLmZvcm0oW1xuICAgICAgdGl0bGVJbnB1dCxcbiAgICAgIHVpLnN0cmluZ0lucHV0KCdEZXNjcmlwdGlvbicsIGRlc2NyaXB0aW9uLCAoczogc3RyaW5nKSA9PiB7IGRlc2NyaXB0aW9uID0gczsgfSksXG4gICAgICB1aS5ib29sSW5wdXQoJ0Zhdm9yaXRlcycsIGlzRmF2b3JpdGUsIChiOiBib29sZWFuKSA9PiBpc0Zhdm9yaXRlID0gYiksXG4gICAgICB1aS5ib29sSW5wdXQoJ1NoYXJlJywgaXNTaGFyZWQsIChiOiBib29sZWFuKSA9PiBpc1NoYXJlZCA9IGIpLFxuICAgIF0pKVxuICAgICAgLm9uT0soYXN5bmMgKCkgPT4ge1xuICAgICAgICBmdW5jQ2FsbCA9IGF3YWl0IGhpc3RvcnlVdGlscy5sb2FkUnVuKGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA9IHRpdGxlO1xuICAgICAgICBmdW5jQ2FsbC5vcHRpb25zWydkZXNjcmlwdGlvbiddID0gZGVzY3JpcHRpb247XG5cbiAgICAgICAgaWYgKGlzU2hhcmVkID09PSBmdW5jQ2FsbC5vcHRpb25zWydpc1NoYXJlZCddICYmIGlzRmF2b3JpdGUgPT09IGZ1bmNDYWxsLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSkge1xuICAgICAgICAgIGF3YWl0IGhpc3RvcnlVdGlscy5zYXZlUnVuKGZ1bmNDYWxsKTtcblxuICAgICAgICAgIGNvbnN0IGVkaXRlZFJ1biA9IHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZS5maW5kKChjYWxsKSA9PiBjYWxsLmlkID09PSBmdW5jQ2FsbC5pZCk7XG4gICAgICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWyd0aXRsZSddID0gZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXTtcbiAgICAgICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10gPSBmdW5jQ2FsbC5vcHRpb25zWydkZXNjcmlwdGlvbiddO1xuXG4gICAgICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTaGFyZWQgJiYgIWZ1bmNDYWxsLm9wdGlvbnNbJ2lzU2hhcmVkJ10pIHtcbiAgICAgICAgICBmdW5jQ2FsbC5vcHRpb25zWydpc1NoYXJlZCddID0gaXNTaGFyZWQ7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCB0cnVlKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkZFJ1blRvU2hhcmVkKGZ1bmNDYWxsKTtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNTaGFyZWQgJiYgZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSkge1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2lzU2hhcmVkJ10gPSBpc1NoYXJlZDtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIHRydWUpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlUnVuRnJvbVNoYXJlZChmdW5jQ2FsbCk7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGYXZvcml0ZSAmJiAhZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSB7XG4gICAgICAgICAgZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddID0gaXNGYXZvcml0ZTtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIHRydWUpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUnVuVG9GYXZvcml0ZXMoZnVuY0NhbGwpO1xuICAgICAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Zhdm9yaXRlICYmIGZ1bmNDYWxsLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSkge1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSA9IGlzRmF2b3JpdGU7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCB0cnVlKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVJ1bkZyb21GYXZvcml0ZXMoZnVuY0NhbGwpO1xuICAgICAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnNob3coe2NlbnRlcjogdHJ1ZX0pO1xuICAgIHRpdGxlSW5wdXQuZmlyZUNoYW5nZWQoKTtcbiAgfVxuXG4gIHJlbmRlckZhdm9yaXRlQ2FyZHMoZnVuY0NhbGxzOiBERy5GdW5jQ2FsbFtdKSB7XG4gICAgdGhpcy5mYXZvcml0ZUNhcmRzID0gZnVuY0NhbGxzLm1hcCgoZnVuY0NhbGwpID0+IHRoaXMucmVuZGVyQ2FyZChmdW5jQ2FsbCkpO1xuICAgIHJldHVybiB1aS5kaXZWKHRoaXMuZmF2b3JpdGVDYXJkcyk7XG4gIH07XG5cbiAgcmVuZGVyU2hhcmVkQ2FyZHMoZnVuY0NhbGxzOiBERy5GdW5jQ2FsbFtdKSB7XG4gICAgdGhpcy5zaGFyZWRDYXJkcyA9IGZ1bmNDYWxscy5tYXAoKGZ1bmNDYWxsKSA9PiB0aGlzLnJlbmRlckNhcmQoZnVuY0NhbGwpKTtcbiAgICByZXR1cm4gdWkuZGl2Vih0aGlzLnNoYXJlZENhcmRzKTtcbiAgfTtcblxuICByZW5kZXJIaXN0b3J5Q2FyZHMoZnVuY0NhbGxzOiBERy5GdW5jQ2FsbFtdKSB7XG4gICAgdGhpcy5teUNhcmRzID0gZnVuY0NhbGxzLm1hcCgoZnVuY0NhbGwpID0+IHRoaXMucmVuZGVyQ2FyZChmdW5jQ2FsbCkpO1xuICAgIHJldHVybiB1aS5kaXZWKHRoaXMubXlDYXJkcywge3N0eWxlOiB7aGVpZ2h0OiAnMTAwJSd9fSk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmdW5jOiBERy5GdW5jXG4gICkge1xuICAgIHRoaXMudGFicy5yb290LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIHRoaXMudGFicy5yb290LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblxuICAgIHRoaXMubXlSdW5zRmlsdGVyLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZU15UGFuZSh0aGlzLnN0b3JlLmZpbHRlcmVkTXlSdW5zKSk7XG4gICAgdGhpcy5mYXZSdW5zRmlsdGVyLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUZhdm9yaXRlc1BhbmUodGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucykpO1xuICAgIHRoaXMuc2hhcmVkUnVuc0ZpbHRlci5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTaGFyZWRQYW5lKHRoaXMuc3RvcmUuZmlsdGVyZWRTaGFyZWRSdW5zKSk7XG5cbiAgICB0aGlzLnN0b3JlLmFsbFJ1bnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTXlQYW5lKHRoaXMuc3RvcmUuZmlsdGVyZWRNeVJ1bnMpO1xuICAgICAgdGhpcy51cGRhdGVGYXZvcml0ZXNQYW5lKHRoaXMuc3RvcmUuZmlsdGVyZWRGYXZvcml0ZVJ1bnMpO1xuICAgICAgdGhpcy51cGRhdGVTaGFyZWRQYW5lKHRoaXMuc3RvcmUuZmlsdGVyZWRTaGFyZWRSdW5zKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWxsUnVuc0ZldGNoLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxSdW5zID0gKGF3YWl0IGhpc3RvcnlVdGlscy5wdWxsUnVuc0J5TmFtZSh0aGlzLmZ1bmMubmFtZSwgW10sIHtvcmRlcjogJ3N0YXJ0ZWQnfSwgWydzZXNzaW9uLnVzZXInLCAnb3B0aW9ucyddKSkucmV2ZXJzZSgpO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQoYWxsUnVucyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjbGVhck1ldGFkYXRhID0gKGZ1bmNDYWxsOiBERy5GdW5jQ2FsbCkgPT4ge1xuICAgICAgaWYgKCFmdW5jQ2FsbC5vcHRpb25zWydpc0Zhdm9yaXRlJ10gJiYgIWZ1bmNDYWxsLm9wdGlvbnNbJ2lzU2hhcmVkJ10pIHtcbiAgICAgICAgZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA9IG51bGw7XG4gICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10gPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmFmdGVyUnVuQWRkVG9GYXZvcml0ZXMuc3Vic2NyaWJlKChhZGRlZCkgPT4ge1xuICAgICAgY29uc3QgZWRpdGVkUnVuID0gdGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlLmZpbmQoKGNhbGwpID0+IGNhbGwuaWQgPT09IGFkZGVkLmlkKTtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1sndGl0bGUnXSA9IGFkZGVkLm9wdGlvbnNbJ3RpdGxlJ107XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10gPSBhZGRlZC5vcHRpb25zWydkZXNjcmlwdGlvbiddO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWydpc0Zhdm9yaXRlJ10gPSB0cnVlO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWZ0ZXJSdW5BZGRUb1NoYXJlZC5zdWJzY3JpYmUoKGFkZGVkKSA9PiB7XG4gICAgICBjb25zdCBlZGl0ZWRSdW4gPSB0aGlzLnN0b3JlLmFsbFJ1bnMudmFsdWUuZmluZCgoY2FsbCkgPT4gY2FsbC5pZCA9PT0gYWRkZWQuaWQpO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWyd0aXRsZSddID0gYWRkZWQub3B0aW9uc1sndGl0bGUnXTtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1snZGVzY3JpcHRpb24nXSA9IGFkZGVkLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ107XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ2lzU2hhcmVkJ10gPSB0cnVlO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWZ0ZXJSdW5SZW1vdmVGcm9tRmF2b3JpdGVzLnN1YnNjcmliZSgocmVtb3ZlZCkgPT4ge1xuICAgICAgY29uc3QgZWRpdGVkUnVuID0gdGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlLmZpbmQoKGNhbGwpID0+IGNhbGwuaWQgPT09IHJlbW92ZWQuaWQpITtcbiAgICAgIGVkaXRlZFJ1bi5vcHRpb25zWydpc0Zhdm9yaXRlJ10gPSBmYWxzZTtcbiAgICAgIGNsZWFyTWV0YWRhdGEoZWRpdGVkUnVuKTtcbiAgICAgIHRoaXMuc3RvcmUuYWxsUnVucy5uZXh0KHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuUmVtb3ZlRnJvbVNoYXJlZC5zdWJzY3JpYmUoKHJlbW92ZWQpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRlZFJ1biA9IHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZS5maW5kKChjYWxsKSA9PiBjYWxsLmlkID09PSByZW1vdmVkLmlkKSE7XG4gICAgICBlZGl0ZWRSdW4ub3B0aW9uc1snaXNTaGFyZWQnXSA9IGZhbHNlO1xuICAgICAgY2xlYXJNZXRhZGF0YShlZGl0ZWRSdW4pO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWZ0ZXJSdW5EZWxldGVkLnN1YnNjcmliZSgoaWQpID0+IHtcbiAgICAgIHRoaXMuc3RvcmUuYWxsUnVucy5uZXh0KHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZS5maWx0ZXIoKGNhbGwpID0+IGNhbGwuaWQgIT09IGlkKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFsbFJ1bnNGZXRjaC5uZXh0KCk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQYW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZFJ1blRvRmF2b3JpdGVzKGNhbGxUb0Zhdm9yaXRlOiBERy5GdW5jQ2FsbCk6IFByb21pc2U8REcuRnVuY0NhbGw+IHtcbiAgICBjYWxsVG9GYXZvcml0ZS5vcHRpb25zWydpc0Zhdm9yaXRlJ10gPSB0cnVlO1xuXG4gICAgdGhpcy5iZWZvcmVSdW5BZGRUb0Zhdm9yaXRlcy5uZXh0KGNhbGxUb0Zhdm9yaXRlKTtcbiAgICBjb25zdCBzYXZlZEZhdm9yaXRlID0gYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5hbGxQYWNrYWdlVmVyc2lvbnMoKS5zYXZlKGNhbGxUb0Zhdm9yaXRlKTtcbiAgICB0aGlzLmFmdGVyUnVuQWRkVG9GYXZvcml0ZXMubmV4dChzYXZlZEZhdm9yaXRlKTtcbiAgICByZXR1cm4gc2F2ZWRGYXZvcml0ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlUnVuRnJvbUZhdm9yaXRlcyhjYWxsVG9VbmZhdm9yaXRlOiBERy5GdW5jQ2FsbCk6IFByb21pc2U8REcuRnVuY0NhbGw+IHtcbiAgICBjYWxsVG9VbmZhdm9yaXRlLm9wdGlvbnNbJ3RpdGxlJ10gPSBudWxsO1xuICAgIGNhbGxUb1VuZmF2b3JpdGUub3B0aW9uc1snZGVzY3JpcHRpb24nXSA9IG51bGw7XG4gICAgY2FsbFRvVW5mYXZvcml0ZS5vcHRpb25zWydpc0Zhdm9yaXRlJ10gPSBmYWxzZTtcblxuICAgIHRoaXMuYmVmb3JlUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcy5uZXh0KGNhbGxUb1VuZmF2b3JpdGUpO1xuICAgIGNvbnN0IGZhdm9yaXRlU2F2ZSA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuYWxsUGFja2FnZVZlcnNpb25zKCkuc2F2ZShjYWxsVG9VbmZhdm9yaXRlKTtcbiAgICB0aGlzLmFmdGVyUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcy5uZXh0KGZhdm9yaXRlU2F2ZSk7XG4gICAgcmV0dXJuIGZhdm9yaXRlU2F2ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkUnVuVG9TaGFyZWQoY2FsbFRvU2hhcmU6IERHLkZ1bmNDYWxsKTogUHJvbWlzZTxERy5GdW5jQ2FsbD4ge1xuICAgIGNhbGxUb1NoYXJlLm9wdGlvbnNbJ2lzU2hhcmVkJ10gPSB0cnVlO1xuXG4gICAgdGhpcy5iZWZvcmVSdW5BZGRUb1NoYXJlZC5uZXh0KGNhbGxUb1NoYXJlKTtcblxuICAgIGNvbnN0IGFsbEdyb3VwID0gYXdhaXQgZ3Jvay5kYXBpLmdyb3Vwcy5maW5kKGRlZmF1bHRHcm91cHNJZHNbJ0FsbCB1c2VycyddKTtcblxuICAgIGNvbnN0IGRmT3V0cHV0cyA9IHd1KGNhbGxUb1NoYXJlLm91dHB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pXG4gICAgICAuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5wcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IERHLlRZUEUuREFUQV9GUkFNRSk7XG5cbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBkZk91dHB1dHMpIHtcbiAgICAgIGNvbnN0IGRmID0gY2FsbFRvU2hhcmUub3V0cHV0c1tvdXRwdXQubmFtZV0gYXMgREcuRGF0YUZyYW1lO1xuICAgICAgYXdhaXQgZ3Jvay5kYXBpLnBlcm1pc3Npb25zLmdyYW50KGRmLmdldFRhYmxlSW5mbygpLCBhbGxHcm91cCwgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGRmSW5wdXRzID0gd3UoY2FsbFRvU2hhcmUuaW5wdXRQYXJhbXMudmFsdWVzKCkgYXMgREcuRnVuY0NhbGxQYXJhbVtdKVxuICAgICAgLmZpbHRlcigoaW5wdXQpID0+IGlucHV0LnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGRmSW5wdXRzKSB7XG4gICAgICBjb25zdCBkZiA9IGNhbGxUb1NoYXJlLmlucHV0c1tpbnB1dC5uYW1lXSBhcyBERy5EYXRhRnJhbWU7XG4gICAgICBhd2FpdCBncm9rLmRhcGkucGVybWlzc2lvbnMuZ3JhbnQoZGYuZ2V0VGFibGVJbmZvKCksIGFsbEdyb3VwLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZWRTaGFyZWQgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLmFsbFBhY2thZ2VWZXJzaW9ucygpLnNhdmUoY2FsbFRvU2hhcmUpO1xuXG4gICAgdGhpcy5hZnRlclJ1bkFkZFRvU2hhcmVkLm5leHQoc2F2ZWRTaGFyZWQpO1xuICAgIHJldHVybiBzYXZlZFNoYXJlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlUnVuRnJvbVNoYXJlZChjYWxsVG9VbnNoYXJlOiBERy5GdW5jQ2FsbCk6IFByb21pc2U8REcuRnVuY0NhbGw+IHtcbiAgICBjYWxsVG9VbnNoYXJlLm9wdGlvbnNbJ3RpdGxlJ10gPSBudWxsO1xuICAgIGNhbGxUb1Vuc2hhcmUub3B0aW9uc1snZGVzY3JpcHRpb24nXSA9IG51bGw7XG4gICAgY2FsbFRvVW5zaGFyZS5vcHRpb25zWydpc1NoYXJlZCddID0gZmFsc2U7XG5cbiAgICB0aGlzLmJlZm9yZVJ1blJlbW92ZUZyb21TaGFyZWQubmV4dChjYWxsVG9VbnNoYXJlKTtcbiAgICBjb25zdCBzYXZlZFNoYXJlZCA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuYWxsUGFja2FnZVZlcnNpb25zKCkuc2F2ZShjYWxsVG9VbnNoYXJlKTtcbiAgICB0aGlzLmFmdGVyUnVuUmVtb3ZlRnJvbVNoYXJlZC5uZXh0KHNhdmVkU2hhcmVkKTtcbiAgICByZXR1cm4gc2F2ZWRTaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cbn1cbiJdfQ==