@datagrok-libraries/utils 3.3.2 → 4.0.1

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.
Files changed (39) hide show
  1. package/package.json +1 -1
  2. package/src/test.d.ts +1 -1
  3. package/src/test.d.ts.map +1 -1
  4. package/src/test.js +6 -6
  5. package/css/file-input.css +0 -32
  6. package/css/history-input.css +0 -27
  7. package/css/history-panel.css +0 -57
  8. package/css/pipeline-view.css +0 -13
  9. package/css/rich-function-view.css +0 -4
  10. package/src/computation-view.d.ts +0 -78
  11. package/src/computation-view.d.ts.map +0 -1
  12. package/src/computation-view.js +0 -157
  13. package/src/function-view.d.ts +0 -226
  14. package/src/function-view.d.ts.map +0 -1
  15. package/src/function-view.js +0 -384
  16. package/src/history-utils.d.ts +0 -65
  17. package/src/history-utils.d.ts.map +0 -1
  18. package/src/history-utils.js +0 -212
  19. package/src/pipeline-view.d.ts +0 -40
  20. package/src/pipeline-view.d.ts.map +0 -1
  21. package/src/pipeline-view.js +0 -178
  22. package/src/rich-function-view.d.ts +0 -55
  23. package/src/rich-function-view.d.ts.map +0 -1
  24. package/src/rich-function-view.js +0 -571
  25. package/src/shared-components/file-input.d.ts +0 -23
  26. package/src/shared-components/file-input.d.ts.map +0 -1
  27. package/src/shared-components/file-input.js +0 -133
  28. package/src/shared-components/history-input.d.ts +0 -26
  29. package/src/shared-components/history-input.d.ts.map +0 -1
  30. package/src/shared-components/history-input.js +0 -192
  31. package/src/shared-components/history-panel.d.ts +0 -65
  32. package/src/shared-components/history-panel.d.ts.map +0 -1
  33. package/src/shared-components/history-panel.js +0 -502
  34. package/src/shared-components/ui-utils.d.ts +0 -10
  35. package/src/shared-components/ui-utils.d.ts.map +0 -1
  36. package/src/shared-components/ui-utils.js +0 -19
  37. package/src/validation.d.ts +0 -56
  38. package/src/validation.d.ts.map +0 -1
  39. package/src/validation.js +0 -152
