@wavemaker/app-ng-runtime 11.4.2-next.25743 → 11.4.2-next.25745

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.
@@ -1,21 +1,21 @@
1
1
  import { Attribute, Component, Injector, ViewEncapsulation } from '@angular/core';
2
2
  import { APPLY_STYLES_TYPE, getEvaluatedData, getOrderedDataset, provideAsWidgetRef, StylableComponent, styler } from '@wm/components/base';
3
3
  import { registerProps } from './tree.props';
4
- import { getClonedObject } from "@wm/core";
4
+ import { $parseEvent, getClonedObject } from "@wm/core";
5
5
  const WIDGET_INFO = { widgetType: 'wm-tree', hostClass: 'app-tree' };
6
6
  const defaultTreeIconClass = 'plus-minus';
7
7
  export class TreeComponent extends StylableComponent {
8
- constructor(inj, bindnodeid) {
8
+ constructor(inj, binddatavalue, bindnodelabel, bindnodeicon, bindnodechildren, bindnodeid) {
9
9
  super(inj, WIDGET_INFO);
10
+ this.binddatavalue = binddatavalue;
11
+ this.bindnodelabel = bindnodelabel;
12
+ this.bindnodeicon = bindnodeicon;
13
+ this.bindnodechildren = bindnodechildren;
10
14
  this.bindnodeid = bindnodeid;
11
15
  this.setting = {
12
16
  data: {
13
17
  simpleData: {
14
18
  enable: false
15
- },
16
- key: {
17
- children: 'children',
18
- name: 'label'
19
19
  }
20
20
  },
21
21
  view: {
@@ -29,45 +29,45 @@ export class TreeComponent extends StylableComponent {
29
29
  callback: {}
30
30
  };
31
31
  styler(this.nativeElement, this, APPLY_STYLES_TYPE.CONTAINER);
32
+ this.setting.view['nodeClasses'] = this.setNodeClasses;
33
+ this.setting.callback["onClick"] = this.onClick.bind(this);
34
+ this.setting.callback["onExpand"] = this.onExpand.bind(this);
35
+ this.setting.callback["onCollapse"] = this.onCollapse.bind(this);
32
36
  }
33
37
  onPropertyChange(key, nv, ov) {
34
38
  switch (key) {
35
39
  case 'dataset':
36
40
  this.nodes = this.getNodes(nv);
37
- if (this.level > 0) {
38
- this.expandTree(this.level, this.nodes, 0);
39
- }
40
41
  this.renderTree();
41
42
  break;
42
43
  case 'levels':
43
- if (nv > 0) {
44
- this.level = nv;
45
- }
44
+ this.level = nv;
46
45
  this.renderTree();
47
46
  break;
48
- case 'treeicons':
49
- this.treeicon = nv;
47
+ case 'nodeicon':
48
+ this.nodeicon = nv;
50
49
  this.renderTree();
51
50
  break;
52
51
  case 'nodelabel':
53
- this.setting.data.key.name = this.labelKey;
52
+ this.nodelabel = nv;
54
53
  this.renderTree();
55
54
  break;
56
55
  case 'nodechildren':
57
- this.setting.data.key.children = this.childrenKey;
56
+ this.nodechildren = nv;
58
57
  this.renderTree();
59
58
  break;
60
- case 'nodeicon':
61
- this.nodeicon = this.iconKey;
59
+ case 'orderby':
60
+ this.orderby = nv;
62
61
  this.renderTree();
63
62
  break;
64
- case 'orderby':
63
+ case 'treeicons':
64
+ this.treeicons = nv;
65
65
  this.renderTree();
66
66
  break;
67
67
  case 'class':
68
68
  this.treeClass = nv;
69
+ this.setTreeTemplate(this.treeClass);
69
70
  this.renderTree();
70
- break;
71
71
  default:
72
72
  super.onPropertyChange(key, nv, ov);
73
73
  break;
@@ -76,9 +76,9 @@ export class TreeComponent extends StylableComponent {
76
76
  // expands the tree nodes if the property is selected.
77
77
  expandTree(level, node, childLevel) {
78
78
  node.map(childNode => {
79
- const children = this.getChildren(childNode);
80
- if (children && !("open" in childNode) && childLevel < level) {
81
- childNode["open"] = true;
79
+ const children = childNode.children;
80
+ if (children && childLevel < level) {
81
+ childNode.open = true;
82
82
  this.expandTree(level, children, childLevel + 1);
83
83
  }
84
84
  else {
@@ -89,14 +89,15 @@ export class TreeComponent extends StylableComponent {
89
89
  }
90
90
  // sets the template for the tree based on the property selected.
91
91
  setTreeTemplate(value) {
92
- if (value === 'Classic') {
92
+ const classList = value.split(" ");
93
+ if (classList.includes('Classic')) {
93
94
  this.setting.check["enable"] = false;
94
95
  }
95
- else if (value === 'Checkbox') {
96
+ else if (classList.includes('Checkbox')) {
96
97
  this.setting.check["enable"] = true;
97
98
  this.setting.check["chkStyle"] = 'checkbox';
98
99
  }
99
- else if (value === 'Radio') {
100
+ else if (classList.includes('Radio')) {
100
101
  this.setting.check["enable"] = true;
101
102
  this.setting.check["chkStyle"] = 'radio';
102
103
  this.setting.check["radioType"] = "all";
@@ -128,52 +129,10 @@ export class TreeComponent extends StylableComponent {
128
129
  return nodes;
129
130
  }
130
131
  // adds class to the nodes inorder to add icons to respective node.
131
- setNodeclasses(treeId, treeNode) {
132
+ setNodeClasses(treeId, treeNode) {
132
133
  return treeNode.icon ? { add: [`${treeNode.icon}`] } : '';
133
134
  }
134
135
  ;
135
- // Sets the node label with any icon if bound to
136
- setNodeData(nodes, depth, level, parentNode, type) {
137
- if (depth === 0) {
138
- nodes.map(node => {
139
- const children = this.getChildren(node);
140
- if (children) {
141
- this.setNodeData(children, depth, level, parentNode, type);
142
- }
143
- if (node.icon && this.nodelabel == 'icon') {
144
- node[type] = node.icon;
145
- }
146
- else if (node.name && this.nodelabel == 'name') {
147
- node[type] = node.name;
148
- }
149
- else {
150
- return;
151
- }
152
- });
153
- }
154
- else {
155
- nodes.map(node => {
156
- const children = this.getChildren(node);
157
- if (children && level > 1) {
158
- if (depth === level) {
159
- parentNode = node;
160
- }
161
- this.setNodeData(children, depth, level - 1, parentNode, type);
162
- }
163
- if (level === 1 && (type === "name" ? this.nodelabel.includes("label") || this.nodelabel.includes("name") : this.nodeicon.includes("label") || this.nodeicon.includes("name"))) {
164
- parentNode[type] = node.name || node.label;
165
- return;
166
- }
167
- else if (level === 1 && (node.icon !== undefined) && (type === "name" ? this.nodelabel.includes("icon") : this.nodeicon.includes("icon"))) {
168
- parentNode[type] = node.icon;
169
- return;
170
- }
171
- else {
172
- return;
173
- }
174
- });
175
- }
176
- }
177
136
  // adds tree icons to the nodes on load of the tree
178
137
  changeTreeIcons(nv) {
179
138
  let eleClose = $('ul[name="' + this.name + '"] li span.button.switch');
@@ -186,19 +145,20 @@ export class TreeComponent extends StylableComponent {
186
145
  });
187
146
  });
188
147
  }
148
+ // Returns the node path
189
149
  getPath(treeNode, path) {
190
150
  if (treeNode.getParentNode() === null) {
191
- path = "/" + treeNode[this.labelKey] + path;
151
+ path = "/" + treeNode.name + path;
192
152
  }
193
153
  else {
194
- path = this.getPath(treeNode.getParentNode(), path) + "/" + treeNode[this.labelKey];
154
+ path = this.getPath(treeNode.getParentNode(), path) + "/" + treeNode.name;
195
155
  }
196
156
  return path;
197
157
  }
198
158
  // binds the click event to all nodes to open the child nodes
199
159
  onClick(event, treeId, treeNode, clickFlag) {
200
160
  if (this.nodeclick === "expand") {
201
- var nodes = this.treeObj.getSelectedNodes();
161
+ var nodes = this.zTree.getSelectedNodes();
202
162
  if (nodes.length > 0) {
203
163
  this.expandNode(nodes[0], !nodes[0].open, true);
204
164
  }
@@ -211,18 +171,18 @@ export class TreeComponent extends StylableComponent {
211
171
  let path = this.getPath(treeNode, "");
212
172
  const eventParams = {
213
173
  '$event': event,
214
- "$item": treeNode,
174
+ "$item": getClonedObject(treeNode.data),
215
175
  "$path": path
216
176
  };
217
177
  this.invokeEventCallback('expand', eventParams);
218
- const children = this.getChildren(treeNode);
178
+ const children = treeNode.children;
219
179
  children === null || children === void 0 ? void 0 : children.map((el) => {
220
180
  if (el.isParent) {
221
181
  let ele = $(`#${el.tId}_switch`);
222
- $(ele).addClass(self.treeicon || defaultTreeIconClass);
182
+ $(ele).addClass(self.treeicons || defaultTreeIconClass);
223
183
  $(ele).on("click", function (e) {
224
184
  setTimeout(() => {
225
- $(ele).addClass(self.treeicon || defaultTreeIconClass);
185
+ $(ele).addClass(self.treeicons || defaultTreeIconClass);
226
186
  }, 0);
227
187
  });
228
188
  }
@@ -232,119 +192,54 @@ export class TreeComponent extends StylableComponent {
232
192
  let path = this.getPath(treeNode, "");
233
193
  const eventParams = {
234
194
  '$event': event,
235
- "$item": treeNode,
195
+ "$item": getClonedObject(treeNode.data),
236
196
  "$path": path
237
197
  };
238
198
  this.invokeEventCallback('collapse', eventParams);
239
199
  }
240
- getChildren(node) {
241
- return node[this.childrenKey];
242
- }
243
- get childrenKey() {
244
- if (!this.nodechildren) {
245
- return 'children';
246
- }
247
- const depth = this.countDepth(this.nodechildren);
248
- return depth ? this.nodechildren.split('.').pop() : this.nodechildren;
249
- }
250
- get labelKey() {
251
- if (!this.nodelabel) {
252
- return 'label';
253
- }
254
- const depth = this.countDepth(this.nodelabel);
255
- return depth ? this.nodelabel.split('.').pop() : this.nodelabel;
256
- }
257
- get iconKey() {
258
- if (!this.nodeicon) {
259
- return 'icon';
260
- }
261
- const depth = this.countDepth(this.nodeicon);
262
- return depth ? this.nodeicon.split('.').pop() : this.nodeicon;
263
- }
264
- get treeObj() {
265
- return $.fn.zTree.getZTreeObj(`${this.name}`);
266
- }
267
200
  // function to support backward compatibility of objects
268
- modifyObjects(array) {
269
- array.forEach(obj => {
270
- obj.icon = obj[this.nodeicon];
271
- const children = this.getChildren(obj);
272
- if (children === null || children === void 0 ? void 0 : children.length) {
273
- this.modifyObjects(children);
201
+ constructZTreeData(data, zTreeData) {
202
+ data.forEach(node => {
203
+ const zNode = {};
204
+ const name = getEvaluatedData(node, { field: this.nodelabel, bindExpression: this.bindnodelabel }, this.viewParent) || node.label;
205
+ const icon = getEvaluatedData(node, { field: this.nodeicon, bindExpression: this.bindnodeicon }, this.viewParent) || node.icon;
206
+ const nodeId = getEvaluatedData(node, { field: this.nodeid, bindExpression: this.bindnodeid }, this.viewParent);
207
+ const children = getEvaluatedData(node, { field: this.nodechildren, bindExpression: this.bindnodechildren }, this.viewParent) || node.children;
208
+ zNode['name'] = name;
209
+ zNode['icon'] = icon;
210
+ zNode['nodeId'] = nodeId;
211
+ zNode['data'] = getClonedObject(node);
212
+ if (_.isArray(children) && children.length) {
213
+ zNode['children'] = [];
214
+ this.constructZTreeData(children, zNode['children']);
274
215
  }
216
+ zTreeData.push(zNode);
275
217
  });
276
218
  }
277
- // sets the node children property to parent nodes
278
- setNodeChildren(nodes, depth, level, parentNode) {
279
- if (depth <= 0) {
280
- return nodes;
281
- }
282
- for (let i = 0; i < nodes.length; i++) {
283
- const node = nodes[i];
284
- if (depth === level) {
285
- parentNode = nodes[i];
286
- }
287
- const children = this.getChildren(node);
288
- if (children === null || children === void 0 ? void 0 : children.length) {
289
- if (level === 1) {
290
- parentNode[this.childrenKey] = children.map(child => ({ [this.labelKey]: child[this.labelKey], [this.childrenKey]: this.getChildren(child), icon: child[this.iconKey] }));
291
- return;
292
- }
293
- else {
294
- this.setNodeChildren(children, depth, level - 1, parentNode);
295
- }
296
- }
297
- }
298
- return nodes;
299
- }
300
- countDepth(str) {
301
- const regex = /\[.*?\]/g;
302
- let matches = str.match(regex);
303
- let count = 1;
304
- if (matches === null)
305
- return count;
306
- for (let match of matches) {
307
- count++;
308
- }
309
- return count;
310
- }
311
219
  // Renders the tree on to the dom
312
220
  renderTree() {
313
- if (this.nodes) {
221
+ var _a;
222
+ this.zTreeNodes = [];
223
+ if ((_a = this.nodes) === null || _a === void 0 ? void 0 : _a.length) {
314
224
  this.nativeElement.setAttribute('id', this.name);
315
- if (this.nodeicon && this.nodeicon !== 'icon') {
316
- this.modifyObjects(this.nodes);
317
- }
318
- this.setTreeTemplate(this.treeClass);
319
- if (this.nodelabel) {
320
- let depth = 0;
321
- if (this.nodelabel.includes("children")) {
322
- depth = this.countDepth(this.nodelabel);
323
- }
324
- this.setNodeData(this.nodes, depth, depth, null, "name");
325
- }
326
- if (this.nodeicon) {
327
- let depth = 0;
328
- if (this.nodeicon.includes("children")) {
329
- depth = this.countDepth(this.nodeicon);
330
- }
331
- this.setNodeData(this.nodes, depth, depth, null, "icon");
332
- }
333
- if (this.nodechildren) {
334
- let depth = this.countDepth(this.nodechildren);
335
- if (depth > 1) {
336
- this.nodes = this.setNodeChildren(this.nodes, depth, depth, null);
337
- }
225
+ this.constructZTreeData(this.nodes, this.zTreeNodes);
226
+ if (this.level > 0) {
227
+ this.expandTree(this.level, this.zTreeNodes, 0);
338
228
  }
339
229
  }
340
- this.setting.view['nodeClasses'] = this.setNodeclasses;
341
- this.setting.callback["onClick"] = this.onClick.bind(this);
342
- this.setting.callback["onExpand"] = this.onExpand.bind(this);
343
- this.setting.callback["onCollapse"] = this.onCollapse.bind(this);
344
- let zTree = $.fn.zTree.init($('ul[name="' + this.name + '"]'), this.setting, this.nodes);
345
- $.fn.zTreeKeyboardNavigation(zTree, $('ul[name="' + this.name + '"]'), null, this.treeicon || defaultTreeIconClass);
230
+ this.zTree = $.fn.zTree.init($('ul[name="' + this.name + '"]'), this.setting, this.zTreeNodes);
231
+ $.fn.zTreeKeyboardNavigation(this.zTree, $('ul[name="' + this.name + '"]'), null, this.treeicons || defaultTreeIconClass);
346
232
  this.postRenderTree();
347
233
  }
234
+ setChecked(zNode, node) {
235
+ node.checked = zNode.checked;
236
+ const children = getEvaluatedData(node, { field: this.nodechildren, bindExpression: this.bindnodechildren }, this.viewParent) || node.children;
237
+ if (children === null || children === void 0 ? void 0 : children.length) {
238
+ children.forEach((node, index) => {
239
+ this.setChecked(zNode.children[index], node);
240
+ });
241
+ }
242
+ }
348
243
  selectNode(event, node) {
349
244
  const deSelectElm = $(`.app-tree[name=${this.name}] li[treenode].selected`);
350
245
  deSelectElm.removeClass('selected');
@@ -353,26 +248,35 @@ export class TreeComponent extends StylableComponent {
353
248
  }
354
249
  const selectElm = $(`#${node.tId}:has(.curSelectedNode)`);
355
250
  selectElm.addClass('selected');
251
+ const classList = (this.treeClass || "").split(" ");
252
+ if (classList.includes('Checkbox') || classList.includes('Radio')) {
253
+ this.setChecked(node, node.data);
254
+ }
356
255
  const path = this.getPath(node, "");
357
- this.selecteditem = getClonedObject(node) || {};
256
+ this.selecteditem = getClonedObject(node.data) || {};
358
257
  this.selecteditem.path = path;
359
258
  const eventParams = {
360
259
  '$event': event,
361
- "$item": node,
260
+ "$item": getClonedObject(node.data),
362
261
  "$path": path
363
262
  };
263
+ //[Todo-CSP]: this data will be dynamic, can not generate function upfront
264
+ const nodeAction = node.data[this.nodeaction || 'action'];
265
+ if (nodeAction) {
266
+ $parseEvent(nodeAction)(this);
267
+ }
364
268
  this.invokeEventCallback('select', eventParams);
365
269
  }
366
270
  expandNode(node, expand, eventFlag) {
367
- this.treeObj.expandNode(node, expand, false, false, eventFlag);
271
+ this.zTree.expandNode(node, expand, false, false, eventFlag);
368
272
  const el = $(`#${node.tId}_switch`);
369
- $(el).addClass(this.treeicon || defaultTreeIconClass);
273
+ $(el).addClass(this.treeicons || defaultTreeIconClass);
370
274
  }
371
275
  postRenderTree() {
372
276
  setTimeout(() => {
373
- this.changeTreeIcons(this.treeicon || defaultTreeIconClass);
277
+ this.changeTreeIcons(this.treeicons || defaultTreeIconClass);
374
278
  if (this.datavalue && !this.selecteditem) {
375
- const nodes = this.treeObj.getNodes();
279
+ const nodes = this.zTree.getNodes();
376
280
  let node;
377
281
  if (nodes.length) {
378
282
  if (this.datavalue === 'FirstNode') {
@@ -383,7 +287,7 @@ export class TreeComponent extends StylableComponent {
383
287
  }
384
288
  }
385
289
  if (node) {
386
- this.treeObj.selectNode(node, false);
290
+ this.zTree.selectNode(node, false);
387
291
  this.selectNode(undefined, node);
388
292
  this.expandNode(node, true, false);
389
293
  }
@@ -391,10 +295,11 @@ export class TreeComponent extends StylableComponent {
391
295
  }, 200);
392
296
  }
393
297
  selectById(value) {
394
- const simpleNodes = this.treeObj.transformToArray(this.treeObj.getNodes());
395
- const node = simpleNodes.find(node => value === getEvaluatedData(node, { field: this.nodeid, bindExpression: this.bindnodeid }, this.viewParent));
298
+ var _a;
299
+ const simpleNodes = (_a = this.zTree) === null || _a === void 0 ? void 0 : _a.transformToArray(this.zTree.getNodes());
300
+ const node = simpleNodes === null || simpleNodes === void 0 ? void 0 : simpleNodes.find(node => value === node.nodeId);
396
301
  if (node) {
397
- this.treeObj.selectNode(node, false);
302
+ this.zTree.selectNode(node, false);
398
303
  this.selectNode(undefined, node);
399
304
  }
400
305
  }
@@ -416,6 +321,10 @@ TreeComponent.decorators = [
416
321
  ];
417
322
  TreeComponent.ctorParameters = () => [
418
323
  { type: Injector },
324
+ { type: undefined, decorators: [{ type: Attribute, args: ['datavalue.bind',] }] },
325
+ { type: undefined, decorators: [{ type: Attribute, args: ['nodelabel.bind',] }] },
326
+ { type: undefined, decorators: [{ type: Attribute, args: ['nodeicon.bind',] }] },
327
+ { type: undefined, decorators: [{ type: Attribute, args: ['nodechildren.bind',] }] },
419
328
  { type: undefined, decorators: [{ type: Attribute, args: ['nodeid.bind',] }] }
420
329
  ];
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvdHJlZS9zcmMvdHJlZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1SSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJM0MsTUFBTSxXQUFXLEdBQUcsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQztBQUNuRSxNQUFNLG9CQUFvQixHQUFHLFlBQVksQ0FBQztBQVUxQyxNQUFNLE9BQU8sYUFBYyxTQUFRLGlCQUFpQjtJQTBDaEQsWUFDSSxHQUFhLEVBQ3FCLFVBQVU7UUFFNUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUZVLGVBQVUsR0FBVixVQUFVLENBQUE7UUEzQnhDLFlBQU8sR0FBRztZQUNkLElBQUksRUFBRTtnQkFDRixVQUFVLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLEtBQUs7aUJBQ2hCO2dCQUNELEdBQUcsRUFBRTtvQkFDRCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsSUFBSSxFQUFFLE9BQU87aUJBQ2hCO2FBQ0o7WUFDRCxJQUFJLEVBQUU7Z0JBQ0YsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDTCxjQUFjLEVBQUUsSUFBSTtpQkFDckI7Z0JBQ0gsVUFBVSxFQUFF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LENBQUM7O0FBaGNNLDZCQUFlLEdBQUcsYUFBYSxFQUFFLENBQUM7O1lBVDVDLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsNERBQW9DO2dCQUNwQyxTQUFTLEVBQUU7b0JBQ1Asa0JBQWtCLENBQUMsYUFBYSxDQUFDO2lCQUNwQztnQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTthQUN4Qzs7O1lBakI4QixRQUFROzRDQThEOUIsU0FBUyxTQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGUsIENvbXBvbmVudCwgSW5qZWN0b3IsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFQUExZX1NUWUxFU19UWVBFLCBnZXRFdmFsdWF0ZWREYXRhLCBnZXRPcmRlcmVkRGF0YXNldCwgcHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyIH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5pbXBvcnQgeyByZWdpc3RlclByb3BzIH0gZnJvbSAnLi90cmVlLnByb3BzJztcbmltcG9ydCB7IGdldENsb25lZE9iamVjdCB9IGZyb20gXCJAd20vY29yZVwiO1xuXG5kZWNsYXJlIGNvbnN0IF8sICQ7XG5cbmNvbnN0IFdJREdFVF9JTkZPID0ge3dpZGdldFR5cGU6ICd3bS10cmVlJywgaG9zdENsYXNzOiAnYXBwLXRyZWUnfTtcbmNvbnN0IGRlZmF1bHRUcmVlSWNvbkNsYXNzID0gJ3BsdXMtbWludXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VsW3dtVHJlZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKFRyZWVDb21wb25lbnQpXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVDb21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcblxuICAgIHB1YmxpYyBzZWxlY3RlZGl0ZW06IGFueTtcbiAgICBwdWJsaWMgbm9kZWlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBub2RlcztcbiAgICBwcml2YXRlIGxldmVsO1xuICAgIHByaXZhdGUgb3JkZXJieTtcbiAgICBwcml2YXRlIG5vZGVsYWJlbDtcbiAgICBwcml2YXRlIHRyZWVpY29uO1xuICAgIHByaXZhdGUgbm9kZWNoaWxkcmVuO1xuICAgIHByaXZhdGUgbm9kZWNsaWNrO1xuICAgIHByaXZhdGUgdHJlZUNsYXNzO1xuICAgIHByaXZhdGUgbm9kZWljb247XG4gICAgcHJpdmF0ZSBuYW1lO1xuICAgIHByaXZhdGUgZGF0YXZhbHVlO1xuXG4gICAgcHJpdmF0ZSBzZXR0aW5nID0ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBzaW1wbGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleToge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdsYWJlbCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlldzoge1xuICAgICAgICAgICAgZGJsQ2xpY2tFeHBhbmQ6IGZhbHNlLFxuICAgICAgICAgICAgZm9udENzczoge1xuICAgICAgICAgICAgICAgICdmb250LWF3ZXNvbWUnOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzd2l0Y2hJY29uOiB7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrOiB7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGxiYWNrOiB7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ25vZGVpZC5iaW5kJykgcHJpdmF0ZSBiaW5kbm9kZWlkXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0lORk8pO1xuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLCBBUFBMWV9TVFlMRVNfVFlQRS5DT05UQUlORVIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNldCc6XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMuZ2V0Tm9kZXMobnYpO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMubGV2ZWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kVHJlZSh0aGlzLmxldmVsLCB0aGlzLm5vZGVzLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdsZXZlbHMnOlxuICAgICAgICAgICAgICAgIGlmIChudiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZXZlbCA9IG52O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RyZWVpY29ucyc6XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlaWNvbiA9IG52O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm9kZWxhYmVsJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZGF0YS5rZXkubmFtZSA9IHRoaXMubGFiZWxLZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdub2RlY2hpbGRyZW4nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5kYXRhLmtleS5jaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5LZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdub2RlaWNvbic6XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlaWNvbiA9IHRoaXMuaWNvbktleTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29yZGVyYnknOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNsYXNzID0gbnY7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXhwYW5kcyB0aGUgdHJlZSBub2RlcyBpZiB0aGUgcHJvcGVydHkgaXMgc2VsZWN0ZWQuXG4gICAgcHJpdmF0ZSBleHBhbmRUcmVlKGxldmVsLCBub2RlLCBjaGlsZExldmVsKSB7XG4gICAgICAgIG5vZGUubWFwKGNoaWxkTm9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2hpbGROb2RlKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiAhKFwib3BlblwiIGluIGNoaWxkTm9kZSkgJiYgY2hpbGRMZXZlbCA8IGxldmVsKSB7XG4gICAgICAgICAgICAgICAgY2hpbGROb2RlW1wib3BlblwiXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmRUcmVlKGxldmVsLCBjaGlsZHJlbiwgY2hpbGRMZXZlbCsxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hpbGRMZXZlbCA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzZXRzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRyZWUgYmFzZWQgb24gdGhlIHByb3BlcnR5IHNlbGVjdGVkLlxuICAgIHByaXZhdGUgc2V0VHJlZVRlbXBsYXRlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ0NsYXNzaWMnKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY2hlY2tbXCJlbmFibGVcIl0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmKHZhbHVlID09PSAnQ2hlY2tib3gnKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY2hlY2tbXCJlbmFibGVcIl0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNoZWNrW1wiY2hrU3R5bGVcIl0gPSAnY2hlY2tib3gnO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnUmFkaW8nKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY2hlY2tbXCJlbmFibGVcIl0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNoZWNrW1wiY2hrU3R5bGVcIl0gPSAncmFkaW8nO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNoZWNrW1wicmFkaW9UeXBlXCJdID0gXCJhbGxcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4dHJhY3RzIG5vZGVzIGZyb20gc3RyaW5nIGZvcm1hdFxuICAgIHByaXZhdGUgZ2V0Tm9kZXNGcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnbGFiZWwnOiBpdGVtICYmIGl0ZW0udHJpbSgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBnZXRzIHRoZSBub2RlcyBhbmQgb3JkZXJzIHRoZSBub2RlcyBpZiByZXF1aXJlZFxuICAgIHByaXZhdGUgZ2V0Tm9kZXMobmV3VmFsKSB7XG4gICAgICAgIGxldCBub2RlcztcbiAgICAgICAgaWYgKF8uaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICBub2RlcyA9IGdldE9yZGVyZWREYXRhc2V0KG5ld1ZhbCwgdGhpcy5vcmRlcmJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgIG5vZGVzID0gW25ld1ZhbF07XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhuZXdWYWwpICYmICFfLmlzRW1wdHkobmV3VmFsKSkge1xuICAgICAgICAgICAgbmV3VmFsID0gbmV3VmFsLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IHRoaXMuZ2V0Tm9kZXNGcm9tU3RyaW5nKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cblxuXG4gICAgLy8gYWRkcyBjbGFzcyB0byB0aGUgbm9kZXMgaW5vcmRlciB0byBhZGQgaWNvbnMgdG8gcmVzcGVjdGl2ZSBub2RlLlxuICAgIHByaXZhdGUgc2V0Tm9kZWNsYXNzZXModHJlZUlkLCB0cmVlTm9kZSkge1xuICAgICAgICByZXR1cm4gdHJlZU5vZGUuaWNvbiA/IHthZGQ6IFtgJHt0cmVlTm9kZS5pY29ufWBdfSA6ICcnO1xuICAgIH07XG5cbiAgICAvLyBTZXRzIHRoZSBub2RlIGxhYmVsIHdpdGggYW55IGljb24gaWYgYm91bmQgdG9cbiAgICBwcml2YXRlIHNldE5vZGVEYXRhKG5vZGVzLCBkZXB0aCwgbGV2ZWwsIHBhcmVudE5vZGUsIHR5cGUpIHtcbiAgICAgICAgaWYoZGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIG5vZGVzLm1hcChub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4obm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZURhdGEoY2hpbGRyZW4sIGRlcHRoLCBsZXZlbCAsIHBhcmVudE5vZGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pY29uICYmIHRoaXMubm9kZWxhYmVsID09ICdpY29uJykge1xuICAgICAgICAgICAgICAgICAgICBub2RlW3R5cGVdID0gbm9kZS5pY29uO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZihub2RlLm5hbWUgJiYgdGhpcy5ub2RlbGFiZWwgPT0gJ25hbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVbdHlwZV0gPSBub2RlLm5hbWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2Rlcy5tYXAobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBsZXZlbCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGVwdGggPT09IGxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE5vZGVEYXRhKGNoaWxkcmVuLCBkZXB0aCwgbGV2ZWwgLSAxLCBwYXJlbnROb2RlLCB0eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSAxICYmICh0eXBlID09PSBcIm5hbWVcIiA/IHRoaXMubm9kZWxhYmVsLmluY2x1ZGVzKFwibGFiZWxcIikgfHwgdGhpcy5ub2RlbGFiZWwuaW5jbHVkZXMoXCJuYW1lXCIpOiB0aGlzLm5vZGVpY29uLmluY2x1ZGVzKFwibGFiZWxcIikgfHwgdGhpcy5ub2RlaWNvbi5pbmNsdWRlcyhcIm5hbWVcIikgKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlW3R5cGVdID0gbm9kZS5uYW1lIHx8IG5vZGUubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZihsZXZlbCA9PT0gMSAmJiAobm9kZS5pY29uICE9PSB1bmRlZmluZWQpICYmICh0eXBlID09PSBcIm5hbWVcIiA/IHRoaXMubm9kZWxhYmVsLmluY2x1ZGVzKFwiaWNvblwiKSA6IHRoaXMubm9kZWljb24uaW5jbHVkZXMoXCJpY29uXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlW3R5cGVdID0gbm9kZS5pY29uO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGRzIHRyZWUgaWNvbnMgdG8gdGhlIG5vZGVzIG9uIGxvYWQgb2YgdGhlIHRyZWVcbiAgICBwcml2YXRlIGNoYW5nZVRyZWVJY29ucyhudikge1xuICAgICAgICBsZXQgZWxlQ2xvc2UgPSAkKCd1bFtuYW1lPVwiJyArIHRoaXMubmFtZSArICdcIl0gbGkgc3Bhbi5idXR0b24uc3dpdGNoJyk7XG5cbiAgICAgICAgJChlbGVDbG9zZSkubWFwKChpZHgsIGVsZSkgPT4ge1xuICAgICAgICAgICAgJChlbGUpLmFkZENsYXNzKG52KTtcbiAgICAgICAgICAgICQoZWxlKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZSkuYWRkQ2xhc3MobnYpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXRoKHRyZWVOb2RlLCBwYXRoKSB7XG4gICAgICAgIGlmKHRyZWVOb2RlLmdldFBhcmVudE5vZGUoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgdHJlZU5vZGVbdGhpcy5sYWJlbEtleV0gKyBwYXRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IHRoaXMuZ2V0UGF0aCh0cmVlTm9kZS5nZXRQYXJlbnROb2RlKCksIHBhdGgpICsgXCIvXCIgKyB0cmVlTm9kZVt0aGlzLmxhYmVsS2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICAvLyBiaW5kcyB0aGUgY2xpY2sgZXZlbnQgdG8gYWxsIG5vZGVzIHRvIG9wZW4gdGhlIGNoaWxkIG5vZGVzXG4gICAgcHVibGljIG9uQ2xpY2soZXZlbnQsIHRyZWVJZCwgdHJlZU5vZGUsIGNsaWNrRmxhZykge1xuICAgICAgICBpZih0aGlzLm5vZGVjbGljayA9PT0gXCJleHBhbmRcIikge1xuICAgICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy50cmVlT2JqLmdldFNlbGVjdGVkTm9kZXMoKTtcbiAgICAgICAgICAgIGlmIChub2Rlcy5sZW5ndGg+MCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2Rlc1swXSwgIW5vZGVzWzBdLm9wZW4sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShldmVudCwgdHJlZU5vZGUpO1xuICAgIH1cblxuICAgIC8vIEFkZHMgdHJlZSBpY29uIGNsYXNzZXMgdG8gY2hpbGQgbm9kZXMgd2hlbiBleHBhbmRlZFxuICAgIHB1YmxpYyBvbkV4cGFuZChldmVudCwgdHJlZUlkLCB0cmVlTm9kZSkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBwYXRoID0gdGhpcy5nZXRQYXRoKHRyZWVOb2RlLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBldmVudFBhcmFtcyA9IHtcbiAgICAgICAgICAgICckZXZlbnQnICA6IGV2ZW50LFxuICAgICAgICAgICAgXCIkaXRlbVwiICAgOiB0cmVlTm9kZSxcbiAgICAgICAgICAgIFwiJHBhdGhcIiA6IHBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdleHBhbmQnLCBldmVudFBhcmFtcyk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKHRyZWVOb2RlKTtcbiAgICAgICAgY2hpbGRyZW4/Lm1hcCgoZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChlbC5pc1BhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGUgPSAkKGAjJHtlbC50SWR9X3N3aXRjaGApO1xuICAgICAgICAgICAgICAgICQoZWxlKS5hZGRDbGFzcyhzZWxmLnRyZWVpY29uIHx8IGRlZmF1bHRUcmVlSWNvbkNsYXNzKTtcbiAgICAgICAgICAgICAgICAkKGVsZSkub24oXCJjbGlja1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChlbGUpLmFkZENsYXNzKHNlbGYudHJlZWljb24gfHwgZGVmYXVsdFRyZWVJY29uQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sbGFwc2UoZXZlbnQsIHRyZWVJZCwgdHJlZU5vZGUpIHtcbiAgICAgICAgbGV0IHBhdGggPSB0aGlzLmdldFBhdGgodHJlZU5vZGUsIFwiXCIpO1xuICAgICAgICBjb25zdCBldmVudFBhcmFtcyA9IHtcbiAgICAgICAgICAgICckZXZlbnQnICA6IGV2ZW50LFxuICAgICAgICAgICAgXCIkaXRlbVwiICAgOiB0cmVlTm9kZSxcbiAgICAgICAgICAgIFwiJHBhdGhcIiA6IHBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjb2xsYXBzZScsIGV2ZW50UGFyYW1zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENoaWxkcmVuKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVbdGhpcy5jaGlsZHJlbktleV07XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbktleSgpIHtcbiAgICAgICAgaWYoIXRoaXMubm9kZWNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2NoaWxkcmVuJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXB0aCA9IHRoaXMuY291bnREZXB0aCh0aGlzLm5vZGVjaGlsZHJlbik7XG4gICAgICAgIHJldHVybiBkZXB0aCA/IHRoaXMubm9kZWNoaWxkcmVuLnNwbGl0KCcuJykucG9wKCkgOiB0aGlzLm5vZGVjaGlsZHJlbjtcbiAgICB9XG4gICAgZ2V0IGxhYmVsS2V5KCkge1xuICAgICAgICBpZighdGhpcy5ub2RlbGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGFiZWwnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlcHRoID0gdGhpcy5jb3VudERlcHRoKHRoaXMubm9kZWxhYmVsKTtcbiAgICAgICAgcmV0dXJuIGRlcHRoID8gdGhpcy5ub2RlbGFiZWwuc3BsaXQoJy4nKS5wb3AoKSA6IHRoaXMubm9kZWxhYmVsO1xuICAgIH1cbiAgICBnZXQgaWNvbktleSgpIHtcbiAgICAgICAgaWYoIXRoaXMubm9kZWljb24pIHtcbiAgICAgICAgICAgIHJldHVybiAnaWNvbic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVwdGggPSB0aGlzLmNvdW50RGVwdGgodGhpcy5ub2RlaWNvbik7XG4gICAgICAgIHJldHVybiBkZXB0aCA/IHRoaXMubm9kZWljb24uc3BsaXQoJy4nKS5wb3AoKSA6IHRoaXMubm9kZWljb247XG4gICAgfVxuXG4gICAgZ2V0IHRyZWVPYmooKXtcbiAgICAgICAgcmV0dXJuICQuZm4uelRyZWUuZ2V0WlRyZWVPYmooYCR7dGhpcy5uYW1lfWApXG4gICAgfVxuXG4gICAgLy8gZnVuY3Rpb24gdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mIG9iamVjdHNcbiAgICBwcml2YXRlIG1vZGlmeU9iamVjdHMoYXJyYXkpIHtcbiAgICAgICAgYXJyYXkuZm9yRWFjaChvYmogPT4ge1xuICAgICAgICAgIG9iai5pY29uID0gb2JqW3RoaXMubm9kZWljb25dO1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihvYmopO1xuICAgICAgICAgIGlmIChjaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGlmeU9iamVjdHMoY2hpbGRyZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAvLyBzZXRzIHRoZSBub2RlIGNoaWxkcmVuIHByb3BlcnR5IHRvIHBhcmVudCBub2Rlc1xuICAgIHByaXZhdGUgc2V0Tm9kZUNoaWxkcmVuKG5vZGVzLCBkZXB0aCwgbGV2ZWwsIHBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKGRlcHRoIDw9IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcblxuICAgICAgICAgIGlmKGRlcHRoID09PSBsZXZlbCkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZSAgPSBub2Rlc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKG5vZGUpO1xuICAgICAgICAgIGlmIChjaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobGV2ZWwgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlW3RoaXMuY2hpbGRyZW5LZXldID0gY2hpbGRyZW4ubWFwKGNoaWxkID0+ICh7IFt0aGlzLmxhYmVsS2V5XTogY2hpbGRbdGhpcy5sYWJlbEtleV0sIFt0aGlzLmNoaWxkcmVuS2V5XTogdGhpcy5nZXRDaGlsZHJlbihjaGlsZCksIGljb246IGNoaWxkW3RoaXMuaWNvbktleV0gfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuKGNoaWxkcmVuLCBkZXB0aCAsbGV2ZWwgLSAxLCBwYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICB9XG5cbiAgICBwcml2YXRlIGNvdW50RGVwdGgoc3RyKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gL1xcWy4qP1xcXS9nO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IHN0ci5tYXRjaChyZWdleCk7XG4gICAgICAgIGxldCBjb3VudCA9IDE7XG5cbiAgICAgICAgaWYobWF0Y2hlcyA9PT0gbnVsbCkgcmV0dXJuIGNvdW50O1xuXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgfVxuXG5cbiAgICAvLyBSZW5kZXJzIHRoZSB0cmVlIG9uIHRvIHRoZSBkb21cbiAgICBwdWJsaWMgcmVuZGVyVHJlZSgpIHtcbiAgICAgICAgaWYodGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLm5hbWUpO1xuICAgICAgICAgICAgIGlmKHRoaXMubm9kZWljb24gJiYgdGhpcy5ub2RlaWNvbiAhPT0gJ2ljb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlPYmplY3RzKHRoaXMubm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRUcmVlVGVtcGxhdGUodGhpcy50cmVlQ2xhc3MpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5ub2RlbGFiZWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGggPTA7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5ub2RlbGFiZWwuaW5jbHVkZXMoXCJjaGlsZHJlblwiKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IHRoaXMuY291bnREZXB0aCh0aGlzLm5vZGVsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZURhdGEodGhpcy5ub2RlcywgZGVwdGgsIGRlcHRoLCBudWxsLCBcIm5hbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLm5vZGVpY29uKSAge1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9MDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLm5vZGVpY29uLmluY2x1ZGVzKFwiY2hpbGRyZW5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGggPSB0aGlzLmNvdW50RGVwdGgodGhpcy5ub2RlaWNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Tm9kZURhdGEodGhpcy5ub2RlcywgZGVwdGgsIGRlcHRoLCBudWxsLCBcImljb25cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IHRoaXMuY291bnREZXB0aCh0aGlzLm5vZGVjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgaWYoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLnNldE5vZGVDaGlsZHJlbih0aGlzLm5vZGVzLCBkZXB0aCwgZGVwdGgsIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgdGhpcy5zZXR0aW5nLnZpZXdbJ25vZGVDbGFzc2VzJ10gPSB0aGlzLnNldE5vZGVjbGFzc2VzO1xuICAgICAgICB0aGlzLnNldHRpbmcuY2FsbGJhY2tbXCJvbkNsaWNrXCJdID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0dGluZy5jYWxsYmFja1tcIm9uRXhwYW5kXCJdID0gdGhpcy5vbkV4cGFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNldHRpbmcuY2FsbGJhY2tbXCJvbkNvbGxhcHNlXCJdID0gdGhpcy5vbkNvbGxhcHNlLmJpbmQodGhpcyk7XG5cbiAgICAgICAgbGV0IHpUcmVlID0gJC5mbi56VHJlZS5pbml0KCQoJ3VsW25hbWU9XCInICsgdGhpcy5uYW1lICsgJ1wiXScpLCB0aGlzLnNldHRpbmcsIHRoaXMubm9kZXMpO1xuXG4gICAgICAgICQuZm4uelRyZWVLZXlib2FyZE5hdmlnYXRpb24oelRyZWUsICQoJ3VsW25hbWU9XCInICsgdGhpcy5uYW1lICsgJ1wiXScpLCBudWxsLCB0aGlzLnRyZWVpY29uIHx8IGRlZmF1bHRUcmVlSWNvbkNsYXNzKTtcbiAgICAgICAgdGhpcy5wb3N0UmVuZGVyVHJlZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0Tm9kZShldmVudCwgbm9kZSkge1xuICAgICAgICBjb25zdCBkZVNlbGVjdEVsbSA9ICQoYC5hcHAtdHJlZVtuYW1lPSR7dGhpcy5uYW1lfV0gbGlbdHJlZW5vZGVdLnNlbGVjdGVkYCk7XG4gICAgICAgIGRlU2VsZWN0RWxtLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuXG4gICAgICAgIGlmKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0RWxtID0gJChgIyR7bm9kZS50SWR9OmhhcyguY3VyU2VsZWN0ZWROb2RlKWApO1xuICAgICAgICBzZWxlY3RFbG0uYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0UGF0aChub2RlLCBcIlwiKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0gPSBnZXRDbG9uZWRPYmplY3Qobm9kZSkgfHwge307XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtLnBhdGggPSBwYXRoO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgJyRldmVudCcgIDogZXZlbnQsXG4gICAgICAgICAgICBcIiRpdGVtXCIgICA6IG5vZGUsXG4gICAgICAgICAgICBcIiRwYXRoXCIgOiBwYXRoXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0JywgZXZlbnRQYXJhbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXhwYW5kTm9kZShub2RlLCBleHBhbmQsIGV2ZW50RmxhZykge1xuICAgICAgICB0aGlzLnRyZWVPYmouZXhwYW5kTm9kZShub2RlLCBleHBhbmQsIGZhbHNlLCBmYWxzZSwgZXZlbnRGbGFnKTtcbiAgICAgICAgY29uc3QgZWwgPSAkKGAjJHtub2RlLnRJZH1fc3dpdGNoYCk7XG4gICAgICAgICQoZWwpLmFkZENsYXNzKHRoaXMudHJlZWljb24gfHwgZGVmYXVsdFRyZWVJY29uQ2xhc3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdFJlbmRlclRyZWUoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUcmVlSWNvbnModGhpcy50cmVlaWNvbiB8fCBkZWZhdWx0VHJlZUljb25DbGFzcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGF2YWx1ZSAmJiAhdGhpcy5zZWxlY3RlZGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMudHJlZU9iai5nZXROb2RlcygpO1xuICAgICAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgICAgIGlmKG5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhdmFsdWUgPT09ICdGaXJzdE5vZGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhdmFsdWUgPT09ICdMYXN0Tm9kZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVPYmouc2VsZWN0Tm9kZShub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Tm9kZSh1bmRlZmluZWQsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZE5vZGUobm9kZSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEJ5SWQodmFsdWU/KSB7XG4gICAgICAgIGNvbnN0IHNpbXBsZU5vZGVzID0gdGhpcy50cmVlT2JqLnRyYW5zZm9ybVRvQXJyYXkodGhpcy50cmVlT2JqLmdldE5vZGVzKCkpO1xuICAgICAgICBjb25zdCBub2RlID0gc2ltcGxlTm9kZXMuZmluZChub2RlID0+IHZhbHVlID09PSBnZXRFdmFsdWF0ZWREYXRhKG5vZGUsIHtmaWVsZDogdGhpcy5ub2RlaWQsIGJpbmRFeHByZXNzaW9uOiB0aGlzLmJpbmRub2RlaWR9LCB0aGlzLnZpZXdQYXJlbnQpKTtcbiAgICAgICAgaWYobm9kZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlT2JqLnNlbGVjdE5vZGUobm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHVuZGVmaW5lZCwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBkZXNlbGVjdEJ5SWQodmFsdWU/KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtID0ge307XG4gICAgICAgIHRoaXMuc2VsZWN0QnlJZCgpO1xuICAgIH1cbn1cbiJdfQ==
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvdHJlZS9zcmMvdHJlZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1SSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSXhELE1BQU0sV0FBVyxHQUFHLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7QUFDbkUsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUM7QUFVMUMsTUFBTSxPQUFPLGFBQWMsU0FBUSxpQkFBaUI7SUFzQ2hELFlBQ0ksR0FBYSxFQUN3QixhQUFhLEVBQ2IsYUFBYSxFQUNkLFlBQVksRUFDUixnQkFBZ0IsRUFDdEIsVUFBVTtRQUU1QyxLQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBTmEsa0JBQWEsR0FBYixhQUFhLENBQUE7UUFDYixrQkFBYSxHQUFiLGFBQWEsQ0FBQTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFBO1FBQ1IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFBO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQUE7UUF2QnhDLFlBQU8sR0FBRztZQUNkLElBQUksRUFBRTtnQkFDRixVQUFVLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLEtBQUs7aUJBQ2hCO2FBQ0o7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O2dCQUNELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3hDOzs7WUFqQjhCLFFBQVE7NENBMEQ5QixTQUFTLFNBQUMsZ0JBQWdCOzRDQUMxQixTQUFTLFNBQUMsZ0JBQWdCOzRDQUMxQixTQUFTLFNBQUMsZUFBZTs0Q0FDekIsU0FBUyxTQUFDLG1CQUFtQjs0Q0FDN0IsU0FBUyxTQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGUsIENvbXBvbmVudCwgSW5qZWN0b3IsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFQUExZX1NUWUxFU19UWVBFLCBnZXRFdmFsdWF0ZWREYXRhLCBnZXRPcmRlcmVkRGF0YXNldCwgcHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyIH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5pbXBvcnQgeyByZWdpc3RlclByb3BzIH0gZnJvbSAnLi90cmVlLnByb3BzJztcbmltcG9ydCB7ICRwYXJzZUV2ZW50LCBnZXRDbG9uZWRPYmplY3QgfSBmcm9tIFwiQHdtL2NvcmVcIjtcblxuZGVjbGFyZSBjb25zdCBfLCAkO1xuXG5jb25zdCBXSURHRVRfSU5GTyA9IHt3aWRnZXRUeXBlOiAnd20tdHJlZScsIGhvc3RDbGFzczogJ2FwcC10cmVlJ307XG5jb25zdCBkZWZhdWx0VHJlZUljb25DbGFzcyA9ICdwbHVzLW1pbnVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1bFt3bVRyZWVdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihUcmVlQ29tcG9uZW50KVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUcmVlQ29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG5cbiAgICBwcml2YXRlIG5vZGVzOiBBcnJheTxhbnk+O1xuICAgIHByaXZhdGUgelRyZWVOb2RlczogQXJyYXk8YW55PjtcbiAgICBwcml2YXRlIGxldmVsO1xuICAgIHByaXZhdGUgdHJlZUNsYXNzO1xuICAgIHByaXZhdGUgbmFtZTtcbiAgICBwcml2YXRlIHpUcmVlO1xuXG4gICAgcHVibGljIGRhdGF2YWx1ZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0cmVlaWNvbnM6IHN0cmluZztcbiAgICBwdWJsaWMgc2VsZWN0ZWRpdGVtOiBhbnk7XG4gICAgcHVibGljIG5vZGVpZDogc3RyaW5nO1xuICAgIHB1YmxpYyBub2RlYWN0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIG5vZGVjbGljazogc3RyaW5nO1xuICAgIHB1YmxpYyBub2RlbGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgbm9kZWljb246IHN0cmluZztcbiAgICBwdWJsaWMgbm9kZWNoaWxkcmVuOiBzdHJpbmc7XG4gICAgcHVibGljIG9yZGVyYnk6IHN0cmluZztcblxuICAgIHByaXZhdGUgc2V0dGluZyA9IHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgc2ltcGxlRGF0YToge1xuICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlldzoge1xuICAgICAgICAgICAgZGJsQ2xpY2tFeHBhbmQ6IGZhbHNlLFxuICAgICAgICAgICAgZm9udENzczoge1xuICAgICAgICAgICAgICAgICdmb250LWF3ZXNvbWUnOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzd2l0Y2hJY29uOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2s6IHt9LFxuICAgICAgICBjYWxsYmFjazoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGF2YWx1ZS5iaW5kJykgcHJpdmF0ZSBiaW5kZGF0YXZhbHVlLFxuICAgICAgICBAQXR0cmlidXRlKCdub2RlbGFiZWwuYmluZCcpIHByaXZhdGUgYmluZG5vZGVsYWJlbCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnbm9kZWljb24uYmluZCcpIHByaXZhdGUgYmluZG5vZGVpY29uLFxuICAgICAgICBAQXR0cmlidXRlKCdub2RlY2hpbGRyZW4uYmluZCcpIHByaXZhdGUgYmluZG5vZGVjaGlsZHJlbixcbiAgICAgICAgQEF0dHJpYnV0ZSgnbm9kZWlkLmJpbmQnKSBwcml2YXRlIGJpbmRub2RlaWRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfSU5GTyk7XG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMsIEFQUExZX1NUWUxFU19UWVBFLkNPTlRBSU5FUik7XG5cbiAgICAgICAgdGhpcy5zZXR0aW5nLnZpZXdbJ25vZGVDbGFzc2VzJ10gICAgPSB0aGlzLnNldE5vZGVDbGFzc2VzO1xuICAgICAgICB0aGlzLnNldHRpbmcuY2FsbGJhY2tbXCJvbkNsaWNrXCJdICAgID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0dGluZy5jYWxsYmFja1tcIm9uRXhwYW5kXCJdICAgPSB0aGlzLm9uRXhwYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0dGluZy5jYWxsYmFja1tcIm9uQ29sbGFwc2VcIl0gPSB0aGlzLm9uQ29sbGFwc2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Qcm9wZXJ0eUNoYW5nZShrZXk6IHN0cmluZywgbnY6IGFueSwgb3Y/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzZXQnOlxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmdldE5vZGVzKG52KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2xldmVscyc6XG4gICAgICAgICAgICAgICAgdGhpcy5sZXZlbCA9IG52O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm9kZWljb24nOlxuICAgICAgICAgICAgICAgIHRoaXMubm9kZWljb24gPSBudjtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25vZGVsYWJlbCc6XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlbGFiZWwgPSBudjtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25vZGVjaGlsZHJlbic6XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlY2hpbGRyZW4gPSBudjtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29yZGVyYnknOlxuICAgICAgICAgICAgICAgIHRoaXMub3JkZXJieSA9IG52O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndHJlZWljb25zJzpcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVpY29ucyA9IG52O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNsYXNzID0gbnY7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUcmVlVGVtcGxhdGUodGhpcy50cmVlQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4cGFuZHMgdGhlIHRyZWUgbm9kZXMgaWYgdGhlIHByb3BlcnR5IGlzIHNlbGVjdGVkLlxuICAgIHByaXZhdGUgZXhwYW5kVHJlZShsZXZlbCwgbm9kZSwgY2hpbGRMZXZlbCkge1xuICAgICAgICBub2RlLm1hcChjaGlsZE5vZGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZE5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRMZXZlbCA8IGxldmVsKSB7XG4gICAgICAgICAgICAgICAgY2hpbGROb2RlLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kVHJlZShsZXZlbCwgY2hpbGRyZW4sIGNoaWxkTGV2ZWwrMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkTGV2ZWwgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0cyB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0cmVlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBzZWxlY3RlZC5cbiAgICBwcml2YXRlIHNldFRyZWVUZW1wbGF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XG4gICAgICAgIGlmIChjbGFzc0xpc3QuaW5jbHVkZXMoJ0NsYXNzaWMnKSkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNoZWNrW1wiZW5hYmxlXCJdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZihjbGFzc0xpc3QuaW5jbHVkZXMoJ0NoZWNrYm94JykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jaGVja1tcImVuYWJsZVwiXSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY2hlY2tbXCJjaGtTdHlsZVwiXSA9ICdjaGVja2JveCc7XG4gICAgICAgIH0gZWxzZSBpZiAoY2xhc3NMaXN0LmluY2x1ZGVzKCdSYWRpbycpKSB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY2hlY2tbXCJlbmFibGVcIl0gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNoZWNrW1wiY2hrU3R5bGVcIl0gPSAncmFkaW8nO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNoZWNrW1wicmFkaW9UeXBlXCJdID0gXCJhbGxcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4dHJhY3RzIG5vZGVzIGZyb20gc3RyaW5nIGZvcm1hdFxuICAgIHByaXZhdGUgZ2V0Tm9kZXNGcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnbGFiZWwnOiBpdGVtICYmIGl0ZW0udHJpbSgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBnZXRzIHRoZSBub2RlcyBhbmQgb3JkZXJzIHRoZSBub2RlcyBpZiByZXF1aXJlZFxuICAgIHByaXZhdGUgZ2V0Tm9kZXMobmV3VmFsKSB7XG4gICAgICAgIGxldCBub2RlcztcbiAgICAgICAgaWYgKF8uaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICBub2RlcyA9IGdldE9yZGVyZWREYXRhc2V0KG5ld1ZhbCwgdGhpcy5vcmRlcmJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgIG5vZGVzID0gW25ld1ZhbF07XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhuZXdWYWwpICYmICFfLmlzRW1wdHkobmV3VmFsKSkge1xuICAgICAgICAgICAgbmV3VmFsID0gbmV3VmFsLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IHRoaXMuZ2V0Tm9kZXNGcm9tU3RyaW5nKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cblxuXG4gICAgLy8gYWRkcyBjbGFzcyB0byB0aGUgbm9kZXMgaW5vcmRlciB0byBhZGQgaWNvbnMgdG8gcmVzcGVjdGl2ZSBub2RlLlxuICAgIHByaXZhdGUgc2V0Tm9kZUNsYXNzZXModHJlZUlkLCB0cmVlTm9kZSkge1xuICAgICAgICByZXR1cm4gdHJlZU5vZGUuaWNvbiA/IHthZGQ6IFtgJHt0cmVlTm9kZS5pY29ufWBdfSA6ICcnO1xuICAgIH07XG5cbiAgICAvLyBhZGRzIHRyZWUgaWNvbnMgdG8gdGhlIG5vZGVzIG9uIGxvYWQgb2YgdGhlIHRyZWVcbiAgICBwcml2YXRlIGNoYW5nZVRyZWVJY29ucyhudikge1xuICAgICAgICBsZXQgZWxlQ2xvc2UgPSAkKCd1bFtuYW1lPVwiJyArIHRoaXMubmFtZSArICdcIl0gbGkgc3Bhbi5idXR0b24uc3dpdGNoJyk7XG5cbiAgICAgICAgJChlbGVDbG9zZSkubWFwKChpZHgsIGVsZSkgPT4ge1xuICAgICAgICAgICAgJChlbGUpLmFkZENsYXNzKG52KTtcbiAgICAgICAgICAgICQoZWxlKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZSkuYWRkQ2xhc3MobnYpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgbm9kZSBwYXRoXG4gICAgcHJpdmF0ZSBnZXRQYXRoKHRyZWVOb2RlLCBwYXRoKSB7XG4gICAgICAgIGlmKHRyZWVOb2RlLmdldFBhcmVudE5vZGUoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgdHJlZU5vZGUubmFtZSArIHBhdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoID0gdGhpcy5nZXRQYXRoKHRyZWVOb2RlLmdldFBhcmVudE5vZGUoKSwgcGF0aCkgKyBcIi9cIiArIHRyZWVOb2RlLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgLy8gYmluZHMgdGhlIGNsaWNrIGV2ZW50IHRvIGFsbCBub2RlcyB0byBvcGVuIHRoZSBjaGlsZCBub2Rlc1xuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50LCB0cmVlSWQsIHRyZWVOb2RlLCBjbGlja0ZsYWcpIHtcbiAgICAgICAgaWYodGhpcy5ub2RlY2xpY2sgPT09IFwiZXhwYW5kXCIpIHtcbiAgICAgICAgICAgIHZhciBub2RlcyA9IHRoaXMuelRyZWUuZ2V0U2VsZWN0ZWROb2RlcygpO1xuICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aD4wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKG5vZGVzWzBdLCAhbm9kZXNbMF0ub3BlbiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKGV2ZW50LCB0cmVlTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkcyB0cmVlIGljb24gY2xhc3NlcyB0byBjaGlsZCBub2RlcyB3aGVuIGV4cGFuZGVkXG4gICAgcHVibGljIG9uRXhwYW5kKGV2ZW50LCB0cmVlSWQsIHRyZWVOb2RlKSB7XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IHBhdGggPSB0aGlzLmdldFBhdGgodHJlZU5vZGUsIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgJyRldmVudCcgIDogZXZlbnQsXG4gICAgICAgICAgICBcIiRpdGVtXCIgICA6IGdldENsb25lZE9iamVjdCh0cmVlTm9kZS5kYXRhKSxcbiAgICAgICAgICAgIFwiJHBhdGhcIiA6IHBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdleHBhbmQnLCBldmVudFBhcmFtcyk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0cmVlTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgY2hpbGRyZW4/Lm1hcCgoZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChlbC5pc1BhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGUgPSAkKGAjJHtlbC50SWR9X3N3aXRjaGApO1xuICAgICAgICAgICAgICAgICQoZWxlKS5hZGRDbGFzcyhzZWxmLnRyZWVpY29ucyB8fCBkZWZhdWx0VHJlZUljb25DbGFzcyk7XG4gICAgICAgICAgICAgICAgJChlbGUpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZWxlKS5hZGRDbGFzcyhzZWxmLnRyZWVpY29ucyB8fCBkZWZhdWx0VHJlZUljb25DbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db2xsYXBzZShldmVudCwgdHJlZUlkLCB0cmVlTm9kZSkge1xuICAgICAgICBsZXQgcGF0aCA9IHRoaXMuZ2V0UGF0aCh0cmVlTm9kZSwgXCJcIik7XG4gICAgICAgIGNvbnN0IGV2ZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgJyRldmVudCcgIDogZXZlbnQsXG4gICAgICAgICAgICBcIiRpdGVtXCIgICA6IGdldENsb25lZE9iamVjdCh0cmVlTm9kZS5kYXRhKSxcbiAgICAgICAgICAgIFwiJHBhdGhcIiA6IHBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjb2xsYXBzZScsIGV2ZW50UGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBmdW5jdGlvbiB0byBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb2Ygb2JqZWN0c1xuICAgIHByaXZhdGUgY29uc3RydWN0WlRyZWVEYXRhKGRhdGEsIHpUcmVlRGF0YSkge1xuICAgICAgICBkYXRhLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB6Tm9kZSA9IHt9O1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGdldEV2YWx1YXRlZERhdGEobm9kZSwge2ZpZWxkOiB0aGlzLm5vZGVsYWJlbCwgYmluZEV4cHJlc3Npb246IHRoaXMuYmluZG5vZGVsYWJlbH0sIHRoaXMudmlld1BhcmVudCkgfHwgbm9kZS5sYWJlbDtcbiAgICAgICAgICAgIGNvbnN0IGljb24gPSBnZXRFdmFsdWF0ZWREYXRhKG5vZGUsIHtmaWVsZDogdGhpcy5ub2RlaWNvbiwgYmluZEV4cHJlc3Npb246IHRoaXMuYmluZG5vZGVpY29ufSwgdGhpcy52aWV3UGFyZW50KSB8fCBub2RlLmljb247XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSBnZXRFdmFsdWF0ZWREYXRhKG5vZGUsIHtmaWVsZDogdGhpcy5ub2RlaWQsIGJpbmRFeHByZXNzaW9uOiB0aGlzLmJpbmRub2RlaWR9LCB0aGlzLnZpZXdQYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBnZXRFdmFsdWF0ZWREYXRhKG5vZGUsIHtmaWVsZDogdGhpcy5ub2RlY2hpbGRyZW4sIGJpbmRFeHByZXNzaW9uOiB0aGlzLmJpbmRub2RlY2hpbGRyZW59LCB0aGlzLnZpZXdQYXJlbnQpIHx8IG5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICB6Tm9kZVsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgICAgIHpOb2RlWydpY29uJ10gPSBpY29uO1xuICAgICAgICAgICAgek5vZGVbJ25vZGVJZCddID0gbm9kZUlkO1xuICAgICAgICAgICAgek5vZGVbJ2RhdGEnXSA9IGdldENsb25lZE9iamVjdChub2RlKTtcbiAgICAgICAgICAgIGlmIChfLmlzQXJyYXkoY2hpbGRyZW4pICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHpOb2RlWydjaGlsZHJlbiddID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RaVHJlZURhdGEoY2hpbGRyZW4sIHpOb2RlWydjaGlsZHJlbiddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHpUcmVlRGF0YS5wdXNoKHpOb2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVycyB0aGUgdHJlZSBvbiB0byB0aGUgZG9tXG4gICAgcHVibGljIHJlbmRlclRyZWUoKSB7XG4gICAgICAgIHRoaXMuelRyZWVOb2RlcyA9IFtdO1xuICAgICAgICBpZih0aGlzLm5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0WlRyZWVEYXRhKHRoaXMubm9kZXMsIHRoaXMuelRyZWVOb2Rlcyk7XG4gICAgICAgICAgICBpZih0aGlzLmxldmVsID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kVHJlZSh0aGlzLmxldmVsLCB0aGlzLnpUcmVlTm9kZXMsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuelRyZWUgPSAkLmZuLnpUcmVlLmluaXQoJCgndWxbbmFtZT1cIicgKyB0aGlzLm5hbWUgKyAnXCJdJyksIHRoaXMuc2V0dGluZywgdGhpcy56VHJlZU5vZGVzKTtcbiAgICAgICAgJC5mbi56VHJlZUtleWJvYXJkTmF2aWdhdGlvbih0aGlzLnpUcmVlLCAkKCd1bFtuYW1lPVwiJyArIHRoaXMubmFtZSArICdcIl0nKSwgbnVsbCwgdGhpcy50cmVlaWNvbnMgfHwgZGVmYXVsdFRyZWVJY29uQ2xhc3MpO1xuICAgICAgICB0aGlzLnBvc3RSZW5kZXJUcmVlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGVja2VkKHpOb2RlLCBub2RlKSB7XG4gICAgICAgIG5vZGUuY2hlY2tlZCA9IHpOb2RlLmNoZWNrZWQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0RXZhbHVhdGVkRGF0YShub2RlLCB7ZmllbGQ6IHRoaXMubm9kZWNoaWxkcmVuLCBiaW5kRXhwcmVzc2lvbjogdGhpcy5iaW5kbm9kZWNoaWxkcmVufSwgdGhpcy52aWV3UGFyZW50KSB8fCBub2RlLmNoaWxkcmVuO1xuICAgICAgICBpZihjaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tlZCh6Tm9kZS5jaGlsZHJlbltpbmRleF0sIG5vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdE5vZGUoZXZlbnQsIG5vZGUpIHtcbiAgICAgICAgY29uc3QgZGVTZWxlY3RFbG0gPSAkKGAuYXBwLXRyZWVbbmFtZT0ke3RoaXMubmFtZX1dIGxpW3RyZWVub2RlXS5zZWxlY3RlZGApO1xuICAgICAgICBkZVNlbGVjdEVsbS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcblxuICAgICAgICBpZighbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdEVsbSA9ICQoYCMke25vZGUudElkfTpoYXMoLmN1clNlbGVjdGVkTm9kZSlgKTtcbiAgICAgICAgc2VsZWN0RWxtLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuXG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gKHRoaXMudHJlZUNsYXNzIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgaWYgKGNsYXNzTGlzdC5pbmNsdWRlcygnQ2hlY2tib3gnKSB8fCBjbGFzc0xpc3QuaW5jbHVkZXMoJ1JhZGlvJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tlZChub2RlLCBub2RlLmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0UGF0aChub2RlLCBcIlwiKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0gPSBnZXRDbG9uZWRPYmplY3Qobm9kZS5kYXRhKSB8fCB7fTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0ucGF0aCA9IHBhdGg7XG5cbiAgICAgICAgY29uc3QgZXZlbnRQYXJhbXMgPSB7XG4gICAgICAgICAgICAnJGV2ZW50JyAgOiBldmVudCxcbiAgICAgICAgICAgIFwiJGl0ZW1cIiAgIDogZ2V0Q2xvbmVkT2JqZWN0KG5vZGUuZGF0YSksXG4gICAgICAgICAgICBcIiRwYXRoXCIgOiBwYXRoXG4gICAgICAgIH07XG5cbiAgICAgICAgLy9bVG9kby1DU1BdOiB0aGlzIGRhdGEgd2lsbCBiZSBkeW5hbWljLCBjYW4gbm90IGdlbmVyYXRlIGZ1bmN0aW9uIHVwZnJvbnRcbiAgICAgICAgY29uc3Qgbm9kZUFjdGlvbiA9IG5vZGUuZGF0YVt0aGlzLm5vZGVhY3Rpb24gfHwgJ2FjdGlvbiddO1xuICAgICAgICBpZiAobm9kZUFjdGlvbikge1xuICAgICAgICAgICAgJHBhcnNlRXZlbnQobm9kZUFjdGlvbikodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3QnLCBldmVudFBhcmFtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHBhbmROb2RlKG5vZGUsIGV4cGFuZCwgZXZlbnRGbGFnKSB7XG4gICAgICAgIHRoaXMuelRyZWUuZXhwYW5kTm9kZShub2RlLCBleHBhbmQsIGZhbHNlLCBmYWxzZSwgZXZlbnRGbGFnKTtcbiAgICAgICAgY29uc3QgZWwgPSAkKGAjJHtub2RlLnRJZH1fc3dpdGNoYCk7XG4gICAgICAgICQoZWwpLmFkZENsYXNzKHRoaXMudHJlZWljb25zIHx8IGRlZmF1bHRUcmVlSWNvbkNsYXNzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBvc3RSZW5kZXJUcmVlKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVHJlZUljb25zKHRoaXMudHJlZWljb25zIHx8IGRlZmF1bHRUcmVlSWNvbkNsYXNzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXZhbHVlICYmICF0aGlzLnNlbGVjdGVkaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy56VHJlZS5nZXROb2RlcygpO1xuICAgICAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgICAgIGlmKG5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhdmFsdWUgPT09ICdGaXJzdE5vZGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhdmFsdWUgPT09ICdMYXN0Tm9kZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56VHJlZS5zZWxlY3ROb2RlKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHVuZGVmaW5lZCwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2RlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0QnlJZCh2YWx1ZT8pIHtcbiAgICAgICAgY29uc3Qgc2ltcGxlTm9kZXMgPSB0aGlzLnpUcmVlPy50cmFuc2Zvcm1Ub0FycmF5KHRoaXMuelRyZWUuZ2V0Tm9kZXMoKSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzaW1wbGVOb2Rlcz8uZmluZChub2RlID0+IHZhbHVlID09PSBub2RlLm5vZGVJZCk7XG4gICAgICAgIGlmKG5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuelRyZWUuc2VsZWN0Tm9kZShub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5vZGUodW5kZWZpbmVkLCBub2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGRlc2VsZWN0QnlJZCh2YWx1ZT8pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0gPSB7fTtcbiAgICAgICAgdGhpcy5zZWxlY3RCeUlkKCk7XG4gICAgfVxufVxuIl19