@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.29 → 0.0.2-ang-17-20

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 (122) hide show
  1. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +770 -200
  2. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
  3. package/index.d.ts +1052 -3
  4. package/index.d.ts.map +1 -0
  5. package/package.json +14 -16
  6. package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
  7. package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -41
  8. package/esm2022/lib/components/approval/approval.component.mjs +0 -19
  9. package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -64
  10. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -44
  11. package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -55
  12. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -74
  13. package/esm2022/lib/components/connector/connector.component.mjs +0 -59
  14. package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -83
  15. package/esm2022/lib/components/create-term/create-term.component.mjs +0 -847
  16. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -824
  17. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -223
  18. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -64
  19. package/esm2022/lib/components/term-card/term-card.component.mjs +0 -340
  20. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -354
  21. package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -826
  22. package/esm2022/lib/constants/app-constant.mjs +0 -40
  23. package/esm2022/lib/constants/data.mjs +0 -6972
  24. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -92
  25. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -14
  26. package/esm2022/lib/labels/strings.mjs +0 -40
  27. package/esm2022/lib/models/approval.model.mjs +0 -2
  28. package/esm2022/lib/models/connection-type.model.mjs +0 -2
  29. package/esm2022/lib/models/connection.model.mjs +0 -2
  30. package/esm2022/lib/models/framework.model.mjs +0 -2
  31. package/esm2022/lib/models/variable-type.model.mjs +0 -2
  32. package/esm2022/lib/pipes/order-by.pipe.mjs +0 -35
  33. package/esm2022/lib/services/approval.service.mjs +0 -47
  34. package/esm2022/lib/services/connection.service.mjs +0 -3
  35. package/esm2022/lib/services/connector.service.mjs +0 -286
  36. package/esm2022/lib/services/framework.service.mjs +0 -525
  37. package/esm2022/lib/services/local-connection.service.mjs +0 -75
  38. package/esm2022/lib/services/odcs.service.mjs +0 -23
  39. package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -43
  40. package/esm2022/lib/tree-hierarchy.component.mjs +0 -24
  41. package/esm2022/lib/tree-hierarchy.module.mjs +0 -145
  42. package/esm2022/lib/tree-hierarchy.service.mjs +0 -57
  43. package/esm2022/material.module.mjs +0 -199
  44. package/esm2022/public-api.mjs +0 -9
  45. package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
  46. package/lib/components/action-bar/action-bar.component.d.ts +0 -17
  47. package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
  48. package/lib/components/approval/approval.component.d.ts +0 -10
  49. package/lib/components/approval/approval.component.d.ts.map +0 -1
  50. package/lib/components/approve-view/approve-view.component.d.ts +0 -27
  51. package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
  52. package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
  53. package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
  54. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
  55. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
  56. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
  57. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
  58. package/lib/components/connector/connector.component.d.ts +0 -23
  59. package/lib/components/connector/connector.component.d.ts.map +0 -1
  60. package/lib/components/create-categories/create-categories.component.d.ts +0 -26
  61. package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
  62. package/lib/components/create-term/create-term.component.d.ts +0 -148
  63. package/lib/components/create-term/create-term.component.d.ts.map +0 -1
  64. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
  65. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
  66. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
  67. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
  68. package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
  69. package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
  70. package/lib/components/term-card/term-card.component.d.ts +0 -53
  71. package/lib/components/term-card/term-card.component.d.ts.map +0 -1
  72. package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -56
  73. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
  74. package/lib/components/tree-view/tree-view.component.d.ts +0 -102
  75. package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
  76. package/lib/constants/app-constant.d.ts +0 -44
  77. package/lib/constants/app-constant.d.ts.map +0 -1
  78. package/lib/constants/data.d.ts +0 -117
  79. package/lib/constants/data.d.ts.map +0 -1
  80. package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
  81. package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
  82. package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
  83. package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
  84. package/lib/labels/strings.d.ts +0 -40
  85. package/lib/labels/strings.d.ts.map +0 -1
  86. package/lib/models/approval.model.d.ts +0 -11
  87. package/lib/models/approval.model.d.ts.map +0 -1
  88. package/lib/models/connection-type.model.d.ts +0 -6
  89. package/lib/models/connection-type.model.d.ts.map +0 -1
  90. package/lib/models/connection.model.d.ts +0 -7
  91. package/lib/models/connection.model.d.ts.map +0 -1
  92. package/lib/models/framework.model.d.ts +0 -89
  93. package/lib/models/framework.model.d.ts.map +0 -1
  94. package/lib/models/variable-type.model.d.ts +0 -46
  95. package/lib/models/variable-type.model.d.ts.map +0 -1
  96. package/lib/pipes/order-by.pipe.d.ts +0 -10
  97. package/lib/pipes/order-by.pipe.d.ts.map +0 -1
  98. package/lib/services/approval.service.d.ts +0 -21
  99. package/lib/services/approval.service.d.ts.map +0 -1
  100. package/lib/services/connection.service.d.ts +0 -4
  101. package/lib/services/connection.service.d.ts.map +0 -1
  102. package/lib/services/connector.service.d.ts +0 -18
  103. package/lib/services/connector.service.d.ts.map +0 -1
  104. package/lib/services/framework.service.d.ts +0 -89
  105. package/lib/services/framework.service.d.ts.map +0 -1
  106. package/lib/services/local-connection.service.d.ts +0 -18
  107. package/lib/services/local-connection.service.d.ts.map +0 -1
  108. package/lib/services/odcs.service.d.ts +0 -11
  109. package/lib/services/odcs.service.d.ts.map +0 -1
  110. package/lib/tree-hierarchy-routing.module.d.ts +0 -8
  111. package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
  112. package/lib/tree-hierarchy.component.d.ts +0 -13
  113. package/lib/tree-hierarchy.component.d.ts.map +0 -1
  114. package/lib/tree-hierarchy.module.d.ts +0 -33
  115. package/lib/tree-hierarchy.module.d.ts.map +0 -1
  116. package/lib/tree-hierarchy.service.d.ts +0 -21
  117. package/lib/tree-hierarchy.service.d.ts.map +0 -1
  118. package/material.module.d.ts +0 -52
  119. package/material.module.d.ts.map +0 -1
  120. package/public-api.d.ts +0 -9
  121. package/public-api.d.ts.map +0 -1
  122. package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
