@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.26

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 (118) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/components/action-bar/action-bar.component.mjs +41 -0
  3. package/esm2022/lib/components/approval/approval.component.mjs +19 -0
  4. package/esm2022/lib/components/approve-view/approve-view.component.mjs +64 -0
  5. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +44 -0
  6. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +74 -0
  7. package/esm2022/lib/components/connector/connector.component.mjs +59 -0
  8. package/esm2022/lib/components/create-categories/create-categories.component.mjs +83 -0
  9. package/esm2022/lib/components/create-term/create-term.component.mjs +847 -0
  10. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +823 -0
  11. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +149 -0
  12. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +64 -0
  13. package/esm2022/lib/components/term-card/term-card.component.mjs +311 -0
  14. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +322 -0
  15. package/esm2022/lib/components/tree-view/tree-view.component.mjs +497 -0
  16. package/esm2022/lib/constants/app-constant.mjs +40 -0
  17. package/esm2022/lib/constants/data.mjs +6972 -0
  18. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +92 -0
  19. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +14 -0
  20. package/esm2022/lib/labels/strings.mjs +40 -0
  21. package/esm2022/lib/models/approval.model.mjs +2 -0
  22. package/esm2022/lib/models/connection-type.model.mjs +2 -0
  23. package/esm2022/lib/models/connection.model.mjs +2 -0
  24. package/esm2022/lib/models/framework.model.mjs +2 -0
  25. package/esm2022/lib/models/variable-type.model.mjs +2 -0
  26. package/esm2022/lib/pipes/order-by.pipe.mjs +35 -0
  27. package/esm2022/lib/services/approval.service.mjs +47 -0
  28. package/esm2022/lib/services/connection.service.mjs +3 -0
  29. package/esm2022/lib/services/connector.service.mjs +240 -0
  30. package/esm2022/lib/services/framework.service.mjs +387 -0
  31. package/esm2022/lib/services/local-connection.service.mjs +75 -0
  32. package/esm2022/lib/services/odcs.service.mjs +23 -0
  33. package/esm2022/lib/tree-hierarchy-routing.module.mjs +43 -0
  34. package/esm2022/lib/tree-hierarchy.component.mjs +24 -0
  35. package/esm2022/lib/tree-hierarchy.module.mjs +138 -0
  36. package/esm2022/lib/tree-hierarchy.service.mjs +41 -0
  37. package/esm2022/material.module.mjs +199 -0
  38. package/esm2022/public-api.mjs +9 -0
  39. package/esm2022/sunbird-cb-tree-hierarchy.mjs +2 -0
  40. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +11577 -0
  41. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -0
  42. package/index.d.ts +3 -0
  43. package/lib/components/action-bar/action-bar.component.d.ts +17 -0
  44. package/lib/components/action-bar/action-bar.component.d.ts.map +1 -0
  45. package/lib/components/approval/approval.component.d.ts +10 -0
  46. package/lib/components/approval/approval.component.d.ts.map +1 -0
  47. package/lib/components/approve-view/approve-view.component.d.ts +27 -0
  48. package/lib/components/approve-view/approve-view.component.d.ts.map +1 -0
  49. package/lib/components/categories-preview/categories-preview.component.d.ts +14 -0
  50. package/lib/components/categories-preview/categories-preview.component.d.ts.map +1 -0
  51. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +20 -0
  52. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +1 -0
  53. package/lib/components/connector/connector.component.d.ts +23 -0
  54. package/lib/components/connector/connector.component.d.ts.map +1 -0
  55. package/lib/components/create-categories/create-categories.component.d.ts +26 -0
  56. package/lib/components/create-categories/create-categories.component.d.ts.map +1 -0
  57. package/lib/components/create-term/create-term.component.d.ts +148 -0
  58. package/lib/components/create-term/create-term.component.d.ts.map +1 -0
  59. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +105 -0
  60. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +1 -0
  61. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +31 -0
  62. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +1 -0
  63. package/lib/components/pending-approval/pending-approval.component.d.ts +21 -0
  64. package/lib/components/pending-approval/pending-approval.component.d.ts.map +1 -0
  65. package/lib/components/term-card/term-card.component.d.ts +43 -0
  66. package/lib/components/term-card/term-card.component.d.ts.map +1 -0
  67. package/lib/components/tree-column-view/tree-column-view.component.d.ts +52 -0
  68. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +1 -0
  69. package/lib/components/tree-view/tree-view.component.d.ts +91 -0
  70. package/lib/components/tree-view/tree-view.component.d.ts.map +1 -0
  71. package/lib/constants/app-constant.d.ts +44 -0
  72. package/lib/constants/app-constant.d.ts.map +1 -0
  73. package/lib/constants/data.d.ts +117 -0
  74. package/lib/constants/data.d.ts.map +1 -0
  75. package/lib/containers/config-framework/config-framework.component.d.ts +32 -0
  76. package/lib/containers/config-framework/config-framework.component.d.ts.map +1 -0
  77. package/lib/containers/dashboard/dashboard.component.d.ts +9 -0
  78. package/lib/containers/dashboard/dashboard.component.d.ts.map +1 -0
  79. package/lib/labels/strings.d.ts +40 -0
  80. package/lib/labels/strings.d.ts.map +1 -0
  81. package/lib/models/approval.model.d.ts +11 -0
  82. package/lib/models/approval.model.d.ts.map +1 -0
  83. package/lib/models/connection-type.model.d.ts +6 -0
  84. package/lib/models/connection-type.model.d.ts.map +1 -0
  85. package/lib/models/connection.model.d.ts +7 -0
  86. package/lib/models/connection.model.d.ts.map +1 -0
  87. package/lib/models/framework.model.d.ts +88 -0
  88. package/lib/models/framework.model.d.ts.map +1 -0
  89. package/lib/models/variable-type.model.d.ts +46 -0
  90. package/lib/models/variable-type.model.d.ts.map +1 -0
  91. package/lib/pipes/order-by.pipe.d.ts +10 -0
  92. package/lib/pipes/order-by.pipe.d.ts.map +1 -0
  93. package/lib/services/approval.service.d.ts +21 -0
  94. package/lib/services/approval.service.d.ts.map +1 -0
  95. package/lib/services/connection.service.d.ts +4 -0
  96. package/lib/services/connection.service.d.ts.map +1 -0
  97. package/lib/services/connector.service.d.ts +17 -0
  98. package/lib/services/connector.service.d.ts.map +1 -0
  99. package/lib/services/framework.service.d.ts +82 -0
  100. package/lib/services/framework.service.d.ts.map +1 -0
  101. package/lib/services/local-connection.service.d.ts +18 -0
  102. package/lib/services/local-connection.service.d.ts.map +1 -0
  103. package/lib/services/odcs.service.d.ts +11 -0
  104. package/lib/services/odcs.service.d.ts.map +1 -0
  105. package/lib/tree-hierarchy-routing.module.d.ts +8 -0
  106. package/lib/tree-hierarchy-routing.module.d.ts.map +1 -0
  107. package/lib/tree-hierarchy.component.d.ts +13 -0
  108. package/lib/tree-hierarchy.component.d.ts.map +1 -0
  109. package/lib/tree-hierarchy.module.d.ts +31 -0
  110. package/lib/tree-hierarchy.module.d.ts.map +1 -0
  111. package/lib/tree-hierarchy.service.d.ts +17 -0
  112. package/lib/tree-hierarchy.service.d.ts.map +1 -0
  113. package/material.module.d.ts +52 -0
  114. package/material.module.d.ts.map +1 -0
  115. package/package.json +43 -0
  116. package/public-api.d.ts +9 -0
  117. package/public-api.d.ts.map +1 -0
  118. package/sunbird-cb-tree-hierarchy.d.ts.map +1 -0