@@ -1,502 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- /* eslint-disable max-len */
11
- import * as grok from 'datagrok-api/grok';
12
- import * as ui from 'datagrok-api/ui';
13
- import * as DG from 'datagrok-api/dg';
14
- import dayjs from 'dayjs';
15
- import wu from 'wu';
16
- import { BehaviorSubject, Subject } from 'rxjs';
17
- import { historyUtils } from '../history-utils';
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((run) => {
49
- const startedAfter = (this.filteringOptions.startedAfter ? run.started > this.filteringOptions.startedAfter : true);
50
- const titleContainsText = (!this.filteringOptions.text.length) ? true : (!!run.options['title']) ? run.options['title'].includes(this.filteringOptions.text) : false;
51
- const descContainsText = (!this.filteringOptions.text.length) ? true : (!!run.options['description']) ? run.options['description'].includes(this.filteringOptions.text) : false;
52
- const hasTags = (!this.filteringOptions.tags || this.filteringOptions.tags.length === 0) ? true :
53
- (!!run.options['tags']) ? this.filteringOptions.tags.every((searchedTag) => run.options['tags'].includes(searchedTag)) : false;
54
- return (titleContainsText || descContainsText) && startedAfter && hasTags;
55
- });
56
- }
57
- get filteredFavoriteRuns() {
58
- return this.favoriteRuns.filter((run) => {
59
- const startedAfter = (this.filteringOptions.startedAfter ? run.started > this.filteringOptions.startedAfter : true);
60
- const titleContainsText = (!this.filteringOptions.text.length) ? true : (!!run.options['title']) ? run.options['title'].includes(this.filteringOptions.text) : false;
61
- const descContainsText = (!this.filteringOptions.text.length) ? true : (!!run.options['description']) ? run.options['description'].includes(this.filteringOptions.text) : false;
62
- const hasTags = (!this.filteringOptions.tags || this.filteringOptions.tags.length === 0) ? true :
63
- (!!run.options['tags']) ? this.filteringOptions.tags.every((searchedTag) => run.options['tags'].includes(searchedTag)) : false;
64
- return (titleContainsText || descContainsText) && startedAfter && hasTags;
65
- });
66
- }
67
- get filteredSharedRuns() {
68
- return this.sharedRuns.filter((run) => {
69
- const isAuthored = this.filteringOptions.author ? run.author.id === this.filteringOptions.author.id : true;
70
- const startedAfter = (this.filteringOptions.startedAfter ? run.started > this.filteringOptions.startedAfter : true);
71
- const titleContainsText = (!this.filteringOptions.text.length) ? true : (!!run.options['title']) ? run.options['title'].includes(this.filteringOptions.text) : false;
72
- const descContainsText = (!this.filteringOptions.text.length) ? true : (!!run.options['description']) ? run.options['description'].includes(this.filteringOptions.text) : false;
73
- const hasTags = (!this.filteringOptions.tags || this.filteringOptions.tags.length === 0) ? true :
74
- (!!run.options['tags']) ? this.filteringOptions.tags.every((searchedTag) => run.options['tags'].includes(searchedTag)) : false;
75
- return (titleContainsText || descContainsText) && startedAfter && isAuthored && hasTags;
76
- });
77
- }
78
- }
79
- const MY_PANE_LABEL = 'HISTORY';
80
- const FAVORITES_LABEL = 'FAVORITES';
81
- const SHARED_LABEL = 'SHARED';
82
- export class HistoryPanel {
83
- buildFilterPane(currentTabName) {
84
- return ui.wait(() => __awaiter(this, void 0, void 0, function* () {
85
- const filteringText = new Subject();
86
- const textInput = ui.stringInput('Search', '', (v) => filteringText.next(v));
87
- DG.debounce(filteringText.asObservable(), 600).subscribe(() => {
88
- this.store.filteringOptions.text = textInput.stringValue;
89
- this.myRunsFilter.next();
90
- this.favRunsFilter.next();
91
- this.sharedRunsFilter.next();
92
- });
93
- const dateInput = ui.dateInput('Started after', dayjs().subtract(1, 'week'), (v) => {
94
- this.store.filteringOptions.startedAfter = v;
95
- this.myRunsFilter.next();
96
- this.favRunsFilter.next();
97
- this.sharedRunsFilter.next();
98
- });
99
- const defaultUsers = Object.values(defaultUsersIds);
100
- const allUsers = yield grok.dapi.users.list();
101
- const filteredUsers = allUsers.filter((user) => !defaultUsers.includes(user.id));
102
- const authorInput = ui.choiceInput('Author', 'Anyone', ['Anyone', ...filteredUsers], (v) => {
103
- this.store.filteringOptions.author = (v === 'Anyone') ? undefined : v;
104
- this.sharedRunsFilter.next();
105
- });
106
- authorInput.root.style.display = 'none';
107
- let tagInput = ui.choiceInput('Tag', 'Choose tag to filter', ['Choose tag to filter']);
108
- const filterTagEditor = DG.TagEditor.create();
109
- const dummyInput = ui.stringInput(' ', '');
110
- dummyInput.input.replaceWith(filterTagEditor.root);
111
- filterTagEditor.onChanged(() => {
112
- //@ts-ignore
113
- this.store.filteringOptions.tags = filterTagEditor.tags.filter((tag) => !!tag);
114
- this.myRunsFilter.next();
115
- this.favRunsFilter.next();
116
- this.sharedRunsFilter.next();
117
- });
118
- this.store.allRuns.subscribe(() => {
119
- const tags = this.store.allRuns.value
120
- .map((run) => run.options['tags'])
121
- .reduce((acc, runTags) => {
122
- if (!!runTags)
123
- runTags.forEach((runTag) => { if (!acc.includes(runTag))
124
- acc.push(runTag); });
125
- return acc;
126
- }, []);
127
- const newTagInput = ui.choiceInput('Tag', 'Choose tag to filter', ['Choose tag to filter', ...tags]);
128
- tagInput.root.replaceWith(newTagInput.root);
129
- tagInput = newTagInput;
130
- tagInput.onChanged(() => {
131
- if (tagInput.value &&
132
- tagInput.value !== 'Choose tag to filter' &&
133
- //@ts-ignore
134
- !filterTagEditor.tags.includes(tagInput.value))
135
- filterTagEditor.addTag(tagInput.value);
136
- });
137
- });
138
- dateInput.addPatternMenu('datetime');
139
- const form = ui.divV([
140
- textInput,
141
- dateInput,
142
- authorInput,
143
- tagInput,
144
- dummyInput,
145
- ], 'ui-form ui-form-wide ui-form-left');
146
- if (currentTabName === MY_PANE_LABEL) {
147
- dateInput.root.style.removeProperty('display');
148
- authorInput.root.style.display = 'none';
149
- }
150
- if (currentTabName === FAVORITES_LABEL) {
151
- dateInput.root.style.removeProperty('display');
152
- authorInput.root.style.display = 'none';
153
- }
154
- if (currentTabName === SHARED_LABEL) {
155
- dateInput.root.style.removeProperty('display');
156
- authorInput.root.style.removeProperty('display');
157
- }
158
- return form;
159
- }));
160
- }
161
- ;
162
- showDeleteRunDialog(funcCall) {
163
- ui.dialog({ title: 'Delete run' })
164
- .add(ui.divText('The deleted run is impossible to restore. Are you sure?'))
165
- .onOK(() => __awaiter(this, void 0, void 0, function* () {
166
- this.beforeRunDeleted.next(funcCall.id);
167
- yield historyUtils.deleteRun(funcCall);
168
- this.afterRunDeleted.next(funcCall.id);
169
- }))
170
- .show({ center: true });
171
- }
172
- ;
173
- updateSharedPane(sharedRuns) {
174
- const sharedCards = (sharedRuns.length > 0) ? this.renderSharedCards(sharedRuns) : ui.divText('No runs are marked as shared', 'no-elements-label');
175
- const sharedTab = ui.divV([
176
- this.sharedPaneFilter,
177
- ui.element('div', 'splitbar-horizontal'),
178
- sharedCards
179
- ]);
180
- this.sharedTab.replaceWith(sharedTab);
181
- this.sharedTab = sharedTab;
182
- }
183
- ;
184
- updateFavoritesPane(favoriteRuns) {
185
- const favCards = (favoriteRuns.length > 0) ? this.renderFavoriteCards(favoriteRuns) : ui.divText('No runs are marked as favorites', 'no-elements-label');
186
- const favTab = ui.divV([
187
- this.favoritesPaneFilter,
188
- ui.element('div', 'splitbar-horizontal'),
189
- favCards
190
- ]);
191
- this.favTab.replaceWith(favTab);
192
- this.favTab = favTab;
193
- }
194
- ;
195
- updateMyPane(myRuns) {
196
- const myCards = (myRuns.length > 0) ? this.renderHistoryCards(myRuns) : ui.divText('No runs are found in history', 'no-elements-label');
197
- const newTab = ui.divV([
198
- this.myPaneFilter,
199
- ui.element('div', 'splitbar-horizontal'),
200
- myCards
201
- ]);
202
- this.historyTab.replaceWith(newTab);
203
- this.historyTab = newTab;
204
- }
205
- ;
206
- renderCard(funcCall) {
207
- var _a;
208
- const icon = funcCall.author.picture;
209
- icon.style.width = '25px';
210
- icon.style.height = '25px';
211
- icon.style.fontSize = '20px';
212
- const cardLabel = ui.label((_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : funcCall.author.friendlyName, { style: { 'color': 'var(--blue-1)' } });
213
- ui.bind(funcCall.author, icon);
214
- const editIcon = ui.iconFA('edit', (ev) => {
215
- ev.stopPropagation();
216
- this.showEditDialog(funcCall);
217
- });
218
- editIcon.classList.add('cv-funccall-card-hover-icon');
219
- const deleteIcon = ui.iconFA('trash-alt', (ev) => __awaiter(this, void 0, void 0, function* () {
220
- ev.stopPropagation();
221
- this.showDeleteRunDialog(funcCall);
222
- }), 'Delete the run');
223
- deleteIcon.classList.add('cv-funccall-card-hover-icon');
224
- const favoritedIcon = ui.iconFA('star', null, 'Unfavorite the run');
225
- favoritedIcon.classList.add('fas', 'cv-funccall-card-def-icon');
226
- const sharedIcon = ui.iconFA('share-alt', null, 'Add to shared');
227
- sharedIcon.classList.add('fas', 'cv-funccall-card-def-icon');
228
- sharedIcon.style.color = 'var(--blue-1)';
229
- const dateStarted = new Date(funcCall.started.toString()).toLocaleString('en-us', { month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric' });
230
- const card = ui.divH([
231
- ui.divH([
232
- icon,
233
- ui.divV([
234
- cardLabel,
235
- ui.span([dateStarted]),
236
- ...(funcCall.options['description']) ? [ui.divText(funcCall.options['description'], 'description')] : [],
237
- ...(funcCall.options['tags'] && funcCall.options['tags'].length > 0) ?
238
- [ui.div(funcCall.options['tags'].map((tag) => ui.span([tag], 'd4-tag')))] : [],
239
- ], 'cv-card-content'),
240
- ]),
241
- ui.divH([
242
- editIcon, deleteIcon,
243
- ...(funcCall.options['isFavorite']) ? [favoritedIcon] : [],
244
- ...(funcCall.options['isShared']) ? [sharedIcon] : [],
245
- ])
246
- ], 'cv-funccall-card');
247
- card.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
248
- this.onRunChosen.next(funcCall.id);
249
- const allCards = [...this.myCards, ...this.favoriteCards, ...this.sharedCards];
250
- allCards.forEach((c) => c.classList.remove('clicked'));
251
- card.classList.add('clicked');
252
- }));
253
- ui.tooltip.bind(card, () => ui.tableFromMap(Object.assign(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'] } : {}), (funcCall.options['tags'] && funcCall.options['tags'].length > 0) ?
254
- { 'Tags': ui.div(funcCall.options['tags'].map((tag) => ui.span([tag], 'd4-tag')), 'd4-tag-editor') } : {})));
255
- return card;
256
- }
257
- showEditDialog(funcCall) {
258
- var _a, _b, _c, _d;
259
- const dlg = ui.dialog({ title: 'Edit run' });
260
- let title = (_a = funcCall.options['title']) !== null && _a !== void 0 ? _a : '';
261
- let description = (_b = funcCall.options['description']) !== null && _b !== void 0 ? _b : '';
262
- const titleInput = ui.stringInput('Title', title, (s) => title = s);
263
- let isShared = (_c = funcCall.options['isShared']) !== null && _c !== void 0 ? _c : false;
264
- let isFavorite = (_d = funcCall.options['isFavorite']) !== null && _d !== void 0 ? _d : false;
265
- const tagsLine = DG.TagEditor.create();
266
- (funcCall.options['tags'] || []).forEach((tag) => {
267
- tagsLine.addTag(tag);
268
- });
269
- const dummyInput = ui.stringInput(' ', '');
270
- dummyInput.input.replaceWith(tagsLine.root);
271
- const tagInput = ui.stringInput('Tag', '');
272
- const addNewTag = () => {
273
- if (tagInput.value === '' ||
274
- // @ts-ignore
275
- tagsLine.tags.includes(tagInput.value))
276
- return;
277
- tagsLine.addTag(tagInput.value);
278
- tagInput.value = '';
279
- };
280
- tagInput.addOptions(ui.iconFA('plus', addNewTag));
281
- tagInput.input.onkeydown = (ev) => __awaiter(this, void 0, void 0, function* () {
282
- if (ev.key == 'Enter') {
283
- ev.stopPropagation();
284
- addNewTag();
285
- }
286
- });
287
- dlg.add(ui.form([
288
- titleInput,
289
- ui.stringInput('Description', description, (s) => { description = s; }),
290
- ui.boolInput('Favorites', isFavorite, (b) => isFavorite = b),
291
- ui.boolInput('Share', isShared, (b) => isShared = b),
292
- tagInput,
293
- dummyInput
294
- ]))
295
- .onOK(() => __awaiter(this, void 0, void 0, function* () {
296
- funcCall = yield historyUtils.loadRun(funcCall.id);
297
- funcCall.options['title'] = title !== '' ? title : null;
298
- funcCall.options['description'] = description !== '' ? description : null;
299
- funcCall.options['tags'] = tagsLine.tags;
300
- if (!!isShared === !!funcCall.options['isShared'] && !!isFavorite === !!funcCall.options['isFavorite']) {
301
- ui.setUpdateIndicator(this.tabs.root, true);
302
- yield historyUtils.saveRun(funcCall);
303
- const editedRun = this.store.allRuns.value.find((call) => call.id === funcCall.id);
304
- editedRun.options['title'] = title !== '' ? title : null;
305
- editedRun.options['description'] = description !== '' ? description : null;
306
- editedRun.options['tags'] = funcCall.options['tags'];
307
- this.store.allRuns.next(this.store.allRuns.value);
308
- ui.setUpdateIndicator(this.tabs.root, false);
309
- return;
310
- }
311
- if (isShared && !funcCall.options['isShared']) {
312
- funcCall.options['isShared'] = isShared;
313
- ui.setUpdateIndicator(this.tabs.root, true);
314
- yield this.addRunToShared(funcCall);
315
- ui.setUpdateIndicator(this.tabs.root, false);
316
- }
317
- if (!isShared && funcCall.options['isShared']) {
318
- funcCall.options['isShared'] = isShared;
319
- ui.setUpdateIndicator(this.tabs.root, true);
320
- yield this.removeRunFromShared(funcCall);
321
- ui.setUpdateIndicator(this.tabs.root, false);
322
- }
323
- if (isFavorite && !funcCall.options['isFavorite']) {
324
- funcCall.options['isFavorite'] = isFavorite;
325
- ui.setUpdateIndicator(this.tabs.root, true);
326
- yield this.addRunToFavorites(funcCall);
327
- ui.setUpdateIndicator(this.tabs.root, false);
328
- }
329
- if (!isFavorite && funcCall.options['isFavorite']) {
330
- funcCall.options['isFavorite'] = isFavorite;
331
- ui.setUpdateIndicator(this.tabs.root, true);
332
- yield this.removeRunFromFavorites(funcCall);
333
- ui.setUpdateIndicator(this.tabs.root, false);
334
- }
335
- }))
336
- .show({ center: true, width: 500 });
337
- }
338
- renderFavoriteCards(funcCalls) {
339
- this.favoriteCards = funcCalls.map((funcCall) => this.renderCard(funcCall));
340
- return ui.divV(this.favoriteCards);
341
- }
342
- ;
343
- renderSharedCards(funcCalls) {
344
- this.sharedCards = funcCalls.map((funcCall) => this.renderCard(funcCall));
345
- return ui.divV(this.sharedCards);
346
- }
347
- ;
348
- renderHistoryCards(funcCalls) {
349
- this.myCards = funcCalls.map((funcCall) => this.renderCard(funcCall));
350
- return ui.divV(this.myCards, { style: { height: '100%' } });
351
- }
352
- ;
353
- constructor(func) {
354
- this.func = func;
355
- // Emitted when FuncCall should is chosen. Contains FuncCall ID
356
- this.onRunChosen = new Subject();
357
- // Emitted when FuncCall is added to favorites
358
- this.beforeRunAddToFavorites = new Subject();
359
- // Emitted when FuncCall is added to shared
360
- this.beforeRunAddToShared = new Subject();
361
- // Emitted when FuncCall is removed from favorites
362
- this.beforeRunRemoveFromFavorites = new Subject();
363
- // Emitted when FuncCall is removed from shared
364
- this.beforeRunRemoveFromShared = new Subject();
365
- // Emitted when FuncCall is deleted
366
- this.beforeRunDeleted = new Subject();
367
- // Emitted when FuncCall is added to favorites
368
- this.afterRunAddToFavorites = new Subject();
369
- // Emitted when FuncCall is added to shared
370
- this.afterRunAddToShared = new Subject();
371
- // Emitted when FuncCall is removed from favorites
372
- this.afterRunRemoveFromFavorites = new Subject();
373
- // Emitted when FuncCall is removed from shared
374
- this.afterRunRemoveFromShared = new Subject();
375
- // Emitted when FuncCall is deleted
376
- this.afterRunDeleted = new Subject();
377
- this.store = new HistoryPanelStore();
378
- this.myRunsFilter = new Subject();
379
- this.favRunsFilter = new Subject();
380
- this.sharedRunsFilter = new Subject();
381
- this.allRunsFetch = new Subject();
382
- this.historyTab = ui.div();
383
- this.favTab = ui.div();
384
- this.sharedTab = ui.div();
385
- this.filterPane = ui.div();
386
- this.tabs = ui.tabControl({
387
- [MY_PANE_LABEL]: ui.box(this.historyTab),
388
- [FAVORITES_LABEL]: ui.box(this.favTab),
389
- [SHARED_LABEL]: ui.box(this.sharedTab),
390
- });
391
- this._root = ui.divV([
392
- this.tabs.root,
393
- ], { style: { width: '100%', height: '100%' } });
394
- this.myCards = [];
395
- this.favoriteCards = [];
396
- this.sharedCards = [];
397
- this.myPaneFilter = this.buildFilterPane(MY_PANE_LABEL);
398
- this.favoritesPaneFilter = this.buildFilterPane(FAVORITES_LABEL);
399
- this.sharedPaneFilter = this.buildFilterPane(SHARED_LABEL);
400
- this.tabs.root.style.width = '100%';
401
- this.tabs.root.style.height = '100%';
402
- this.myRunsFilter.subscribe(() => this.updateMyPane(this.store.filteredMyRuns));
403
- this.favRunsFilter.subscribe(() => this.updateFavoritesPane(this.store.filteredFavoriteRuns));
404
- this.sharedRunsFilter.subscribe(() => this.updateSharedPane(this.store.filteredSharedRuns));
405
- this.store.allRuns.subscribe(() => {
406
- this.updateMyPane(this.store.filteredMyRuns);
407
- this.updateFavoritesPane(this.store.filteredFavoriteRuns);
408
- this.updateSharedPane(this.store.filteredSharedRuns);
409
- });
410
- this.allRunsFetch.subscribe(() => __awaiter(this, void 0, void 0, function* () {
411
- ui.setUpdateIndicator(this.root, true);
412
- const allRuns = (yield historyUtils.pullRunsByName(this.func.name, [], { order: 'started' }, ['session.user', 'options'])).reverse();
413
- this.store.allRuns.next(allRuns);
414
- ui.setUpdateIndicator(this.root, false);
415
- }));
416
- this.afterRunAddToFavorites.subscribe((added) => {
417
- const editedRun = this.store.allRuns.value.find((call) => call.id === added.id);
418
- editedRun.options['title'] = added.options['title'];
419
- editedRun.options['description'] = added.options['description'];
420
- editedRun.options['isFavorite'] = true;
421
- this.store.allRuns.next(this.store.allRuns.value);
422
- });
423
- this.afterRunAddToShared.subscribe((added) => {
424
- const editedRun = this.store.allRuns.value.find((call) => call.id === added.id);
425
- editedRun.options['title'] = added.options['title'];
426
- editedRun.options['description'] = added.options['description'];
427
- editedRun.options['isShared'] = true;
428
- this.store.allRuns.next(this.store.allRuns.value);
429
- });
430
- this.afterRunRemoveFromFavorites.subscribe((removed) => {
431
- const editedRun = this.store.allRuns.value.find((call) => call.id === removed.id);
432
- editedRun.options['title'] = removed.options['title'];
433
- editedRun.options['description'] = removed.options['description'];
434
- editedRun.options['isFavorite'] = false;
435
- this.store.allRuns.next(this.store.allRuns.value);
436
- });
437
- this.afterRunRemoveFromShared.subscribe((removed) => {
438
- const editedRun = this.store.allRuns.value.find((call) => call.id === removed.id);
439
- editedRun.options['title'] = removed.options['title'];
440
- editedRun.options['description'] = removed.options['description'];
441
- editedRun.options['isShared'] = false;
442
- this.store.allRuns.next(this.store.allRuns.value);
443
- });
444
- this.afterRunDeleted.subscribe((id) => {
445
- this.store.allRuns.next(this.store.allRuns.value.filter((call) => call.id !== id));
446
- });
447
- this.allRunsFetch.next();
448
- }
449
- addRunToFavorites(callToFavorite) {
450
- return __awaiter(this, void 0, void 0, function* () {
451
- callToFavorite.options['isFavorite'] = true;
452
- this.beforeRunAddToFavorites.next(callToFavorite);
453
- const savedFavorite = yield grok.dapi.functions.calls.allPackageVersions().save(callToFavorite);
454
- this.afterRunAddToFavorites.next(savedFavorite);
455
- return savedFavorite;
456
- });
457
- }
458
- removeRunFromFavorites(callToUnfavorite) {
459
- return __awaiter(this, void 0, void 0, function* () {
460
- callToUnfavorite.options['isFavorite'] = false;
461
- this.beforeRunRemoveFromFavorites.next(callToUnfavorite);
462
- const favoriteSave = yield grok.dapi.functions.calls.allPackageVersions().save(callToUnfavorite);
463
- this.afterRunRemoveFromFavorites.next(favoriteSave);
464
- return favoriteSave;
465
- });
466
- }
467
- addRunToShared(callToShare) {
468
- return __awaiter(this, void 0, void 0, function* () {
469
- callToShare.options['isShared'] = true;
470
- this.beforeRunAddToShared.next(callToShare);
471
- const allGroup = yield grok.dapi.groups.find(defaultGroupsIds['All users']);
472
- const dfOutputs = wu(callToShare.outputParams.values())
473
- .filter((output) => output.property.propertyType === DG.TYPE.DATA_FRAME);
474
- for (const output of dfOutputs) {
475
- const df = callToShare.outputs[output.name];
476
- yield grok.dapi.permissions.grant(df.getTableInfo(), allGroup, false);
477
- }
478
- const dfInputs = wu(callToShare.inputParams.values())
479
- .filter((input) => input.property.propertyType === DG.TYPE.DATA_FRAME);
480
- for (const input of dfInputs) {
481
- const df = callToShare.inputs[input.name];
482
- yield grok.dapi.permissions.grant(df.getTableInfo(), allGroup, false);
483
- }
484
- const savedShared = yield grok.dapi.functions.calls.allPackageVersions().save(callToShare);
485
- this.afterRunAddToShared.next(savedShared);
486
- return savedShared;
487
- });
488
- }
489
- removeRunFromShared(callToUnshare) {
490
- return __awaiter(this, void 0, void 0, function* () {
491
- callToUnshare.options['isShared'] = false;
492
- this.beforeRunRemoveFromShared.next(callToUnshare);
493
- const savedShared = yield grok.dapi.functions.calls.allPackageVersions().save(callToUnshare);
494
- this.afterRunRemoveFromShared.next(savedShared);
495
- return savedShared;
496
- });
497
- }
498
- get root() {
499
- return this._root;
500
- }
501
- }
502
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhpc3RvcnktcGFuZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sNkJBQTZCLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLE1BQU0sRUFBRSxzQ0FBc0M7SUFDOUMsT0FBTyxFQUFFLHNDQUFzQztJQUMvQyxRQUFRLEVBQUUsc0NBQXNDO0NBQ2pELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELFlBQVksRUFBRSxzQ0FBc0M7SUFDcEQsZ0JBQWdCLEVBQUUsc0NBQXNDO0lBQ3hELE1BQU0sRUFBRSxzQ0FBc0M7SUFDOUMsT0FBTyxFQUFFLHNDQUFzQztJQUMvQyxRQUFRLEVBQUUsc0NBQXNDO0lBQ2hELGdCQUFnQixFQUFFLHNDQUFzQztDQUN6RCxDQUFDO0FBRUYsTUFBTSxpQkFBaUI7SUFBdkI7UUFDRSxxQkFBZ0IsR0FBRyxFQUFDLElBQUksRUFBRSxFQUFFLEVBSzNCLENBQUM7UUFFRixZQUFPLEdBQUcsSUFBSSxlQUFlLENBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBcURuRCxDQUFDO0lBbkRDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFB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RUFBRSxLQUFLLENBQUMsQ0FBQzthQUN2RTtZQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0MsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztLQUFBO0lBRWEsbUJBQW1CLENBQUMsYUFBMEI7O1lBQzFELGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBRTFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO0tBQUE7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgd3UgZnJvbSAnd3UnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtoaXN0b3J5VXRpbHN9IGZyb20gJy4uL2hpc3RvcnktdXRpbHMnO1xuaW1wb3J0ICcuLi8uLi9jc3MvaGlzdG9yeS1wYW5lbC5jc3MnO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFVzZXJzSWRzID0ge1xuICAnVGVzdCc6ICdjYTFlNjcyZS1lM2JlLTQwZTAtYjc5Yi1kMmM2OGU2OGQzODAnLFxuICAnQWRtaW4nOiAnODc4YzQyYjAtOWE1MC0xMWU2LWM1MzctNmJmOGU5YWIwMmVlJyxcbiAgJ1N5c3RlbSc6ICczZTMyYzVmYS1hYzljLTRkMzktOGI0Yi00ZGIzZTU3NmIzYzMnLFxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cHNJZHMgPSB7XG4gICdBbGwgdXNlcnMnOiAnYTRiNDU4NDAtOWE1MC0xMWU2LTljYzktODU0NmI4YmY2MmU2JyxcbiAgJ0RldmVsb3BlcnMnOiAnYmE5Y2QxOTEtOWE1MC0xMWU2LTljYzktOTEwYmY4MjdmMGFiJyxcbiAgJ05lZWQgdG8gY3JlYXRlJzogJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsXG4gICdUZXN0JzogJ2NhMWU2NzJlLWUzYmUtNDBlMC1iNzliLTg1NDZiOGJmNjJlNicsXG4gICdBZG1pbic6ICdhNGI0NTg0MC05YTUwLTExZTYtYzUzNy02YmY4ZTlhYjAyZWUnLFxuICAnU3lzdGVtJzogJ2E0YjQ1ODQwLWFjOWMtNGQzOS04YjRiLTRkYjNlNTc2YjNjMycsXG4gICdBZG1pbmlzdHJhdG9ycyc6ICcxYWI4YjM4ZC05YzRlLTRiMWUtODFjMy1hZTJiZGUzZTEyYzUnLFxufTtcblxuY2xhc3MgSGlzdG9yeVBhbmVsU3RvcmUge1xuICBmaWx0ZXJpbmdPcHRpb25zID0ge3RleHQ6ICcnfSBhcyB7XG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGF1dGhvcj86IERHLlVzZXIsXG4gICAgc3RhcnRlZEFmdGVyPzogZGF5anMuRGF5anMsXG4gICAgdGFncz86IHN0cmluZ1tdXG4gIH07XG5cbiAgYWxsUnVucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8REcuRnVuY0NhbGxbXT4oW10pO1xuXG4gIGdldCBteVJ1bnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsUnVucy52YWx1ZS5maWx0ZXIoKHJ1bikgPT4gcnVuLmF1dGhvci5pZCA9PT0gZ3Jvay5zaGVsbC51c2VyLmlkKTtcbiAgfVxuXG4gIGdldCBmYXZvcml0ZVJ1bnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsUnVucy52YWx1ZS5maWx0ZXIoKHJ1bikgPT4gcnVuLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSAmJiAhcnVuLm9wdGlvbnNbJ2lzSW1wb3J0ZWQnXSk7XG4gIH1cblxuICBnZXQgc2hhcmVkUnVucygpIHtcbiAgICByZXR1cm4gdGhpcy5hbGxSdW5zLnZhbHVlLmZpbHRlcigocnVuKSA9PiBydW4ub3B0aW9uc1snaXNTaGFyZWQnXSk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRNeVJ1bnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubXlSdW5zLmZpbHRlcigocnVuKSA9PiB7XG4gICAgICBjb25zdCBzdGFydGVkQWZ0ZXIgPSAodGhpcy5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA/IHJ1bi5zdGFydGVkID4gdGhpcy5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA6IHRydWUpO1xuICAgICAgY29uc3QgdGl0bGVDb250YWluc1RleHQgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCkgPyB0cnVlIDogKCEhcnVuLm9wdGlvbnNbJ3RpdGxlJ10pID8gcnVuLm9wdGlvbnNbJ3RpdGxlJ10uaW5jbHVkZXModGhpcy5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiBmYWxzZTtcbiAgICAgIGNvbnN0IGRlc2NDb250YWluc1RleHQgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCkgPyB0cnVlIDogKCEhcnVuLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10pID8gcnVuLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uaW5jbHVkZXModGhpcy5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiBmYWxzZTtcblxuXG4gICAgICBjb25zdCBoYXNUYWdzID0gKCF0aGlzLmZpbHRlcmluZ09wdGlvbnMudGFncyB8fCB0aGlzLmZpbHRlcmluZ09wdGlvbnMudGFncy5sZW5ndGggPT09IDApID8gdHJ1ZSA6XG4gICAgICAgICghIXJ1bi5vcHRpb25zWyd0YWdzJ10pID8gdGhpcy5maWx0ZXJpbmdPcHRpb25zLnRhZ3MuZXZlcnkoKHNlYXJjaGVkVGFnKSA9PiBydW4ub3B0aW9uc1sndGFncyddLmluY2x1ZGVzKHNlYXJjaGVkVGFnKSk6IGZhbHNlO1xuXG4gICAgICByZXR1cm4gKHRpdGxlQ29udGFpbnNUZXh0IHx8IGRlc2NDb250YWluc1RleHQpICYmIHN0YXJ0ZWRBZnRlciAmJiBoYXNUYWdzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkRmF2b3JpdGVSdW5zKCkge1xuICAgIHJldHVybiB0aGlzLmZhdm9yaXRlUnVucy5maWx0ZXIoKHJ1bikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRlZEFmdGVyID0gKHRoaXMuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgPyBydW4uc3RhcnRlZCA+IHRoaXMuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgOiB0cnVlKTtcbiAgICAgIGNvbnN0IHRpdGxlQ29udGFpbnNUZXh0ID0gKCF0aGlzLmZpbHRlcmluZ09wdGlvbnMudGV4dC5sZW5ndGgpID8gdHJ1ZSA6ICghIXJ1bi5vcHRpb25zWyd0aXRsZSddKSA/IHJ1bi5vcHRpb25zWyd0aXRsZSddLmluY2x1ZGVzKHRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTogZmFsc2U7XG4gICAgICBjb25zdCBkZXNjQ29udGFpbnNUZXh0ID0gKCF0aGlzLmZpbHRlcmluZ09wdGlvbnMudGV4dC5sZW5ndGgpID8gdHJ1ZSA6ICghIXJ1bi5vcHRpb25zWydkZXNjcmlwdGlvbiddKSA/IHJ1bi5vcHRpb25zWydkZXNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0KTogZmFsc2U7XG4gICAgICBjb25zdCBoYXNUYWdzID0gKCF0aGlzLmZpbHRlcmluZ09wdGlvbnMudGFncyB8fCB0aGlzLmZpbHRlcmluZ09wdGlvbnMudGFncy5sZW5ndGggPT09IDApID8gdHJ1ZSA6XG4gICAgICAgICghIXJ1bi5vcHRpb25zWyd0YWdzJ10pID8gdGhpcy5maWx0ZXJpbmdPcHRpb25zLnRhZ3MuZXZlcnkoKHNlYXJjaGVkVGFnKSA9PiBydW4ub3B0aW9uc1sndGFncyddLmluY2x1ZGVzKHNlYXJjaGVkVGFnKSk6IGZhbHNlO1xuXG4gICAgICByZXR1cm4gKHRpdGxlQ29udGFpbnNUZXh0IHx8IGRlc2NDb250YWluc1RleHQpICYmIHN0YXJ0ZWRBZnRlciAmJiBoYXNUYWdzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkU2hhcmVkUnVucygpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRSdW5zLmZpbHRlcigocnVuKSA9PiB7XG4gICAgICBjb25zdCBpc0F1dGhvcmVkID0gdGhpcy5maWx0ZXJpbmdPcHRpb25zLmF1dGhvciA/IHJ1bi5hdXRob3IuaWQgPT09IHRoaXMuZmlsdGVyaW5nT3B0aW9ucy5hdXRob3IuaWQ6IHRydWU7XG4gICAgICBjb25zdCBzdGFydGVkQWZ0ZXIgPSAodGhpcy5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA/IHJ1bi5zdGFydGVkID4gdGhpcy5maWx0ZXJpbmdPcHRpb25zLnN0YXJ0ZWRBZnRlciA6IHRydWUpO1xuICAgICAgY29uc3QgdGl0bGVDb250YWluc1RleHQgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCkgPyB0cnVlIDogKCEhcnVuLm9wdGlvbnNbJ3RpdGxlJ10pID8gcnVuLm9wdGlvbnNbJ3RpdGxlJ10uaW5jbHVkZXModGhpcy5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiBmYWxzZTtcbiAgICAgIGNvbnN0IGRlc2NDb250YWluc1RleHQgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50ZXh0Lmxlbmd0aCkgPyB0cnVlIDogKCEhcnVuLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10pID8gcnVuLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10uaW5jbHVkZXModGhpcy5maWx0ZXJpbmdPcHRpb25zLnRleHQpOiBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1RhZ3MgPSAoIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy50YWdzIHx8IHRoaXMuZmlsdGVyaW5nT3B0aW9ucy50YWdzLmxlbmd0aCA9PT0gMCkgPyB0cnVlIDpcbiAgICAgICAgKCEhcnVuLm9wdGlvbnNbJ3RhZ3MnXSkgPyB0aGlzLmZpbHRlcmluZ09wdGlvbnMudGFncy5ldmVyeSgoc2VhcmNoZWRUYWcpID0+IHJ1bi5vcHRpb25zWyd0YWdzJ10uaW5jbHVkZXMoc2VhcmNoZWRUYWcpKTogZmFsc2U7XG5cblxuICAgICAgcmV0dXJuICh0aXRsZUNvbnRhaW5zVGV4dCB8fCBkZXNjQ29udGFpbnNUZXh0KSAmJiBzdGFydGVkQWZ0ZXIgJiYgaXNBdXRob3JlZCAmJiBoYXNUYWdzO1xuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IE1ZX1BBTkVfTEFCRUwgPSAnSElTVE9SWScgYXMgY29uc3Q7XG5jb25zdCBGQVZPUklURVNfTEFCRUwgPSAnRkFWT1JJVEVTJyBhcyBjb25zdDtcbmNvbnN0IFNIQVJFRF9MQUJFTCA9ICdTSEFSRUQnIGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgSGlzdG9yeVBhbmVsIHtcbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIHNob3VsZCBpcyBjaG9zZW4uIENvbnRhaW5zIEZ1bmNDYWxsIElEXG4gIHB1YmxpYyBvblJ1bkNob3NlbiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgYWRkZWQgdG8gZmF2b3JpdGVzXG4gIHB1YmxpYyBiZWZvcmVSdW5BZGRUb0Zhdm9yaXRlcyA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBhZGRlZCB0byBzaGFyZWRcbiAgcHVibGljIGJlZm9yZVJ1bkFkZFRvU2hhcmVkID0gbmV3IFN1YmplY3Q8REcuRnVuY0NhbGw+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXNcbiAgcHVibGljIGJlZm9yZVJ1blJlbW92ZUZyb21GYXZvcml0ZXMgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgcmVtb3ZlZCBmcm9tIHNoYXJlZFxuICBwdWJsaWMgYmVmb3JlUnVuUmVtb3ZlRnJvbVNoYXJlZCA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBkZWxldGVkXG4gIHB1YmxpYyBiZWZvcmVSdW5EZWxldGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyBhZGRlZCB0byBmYXZvcml0ZXNcbiAgcHVibGljIGFmdGVyUnVuQWRkVG9GYXZvcml0ZXMgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgYWRkZWQgdG8gc2hhcmVkXG4gIHB1YmxpYyBhZnRlclJ1bkFkZFRvU2hhcmVkID0gbmV3IFN1YmplY3Q8REcuRnVuY0NhbGw+KCk7XG5cbiAgLy8gRW1pdHRlZCB3aGVuIEZ1bmNDYWxsIGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXNcbiAgcHVibGljIGFmdGVyUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcyA9IG5ldyBTdWJqZWN0PERHLkZ1bmNDYWxsPigpO1xuXG4gIC8vIEVtaXR0ZWQgd2hlbiBGdW5jQ2FsbCBpcyByZW1vdmVkIGZyb20gc2hhcmVkXG4gIHB1YmxpYyBhZnRlclJ1blJlbW92ZUZyb21TaGFyZWQgPSBuZXcgU3ViamVjdDxERy5GdW5jQ2FsbD4oKTtcblxuICAvLyBFbWl0dGVkIHdoZW4gRnVuY0NhbGwgaXMgZGVsZXRlZFxuICBwdWJsaWMgYWZ0ZXJSdW5EZWxldGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgc3RvcmUgPSBuZXcgSGlzdG9yeVBhbmVsU3RvcmUoKTtcblxuICBwcml2YXRlIG15UnVuc0ZpbHRlciA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG4gIHByaXZhdGUgZmF2UnVuc0ZpbHRlciA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG4gIHByaXZhdGUgc2hhcmVkUnVuc0ZpbHRlciA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG5cbiAgcHVibGljIGFsbFJ1bnNGZXRjaCA9IG5ldyBTdWJqZWN0PHRydWU+KCk7XG5cbiAgaGlzdG9yeVRhYiA9IHVpLmRpdigpO1xuICBmYXZUYWIgPSB1aS5kaXYoKTtcbiAgc2hhcmVkVGFiID0gdWkuZGl2KCk7XG4gIGZpbHRlclBhbmUgPSB1aS5kaXYoKTtcbiAgdGFicyA9IHVpLnRhYkNvbnRyb2woe1xuICAgIFtNWV9QQU5FX0xBQkVMXTogdWkuYm94KHRoaXMuaGlzdG9yeVRhYiksXG4gICAgW0ZBVk9SSVRFU19MQUJFTF06IHVpLmJveCh0aGlzLmZhdlRhYiksXG4gICAgW1NIQVJFRF9MQUJFTF06IHVpLmJveCh0aGlzLnNoYXJlZFRhYiksXG4gIH0pO1xuXG4gIHByaXZhdGUgX3Jvb3QgPSB1aS5kaXZWKFtcbiAgICB0aGlzLnRhYnMucm9vdCxcbiAgXSwge3N0eWxlOiB7d2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJSd9fSk7XG5cbiAgbXlDYXJkcyA9IFtdIGFzIEhUTUxFbGVtZW50W107XG4gIGZhdm9yaXRlQ2FyZHMgPSBbXSBhcyBIVE1MRWxlbWVudFtdO1xuICBzaGFyZWRDYXJkcyA9IFtdIGFzIEhUTUxFbGVtZW50W107XG5cbiAgYnVpbGRGaWx0ZXJQYW5lKGN1cnJlbnRUYWJOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdWkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJpbmdUZXh0ID0gbmV3IFN1YmplY3QoKTtcblxuICAgICAgY29uc3QgdGV4dElucHV0ID0gdWkuc3RyaW5nSW5wdXQoJ1NlYXJjaCcsICcnLCAodjogc3RyaW5nKSA9PiBmaWx0ZXJpbmdUZXh0Lm5leHQodikpO1xuICAgICAgREcuZGVib3VuY2UoZmlsdGVyaW5nVGV4dC5hc09ic2VydmFibGUoKSwgNjAwKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JlLmZpbHRlcmluZ09wdGlvbnMudGV4dCA9IHRleHRJbnB1dC5zdHJpbmdWYWx1ZTtcbiAgICAgICAgdGhpcy5teVJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICB0aGlzLmZhdlJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgICB0aGlzLnNoYXJlZFJ1bnNGaWx0ZXIubmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGVJbnB1dCA9IHVpLmRhdGVJbnB1dCgnU3RhcnRlZCBhZnRlcicsIGRheWpzKCkuc3VidHJhY3QoMSwgJ3dlZWsnKSwgKHY6IGRheWpzLkRheWpzKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmUuZmlsdGVyaW5nT3B0aW9ucy5zdGFydGVkQWZ0ZXIgPSB2O1xuICAgICAgICB0aGlzLm15UnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgIHRoaXMuZmF2UnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICAgIHRoaXMuc2hhcmVkUnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGVmYXVsdFVzZXJzID0gT2JqZWN0LnZhbHVlcyhkZWZhdWx0VXNlcnNJZHMpO1xuICAgICAgY29uc3QgYWxsVXNlcnMgPSBhd2FpdCBncm9rLmRhcGkudXNlcnMubGlzdCgpIGFzIERHLlVzZXJbXTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkVXNlcnMgPSBhbGxVc2Vycy5maWx0ZXIoKHVzZXIpID0+ICFkZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlci5pZCkpO1xuXG4gICAgICBjb25zdCBhdXRob3JJbnB1dCA9IHVpLmNob2ljZUlucHV0PERHLlVzZXIgfCBzdHJpbmc+KCdBdXRob3InLCAnQW55b25lJywgWydBbnlvbmUnLCAuLi5maWx0ZXJlZFVzZXJzXSwgKHY6IERHLlVzZXIgfCBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLmF1dGhvciA9ICh2ID09PSAnQW55b25lJykgPyB1bmRlZmluZWQgOiB2IGFzIERHLlVzZXI7XG4gICAgICAgIHRoaXMuc2hhcmVkUnVuc0ZpbHRlci5uZXh0KCk7XG4gICAgICB9KTtcbiAgICAgIGF1dGhvcklucHV0LnJvb3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgbGV0IHRhZ0lucHV0ID0gdWkuY2hvaWNlSW5wdXQ8c3RyaW5nPignVGFnJywgJ0Nob29zZSB0YWcgdG8gZmlsdGVyJywgWydDaG9vc2UgdGFnIHRvIGZpbHRlciddKTtcblxuICAgICAgY29uc3QgZmlsdGVyVGFnRWRpdG9yID0gREcuVGFnRWRpdG9yLmNyZWF0ZSgpO1xuICAgICAgY29uc3QgZHVtbXlJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCcgJywgJycpO1xuICAgICAgZHVtbXlJbnB1dC5pbnB1dC5yZXBsYWNlV2l0aChmaWx0ZXJUYWdFZGl0b3Iucm9vdCk7XG5cbiAgICAgIGZpbHRlclRhZ0VkaXRvci5vbkNoYW5nZWQoKCkgPT4ge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zdG9yZS5maWx0ZXJpbmdPcHRpb25zLnRhZ3MgPSBmaWx0ZXJUYWdFZGl0b3IudGFncy5maWx0ZXIoKHRhZykgPT4gISF0YWcpO1xuXG4gICAgICAgIHRoaXMubXlSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgICAgdGhpcy5mYXZSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgICAgdGhpcy5zaGFyZWRSdW5zRmlsdGVyLm5leHQoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN0b3JlLmFsbFJ1bnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgdGFncyA9IHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZVxuICAgICAgICAgIC5tYXAoKHJ1bikgPT4gcnVuLm9wdGlvbnNbJ3RhZ3MnXSBhcyBzdHJpbmdbXSlcbiAgICAgICAgICAucmVkdWNlKChhY2MsIHJ1blRhZ3MpID0+IHtcbiAgICAgICAgICAgIGlmICghIXJ1blRhZ3MpIHJ1blRhZ3MuZm9yRWFjaCgocnVuVGFnKSA9PiB7IGlmICghYWNjLmluY2x1ZGVzKHJ1blRhZykpIGFjYy5wdXNoKHJ1blRhZyk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCBbXSBhcyBzdHJpbmdbXSk7XG5cbiAgICAgICAgY29uc3QgbmV3VGFnSW5wdXQgPSB1aS5jaG9pY2VJbnB1dDxzdHJpbmc+KCdUYWcnLCAnQ2hvb3NlIHRhZyB0byBmaWx0ZXInLCBbJ0Nob29zZSB0YWcgdG8gZmlsdGVyJywgLi4udGFnc10pO1xuICAgICAgICB0YWdJbnB1dC5yb290LnJlcGxhY2VXaXRoKG5ld1RhZ0lucHV0LnJvb3QpO1xuICAgICAgICB0YWdJbnB1dCA9IG5ld1RhZ0lucHV0O1xuXG4gICAgICAgIHRhZ0lucHV0Lm9uQ2hhbmdlZCgoKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnSW5wdXQudmFsdWUgJiZcbiAgICAgICAgICAgIHRhZ0lucHV0LnZhbHVlICE9PSAnQ2hvb3NlIHRhZyB0byBmaWx0ZXInICYmXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICFmaWx0ZXJUYWdFZGl0b3IudGFncy5pbmNsdWRlcyh0YWdJbnB1dC52YWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBmaWx0ZXJUYWdFZGl0b3IuYWRkVGFnKHRhZ0lucHV0LnZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGF0ZUlucHV0LmFkZFBhdHRlcm5NZW51KCdkYXRldGltZScpO1xuICAgICAgY29uc3QgZm9ybSA9IHVpLmRpdlYoW1xuICAgICAgICB0ZXh0SW5wdXQsXG4gICAgICAgIGRhdGVJbnB1dCxcbiAgICAgICAgYXV0aG9ySW5wdXQsXG4gICAgICAgIHRhZ0lucHV0LFxuICAgICAgICBkdW1teUlucHV0LFxuICAgICAgXSwgJ3VpLWZvcm0gdWktZm9ybS13aWRlIHVpLWZvcm0tbGVmdCcpO1xuXG4gICAgICBpZiAoY3VycmVudFRhYk5hbWUgPT09IE1ZX1BBTkVfTEFCRUwpIHtcbiAgICAgICAgZGF0ZUlucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRUYWJOYW1lID09PSBGQVZPUklURVNfTEFCRUwpIHtcbiAgICAgICAgZGF0ZUlucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRUYWJOYW1lID09PSBTSEFSRURfTEFCRUwpIHtcbiAgICAgICAgZGF0ZUlucHV0LnJvb3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICAgICAgYXV0aG9ySW5wdXQucm9vdC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9KTtcbiAgfTtcblxuICBteVBhbmVGaWx0ZXIgPSB0aGlzLmJ1aWxkRmlsdGVyUGFuZShNWV9QQU5FX0xBQkVMKTtcbiAgZmF2b3JpdGVzUGFuZUZpbHRlciA9dGhpcy5idWlsZEZpbHRlclBhbmUoRkFWT1JJVEVTX0xBQkVMKTtcbiAgc2hhcmVkUGFuZUZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXJQYW5lKFNIQVJFRF9MQUJFTCk7XG5cbiAgc2hvd0RlbGV0ZVJ1bkRpYWxvZyhmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICB1aS5kaWFsb2coe3RpdGxlOiAnRGVsZXRlIHJ1bid9KVxuICAgICAgLmFkZCh1aS5kaXZUZXh0KCdUaGUgZGVsZXRlZCBydW4gaXMgaW1wb3NzaWJsZSB0byByZXN0b3JlLiBBcmUgeW91IHN1cmU/JykpXG4gICAgICAub25PSyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuYmVmb3JlUnVuRGVsZXRlZC5uZXh0KGZ1bmNDYWxsLmlkKTtcbiAgICAgICAgYXdhaXQgaGlzdG9yeVV0aWxzLmRlbGV0ZVJ1bihmdW5jQ2FsbCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJSdW5EZWxldGVkLm5leHQoZnVuY0NhbGwuaWQpO1xuICAgICAgfSlcbiAgICAgIC5zaG93KHtjZW50ZXI6IHRydWV9KTtcbiAgfTtcblxuICB1cGRhdGVTaGFyZWRQYW5lKHNoYXJlZFJ1bnM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICBjb25zdCBzaGFyZWRDYXJkcyA9IChzaGFyZWRSdW5zLmxlbmd0aCA+IDApID8gdGhpcy5yZW5kZXJTaGFyZWRDYXJkcyhzaGFyZWRSdW5zKSA6IHVpLmRpdlRleHQoJ05vIHJ1bnMgYXJlIG1hcmtlZCBhcyBzaGFyZWQnLCAnbm8tZWxlbWVudHMtbGFiZWwnKTtcbiAgICBjb25zdCBzaGFyZWRUYWIgPSB1aS5kaXZWKFtcbiAgICAgIHRoaXMuc2hhcmVkUGFuZUZpbHRlcixcbiAgICAgIHVpLmVsZW1lbnQoJ2RpdicsICdzcGxpdGJhci1ob3Jpem9udGFsJyksXG4gICAgICBzaGFyZWRDYXJkc1xuICAgIF0pO1xuICAgIHRoaXMuc2hhcmVkVGFiLnJlcGxhY2VXaXRoKHNoYXJlZFRhYik7XG4gICAgdGhpcy5zaGFyZWRUYWIgPSBzaGFyZWRUYWI7XG4gIH07XG5cbiAgdXBkYXRlRmF2b3JpdGVzUGFuZShmYXZvcml0ZVJ1bnM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICBjb25zdCBmYXZDYXJkcyA9IChmYXZvcml0ZVJ1bnMubGVuZ3RoID4gMCkgPyB0aGlzLnJlbmRlckZhdm9yaXRlQ2FyZHMoZmF2b3JpdGVSdW5zKSA6IHVpLmRpdlRleHQoJ05vIHJ1bnMgYXJlIG1hcmtlZCBhcyBmYXZvcml0ZXMnLCAnbm8tZWxlbWVudHMtbGFiZWwnKTtcbiAgICBjb25zdCBmYXZUYWIgPSB1aS5kaXZWKFtcbiAgICAgIHRoaXMuZmF2b3JpdGVzUGFuZUZpbHRlcixcbiAgICAgIHVpLmVsZW1lbnQoJ2RpdicsICdzcGxpdGJhci1ob3Jpem9udGFsJyksXG4gICAgICBmYXZDYXJkc1xuICAgIF0pO1xuICAgIHRoaXMuZmF2VGFiLnJlcGxhY2VXaXRoKGZhdlRhYik7XG4gICAgdGhpcy5mYXZUYWIgPSBmYXZUYWI7XG4gIH07XG5cbiAgdXBkYXRlTXlQYW5lKG15UnVuczogREcuRnVuY0NhbGxbXSkge1xuICAgIGNvbnN0IG15Q2FyZHMgPSAobXlSdW5zLmxlbmd0aCA+IDApID8gdGhpcy5yZW5kZXJIaXN0b3J5Q2FyZHMobXlSdW5zKSA6IHVpLmRpdlRleHQoJ05vIHJ1bnMgYXJlIGZvdW5kIGluIGhpc3RvcnknLCAnbm8tZWxlbWVudHMtbGFiZWwnKTtcbiAgICBjb25zdCBuZXdUYWIgPSB1aS5kaXZWKFtcbiAgICAgIHRoaXMubXlQYW5lRmlsdGVyLFxuICAgICAgdWkuZWxlbWVudCgnZGl2JywgJ3NwbGl0YmFyLWhvcml6b250YWwnKSxcbiAgICAgIG15Q2FyZHNcbiAgICBdKTtcbiAgICB0aGlzLmhpc3RvcnlUYWIucmVwbGFjZVdpdGgobmV3VGFiKTtcbiAgICB0aGlzLmhpc3RvcnlUYWIgPSBuZXdUYWI7XG4gIH07XG5cbiAgcmVuZGVyQ2FyZChmdW5jQ2FsbDogREcuRnVuY0NhbGwpIHtcbiAgICBjb25zdCBpY29uID0gZnVuY0NhbGwuYXV0aG9yLnBpY3R1cmUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWNvbi5zdHlsZS53aWR0aCA9ICcyNXB4JztcbiAgICBpY29uLnN0eWxlLmhlaWdodCA9ICcyNXB4JztcbiAgICBpY29uLnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xuICAgIGNvbnN0IGNhcmRMYWJlbCA9IHVpLmxhYmVsKGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPz8gZnVuY0NhbGwuYXV0aG9yLmZyaWVuZGx5TmFtZSwge3N0eWxlOiB7J2NvbG9yJzogJ3ZhcigtLWJsdWUtMSknfX0pO1xuICAgIHVpLmJpbmQoZnVuY0NhbGwuYXV0aG9yLCBpY29uKTtcblxuICAgIGNvbnN0IGVkaXRJY29uID0gdWkuaWNvbkZBKCdlZGl0JywgKGV2KSA9PiB7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuc2hvd0VkaXREaWFsb2coZnVuY0NhbGwpO1xuICAgIH0pO1xuICAgIGVkaXRJY29uLmNsYXNzTGlzdC5hZGQoJ2N2LWZ1bmNjYWxsLWNhcmQtaG92ZXItaWNvbicpO1xuXG4gICAgY29uc3QgZGVsZXRlSWNvbiA9IHVpLmljb25GQSgndHJhc2gtYWx0JywgYXN5bmMgKGV2KSA9PiB7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuc2hvd0RlbGV0ZVJ1bkRpYWxvZyhmdW5jQ2FsbCk7XG4gICAgfSwgJ0RlbGV0ZSB0aGUgcnVuJyk7XG4gICAgZGVsZXRlSWNvbi5jbGFzc0xpc3QuYWRkKCdjdi1mdW5jY2FsbC1jYXJkLWhvdmVyLWljb24nKTtcblxuICAgIGNvbnN0IGZhdm9yaXRlZEljb24gPSB1aS5pY29uRkEoJ3N0YXInLCBudWxsLCAnVW5mYXZvcml0ZSB0aGUgcnVuJyk7XG4gICAgZmF2b3JpdGVkSWNvbi5jbGFzc0xpc3QuYWRkKCdmYXMnLCAnY3YtZnVuY2NhbGwtY2FyZC1kZWYtaWNvbicpO1xuXG4gICAgY29uc3Qgc2hhcmVkSWNvbiA9IHVpLmljb25GQSgnc2hhcmUtYWx0JywgbnVsbCwgJ0FkZCB0byBzaGFyZWQnKTtcbiAgICBzaGFyZWRJY29uLmNsYXNzTGlzdC5hZGQoJ2ZhcycsICdjdi1mdW5jY2FsbC1jYXJkLWRlZi1pY29uJyk7XG4gICAgc2hhcmVkSWNvbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1ibHVlLTEpJztcblxuICAgIGNvbnN0IGRhdGVTdGFydGVkID0gbmV3IERhdGUoZnVuY0NhbGwuc3RhcnRlZC50b1N0cmluZygpKS50b0xvY2FsZVN0cmluZygnZW4tdXMnLCB7bW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJ251bWVyaWMnfSk7XG5cbiAgICBjb25zdCBjYXJkID0gdWkuZGl2SChbXG4gICAgICB1aS5kaXZIKFtcbiAgICAgICAgaWNvbixcbiAgICAgICAgdWkuZGl2VihbXG4gICAgICAgICAgY2FyZExhYmVsLFxuICAgICAgICAgIHVpLnNwYW4oW2RhdGVTdGFydGVkXSksXG4gICAgICAgICAgLi4uKGZ1bmNDYWxsLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10pID8gW3VpLmRpdlRleHQoZnVuY0NhbGwub3B0aW9uc1snZGVzY3JpcHRpb24nXSwgJ2Rlc2NyaXB0aW9uJyldOiBbXSxcbiAgICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1sndGFncyddICYmIGZ1bmNDYWxsLm9wdGlvbnNbJ3RhZ3MnXS5sZW5ndGggPiAwKSA/XG4gICAgICAgICAgICBbdWkuZGl2KGZ1bmNDYWxsLm9wdGlvbnNbJ3RhZ3MnXS5tYXAoKHRhZzogc3RyaW5nKSA9PiB1aS5zcGFuKFt0YWddLCAnZDQtdGFnJykpKV06W10sXG4gICAgICAgIF0sICdjdi1jYXJkLWNvbnRlbnQnKSxcbiAgICAgIF0pLFxuICAgICAgdWkuZGl2SChbXG4gICAgICAgIGVkaXRJY29uLCBkZWxldGVJY29uLFxuICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSA/IFtmYXZvcml0ZWRJY29uXSA6IFtdLFxuICAgICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSkgPyBbc2hhcmVkSWNvbl06IFtdLFxuICAgICAgXSlcbiAgICBdLCAnY3YtZnVuY2NhbGwtY2FyZCcpO1xuXG4gICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMub25SdW5DaG9zZW4ubmV4dChmdW5jQ2FsbC5pZCk7XG5cbiAgICAgIGNvbnN0IGFsbENhcmRzID0gWy4uLnRoaXMubXlDYXJkcywgLi4udGhpcy5mYXZvcml0ZUNhcmRzLCAuLi50aGlzLnNoYXJlZENhcmRzXTtcbiAgICAgIGFsbENhcmRzLmZvckVhY2goKGMpID0+IGMuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpKTtcblxuICAgICAgY2FyZC5jbGFzc0xpc3QuYWRkKCdjbGlja2VkJyk7XG4gICAgfSk7XG4gICAgdWkudG9vbHRpcC5iaW5kKGNhcmQsICgpID0+IHVpLnRhYmxlRnJvbU1hcCh7XG4gICAgICBBdXRob3I6IGdyb2suc2hlbGwudXNlci50b01hcmt1cCgpLFxuICAgICAgRGF0ZTogZGF0ZVN0YXJ0ZWQsXG4gICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSkgPyB7J1RpdGxlJzogZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXX06e30sXG4gICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1snZGVzY3JpcHRpb24nXSkgPyB7J0Rlc2NyaXB0aW9uJzogZnVuY0NhbGwub3B0aW9uc1snZGVzY3JpcHRpb24nXX06e30sXG4gICAgICAuLi4oZnVuY0NhbGwub3B0aW9uc1sndGFncyddICYmIGZ1bmNDYWxsLm9wdGlvbnNbJ3RhZ3MnXS5sZW5ndGggPiAwKSA/XG4gICAgICAgIHsnVGFncyc6IHVpLmRpdihmdW5jQ2FsbC5vcHRpb25zWyd0YWdzJ10ubWFwKCh0YWc6IHN0cmluZykgPT4gdWkuc3BhbihbdGFnXSwgJ2Q0LXRhZycpKSwgJ2Q0LXRhZy1lZGl0b3InKX06e30sXG4gICAgfSkpO1xuICAgIHJldHVybiBjYXJkO1xuICB9XG5cbiAgc2hvd0VkaXREaWFsb2coZnVuY0NhbGw6IERHLkZ1bmNDYWxsKSB7XG4gICAgY29uc3QgZGxnID0gdWkuZGlhbG9nKHt0aXRsZTogJ0VkaXQgcnVuJ30pO1xuXG4gICAgbGV0IHRpdGxlID0gZnVuY0NhbGwub3B0aW9uc1sndGl0bGUnXSA/PyAnJztcbiAgICBsZXQgZGVzY3JpcHRpb24gPSBmdW5jQ2FsbC5vcHRpb25zWydkZXNjcmlwdGlvbiddID8/ICcnO1xuICAgIGNvbnN0IHRpdGxlSW5wdXQgPSB1aS5zdHJpbmdJbnB1dCgnVGl0bGUnLCB0aXRsZSwgKHM6IHN0cmluZykgPT4gdGl0bGUgPSBzKTtcbiAgICBsZXQgaXNTaGFyZWQgPSBmdW5jQ2FsbC5vcHRpb25zWydpc1NoYXJlZCddID8/IGZhbHNlO1xuICAgIGxldCBpc0Zhdm9yaXRlID0gZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddID8/IGZhbHNlO1xuXG4gICAgY29uc3QgdGFnc0xpbmUgPSBERy5UYWdFZGl0b3IuY3JlYXRlKCk7XG4gICAgKGZ1bmNDYWxsLm9wdGlvbnNbJ3RhZ3MnXSB8fCBbXSkuZm9yRWFjaCgodGFnOiBzdHJpbmcpID0+IHtcbiAgICAgIHRhZ3NMaW5lLmFkZFRhZyh0YWcpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZHVtbXlJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCcgJywgJycpO1xuICAgIGR1bW15SW5wdXQuaW5wdXQucmVwbGFjZVdpdGgodGFnc0xpbmUucm9vdCk7XG5cbiAgICBjb25zdCB0YWdJbnB1dCA9IHVpLnN0cmluZ0lucHV0KCdUYWcnLCAnJyk7XG4gICAgY29uc3QgYWRkTmV3VGFnID0gKCkgPT4ge1xuICAgICAgaWYgKHRhZ0lucHV0LnZhbHVlID09PSAnJyB8fFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRhZ3NMaW5lLnRhZ3MuaW5jbHVkZXModGFnSW5wdXQudmFsdWUpXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgdGFnc0xpbmUuYWRkVGFnKHRhZ0lucHV0LnZhbHVlKTtcbiAgICAgIHRhZ0lucHV0LnZhbHVlID0gJyc7XG4gICAgfTtcblxuICAgIHRhZ0lucHV0LmFkZE9wdGlvbnModWkuaWNvbkZBKCdwbHVzJywgYWRkTmV3VGFnKSk7XG5cbiAgICB0YWdJbnB1dC5pbnB1dC5vbmtleWRvd24gPSBhc3luYyAoZXYpID0+IHtcbiAgICAgIGlmIChldi5rZXkgPT0gJ0VudGVyJykge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgYWRkTmV3VGFnKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRsZy5hZGQodWkuZm9ybShbXG4gICAgICB0aXRsZUlucHV0LFxuICAgICAgdWkuc3RyaW5nSW5wdXQoJ0Rlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24sIChzOiBzdHJpbmcpID0+IHsgZGVzY3JpcHRpb24gPSBzOyB9KSxcbiAgICAgIHVpLmJvb2xJbnB1dCgnRmF2b3JpdGVzJywgaXNGYXZvcml0ZSwgKGI6IGJvb2xlYW4pID0+IGlzRmF2b3JpdGUgPSBiKSxcbiAgICAgIHVpLmJvb2xJbnB1dCgnU2hhcmUnLCBpc1NoYXJlZCwgKGI6IGJvb2xlYW4pID0+IGlzU2hhcmVkID0gYiksXG4gICAgICB0YWdJbnB1dCxcbiAgICAgIGR1bW15SW5wdXRcbiAgICBdKSlcbiAgICAgIC5vbk9LKGFzeW5jICgpID0+IHtcbiAgICAgICAgZnVuY0NhbGwgPSBhd2FpdCBoaXN0b3J5VXRpbHMubG9hZFJ1bihmdW5jQ2FsbC5pZCk7XG4gICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ3RpdGxlJ10gPSB0aXRsZSAhPT0gJycgPyB0aXRsZSA6IG51bGw7XG4gICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbiAhPT0gJycgPyBkZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ3RhZ3MnXSA9IHRhZ3NMaW5lLnRhZ3M7XG5cbiAgICAgICAgaWYgKCEhaXNTaGFyZWQgPT09ICEhZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSAmJiAhIWlzRmF2b3JpdGUgPT09ICEhZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSB7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCB0cnVlKTtcbiAgICAgICAgICBhd2FpdCBoaXN0b3J5VXRpbHMuc2F2ZVJ1bihmdW5jQ2FsbCk7XG5cbiAgICAgICAgICBjb25zdCBlZGl0ZWRSdW4gPSB0aGlzLnN0b3JlLmFsbFJ1bnMudmFsdWUuZmluZCgoY2FsbCkgPT4gY2FsbC5pZCA9PT0gZnVuY0NhbGwuaWQpITtcbiAgICAgICAgICBlZGl0ZWRSdW4ub3B0aW9uc1sndGl0bGUnXSA9IHRpdGxlICE9PSAnJyA/IHRpdGxlIDogbnVsbDtcbiAgICAgICAgICBlZGl0ZWRSdW4ub3B0aW9uc1snZGVzY3JpcHRpb24nXSA9IGRlc2NyaXB0aW9uICE9PSAnJyA/IGRlc2NyaXB0aW9uIDogbnVsbDtcbiAgICAgICAgICBlZGl0ZWRSdW4ub3B0aW9uc1sndGFncyddID0gZnVuY0NhbGwub3B0aW9uc1sndGFncyddO1xuXG4gICAgICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIGZhbHNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTaGFyZWQgJiYgIWZ1bmNDYWxsLm9wdGlvbnNbJ2lzU2hhcmVkJ10pIHtcbiAgICAgICAgICBmdW5jQ2FsbC5vcHRpb25zWydpc1NoYXJlZCddID0gaXNTaGFyZWQ7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCB0cnVlKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkZFJ1blRvU2hhcmVkKGZ1bmNDYWxsKTtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNTaGFyZWQgJiYgZnVuY0NhbGwub3B0aW9uc1snaXNTaGFyZWQnXSkge1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2lzU2hhcmVkJ10gPSBpc1NoYXJlZDtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIHRydWUpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlUnVuRnJvbVNoYXJlZChmdW5jQ2FsbCk7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGYXZvcml0ZSAmJiAhZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddKSB7XG4gICAgICAgICAgZnVuY0NhbGwub3B0aW9uc1snaXNGYXZvcml0ZSddID0gaXNGYXZvcml0ZTtcbiAgICAgICAgICB1aS5zZXRVcGRhdGVJbmRpY2F0b3IodGhpcy50YWJzLnJvb3QsIHRydWUpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUnVuVG9GYXZvcml0ZXMoZnVuY0NhbGwpO1xuICAgICAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Zhdm9yaXRlICYmIGZ1bmNDYWxsLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSkge1xuICAgICAgICAgIGZ1bmNDYWxsLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSA9IGlzRmF2b3JpdGU7XG4gICAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMudGFicy5yb290LCB0cnVlKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVJ1bkZyb21GYXZvcml0ZXMoZnVuY0NhbGwpO1xuICAgICAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnRhYnMucm9vdCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnNob3coe2NlbnRlcjogdHJ1ZSwgd2lkdGg6IDUwMH0pO1xuICB9XG5cbiAgcmVuZGVyRmF2b3JpdGVDYXJkcyhmdW5jQ2FsbHM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICB0aGlzLmZhdm9yaXRlQ2FyZHMgPSBmdW5jQ2FsbHMubWFwKChmdW5jQ2FsbCkgPT4gdGhpcy5yZW5kZXJDYXJkKGZ1bmNDYWxsKSk7XG4gICAgcmV0dXJuIHVpLmRpdlYodGhpcy5mYXZvcml0ZUNhcmRzKTtcbiAgfTtcblxuICByZW5kZXJTaGFyZWRDYXJkcyhmdW5jQ2FsbHM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICB0aGlzLnNoYXJlZENhcmRzID0gZnVuY0NhbGxzLm1hcCgoZnVuY0NhbGwpID0+IHRoaXMucmVuZGVyQ2FyZChmdW5jQ2FsbCkpO1xuICAgIHJldHVybiB1aS5kaXZWKHRoaXMuc2hhcmVkQ2FyZHMpO1xuICB9O1xuXG4gIHJlbmRlckhpc3RvcnlDYXJkcyhmdW5jQ2FsbHM6IERHLkZ1bmNDYWxsW10pIHtcbiAgICB0aGlzLm15Q2FyZHMgPSBmdW5jQ2FsbHMubWFwKChmdW5jQ2FsbCkgPT4gdGhpcy5yZW5kZXJDYXJkKGZ1bmNDYWxsKSk7XG4gICAgcmV0dXJuIHVpLmRpdlYodGhpcy5teUNhcmRzLCB7c3R5bGU6IHtoZWlnaHQ6ICcxMDAlJ319KTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZ1bmM6IERHLkZ1bmNcbiAgKSB7XG4gICAgdGhpcy50YWJzLnJvb3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy50YWJzLnJvb3Quc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuXG4gICAgdGhpcy5teVJ1bnNGaWx0ZXIuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlTXlQYW5lKHRoaXMuc3RvcmUuZmlsdGVyZWRNeVJ1bnMpKTtcbiAgICB0aGlzLmZhdlJ1bnNGaWx0ZXIuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlRmF2b3JpdGVzUGFuZSh0aGlzLnN0b3JlLmZpbHRlcmVkRmF2b3JpdGVSdW5zKSk7XG4gICAgdGhpcy5zaGFyZWRSdW5zRmlsdGVyLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZVNoYXJlZFBhbmUodGhpcy5zdG9yZS5maWx0ZXJlZFNoYXJlZFJ1bnMpKTtcblxuICAgIHRoaXMuc3RvcmUuYWxsUnVucy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVNeVBhbmUodGhpcy5zdG9yZS5maWx0ZXJlZE15UnVucyk7XG4gICAgICB0aGlzLnVwZGF0ZUZhdm9yaXRlc1BhbmUodGhpcy5zdG9yZS5maWx0ZXJlZEZhdm9yaXRlUnVucyk7XG4gICAgICB0aGlzLnVwZGF0ZVNoYXJlZFBhbmUodGhpcy5zdG9yZS5maWx0ZXJlZFNoYXJlZFJ1bnMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hbGxSdW5zRmV0Y2guc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcih0aGlzLnJvb3QsIHRydWUpO1xuICAgICAgY29uc3QgYWxsUnVucyA9IChhd2FpdCBoaXN0b3J5VXRpbHMucHVsbFJ1bnNCeU5hbWUodGhpcy5mdW5jLm5hbWUsIFtdLCB7b3JkZXI6ICdzdGFydGVkJ30sIFsnc2Vzc2lvbi51c2VyJywgJ29wdGlvbnMnXSkpLnJldmVyc2UoKTtcbiAgICAgIHRoaXMuc3RvcmUuYWxsUnVucy5uZXh0KGFsbFJ1bnMpO1xuICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHRoaXMucm9vdCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZnRlclJ1bkFkZFRvRmF2b3JpdGVzLnN1YnNjcmliZSgoYWRkZWQpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRlZFJ1biA9IHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZS5maW5kKChjYWxsKSA9PiBjYWxsLmlkID09PSBhZGRlZC5pZCk7XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ3RpdGxlJ10gPSBhZGRlZC5vcHRpb25zWyd0aXRsZSddO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWydkZXNjcmlwdGlvbiddID0gYWRkZWQub3B0aW9uc1snZGVzY3JpcHRpb24nXTtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1snaXNGYXZvcml0ZSddID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RvcmUuYWxsUnVucy5uZXh0KHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuQWRkVG9TaGFyZWQuc3Vic2NyaWJlKChhZGRlZCkgPT4ge1xuICAgICAgY29uc3QgZWRpdGVkUnVuID0gdGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlLmZpbmQoKGNhbGwpID0+IGNhbGwuaWQgPT09IGFkZGVkLmlkKTtcbiAgICAgIGVkaXRlZFJ1biEub3B0aW9uc1sndGl0bGUnXSA9IGFkZGVkLm9wdGlvbnNbJ3RpdGxlJ107XG4gICAgICBlZGl0ZWRSdW4hLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10gPSBhZGRlZC5vcHRpb25zWydkZXNjcmlwdGlvbiddO1xuICAgICAgZWRpdGVkUnVuIS5vcHRpb25zWydpc1NoYXJlZCddID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RvcmUuYWxsUnVucy5uZXh0KHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuUmVtb3ZlRnJvbUZhdm9yaXRlcy5zdWJzY3JpYmUoKHJlbW92ZWQpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRlZFJ1biA9IHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZS5maW5kKChjYWxsKSA9PiBjYWxsLmlkID09PSByZW1vdmVkLmlkKSE7XG4gICAgICBlZGl0ZWRSdW4ub3B0aW9uc1sndGl0bGUnXSA9IHJlbW92ZWQub3B0aW9uc1sndGl0bGUnXTtcbiAgICAgIGVkaXRlZFJ1bi5vcHRpb25zWydkZXNjcmlwdGlvbiddID0gcmVtb3ZlZC5vcHRpb25zWydkZXNjcmlwdGlvbiddO1xuICAgICAgZWRpdGVkUnVuLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWZ0ZXJSdW5SZW1vdmVGcm9tU2hhcmVkLnN1YnNjcmliZSgocmVtb3ZlZCkgPT4ge1xuICAgICAgY29uc3QgZWRpdGVkUnVuID0gdGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlLmZpbmQoKGNhbGwpID0+IGNhbGwuaWQgPT09IHJlbW92ZWQuaWQpITtcbiAgICAgIGVkaXRlZFJ1bi5vcHRpb25zWyd0aXRsZSddID0gcmVtb3ZlZC5vcHRpb25zWyd0aXRsZSddO1xuICAgICAgZWRpdGVkUnVuLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ10gPSByZW1vdmVkLm9wdGlvbnNbJ2Rlc2NyaXB0aW9uJ107XG4gICAgICBlZGl0ZWRSdW4ub3B0aW9uc1snaXNTaGFyZWQnXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdG9yZS5hbGxSdW5zLm5leHQodGhpcy5zdG9yZS5hbGxSdW5zLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWZ0ZXJSdW5EZWxldGVkLnN1YnNjcmliZSgoaWQpID0+IHtcbiAgICAgIHRoaXMuc3RvcmUuYWxsUnVucy5uZXh0KHRoaXMuc3RvcmUuYWxsUnVucy52YWx1ZS5maWx0ZXIoKGNhbGwpID0+IGNhbGwuaWQgIT09IGlkKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFsbFJ1bnNGZXRjaC5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZFJ1blRvRmF2b3JpdGVzKGNhbGxUb0Zhdm9yaXRlOiBERy5GdW5jQ2FsbCk6IFByb21pc2U8REcuRnVuY0NhbGw+IHtcbiAgICBjYWxsVG9GYXZvcml0ZS5vcHRpb25zWydpc0Zhdm9yaXRlJ10gPSB0cnVlO1xuXG4gICAgdGhpcy5iZWZvcmVSdW5BZGRUb0Zhdm9yaXRlcy5uZXh0KGNhbGxUb0Zhdm9yaXRlKTtcbiAgICBjb25zdCBzYXZlZEZhdm9yaXRlID0gYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5hbGxQYWNrYWdlVmVyc2lvbnMoKS5zYXZlKGNhbGxUb0Zhdm9yaXRlKTtcbiAgICB0aGlzLmFmdGVyUnVuQWRkVG9GYXZvcml0ZXMubmV4dChzYXZlZEZhdm9yaXRlKTtcbiAgICByZXR1cm4gc2F2ZWRGYXZvcml0ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlUnVuRnJvbUZhdm9yaXRlcyhjYWxsVG9VbmZhdm9yaXRlOiBERy5GdW5jQ2FsbCk6IFByb21pc2U8REcuRnVuY0NhbGw+IHtcbiAgICBjYWxsVG9VbmZhdm9yaXRlLm9wdGlvbnNbJ2lzRmF2b3JpdGUnXSA9IGZhbHNlO1xuXG4gICAgdGhpcy5iZWZvcmVSdW5SZW1vdmVGcm9tRmF2b3JpdGVzLm5leHQoY2FsbFRvVW5mYXZvcml0ZSk7XG4gICAgY29uc3QgZmF2b3JpdGVTYXZlID0gYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5hbGxQYWNrYWdlVmVyc2lvbnMoKS5zYXZlKGNhbGxUb1VuZmF2b3JpdGUpO1xuICAgIHRoaXMuYWZ0ZXJSdW5SZW1vdmVGcm9tRmF2b3JpdGVzLm5leHQoZmF2b3JpdGVTYXZlKTtcbiAgICByZXR1cm4gZmF2b3JpdGVTYXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRSdW5Ub1NoYXJlZChjYWxsVG9TaGFyZTogREcuRnVuY0NhbGwpOiBQcm9taXNlPERHLkZ1bmNDYWxsPiB7XG4gICAgY2FsbFRvU2hhcmUub3B0aW9uc1snaXNTaGFyZWQnXSA9IHRydWU7XG5cbiAgICB0aGlzLmJlZm9yZVJ1bkFkZFRvU2hhcmVkLm5leHQoY2FsbFRvU2hhcmUpO1xuXG4gICAgY29uc3QgYWxsR3JvdXAgPSBhd2FpdCBncm9rLmRhcGkuZ3JvdXBzLmZpbmQoZGVmYXVsdEdyb3Vwc0lkc1snQWxsIHVzZXJzJ10pO1xuXG4gICAgY29uc3QgZGZPdXRwdXRzID0gd3UoY2FsbFRvU2hhcmUub3V0cHV0UGFyYW1zLnZhbHVlcygpIGFzIERHLkZ1bmNDYWxsUGFyYW1bXSlcbiAgICAgIC5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LnByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gREcuVFlQRS5EQVRBX0ZSQU1FKTtcblxuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIGRmT3V0cHV0cykge1xuICAgICAgY29uc3QgZGYgPSBjYWxsVG9TaGFyZS5vdXRwdXRzW291dHB1dC5uYW1lXSBhcyBERy5EYXRhRnJhbWU7XG4gICAgICBhd2FpdCBncm9rLmRhcGkucGVybWlzc2lvbnMuZ3JhbnQoZGYuZ2V0VGFibGVJbmZvKCksIGFsbEdyb3VwLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGZJbnB1dHMgPSB3dShjYWxsVG9TaGFyZS5pbnB1dFBhcmFtcy52YWx1ZXMoKSBhcyBERy5GdW5jQ2FsbFBhcmFtW10pXG4gICAgICAuZmlsdGVyKChpbnB1dCkgPT4gaW5wdXQucHJvcGVydHkucHJvcGVydHlUeXBlID09PSBERy5UWVBFLkRBVEFfRlJBTUUpO1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgZGZJbnB1dHMpIHtcbiAgICAgIGNvbnN0IGRmID0gY2FsbFRvU2hhcmUuaW5wdXRzW2lucHV0Lm5hbWVdIGFzIERHLkRhdGFGcmFtZTtcbiAgICAgIGF3YWl0IGdyb2suZGFwaS5wZXJtaXNzaW9ucy5ncmFudChkZi5nZXRUYWJsZUluZm8oKSwgYWxsR3JvdXAsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlZFNoYXJlZCA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuY2FsbHMuYWxsUGFja2FnZVZlcnNpb25zKCkuc2F2ZShjYWxsVG9TaGFyZSk7XG5cbiAgICB0aGlzLmFmdGVyUnVuQWRkVG9TaGFyZWQubmV4dChzYXZlZFNoYXJlZCk7XG4gICAgcmV0dXJuIHNhdmVkU2hhcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVSdW5Gcm9tU2hhcmVkKGNhbGxUb1Vuc2hhcmU6IERHLkZ1bmNDYWxsKTogUHJvbWlzZTxERy5GdW5jQ2FsbD4ge1xuICAgIGNhbGxUb1Vuc2hhcmUub3B0aW9uc1snaXNTaGFyZWQnXSA9IGZhbHNlO1xuXG4gICAgdGhpcy5iZWZvcmVSdW5SZW1vdmVGcm9tU2hhcmVkLm5leHQoY2FsbFRvVW5zaGFyZSk7XG4gICAgY29uc3Qgc2F2ZWRTaGFyZWQgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLmFsbFBhY2thZ2VWZXJzaW9ucygpLnNhdmUoY2FsbFRvVW5zaGFyZSk7XG4gICAgdGhpcy5hZnRlclJ1blJlbW92ZUZyb21TaGFyZWQubmV4dChzYXZlZFNoYXJlZCk7XG4gICAgcmV0dXJuIHNhdmVkU2hhcmVkO1xuICB9XG5cbiAgcHVibGljIGdldCByb290KCkge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG59XG4iXX0=