@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.32 → 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.
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs +710 -189
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
- package/index.d.ts +1052 -3
- package/index.d.ts.map +1 -0
- package/package.json +13 -15
- package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
- package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -42
- package/esm2022/lib/components/approval/approval.component.mjs +0 -20
- package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -65
- package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -45
- package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -56
- package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -75
- package/esm2022/lib/components/connector/connector.component.mjs +0 -60
- package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -84
- package/esm2022/lib/components/create-term/create-term.component.mjs +0 -848
- package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -825
- package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -224
- package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -65
- package/esm2022/lib/components/term-card/term-card.component.mjs +0 -343
- package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -357
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -862
- package/esm2022/lib/constants/app-constant.mjs +0 -40
- package/esm2022/lib/constants/data.mjs +0 -6972
- package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -93
- package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -15
- package/esm2022/lib/labels/strings.mjs +0 -40
- package/esm2022/lib/models/approval.model.mjs +0 -2
- package/esm2022/lib/models/connection-type.model.mjs +0 -2
- package/esm2022/lib/models/connection.model.mjs +0 -2
- package/esm2022/lib/models/framework.model.mjs +0 -2
- package/esm2022/lib/models/variable-type.model.mjs +0 -2
- package/esm2022/lib/pipes/order-by.pipe.mjs +0 -36
- package/esm2022/lib/services/approval.service.mjs +0 -48
- package/esm2022/lib/services/connection.service.mjs +0 -3
- package/esm2022/lib/services/connector.service.mjs +0 -287
- package/esm2022/lib/services/framework.service.mjs +0 -532
- package/esm2022/lib/services/local-connection.service.mjs +0 -76
- package/esm2022/lib/services/odcs.service.mjs +0 -24
- package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -44
- package/esm2022/lib/tree-hierarchy.component.mjs +0 -25
- package/esm2022/lib/tree-hierarchy.module.mjs +0 -146
- package/esm2022/lib/tree-hierarchy.service.mjs +0 -62
- package/esm2022/material.module.mjs +0 -200
- package/esm2022/public-api.mjs +0 -9
- package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
- package/lib/components/action-bar/action-bar.component.d.ts +0 -17
- package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
- package/lib/components/approval/approval.component.d.ts +0 -10
- package/lib/components/approval/approval.component.d.ts.map +0 -1
- package/lib/components/approve-view/approve-view.component.d.ts +0 -27
- package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
- package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
- package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
- package/lib/components/connector/connector.component.d.ts +0 -23
- package/lib/components/connector/connector.component.d.ts.map +0 -1
- package/lib/components/create-categories/create-categories.component.d.ts +0 -26
- package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
- package/lib/components/create-term/create-term.component.d.ts +0 -148
- package/lib/components/create-term/create-term.component.d.ts.map +0 -1
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
- package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
- package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
- package/lib/components/term-card/term-card.component.d.ts +0 -54
- package/lib/components/term-card/term-card.component.d.ts.map +0 -1
- package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -57
- package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
- package/lib/components/tree-view/tree-view.component.d.ts +0 -103
- package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
- package/lib/constants/app-constant.d.ts +0 -44
- package/lib/constants/app-constant.d.ts.map +0 -1
- package/lib/constants/data.d.ts +0 -117
- package/lib/constants/data.d.ts.map +0 -1
- package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
- package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
- package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
- package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
- package/lib/labels/strings.d.ts +0 -40
- package/lib/labels/strings.d.ts.map +0 -1
- package/lib/models/approval.model.d.ts +0 -11
- package/lib/models/approval.model.d.ts.map +0 -1
- package/lib/models/connection-type.model.d.ts +0 -6
- package/lib/models/connection-type.model.d.ts.map +0 -1
- package/lib/models/connection.model.d.ts +0 -7
- package/lib/models/connection.model.d.ts.map +0 -1
- package/lib/models/framework.model.d.ts +0 -89
- package/lib/models/framework.model.d.ts.map +0 -1
- package/lib/models/variable-type.model.d.ts +0 -46
- package/lib/models/variable-type.model.d.ts.map +0 -1
- package/lib/pipes/order-by.pipe.d.ts +0 -10
- package/lib/pipes/order-by.pipe.d.ts.map +0 -1
- package/lib/services/approval.service.d.ts +0 -21
- package/lib/services/approval.service.d.ts.map +0 -1
- package/lib/services/connection.service.d.ts +0 -4
- package/lib/services/connection.service.d.ts.map +0 -1
- package/lib/services/connector.service.d.ts +0 -18
- package/lib/services/connector.service.d.ts.map +0 -1
- package/lib/services/framework.service.d.ts +0 -89
- package/lib/services/framework.service.d.ts.map +0 -1
- package/lib/services/local-connection.service.d.ts +0 -18
- package/lib/services/local-connection.service.d.ts.map +0 -1
- package/lib/services/odcs.service.d.ts +0 -11
- package/lib/services/odcs.service.d.ts.map +0 -1
- package/lib/tree-hierarchy-routing.module.d.ts +0 -8
- package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
- package/lib/tree-hierarchy.component.d.ts +0 -13
- package/lib/tree-hierarchy.component.d.ts.map +0 -1
- package/lib/tree-hierarchy.module.d.ts +0 -33
- package/lib/tree-hierarchy.module.d.ts.map +0 -1
- package/lib/tree-hierarchy.service.d.ts +0 -22
- package/lib/tree-hierarchy.service.d.ts.map +0 -1
- package/material.module.d.ts +0 -52
- package/material.module.d.ts.map +0 -1
- package/public-api.d.ts +0 -9
- package/public-api.d.ts.map +0 -1
- package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
|
@@ -1,357 +0,0 @@
|
|
|
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
|
-
class TreeColumnViewComponent {
|
|
14
|
-
constructor(frameworkService, connectorService, approvalService) {
|
|
15
|
-
this.frameworkService = frameworkService;
|
|
16
|
-
this.connectorService = connectorService;
|
|
17
|
-
this.approvalService = approvalService;
|
|
18
|
-
this.isChildOrg = false;
|
|
19
|
-
this.connectorMapping = {};
|
|
20
|
-
this.updateTaxonomyTerm = new EventEmitter(true);
|
|
21
|
-
this.updateTermList = new EventEmitter();
|
|
22
|
-
this.cardsCount = new EventEmitter();
|
|
23
|
-
this.cardAction = new EventEmitter();
|
|
24
|
-
this.columnData = [];
|
|
25
|
-
this.termshafall = [];
|
|
26
|
-
this.searchValue = new UntypedFormControl('', [Validators.required]);
|
|
27
|
-
this.startIndex = 0;
|
|
28
|
-
this.limitToAdd = 50;
|
|
29
|
-
this.currentLastIndex = 50;
|
|
30
|
-
this.columnItems = [];
|
|
31
|
-
this.filteredColumnItems = [];
|
|
32
|
-
}
|
|
33
|
-
ngOnChanges() { }
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
this.subscribeEvents();
|
|
36
|
-
this.setColumnItems();
|
|
37
|
-
this.searchValue.valueChanges.pipe(debounceTime(700), distinctUntilChanged()).subscribe((ele) => {
|
|
38
|
-
this.searchFilterData(ele);
|
|
39
|
-
});
|
|
40
|
-
if (this.column.index === 1) {
|
|
41
|
-
this.approvalService.getUpdateList().subscribe((list) => {
|
|
42
|
-
this.approvalTerm = list.filter((item) => this.column.code === item.category);
|
|
43
|
-
if (this.approvalTerm) {
|
|
44
|
-
this.approvalTerm.forEach((term, _i) => {
|
|
45
|
-
this.column.children.forEach((lel, _j) => {
|
|
46
|
-
if (lel.identifier === term.identifier) {
|
|
47
|
-
if (!this.isExists(term)) {
|
|
48
|
-
this.termshafall.push(lel);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
this.column.children.forEach((tr, _i) => {
|
|
54
|
-
if (!this.isExists(tr)) {
|
|
55
|
-
this.termshafall.push(tr);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
this.columnData = this.transform(this.termshafall);
|
|
59
|
-
this.setColumnItems();
|
|
60
|
-
if (this.columnData && this.columnData.length) {
|
|
61
|
-
this.cardsCount.emit({ category: this.columnData[0].category || this.column.code, count: this.columnData.length });
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
this.connectorMapping = this.connectorService.connectorMap;
|
|
67
|
-
}
|
|
68
|
-
isExists(e) {
|
|
69
|
-
let temp;
|
|
70
|
-
if (this.termshafall && this.termshafall.length) {
|
|
71
|
-
temp = this.termshafall.map(t => t.identifier);
|
|
72
|
-
return temp.includes(e.identifier);
|
|
73
|
-
}
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
subscribeEvents() {
|
|
77
|
-
if (this.childSubscription) {
|
|
78
|
-
this.childSubscription.unsubscribe();
|
|
79
|
-
}
|
|
80
|
-
this.childSubscription = this.frameworkService.currentSelection.subscribe(e => {
|
|
81
|
-
if (!e) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
else if (e.type === this.column.code) {
|
|
85
|
-
const selectedTerm = { ...e.data, cardRef: e.cardRef };
|
|
86
|
-
if (e.isUpdate) {
|
|
87
|
-
this.updateTaxonomyTerm.emit({ isSelected: true, selectedTerm, isUpdate: true });
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
this.updateTaxonomyTerm.emit({ isSelected: true, selectedTerm });
|
|
91
|
-
}
|
|
92
|
-
this.columnData = this.transform((this.columnData || []).map(item => {
|
|
93
|
-
if (item.code === e.data.code) {
|
|
94
|
-
item.selected = true;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
item.selected = false;
|
|
98
|
-
}
|
|
99
|
-
return item;
|
|
100
|
-
}));
|
|
101
|
-
this.setColumnItems();
|
|
102
|
-
this.setConnectors(e.cardRef, this.columnItems, 'SINGLE');
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
const next = this.frameworkService.getNextCategory(e.type);
|
|
107
|
-
if (next && next.code === this.column.code) {
|
|
108
|
-
setTimeout(() => {
|
|
109
|
-
this.setConnectors(e.cardRef, next && next.index < this.column.index ? [] : this.columnItems, 'ALL');
|
|
110
|
-
}, 100);
|
|
111
|
-
}
|
|
112
|
-
if (next && next.index < this.column.index) {
|
|
113
|
-
this.columnData = [];
|
|
114
|
-
this.setColumnItems();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
if (this.newTermSubscription) {
|
|
119
|
-
this.newTermSubscription.unsubscribe();
|
|
120
|
-
}
|
|
121
|
-
this.newTermSubscription = this.frameworkService.insertUpdateDeleteNotifier.subscribe(e => {
|
|
122
|
-
if (e && e.action) {
|
|
123
|
-
const next = this.frameworkService.getNextCategory(e.action);
|
|
124
|
-
if (next) {
|
|
125
|
-
if (this.column.code === next.code && e.type === 'select') {
|
|
126
|
-
this.insertUpdateHandler(e, next);
|
|
127
|
-
}
|
|
128
|
-
if (e.type === 'update') {
|
|
129
|
-
if (this.column.code === next.code && e.type === 'update') {
|
|
130
|
-
const selectedParent = this.frameworkService.getPreviousCategory(e.action);
|
|
131
|
-
const selectedParentData = this.frameworkService.list.get(selectedParent.code);
|
|
132
|
-
const selectedParentCardRef = this.frameworkService.selectionList.get(selectedParent.code) &&
|
|
133
|
-
this.frameworkService.selectionList.get(selectedParent.code).cardRef;
|
|
134
|
-
if (selectedParent && selectedParentData && selectedParentData.children && selectedParentData.children.length > 0) {
|
|
135
|
-
this.frameworkService.currentSelection.next({ type: selectedParent.code, data: selectedParentData.children[0], cardRef: selectedParentCardRef, isUpdate: true });
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
insertUpdateHandler(e, _next, isUpdate) {
|
|
144
|
-
const back = this.frameworkService.getPreviousCategory(this.column.code);
|
|
145
|
-
const localTerms = [];
|
|
146
|
-
this.frameworkService.getLocalTermsByCategory(this.column.code).forEach(f => {
|
|
147
|
-
const selectedParent = back ? this.frameworkService.selectionList.get(back.code) : null;
|
|
148
|
-
if (selectedParent && ((f.parent.code === selectedParent.code) || (f.parent.identifier && (f.parent.identifier === selectedParent.identifier)))) {
|
|
149
|
-
localTerms.push(f.term);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
if (!isUpdate) {
|
|
153
|
-
if (e && e.data) {
|
|
154
|
-
this.columnData = this.transform([...localTerms, ...(e.data.children || [])])
|
|
155
|
-
.filter((x) => {
|
|
156
|
-
return x.category == this.column.code;
|
|
157
|
-
}).map((mer) => {
|
|
158
|
-
this.column.children = this.column.children.map((col) => { col.selected = false; return col; });
|
|
159
|
-
mer.selected = false;
|
|
160
|
-
mer.children = ([...this.column.children.filter((x) => { return x.code === mer.code; }).map((a) => a.children)].shift() || []);
|
|
161
|
-
return mer;
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
this.setColumnItems();
|
|
165
|
-
if (this.columnData.length > 0) {
|
|
166
|
-
this.cardsCount.emit({ category: this.columnData[0].category || '', count: this.columnData.length });
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
this.cardsCount.emit({ category: this.column.code, count: 0 });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
updateSelection1(_data) {
|
|
174
|
-
}
|
|
175
|
-
updateSelection(_selection) {
|
|
176
|
-
}
|
|
177
|
-
setColumnItems() {
|
|
178
|
-
let localSearchValue = this.searchValue.value && this.searchValue.value.toLowerCase() || '';
|
|
179
|
-
let filteredColumnData = [];
|
|
180
|
-
this.columnItems = [];
|
|
181
|
-
if (localSearchValue) {
|
|
182
|
-
filteredColumnData = this.columnData.filter((child) => {
|
|
183
|
-
if (child.name.toLowerCase().includes(localSearchValue) ||
|
|
184
|
-
(_.get(child, 'refId') && _.get(child, 'refId').toLowerCase().includes(localSearchValue)) ||
|
|
185
|
-
(_.get(child, 'description') && _.get(child, 'description').toLowerCase().includes(localSearchValue)) ||
|
|
186
|
-
(_.get(child, 'additionalProperties.displayName') && _.get(child, 'additionalProperties.displayName').toLowerCase().includes(localSearchValue))) {
|
|
187
|
-
return child;
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
filteredColumnData = this.columnData;
|
|
193
|
-
}
|
|
194
|
-
this.filteredColumnItems = filteredColumnData;
|
|
195
|
-
this.columnItems = filteredColumnData ? filteredColumnData.slice(this.startIndex, this.currentLastIndex) : [];
|
|
196
|
-
}
|
|
197
|
-
transform(value, sortBy = 'timeStamp') {
|
|
198
|
-
if (!sortBy) {
|
|
199
|
-
if (value) {
|
|
200
|
-
return value.slice().reverse();
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
return null;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
if (Array.isArray(value)) {
|
|
208
|
-
return value.sort((a, b) => {
|
|
209
|
-
const timestampA = a.additionalProperties && a.additionalProperties.timeStamp ? new Date(Number(a.additionalProperties.timeStamp)).getTime() : 0;
|
|
210
|
-
const timestampB = b.additionalProperties && b.additionalProperties.timeStamp ? new Date(Number(b.additionalProperties.timeStamp)).getTime() : 0;
|
|
211
|
-
return timestampB - timestampA;
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
searchFilterData(_ele) {
|
|
217
|
-
this.setColumnItems();
|
|
218
|
-
const back = this.frameworkService.getPreviousCategory(this.column.code);
|
|
219
|
-
if (back && back.code) {
|
|
220
|
-
let backColumData = this.frameworkService.selectionList.get(back.code);
|
|
221
|
-
if (backColumData.category) {
|
|
222
|
-
this.frameworkService.removeOldLine();
|
|
223
|
-
setTimeout(() => {
|
|
224
|
-
this.frameworkService.currentSelection.next({ type: backColumData.category, data: backColumData, cardRef: backColumData.cardRef });
|
|
225
|
-
}, 200);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
if (this.columnItems?.length === 0) {
|
|
230
|
-
this.frameworkService.removeOldLine();
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
setTimeout(() => {
|
|
234
|
-
this.makeFirstTermSelected();
|
|
235
|
-
}, 500);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
clearSearch() {
|
|
240
|
-
this.searchValue.setValue('');
|
|
241
|
-
}
|
|
242
|
-
loadMore() {
|
|
243
|
-
this.currentLastIndex = this.currentLastIndex + this.limitToAdd;
|
|
244
|
-
this.searchFilterData(this.searchValue.value);
|
|
245
|
-
}
|
|
246
|
-
setConnectors(elementClicked, columnItem, mode) {
|
|
247
|
-
this.removeConnectors(elementClicked, 'box' + (this.column.index - 1), this.column.index - 1);
|
|
248
|
-
if (mode === 'ALL') {
|
|
249
|
-
const ids = columnItem.map((_c, i) => {
|
|
250
|
-
return this.column.code + 'Card' + (i + 1);
|
|
251
|
-
});
|
|
252
|
-
this.connectorMapping['box' + (this.column.index - 1)] = { source: elementClicked, lines: (ids || []).map((id) => { return { target: id, line: '', targetType: 'id' }; }) };
|
|
253
|
-
this.connectorService.updateConnectorsMap(this.connectorMapping);
|
|
254
|
-
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);
|
|
255
|
-
this.connectorMapping['box' + (this.column.index - 1)].lines = connectionLines;
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
if (this.column.index > 1 && this.connectorMapping['box' + (this.column.index - 1)]) {
|
|
259
|
-
this.connectorMapping['box' + (this.column.index - 1)].lines = [{ target: elementClicked, line: '', targetType: 'element' }];
|
|
260
|
-
this.connectorService.updateConnectorsMap(this.connectorMapping);
|
|
261
|
-
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);
|
|
262
|
-
this.connectorMapping['box' + (this.column.index - 1)].lines = connectionLines;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
this.connectorService.updateConnectorsMap(this.connectorMapping);
|
|
266
|
-
}
|
|
267
|
-
removeConnectors(currentElement, prevCol, currentIndex) {
|
|
268
|
-
if (this.connectorMapping) {
|
|
269
|
-
for (const key in this.connectorMapping) {
|
|
270
|
-
if (this.connectorMapping[key] && this.connectorMapping[key].lines && this.connectorMapping[key].lines.length > 0) {
|
|
271
|
-
const lines = this.connectorMapping[key].lines;
|
|
272
|
-
lines.forEach(async (element, index) => {
|
|
273
|
-
if (element != currentElement && prevCol == key) {
|
|
274
|
-
await element.line && element.line.remove();
|
|
275
|
-
lines.splice(index, 1);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
this.connectorMapping[key].lines = lines;
|
|
279
|
-
}
|
|
280
|
-
let count = currentIndex + 2;
|
|
281
|
-
let nextCol = `box${count}`;
|
|
282
|
-
if (this.connectorMapping[nextCol] && this.connectorMapping[nextCol].lines && this.connectorMapping[nextCol].lines.length > 0) {
|
|
283
|
-
const lines = this.connectorMapping[nextCol].lines;
|
|
284
|
-
lines.forEach(async (element, index) => {
|
|
285
|
-
await element.line && element.line.remove();
|
|
286
|
-
lines.splice(index, 1);
|
|
287
|
-
});
|
|
288
|
-
this.connectorMapping[nextCol].lines = null;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
selectedCard(event) {
|
|
294
|
-
this.updateTermList.emit(event);
|
|
295
|
-
}
|
|
296
|
-
get showLoadMoreBtn() {
|
|
297
|
-
if (this.column && this.column.config && this.column.config.categoryDisplayName !== 'Organisation'
|
|
298
|
-
&& this.column.name !== 'Organisation' && this.columnItems && this.columnItems.length > 0) {
|
|
299
|
-
return true;
|
|
300
|
-
}
|
|
301
|
-
return false;
|
|
302
|
-
}
|
|
303
|
-
get disableLoadButton() {
|
|
304
|
-
if (this.filteredColumnItems && this.filteredColumnItems.length < this.currentLastIndex) {
|
|
305
|
-
return true;
|
|
306
|
-
}
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
ngOnDestroy() {
|
|
310
|
-
if (this.childSubscription) {
|
|
311
|
-
this.childSubscription.unsubscribe();
|
|
312
|
-
}
|
|
313
|
-
if (this.newTermSubscription) {
|
|
314
|
-
this.newTermSubscription.unsubscribe();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
cardActionEmit(event) {
|
|
318
|
-
this.cardAction.emit(event);
|
|
319
|
-
}
|
|
320
|
-
makeFirstTermSelected() {
|
|
321
|
-
const firstListItem = this.frameworkService.list.entries().next().value;
|
|
322
|
-
if (firstListItem && firstListItem.length >= 2) {
|
|
323
|
-
if (firstListItem[1] && firstListItem[1].children && firstListItem[1].children.length) {
|
|
324
|
-
const firstTerm = firstListItem[1].children[0];
|
|
325
|
-
const cardRef = document.getElementById(firstTerm.name);
|
|
326
|
-
firstTerm.selected = true;
|
|
327
|
-
this.frameworkService.cardClkData = firstTerm;
|
|
328
|
-
this.frameworkService.CurrentCardClk.next(firstTerm.category);
|
|
329
|
-
this.frameworkService.currentSelection.next({ type: firstTerm.category, data: firstTerm, cardRef });
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
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 }); }
|
|
334
|
-
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", isChildOrg: "isChildOrg", childOrg: "childOrg" }, outputs: { updateTaxonomyTerm: "updateTaxonomyTerm", updateTermList: "updateTermList", cardsCount: "cardsCount", cardAction: "cardAction" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"column?.config?.showSearch\">\n <div class=\"w-full sticky\">\n <div class=\"search mb-5\">\n <div class=\"rsearch\">\n <div class=\"sinput mat-field-rounded flex flex-middle\">\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>clear</mat-icon>\n </button>\n </div>\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 [enableThreeDots]=\"(isChildOrg && childOrg.channel === child.name) ? true : (isChildOrg) ? false : true\"\n [checkIfChildOrg]=\"isChildOrg\"\n (isSelected)=\"updateSelection1($event)\" (selectedCard)=\"selectedCard($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-term-card>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #noDataTemplate >\n <ng-container *ngIf=\"searchValue?.value\">\n <div>No Data found</div>\n </ng-container>\n</ng-template>\n\n<div class=\"w-full flex justify-center\" *ngIf=\"!disableLoadButton\">\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{width:100%;box-sizing:border-box}.search .search-icon{font-size:20px;width:20px;height:20px}.search .rsearch{display:flex;position:relative;flex:1 1 auto;border:1px solid #e0e0e0;border-radius:20px}.search .sinput{width:100%;padding:4px 8px;box-sizing:border-box}.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}.w-full.sticky{position:sticky;top:0;z-index:100;background-color:#fff}.category-heading-sticky{position:sticky;top:0;z-index:10;background-color:#fff}\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: ["enableThreeDots", "checkIfChildOrg", "data"], outputs: ["isSelected", "selectedCard", "cardAction"] }] }); }
|
|
335
|
-
}
|
|
336
|
-
export { TreeColumnViewComponent };
|
|
337
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeColumnViewComponent, decorators: [{
|
|
338
|
-
type: Component,
|
|
339
|
-
args: [{ selector: 'lib-tree-column-view', template: "<ng-container *ngIf=\"column?.config?.showSearch\">\n <div class=\"w-full sticky\">\n <div class=\"search mb-5\">\n <div class=\"rsearch\">\n <div class=\"sinput mat-field-rounded flex flex-middle\">\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>clear</mat-icon>\n </button>\n </div>\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 [enableThreeDots]=\"(isChildOrg && childOrg.channel === child.name) ? true : (isChildOrg) ? false : true\"\n [checkIfChildOrg]=\"isChildOrg\"\n (isSelected)=\"updateSelection1($event)\" (selectedCard)=\"selectedCard($event)\" (cardAction)=\"cardActionEmit($event)\">\n </lib-term-card>\n </div>\n </ng-container>\n</ng-container>\n<ng-template #noDataTemplate >\n <ng-container *ngIf=\"searchValue?.value\">\n <div>No Data found</div>\n </ng-container>\n</ng-template>\n\n<div class=\"w-full flex justify-center\" *ngIf=\"!disableLoadButton\">\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{width:100%;box-sizing:border-box}.search .search-icon{font-size:20px;width:20px;height:20px}.search .rsearch{display:flex;position:relative;flex:1 1 auto;border:1px solid #e0e0e0;border-radius:20px}.search .sinput{width:100%;padding:4px 8px;box-sizing:border-box}.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}.w-full.sticky{position:sticky;top:0;z-index:100;background-color:#fff}.category-heading-sticky{position:sticky;top:0;z-index:10;background-color:#fff}\n"] }]
|
|
340
|
-
}], ctorParameters: function () { return [{ type: i1.FrameworkService }, { type: i2.ConnectorService }, { type: i3.ApprovalService }]; }, propDecorators: { column: [{
|
|
341
|
-
type: Input
|
|
342
|
-
}], containerId: [{
|
|
343
|
-
type: Input
|
|
344
|
-
}], isChildOrg: [{
|
|
345
|
-
type: Input
|
|
346
|
-
}], childOrg: [{
|
|
347
|
-
type: Input
|
|
348
|
-
}], updateTaxonomyTerm: [{
|
|
349
|
-
type: Output
|
|
350
|
-
}], updateTermList: [{
|
|
351
|
-
type: Output
|
|
352
|
-
}], cardsCount: [{
|
|
353
|
-
type: Output
|
|
354
|
-
}], cardAction: [{
|
|
355
|
-
type: Output
|
|
356
|
-
}] } });
|
|
357
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtY29sdW1uLXZpZXcvdHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtY29sdW1uLXZpZXcvdHJlZS1jb2x1bW4tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFHcEUsTUFLYSx1QkFBdUI7SUFxQmxDLFlBQ1UsZ0JBQWtDLEVBQ2xDLGdCQUFrQyxFQUNsQyxlQUFpQztRQUZqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBckJsQyxlQUFVLEdBQUcsS0FBSyxDQUFBO1FBRTNCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQTtRQUNoQix1QkFBa0IsR0FBRyxJQUFJLFlBQVksQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDM0QsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ2pELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFB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QUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFRLENBQUE7Z0JBQ3JELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUV2RCxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTthQUNwRztTQUNGO0lBQ0gsQ0FBQzsrR0E3WlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsd1VDaEJwQyxnNURBcUNBOztTRHJCYSx1QkFBdUI7NEZBQXZCLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7b0tBS3ZCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29ubmVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Nvbm5lY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcHJvdmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcHJvdmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FyZENoZWNrZWQsIENhcmRTZWxlY3Rpb24sIENhcmRzQ291bnQsIENhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmFyaWFibGUtdHlwZS5tb2RlbCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmRlY2xhcmUgdmFyIExlYWRlckxpbmU6IGFueTtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi10cmVlLWNvbHVtbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtY29sdW1uLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVlLWNvbHVtbi12aWV3LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVHJlZUNvbHVtblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29sdW1uOiBhbnk7XG4gIEBJbnB1dCgpIGNvbnRhaW5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgaXNDaGlsZE9yZyA9IGZhbHNlXG4gIEBJbnB1dCgpIGNoaWxkT3JnOiBhbnlcbiAgY29ubmVjdG9yTWFwcGluZzogYW55ID0ge31cbiAgQE91dHB1dCgpIHVwZGF0ZVRheG9ub215VGVybSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZFNlbGVjdGlvbj4odHJ1ZSk7XG4gIEBPdXRwdXQoKSB1cGRhdGVUZXJtTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZENoZWNrZWQ+KCk7XG4gIEBPdXRwdXQoKSBjYXJkc0NvdW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDYXJkc0NvdW50PigpO1xuICBAT3V0cHV0KCkgY2FyZEFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZFNlbGVjdGlvbj4oKTtcbiAgY29sdW1uRGF0YTogQXJyYXk8Q2FyZD4gPSBbXTtcbiAgY2hpbGRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgbmV3VGVybVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBhcHByb3ZhbFRlcm06IGFueTtcbiAgdGVybXNoYWZhbGw6IEFycmF5PENhcmQ+ID0gW107XG4gIHNlYXJjaFZhbHVlID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgc3RhcnRJbmRleCA9IDBcbiAgbGltaXRUb0FkZCA9IDUwXG4gIGN1cnJlbnRMYXN0SW5kZXggPSA1MFxuICBjb2x1bW5JdGVtczogYW55ID0gW11cbiAgZmlsdGVyZWRDb2x1bW5JdGVtczogYW55ID0gW11cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29ubmVjdG9yU2VydmljZTogQ29ubmVjdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGFwcHJvdmFsU2VydmljZSA6IEFwcHJvdmFsU2VydmljZVxuICApIHtcbiAgfVxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHt9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmliZUV2ZW50cygpXG4gICAgdGhpcy5zZXRDb2x1bW5JdGVtcygpXG4gICAgdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg3MDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICApLnN1YnNjcmliZSgoZWxlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoRmlsdGVyRGF0YShlbGUpXG4gICAgfSlcbiAgICBpZiAodGhpcy5jb2x1bW4uaW5kZXggPT09IDEpIHtcbiAgICAgIHRoaXMuYXBwcm92YWxTZXJ2aWNlLmdldFVwZGF0ZUxpc3QoKS5zdWJzY3JpYmUoKGxpc3Q6YW55KSA9PiB7XG4gICAgICAgIHRoaXMuYXBwcm92YWxUZXJtID0gbGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gdGhpcy5jb2x1bW4uY29kZSA9PT0gaXRlbS5jYXRlZ29yeSlcbiAgICAgICAgaWYodGhpcy5hcHByb3ZhbFRlcm0pe1xuICAgICAgICAgIHRoaXMuYXBwcm92YWxUZXJtLmZvckVhY2goKHRlcm06IGFueSwgX2k6IG51bWJlcik9PiB7XG4gICAgICAgICAgICAgdGhpcy5jb2x1bW4uY2hpbGRyZW4uZm9yRWFjaCgobGVsOiBhbnksIF9qOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZihsZWwuaWRlbnRpZmllciA9PT0gdGVybS5pZGVudGlmaWVyKXtcbiAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzRXhpc3RzKHRlcm0pKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXJtc2hhZmFsbC5wdXNoKGxlbClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC8vIHRoaXMudGVybXNoYWZhbGwgPSBbLi4udGhpcy50ZXJtc2hhZmFsbF1cbiAgICAgICAgICB0aGlzLmNvbHVtbi5jaGlsZHJlbi5mb3JFYWNoKCh0cjogYW55LCBfaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZighdGhpcy5pc0V4aXN0cyh0cikpe1xuICAgICAgICAgICAgICB0aGlzLnRlcm1zaGFmYWxsLnB1c2godHIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmNvbHVtbkRhdGEgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnRlcm1zaGFmYWxsKTtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgICAgICAgICBpZih0aGlzLmNvbHVtbkRhdGEgJiYgdGhpcy5jb2x1bW5EYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jYXJkc0NvdW50LmVtaXQoe2NhdGVnb3J5OiB0aGlzLmNvbHVtbkRhdGFbMF0uY2F0ZWdvcnkgfHwgdGhpcy5jb2x1bW4uY29kZSxjb3VudDp0aGlzLmNvbHVtbkRhdGEubGVuZ3RofSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmcgPSB0aGlzLmNvbm5lY3RvclNlcnZpY2UuY29ubmVjdG9yTWFwXG4gICAgLy8gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmlzRGF0YVVwZGF0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAvLyAgIHRoaXMubmdPbkluaXQoKVxuICAgIC8vIH0pXG4gICAgXG4gIH1cbiBcbiAgaXNFeGlzdHMoZTphbnkpe1xuICAgIGxldCB0ZW1wO1xuICAgIGlmKHRoaXMudGVybXNoYWZhbGwgJiYgdGhpcy50ZXJtc2hhZmFsbC5sZW5ndGgpIHtcbiAgICAgIHRlbXAgPSB0aGlzLnRlcm1zaGFmYWxsLm1hcCh0ID0+IHQuaWRlbnRpZmllcilcbiAgICAgIHJldHVybiB0ZW1wLmluY2x1ZGVzKGUuaWRlbnRpZmllcilcbiAgICB9IHJldHVybiBmYWxzZVxuICB9XG4gIFxuICBzdWJzY3JpYmVFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hpbGRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLmNoaWxkU3Vic2NyaXB0aW9uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24uc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgaWYgKCFlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09IHRoaXMuY29sdW1uLmNvZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXJtID0gey4uLmUuZGF0YSwgY2FyZFJlZjogZS5jYXJkUmVmIH1cbiAgICAgICAgaWYoZS5pc1VwZGF0ZSl7XG4gICAgICAgICAgdGhpcy51cGRhdGVUYXhvbm9teVRlcm0uZW1pdCh7IGlzU2VsZWN0ZWQ6IHRydWUsIHNlbGVjdGVkVGVybSwgaXNVcGRhdGU6IHRydWUgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRheG9ub215VGVybS5lbWl0KHsgaXNTZWxlY3RlZDogdHJ1ZSwgc2VsZWN0ZWRUZXJtIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5EYXRhID0gdGhpcy50cmFuc2Zvcm0oKHRoaXMuY29sdW1uRGF0YSB8fCBbXSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmNvZGUgPT09IGUuZGF0YS5jb2RlKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnNldENvbHVtbkl0ZW1zKClcbiAgICAgICAgdGhpcy5zZXRDb25uZWN0b3JzKGUuY2FyZFJlZiwgdGhpcy5jb2x1bW5JdGVtcywgJ1NJTkdMRScpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoZS50eXBlKTtcbiAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5jb2RlID09PSB0aGlzLmNvbHVtbi5jb2RlKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldENvbm5lY3RvcnMoZS5jYXJkUmVmLCBuZXh0ICYmIG5leHQuaW5kZXggPCB0aGlzLmNvbHVtbi5pbmRleCA/IFtdIDogdGhpcy5jb2x1bW5JdGVtcywgJ0FMTCcpXG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICYmIG5leHQuaW5kZXggPCB0aGlzLmNvbHVtbi5pbmRleCkge1xuICAgICAgICAgIHRoaXMuY29sdW1uRGF0YSA9IFtdO1xuICAgICAgICAgIHRoaXMuc2V0Q29sdW1uSXRlbXMoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodGhpcy5uZXdUZXJtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuaW5zZXJ0VXBkYXRlRGVsZXRlTm90aWZpZXIuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgaWYgKGUgJiYgZS5hY3Rpb24pIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoZS5hY3Rpb24pO1xuICAgICAgICBpZihuZXh0KSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29sdW1uLmNvZGUgPT09IG5leHQuY29kZSAmJiBlLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFVwZGF0ZUhhbmRsZXIoZSwgbmV4dClcbiAgICAgICAgICB9IFxuICAgICAgICAgIGlmKGUudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuY29sdW1uLmNvZGUgPT09IG5leHQuY29kZSAmJiBlLnR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICAgIC8vIHRoaXMuY29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KGUuYWN0aW9uKVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFyZW50OiBhbnkgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShlLmFjdGlvbik7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFyZW50RGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChzZWxlY3RlZFBhcmVudC5jb2RlKVxuICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcmVudENhcmRSZWYgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQoc2VsZWN0ZWRQYXJlbnQuY29kZSkgJiYgXG4gICAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChzZWxlY3RlZFBhcmVudC5jb2RlKS5jYXJkUmVmXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZihzZWxlY3RlZFBhcmVudCAmJiBzZWxlY3RlZFBhcmVudERhdGEgJiYgc2VsZWN0ZWRQYXJlbnREYXRhLmNoaWxkcmVuICYmIHNlbGVjdGVkUGFyZW50RGF0YS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pbnNlcnRVcGRhdGVIYW5kbGVyKGUsIG5leHQsICd1cGRhdGUnKVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuY29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KGUuYWN0aW9uKVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuY29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KClcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogc2VsZWN0ZWRQYXJlbnQuY29kZSwgZGF0YTpzZWxlY3RlZFBhcmVudERhdGEuY2hpbGRyZW5bMF0sIGNhcmRSZWY6c2VsZWN0ZWRQYXJlbnRDYXJkUmVmLCBpc1VwZGF0ZTogdHJ1ZX0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGluc2VydFVwZGF0ZUhhbmRsZXIoZTogYW55LCBfbmV4dDogYW55LCBpc1VwZGF0ZT86IGFueSkge1xuICAgIGNvbnN0IGJhY2sgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmNvbHVtbi5jb2RlKVxuICAgIFxuICAgIGNvbnN0IGxvY2FsVGVybXM6YW55ID0gW11cbiAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TG9jYWxUZXJtc0J5Q2F0ZWdvcnkodGhpcy5jb2x1bW4uY29kZSkuZm9yRWFjaChmID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGFyZW50ID0gYmFjayA/IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChiYWNrLmNvZGUpIDogbnVsbDsgLy9jYW4gdXNlIGN1cnJlbnRcbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdGVkUGFyZW50ICYmICgoZi5wYXJlbnQuY29kZSA9PT0gc2VsZWN0ZWRQYXJlbnQuY29kZSkgfHwgKGYucGFyZW50LmlkZW50aWZpZXIgJiYgKGYucGFyZW50LmlkZW50aWZpZXIgPT09IHNlbGVjdGVkUGFyZW50LmlkZW50aWZpZXIpKSkpIHtcbiAgICAgICAgbG9jYWxUZXJtcy5wdXNoKGYudGVybSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmKCFpc1VwZGF0ZSkge1xuICAgIC8vIGdldCBsYXN0IHBhcmVudCBhbmQgZmlsdGVyIEFib3ZlXG4gICAgaWYoZSAmJiBlLmRhdGEpIHtcbiAgICB0aGlzLmNvbHVtbkRhdGEgPSB0aGlzLnRyYW5zZm9ybShbLi4ubG9jYWxUZXJtcywgLi4uKGUuZGF0YS5jaGlsZHJlbiB8fCBbXSldKVxuICAgICAgLmZpbHRlcigoeDphbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHguY2F0ZWdvcnkgPT0gdGhpcy5jb2x1bW4uY29kZVxuICAgICAgfSkubWFwKChtZXI6YW55KSA9PiB7XG4gICAgICAgIC8vKipyZWFkIGxvY2FsIGNoaWxkcmVuIGZvciBuZXh0ICovXG4gICAgICAgIC8vIGNvbnN0IG5leHRDaGlsZHJlbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRMb2NhbFRlcm1zQnlQYXJlbnQodGhpcy5jb2x1bW4uY29kZSlcbiAgICAgICAgXG4gICAgICAgIC8qKnJlc2V0IE5leHQgbGV2ZWwgY2hpbGRyZW4gKi9cbiAgICAgICAgdGhpcy5jb2x1bW4uY2hpbGRyZW4gPSB0aGlzLmNvbHVtbi5jaGlsZHJlbi5tYXAoKGNvbDphbnkpID0+IHsgY29sLnNlbGVjdGVkID0gZmFsc2U7IHJldHVybiBjb2wgfSlcbiAgICAgICAgbWVyLnNlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgbWVyLmNoaWxkcmVuID0gKFsuLi50aGlzLmNvbHVtbi5jaGlsZHJlbi5maWx0ZXIoKHg6YW55KSA9PiB7IHJldHVybiB4LmNvZGUgPT09IG1lci5jb2RlIH0pLm1hcCgoYTogYW55KSA9PiBhLmNoaWxkcmVuKV0uc2hpZnQoKSB8fCBbXSlcbiAgICAgICAgcmV0dXJuIG1lclxuICAgICAgfSk7XG4gICAgfVxuICAgICAgdGhpcy5zZXRDb2x1bW5JdGVtcygpXG5cbiAgICBpZih0aGlzLmNvbHVtbkRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jYXJkc0NvdW50LmVtaXQoe2NhdGVnb3J5OiB0aGlzLmNvbHVtbkRhdGFbMF0uY2F0ZWdvcnkgfHwgJycsY291bnQ6dGhpcy5jb2x1bW5EYXRhLmxlbmd0aH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcmRzQ291bnQuZW1pdCh7Y2F0ZWdvcnk6IHRoaXMuY29sdW1uLmNvZGUsY291bnQ6IDB9KTtcbiAgICB9XG4gICAgLy8gdGhpcy51cGRhdGVUZXJtcygpXG5cbiAgICB9XG4gIH1cbiAgdXBkYXRlU2VsZWN0aW9uMShfZGF0YTogYW55KSB7IFxuICB9XG4gIHVwZGF0ZVNlbGVjdGlvbihfc2VsZWN0aW9uOiBhbnkpIHtcbiAgICAvLyBpZih0aGlzLmNvbHVtbi5jb2RlPT09J21lZGl1bScpe1xuICAgIC8vIH1cbiAgICAvLyBpZiAoc2VsZWN0aW9uLmVsZW1lbnQuY2F0ZWdvcnkgPT09IHRoaXMuY29sdW1uLmNvZGUpIHtcbiAgICAvLyAgIHRoaXMudXBkYXRlVGF4b25vbXlUZXJtLmVtaXQoeyBpc1NlbGVjdGVkOiBzZWxlY3Rpb24uaXNTZWxlY3RlZCwgc2VsZWN0ZWRUZXJtOiBzZWxlY3Rpb24uZWxlbWVudCB9KVxuICAgIC8vIH1cbiAgICAvLyB0aGlzLmNvbHVtbi5jaGlsZHJlbiA9IHRoaXMuY29sdW1uLmNoaWxkcmVuLm1hcChjb2wgPT4ge1xuICAgIC8vICAgaWYgKGNvbC5jb2RlID09PSBzZWxlY3Rpb24uZWxlbWVudC5jb2RlKSB7XG4gICAgLy8gICAgIGNvbC5zZWxlY3RlZCA9IHRydWVcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGNvbC5zZWxlY3RlZCA9IGZhbHNlXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gY29sXG4gICAgLy8gfSlcbiAgfVxuXG4gIHNldENvbHVtbkl0ZW1zKCkge1xuICAgIC8vIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jb2x1bW4uY2hpbGRyZW4uZmlsdGVyKGYgPT4geyByZXR1cm4gZi5zZWxlY3RlZCB9KVxuICAgIC8vIGlmIChzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgLy8gICBjb25zdCBkYXRhID0gdGhpcy5jb2x1bW5EYXRhLm1hcChjZCA9PiB7XG4gICAgLy8gICAgIGNkLnNlbGVjdGVkID0gdGhpcy5jb2x1bW4uY2hpbGRyZW4uZmlsdGVyKGYgPT4geyByZXR1cm4gY2QuaWRlbnRpZmllciA9PT0gZi5pZGVudGlmaWVyIH0pLm1hcChzID0+IHMuc2VsZWN0ZWQpWzBdXG4gICAgLy8gICAgIHJldHVybiBjZFxuICAgIC8vICAgfSlcbiAgICAvLyAgIHJldHVybiBkYXRhXG4gICAgLy8gfSBlbHNlIHtcbiAgICBsZXQgbG9jYWxTZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWUudmFsdWUgJiYgdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZS50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgbGV0IGZpbHRlcmVkQ29sdW1uRGF0YSA9IFtdXG4gICAgdGhpcy5jb2x1bW5JdGVtcyA9IFtdXG4gICAgaWYobG9jYWxTZWFyY2hWYWx1ZSkge1xuICAgICAgZmlsdGVyZWRDb2x1bW5EYXRhID0gdGhpcy5jb2x1bW5EYXRhLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICBpZihjaGlsZC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG9jYWxTZWFyY2hWYWx1ZSkgfHwgXG4gICAgICAgIChfLmdldChjaGlsZCwgJ3JlZklkJykgJiYgXy5nZXQoY2hpbGQsICdyZWZJZCcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG9jYWxTZWFyY2hWYWx1ZSkpIHx8IFxuICAgICAgICAoXy5nZXQoY2hpbGQsICdkZXNjcmlwdGlvbicpICYmIF8uZ2V0KGNoaWxkLCAnZGVzY3JpcHRpb24nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvY2FsU2VhcmNoVmFsdWUpKXx8XG4gICAgICAgIChfLmdldChjaGlsZCwgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlOYW1lJykgJiYgXy5nZXQoY2hpbGQsICdhZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5TmFtZScpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG9jYWxTZWFyY2hWYWx1ZSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbHRlcmVkQ29sdW1uRGF0YSA9IHRoaXMuY29sdW1uRGF0YVxuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1uSXRlbXMgPSBmaWx0ZXJlZENvbHVtbkRhdGFcbiAgICB0aGlzLmNvbHVtbkl0ZW1zID0gZmlsdGVyZWRDb2x1bW5EYXRhID8gZmlsdGVyZWRDb2x1bW5EYXRhLnNsaWNlKHRoaXMuc3RhcnRJbmRleCwgdGhpcy5jdXJyZW50TGFzdEluZGV4KSA6IFtdXG4gICAgLy8gfVxuICB9XG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIHNvcnRCeSA9ICd0aW1lU3RhbXAnKTogYW55e1xuICAgIGlmKCFzb3J0QnkpIHtcbiAgICAgIGlmKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuICB2YWx1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXBBID0gYS5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiBhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCA/IG5ldyBEYXRlKE51bWJlcihhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCkpLmdldFRpbWUoKSA6IDA7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXBCID0gYi5hZGRpdGlvbmFsUHJvcGVydGllcyAmJiBiLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCA/IG5ldyBEYXRlKE51bWJlcihiLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLnRpbWVTdGFtcCkpLmdldFRpbWUoKSA6IDA7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gIHRpbWVzdGFtcEIgLSB0aW1lc3RhbXBBO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgXG4gICAgICB9XG4gICAgfVxuICAgICBcbiAgfVxuXG4gIHNlYXJjaEZpbHRlckRhdGEoX2VsZTogYW55KXtcblxuICAgIHRoaXMuc2V0Q29sdW1uSXRlbXMoKVxuICAgIGNvbnN0IGJhY2sgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmNvbHVtbi5jb2RlKVxuICAgIGlmKGJhY2sgJiYgYmFjay5jb2RlKSB7XG4gICAgICBsZXQgYmFja0NvbHVtRGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChiYWNrLmNvZGUpXG4gICAgICBpZihiYWNrQ29sdW1EYXRhLmNhdGVnb3J5KSB7XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZW1vdmVPbGRMaW5lKClcbiAgICAgIFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogYmFja0NvbHVtRGF0YS5jYXRlZ29yeSwgZGF0YTogYmFja0NvbHVtRGF0YSwgY2FyZFJlZjogYmFja0NvbHVtRGF0YS5jYXJkUmVmIH0pXG4gICAgICAgIH0sIDIwMClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYodGhpcy5jb2x1bW5JdGVtcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZW1vdmVPbGRMaW5lKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWFrZUZpcnN0VGVybVNlbGVjdGVkKClcbiAgICAgICAgfSw1MDApXG4gICAgICB9XG4gICAgfVxuICAgfVxuXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUuc2V0VmFsdWUoJycpXG4gIH1cblxuICBsb2FkTW9yZSgpIHtcbiAgICB0aGlzLmN1cnJlbnRMYXN0SW5kZXggPSB0aGlzLmN1cnJlbnRMYXN0SW5kZXggKyB0aGlzLmxpbWl0VG9BZGRcbiAgICB0aGlzLnNlYXJjaEZpbHRlckRhdGEodGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSlcbiAgfVxuXG4gIHNldENvbm5lY3RvcnMoZWxlbWVudENsaWNrZWQ6IGFueSwgY29sdW1uSXRlbTogYW55LCBtb2RlOiBhbnkpIHtcbiAgICB0aGlzLnJlbW92ZUNvbm5lY3RvcnMoZWxlbWVudENsaWNrZWQsICdib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSksIHRoaXMuY29sdW1uLmluZGV4IC0gMSlcbiAgICBcbiAgICBpZiAobW9kZSA9PT0gJ0FMTCcpIHtcbiAgICAgIC8vIGxldCB0ZW1wY29ubmVjdG9yTWFwcGluZyA9IHt9XG4gICAgICAvLyB0aGlzLmNvbm5lY3RvclNlcnZpY2UudXBkYXRlQ29ubmVjdG9yc01hcCh0ZW1wY29ubmVjdG9yTWFwcGluZylcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgWydjb2x1bW4nICsgKHRoaXMuY29sdW1uLmluZGV4LSAxKV06ICcnXG5cbiAgICAgIC8vIH1cbiAgICAgIGNvbnN0IGlkcyA9IGNvbHVtbkl0ZW0ubWFwKChfYzogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmNvZGUgKyAnQ2FyZCcgKyAoaSArIDEpXG4gICAgICB9KVxuICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldID0geyBzb3VyY2U6IGVsZW1lbnRDbGlja2VkLCBsaW5lczogKGlkcyB8fCBbXSkubWFwKChpZDogYW55KSA9PiB7IHJldHVybiB7IHRhcmdldDogaWQsIGxpbmU6ICcnLCB0YXJnZXRUeXBlOiAnaWQnIH0gfSkgfVxuICAgICAgdGhpcy5jb25uZWN0b3JTZXJ2aWNlLnVwZGF0ZUNvbm5lY3RvcnNNYXAodGhpcy5jb25uZWN0b3JNYXBwaW5nKVxuICAgICAgXG4gICAgICBjb25zdCBjb25uZWN0aW9uTGluZXMgPSB0aGlzLmNvbm5lY3RvclNlcnZpY2UuX2RyYXdMaW5lKFxuICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0uc291cmNlLFxuICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0ubGluZXMsXG4gICAgICAgIG51bGwsXG4gICAgICAgICcjYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpLFxuICAgICAgICAnI2JveCcgKyB0aGlzLmNvbHVtbi5pbmRleFxuICAgICAgKVxuICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLmxpbmVzID0gY29ubmVjdGlvbkxpbmVzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbi5pbmRleCA+IDEgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IFt7IHRhcmdldDogZWxlbWVudENsaWNrZWQsIGxpbmU6ICcnLCB0YXJnZXRUeXBlOiAnZWxlbWVudCcgfV1cblxuICAgICAgICB0aGlzLmNvbm5lY3RvclNlcnZpY2UudXBkYXRlQ29ubmVjdG9yc01hcCh0aGlzLmNvbm5lY3Rvck1hcHBpbmcpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaW5lcyA9IHRoaXMuY29ubmVjdG9yU2VydmljZS5fZHJhd0xpbmUoXG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nWydib3gnICsgKHRoaXMuY29sdW1uLmluZGV4IC0gMSldLnNvdXJjZSxcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbJ2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKV0ubGluZXMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAnI2JveCcgKyAodGhpcy5jb2x1bW4uaW5kZXggLSAxKSxcbiAgICAgICAgICAnI2JveCcgKyB0aGlzLmNvbHVtbi5pbmRleFxuICAgICAgICApXG4gICAgICAgIHRoaXMuY29ubmVjdG9yTWFwcGluZ1snYm94JyArICh0aGlzLmNvbHVtbi5pbmRleCAtIDEpXS5saW5lcyA9IGNvbm5lY3Rpb25MaW5lc1xuICAgICAgfVxuXG4gICAgfVxuICAgIHRoaXMuY29ubmVjdG9yU2VydmljZS51cGRhdGVDb25uZWN0b3JzTWFwKHRoaXMuY29ubmVjdG9yTWFwcGluZylcblxuICB9XG4gIHJlbW92ZUNvbm5lY3RvcnMoY3VycmVudEVsZW1lbnQ6IGFueSwgcHJldkNvbDogYW55LCBjdXJyZW50SW5kZXg6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rvck1hcHBpbmcpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29ubmVjdG9yTWFwcGluZykge1xuICAgICAgICAvLyBSZW1vdmUgYWxsIG4tMSBsaW5lcyBhbmQga2VlcCBvbmx5IGN1cnJlbnQgc2VsZWN0aW9uLCBhbHNvIGNsZWFyIG4rMSBsaW5lc1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0gJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXNcbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGFzeW5jIChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IGN1cnJlbnRFbGVtZW50ICYmIHByZXZDb2wgPT0ga2V5KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGVsZW1lbnQubGluZSAmJiBlbGVtZW50LmxpbmUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JNYXBwaW5nW2tleV0ubGluZXMgPSBsaW5lc1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBuKzIgbGluZXMsIGlmIGNsaWNrcyBwcmV2aW91cyBjb2x1bW5zIGFuZCB0cmVlIHdhcyBhbHJlYWR5IGRyaWxsZWQgZG93blxuICAgICAgICBsZXQgY291bnQgPSBjdXJyZW50SW5kZXggKyAyO1xuICAgICAgICBsZXQgbmV4dENvbCA9IGBib3gke2NvdW50fWBcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdG9yTWFwcGluZ1tuZXh0Q29sXSAmJiB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbbmV4dENvbF0ubGluZXMgJiYgdGhpcy5jb25uZWN0b3JNYXBwaW5nW25leHRDb2xdLmxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29ubmVjdG9yTWFwcGluZ1tuZXh0Q29sXS5saW5lc1xuICAgICAgICAgIGxpbmVzLmZvckVhY2goYXN5bmMgKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgZWxlbWVudC5saW5lICYmIGVsZW1lbnQubGluZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGxpbmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rvck1hcHBpbmdbbmV4dENvbF0ubGluZXMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH1cbiAgfVxuICBzZWxlY3RlZENhcmQoZXZlbnQ6IGFueSl7XG4gICAgdGhpcy51cGRhdGVUZXJtTGlzdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGdldCBzaG93TG9hZE1vcmVCdG4oKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5jb2x1bW4gJiYgdGhpcy5jb2x1bW4uY29uZmlnICYmIHRoaXMuY29sdW1uLmNvbmZpZy5jYXRlZ29yeURpc3BsYXlOYW1lICE9PSAnT3JnYW5pc2F0aW9uJyBcbiAgICAgICYmIHRoaXMuY29sdW1uLm5hbWUgIT09ICdPcmdhbmlzYXRpb24nICYmIHRoaXMuY29sdW1uSXRlbXMgJiYgdGhpcy5jb2x1bW5JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZGlzYWJsZUxvYWRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5maWx0ZXJlZENvbHVtbkl0ZW1zICYmIHRoaXMuZmlsdGVyZWRDb2x1bW5JdGVtcy5sZW5ndGggPCB0aGlzLmN1cnJlbnRMYXN0SW5kZXgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hpbGRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hpbGRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZih0aGlzLm5ld1Rlcm1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubmV3VGVybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgY2FyZEFjdGlvbkVtaXQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY2FyZEFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG1ha2VGaXJzdFRlcm1TZWxlY3RlZCgpIHtcbiAgICBjb25zdCBmaXJzdExpc3RJdGVtID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZW50cmllcygpLm5leHQoKS52YWx1ZSBhcyBhbnlcbiAgICBpZihmaXJzdExpc3RJdGVtICYmIGZpcnN0TGlzdEl0ZW0ubGVuZ3RoID49IDIpe1xuICAgICAgaWYoZmlyc3RMaXN0SXRlbVsxXSAmJiBmaXJzdExpc3RJdGVtWzFdLmNoaWxkcmVuICYmIGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VGVybSA9IGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW5bMF0gYXMgYW55XG4gICAgICAgIGNvbnN0IGNhcmRSZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaXJzdFRlcm0ubmFtZSlcbiAgICAgICAgLy8gdGhpcy5jYXRlZ29yeUxpc3QgPSBbXVxuICAgICAgICBmaXJzdFRlcm0uc2VsZWN0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jYXJkQ2xrRGF0YSA9IGZpcnN0VGVybTtcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLkN1cnJlbnRDYXJkQ2xrLm5leHQoZmlyc3RUZXJtLmNhdGVnb3J5KVxuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogZmlyc3RUZXJtLmNhdGVnb3J5LCBkYXRhOiBmaXJzdFRlcm0sIGNhcmRSZWYgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG59IiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY29uZmlnPy5zaG93U2VhcmNoXCI+XG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBzdGlja3lcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaCBtYi01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnNlYXJjaFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5wdXQgbWF0LWZpZWxkLXJvdW5kZWQgZmxleCBmbGV4LW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzZWFyY2gtaWNvblwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaFZhbHVlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiAjc2VhcmNoPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VhcmNoLnZhbHVlXCIgY2xhc3M9XCJjbGVhci1idG4gZmxleFwiIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkl0ZW1zICYmIGNvbHVtbkl0ZW1zLmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhVGVtcGxhdGU7XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgY29sdW1uSXRlbXM7IGxldCBqID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiAjY2FyZEVsZSBpZD1cInt7Y29sdW1uLmNvZGV9fUNhcmR7e2orMX19XCIgPlxuICAgICAgICAgICAgPGxpYi10ZXJtLWNhcmRcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJ7J2NoaWxkcmVuJzogY2hpbGQsICdzZWxlY3RlZCcgOiBmYWxzZSwgJ2NhdGVnb3J5Jzpjb2x1bW4uY29kZSwgY2FyZFN1YlR5cGU6ICdtaW5pbWFsJywgaXNWaWV3T25seTpmYWxzZSwnaW5kZXgnOmNvbHVtbi5pbmRleCwgY29sdW1uSW5mbzogY29sdW1ufVwiXG4gICAgICAgICAgICAgICAgW2VuYWJsZVRocmVlRG90c109XCIoaXNDaGlsZE9yZyAmJiBjaGlsZE9yZy5jaGFubmVsID09PSBjaGlsZC5uYW1lKSA/IHRydWUgOiAoaXNDaGlsZE9yZykgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAgICAgIFtjaGVja0lmQ2hpbGRPcmddPVwiaXNDaGlsZE9yZ1wiXG4gICAgICAgICAgICAgICAgKGlzU2VsZWN0ZWQpPVwidXBkYXRlU2VsZWN0aW9uMSgkZXZlbnQpXCIgKHNlbGVjdGVkQ2FyZCk9XCJzZWxlY3RlZENhcmQoJGV2ZW50KVwiIChjYXJkQWN0aW9uKT1cImNhcmRBY3Rpb25FbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbGliLXRlcm0tY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhVGVtcGxhdGUgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hWYWx1ZT8udmFsdWVcIj5cbiAgICA8ZGl2Pk5vIERhdGEgZm91bmQ8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIWRpc2FibGVMb2FkQnV0dG9uXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibWF0LXJhaXNlZC1idXR0b24gbWF0LWJ1dHRvbi1iYXNlIGxvYWRNb3JlXCIgW25nQ2xhc3NdPVwieydkaXNhYmxCdG4nOiBkaXNhYmxlTG9hZEJ1dHRvbn1cIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlTG9hZEJ1dHRvblwiPkxvYWQgbW9yZS4uLjwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|