@@ -0,0 +1,322 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as _ from 'lodash';
3
+ import { UntypedFormControl, Validators } from '@angular/forms';
4
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/framework.service";
7
+ import * as i2 from "../../services/connector.service";
8
+ import * as i3 from "../../services/approval.service";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/material/icon";
11
+ import * as i6 from "@angular/forms";
12
+ import * as i7 from "../term-card/term-card.component";
13
+ export class TreeColumnViewComponent {
14
+ constructor(frameworkService, connectorService, approvalService) {
15
+ this.frameworkService = frameworkService;
16
+ this.connectorService = connectorService;
17
+ this.approvalService = approvalService;
18
+ this.connectorMapping = {};
19
+ this.updateTaxonomyTerm = new EventEmitter(true);
20
+ this.updateTermList = new EventEmitter();
21
+ this.cardsCount = new EventEmitter();
22
+ this.columnData = [];
23
+ this.termshafall = [];
24
+ this.searchValue = new UntypedFormControl('', [Validators.required]);
25
+ this.startIndex = 0;
26
+ this.limitToAdd = 50;
27
+ this.currentLastIndex = 50;
28
+ this.columnItems = [];
29
+ this.filteredColumnItems = [];
30
+ }
31
+ ngOnChanges() { }
32
+ ngOnInit() {
33
+ this.subscribeEvents();
34
+ this.setColumnItems();
35
+ this.searchValue.valueChanges.pipe(debounceTime(700), distinctUntilChanged()).subscribe((ele) => {
36
+ this.searchFilterData(ele);
37
+ });
38
+ if (this.column.index === 1) {
39
+ this.approvalService.getUpdateList().subscribe((list) => {
40
+ this.approvalTerm = list.filter((item) => this.column.code === item.category);
41
+ if (this.approvalTerm) {
42
+ this.approvalTerm.forEach((term, _i) => {
43
+ this.column.children.forEach((lel, _j) => {
44
+ if (lel.identifier === term.identifier) {
45
+ if (!this.isExists(term)) {
46
+ this.termshafall.push(lel);
47
+ }
48
+ }
49
+ });
50
+ });
51
+ this.column.children.forEach((tr, _i) => {
52
+ if (!this.isExists(tr)) {
53
+ this.termshafall.push(tr);
54
+ }
55
+ });
56
+ this.columnData = this.transform(this.termshafall);
57
+ this.setColumnItems();
58
+ if (this.columnData && this.columnData.length) {
59
+ this.cardsCount.emit({ category: this.columnData[0].category || this.column.code, count: this.columnData.length });
60
+ }
61
+ }
62
+ });
63
+ }
64
+ this.connectorMapping = this.connectorService.connectorMap;
65
+ }
66
+ isExists(e) {
67
+ let temp;
68
+ if (this.termshafall && this.termshafall.length) {
69
+ temp = this.termshafall.map(t => t.identifier);
70
+ return temp.includes(e.identifier);
71
+ }
72
+ return false;
73
+ }
74
+ subscribeEvents() {
75
+ if (this.childSubscription) {
76
+ this.childSubscription.unsubscribe();
77
+ }
78
+ this.childSubscription = this.frameworkService.currentSelection.subscribe(e => {
79
+ if (!e) {
80
+ return;
81
+ }
82
+ else if (e.type === this.column.code) {
83
+ const selectedTerm = { ...e.data, cardRef: e.cardRef };
84
+ if (e.isUpdate) {
85
+ this.updateTaxonomyTerm.emit({ isSelected: true, selectedTerm, isUpdate: true });
86
+ }
87
+ else {
88
+ this.updateTaxonomyTerm.emit({ isSelected: true, selectedTerm });
89
+ }
90
+ this.columnData = this.transform((this.columnData || []).map(item => {
91
+ if (item.code === e.data.code) {
92
+ item.selected = true;
93
+ }
94
+ else {
95
+ item.selected = false;
96
+ }
97
+ return item;
98
+ }));
99
+ this.setColumnItems();
100
+ this.setConnectors(e.cardRef, this.columnItems, 'SINGLE');
101
+ return;
102
+ }
103
+ else {
104
+ const next = this.frameworkService.getNextCategory(e.type);
105
+ if (next && next.code === this.column.code) {
106
+ setTimeout(() => {
107
+ this.setConnectors(e.cardRef, next && next.index < this.column.index ? [] : this.columnItems, 'ALL');
108
+ }, 100);
109
+ }
110
+ if (next && next.index < this.column.index) {
111
+ this.columnData = [];
112
+ this.setColumnItems();
113
+ }
114
+ }
115
+ });
116
+ if (this.newTermSubscription) {
117
+ this.newTermSubscription.unsubscribe();
118
+ }
119
+ this.newTermSubscription = this.frameworkService.insertUpdateDeleteNotifier.subscribe(e => {
120
+ if (e && e.action) {
121
+ const next = this.frameworkService.getNextCategory(e.action);
122
+ if (next) {
123
+ if (this.column.code === next.code && e.type === 'select') {
124
+ this.insertUpdateHandler(e, next);
125
+ }
126
+ if (e.type === 'update') {
127
+ if (this.column.code === next.code && e.type === 'update') {
128
+ const selectedParent = this.frameworkService.getPreviousCategory(e.action);
129
+ const selectedParentData = this.frameworkService.list.get(selectedParent.code);
130
+ const selectedParentCardRef = this.frameworkService.selectionList.get(selectedParent.code) &&
131
+ this.frameworkService.selectionList.get(selectedParent.code).cardRef;
132
+ if (selectedParent && selectedParentData && selectedParentData.children && selectedParentData.children.length > 0) {
133
+ this.frameworkService.currentSelection.next({ type: selectedParent.code, data: selectedParentData.children[0], cardRef: selectedParentCardRef, isUpdate: true });
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ });
140
+ }
141
+ insertUpdateHandler(e, _next, isUpdate) {
142
+ const back = this.frameworkService.getPreviousCategory(this.column.code);
143
+ const localTerms = [];
144
+ this.frameworkService.getLocalTermsByCategory(this.column.code).forEach(f => {
145
+ const selectedParent = back ? this.frameworkService.selectionList.get(back.code) : null;
146
+ if (selectedParent && ((f.parent.code === selectedParent.code) || (f.parent.identifier && (f.parent.identifier === selectedParent.identifier)))) {
147
+ localTerms.push(f.term);
148
+ }
149
+ });
150
+ if (!isUpdate) {
151
+ if (e && e.data) {
152
+ this.columnData = this.transform([...localTerms, ...(e.data.children || [])])
153
+ .filter((x) => {
154
+ return x.category == this.column.code;
155
+ }).map((mer) => {
156
+ this.column.children = this.column.children.map((col) => { col.selected = false; return col; });
157
+ mer.selected = false;
158
+ mer.children = ([...this.column.children.filter((x) => { return x.code === mer.code; }).map((a) => a.children)].shift() || []);
159
+ return mer;
160
+ });
161
+ }
162
+ this.setColumnItems();
163
+ if (this.columnData.length > 0) {
164
+ this.cardsCount.emit({ category: this.columnData[0].category || '', count: this.columnData.length });
165
+ }
166
+ else {
167
+ this.cardsCount.emit({ category: this.column.code, count: 0 });
168
+ }
169
+ }
170
+ }
171
+ updateSelection1(_data) {
172
+ }
173
+ updateSelection(_selection) {
174
+ }
175
+ setColumnItems() {
176
+ let localSearchValue = this.searchValue.value && this.searchValue.value.toLowerCase() || '';
177
+ let filteredColumnData = [];
178
+ this.columnItems = [];
179
+ if (localSearchValue) {
180
+ filteredColumnData = this.columnData.filter((child) => {
181
+ if (child.name.toLowerCase().includes(localSearchValue) ||
182
+ (_.get(child, 'refId') && _.get(child, 'refId').toLowerCase().includes(localSearchValue)) ||
183
+ (_.get(child, 'description') && _.get(child, 'description').toLowerCase().includes(localSearchValue)) ||
184
+ (_.get(child, 'additionalProperties.displayName') && _.get(child, 'additionalProperties.displayName').toLowerCase().includes(localSearchValue))) {
185
+ return child;
186
+ }
187
+ });
188
+ }
189
+ else {
190
+ filteredColumnData = this.columnData;
191
+ }
192
+ this.filteredColumnItems = filteredColumnData;
193
+ this.columnItems = filteredColumnData ? filteredColumnData.slice(this.startIndex, this.currentLastIndex) : [];
194
+ }
195
+ transform(value, sortBy = 'timeStamp') {
196
+ if (!sortBy) {
197
+ if (value) {
198
+ return value.slice().reverse();
199
+ }
200
+ else {
201
+ return null;
202
+ }
203
+ }
204
+ else {
205
+ if (Array.isArray(value)) {
206
+ return value.sort((a, b) => {
207
+ const timestampA = a.additionalProperties && a.additionalProperties.timeStamp ? new Date(Number(a.additionalProperties.timeStamp)).getTime() : 0;
208
+ const timestampB = b.additionalProperties && b.additionalProperties.timeStamp ? new Date(Number(b.additionalProperties.timeStamp)).getTime() : 0;
209
+ return timestampB - timestampA;
210
+ });
211
+ }
212
+ }
213
+ }
214
+ searchFilterData(_ele) {
215
+ const back = this.frameworkService.getPreviousCategory(this.column.code);
216
+ if (back && back.code) {
217
+ let backColumData = this.frameworkService.selectionList.get(back.code);
218
+ if (backColumData.category) {
219
+ this.frameworkService.removeOldLine();
220
+ setTimeout(() => {
221
+ this.frameworkService.currentSelection.next({ type: backColumData.category, data: backColumData, cardRef: backColumData.cardRef });
222
+ }, 200);
223
+ }
224
+ }
225
+ this.setColumnItems();
226
+ }
227
+ clearSearch() {
228
+ this.searchValue.setValue('');
229
+ }
230
+ loadMore() {
231
+ this.currentLastIndex = this.currentLastIndex + this.limitToAdd;
232
+ this.searchFilterData(this.searchValue.value);
233
+ }
234
+ setConnectors(elementClicked, columnItem, mode) {
235
+ this.removeConnectors(elementClicked, 'box' + (this.column.index - 1), this.column.index - 1);
236
+ if (mode === 'ALL') {
237
+ const ids = columnItem.map((_c, i) => {
238
+ return this.column.code + 'Card' + (i + 1);
239
+ });
240
+ this.connectorMapping['box' + (this.column.index - 1)] = { source: elementClicked, lines: (ids || []).map((id) => { return { target: id, line: '', targetType: 'id' }; }) };
241
+ this.connectorService.updateConnectorsMap(this.connectorMapping);
242
+ const connectionLines = this.connectorService._drawLine(this.connectorMapping['box' + (this.column.index - 1)].source, this.connectorMapping['box' + (this.column.index - 1)].lines, null, '#box' + (this.column.index - 1), '#box' + this.column.index);
243
+ this.connectorMapping['box' + (this.column.index - 1)].lines = connectionLines;
244
+ }
245
+ else {
246
+ if (this.column.index > 1) {
247
+ this.connectorMapping['box' + (this.column.index - 1)].lines = [{ target: elementClicked, line: '', targetType: 'element' }];
248
+ this.connectorService.updateConnectorsMap(this.connectorMapping);
249
+ const connectionLines = this.connectorService._drawLine(this.connectorMapping['box' + (this.column.index - 1)].source, this.connectorMapping['box' + (this.column.index - 1)].lines, null, '#box' + (this.column.index - 1), '#box' + this.column.index);
250
+ this.connectorMapping['box' + (this.column.index - 1)].lines = connectionLines;
251
+ }
252
+ }
253
+ this.connectorService.updateConnectorsMap(this.connectorMapping);
254
+ }
255
+ removeConnectors(currentElement, prevCol, currentIndex) {
256
+ if (this.connectorMapping) {
257
+ for (const key in this.connectorMapping) {
258
+ if (this.connectorMapping[key] && this.connectorMapping[key].lines && this.connectorMapping[key].lines.length > 0) {
259
+ const lines = this.connectorMapping[key].lines;
260
+ lines.forEach(async (element, index) => {
261
+ if (element != currentElement && prevCol == key) {
262
+ await element.line && element.line.remove();
263
+ lines.splice(index, 1);
264
+ }
265
+ });
266
+ this.connectorMapping[key].lines = lines;
267
+ }
268
+ let count = currentIndex + 2;
269
+ let nextCol = `box${count}`;
270
+ if (this.connectorMapping[nextCol] && this.connectorMapping[nextCol].lines && this.connectorMapping[nextCol].lines.length > 0) {
271
+ const lines = this.connectorMapping[nextCol].lines;
272
+ lines.forEach(async (element, index) => {
273
+ await element.line && element.line.remove();
274
+ lines.splice(index, 1);
275
+ });
276
+ this.connectorMapping[nextCol].lines = null;
277
+ }
278
+ }
279
+ }
280
+ }
281
+ selectedCard(event) {
282
+ this.updateTermList.emit(event);
283
+ }
284
+ get showLoadMoreBtn() {
285
+ if (this.column && this.column.config && this.column.config.categoryDisplayName !== 'Organisation'
286
+ && this.column.name !== 'Organisation' && this.columnItems && this.columnItems.length > 0) {
287
+ return true;
288
+ }
289
+ return false;
290
+ }
291
+ get disableLoadButton() {
292
+ if (this.filteredColumnItems && this.filteredColumnItems.length < this.currentLastIndex) {
293
+ return true;
294
+ }
295
+ return false;
296
+ }
297
+ ngOnDestroy() {
298
+ if (this.childSubscription) {
299
+ this.childSubscription.unsubscribe();
300
+ }
301
+ if (this.newTermSubscription) {
302
+ this.newTermSubscription.unsubscribe();
303
+ }
304
+ }
305
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeColumnViewComponent, deps: [{ token: i1.FrameworkService }, { token: i2.ConnectorService }, { token: i3.ApprovalService }], target: i0.ɵɵFactoryTarget.Component }); }
306
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TreeColumnViewComponent, selector: "lib-tree-column-view", inputs: { column: "column", containerId: "containerId" }, outputs: { updateTaxonomyTerm: "updateTaxonomyTerm", updateTermList: "updateTermList", cardsCount: "cardsCount" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"column?.config?.showSearch\">\n <div class=\"w-full sticky\">\n <div class=\"search mb-2\">\n <div class=rsearch>\n <!-- <ng-container *ngIf=\"column?.config?.showSearch\"> -->\n <div class=\"sinput mat-field-rounded\">\n <mat-icon class=\" search-icon\">search</mat-icon>\n <input type=\"search\" [formControl]=\"searchValue\" placeholder=\"Search\" #search>\n <button *ngIf=\"search.value\" class=\"clear-btn flex\" (click)=\"clearSearch()\">\n <mat-icon class=\"\">clear</mat-icon>\n </button>\n </div>\n \n <!-- </ng-container> -->\n </div>\n </div>\n </div>\n</ng-container>\n<ng-container *ngIf=\"columnItems && columnItems.length > 0; else noDataTemplate;\">\n <ng-container *ngFor=\"let child of columnItems; let j = index\">\n <div #cardEle id=\"{{column.code}}Card{{j+1}}\" >\n <lib-term-card\n [data]=\"{'children': child, 'selected' : false, 'category':column.code, cardSubType: 'minimal', isViewOnly:false,'index':column.index, columnInfo: column}\"\n (isSelected)=\"updateSelection1($event)\" (selectedCard)=\"selectedCard($event)\">\n </lib-term-card>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #noDataTemplate>\n <!-- <div>No {{column.name}} associated</div> -->\n</ng-template>\n\n<div class=\"w-full flex justify-center\" *ngIf=\"showLoadMoreBtn\">\n <button (click)=\"loadMore()\" class=\"mat-raised-button mat-button-base loadMore\" [ngClass]=\"{'disablBtn': disableLoadButton}\"\n [disabled]=\"disableLoadButton\">Load more...</button>\n</div>\n", styles: [".flex{display:flex}.w-full{width:100%}.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:100vh;overflow:hidden}.cat-columns:hover{overflow-y:scroll}.container{overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.container::-webkit-scrollbar{width:0;height:0}#this{display:none}#this:target{display:block}.search .search-icon{position:absolute;top:12px;font-size:20px;left:10px}.search .rsearch{display:flex;position:relative;flex:1 1 auto}.search .sinput{width:100%;border-radius:20px;border:1px solid #d5d0d0;padding:8px 8px 8px 34px;margin-top:0;font: 14px Lato;font-weight:400;box-sizing:border-box;height:42px}.search .sinput input{border:0!important;outline:none!important;margin-top:2px}input[type=search]::-webkit-search-decoration:hover,input[type=search]::-webkit-search-cancel-button:hover{cursor:pointer}input[type=search]::-webkit-search-cancel-button{appearance:none}.clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;color:#888;font-size:16px;cursor:pointer;display:none}.sinput:valid~.clear-btn{display:block}.clear-btn:hover{color:#333}.sticky{position:sticky;top:0;z-index:46}.loadMore{background:#1b4ca1!important;color:#fff!important;font-family:Lato;font-size:14px;font-weight:700}.disablBtn{opacity:.6;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i7.TermCardComponent, selector: "lib-term-card", inputs: ["data"], outputs: ["isSelected", "selectedCard"] }] }); }
307
+ }
308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeColumnViewComponent, decorators: [{
309
+ type: Component,
310
+ args: [{ selector: 'lib-tree-column-view', template: "<ng-container *ngIf=\"column?.config?.showSearch\">\n <div class=\"w-full sticky\">\n <div class=\"search mb-2\">\n <div class=rsearch>\n <!-- <ng-container *ngIf=\"column?.config?.showSearch\"> -->\n <div class=\"sinput mat-field-rounded\">\n <mat-icon class=\" search-icon\">search</mat-icon>\n <input type=\"search\" [formControl]=\"searchValue\" placeholder=\"Search\" #search>\n <button *ngIf=\"search.value\" class=\"clear-btn flex\" (click)=\"clearSearch()\">\n <mat-icon class=\"\">clear</mat-icon>\n </button>\n </div>\n \n <!-- </ng-container> -->\n </div>\n </div>\n </div>\n</ng-container>\n<ng-container *ngIf=\"columnItems && columnItems.length > 0; else noDataTemplate;\">\n <ng-container *ngFor=\"let child of columnItems; let j = index\">\n <div #cardEle id=\"{{column.code}}Card{{j+1}}\" >\n <lib-term-card\n [data]=\"{'children': child, 'selected' : false, 'category':column.code, cardSubType: 'minimal', isViewOnly:false,'index':column.index, columnInfo: column}\"\n (isSelected)=\"updateSelection1($event)\" (selectedCard)=\"selectedCard($event)\">\n </lib-term-card>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #noDataTemplate>\n <!-- <div>No {{column.name}} associated</div> -->\n</ng-template>\n\n<div class=\"w-full flex justify-center\" *ngIf=\"showLoadMoreBtn\">\n <button (click)=\"loadMore()\" class=\"mat-raised-button mat-button-base loadMore\" [ngClass]=\"{'disablBtn': disableLoadButton}\"\n [disabled]=\"disableLoadButton\">Load more...</button>\n</div>\n", styles: [".flex{display:flex}.w-full{width:100%}.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:100vh;overflow:hidden}.cat-columns:hover{overflow-y:scroll}.container{overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.container::-webkit-scrollbar{width:0;height:0}#this{display:none}#this:target{display:block}.search .search-icon{position:absolute;top:12px;font-size:20px;left:10px}.search .rsearch{display:flex;position:relative;flex:1 1 auto}.search .sinput{width:100%;border-radius:20px;border:1px solid #d5d0d0;padding:8px 8px 8px 34px;margin-top:0;font: 14px Lato;font-weight:400;box-sizing:border-box;height:42px}.search .sinput input{border:0!important;outline:none!important;margin-top:2px}input[type=search]::-webkit-search-decoration:hover,input[type=search]::-webkit-search-cancel-button:hover{cursor:pointer}input[type=search]::-webkit-search-cancel-button{appearance:none}.clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;color:#888;font-size:16px;cursor:pointer;display:none}.sinput:valid~.clear-btn{display:block}.clear-btn:hover{color:#333}.sticky{position:sticky;top:0;z-index:46}.loadMore{background:#1b4ca1!important;color:#fff!important;font-family:Lato;font-size:14px;font-weight:700}.disablBtn{opacity:.6;pointer-events:none}\n"] }]
311
+ }], ctorParameters: function () { return [{ type: i1.FrameworkService }, { type: i2.ConnectorService }, { type: i3.ApprovalService }]; }, propDecorators: { column: [{
312
+ type: Input
313
+ }], containerId: [{
314
+ type: Input
315
+ }], updateTaxonomyTerm: [{
316
+ type: Output
317
+ }], updateTermList: [{
318
+ type: Output
319
+ }], cardsCount: [{
320
+ type: Output
321
+ }] } });
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtY29sdW1uLXZpZXcvdHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtY29sdW1uLXZpZXcvdHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFRcEUsTUFBTSxPQUFPLHVCQUF1QjtJQWtCbEMsWUFDVSxnQkFBa0MsRUFDbEMsZ0JBQWtDLEVBQ2xDLGVBQWlDO1FBRmpDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFsQjNDLHFCQUFnQixHQUFRLEVBQUUsQ0FBQTtRQUNoQix1QkFBa0IsR0FBRyxJQUFJLFlBQVksQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDM0QsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ2pELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3RELGVBQVUsR0FB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O1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtTQUNyQztRQUNELElBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzNCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtTQUN2QztJQUNILENBQUM7K0dBaFlVLHVCQUF1QjttR0FBdkIsdUJBQXVCLDhQQ2hCcEMsbXhEQW9DQTs7NEZEcEJhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7b0tBS3ZCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29ubmVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Nvbm5lY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcHJvdmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcHJvdmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FyZENoZWNrZWQsIENhcmRTZWxlY3Rpb24sIENhcmRzQ291bnQsIENhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmFyaWFibGUtdHlwZS5tb2RlbCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmRlY2xhcmUgdmFyIExlYWRlckxpbmU6IGFueTtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi10cmVlLWNvbHVtbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtY29sdW1uLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVlLWNvbHVtbi12aWV3LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVHJlZUNvbHVtblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29sdW1uOiBhbnk7XG4gIEBJbnB1dCgpIGNvbnRhaW5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29ubmVjdG9yTWFwcGluZzogYW55ID0ge31cbiAgQE91dHB1dCgpIHVwZGF0ZVRheG9ub215VGVybSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZFNlbGVjdGlvbj4odHJ1ZSk7XG4gIEBPdXRwdXQoKSB1cGRhdGVUZXJtTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZENoZWNrZWQ+KCk7XG4gIEBPdXRwdXQoKSBjYXJkc0NvdW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDYXJkc0NvdW50PigpO1xuICBjb2x1bW5EYXRhOiBBcnJheTxDYXJkPiA9IFtdO1xuICBjaGlsZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBuZXdUZXJtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIGFwcHJvdmFsVGVybTogYW55O1xuICB0ZXJtc2hhZmFsbDogQXJyYXk8Q2FyZD4gPSBbXTtcbiAgc2VhcmNoVmFsdWUgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICBzdGFydEluZGV4ID0gMFxuICBsaW1pdFRvQWRkID0gNTBcbiAgY3VycmVudExhc3RJbmRleCA9IDUwXG4gIGNvbHVtbkl0ZW1zOiBhbnkgPSBbXVxuICBmaWx0ZXJlZENvbHVtbkl0ZW1zOiBhbnkgPSBbXVxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZyYW1ld29ya1NlcnZpY2U6IEZyYW1ld29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25uZWN0b3JTZXJ2aWNlOiBDb25uZWN0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwcm92YWxTZXJ2aWNlIDogQXBwcm92YWxTZXJ2aWNlXG4gICkge1xuICB9XG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge31cblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKClcbiAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDcwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICkuc3Vic2NyaWJlKChlbGU6IGFueSkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hGaWx0ZXJEYXRhKGVsZSlcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29sdW1uLmluZGV4ID09PSAxKSB7XG4gICAgICB0aGlzLmFwcHJvdmFsU2VydmljZS5nZXRVcGRhdGVMaXN0KCkuc3Vic2NyaWJlKChsaXN0OmFueSkgPT4ge1xuICAgICAgICB0aGlzLmFwcHJvdmFsVGVybSA9IGxpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IHRoaXMuY29sdW1uLmNvZGUgPT09IGl0ZW0uY2F0ZWdvcnkpXG4gICAgICAgIGlmKHRoaXMuYXBwcm92YWxUZXJtKXtcbiAgICAgICAgICB0aGlzLmFwcHJvdmFsVGVybS5mb3JFYWNoKCh0ZXJtOiBhbnksIF9pOiBudW1iZXIpPT4ge1xuICAgICAgICAgICAgIHRoaXMuY29sdW1uLmNoaWxkcmVuLmZvckVhY2goKGxlbDogYW55LCBfajogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYobGVsLmlkZW50aWZpZXIgPT09IHRlcm0uaWRlbnRpZmllcil7XG4gICAgICAgICAgICAgICAgICBpZighdGhpcy5pc0V4aXN0cyh0ZXJtKSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVybXNoYWZhbGwucHVzaChsZWwpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgICAvLyB0aGlzLnRlcm1zaGFmYWxsID0gWy4uLnRoaXMudGVybXNoYWZhbGxdXG4gICAgICAgICAgdGhpcy5jb2x1bW4uY2hpbGRyZW4uZm9yRWFjaCgodHI6IGFueSwgX2k6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYoIXRoaXMuaXNFeGlzdHModHIpKXtcbiAgICAgICAgICAgICAgdGhpcy50ZXJtc2hhZmFsbC5wdXNoKHRyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5jb2x1bW5EYXRhID0gdGhpcy50cmFuc2Zvcm0odGhpcy50ZXJtc2hhZmFsbCk7XG4gICAgICAgICAgdGhpcy5zZXRDb2x1bW5JdGVtcygpXG4gICAgICAgICAgaWYodGhpcy5jb2x1bW5EYXRhICYmIHRoaXMuY29sdW1uRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FyZHNDb3VudC5lbWl0KHtjYXRlZ29yeTogdGhpcy5jb2x1bW5EYXRhWzBdLmNhdGVnb3J5IHx8IHRoaXMuY29sdW1uLmNvZGUsY291bnQ6dGhpcy5jb2x1bW5EYXRhLmxlbmd0aH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nID0gdGhpcy5jb25uZWN0b3JTZXJ2aWNlLmNvbm5lY3Rvck1hcFxuICAgIC8vIHRoaXMuZnJhbWV3b3JrU2VydmljZS5pc0RhdGFVcGRhdGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgLy8gICB0aGlzLm5nT25Jbml0KClcbiAgICAvLyB9KVxuICAgIFxuICB9XG4gXG4gIGlzRXhpc3RzKGU6YW55KXtcbiAgICBsZXQgdGVtcDtcbiAgICBpZih0aGlzLnRlcm1zaGFmYWxsICYmIHRoaXMudGVybXNoYWZhbGwubGVuZ3RoKSB7XG4gICAgICB0ZW1wID0gdGhpcy50ZXJtc2hhZmFsbC5tYXAodCA9PiB0LmlkZW50aWZpZXIpXG4gICAgICByZXR1cm4gdGVtcC5pbmNsdWRlcyhlLmlkZW50aWZpZXIpXG4gICAgfSByZXR1cm4gZmFsc2VcbiAgfVxuICBcbiAgc3Vic2NyaWJlRXZlbnRzKCkge1xuICAgIGlmICh0aGlzLmNoaWxkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNoaWxkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgdGhpcy5jaGlsZFN1YnNjcmlwdGlvbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLnN1YnNjcmliZShlID0+IHtcbiAgICAgIGlmICghZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSB0aGlzLmNvbHVtbi5jb2RlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGVybSA9IHsuLi5lLmRhdGEsIGNhcmRSZWY6IGUuY2FyZFJlZiB9XG4gICAgICAgIGlmKGUuaXNVcGRhdGUpe1xuICAgICAgICAgIHRoaXMudXBkYXRlVGF4b25vbXlUZXJtLmVtaXQoeyBpc1NlbGVjdGVkOiB0cnVlLCBzZWxlY3RlZFRlcm0sIGlzVXBkYXRlOiB0cnVlIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUYXhvbm9teVRlcm0uZW1pdCh7IGlzU2VsZWN0ZWQ6IHRydWUsIHNlbGVjdGVkVGVybSB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sdW1uRGF0YSA9IHRoaXMudHJhbnNmb3JtKCh0aGlzLmNvbHVtbkRhdGEgfHwgW10pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5jb2RlID09PSBlLmRhdGEuY29kZSkge1xuICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5JdGVtcygpXG4gICAgICAgIHRoaXMuc2V0Q29ubmVjdG9ycyhlLmNhcmRSZWYsIHRoaXMuY29sdW1uSXRlbXMsICdTSU5HTEUnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TmV4dENhdGVnb3J5KGUudHlwZSk7XG4gICAgICAgIGlmIChuZXh0ICYmIG5leHQuY29kZSA9PT0gdGhpcy5jb2x1bW4uY29kZSkge1xuICAgICAgICAgIFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0b3JzKGUuY2FyZFJlZiwgbmV4dCAmJiBuZXh0LmluZGV4IDwgdGhpcy5jb2x1bW4uaW5kZXggPyBbXSA6IHRoaXMuY29sdW1uSXRlbXMsICdBTEwnKVxuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCAmJiBuZXh0LmluZGV4IDwgdGhpcy5jb2x1bW4uaW5kZXgpIHtcbiAgICAgICAgICB0aGlzLmNvbHVtbkRhdGEgPSBbXTtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHRoaXMubmV3VGVybVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5uZXdUZXJtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgdGhpcy5uZXdUZXJtU3Vic2NyaXB0aW9uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmluc2VydFVwZGF0ZURlbGV0ZU5vdGlmaWVyLnN1YnNjcmliZShlID0+IHtcbiAgICAgIGlmIChlICYmIGUuYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TmV4dENhdGVnb3J5KGUuYWN0aW9uKTtcbiAgICAgICAgaWYobmV4dCkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbi5jb2RlID09PSBuZXh0LmNvZGUgJiYgZS50eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRVcGRhdGVIYW5kbGVyKGUsIG5leHQpXG4gICAgICAgICAgfSBcbiAgICAgICAgICBpZihlLnR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICBpZih0aGlzLmNvbHVtbi5jb2RlID09PSBuZXh0LmNvZGUgJiYgZS50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgICAvLyB0aGlzLmNvbHVtbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChlLmFjdGlvbilcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcmVudDogYW55ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkoZS5hY3Rpb24pO1xuICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcmVudERhdGEgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC5nZXQoc2VsZWN0ZWRQYXJlbnQuY29kZSlcbiAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYXJlbnRDYXJkUmVmID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHNlbGVjdGVkUGFyZW50LmNvZGUpICYmIFxuICAgICAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQoc2VsZWN0ZWRQYXJlbnQuY29kZSkuY2FyZFJlZlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRQYXJlbnQgJiYgc2VsZWN0ZWRQYXJlbnREYXRhICYmIHNlbGVjdGVkUGFyZW50RGF0YS5jaGlsZHJlbiAmJiBzZWxlY3RlZFBhcmVudERhdGEuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5zZXJ0VXBkYXRlSGFuZGxlcihlLCBuZXh0LCAndXBkYXRlJylcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbHVtbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChlLmFjdGlvbilcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbHVtbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldCgpXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IHNlbGVjdGVkUGFyZW50LmNvZGUsIGRhdGE6c2VsZWN0ZWRQYXJlbnREYXRhLmNoaWxkcmVuWzBdLCBjYXJkUmVmOnNlbGVjdGVkUGFyZW50Q2FyZFJlZiwgaXNVcGRhdGU6IHRydWV9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBpbnNlcnRVcGRhdGVIYW5kbGVyKGU6IGFueSwgX25leHQ6IGFueSwgaXNVcGRhdGU/OiBhbnkpIHtcbiAgICBjb25zdCBiYWNrID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5jb2x1bW4uY29kZSlcbiAgICBcbiAgICBjb25zdCBsb2NhbFRlcm1zOmFueSA9IFtdXG4gICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldExvY2FsVGVybXNCeUNhdGVnb3J5KHRoaXMuY29sdW1uLmNvZGUpLmZvckVhY2goZiA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBhcmVudCA9IGJhY2sgPyB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQoYmFjay5jb2RlKSA6IG51bGw7IC8vY2FuIHVzZSBjdXJyZW50XG4gICAgICBcbiAgICAgIGlmIChzZWxlY3RlZFBhcmVudCAmJiAoKGYucGFyZW50LmNvZGUgPT09IHNlbGVjdGVkUGFyZW50LmNvZGUpIHx8IChmLnBhcmVudC5pZGVudGlmaWVyICYmIChmLnBhcmVudC5pZGVudGlmaWVyID09PSBzZWxlY3RlZFBhcmVudC5pZGVudGlmaWVyKSkpKSB7XG4gICAgICAgIGxvY2FsVGVybXMucHVzaChmLnRlcm0pXG4gICAgICB9XG4gICAgfSlcbiAgICBpZighaXNVcGRhdGUpIHtcbiAgICAvLyBnZXQgbGFzdCBwYXJlbnQgYW5kIGZpbHRlciBBYm92ZVxuICAgIGlmKGUgJiYgZS5kYXRhKSB7XG4gICAgdGhpcy5jb2x1bW5EYXRhID0gdGhpcy50cmFuc2Zvcm0oWy4uLmxvY2FsVGVybXMsIC4uLihlLmRhdGEuY2hpbGRyZW4gfHwgW10pXSlcbiAgICAgIC5maWx0ZXIoKHg6YW55KSA9PiB7XG4gICAgICAgIHJldHVybiB4LmNhdGVnb3J5ID09IHRoaXMuY29sdW1uLmNvZGVcbiAgICAgIH0pLm1hcCgobWVyOmFueSkgPT4ge1xuICAgICAgICAvLyoqcmVhZCBsb2NhbCBjaGlsZHJlbiBmb3IgbmV4dCAqL1xuICAgICAgICAvLyBjb25zdCBuZXh0Q2hpbGRyZW4gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TG9jYWxUZXJtc0J5UGFyZW50KHRoaXMuY29sdW1uLmNvZGUpXG4gICAgICAgIFxuICAgICAgICAvKipyZXNldCBOZXh0IGxldmVsIGNoaWxkcmVuICovXG4gICAgICAgIHRoaXMuY29sdW1uLmNoaWxkcmVuID0gdGhpcy5jb2x1bW4uY2hpbGRyZW4ubWFwKChjb2w6YW55KSA9PiB7IGNvbC5zZWxlY3RlZCA9IGZhbHNlOyByZXR1cm4gY29sIH0pXG4gICAgICAgIG1lci5zZWxlY3RlZCA9IGZhbHNlXG4gICAgICAgIG1lci5jaGlsZHJlbiA9IChbLi4udGhpcy5jb2x1bW4uY2hpbGRyZW4uZmlsdGVyKCh4OmFueSkgPT4geyByZXR1cm4geC5jb2RlID09PSBtZXIuY29kZSB9KS5tYXAoKGE6IGFueSkgPT4gYS5jaGlsZHJlbildLnNoaWZ0KCkgfHwgW10pXG4gICAgICAgIHJldHVybiBtZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgICAgIHRoaXMuc2V0Q29sdW1uSXRlbXMoKVxuXG4gICAgaWYodGhpcy5jb2x1bW5EYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2FyZHNDb3VudC5lbWl0KHtjYXRlZ29yeTogdGhpcy5jb2x1bW5EYXRhWzBdLmNhdGVnb3J5IHx8ICcnLGNvdW50OnRoaXMuY29sdW1uRGF0YS5sZW5ndGh9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXJkc0NvdW50LmVtaXQoe2NhdGVnb3J5OiB0aGlzLmNvbHVtbi5jb2RlLGNvdW50OiAwfSk7XG4gICAgfVxuICAgIC8vIHRoaXMudXBkYXRlVGVybXMoKVxuXG4gICAgfVxuICB9XG4gIHVwZGF0ZVNlbGVjdGlvbjEoX2RhdGE6IGFueSkgeyBcbiAgfVxuICB1cGRhdGVTZWxlY3Rpb24oX3NlbGVjdGlvbjogYW55KSB7XG4gICAgLy8gaWYodGhpcy5jb2x1bW4uY29kZT09PSdtZWRpdW0nKXtcbiAgICAvLyB9XG4gICAgLy8gaWYgKHNlbGVjdGlvbi5lbGVtZW50LmNhdGVnb3J5ID09PSB0aGlzLmNvbHVtbi5jb2RlKSB7XG4gICAgLy8gICB0aGlzLnVwZGF0ZVRheG9ub215VGVybS5lbWl0KHsgaXNTZWxlY3RlZDogc2VsZWN0aW9uLmlzU2VsZWN0ZWQsIHNlbGVjdGVkVGVybTogc2VsZWN0aW9uLmVsZW1lbnQgfSlcbiAgICAvLyB9XG4gICAgLy8gdGhpcy5jb2x1bW4uY2hpbGRyZW4gPSB0aGlzLmNvbHVtbi5jaGlsZHJlbi5tYXAoY29sID0+IHtcbiAgICAvLyAgIGlmIChjb2wuY29kZSA9PT0gc2VsZWN0aW9uLmVsZW1lbnQuY29kZSkge1xuICAgIC8vICAgICBjb2wuc2VsZWN0ZWQgPSB0cnVlXG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjb2wuc2VsZWN0ZWQgPSBmYWxzZVxuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIGNvbFxuICAgIC8vIH0pXG4gIH1cblxuICBzZXRDb2x1bW5JdGVtcygpIHtcbiAgICAvLyBjb25zdCBzZWxlY3RlZCA9IHRoaXMuY29sdW1uLmNoaWxkcmVuLmZpbHRlcihmID0+IHsgcmV0dXJuIGYuc2VsZWN0ZWQgfSlcbiAgICAvLyBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgIC8vICAgY29uc3QgZGF0YSA9IHRoaXMuY29sdW1uRGF0YS5tYXAoY2QgPT4ge1xuICAgIC8vICAgICBjZC5zZWxlY3RlZCA9IHRoaXMuY29sdW1uLmNoaWxkcmVuLmZpbHRlcihmID0+IHsgcmV0dXJuIGNkLmlkZW50aWZpZXIgPT09IGYuaWRlbnRpZmllciB9KS5tYXAocyA9PiBzLnNlbGVjdGVkKVswXVxuICAgIC8vICAgICByZXR1cm4gY2RcbiAgICAvLyAgIH0pXG4gICAgLy8gICByZXR1cm4gZGF0YVxuICAgIC8vIH0gZWxzZSB7XG4gICAgbGV0IGxvY2FsU2VhcmNoVmFsdWUgPSB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlICYmIHRoaXMuc2VhcmNoVmFsdWUudmFsdWUudG9Mb3dlckNhc2UoKSB8fCAnJ1xuICAgIGxldCBmaWx0ZXJlZENvbHVtbkRhdGEgPSBbXVxuICAgIHRoaXMuY29sdW1uSXRlbXMgPSBbXVxuICAgIGlmKGxvY2FsU2VhcmNoVmFsdWUpIHtcbiAgICAgIGZpbHRlcmVkQ29sdW1uRGF0YSA9IHRoaXMuY29sdW1uRGF0YS5maWx0ZXIoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYoY2hpbGQubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvY2FsU2VhcmNoVmFsdWUpIHx8IFxuICAgICAgICAoXy5nZXQoY2hpbGQsICdyZWZJZCcpICYmIF8uZ2V0KGNoaWxkLCAncmVmSWQnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvY2FsU2VhcmNoVmFsdWUpKSB8fCBcbiAgICAgICAgKF8uZ2V0KGNoaWxkLCAnZGVzY3JpcHRpb24nKSAmJiBfLmdldChjaGlsZCwgJ2Rlc2NyaXB0aW9uJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb2NhbFNlYXJjaFZhbHVlKSl8fFxuICAgICAgICAoXy5nZXQoY2hpbGQsICdhZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5TmFtZScpICYmIF8uZ2V0KGNoaWxkLCAnYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvY2FsU2VhcmNoVmFsdWUpKSkge1xuICAgICAgICAgIHJldHVybiBjaGlsZFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJlZENvbHVtbkRhdGEgPSB0aGlzLmNvbHVtbkRhdGFcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbkl0ZW1zID0gZmlsdGVyZWRDb2x1bW5EYXRhXG4gICAgXG4gICAgdGhpcy5jb2x1bW5JdGVtcyA9IGZpbHRlcmVkQ29sdW1uRGF0YSA/IGZpbHRlcmVkQ29sdW1uRGF0YS5zbGljZSh0aGlzLnN0YXJ0SW5kZXgsIHRoaXMuY3VycmVudExhc3RJbmRleCkgOiBbXVxuICAgIC8vIH1cbiAgfVxuXG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55LCBzb3J0QnkgPSAndGltZVN0YW1wJyk6IGFueXtcbiAgICBpZighc29ydEJ5KSB7XG4gICAgICBpZih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiAgdmFsdWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wQSA9IGEuYWRkaXRpb25hbFByb3BlcnRpZXMgJiYgYS5hZGRpdGlvbmFsUHJvcGVydGllcy50aW1lU3RhbXAgPyBuZXcgRGF0ZShOdW1iZXIoYS5hZGRpdGlvbmFsUHJvcGVydGllcy50aW1lU3RhbXApKS5nZXRUaW1lKCkgOiAwO1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wQiA9IGIuYWRkaXRpb25hbFByb3BlcnRpZXMgJiYgYi5hZGRpdGlvbmFsUHJvcGVydGllcy50aW1lU3RhbXAgPyBuZXcgRGF0ZShOdW1iZXIoYi5hZGRpdGlvbmFsUHJvcGVydGllcy50aW1lU3RhbXApKS5nZXRUaW1lKCkgOiAwO1xuICAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuICB0aW1lc3RhbXBCIC0gdGltZXN0YW1wQTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgIFxuICAgICAgfVxuICAgIH1cbiAgICAgXG4gIH1cblxuICBzZWFyY2hGaWx0ZXJEYXRhKF9lbGU6IGFueSl7XG4gICAgY29uc3QgYmFjayA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuY29sdW1uLmNvZGUpXG4gICAgaWYoYmFjayAmJiBiYWNrLmNvZGUpIHtcbiAgICAgIGxldCBiYWNrQ29sdW1EYXRhID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KGJhY2suY29kZSlcbiAgICAgIGlmKGJhY2tDb2x1bURhdGEuY2F0ZWdvcnkpIHtcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnJlbW92ZU9sZExpbmUoKVxuICAgICAgXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBiYWNrQ29sdW1EYXRhLmNhdGVnb3J5LCBkYXRhOiBiYWNrQ29sdW1EYXRhLCBjYXJkUmVmOiBiYWNrQ29sdW1EYXRhLmNhcmRSZWYgfSlcbiAgICAgICAgfSwgMjAwKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgIH1cblxuICBjbGVhclNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlLnNldFZhbHVlKCcnKVxuICB9XG5cbiAgbG9hZE1vcmUoKSB7XG4gICAgdGhpcy5jdXJyZW50TGFzdEluZGV4ID0gdGhpcy5jdXJyZW50TGFzdEluZGV4ICsgdGhpcy5saW1pdFRvQWRkXG4gICAgdGhpcy5zZWFyY2hGaWx0ZXJEYXRhKHRoaXMuc2VhcmNoVmFsdWUudmFsdWUpXG4gIH1cblxuICBzZXRDb25uZWN0b3JzKGVsZW1lbnRDbGlja2VkOiBhbnksIGNvbHVtbkl0ZW06IGFueSwgbW9kZTogYW55KSB7XG4gICAgdGhpcy5yZW1vdmVDb25uZWN0b3JzKGVsZW1lbnRDbGlja2VkLCAnYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpLCB0aGlzLmNvbHVtbi5pbmRleCAtIDEpXG4gICAgXG4gICAgaWYgKG1vZGUgPT09ICdBTEwnKSB7XG4gICAgICAvLyBsZXQgdGVtcGNvbm5lY3Rvck1hcHBpbmcgPSB7fVxuICAgICAgLy8gdGhpcy5jb25uZWN0b3JTZXJ2aWNlLnVwZGF0ZUNvbm5lY3RvcnNNYXAodGVtcGNvbm5lY3Rvck1hcHBpbmcpXG4gICAgICAvLyB7XG4gICAgICAvLyAgIFsnY29sdW1uJyArICh0aGlzLmNvbHVtbi5pbmRleC0gMSldOiAnJ1xuXG4gICAgICAvLyB9XG4gICAgICBjb25zdCBpZHMgPSBjb2x1bW5JdGVtLm1hcCgoX2M6IGFueSwgaTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5jb2RlICsgJ0NhcmQnICsgKGkgKyAxKVxuICAgICAgfSlcbiAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXSA9IHsgc291cmNlOiBlbGVtZW50Q2xpY2tlZCwgbGluZXM6IChpZHMgfHwgW10pLm1hcCgoaWQ6IGFueSkgPT4geyByZXR1cm4geyB0YXJnZXQ6IGlkLCBsaW5lOiAnJywgdGFyZ2V0VHlwZTogJ2lkJyB9IH0pIH1cbiAgICAgIHRoaXMuY29ubmVjdG9yU2VydmljZS51cGRhdGVDb25uZWN0b3JzTWFwKHRoaXMuY29ubmVjdG9yTWFwcGluZylcbiAgICAgIFxuICAgICAgY29uc3QgY29ubmVjdGlvbkxpbmVzID0gdGhpcy5jb25uZWN0b3JTZXJ2aWNlLl9kcmF3TGluZShcbiAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLnNvdXJjZSxcbiAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLmxpbmVzLFxuICAgICAgICBudWxsLFxuICAgICAgICAnI2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKSxcbiAgICAgICAgJyNib3gnICsgdGhpcy5jb2x1bW4uaW5kZXhcbiAgICAgIClcbiAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IGNvbm5lY3Rpb25MaW5lc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW4uaW5kZXggPiAxKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IFt7IHRhcmdldDogZWxlbWVudENsaWNrZWQsIGxpbmU6ICcnLCB0YXJnZXRUeXBlOiAnZWxlbWVudCcgfV1cblxuICAgICAgICB0aGlzLmNvbm5lY3RvclNlcnZpY2UudXBkYXRlQ29ubmVjdG9yc01hcCh0aGlzLmNvbm5lY3Rvck1hcHBpbmcpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaW5lcyA9IHRoaXMuY29ubmVjdG9yU2VydmljZS5fZHJhd0xpbmUoXG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLnNvdXJjZSxcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0ubGluZXMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAnI2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKSxcbiAgICAgICAgICAnI2JveCcgKyB0aGlzLmNvbHVtbi5pbmRleFxuICAgICAgICApXG4gICAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IGNvbm5lY3Rpb25MaW5lc1xuICAgICAgfVxuXG4gICAgfVxuICAgIHRoaXMuY29ubmVjdG9yU2VydmljZS51cGRhdGVDb25uZWN0b3JzTWFwKHRoaXMuY29ubmVjdG9yTWFwcGluZylcblxuICB9XG4gIHJlbW92ZUNvbm5lY3RvcnMoY3VycmVudEVsZW1lbnQ6IGFueSwgcHJldkNvbDogYW55LCBjdXJyZW50SW5kZXg6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rvck1hcHBpbmcpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29ubmVjdG9yTWFwcGluZykge1xuICAgICAgICAvLyBSZW1vdmUgYWxsIG4tMSBsaW5lcyBhbmQga2VlcCBvbmx5IGN1cnJlbnQgc2VsZWN0aW9uLCBhbHNvIGNsZWFyIG4rMSBsaW5lc1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0gJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXNcbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGFzeW5jIChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IGN1cnJlbnRFbGVtZW50ICYmIHByZXZDb2wgPT0ga2V5KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGVsZW1lbnQubGluZSAmJiBlbGVtZW50LmxpbmUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMgPSBsaW5lc1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBuKzIgbGluZXMsIGlmIGNsaWNrcyBwcmV2aW91cyBjb2x1bW5zIGFuZCB0cmVlIHdhcyBhbHJlYWR5IGRyaWxsZWQgZG93blxuICAgICAgICBsZXQgY291bnQgPSBjdXJyZW50SW5kZXggKyAyO1xuICAgICAgICBsZXQgbmV4dENvbCA9IGBib3gke2NvdW50fWBcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdG9yTWFwcGluZ1tuZXh0Q29sXSAmJiB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbbmV4dENvbF0ubGluZXMgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW25leHRDb2xdLmxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29ubmVjdG9yTWFwcGluZ1tuZXh0Q29sXS5saW5lc1xuICAgICAgICAgIGxpbmVzLmZvckVhY2goYXN5bmMgKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgZWxlbWVudC5saW5lICYmIGVsZW1lbnQubGluZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbbmV4dENvbF0ubGluZXMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH1cbiAgfVxuICBzZWxlY3RlZENhcmQoZXZlbnQ6IGFueSl7XG4gICAgdGhpcy51cGRhdGVUZXJtTGlzdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGdldCBzaG93TG9hZE1vcmVCdG4oKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4uY29uZmlnICYmIHRoaXMuY29sdW1uLmNvbmZpZy5jYXRlZ29yeURpc3BsYXlOYW1lICE9PSAnT3JnYW5pc2F0aW9uJyBcbiAgICAgICYmIHRoaXMuY29sdW1uLm5hbWUgIT09ICdPcmdhbmlzYXRpb24nICYmIHRoaXMuY29sdW1uSXRlbXMgJiYgdGhpcy5jb2x1bW5JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZGlzYWJsZUxvYWRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5maWx0ZXJlZENvbHVtbkl0ZW1zICYmIHRoaXMuZmlsdGVyZWRDb2x1bW5JdGVtcy5sZW5ndGggPCB0aGlzLmN1cnJlbnRMYXN0SW5kZXgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hpbGRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hpbGRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZih0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubmV3VGVybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG4gIFxufSIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4/LmNvbmZpZz8uc2hvd1NlYXJjaFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgc3RpY2t5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2ggbWItMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1yc2VhcmNoPlxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29uZmlnPy5zaG93U2VhcmNoXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lucHV0IG1hdC1maWVsZC1yb3VuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiBzZWFyY2gtaWNvblwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaFZhbHVlXCIgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgI3NlYXJjaD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlYXJjaC52YWx1ZVwiIGNsYXNzPVwiY2xlYXItYnRuIGZsZXhcIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJcIj5jbGVhcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5JdGVtcyAmJiBjb2x1bW5JdGVtcy5sZW5ndGggPiAwOyBlbHNlIG5vRGF0YVRlbXBsYXRlO1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGNvbHVtbkl0ZW1zOyBsZXQgaiA9IGluZGV4XCI+XG4gICAgICAgIDxkaXYgI2NhcmRFbGUgaWQ9XCJ7e2NvbHVtbi5jb2RlfX1DYXJke3tqKzF9fVwiID5cbiAgICAgICAgICAgIDxsaWItdGVybS1jYXJkXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwieydjaGlsZHJlbic6IGNoaWxkLCAnc2VsZWN0ZWQnIDogZmFsc2UsICdjYXRlZ29yeSc6Y29sdW1uLmNvZGUsIGNhcmRTdWJUeXBlOiAnbWluaW1hbCcsIGlzVmlld09ubHk6ZmFsc2UsJ2luZGV4Jzpjb2x1bW4uaW5kZXgsIGNvbHVtbkluZm86IGNvbHVtbn1cIlxuICAgICAgICAgICAgICAgIChpc1NlbGVjdGVkKT1cInVwZGF0ZVNlbGVjdGlvbjEoJGV2ZW50KVwiIChzZWxlY3RlZENhcmQpPVwic2VsZWN0ZWRDYXJkKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbGliLXRlcm0tY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhVGVtcGxhdGU+XG4gICAgPCEtLSA8ZGl2Pk5vIHt7Y29sdW1uLm5hbWV9fSBhc3NvY2lhdGVkPC9kaXY+IC0tPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCJzaG93TG9hZE1vcmVCdG5cIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJtYXQtcmFpc2VkLWJ1dHRvbiBtYXQtYnV0dG9uLWJhc2UgbG9hZE1vcmVcIiBbbmdDbGFzc109XCJ7J2Rpc2FibEJ0bic6IGRpc2FibGVMb2FkQnV0dG9ufVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVMb2FkQnV0dG9uXCI+TG9hZCBtb3JlLi4uPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==