@@ -1,826 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { CreateTermComponent } from '../create-term/create-term.component';
3
- import { ConnectorComponent } from '../connector/connector.component';
4
- import { defaultConfig, headerLineConfig } from '../../constants/app-constant';
5
- import { labels } from '../../labels/strings';
6
- import { CreateTermFromFrameworkComponent } from '../create-term-from-framework/create-term-from-framework.component';
7
- import { OrgHierarchyAddModalComponent } from '../org-hierarchy-add-modal/org-hierarchy-add-modal.component';
8
- import { v4 as uuidv4 } from 'uuid';
9
- import { ConforamtionPopupComponent } from '../conforamtion-popup/conforamtion-popup.component';
10
- import { CategoryEditModuleComponent } from '../category-edit/category-edit-module/category-edit-module.component';
11
- import _ from 'lodash';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../../services/framework.service";
14
- import * as i2 from "../../services/local-connection.service";
15
- import * as i3 from "@angular/material/legacy-dialog";
16
- import * as i4 from "../../services/approval.service";
17
- import * as i5 from "@angular/material/legacy-snack-bar";
18
- import * as i6 from "../../services/connector.service";
19
- import * as i7 from "../../tree-hierarchy.service";
20
- import * as i8 from "@angular/common";
21
- import * as i9 from "@angular/material/button";
22
- import * as i10 from "@angular/material/icon";
23
- import * as i11 from "../tree-column-view/tree-column-view.component";
24
- import * as i12 from "../action-bar/action-bar.component";
25
- export class TreeViewComponent {
26
- constructor(frameworkService, localSvc, dialog, approvalService, _snackBar, connectorSvc, cdr, treeHierarchySvc, changeDetector) {
27
- this.frameworkService = frameworkService;
28
- this.localSvc = localSvc;
29
- this.dialog = dialog;
30
- this.approvalService = approvalService;
31
- this._snackBar = _snackBar;
32
- this.connectorSvc = connectorSvc;
33
- this.cdr = cdr;
34
- this.treeHierarchySvc = treeHierarchySvc;
35
- this.changeDetector = changeDetector;
36
- this.approvalList = [];
37
- this.isApprovalView = false;
38
- this.workFlowStatus = '';
39
- this.sentForApprove = new EventEmitter();
40
- this.loaderEnable = new EventEmitter();
41
- this.manageOrg = new EventEmitter();
42
- this.mapping = {};
43
- this.heightLighted = [];
44
- this.localList = [];
45
- this.showPublish = false;
46
- this.newTermSubscription = undefined;
47
- this.loaded = {};
48
- this.showActionBar = false;
49
- this.approvalRequiredTerms = [];
50
- this.draftTerms = [];
51
- this.isLoading = false;
52
- this.categoryList = [];
53
- this.app_strings = labels;
54
- this.isHideBtnEna = true;
55
- this.columnId = '';
56
- this.isFraworkLoading = true;
57
- }
58
- ngOnInit() {
59
- this.draftTerms = this.approvalList;
60
- this.init();
61
- this.showActionBar = this.isApprovalView ? true : false;
62
- this.frameworkService.afterAddOrEditSubject.subscribe(responseData => {
63
- if (responseData && responseData.res && responseData.data) {
64
- this.refreshData(responseData);
65
- }
66
- });
67
- this.isEnableds();
68
- }
69
- ngOnChanges() {
70
- }
71
- ngAfterContentChecked() {
72
- this.cdr.detectChanges();
73
- }
74
- init() {
75
- this.initConfig();
76
- this.frameworkService.getFrameworkInfo((this.orgSelectedData) ? this.orgSelectedData : '', (this.childOrgData) ? this.childOrgData : '').subscribe(() => {
77
- this.connectorSvc.removeAllLines();
78
- this.frameworkService.categoriesHash.value.forEach((cat) => {
79
- this.loaded[cat.code] = true;
80
- });
81
- this.isLoading = false;
82
- setTimeout(() => {
83
- this.makeFirstTermSelected();
84
- }, 500);
85
- }, (err) => {
86
- console.error('error in fetching framework', err);
87
- });
88
- this.loaderSubscription = this.treeHierarchySvc.loaderState$.subscribe(data => {
89
- this.loaderEnable.emit(data);
90
- this.changeDetector.detectChanges();
91
- });
92
- }
93
- refreshData(resData) {
94
- const res = resData.res;
95
- if (res && res.created) {
96
- this.showPublish = true;
97
- }
98
- if (res.multi && Array.isArray(res.term) && res.term.length) {
99
- res.term = res.term[0];
100
- }
101
- this.loaded[res.term.category] = false;
102
- const parentColumn = this.frameworkService.getPreviousCategory(res.term.category);
103
- res.parent = null;
104
- if (parentColumn) {
105
- res.parent = this.frameworkService.selectionList.get(parentColumn.code);
106
- if (resData.type === 'update') {
107
- res.parent.children[res.parent.children.findIndex((el) => el.identifier === res.term.identifier)] = res.term;
108
- this.loaded[res.term.category] = true;
109
- res.term.selected = false;
110
- this.frameworkService.selectionList.delete(res.term.category);
111
- this.frameworkService.insertUpdateDeleteNotifier.next({ action: res.term.category, type: 'update', data: res.term });
112
- this.updateFinalList({ selectedTerm: res.term, isSelected: true, parentData: res.parent, colIndex: resData.index }, 'update');
113
- res.term.selected = true;
114
- }
115
- else {
116
- if (!res.multi) {
117
- res.parent.children ? res.parent.children.push(res.term) : res.parent['children'] = [res.term];
118
- }
119
- this.updateFinalList({ selectedTerm: res.term, isSelected: false, parentData: res.parent, colIndex: resData.index });
120
- }
121
- }
122
- }
123
- makeFirstTermSelected() {
124
- const firstListItem = this.frameworkService.list.entries().next().value;
125
- if (firstListItem && firstListItem.length >= 2) {
126
- if (firstListItem[1] && firstListItem[1].children && firstListItem[1].children.length) {
127
- const firstTerm = firstListItem[1].children[0];
128
- const cardRef = document.getElementById(firstTerm.name);
129
- firstTerm.selected = true;
130
- this.frameworkService.cardClkData = firstTerm;
131
- this.frameworkService.CurrentCardClk.next(firstTerm.category);
132
- this.frameworkService.currentSelection.next({ type: firstTerm.category, data: firstTerm, cardRef });
133
- this.isFraworkLoading = false;
134
- }
135
- }
136
- }
137
- updateTaxonomyTerm(data) {
138
- if (data && data.selectedTerm && data.selectedTerm.category) {
139
- if (!data.isUpdate) {
140
- this.updateFinalList(data);
141
- }
142
- else {
143
- this.updateFinalList(data, 'update');
144
- }
145
- this.updateSelection(data.selectedTerm.category, data.selectedTerm.code);
146
- }
147
- }
148
- updateSelection(category, selectedTermCode) {
149
- const categoryData = this.frameworkService.list.get(category);
150
- if (categoryData && categoryData.children) {
151
- categoryData.children.map(item => {
152
- item.selected = selectedTermCode === item.code ? true : false;
153
- return item;
154
- });
155
- }
156
- }
157
- updateFinalList(data, type) {
158
- if (data.isSelected) {
159
- this.frameworkService.selectionList.set(data.selectedTerm.category, data.selectedTerm);
160
- const next = this.frameworkService.getNextCategory(data.selectedTerm.category);
161
- if (next && next.code) {
162
- this.frameworkService.selectionList.delete(next.code);
163
- }
164
- this.frameworkService.insertUpdateDeleteNotifier.next({ action: data.selectedTerm.category, type: type ? type : 'select', data: data.selectedTerm });
165
- }
166
- if (data.colIndex === 0 && !data.isSelected) {
167
- this.isLoading = true;
168
- setTimeout(() => {
169
- this.init();
170
- }, 3000);
171
- }
172
- setTimeout(() => {
173
- this.loaded[data.selectedTerm.category] = true;
174
- }, 100);
175
- }
176
- isEnabled(columnCode) {
177
- return !!this.frameworkService.selectionList.get(columnCode);
178
- }
179
- isEnableds() {
180
- if (this.frameworkService.CurrentCardClk) {
181
- this.frameworkService.CurrentCardClk.subscribe((item) => {
182
- const dataCode = this.frameworkService.getNextCategory(item);
183
- if (dataCode && dataCode.code) {
184
- this.dataConfig = this.frameworkService.getConfig(dataCode.code);
185
- }
186
- if (dataCode) {
187
- this.configCodeBtn = dataCode.code;
188
- }
189
- });
190
- }
191
- }
192
- openCreateTermDialog(column, colIndex) {
193
- if (!this.isEnabled(column.code)) {
194
- const nextCat = column.code;
195
- const nextNextCat = this.frameworkService.getNextCategory(nextCat);
196
- if (nextCat) {
197
- const selectedTerms = this.frameworkService.getPreviousSelectedTerms(nextCat);
198
- const colInfo = Array.from(this.frameworkService.list.values()).filter(l => l.code === nextCat);
199
- let nextColInfo = [];
200
- if (nextNextCat && nextNextCat.code) {
201
- nextColInfo = Array.from(this.frameworkService.list.values()).filter(l => l.code === nextNextCat.code);
202
- }
203
- let dialog;
204
- if (this.environment && this.environment.frameworkType === 'MDO_DESIGNATION') {
205
- dialog = this.dialog.open(CreateTermFromFrameworkComponent, {
206
- data: {
207
- mode: 'multi-create',
208
- columnInfo: colInfo && colInfo.length ? colInfo[0] : [],
209
- nextColInfo: nextColInfo && nextColInfo.length ? nextColInfo[0] : [],
210
- frameworkId: this.frameworkService.getFrameworkId(),
211
- selectedparents: this.heightLighted,
212
- colIndex: nextCat.index,
213
- selectedParentTerms: selectedTerms
214
- },
215
- width: '800px',
216
- panelClass: 'custom-dialog-container',
217
- position: { top: '50px' }
218
- });
219
- }
220
- else {
221
- dialog = this.dialog.open(CreateTermComponent, {
222
- data: {
223
- mode: 'multi-create',
224
- columnInfo: colInfo && colInfo.length ? colInfo[0] : [],
225
- frameworkId: this.frameworkService.getFrameworkId(),
226
- selectedparents: this.heightLighted,
227
- colIndex: nextCat.index,
228
- selectedParentTerms: selectedTerms
229
- },
230
- width: '800px',
231
- panelClass: 'custom-dialog-container',
232
- position: { top: '50px' }
233
- });
234
- }
235
- dialog.afterClosed().subscribe((res) => {
236
- if (!res) {
237
- return;
238
- }
239
- if (res && res.created) {
240
- this.showPublish = true;
241
- }
242
- const data = this.frameworkService.cardClkData;
243
- const responseData = {
244
- res,
245
- index: nextCat.index,
246
- data,
247
- type: 'multi-create'
248
- };
249
- if (!(res && res.stopUpdate)) {
250
- this.frameworkService.updateAfterAddOrEditSubject(responseData);
251
- }
252
- this.loaded[res.term.category] = false;
253
- const parentColumn = this.frameworkService.getPreviousCategory(res.term[0].category);
254
- res.parent = null;
255
- if (parentColumn) {
256
- res.parent = this.frameworkService.selectionList.get(parentColumn.code);
257
- res.parent.children ? res.parent.children.push(res.term[0]) : res.parent['children'] = [res.term[0]];
258
- }
259
- this.updateFinalList({ selectedTerm: res.term[0], isSelected: false, parentData: res.parent, colIndex: colIndex });
260
- });
261
- }
262
- }
263
- }
264
- openOrganizationDialog(column, _index, typeSelected) {
265
- const treeListData = this.frameworkService.getPreviousSelectedTerms(column.code);
266
- const dialog = this.dialog.open(OrgHierarchyAddModalComponent, {
267
- data: {
268
- previous: treeListData,
269
- currentData: column,
270
- selectedOrgData: this.orgSelectedData,
271
- type: typeSelected
272
- },
273
- autoFocus: true,
274
- restoreFocus: true,
275
- position: { right: '0' },
276
- height: '100vh',
277
- width: '50%',
278
- panelClass: 'right-side-modal',
279
- maxWidth: '100vw'
280
- });
281
- dialog.afterClosed().subscribe(async (_res) => {
282
- if (_res && _res.type === 'add') {
283
- this.treeHierarchySvc.setLoaderState(true);
284
- this.createTerms(_res.selectedOrg, column);
285
- }
286
- else if (_res && _res.type === 'update') {
287
- if (_res.paparentSelectedOrg) {
288
- await this.updateParentAssociation(_res.paparentSelectedOrg, _res.currentTerm);
289
- }
290
- if (_res.selectedOrg && _res.selectedOrg.length > 0) {
291
- this.treeHierarchySvc.setLoaderState(true);
292
- this.createTerms(_res.selectedOrg, column);
293
- }
294
- else {
295
- this.publishFramework({
296
- id: this.orgSelectedData.orgHierarchyFrameworkId || '',
297
- category: ''
298
- });
299
- }
300
- }
301
- });
302
- }
303
- get list() {
304
- return Array.from(this.frameworkService.list.values());
305
- }
306
- drawHeaderLine(len) {
307
- const options = { ...defaultConfig, ...headerLineConfig };
308
- for (let i = 1; i <= len; i++) {
309
- const startEle = document.querySelector(`#box${i}count`);
310
- const endEle = document.querySelector(`#box${i}Header`);
311
- if (startEle && endEle) {
312
- new LeaderLine(startEle, endEle, options);
313
- }
314
- }
315
- }
316
- getColumn(columnCode) {
317
- return this.frameworkService.list.get(columnCode);
318
- }
319
- newConnection() {
320
- const dialog = this.dialog.open(ConnectorComponent, {
321
- data: {},
322
- width: '90%',
323
- });
324
- dialog.afterClosed().subscribe((res) => {
325
- if ((res.source === 'online' && res.data.endpoint) || (res.source === 'offline')) {
326
- this.localSvc.localStorage = res;
327
- this.init();
328
- }
329
- else if (res.source === 'online' && !res.data.endpoint) {
330
- this.localSvc.localStorage = res;
331
- this.init();
332
- }
333
- });
334
- }
335
- updateDraftStatusTerms(event) {
336
- if (event.checked) {
337
- this.draftTerms.push(event.term);
338
- }
339
- else {
340
- this.draftTerms = this.draftTerms.filter(d => event.term.identifier !== d.identifier);
341
- }
342
- this.showActionBar = this.draftTerms.length > 0 ? true : false;
343
- }
344
- getNoOfCards(event) {
345
- if (this.categoryList.length > 0 && event.category !== '') {
346
- let index = this.categoryList.findIndex((obj) => obj.category == event.category);
347
- if (index > -1) {
348
- this.categoryList.splice(index);
349
- }
350
- }
351
- if (event.category == '') {
352
- this.categoryList[this.categoryList.length - 1].count = 0;
353
- }
354
- this.categoryList.push(event);
355
- }
356
- getCount(code) {
357
- const allCategories = Array.from(this.frameworkService.list.values());
358
- const currentCategoryIndex = allCategories.findIndex(cat => cat.code === code);
359
- for (let i = 0; i < currentCategoryIndex; i++) {
360
- const prevCategoryCode = allCategories[i].code;
361
- const hasPrevSelection = this.frameworkService.selectionList.has(prevCategoryCode);
362
- if (!hasPrevSelection) {
363
- return 0;
364
- }
365
- }
366
- let count = 0;
367
- const prevCategory = this.frameworkService.getPreviousCategory(code);
368
- if (prevCategory) {
369
- const prevSelectedTerm = this.frameworkService.selectionList.get(prevCategory.code);
370
- if (prevSelectedTerm) {
371
- if (prevSelectedTerm.children && prevSelectedTerm.children.length > 0) {
372
- count = prevSelectedTerm.children.filter((child) => !child.isDeleted && child.status !== 'Retired' &&
373
- (child.category === code || (child.associations &&
374
- child.associations.some((assoc) => assoc.category === code)))).length;
375
- return count;
376
- }
377
- }
378
- return 0;
379
- }
380
- const categoryData = this.frameworkService.list.get(code);
381
- if (categoryData && categoryData.children) {
382
- count = categoryData.children.filter((child) => !child.isDeleted && child.status !== 'Retired').length;
383
- }
384
- return count;
385
- }
386
- sendForApproval() {
387
- if (!this.isApprovalView) {
388
- let parentList = [];
389
- this.list.forEach(ele => {
390
- const t = ele.children.filter((term) => term.selected === true);
391
- if (t[0]) {
392
- parentList.push(t[0]);
393
- }
394
- });
395
- const req = {
396
- updateFieldValues: [...parentList, ...this.draftTerms]
397
- };
398
- this.approvalService.createApproval(req).subscribe(() => {
399
- this.frameworkService.removeOldLine();
400
- this._snackBar.open('Terms successfully sent for Approval.', 'cancel');
401
- });
402
- }
403
- else {
404
- this.sentForApprove.emit(this.draftTerms);
405
- }
406
- }
407
- closeActionBar(_e) {
408
- this.showActionBar = false;
409
- }
410
- initConfig() {
411
- if (this.environment) {
412
- this.frameworkService.updateEnvironment(this.environment);
413
- this.frameworkService.setConfig(this.taxonomyConfig);
414
- }
415
- }
416
- ngOnDestroy() {
417
- this.frameworkService.removeOldLine();
418
- }
419
- getNextCat(data) {
420
- if (data && data.code) {
421
- const nextCat = this.frameworkService.getNextCategory(data.code);
422
- return nextCat;
423
- }
424
- return null;
425
- }
426
- isCurrentOrNextTerm(_column, index) {
427
- if (!this.frameworkService.currentSelection.value) {
428
- return index === 0;
429
- }
430
- const currentCategory = this.frameworkService.currentSelection.value.type;
431
- if (!currentCategory) {
432
- return index === 0;
433
- }
434
- let currentIndex = -1;
435
- for (let i = 0; i < this.list.length; i++) {
436
- if (this.list[i].code === currentCategory) {
437
- currentIndex = i;
438
- break;
439
- }
440
- }
441
- if (currentIndex === -1) {
442
- return index === 0;
443
- }
444
- return index === currentIndex || index === currentIndex + 1;
445
- }
446
- shouldShowSvgBorderWrapper(column, index) {
447
- if (this.isCurrentOrNextTerm(column, index) && this.getCount(column.code) === 0) {
448
- return true;
449
- }
450
- return false;
451
- }
452
- async createTerms(selectedList, column) {
453
- const frameworkData = {
454
- id: this.orgSelectedData.orgHierarchyFrameworkId || '',
455
- category: column.code || '',
456
- };
457
- let createdNodeId = [];
458
- for await (const ele of selectedList) {
459
- const requestBody = {
460
- request: {
461
- term: {
462
- name: ele.orgName || '',
463
- description: ele.description || '',
464
- code: uuidv4(),
465
- additionalProperties: {
466
- orgId: ele.identifier || ''
467
- }
468
- }
469
- }
470
- };
471
- const createTremsRes = await this.treeHierarchySvc.createTerm(requestBody, frameworkData).toPromise().catch(err => {
472
- console.error('Error in creating term', err);
473
- });
474
- if (createTremsRes && createTremsRes.result && createTremsRes.result.node_id) {
475
- createdNodeId.push(createTremsRes.result.node_id[0]);
476
- }
477
- else {
478
- this._snackBar.open('Error in creating term', 'cancel');
479
- this.treeHierarchySvc.setLoaderState(false);
480
- return;
481
- }
482
- }
483
- if (createdNodeId.length === selectedList.length) {
484
- if (column.index > 1) {
485
- await this.updateAssociation(createdNodeId, frameworkData, column);
486
- }
487
- this.publishFramework(frameworkData);
488
- }
489
- }
490
- async updateAssociation(nodeId, frameworkData, column) {
491
- const prev = this.frameworkService.getPreviousCategory(column.code);
492
- let prevTrem = this.frameworkService.getPreviousSelectedTerms(column.code);
493
- const tempFrameData = _.cloneDeep(this.frameworkService.completeResponse);
494
- const requestBody = {
495
- request: {
496
- term: {
497
- associations: []
498
- }
499
- }
500
- };
501
- if (prev && prevTrem) {
502
- prevTrem = prevTrem.find((ele) => ele.category === prev.code);
503
- prevTrem = tempFrameData.categories.find((ele) => ele.code === prev.code).terms.find((ele) => ele.code === prevTrem.code);
504
- if (prevTrem && prevTrem.associations && prevTrem.associations.length > 0) {
505
- prevTrem.associations.forEach((ele) => {
506
- requestBody.request.term.associations.push({
507
- identifier: ele.identifier
508
- });
509
- });
510
- }
511
- }
512
- if (nodeId && nodeId.length > 0) {
513
- nodeId.forEach((ele) => {
514
- requestBody.request.term.associations.push({
515
- identifier: ele
516
- });
517
- });
518
- }
519
- frameworkData.category = prevTrem.category || '';
520
- const nodeIdParts = prevTrem.identifier.split('_');
521
- const codeId = nodeIdParts[nodeIdParts.length - 1];
522
- const updateAssociationRes = await this.treeHierarchySvc.updateFrameworkAssociation(requestBody, frameworkData, codeId).toPromise().catch(err => {
523
- console.error('Error in updating association', err);
524
- });
525
- if (updateAssociationRes && updateAssociationRes.result && updateAssociationRes.result.node_id) {
526
- }
527
- }
528
- publishFramework(frameworkData) {
529
- this.treeHierarchySvc.publishFreamework(frameworkData).subscribe((res) => {
530
- if (res && res.result && res.result.publishStatus) {
531
- setTimeout(() => {
532
- this._snackBar.open(`Organization hierarchy updated successfully`);
533
- this.treeHierarchySvc.setLoaderState(false);
534
- this.init();
535
- }, 5000);
536
- }
537
- else {
538
- this._snackBar.open('Error in publishing framework', 'cancel');
539
- this.treeHierarchySvc.setLoaderState(false);
540
- }
541
- }, (err) => {
542
- console.error('Error in publishing framework', err);
543
- this.treeHierarchySvc.setLoaderState(false);
544
- });
545
- }
546
- removeConnection(data) {
547
- const association = this.getSelectedTermsAssociation(data.children.code);
548
- let count = 0;
549
- if (association && association.length > 0) {
550
- association.forEach((assoc) => {
551
- if (assoc.ids && assoc.ids.length > 0) {
552
- count += assoc.ids.length;
553
- }
554
- });
555
- }
556
- if (count > 0) {
557
- const dialogData = {
558
- dialogType: 'warning',
559
- descriptions: [
560
- {
561
- header: `${count || 0} Organisation${count > 1 ? 's' : ''} will be removed from organisation hierarchy.`,
562
- headerClass: 'flex items-center justify-center text-blue',
563
- messages: [
564
- {
565
- msgClass: 'text-blue margin-bottom-s',
566
- msg: `Do you want to proceed?`,
567
- },
568
- ],
569
- },
570
- ],
571
- footerClass: 'items-center justify-center',
572
- buttons: [
573
- {
574
- btnText: 'No',
575
- btnClass: 'btn-common btn-secondary',
576
- response: false,
577
- },
578
- {
579
- btnText: 'Yes',
580
- btnClass: 'btn-common btn-primary',
581
- response: true,
582
- },
583
- ],
584
- };
585
- const dialogRef = this.dialog.open(ConforamtionPopupComponent, {
586
- data: dialogData,
587
- autoFocus: false,
588
- width: '600px',
589
- maxWidth: '80vw',
590
- maxHeight: '90vh',
591
- disableClose: true,
592
- });
593
- dialogRef.afterClosed().subscribe((res) => {
594
- if (res) {
595
- this.retireTermFunction(association);
596
- }
597
- });
598
- }
599
- else {
600
- this._snackBar.open(`Error in removing the organisation`, 'cancel');
601
- }
602
- }
603
- async retireTermFunction(association) {
604
- let count = 0;
605
- this.treeHierarchySvc.setLoaderState(true);
606
- for await (const ele of association) {
607
- const requestBody = {
608
- request: {
609
- contentIds: ele.ids
610
- }
611
- };
612
- const frameworkObj = {
613
- id: this.frameworkService.completeResponse.code,
614
- category: ele.category || '',
615
- };
616
- const retireRes = await this.treeHierarchySvc.retireTerm(requestBody, frameworkObj).toPromise().catch((_err) => {
617
- this.treeHierarchySvc.setLoaderState(false);
618
- this._snackBar.open(`Failed to remove connection.`, 'cancel');
619
- });
620
- if (retireRes && retireRes.params && retireRes.params.status?.toLowerCase() === 'successful') {
621
- count += 1;
622
- }
623
- else {
624
- this.treeHierarchySvc.setLoaderState(false);
625
- this._snackBar.open(`Failed to remove connection.`, 'cancel');
626
- }
627
- }
628
- if (count === association.length) {
629
- await this.publishFramework({
630
- id: this.frameworkService.completeResponse.code,
631
- });
632
- }
633
- else {
634
- this.treeHierarchySvc.setLoaderState(false);
635
- this._snackBar.open(`Failed to remove connection.`, 'cancel');
636
- }
637
- }
638
- cardActionEmit(event) {
639
- switch (event.action) {
640
- case 'remove-term':
641
- this.removeConnection(event.data);
642
- break;
643
- case 'update-hierarchy':
644
- this.openOrganizationDialog(this.list[this.list.findIndex((item) => item.code === event.data.category) + 1], '', 'update');
645
- break;
646
- case 'manage-org':
647
- this.manageOrg.emit(event.data.children);
648
- break;
649
- }
650
- }
651
- editCategoryName(column, index) {
652
- const dialog = this.dialog.open(CategoryEditModuleComponent, {
653
- data: {
654
- columnInfo: column,
655
- frameworkId: this.frameworkService.getFrameworkId(),
656
- colIndex: index
657
- },
658
- width: '800px',
659
- panelClass: 'category-edit-container',
660
- position: { top: '50px' }
661
- });
662
- dialog.afterClosed().subscribe((res) => {
663
- if (res) {
664
- const requestBody = {
665
- frameworkId: this.frameworkService.getFrameworkId(),
666
- categoryCode: res.column.columnData.code,
667
- categoryName: res.column.formData.categoryName,
668
- categoryDescription: res.column.formData.categotyDescription || ''
669
- };
670
- this.updateCategory(requestBody);
671
- }
672
- });
673
- }
674
- getSelectedTermsAssociation(categoryCode) {
675
- let tempData = [];
676
- const completeData = _.cloneDeep(this.frameworkService.completeResponse);
677
- if (completeData && completeData.categories && completeData.categories.length > 0) {
678
- completeData.categories.forEach((category, catIndex) => {
679
- if (category.terms && category.terms.length > 0) {
680
- category.terms.forEach((term) => {
681
- if (term.code === categoryCode) {
682
- tempData.push({
683
- name: term.name,
684
- category: term.category,
685
- ids: [term.code],
686
- nextCategory: term.children ? term.children[0].category : '',
687
- assocIds: []
688
- });
689
- if (term.associations && term.associations.length > 0) {
690
- term.associations.forEach((assoc) => {
691
- const getIndex = tempData.findIndex((item) => item.ids && item.ids.includes(term.code));
692
- tempData[getIndex]['assocIds'].push(assoc.code);
693
- });
694
- }
695
- }
696
- });
697
- }
698
- if (catIndex > 0 && category.terms && category.terms.length > 0) {
699
- category.terms.forEach((term) => {
700
- tempData.forEach((item) => {
701
- if (item.nextCategory === term.category && item.assocIds.includes(term.code)) {
702
- const pushData = {
703
- name: term.name,
704
- category: term.category,
705
- ids: [term.code],
706
- nextCategory: term.children ? term.children[0].category : '',
707
- assocIds: []
708
- };
709
- if (term.associations && term.associations.length > 0) {
710
- term.associations.forEach((assoc) => {
711
- pushData['assocIds'].push(assoc.code);
712
- });
713
- }
714
- tempData.push(pushData);
715
- }
716
- });
717
- });
718
- }
719
- });
720
- }
721
- return tempData;
722
- }
723
- async updateCategory(event) {
724
- const requestBody = {
725
- request: {
726
- category: {
727
- name: event.categoryName || '',
728
- description: event.categoryDescription || '',
729
- }
730
- }
731
- };
732
- const frameworkObj = {
733
- id: event.frameworkId,
734
- category: event.categoryCode
735
- };
736
- this.treeHierarchySvc.setLoaderState(true);
737
- const updateCatRes = await this.treeHierarchySvc.updateCategory(requestBody, frameworkObj).toPromise().catch((_err) => {
738
- this.treeHierarchySvc.setLoaderState(false);
739
- if (_err && _err.error && _err.error.params && _err.error.params.errMsg) {
740
- this._snackBar.open(`${_err.error.params.errMsg}`);
741
- }
742
- });
743
- if (updateCatRes && updateCatRes.params && updateCatRes.params.status.toLowerCase() === 'successful') {
744
- await this.publishFramework(frameworkObj);
745
- }
746
- }
747
- async updateParentAssociation(selectedParent, currentTerm) {
748
- const framworkData = _.cloneDeep(this.frameworkService.completeResponse);
749
- const parentCategoryData = framworkData.categories.find((cat) => cat.code === selectedParent.category);
750
- if (parentCategoryData && parentCategoryData.terms && parentCategoryData.terms.length > 0) {
751
- const currentParentTerm = parentCategoryData.terms.find((term) => {
752
- if (term.associations && term.associations.length > 0) {
753
- return term.associations.some((assoc) => assoc.code === currentTerm.code);
754
- }
755
- });
756
- if (currentParentTerm) {
757
- const updateOldParentAssociation = {
758
- request: {
759
- term: {
760
- associations: []
761
- }
762
- }
763
- };
764
- currentParentTerm.associations.forEach((assoc) => {
765
- if (assoc.code !== currentTerm.code) {
766
- updateOldParentAssociation.request.term.associations.push({ identifier: assoc.identifier });
767
- }
768
- });
769
- await this.updateHierarchyAssocication(updateOldParentAssociation, framworkData.identifier, currentParentTerm);
770
- }
771
- selectedParent = parentCategoryData.terms.find((term) => term.code === selectedParent.code);
772
- const updateNewParentAssociation = {
773
- request: {
774
- term: {
775
- associations: []
776
- }
777
- }
778
- };
779
- if (selectedParent && selectedParent.associations && selectedParent.associations.length > 0) {
780
- selectedParent.associations.forEach((assoc) => {
781
- updateNewParentAssociation.request.term.associations.push({ identifier: assoc.identifier });
782
- });
783
- }
784
- updateNewParentAssociation.request.term.associations.push({ identifier: currentTerm.identifier });
785
- await this.updateHierarchyAssocication(updateNewParentAssociation, framworkData.identifier, selectedParent);
786
- }
787
- }
788
- async updateHierarchyAssocication(requestBody, frameworkId, termData) {
789
- this.treeHierarchySvc.setLoaderState(true);
790
- await this.treeHierarchySvc.updateFrameworkAssociation(requestBody, { id: frameworkId, category: termData.category }, termData.code).toPromise().catch((err) => {
791
- console.error('Error in updating association', err);
792
- this.treeHierarchySvc.setLoaderState(false);
793
- this._snackBar.open(`Error in updating association`, 'cancel');
794
- });
795
- }
796
- checkChildOrg() {
797
- return (this.childOrgData?.rootOrgId) ? true : false;
798
- }
799
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeViewComponent, deps: [{ token: i1.FrameworkService }, { token: i2.LocalConnectionService }, { token: i3.MatLegacyDialog }, { token: i4.ApprovalService }, { token: i5.MatLegacySnackBar }, { token: i6.ConnectorService }, { token: i0.ChangeDetectorRef }, { token: i7.TreeHierarchyService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
800
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TreeViewComponent, selector: "lib-tree-view", inputs: { approvalList: "approvalList", isApprovalView: "isApprovalView", workFlowStatus: "workFlowStatus", environment: "environment", taxonomyConfig: "taxonomyConfig", orgSelectedData: "orgSelectedData", childOrgData: "childOrgData" }, outputs: { sentForApprove: "sentForApprove", loaderEnable: "loaderEnable", manageOrg: "manageOrg" }, usesOnChanges: true, ngImport: i0, template: "<!-- <div class=\"flex flex-1 connectionSettings\">\n <button mat-raised-button color=\"accent\" (click)=\"newConnection()\">\n <mat-icon>{{app_strings.build}}</mat-icon>\n </button>\n</div> -->\n\n<div *ngIf=\"list && list.length > 0\" class=\"flex heightFix overflow-container\" id=\"treeViewContainer\">\n <ng-container *ngFor=\"let column of list; let i = index;\">\n <div class=\"flex-1 flex-col col-container containers{{list.length}}\" id=\"box{{i+1}}Container\">\n <div class=\"category-heading-sticky\">\n <div class=\"category-heading-container\">\n <div class='category-header'>\n <div class=\"category-header-items w-full flex padding-remove\" id=\"box{{i}}Header\">\n <span class=\"flex gap-1 mat-body-1\">\n <ng-container *ngIf=\"column?.config?.iconEnabled\">\n <mat-icon [ngStyle]=\"{'color':column.config.color}\">{{column.config.icon}}</mat-icon>\n </ng-container>\n <!-- {{column.name}} -->\n {{column?.config?.categoryDisplayName || column.name }}\n <ng-container *ngIf=\"i != 0 && categoryList?.length > 0; else firstColumn\">\n <ng-container *ngIf=\"column.index !== 1\">\n <span class=\"count\">({{getCount(column.code)}})</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.levelNameEdit && !checkChildOrg()\">\n <button mat-icon-button type=\"button\" class=\"edit-btn flex\" (click)=\"editCategoryName(column, i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </ng-container>\n </span>\n <ng-template #firstColumn>\n <span *ngIf=\"i == 0\" id=\"box{{i+1}}count\" class=\"count\">({{column.children.length}})</span>\n </ng-template>\n <ng-container class=\"\" *ngIf=\"column?.config?.createBtnEnabled && !column?.config?.addOrgEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" [ngClass]=\"{'button-enabled': configCodeBtn== column?.code, 'button-disabled': configCodeBtn!== column?.code}\"\n (click)=\"openCreateTermDialog(column, i)\" type=\"button\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.addOrgEnabled && !column?.config?.createBtnEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <div class=\"arrow\" id=\"box{{i+1}}count\"></div>\n </div>\n </div>\n <!-- <div>\n Put search button here in future\n </div> -->\n </div>\n </div>\n <div class=\"padding-x2 cat-columns container-box\" id=\"box{{i+1}}\">\n <ng-container *ngIf=\"column?.children && column?.children.length > 0\">\n <lib-tree-column-view *ngIf=\"loaded[column.code]\" #selectedTaxonomyTerm [column]=\"column\"\n [containerId]=\"'box'+(i+1)\" [isChildOrg]=\"checkChildOrg()\" (updateTaxonomyTerm)=\"updateTaxonomyTerm($event)\"\n (updateTermList)=\"updateDraftStatusTerms($event)\" (cardsCount)=\"getNoOfCards($event)\" \n (retireTermData)=\"removeConnection($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-tree-column-view>\n </ng-container>\n <ng-container *ngIf=\"shouldShowSvgBorderWrapper(column, i) && !checkChildOrg()\">\n <div class=\"svg-border-wrapper\">\n <svg width=\"100%\" height=\"100%\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"#1B213352\" stroke-width=\"2\" \n stroke-dasharray=\"20, 10\" rx=\"10\" ry=\"10\"/>\n </svg>\n <div class=\"content flex flex-col w-full\">\n <div class=\"icon-container\">\n <mat-icon svgIcon=\"frac-no-connection\"></mat-icon>\n </div>\n <label>Select an organization to add or see further connections</label>\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <lib-action-bar *ngIf=\"showActionBar\" [actionType]=\"isApprovalView\" [configType]=\"workFlowStatus\"\n (sendApproval)=\"sendForApproval()\" (closeAction)=\"closeActionBar($event)\"></lib-action-bar>\n</div>\n<div *ngIf=\"!(list && list.length > 0 ) && isFraworkLoading\" class=\"flex heightFix \">\n <h1 i18n>{{app_strings.loading}}</h1>\n</div>", styles: [".connectionSettings{flex-direction:row-reverse;z-index:40;position:fixed;padding:0 4px 4px 0;bottom:0;right:0}.flex{display:flex}.w-full{width:100%;align-items:center;display:flex}.w-full.addCardButton{padding:.25em .8em;text-align:left;border:2px dotted #b1b1b1;color:#666;border-radius:8px}.w-full.addCardButton .mat-icon{position:absolute;top:0%;right:3%;height:100%;display:flex;align-items:center}.w-full .button-enabled{opacity:1;pointer-events:auto}.w-full .button-disabled{opacity:.5;pointer-events:none}.w-full.addCardButtonNew{padding:8px 12px;text-align:center;border-radius:24px;height:24px;background:#1b4ca1;color:#fff!important}.w-full.addCardButtonNew .mat-icon-custom{font-size:21px}.w-full.addCardButtonNew:disabled{opacity:.6}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100%;width:100%;justify-content:space-around;position:relative}.cat-columns{position:relative;height:inherit}.col-container{display:flex;flex-direction:column;height:inherit;min-width:350px;max-width:300px}.category-heading-sticky{position:sticky;top:0;z-index:10;width:100%;background-color:#fff;margin-bottom:16px}.category-heading-container{box-sizing:content-box;position:relative;display:block;padding:2px 2.5em}.category-heading-container .category-header{display:flex;align-items:center}.category-heading-container .category-header-items{display:flex;align-items:center;padding:0 10px}.category-heading-container .category-header h4{padding:0 10px;color:#00000080}.category-heading-container .category-header .count{padding:0 2px}.category-heading-container .category-header .category-header-items{font-size:12px;font-weight:600;font-family:Lato;color:#7c7c7c}.cat-columns:hover{overflow-y:scroll}.container-box{overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;height:calc(100% - 70px)}.container-box::-webkit-scrollbar{width:0;height:0}.spinner{position:fixed;display:flex;top:50%;left:50%}.arrow{left:30px;position:relative}@media only screen and (max-width: 1024px){::ng-deep mat-checkbox .mat-checkbox-inner-container{height:.8em;width:.8em}}@media only screen and (max-width: 1024px){.containers4{max-width:250px;font-size:10px}.containers5{max-width:230px}.containers6{max-width:150px}.containers7{max-width:100px}.w-full{height:3.5em}.w-full.mat-stroked-button{font-size:8px}.padding-x2,.category-heading-container{padding:0 2em}mat-icon{font-size:12px;width:1.25em;height:1.25em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .5em;line-height:2em}}@media only screen and (max-width: 992px){.containers4{max-width:220px;font-size:9px}.padding-x2,.category-heading-container{padding:0 1.5em}}@media only screen and (max-width: 768px){.containers4{max-width:165px;font-size:8px}.w-full{height:2.5em}.padding-x2,.category-heading-container{padding:0 1em}mat-icon{font-size:8px;width:1em;height:1em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .3em;line-height:1.5em}}.add-btn{height:24px;background:#1b4ca1;color:#fff!important;display:flex;flex-direction:row-reverse;justify-content:space-between;border-radius:12px}.overflow-container{width:100%;max-width:calc(100vw - 340px);overflow-x:auto;overflow-y:hidden;white-space:nowrap}.svg-border-wrapper{position:relative;width:100%;height:95%;min-height:100px}.svg-border-wrapper .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.content{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.content label{max-width:90%;margin:10px 0;font-size:16px;line-height:1.4;color:#000000b3;white-space:normal;word-wrap:break-word;font-weight:700}.icon-container{background:#0000000a;position:relative;width:40px;height:40px;border-radius:5px}.icon-container mat-icon{width:30px;height:30px;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.edit-btn{width:24px;height:24px;padding:0;display:flex;align-items:center;justify-content:center;position:relative}.edit-btn mat-icon{font-size:16px;position:absolute;top:50%;height:16px;left:50%;width:16px;transform:translate(-50%,-50%)}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.TreeColumnViewComponent, selector: "lib-tree-column-view", inputs: ["column", "containerId", "isChildOrg"], outputs: ["updateTaxonomyTerm", "updateTermList", "cardsCount", "cardAction"] }, { kind: "component", type: i12.ActionBarComponent, selector: "lib-action-bar", inputs: ["actionType", "configType"], outputs: ["sendApproval", "closeAction"] }] }); }
801
- }
802
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeViewComponent, decorators: [{
803
- type: Component,
804
- args: [{ selector: 'lib-tree-view', template: "<!-- <div class=\"flex flex-1 connectionSettings\">\n <button mat-raised-button color=\"accent\" (click)=\"newConnection()\">\n <mat-icon>{{app_strings.build}}</mat-icon>\n </button>\n</div> -->\n\n<div *ngIf=\"list && list.length > 0\" class=\"flex heightFix overflow-container\" id=\"treeViewContainer\">\n <ng-container *ngFor=\"let column of list; let i = index;\">\n <div class=\"flex-1 flex-col col-container containers{{list.length}}\" id=\"box{{i+1}}Container\">\n <div class=\"category-heading-sticky\">\n <div class=\"category-heading-container\">\n <div class='category-header'>\n <div class=\"category-header-items w-full flex padding-remove\" id=\"box{{i}}Header\">\n <span class=\"flex gap-1 mat-body-1\">\n <ng-container *ngIf=\"column?.config?.iconEnabled\">\n <mat-icon [ngStyle]=\"{'color':column.config.color}\">{{column.config.icon}}</mat-icon>\n </ng-container>\n <!-- {{column.name}} -->\n {{column?.config?.categoryDisplayName || column.name }}\n <ng-container *ngIf=\"i != 0 && categoryList?.length > 0; else firstColumn\">\n <ng-container *ngIf=\"column.index !== 1\">\n <span class=\"count\">({{getCount(column.code)}})</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.levelNameEdit && !checkChildOrg()\">\n <button mat-icon-button type=\"button\" class=\"edit-btn flex\" (click)=\"editCategoryName(column, i)\">\n <mat-icon>edit</mat-icon>\n </button>\n </ng-container>\n </span>\n <ng-template #firstColumn>\n <span *ngIf=\"i == 0\" id=\"box{{i+1}}count\" class=\"count\">({{column.children.length}})</span>\n </ng-template>\n <ng-container class=\"\" *ngIf=\"column?.config?.createBtnEnabled && !column?.config?.addOrgEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" [ngClass]=\"{'button-enabled': configCodeBtn== column?.code, 'button-disabled': configCodeBtn!== column?.code}\"\n (click)=\"openCreateTermDialog(column, i)\" type=\"button\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.addOrgEnabled && !column?.config?.createBtnEnabled && !checkChildOrg()\">\n <button mat-button class=\"add-btn margin-left-auto\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <div class=\"arrow\" id=\"box{{i+1}}count\"></div>\n </div>\n </div>\n <!-- <div>\n Put search button here in future\n </div> -->\n </div>\n </div>\n <div class=\"padding-x2 cat-columns container-box\" id=\"box{{i+1}}\">\n <ng-container *ngIf=\"column?.children && column?.children.length > 0\">\n <lib-tree-column-view *ngIf=\"loaded[column.code]\" #selectedTaxonomyTerm [column]=\"column\"\n [containerId]=\"'box'+(i+1)\" [isChildOrg]=\"checkChildOrg()\" (updateTaxonomyTerm)=\"updateTaxonomyTerm($event)\"\n (updateTermList)=\"updateDraftStatusTerms($event)\" (cardsCount)=\"getNoOfCards($event)\" \n (retireTermData)=\"removeConnection($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-tree-column-view>\n </ng-container>\n <ng-container *ngIf=\"shouldShowSvgBorderWrapper(column, i) && !checkChildOrg()\">\n <div class=\"svg-border-wrapper\">\n <svg width=\"100%\" height=\"100%\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"#1B213352\" stroke-width=\"2\" \n stroke-dasharray=\"20, 10\" rx=\"10\" ry=\"10\"/>\n </svg>\n <div class=\"content flex flex-col w-full\">\n <div class=\"icon-container\">\n <mat-icon svgIcon=\"frac-no-connection\"></mat-icon>\n </div>\n <label>Select an organization to add or see further connections</label>\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i, 'add')\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <lib-action-bar *ngIf=\"showActionBar\" [actionType]=\"isApprovalView\" [configType]=\"workFlowStatus\"\n (sendApproval)=\"sendForApproval()\" (closeAction)=\"closeActionBar($event)\"></lib-action-bar>\n</div>\n<div *ngIf=\"!(list && list.length > 0 ) && isFraworkLoading\" class=\"flex heightFix \">\n <h1 i18n>{{app_strings.loading}}</h1>\n</div>", styles: [".connectionSettings{flex-direction:row-reverse;z-index:40;position:fixed;padding:0 4px 4px 0;bottom:0;right:0}.flex{display:flex}.w-full{width:100%;align-items:center;display:flex}.w-full.addCardButton{padding:.25em .8em;text-align:left;border:2px dotted #b1b1b1;color:#666;border-radius:8px}.w-full.addCardButton .mat-icon{position:absolute;top:0%;right:3%;height:100%;display:flex;align-items:center}.w-full .button-enabled{opacity:1;pointer-events:auto}.w-full .button-disabled{opacity:.5;pointer-events:none}.w-full.addCardButtonNew{padding:8px 12px;text-align:center;border-radius:24px;height:24px;background:#1b4ca1;color:#fff!important}.w-full.addCardButtonNew .mat-icon-custom{font-size:21px}.w-full.addCardButtonNew:disabled{opacity:.6}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100%;width:100%;justify-content:space-around;position:relative}.cat-columns{position:relative;height:inherit}.col-container{display:flex;flex-direction:column;height:inherit;min-width:350px;max-width:300px}.category-heading-sticky{position:sticky;top:0;z-index:10;width:100%;background-color:#fff;margin-bottom:16px}.category-heading-container{box-sizing:content-box;position:relative;display:block;padding:2px 2.5em}.category-heading-container .category-header{display:flex;align-items:center}.category-heading-container .category-header-items{display:flex;align-items:center;padding:0 10px}.category-heading-container .category-header h4{padding:0 10px;color:#00000080}.category-heading-container .category-header .count{padding:0 2px}.category-heading-container .category-header .category-header-items{font-size:12px;font-weight:600;font-family:Lato;color:#7c7c7c}.cat-columns:hover{overflow-y:scroll}.container-box{overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;height:calc(100% - 70px)}.container-box::-webkit-scrollbar{width:0;height:0}.spinner{position:fixed;display:flex;top:50%;left:50%}.arrow{left:30px;position:relative}@media only screen and (max-width: 1024px){::ng-deep mat-checkbox .mat-checkbox-inner-container{height:.8em;width:.8em}}@media only screen and (max-width: 1024px){.containers4{max-width:250px;font-size:10px}.containers5{max-width:230px}.containers6{max-width:150px}.containers7{max-width:100px}.w-full{height:3.5em}.w-full.mat-stroked-button{font-size:8px}.padding-x2,.category-heading-container{padding:0 2em}mat-icon{font-size:12px;width:1.25em;height:1.25em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .5em;line-height:2em}}@media only screen and (max-width: 992px){.containers4{max-width:220px;font-size:9px}.padding-x2,.category-heading-container{padding:0 1.5em}}@media only screen and (max-width: 768px){.containers4{max-width:165px;font-size:8px}.w-full{height:2.5em}.padding-x2,.category-heading-container{padding:0 1em}mat-icon{font-size:8px;width:1em;height:1em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .3em;line-height:1.5em}}.add-btn{height:24px;background:#1b4ca1;color:#fff!important;display:flex;flex-direction:row-reverse;justify-content:space-between;border-radius:12px}.overflow-container{width:100%;max-width:calc(100vw - 340px);overflow-x:auto;overflow-y:hidden;white-space:nowrap}.svg-border-wrapper{position:relative;width:100%;height:95%;min-height:100px}.svg-border-wrapper .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.content{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.content label{max-width:90%;margin:10px 0;font-size:16px;line-height:1.4;color:#000000b3;white-space:normal;word-wrap:break-word;font-weight:700}.icon-container{background:#0000000a;position:relative;width:40px;height:40px;border-radius:5px}.icon-container mat-icon{width:30px;height:30px;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.edit-btn{width:24px;height:24px;padding:0;display:flex;align-items:center;justify-content:center;position:relative}.edit-btn mat-icon{font-size:16px;position:absolute;top:50%;height:16px;left:50%;width:16px;transform:translate(-50%,-50%)}\n"] }]
805
- }], ctorParameters: function () { return [{ type: i1.FrameworkService }, { type: i2.LocalConnectionService }, { type: i3.MatLegacyDialog }, { type: i4.ApprovalService }, { type: i5.MatLegacySnackBar }, { type: i6.ConnectorService }, { type: i0.ChangeDetectorRef }, { type: i7.TreeHierarchyService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { approvalList: [{
806
- type: Input
807
- }], isApprovalView: [{
808
- type: Input
809
- }], workFlowStatus: [{
810
- type: Input
811
- }], environment: [{
812
- type: Input
813
- }], taxonomyConfig: [{
814
- type: Input
815
- }], orgSelectedData: [{
816
- type: Input
817
- }], childOrgData: [{
818
- type: Input
819
- }], sentForApprove: [{
820
- type: Output
821
- }], loaderEnable: [{
822
- type: Output
823
- }], manageOrg: [{
824
- type: Output
825
- }] } });
826
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90cmVlLWhpZXJhcmNoeS9zcmMvbGliL2NvbXBvbmVudHMvdHJlZS12aWV3L3RyZWUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtdmlldy90cmVlLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBZ0MsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFPdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUN0SCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUU3RyxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNuQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzRUFBc0UsQ0FBQztBQUNuSCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUXZCLE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCLFlBQW9CLGdCQUFrQyxFQUM1QyxR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aUJBQWlCO21HQUFqQixpQkFBaUIsNlpDNUI5Qixnbk5BZ0dNOzs0RkRwRU8saUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWU7MFdBS2hCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGcmFtZXdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnJhbWV3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgQ3JlYXRlVGVybUNvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS10ZXJtL2NyZWF0ZS10ZXJtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25uZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9jb25uZWN0b3IvY29ubmVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2NhbENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9jYWwtY29ubmVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElDb25uZWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9jb25uZWN0aW9uLXR5cGUubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25uZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29ubmVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwcm92YWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwcm92YWwuc2VydmljZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZywgaGVhZGVyTGluZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0IHsgbGFiZWxzIH0gZnJvbSAnLi4vLi4vbGFiZWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uLy4uL21vZGVscy92YXJpYWJsZS10eXBlLm1vZGVsJztcbmltcG9ydCB7IENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50IH0gZnJvbSAnLi4vY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsvY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50JztcbmltcG9ydCB7IE9yZ0hpZXJhcmNoeUFkZE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vb3JnLWhpZXJhcmNoeS1hZGQtbW9kYWwvb3JnLWhpZXJhcmNoeS1hZGQtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFRyZWVIaWVyYXJjaHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdHJlZS1oaWVyYXJjaHkuc2VydmljZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgQ29uZm9yYW10aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9jb25mb3JhbXRpb24tcG9wdXAvY29uZm9yYW10aW9uLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYXRlZ29yeUVkaXRNb2R1bGVDb21wb25lbnQgfSBmcm9tICcuLi9jYXRlZ29yeS1lZGl0L2NhdGVnb3J5LWVkaXQtbW9kdWxlL2NhdGVnb3J5LWVkaXQtbW9kdWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5kZWNsYXJlIHZhciBMZWFkZXJMaW5lOiBhbnk7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdHJlZS12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RyZWUtdmlldy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBhcHByb3ZhbExpc3Q6IEFycmF5PENhcmQ+ID0gW107XG4gIEBJbnB1dCgpIGlzQXBwcm92YWxWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdvcmtGbG93U3RhdHVzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ6YW55O1xuICBASW5wdXQoKSB0YXhvbm9teUNvbmZpZzogYW55O1xuICBASW5wdXQoKSBvcmdTZWxlY3RlZERhdGE6IGFueTtcbiAgQElucHV0KCkgY2hpbGRPcmdEYXRhOiBhbnk7XG4gIEBPdXRwdXQoKSBzZW50Rm9yQXBwcm92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBsb2FkZXJFbmFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgbWFuYWdlT3JnID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgbWFwcGluZyA9IHt9O1xuICBoZWlnaHRMaWdodGVkID0gW11cbiAgbG9jYWxMaXN0ID0gW11cbiAgc2hvd1B1Ymxpc2g6IGJvb2xlYW4gPSBmYWxzZVxuICBuZXdUZXJtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgbG9hZGVkOiBhbnkgPSB7fVxuICBzaG93QWN0aW9uQmFyOiBib29sZWFuID0gZmFsc2VcbiAgYXBwcm92YWxSZXF1aXJlZFRlcm1zID0gW11cbiAgZHJhZnRUZXJtczogQXJyYXk8Q2FyZD4gPSBbXTtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGNhdGVnb3J5TGlzdDphbnkgPSBbXTtcbiAgYXBwX3N0cmluZ3M6IGFueSA9IGxhYmVscztcbiAgaXNIaWRlQnRuRW5hOmJvb2xlYW4gPXRydWU7XG4gIGNvbHVtbklkOnN0cmluZyA9ICcnO1xuICBjb25maWdDb2RlQnRuOmFueTtcbiAgZGF0YUNvbmZpZzphbnlcbiAgaXNGcmF3b3JrTG9hZGluZyA9IHRydWVcbiAgbG9hZGVyU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnJhbWV3b3JrU2VydmljZTogRnJhbWV3b3JrU2VydmljZSwgXG4gICAgcHJpdmF0ZSBsb2NhbFN2YzogTG9jYWxDb25uZWN0aW9uU2VydmljZSwgXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLCBcbiAgICBwcml2YXRlIGFwcHJvdmFsU2VydmljZTogQXBwcm92YWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3NuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGNvbm5lY3RvclN2YzogQ29ubmVjdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0cmVlSGllcmFyY2h5U3ZjOiBUcmVlSGllcmFyY2h5U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRyYWZ0VGVybXMgPSB0aGlzLmFwcHJvdmFsTGlzdDtcbiAgICB0aGlzLmluaXQoKVxuICAgIHRoaXMuc2hvd0FjdGlvbkJhciA9IHRoaXMuaXNBcHByb3ZhbFZpZXc/dHJ1ZTpmYWxzZTtcbiAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuYWZ0ZXJBZGRPckVkaXRTdWJqZWN0LnN1YnNjcmliZShyZXNwb25zZURhdGEgPT4ge1xuICAgICAgaWYocmVzcG9uc2VEYXRhICYmIHJlc3BvbnNlRGF0YS5yZXMgJiYgcmVzcG9uc2VEYXRhLmRhdGEpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YShyZXNwb25zZURhdGEpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmlzRW5hYmxlZHMoKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgXG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuIH0gXG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmluaXRDb25maWcoKTtcbiAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrSW5mbygodGhpcy5vcmdTZWxlY3RlZERhdGEpID8gdGhpcy5vcmdTZWxlY3RlZERhdGEgOiAnJywgKHRoaXMuY2hpbGRPcmdEYXRhKSA/IHRoaXMuY2hpbGRPcmdEYXRhIDogJycpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3RvclN2Yy5yZW1vdmVBbGxMaW5lcygpXG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY2F0ZWdvcmllc0hhc2gudmFsdWUuZm9yRWFjaCgoY2F0OmFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlZFtjYXQuY29kZV0gPSB0cnVlXG4gICAgICB9KVxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vICB0aGlzLmRyYXdIZWFkZXJMaW5lKHJlcy5yZXN1bHQuZnJhbWV3b3JrLmNhdGVnb3JpZXMubGVuZ3RoKTsgIFxuICAgICAgICAgICAgIHRoaXMubWFrZUZpcnN0VGVybVNlbGVjdGVkKClcbiAgICAgICAgfSw1MDApXG4gICAgfSwgKGVycikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignZXJyb3IgaW4gZmV0Y2hpbmcgZnJhbWV3b3JrJywgZXJyKVxuICAgIH0pXG5cbiAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbiA9IHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5sb2FkZXJTdGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVyRW5hYmxlLmVtaXQoZGF0YSlcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKClcbiAgICAgIH0sXG4gICAgKVxuICBcbiAgfVxuICByZWZyZXNoRGF0YShyZXNEYXRhOiBhbnkpIHtcbiAgICBjb25zdCByZXMgPSByZXNEYXRhLnJlc1xuICAgIGlmIChyZXMgJiYgcmVzLmNyZWF0ZWQpIHtcbiAgICAgIHRoaXMuc2hvd1B1Ymxpc2ggPSB0cnVlXG4gICAgfVxuICAgIGlmKHJlcy5tdWx0aSAmJiBBcnJheS5pc0FycmF5KHJlcy50ZXJtKSAmJiByZXMudGVybS5sZW5ndGgpe1xuICAgICAgcmVzLnRlcm0gPSByZXMudGVybVswXVxuICAgIH0gXG4gICAgdGhpcy5sb2FkZWRbcmVzLnRlcm0uY2F0ZWdvcnldID0gZmFsc2VcbiAgICAvLyB3YWl0XG4gICAgY29uc3QgcGFyZW50Q29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkocmVzLnRlcm0uY2F0ZWdvcnkpXG4gICAgcmVzLnBhcmVudCA9IG51bGxcbiAgICBpZiAocGFyZW50Q29sdW1uKSB7XG4gICAgICByZXMucGFyZW50ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbi5jb2RlKVxuICAgICAgaWYocmVzRGF0YS50eXBlID09PSAndXBkYXRlJyl7XG4gICAgICAgIFxuICAgICAgICByZXMucGFyZW50LmNoaWxkcmVuW3Jlcy5wYXJlbnQuY2hpbGRyZW4uZmluZEluZGV4KChlbDogYW55KSA9PiBlbC5pZGVudGlmaWVyID09PSByZXMudGVybS5pZGVudGlmaWVyKV0gPSAgcmVzLnRlcm1cbiAgICAgICAgLy8gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KHJlcy5wYXJlbnQuY2F0ZWdvcnkpLmNoaWxkcmVuID0gWy4uLnJlcy5wYXJlbnQuY2hpbGRyZW5dXG4gICAgICAgIFxuICAgICAgICBcblxuICAgICAgICAvLyB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogcmVzLnRlcm0uY2F0ZWdvcnksIGRhdGE6IHJlcy50ZXJtLmNoaWxkcmVuLCBjYXJkUmVmOnJlc0RhdGEuY2FyZFJlZiB9KVxuICAgICAgICAvLyB0aGlzLnVwZGF0ZVNlbGVjdGlvbihyZXMudGVybS5jYXRlZ29yeSwgcmVzLnRlcm0uY29kZSk7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlU2VsZWN0aW9uKHJlcy5wYXJlbnQuY2F0ZWdvcnksIHJlcy5wYXJlbnQuY29kZSk7XG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiByZXMudGVybS5jYXRlZ29yeSwgZGF0YTogcmVzLnRlcm0uY2hpbGRyZW4sIGNhcmRSZWY6cmVzRGF0YS5jYXJkUmVmIH0pXG4gICAgICAgIC8vIH0sIDEwMCk7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlRmluYWxMaXN0KHsgc2VsZWN0ZWRUZXJtOiByZXMudGVybSwgaXNTZWxlY3RlZDogdHJ1ZSwgcGFyZW50RGF0YTogcmVzLnBhcmVudCwgY29sSW5kZXg6cmVzRGF0YS5pbmRleCB9KVxuICAgICAgICAgdGhpcy5sb2FkZWRbcmVzLnRlcm0uY2F0ZWdvcnldID0gdHJ1ZVxuICAgICAgICByZXMudGVybS5zZWxlY3RlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZShyZXMudGVybS5jYXRlZ29yeSlcbiAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5pbnNlcnRVcGRhdGVEZWxldGVOb3RpZmllci5uZXh0KHsgYWN0aW9uOiByZXMudGVybS5jYXRlZ29yeSwgdHlwZTondXBkYXRlJywgZGF0YTogcmVzLnRlcm0gfSlcbiAgICAgICAgIHRoaXMudXBkYXRlRmluYWxMaXN0KHsgc2VsZWN0ZWRUZXJtOiByZXMudGVybSwgaXNTZWxlY3RlZDogdHJ1ZSwgcGFyZW50RGF0YTogcmVzLnBhcmVudCwgY29sSW5kZXg6cmVzRGF0YS5pbmRleCB9LCAndXBkYXRlJylcbiAgICAgICAgIHJlcy50ZXJtLnNlbGVjdGVkID0gdHJ1ZVxuICAgICAgICAvLyBjb25zdCBuZXh0ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldE5leHRDYXRlZ29yeShyZXMudGVybS5jYXRlZ29yeSlcbiAgICAgICAgXG4gICAgICAgIC8vICAgaWYgKG5leHQgJiYgbmV4dC5jb2RlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUobmV4dC5jb2RlKVxuICAgICAgICAvLyAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKCFyZXMubXVsdGkpe1xuICAgICAgICAgIHJlcy5wYXJlbnQuY2hpbGRyZW4/IHJlcy5wYXJlbnQuY2hpbGRyZW4ucHVzaChyZXMudGVybSkgOnJlcy5wYXJlbnRbJ2NoaWxkcmVuJ10gPSBbcmVzLnRlcm1dXG4gICAgICAgIH0gXG4gICAgICAgIHRoaXMudXBkYXRlRmluYWxMaXN0KHsgc2VsZWN0ZWRUZXJtOiByZXMudGVybSwgaXNTZWxlY3RlZDogZmFsc2UsIHBhcmVudERhdGE6IHJlcy5wYXJlbnQsIGNvbEluZGV4OnJlc0RhdGEuaW5kZXggfSwpXG4gICAgICB9XG4gICAgfVxuICAgXG4gIH1cblxuICBtYWtlRmlyc3RUZXJtU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgZmlyc3RMaXN0SXRlbSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmVudHJpZXMoKS5uZXh0KCkudmFsdWUgYXMgYW55XG4gICAgaWYoZmlyc3RMaXN0SXRlbSAmJiBmaXJzdExpc3RJdGVtLmxlbmd0aCA+PSAyKXtcbiAgICAgIGlmKGZpcnN0TGlzdEl0ZW1bMV0gJiYgZmlyc3RMaXN0SXRlbVsxXS5jaGlsZHJlbiAmJiBmaXJzdExpc3RJdGVtWzFdLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBmaXJzdFRlcm0gPSBmaXJzdExpc3RJdGVtWzFdLmNoaWxkcmVuWzBdIGFzIGFueVxuICAgICAgICBjb25zdCBjYXJkUmVmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlyc3RUZXJtLm5hbWUpXG4gICAgICAgIC8vIHRoaXMuY2F0ZWdvcnlMaXN0ID0gW11cbiAgICAgICAgZmlyc3RUZXJtLnNlbGVjdGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY2FyZENsa0RhdGEgPSBmaXJzdFRlcm07XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5DdXJyZW50Q2FyZENsay5uZXh0KGZpcnN0VGVybS5jYXRlZ29yeSlcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IGZpcnN0VGVybS5jYXRlZ29yeSwgZGF0YTogZmlyc3RUZXJtLCBjYXJkUmVmIH0pXG4gICAgICAgIHRoaXMuaXNGcmF3b3JrTG9hZGluZyA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVGF4b25vbXlUZXJtKGRhdGE6IHsgc2VsZWN0ZWRUZXJtOiBhbnksIGlzU2VsZWN0ZWQ6IGJvb2xlYW4sIGlzVXBkYXRlPzphbnl9KSB7XG4gICAgaWYoZGF0YSAmJiBkYXRhLnNlbGVjdGVkVGVybSAmJiBkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeSkge1xuICAgICAgaWYoIWRhdGEuaXNVcGRhdGUpe1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbmFsTGlzdChkYXRhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaW5hbExpc3QoZGF0YSwgJ3VwZGF0ZScpXG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeSwgZGF0YS5zZWxlY3RlZFRlcm0uY29kZSk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVNlbGVjdGlvbihjYXRlZ29yeTogc3RyaW5nLCBzZWxlY3RlZFRlcm1Db2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYXRlZ29yeURhdGEgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC5nZXQoY2F0ZWdvcnkpO1xuICAgIGlmIChjYXRlZ29yeURhdGEgJiYgY2F0ZWdvcnlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBjYXRlZ29yeURhdGEuY2hpbGRyZW4ubWFwKGl0ZW0gPT4ge1xuICAgICAgICBpdGVtLnNlbGVjdGVkID0gc2VsZWN0ZWRUZXJtQ29kZSA9PT0gaXRlbS5jb2RlID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vbmVlZCB0byByZWZhY3RvciBhdCBoZWlnaCBsZXZlbFxuICB1cGRhdGVGaW5hbExpc3QoZGF0YTogeyBzZWxlY3RlZFRlcm06IGFueSwgaXNTZWxlY3RlZDogYm9vbGVhbiwgcGFyZW50RGF0YT86IGFueSwgY29sSW5kZXg/OiBhbnl9LCB0eXBlPzogYW55KSB7XG4gICAgXG4gICAgaWYgKGRhdGEuaXNTZWxlY3RlZCkge1xuICAgICAgLy8gZGF0YS5zZWxlY3RlZFRlcm0uc2VsZWN0ZWQgPSBkYXRhLmlzU2VsZWN0ZWRcbiAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNldChkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeSwgZGF0YS5zZWxlY3RlZFRlcm0pO1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnkpXG4gICAgICBpZiAobmV4dCAmJiBuZXh0LmNvZGUpIHtcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKG5leHQuY29kZSlcbiAgICAgIH1cbiAgICAgIC8vIG5vdGlmeSBuZXh0XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuaW5zZXJ0VXBkYXRlRGVsZXRlTm90aWZpZXIubmV4dCh7IGFjdGlvbjogZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnksIHR5cGU6IHR5cGUgPyB0eXBlIDogJ3NlbGVjdCcsIGRhdGE6IGRhdGEuc2VsZWN0ZWRUZXJtIH0pXG4gICAgfSBcbiAgICBpZihkYXRhLmNvbEluZGV4ID09PSAwICYmICFkYXRhLmlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCk9PiB7XG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgICB9LDMwMDApXG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkZWRbZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnldID0gdHJ1ZVxuICAgICAgLy8gaWYodHlwZSAmJiB0eXBlID09PSAndXBkYXRlJyl7XG4gICAgICAvLyAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZShkYXRhLnNlbGVjdGVkVGVybS5jYXRlZ29yeSk7XG4gICAgICAvLyAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBkYXRhLnBhcmVudERhdGEuY2F0ZWdvcnksIGRhdGE6IGRhdGEucGFyZW50RGF0YS5jaGlsZHJlbiB9KVxuICAgICAgLy8gfVxuICAgIH0sIDEwMCk7XG5cbiAgfVxuICBpc0VuYWJsZWQoY29sdW1uQ29kZTogc3RyaW5nKTogYm9vbGVhbiB7ICAgIFxuICAgIHJldHVybiAhIXRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChjb2x1bW5Db2RlKVxuICB9XG5cbiAgaXNFbmFibGVkcygpIHtcbiAgLy8gIHJldHVybiB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY2FyZENsa0RhdGFcbiAgaWYodGhpcy5mcmFtZXdvcmtTZXJ2aWNlLkN1cnJlbnRDYXJkQ2xrKXtcbiAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuQ3VycmVudENhcmRDbGsuc3Vic2NyaWJlKChpdGVtKT0+e1xuICAgICBjb25zdCBkYXRhQ29kZTogYW55ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldE5leHRDYXRlZ29yeShpdGVtKVxuICAgICAgaWYgKGRhdGFDb2RlICYmIGRhdGFDb2RlLmNvZGUpe1xuICAgICAgICB0aGlzLmRhdGFDb25maWcgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0Q29uZmlnKGRhdGFDb2RlLmNvZGUpXG4gICAgICB9XG4gICAgIGlmKGRhdGFDb2RlKXtcbiAgICAgIHRoaXMuY29uZmlnQ29kZUJ0biA9IGRhdGFDb2RlLmNvZGVcbiAgICAgfVxuICAgICB9KVxuICB9XG4gIFxuICBcbiAgfVxuXG4gIC8vIGdldGJ0bkVuYWJsZUZuKF9pdGVtOiBhbnkpIHtcbiAgLy8gICBjb25zdCBhbGxTZWxlY3RlZFRlcm06IGFueSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRBbGxTZWxlY3RlZFRlcm1zKClcbiAgLy8gICBpZiAoYWxsU2VsZWN0ZWRUZXJtICYmIGFsbFNlbGVjdGVkVGVybS5sZW5ndGggJiYgYWxsU2VsZWN0ZWRUZXJtLmZpbHRlcigodDogYW55KSA9PiB0LmNhdGVnb3J5ID09PSBfaXRlbS5jb2RlKS5sZW5ndGggPiAwKSB7XG4gIC8vICAgICByZXR1cm4gdHJ1ZVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gZmFsc2VcbiAgLy8gfVxuXG5cbiAgb3BlbkNyZWF0ZVRlcm1EaWFsb2coY29sdW1uOiBhbnksIGNvbEluZGV4OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKGNvbHVtbi5jb2RlKSkge1xuICAgICAgY29uc3QgbmV4dENhdCA9IGNvbHVtbi5jb2RlXG4gICAgICBjb25zdCBuZXh0TmV4dENhdCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkobmV4dENhdClcbiAgICAgIGlmKG5leHRDYXQpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXJtcyA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c1NlbGVjdGVkVGVybXMobmV4dENhdClcbiAgICAgICAgY29uc3QgY29sSW5mbyA9IEFycmF5LmZyb20odGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QudmFsdWVzKCkpLmZpbHRlcihsID0+IGwuY29kZSA9PT0gbmV4dENhdCApXG4gICAgICAgIGxldCBuZXh0Q29sSW5mbzogYW55ID0gW11cbiAgICAgICAgaWYobmV4dE5leHRDYXQgJiYgbmV4dE5leHRDYXQuY29kZSkge1xuICAgICAgICAgIG5leHRDb2xJbmZvID0gQXJyYXkuZnJvbSh0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC52YWx1ZXMoKSkuZmlsdGVyKGwgPT4gbC5jb2RlID09PSBuZXh0TmV4dENhdC5jb2RlIClcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlhbG9nOiBhbnlcbiAgICAgICAgaWYodGhpcy5lbnZpcm9ubWVudCAmJiB0aGlzLmVudmlyb25tZW50LmZyYW1ld29ya1R5cGUgPT09ICdNRE9fREVTSUdOQVRJT04nKXtcbiAgICAgICAgICBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7IFxuICAgICAgICAgICAgICBtb2RlOidtdWx0aS1jcmVhdGUnLFxuICAgICAgICAgICAgICAvLyBjYXJkQ29sSW5mbzogdGhpcy5kYXRhLmNvbHVtbkluZm8sXG4gICAgICAgICAgICAgIGNvbHVtbkluZm86IGNvbEluZm8gJiYgY29sSW5mby5sZW5ndGggPyBjb2xJbmZvWzBdIDogW10sXG4gICAgICAgICAgICAgIG5leHRDb2xJbmZvOiBuZXh0Q29sSW5mbyAmJiBuZXh0Q29sSW5mby5sZW5ndGggPyBuZXh0Q29sSW5mb1swXSA6IFtdLFxuICAgICAgICAgICAgICBmcmFtZXdvcmtJZDogdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldEZyYW1ld29ya0lkKCksXG4gICAgICAgICAgICAgIHNlbGVjdGVkcGFyZW50czogdGhpcy5oZWlnaHRMaWdodGVkLFxuICAgICAgICAgICAgICBjb2xJbmRleDogbmV4dENhdC5pbmRleCxcbiAgICAgICAgICAgICAgLy8gY2hpbGRyZW5EYXRhOiBkYXRhLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBzZWxlY3RlZFBhcmVudFRlcm1zOiBzZWxlY3RlZFRlcm1zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInLFxuICAgICAgICAgICAgcG9zaXRpb246IHsgdG9wOiAnNTBweCcgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlhbG9nID0gdGhpcy5kaWFsb2cub3BlbihDcmVhdGVUZXJtQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAvLyBkYXRhOiB7XG4gICAgICAgICAgICAvLyAgIG1vZGU6J2NyZWF0ZScsXG4gICAgICAgICAgICAvLyAgIGNvbHVtbkluZm86IGNvbHVtbixcbiAgICAgICAgICAgIC8vICAgZnJhbWV3b3JrSWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJZCgpLFxuICAgICAgICAgICAgLy8gICBzZWxlY3RlZHBhcmVudHM6IHRoaXMuaGVpZ2h0TGlnaHRlZCxcbiAgICAgICAgICAgIC8vICAgY29sSW5kZXg6IGNvbEluZGV4LFxuICAgICAgICAgICAgLy8gICBzZWxlY3RlZFBhcmVudFRlcm1zOiBzZWxlY3RlZFRlcm1zXG4gICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgZGF0YTogeyBcbiAgICAgICAgICAgICAgbW9kZTonbXVsdGktY3JlYXRlJyxcbiAgICAgICAgICAgICAgY29sdW1uSW5mbzogY29sSW5mbyAmJiBjb2xJbmZvLmxlbmd0aCA/IGNvbEluZm9bMF0gOiBbXSxcbiAgICAgICAgICAgICAgZnJhbWV3b3JrSWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJZCgpLFxuICAgICAgICAgICAgICBzZWxlY3RlZHBhcmVudHM6IHRoaXMuaGVpZ2h0TGlnaHRlZCxcbiAgICAgICAgICAgICAgY29sSW5kZXg6IG5leHRDYXQuaW5kZXgsXG4gICAgICAgICAgICAgIC8vIGNoaWxkcmVuRGF0YTogZGF0YS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJlbnRUZXJtczogc2VsZWN0ZWRUZXJtc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZHRoOiAnODAwcHgnLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2N1c3RvbS1kaWFsb2ctY29udGFpbmVyJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHRvcDogJzUwcHgnIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZighcmVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UHVibGlzaCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICBjb25zdCBkYXRhICA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5jYXJkQ2xrRGF0YVxuICAgICAgICAgXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0ge1xuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgaW5kZXg6IG5leHRDYXQuaW5kZXgsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdHlwZTogJ211bHRpLWNyZWF0ZSdcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoIShyZXMgJiYgcmVzLnN0b3BVcGRhdGUpKXtcbiAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS51cGRhdGVBZnRlckFkZE9yRWRpdFN1YmplY3QocmVzcG9uc2VEYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmxvYWRlZFtyZXMudGVybS5jYXRlZ29yeV0gPSBmYWxzZVxuICAgICAgICAgIC8vIHdhaXRcbiAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW4gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShyZXMudGVybVswXS5jYXRlZ29yeSlcbiAgICAgICAgICByZXMucGFyZW50ID0gbnVsbFxuICAgICAgICAgIGlmIChwYXJlbnRDb2x1bW4pIHtcbiAgICAgICAgICAgIHJlcy5wYXJlbnQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uLmNvZGUpXG4gICAgICAgICAgICByZXMucGFyZW50LmNoaWxkcmVuPyByZXMucGFyZW50LmNoaWxkcmVuLnB1c2gocmVzLnRlcm1bMF0pIDpyZXMucGFyZW50WydjaGlsZHJlbiddID0gW3Jlcy50ZXJtWzBdXVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpbmFsTGlzdCh7IHNlbGVjdGVkVGVybTogcmVzLnRlcm1bMF0sIGlzU2VsZWN0ZWQ6IGZhbHNlLCBwYXJlbnREYXRhOiByZXMucGFyZW50LCBjb2xJbmRleDpjb2xJbmRleCB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9wZW5Pcmdhbml6YXRpb25EaWFsb2coY29sdW1uOiBhbnksIF9pbmRleDogYW55LCB0eXBlU2VsZWN0ZWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHRyZWVMaXN0RGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c1NlbGVjdGVkVGVybXMoY29sdW1uLmNvZGUpICAgICBcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKE9yZ0hpZXJhcmNoeUFkZE1vZGFsQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByZXZpb3VzOiB0cmVlTGlzdERhdGEsXG4gICAgICAgIGN1cnJlbnREYXRhOiBjb2x1bW4sXG4gICAgICAgIHNlbGVjdGVkT3JnRGF0YTogdGhpcy5vcmdTZWxlY3RlZERhdGEsXG4gICAgICAgIHR5cGU6IHR5cGVTZWxlY3RlZFxuICAgICAgfSxcbiAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uOiB7IHJpZ2h0OiAnMCcgfSxcbiAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgIHdpZHRoOiAnNTAlJyxcbiAgICAgIHBhbmVsQ2xhc3M6ICdyaWdodC1zaWRlLW1vZGFsJyxcbiAgICAgIG1heFdpZHRoOiAnMTAwdncnXG4gICAgfSk7XG4gICAgXG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIChfcmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKF9yZXMgJiYgX3Jlcy50eXBlID09PSAnYWRkJykge1xuICAgICAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZSh0cnVlKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRlcm1zKF9yZXMuc2VsZWN0ZWRPcmcsIGNvbHVtbilcbiAgICAgICAgfSBlbHNlIGlmIChfcmVzICYmIF9yZXMudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgICBpZiAoX3Jlcy5wYXBhcmVudFNlbGVjdGVkT3JnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVBhcmVudEFzc29jaWF0aW9uKF9yZXMucGFwYXJlbnRTZWxlY3RlZE9yZywgX3Jlcy5jdXJyZW50VGVybSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfcmVzLnNlbGVjdGVkT3JnICYmIF9yZXMuc2VsZWN0ZWRPcmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVUZXJtcyhfcmVzLnNlbGVjdGVkT3JnLCBjb2x1bW4pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHVibGlzaEZyYW1ld29yayh7XG4gICAgICAgICAgICAgIGlkOiB0aGlzLm9yZ1NlbGVjdGVkRGF0YS5vcmdIaWVyYXJjaHlGcmFtZXdvcmtJZCB8fCAnJyxcbiAgICAgICAgICAgIGNhdGVnb3J5OiAnJ30pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGlzdCgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QudmFsdWVzKCkpXG4gIH1cbiAgXG4gIGRyYXdIZWFkZXJMaW5lKGxlbjogbnVtYmVyKXtcbiAgICBjb25zdCBvcHRpb25zID0gey4uLmRlZmF1bHRDb25maWcsLi4uaGVhZGVyTGluZUNvbmZpZyB9XG4gICAgZm9yKGxldCBpPTE7IGk8PWxlbjsgaSsrKXtcbiAgICAgIGNvbnN0IHN0YXJ0RWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI2JveCR7aX1jb3VudGApXG4gICAgICBjb25zdCBlbmRFbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYm94JHtpfUhlYWRlcmApXG4gICAgICBpZihzdGFydEVsZSAmJiBlbmRFbGUpIHtcbiAgICAgICAgbmV3IExlYWRlckxpbmUoc3RhcnRFbGUsIGVuZEVsZSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uKGNvbHVtbkNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC5nZXQoY29sdW1uQ29kZSlcbiAgfVxuICBcbiAgbmV3Q29ubmVjdGlvbigpIHsgXG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5kaWFsb2cub3BlbihDb25uZWN0b3JDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgd2lkdGg6ICc5MCUnLFxuICAgICAgLy8gcGFuZWxDbGFzczogJ2N1c3RvbS1kaWFsb2ctY29udGFpbmVyJyBcbiAgICB9KVxuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzOiBJQ29ubmVjdGlvblR5cGUpID0+IHtcbiAgICAgIGlmICgocmVzLnNvdXJjZSA9PT0gJ29ubGluZScgJiYgcmVzLmRhdGEuZW5kcG9pbnQpIHx8IChyZXMuc291cmNlID09PSAnb2ZmbGluZScpKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdmMubG9jYWxTdG9yYWdlID0gcmVzXG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgICB9IGVsc2UgaWYgKHJlcy5zb3VyY2UgPT09ICdvbmxpbmUnICYmICFyZXMuZGF0YS5lbmRwb2ludCkge1xuICAgICAgICB0aGlzLmxvY2FsU3ZjLmxvY2FsU3RvcmFnZSA9IHJlc1xuICAgICAgICB0aGlzLmluaXQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVEcmFmdFN0YXR1c1Rlcm1zKGV2ZW50OiBhbnkpe1xuICAgIGlmKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuZHJhZnRUZXJtcy5wdXNoKGV2ZW50LnRlcm0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmFmdFRlcm1zID0gdGhpcy5kcmFmdFRlcm1zLmZpbHRlcihkID0+IGV2ZW50LnRlcm0uaWRlbnRpZmllciAhPT0gZC5pZGVudGlmaWVyKVxuICAgIH1cbiAgICB0aGlzLnNob3dBY3Rpb25CYXIgPSB0aGlzLmRyYWZ0VGVybXMubGVuZ3RoPjA/dHJ1ZTpmYWxzZVxuICB9XG5cbiAgZ2V0Tm9PZkNhcmRzKGV2ZW50OmFueSkge1xuICAgIGlmKHRoaXMuY2F0ZWdvcnlMaXN0Lmxlbmd0aCA+IDAgJiYgZXZlbnQuY2F0ZWdvcnkgIT09ICcnKSB7XG4gICAgICBsZXQgaW5kZXggPSB0aGlzLmNhdGVnb3J5TGlzdC5maW5kSW5kZXgoKG9iajphbnkpID0+IG9iai5jYXRlZ29yeSA9PSBldmVudC5jYXRlZ29yeSk7XG4gICAgICBpZihpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlMaXN0LnNwbGljZShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmKGV2ZW50LmNhdGVnb3J5ID09ICcnKSB7XG4gICAgICB0aGlzLmNhdGVnb3J5TGlzdFt0aGlzLmNhdGVnb3J5TGlzdC5sZW5ndGgtMV0uY291bnQgPSAwO1xuICAgIH1cbiAgICB0aGlzLmNhdGVnb3J5TGlzdC5wdXNoKGV2ZW50KTtcbiAgfVxuICBcbiAgZ2V0Q291bnQoY29kZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBHZXQgYWxsIHByZXZpb3VzIGNhdGVnb3JpZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgaGF2ZSBzZWxlY3Rpb25zXG4gICAgY29uc3QgYWxsQ2F0ZWdvcmllcyA9IEFycmF5LmZyb20odGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QudmFsdWVzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRDYXRlZ29yeUluZGV4ID0gYWxsQ2F0ZWdvcmllcy5maW5kSW5kZXgoY2F0ID0+IGNhdC5jb2RlID09PSBjb2RlKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiBhbGwgcHJldmlvdXMgY2F0ZWdvcmllcyBoYXZlIHNlbGVjdGVkIHRlcm1zXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Q2F0ZWdvcnlJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBwcmV2Q2F0ZWdvcnlDb2RlID0gYWxsQ2F0ZWdvcmllc1tpXS5jb2RlO1xuICAgICAgY29uc3QgaGFzUHJldlNlbGVjdGlvbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmhhcyhwcmV2Q2F0ZWdvcnlDb2RlKTtcbiAgICAgIFxuICAgICAgLy8gSWYgYW55IHByZXZpb3VzIGNhdGVnb3J5IGRvZXNuJ3QgaGF2ZSBhIHNlbGVjdGlvbiwgcmV0dXJuIDBcbiAgICAgIGlmICghaGFzUHJldlNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTm93IHdlIGNhbiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjb3VudCBzaW5jZSBhbGwgcHJldmlvdXMgbGV2ZWxzIGFyZSBzZWxlY3RlZFxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIHNlbGVjdGVkIHRlcm0gZm9yIHBhcmVudCBjYXRlZ29yeSB0aGF0IGhhcyBjaGlsZHJlbiBmb3IgdGhpcyBjYXRlZ29yeVxuICAgIGNvbnN0IHByZXZDYXRlZ29yeSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KGNvZGUpO1xuICAgIGlmIChwcmV2Q2F0ZWdvcnkpIHtcbiAgICAgIGNvbnN0IHByZXZTZWxlY3RlZFRlcm0gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocHJldkNhdGVnb3J5LmNvZGUpO1xuICAgICAgaWYgKHByZXZTZWxlY3RlZFRlcm0pIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNlbGVjdGVkIHBhcmVudCB0ZXJtLCBjb3VudCBpdHMgY2hpbGRyZW4gZm9yIHRoaXMgY2F0ZWdvcnlcbiAgICAgICAgaWYgKHByZXZTZWxlY3RlZFRlcm0uY2hpbGRyZW4gJiYgcHJldlNlbGVjdGVkVGVybS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY291bnQgPSBwcmV2U2VsZWN0ZWRUZXJtLmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4gXG4gICAgICAgICAgICAhY2hpbGQuaXNEZWxldGVkICYmIGNoaWxkLnN0YXR1cyAhPT0gJ1JldGlyZWQnICYmIFxuICAgICAgICAgICAgKGNoaWxkLmNhdGVnb3J5ID09PSBjb2RlIHx8IChjaGlsZC5hc3NvY2lhdGlvbnMgJiYgXG4gICAgICAgICAgICAgY2hpbGQuYXNzb2NpYXRpb25zLnNvbWUoKGFzc29jOiBhbnkpID0+IGFzc29jLmNhdGVnb3J5ID09PSBjb2RlKSkpXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIG5vIHNlbGVjdGlvbiBleGlzdHMgZm9yIHRoZSBwYXJlbnQsIGRvbid0IHNob3cgY291bnRzXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgbGV2ZWwsIHdlIGNhbiBzaG93IGFsbCB0ZXJtc1xuICAgIGNvbnN0IGNhdGVnb3J5RGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChjb2RlKTtcbiAgICBpZiAoY2F0ZWdvcnlEYXRhICYmIGNhdGVnb3J5RGF0YS5jaGlsZHJlbikge1xuICAgICAgY291bnQgPSBjYXRlZ29yeURhdGEuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogYW55KSA9PiBcbiAgICAgICAgIWNoaWxkLmlzRGVsZXRlZCAmJiBjaGlsZC5zdGF0dXMgIT09ICdSZXRpcmVkJ1xuICAgICAgKS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIHNlbmRGb3JBcHByb3ZhbCgpe1xuICAgIGlmKCF0aGlzLmlzQXBwcm92YWxWaWV3KXtcbiAgICAgICAgbGV0IHBhcmVudExpc3Q6IGFueSA9IFtdXG4gICAgICAgIHRoaXMubGlzdC5mb3JFYWNoKGVsZSA9PiB7XG4gICAgICAgICAgY29uc3QgdCA9IGVsZS5jaGlsZHJlbi5maWx0ZXIoKHRlcm06IGFueSkgPT4gdGVybS5zZWxlY3RlZCA9PT0gdHJ1ZSlcbiAgICAgICAgICBpZih0WzBdKXtcbiAgICAgICAgICAgIHBhcmVudExpc3QucHVzaCh0WzBdKVxuICAgICAgICAgIH0gXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICB1cGRhdGVGaWVsZFZhbHVlczpbLi4ucGFyZW50TGlzdCwgLi4udGhpcy5kcmFmdFRlcm1zXVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwcm92YWxTZXJ2aWNlLmNyZWF0ZUFwcHJvdmFsKHJlcSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UucmVtb3ZlT2xkTGluZSgpXG4gICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbignVGVybXMgc3VjY2Vzc2Z1bGx5IHNlbnQgZm9yIEFwcHJvdmFsLicsICdjYW5jZWwnKVxuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbnRGb3JBcHByb3ZlLmVtaXQodGhpcy5kcmFmdFRlcm1zKVxuICAgIH1cbiAgIFxuICB9XG5cbiAgY2xvc2VBY3Rpb25CYXIoX2U6YW55KXsgXG4gICAgdGhpcy5zaG93QWN0aW9uQmFyID0gZmFsc2U7XG4gIH1cblxuICBpbml0Q29uZmlnKCkge1xuICAgIGlmKHRoaXMuZW52aXJvbm1lbnQpe1xuICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnVwZGF0ZUVudmlyb25tZW50KHRoaXMuZW52aXJvbm1lbnQpO1xuICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNldENvbmZpZyh0aGlzLnRheG9ub215Q29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpe1xuICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnJlbW92ZU9sZExpbmUoKTtcbiAgICAgIC8vIHRoaXMuZW52aXJvbm1lbnQgPSBudWxsXG4gICAgICAvLyB0aGlzLmZyYW1ld29ya1NlcnZpY2UucmVzZXRBbmRGcmVzaCgpXG4gICAgICAvLyB0aGlzLmNvbm5lY3RvclN2Yy5yZW1vdmVBbGxMaW5lcygpXG4gICAgICAvLyB0aGlzLmNvbm5lY3RvclN2Yy51cGRhdGVDb25uZWN0b3JzTWFwKHt9KVxuICB9XG5cbiAgZ2V0TmV4dENhdChkYXRhOiBhbnkpIHtcbiAgICBpZihkYXRhICAmJiBkYXRhLmNvZGUpe1xuICAgICAgY29uc3QgbmV4dENhdCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoZGF0YS5jb2RlKVxuICAgICAgcmV0dXJuIG5leHRDYXRcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlzQ3VycmVudE9yTmV4dFRlcm0oX2NvbHVtbjogYW55LCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgdGhlcmUncyBubyBjdXJyZW50IHNlbGVjdGlvbiwgb25seSBlbmFibGUgdGhlIGZpcnN0IGNvbHVtblxuICAgIGlmICghdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24udmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIGNhdGVnb3J5IGZyb20gdGhlIGN1cnJlbnRTZWxlY3Rpb25cbiAgICBjb25zdCBjdXJyZW50Q2F0ZWdvcnkgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi52YWx1ZS50eXBlO1xuICAgIGlmICghY3VycmVudENhdGVnb3J5KSB7XG4gICAgICByZXR1cm4gaW5kZXggPT09IDA7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGFjdGl2ZSBjb2x1bW5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmxpc3RbaV0uY29kZSA9PT0gY3VycmVudENhdGVnb3J5KSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjdXJyZW50IGluZGV4LCBvbmx5IGVuYWJsZSB0aGUgZmlyc3QgY29sdW1uXG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5hYmxlIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlIG5leHQgb25lXG4gICAgcmV0dXJuIGluZGV4ID09PSBjdXJyZW50SW5kZXggfHwgaW5kZXggPT09IGN1cnJlbnRJbmRleCArIDE7XG4gIH1cblxuICBzaG91bGRTaG93U3ZnQm9yZGVyV3JhcHBlcihjb2x1bW46IGFueSwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzQ3VycmVudE9yTmV4dFRlcm0oY29sdW1uLCBpbmRleCkgJiYgdGhpcy5nZXRDb3VudChjb2x1bW4uY29kZSkgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBhc3luYyBjcmVhdGVUZXJtcyhzZWxlY3RlZExpc3Q6YW55LCBjb2x1bW46YW55KSB7XG4gICAgY29uc3QgZnJhbWV3b3JrRGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLm9yZ1NlbGVjdGVkRGF0YS5vcmdIaWVyYXJjaHlGcmFtZXdvcmtJZCB8fCAnJyxcbiAgICAgIGNhdGVnb3J5OiBjb2x1bW4uY29kZSB8fCAnJyxcbiAgICB9XG4gICAgbGV0IGNyZWF0ZWROb2RlSWQ6YW55ID0gW11cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGVsZSBvZiBzZWxlY3RlZExpc3QpIHsgXG4gICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICBuYW1lOiBlbGUub3JnTmFtZSB8fCAnJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGVsZS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgICAgY29kZTogdXVpZHY0KCksXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgb3JnSWQ6IGVsZS5pZGVudGlmaWVyIHx8ICcnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGNvbnN0IGNyZWF0ZVRyZW1zUmVzOmFueSA9IGF3YWl0IHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5jcmVhdGVUZXJtKHJlcXVlc3RCb2R5LCBmcmFtZXdvcmtEYXRhKS50b1Byb21pc2UoKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBjcmVhdGluZyB0ZXJtJywgZXJyKTtcbiAgICAgIH0pXG4gICAgICBpZiAoY3JlYXRlVHJlbXNSZXMgJiYgY3JlYXRlVHJlbXNSZXMucmVzdWx0ICYmIGNyZWF0ZVRyZW1zUmVzLnJlc3VsdC5ub2RlX2lkKSB7XG4gICAgICAgIGNyZWF0ZWROb2RlSWQucHVzaChjcmVhdGVUcmVtc1Jlcy5yZXN1bHQubm9kZV9pZFswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKCdFcnJvciBpbiBjcmVhdGluZyB0ZXJtJywgJ2NhbmNlbCcpO1xuICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjcmVhdGVkTm9kZUlkLmxlbmd0aCA9PT0gc2VsZWN0ZWRMaXN0Lmxlbmd0aCkge1xuICAgICAgaWYgKGNvbHVtbi5pbmRleCA+MSkge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUFzc29jaWF0aW9uKGNyZWF0ZWROb2RlSWQsIGZyYW1ld29ya0RhdGEsIGNvbHVtbik7XG4gICAgICB9IFxuICAgICAgdGhpcy5wdWJsaXNoRnJhbWV3b3JrKGZyYW1ld29ya0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFzc29jaWF0aW9uKG5vZGVJZDogYW55LCBmcmFtZXdvcmtEYXRhOiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgY29uc3QgcHJldjphbnkgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShjb2x1bW4uY29kZSk7XG4gICAgbGV0IHByZXZUcmVtOmFueSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c1NlbGVjdGVkVGVybXMoY29sdW1uLmNvZGUpXG4gICAgY29uc3QgdGVtcEZyYW1lRGF0YSA9IF8uY2xvbmVEZWVwKHRoaXMuZnJhbWV3b3JrU2VydmljZS5jb21wbGV0ZVJlc3BvbnNlKVxuICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdGVybToge1xuICAgICAgICAgIGFzc29jaWF0aW9uczogW11cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gXG4gICAgaWYgKHByZXYgJiYgcHJldlRyZW0pIHtcbiAgICAgIHByZXZUcmVtID0gcHJldlRyZW0uZmluZCgoZWxlOmFueSkgPT4gZWxlLmNhdGVnb3J5ID09PSBwcmV2LmNvZGUpXG4gICAgICBwcmV2VHJlbSA9IHRlbXBGcmFtZURhdGEuY2F0ZWdvcmllcy5maW5kKChlbGU6YW55KSA9PiBlbGUuY29kZSA9PT0gcHJldi5jb2RlKS50ZXJtcy5maW5kKChlbGU6YW55KSA9PiBlbGUuY29kZSA9PT0gcHJldlRyZW0uY29kZSlcbiAgICAgIGlmIChwcmV2VHJlbSAmJiBwcmV2VHJlbS5hc3NvY2lhdGlvbnMgJiYgcHJldlRyZW0uYXNzb2NpYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJldlRyZW0uYXNzb2NpYXRpb25zLmZvckVhY2goKGVsZTphbnkpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybS5hc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBlbGUuaWRlbnRpZmllclxuICAgICAgICAgIH0pXG4gICAgICAgIH0pIFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZUlkICYmIG5vZGVJZC5sZW5ndGggPiAwKSB7XG4gICAgICBub2RlSWQuZm9yRWFjaCgoZWxlOmFueSkgPT4ge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0uYXNzb2NpYXRpb25zLnB1c2goe1xuICAgICAgICAgIGlkZW50aWZpZXI6IGVsZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgZnJhbWV3b3JrRGF0YS5jYXRlZ29yeSA9IHByZXZUcmVtLmNhdGVnb3J5IHx8ICcnO1xuICAgIGNvbnN0IG5vZGVJZFBhcnRzID0gcHJldlRyZW0uaWRlbnRpZmllci5zcGxpdCgnXycpO1xuICAgIGNvbnN0IGNvZGVJZCA9IG5vZGVJZFBhcnRzW25vZGVJZFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHVwZGF0ZUFzc29jaWF0aW9uUmVzOmFueSA9IGF3YWl0IHRoaXMudHJlZUhpZXJhcmNoeVN2Yy51cGRhdGVGcmFtZXdvcmtBc3NvY2lhdGlvbihyZXF1ZXN0Qm9keSwgZnJhbWV3b3JrRGF0YSwgY29kZUlkKS50b1Byb21pc2UoKS5jYXRjaChlcnIgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gdXBkYXRpbmcgYXNzb2NpYXRpb24nLCBlcnIpO1xuICAgIH0pXG4gICAgaWYgKHVwZGF0ZUFzc29jaWF0aW9uUmVzICYmIHVwZGF0ZUFzc29jaWF0aW9uUmVzLnJlc3VsdCAmJiB1cGRhdGVBc3NvY2lhdGlvblJlcy5yZXN1bHQubm9kZV9pZCkge1xuICAgICAgLy8gdGhpcy5wdWJsaXNoRnJhbWV3b3JrKGZyYW1ld29ya0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHB1Ymxpc2hGcmFtZXdvcmsoZnJhbWV3b3JrRGF0YTogYW55KSB7XG4gICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnB1Ymxpc2hGcmVhbWV3b3JrKGZyYW1ld29ya0RhdGEpLnN1YnNjcmliZSgocmVzOmFueSkgPT4ge1xuICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucHVibGlzaFN0YXR1cykge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBPcmdhbml6YXRpb24gaGllcmFyY2h5IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG4gICAgICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKCdFcnJvciBpbiBwdWJsaXNoaW5nIGZyYW1ld29yaycsICdjYW5jZWwnKTtcbiAgICAgICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCAoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBwdWJsaXNoaW5nIGZyYW1ld29yaycsIGVycik7XG4gICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQ29ubmVjdGlvbihkYXRhOiBhbnkpIHtcbiAgICBjb25zdCBhc3NvY2lhdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRUZXJtc0Fzc29jaWF0aW9uKGRhdGEuY2hpbGRyZW4uY29kZSk7XG4gICAgbGV0IGNvdW50ID0gMFxuICAgIGlmIChhc3NvY2lhdGlvbiAmJiBhc3NvY2lhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBhc3NvY2lhdGlvbi5mb3JFYWNoKChhc3NvYzogYW55KSA9PiB7XG4gICAgICAgIGlmIChhc3NvYy5pZHMgJiYgYXNzb2MuaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb3VudCArPSBhc3NvYy5pZHMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIGRpYWxvZ1R5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGVhZGVyOiBgJHtjb3VudCB8fCAwfSBPcmdhbmlzYXRpb24ke2NvdW50ID4gMSA/ICdzJyA6ICcnfSB3aWxsIGJlIHJlbW92ZWQgZnJvbSBvcmdhbmlzYXRpb24gaGllcmFyY2h5LmAsXG4gICAgICAgICAgICBoZWFkZXJDbGFzczogJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtYmx1ZScsXG4gICAgICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbXNnQ2xhc3M6ICd0ZXh0LWJsdWUgbWFyZ2luLWJvdHRvbS1zJyxcbiAgICAgICAgICAgICAgICBtc2c6IGBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2AsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZvb3RlckNsYXNzOiAnaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJ0blRleHQ6ICdObycsXG4gICAgICAgICAgICBidG5DbGFzczogJ2J0bi1jb21tb24gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICByZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBidG5UZXh0OiAnWWVzJyxcbiAgICAgICAgICAgIGJ0bkNsYXNzOiAnYnRuLWNvbW1vbiBidG4tcHJpbWFyeScsXG4gICAgICAgICAgICByZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25mb3JhbXRpb25Qb3B1cENvbXBvbmVudCwge1xuICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgICAgbWF4V2lkdGg6ICc4MHZ3JyxcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLnJldGlyZVRlcm1GdW5jdGlvbihhc3NvY2lhdGlvbilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgRXJyb3IgaW4gcmVtb3ZpbmcgdGhlIG9yZ2FuaXNhdGlvbmAsICdjYW5jZWwnKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJldGlyZVRlcm1GdW5jdGlvbihhc3NvY2lhdGlvbjogYW55KSB7ICBcbiAgICBsZXQgY291bnQgPSAwICBcbiAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUodHJ1ZSlcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGVsZSBvZiBhc3NvY2lhdGlvbikge1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBjb250ZW50SWRzOiBlbGUuaWRzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyYW1ld29ya09iaiA9IHtcbiAgICAgICAgaWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5jb21wbGV0ZVJlc3BvbnNlLmNvZGUsXG4gICAgICAgIGNhdGVnb3J5OiBlbGUuY2F0ZWdvcnkgfHwgJycsXG4gICAgICB9XG4gICAgICBjb25zdCByZXRpcmVSZXMgPSBhd2FpdCB0aGlzLnRyZWVIaWVyYXJjaHlTdmMucmV0aXJlVGVybShyZXF1ZXN0Qm9keSwgZnJhbWV3b3JrT2JqKS50b1Byb21pc2UoKS5jYXRjaCgoX2VycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZShmYWxzZSlcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgRmFpbGVkIHRvIHJlbW92ZSBjb25uZWN0aW9uLmAsICdjYW5jZWwnKVxuICAgICAgfSlcbiAgICAgIGlmIChyZXRpcmVSZXMgJiYgcmV0aXJlUmVzLnBhcmFtcyAmJiByZXRpcmVSZXMucGFyYW1zLnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3N1Y2Nlc3NmdWwnKSB7XG4gICAgICAgIGNvdW50ICs9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZShmYWxzZSlcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgRmFpbGVkIHRvIHJlbW92ZSBjb25uZWN0aW9uLmAsICdjYW5jZWwnKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09IGFzc29jaWF0aW9uLmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoRnJhbWV3b3JrKHtcbiAgICAgICAgaWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5jb21wbGV0ZVJlc3BvbnNlLmNvZGUsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBGYWlsZWQgdG8gcmVtb3ZlIGNvbm5lY3Rpb24uYCwgJ2NhbmNlbCcpXG4gICAgfVxuICB9XG5cbiAgY2FyZEFjdGlvbkVtaXQoZXZlbnQ6YW55KSB7XG4gICAgc3dpdGNoKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAncmVtb3ZlLXRlcm0nOlxuICAgICAgICAgIHRoaXMucmVtb3ZlQ29ubmVjdGlvbihldmVudC5kYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXBkYXRlLWhpZXJhcmNoeSc6XG4gICAgICAgICAgdGhpcy5vcGVuT3JnYW5pemF0aW9uRGlhbG9nKHRoaXMubGlzdFt0aGlzLmxpc3QuZmluZEluZGV4KChpdGVtOmFueSkgPT4gaXRlbS5jb2RlID09PSBldmVudC5kYXRhLmNhdGVnb3J5KSArMV0sICcnLCAndXBkYXRlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbWFuYWdlLW9yZyc6XG4gICAgICAgICAgICB0aGlzLm1hbmFnZU9yZy5lbWl0KGV2ZW50LmRhdGEuY2hpbGRyZW4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGVkaXRDYXRlZ29yeU5hbWUoY29sdW1uOmFueSwgaW5kZXg6YW55KSB7XG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5kaWFsb2cub3BlbihDYXRlZ29yeUVkaXRNb2R1bGVDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29sdW1uSW5mbzogY29sdW1uLFxuICAgICAgICBmcmFtZXdvcmtJZDogdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldEZyYW1ld29ya0lkKCksXG4gICAgICAgIGNvbEluZGV4OiBpbmRleFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiAnODAwcHgnLFxuICAgICAgcGFuZWxDbGFzczogJ2NhdGVnb3J5LWVkaXQtY29udGFpbmVyJyxcbiAgICAgIHBvc2l0aW9uOiB7IHRvcDogJzUwcHgnIH1cbiAgICB9KVxuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgICAgZnJhbWV3b3JrSWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJZCgpLFxuICAgICAgICAgIGNhdGVnb3J5Q29kZTogcmVzLmNvbHVtbi5jb2x1bW5EYXRhLmNvZGUsXG4gICAgICAgICAgY2F0ZWdvcnlOYW1lOiByZXMuY29sdW1uLmZvcm1EYXRhLmNhdGVnb3J5TmFtZSxcbiAgICAgICAgICBjYXRlZ29yeURlc2NyaXB0aW9uOiByZXMuY29sdW1uLmZvcm1EYXRhLmNhdGVnb3R5RGVzY3JpcHRpb24gfHwgJydcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNhdGVnb3J5KHJlcXVlc3RCb2R5KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRUZXJtc0Fzc29jaWF0aW9uKGNhdGVnb3J5Q29kZTogc3RyaW5nKSB7XG4gICAgbGV0IHRlbXBEYXRhOiBhbnkgPSBbXTtcbiAgICBjb25zdCBjb21wbGV0ZURhdGEgPSBfLmNsb25lRGVlcCh0aGlzLmZyYW1ld29ya1NlcnZpY2UuY29tcGxldGVSZXNwb25zZSk7XG4gICAgaWYgKGNvbXBsZXRlRGF0YSAmJiBjb21wbGV0ZURhdGEuY2F0ZWdvcmllcyAmJiBjb21wbGV0ZURhdGEuY2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb21wbGV0ZURhdGEuY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeTogYW55LCBjYXRJbmRleDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjYXRlZ29yeS50ZXJtcyAmJiBjYXRlZ29yeS50ZXJtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2F0ZWdvcnkudGVybXMuZm9yRWFjaCgodGVybTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodGVybS5jb2RlID09PSBjYXRlZ29yeUNvZGUpIHtcbiAgICAgICAgICAgICAgdGVtcERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogdGVybS5uYW1lLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiB0ZXJtLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAgIGlkczogW3Rlcm0uY29kZV0sXG4gICAgICAgICAgICAgICAgbmV4dENhdGVnb3J5OiB0ZXJtLmNoaWxkcmVuID8gdGVybS5jaGlsZHJlblswXS5jYXRlZ29yeSA6ICcnLFxuICAgICAgICAgICAgICAgIGFzc29jSWRzOiBbXVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRlcm0uYXNzb2NpYXRpb25zICYmIHRlcm0uYXNzb2NpYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0ZXJtLmFzc29jaWF0aW9ucy5mb3JFYWNoKChhc3NvYzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBnZXRJbmRleCA9IHRlbXBEYXRhLmZpbmRJbmRleCgoaXRlbTphbnkpID0+IGl0ZW0uaWRzICYmIGl0ZW0uaWRzLmluY2x1ZGVzKHRlcm0uY29kZSkpXG4gICAgICAgICAgICAgICAgICB0ZW1wRGF0YVtnZXRJbmRleF1bJ2Fzc29jSWRzJ10ucHVzaChhc3NvYy5jb2RlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBpZiAoY2F0SW5kZXggPiAwICYmIGNhdGVnb3J5LnRlcm1zICYmIGNhdGVnb3J5LnRlcm1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjYXRlZ29yeS50ZXJtcy5mb3JFYWNoKCh0ZXJtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRlbXBEYXRhLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS5uZXh0Q2F0ZWdvcnkgPT09IHRlcm0uY2F0ZWdvcnkgJiYgaXRlbS5hc3NvY0lkcy5pbmNsdWRlcyh0ZXJtLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHVzaERhdGE6YW55ID0ge1xuICAgICAgICAgICAgICAgICAgbmFtZTogdGVybS5uYW1lLFxuICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRlcm0uY2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICBpZHM6IFt0ZXJtLmNvZGVdLFxuICAgICAgICAgICAgICAgICAgbmV4dENhdGVnb3J5OiB0ZXJtLmNoaWxkcmVuID8gdGVybS5jaGlsZHJlblswXS5jYXRlZ29yeSA6ICcnLFxuICAgICAgICAgICAgICAgICAgYXNzb2NJZHM6IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZXJtLmFzc29jaWF0aW9ucyAmJiB0ZXJtLmFzc29jaWF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0ZXJtLmFzc29jaWF0aW9ucy5mb3JFYWNoKChhc3NvYzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hEYXRhWydhc3NvY0lkcyddLnB1c2goYXNzb2MuY29kZSlcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLnB1c2gocHVzaERhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0ZW1wRGF0YTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUNhdGVnb3J5KGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgY2F0ZWdvcnk6IHtcbiAgICAgICAgICBuYW1lOiBldmVudC5jYXRlZ29yeU5hbWUgfHwgJycsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmNhdGVnb3J5RGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZnJhbWV3b3JrT2JqID0ge1xuICAgICAgaWQ6IGV2ZW50LmZyYW1ld29ya0lkLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50LmNhdGVnb3J5Q29kZVxuICAgIH1cbiAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUodHJ1ZSk7ICAgIFxuICAgIGNvbnN0IHVwZGF0ZUNhdFJlcyA9IGF3YWl0IHRoaXMudHJlZUhpZXJhcmNoeVN2Yy51cGRhdGVDYXRlZ29yeShyZXF1ZXN0Qm9keSwgZnJhbWV3b3JrT2JqKS50b1Byb21pc2UoKS5jYXRjaCgoX2VycjogYW55KSA9PiB7XG4gICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgaWYgKF9lcnIgJiYgX2Vyci5lcnJvciAmJiBfZXJyLmVycm9yLnBhcmFtcyAmJiBfZXJyLmVycm9yLnBhcmFtcy5lcnJNc2cpIHtcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgJHtfZXJyLmVycm9yLnBhcmFtcy5lcnJNc2d9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmICh1cGRhdGVDYXRSZXMgJiYgdXBkYXRlQ2F0UmVzLnBhcmFtcyAmJiB1cGRhdGVDYXRSZXMucGFyYW1zLnN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnc3VjY2Vzc2Z1bCcpIHtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaEZyYW1ld29yayhmcmFtZXdvcmtPYmopXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUGFyZW50QXNzb2NpYXRpb24oc2VsZWN0ZWRQYXJlbnQ6IGFueSwgY3VycmVudFRlcm06IGFueSkge1xuICAgIGNvbnN0IGZyYW13b3JrRGF0YSA9IF8uY2xvbmVEZWVwKHRoaXMuZnJhbWV3b3JrU2VydmljZS5jb21wbGV0ZVJlc3BvbnNlKTtcbiAgICBjb25zdCBwYXJlbnRDYXRlZ29yeURhdGEgPSBmcmFtd29ya0RhdGEuY2F0ZWdvcmllcy5maW5kKChjYXQ6IGFueSkgPT4gY2F0LmNvZGUgPT09IHNlbGVjdGVkUGFyZW50LmNhdGVnb3J5KTtcbiAgICBpZiAocGFyZW50Q2F0ZWdvcnlEYXRhICYmIHBhcmVudENhdGVnb3J5RGF0YS50ZXJtcyAmJiBwYXJlbnRDYXRlZ29yeURhdGEudGVybXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudFBhcmVudFRlcm0gPSBwYXJlbnRDYXRlZ29yeURhdGEudGVybXMuZmluZCgodGVybTogYW55KSA9PiB7XG4gICAgICAgIGlmICh0ZXJtLmFzc29jaWF0aW9ucyAmJiB0ZXJtLmFzc29jaWF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRlcm0uYXNzb2NpYXRpb25zLnNvbWUoKGFzc29jOiBhbnkpID0+IGFzc29jLmNvZGUgPT09IGN1cnJlbnRUZXJtLmNvZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50UGFyZW50VGVybSkge1xuICAgICAgICBjb25zdCB1cGRhdGVPbGRQYXJlbnRBc3NvY2lhdGlvbjphbnkgPSB7XG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRQYXJlbnRUZXJtLmFzc29jaWF0aW9ucy5mb3JFYWNoKChhc3NvYzogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGFzc29jLmNvZGUgIT09IGN1cnJlbnRUZXJtLmNvZGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZU9sZFBhcmVudEFzc29jaWF0aW9uLnJlcXVlc3QudGVybS5hc3NvY2lhdGlvbnMucHVzaCh7aWRlbnRpZmllcjogYXNzb2MuaWRlbnRpZmllcn0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUhpZXJhcmNoeUFzc29jaWNhdGlvbih1cGRhdGVPbGRQYXJlbnRBc3NvY2lhdGlvbiwgZnJhbXdvcmtEYXRhLmlkZW50aWZpZXIsIGN1cnJlbnRQYXJlbnRUZXJtKVxuICAgICAgfVxuICAgICAgc2VsZWN0ZWRQYXJlbnQgPSBwYXJlbnRDYXRlZ29yeURhdGEudGVybXMuZmluZCgodGVybTogYW55KSA9PiB0ZXJtLmNvZGUgPT09IHNlbGVjdGVkUGFyZW50LmNvZGUpO1xuICAgICAgY29uc3QgdXBkYXRlTmV3UGFyZW50QXNzb2NpYXRpb246YW55ID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgYXNzb2NpYXRpb25zOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGVkUGFyZW50ICYmIHNlbGVjdGVkUGFyZW50LmFzc29jaWF0aW9ucyAmJiBzZWxlY3RlZFBhcmVudC5hc3NvY2lhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBzZWxlY3RlZFBhcmVudC5hc3NvY2lhdGlvbnMuZm9yRWFjaCgoYXNzb2M6IGFueSkgPT4ge1xuICAgICAgICAgIHVwZGF0ZU5ld1BhcmVudEFzc29jaWF0aW9uLnJlcXVlc3QudGVybS5hc3NvY2lhdGlvbnMucHVzaCh7aWRlbnRpZmllcjogYXNzb2MuaWRlbnRpZmllcn0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB1cGRhdGVOZXdQYXJlbnRBc3NvY2lhdGlvbi5yZXF1ZXN0LnRlcm0uYXNzb2NpYXRpb25zLnB1c2goe2lkZW50aWZpZXI6IGN1cnJlbnRUZXJtLmlkZW50aWZpZXJ9KTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlSGllcmFyY2h5QXNzb2NpY2F0aW9uKHVwZGF0ZU5ld1BhcmVudEFzc29jaWF0aW9uLCBmcmFtd29ya0RhdGEuaWRlbnRpZmllciwgc2VsZWN0ZWRQYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUhpZXJhcmNoeUFzc29jaWNhdGlvbihyZXF1ZXN0Qm9keTogYW55LCBmcmFtZXdvcmtJZDogYW55LCB0ZXJtRGF0YTogYW55KSB7XG4gICAgdGhpcy50cmVlSGllcmFyY2h5U3ZjLnNldExvYWRlclN0YXRlKHRydWUpO1xuICAgIGF3YWl0IHRoaXMudHJlZUhpZXJhcmNoeVN2Yy51cGRhdGVGcmFtZXdvcmtBc3NvY2lhdGlvbihyZXF1ZXN0Qm9keSwgeyBpZDogZnJhbWV3b3JrSWQsIGNhdGVnb3J5OiB0ZXJtRGF0YS5jYXRlZ29yeSB9LCB0ZXJtRGF0YS5jb2RlKS50b1Byb21pc2UoKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHVwZGF0aW5nIGFzc29jaWF0aW9uJywgZXJyKTtcbiAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZShmYWxzZSk7XG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBFcnJvciBpbiB1cGRhdGluZyBhc3NvY2lhdGlvbmAsICdjYW5jZWwnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNoZWNrQ2hpbGRPcmcoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNoaWxkT3JnRGF0YT8ucm9vdE9yZ0lkKSA/IHRydWUgOiBmYWxzZVxuICB9XG59IiwiPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LTEgY29ubmVjdGlvblNldHRpbmdzXCI+XG4gICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIChjbGljayk9XCJuZXdDb25uZWN0aW9uKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnt7YXBwX3N0cmluZ3MuYnVpbGR9fTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG48L2Rpdj4gLS0+XG5cbjxkaXYgKm5nSWY9XCJsaXN0ICYmIGxpc3QubGVuZ3RoID4gMFwiIGNsYXNzPVwiZmxleCBoZWlnaHRGaXggb3ZlcmZsb3ctY29udGFpbmVyXCIgaWQ9XCJ0cmVlVmlld0NvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBsaXN0OyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sIGNvbC1jb250YWluZXIgY29udGFpbmVyc3t7bGlzdC5sZW5ndGh9fVwiIGlkPVwiYm94e3tpKzF9fUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRpbmctc3RpY2t5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRpbmctY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NhdGVnb3J5LWhlYWRlcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyLWl0ZW1zIHctZnVsbCBmbGV4IHBhZGRpbmctcmVtb3ZlXCIgaWQ9XCJib3h7e2l9fUhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBnYXAtMSBtYXQtYm9keS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4/LmNvbmZpZz8uaWNvbkVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uY29uZmlnLmNvbG9yfVwiPnt7Y29sdW1uLmNvbmZpZy5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e2NvbHVtbi5uYW1lfX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29sdW1uPy5jb25maWc/LmNhdGVnb3J5RGlzcGxheU5hbWUgfHwgY29sdW1uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgIT0gMCAmJiBjYXRlZ29yeUxpc3Q/Lmxlbmd0aCA+IDA7IGVsc2UgZmlyc3RDb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uaW5kZXggIT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50XCI+KHt7Z2V0Q291bnQoY29sdW1uLmNvZGUpfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uPy5jb25maWc/LmxldmVsTmFtZUVkaXQgJiYgIWNoZWNrQ2hpbGRPcmcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZWRpdC1idG4gZmxleFwiIChjbGljayk9XCJlZGl0Q2F0ZWdvcnlOYW1lKGNvbHVtbiwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmaXJzdENvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpID09IDBcIiBpZD1cImJveHt7aSsxfX1jb3VudFwiIGNsYXNzPVwiY291bnRcIj4oe3tjb2x1bW4uY2hpbGRyZW4ubGVuZ3RofX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBjbGFzcz1cIlwiICpuZ0lmPVwiY29sdW1uPy5jb25maWc/LmNyZWF0ZUJ0bkVuYWJsZWQgJiYgIWNvbHVtbj8uY29uZmlnPy5hZGRPcmdFbmFibGVkICYmICFjaGVja0NoaWxkT3JnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYWRkLWJ0biBtYXJnaW4tbGVmdC1hdXRvXCIgW25nQ2xhc3NdPVwieydidXR0b24tZW5hYmxlZCc6IGNvbmZpZ0NvZGVCdG49PSBjb2x1bW4/LmNvZGUsICdidXR0b24tZGlzYWJsZWQnOiBjb25maWdDb2RlQnRuIT09IGNvbHVtbj8uY29kZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DcmVhdGVUZXJtRGlhbG9nKGNvbHVtbiwgaSlcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXJnaW4tcmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBfc3RyaW5ncy5hZGR9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29uZmlnPy5hZGRPcmdFbmFibGVkICYmICFjb2x1bW4/LmNvbmZpZz8uY3JlYXRlQnRuRW5hYmxlZCAmJiAhY2hlY2tDaGlsZE9yZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cImFkZC1idG4gbWFyZ2luLWxlZnQtYXV0b1wiIChjbGljayk9XCJvcGVuT3JnYW5pemF0aW9uRGlhbG9nKGNvbHVtbiwgaSwgJ2FkZCcpXCIgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2J1dHRvbi1lbmFibGVkJzogaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGkpLCAnYnV0dG9uLWRpc2FibGVkJzogIWlzQ3VycmVudE9yTmV4dFRlcm0oY29sdW1uLCBpKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFkZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hcmdpbi1yZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmFkZH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3dcIiBpZD1cImJveHt7aSsxfX1jb3VudFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBQdXQgc2VhcmNoIGJ1dHRvbiBoZXJlIGluIGZ1dHVyZVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWRkaW5nLXgyIGNhdC1jb2x1bW5zIGNvbnRhaW5lci1ib3hcIiBpZD1cImJveHt7aSsxfX1cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uPy5jaGlsZHJlbiAmJiBjb2x1bW4/LmNoaWxkcmVuLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi10cmVlLWNvbHVtbi12aWV3ICpuZ0lmPVwibG9hZGVkW2NvbHVtbi5jb2RlXVwiICNzZWxlY3RlZFRheG9ub215VGVybSBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250YWluZXJJZF09XCInYm94JysoaSsxKVwiIFtpc0NoaWxkT3JnXT1cImNoZWNrQ2hpbGRPcmcoKVwiICh1cGRhdGVUYXhvbm9teVRlcm0pPVwidXBkYXRlVGF4b25vbXlUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAodXBkYXRlVGVybUxpc3QpPVwidXBkYXRlRHJhZnRTdGF0dXNUZXJtcygkZXZlbnQpXCIgKGNhcmRzQ291bnQpPVwiZ2V0Tm9PZkNhcmRzKCRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgKHJldGlyZVRlcm1EYXRhKT1cInJlbW92ZUNvbm5lY3Rpb24oJGV2ZW50KVwiIChjYXJkQWN0aW9uKT1cImNhcmRBY3Rpb25FbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2xpYi10cmVlLWNvbHVtbi12aWV3PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93U3ZnQm9yZGVyV3JhcHBlcihjb2x1bW4sIGkpICYmICFjaGVja0NoaWxkT3JnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN2Zy1ib3JkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMxQjIxMzM1MlwiIHN0cm9rZS13aWR0aD1cIjJcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiMjAsIDEwXCIgcng9XCIxMFwiIHJ5PVwiMTBcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IGZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZnJhYy1uby1jb25uZWN0aW9uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0IGFuIG9yZ2FuaXphdGlvbiB0byBhZGQgb3Igc2VlIGZ1cnRoZXIgY29ubmVjdGlvbnM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiAoY2xpY2spPVwib3Blbk9yZ2FuaXphdGlvbkRpYWxvZyhjb2x1bW4sIGksICdhZGQnKVwiIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2J1dHRvbi1lbmFibGVkJzogaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGkpLCAnYnV0dG9uLWRpc2FibGVkJzogIWlzQ3VycmVudE9yTmV4dFRlcm0oY29sdW1uLCBpKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXJnaW4tcmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmFkZH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpYi1hY3Rpb24tYmFyICpuZ0lmPVwic2hvd0FjdGlvbkJhclwiIFthY3Rpb25UeXBlXT1cImlzQXBwcm92YWxWaWV3XCIgW2NvbmZpZ1R5cGVdPVwid29ya0Zsb3dTdGF0dXNcIlxuICAgICAgICAoc2VuZEFwcHJvdmFsKT1cInNlbmRGb3JBcHByb3ZhbCgpXCIgKGNsb3NlQWN0aW9uKT1cImNsb3NlQWN0aW9uQmFyKCRldmVudClcIj48L2xpYi1hY3Rpb24tYmFyPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiIShsaXN0ICYmIGxpc3QubGVuZ3RoID4gMCApICYmIGlzRnJhd29ya0xvYWRpbmdcIiBjbGFzcz1cImZsZXggaGVpZ2h0Rml4IFwiPlxuICAgIDxoMSBpMThuPnt7YXBwX3N0cmluZ3MubG9hZGluZ319PC9oMT5cbjwvZGl2PiJdfQ==