@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.
- package/README.md +24 -0
- package/esm2022/lib/components/action-bar/action-bar.component.mjs +41 -0
- package/esm2022/lib/components/approval/approval.component.mjs +19 -0
- package/esm2022/lib/components/approve-view/approve-view.component.mjs +64 -0
- package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +44 -0
- package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +74 -0
- package/esm2022/lib/components/connector/connector.component.mjs +59 -0
- package/esm2022/lib/components/create-categories/create-categories.component.mjs +83 -0
- package/esm2022/lib/components/create-term/create-term.component.mjs +847 -0
- package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +823 -0
- package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +149 -0
- package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +64 -0
- package/esm2022/lib/components/term-card/term-card.component.mjs +311 -0
- package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +322 -0
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +497 -0
- package/esm2022/lib/constants/app-constant.mjs +40 -0
- package/esm2022/lib/constants/data.mjs +6972 -0
- package/esm2022/lib/containers/config-framework/config-framework.component.mjs +92 -0
- package/esm2022/lib/containers/dashboard/dashboard.component.mjs +14 -0
- package/esm2022/lib/labels/strings.mjs +40 -0
- package/esm2022/lib/models/approval.model.mjs +2 -0
- package/esm2022/lib/models/connection-type.model.mjs +2 -0
- package/esm2022/lib/models/connection.model.mjs +2 -0
- package/esm2022/lib/models/framework.model.mjs +2 -0
- package/esm2022/lib/models/variable-type.model.mjs +2 -0
- package/esm2022/lib/pipes/order-by.pipe.mjs +35 -0
- package/esm2022/lib/services/approval.service.mjs +47 -0
- package/esm2022/lib/services/connection.service.mjs +3 -0
- package/esm2022/lib/services/connector.service.mjs +240 -0
- package/esm2022/lib/services/framework.service.mjs +387 -0
- package/esm2022/lib/services/local-connection.service.mjs +75 -0
- package/esm2022/lib/services/odcs.service.mjs +23 -0
- package/esm2022/lib/tree-hierarchy-routing.module.mjs +43 -0
- package/esm2022/lib/tree-hierarchy.component.mjs +24 -0
- package/esm2022/lib/tree-hierarchy.module.mjs +138 -0
- package/esm2022/lib/tree-hierarchy.service.mjs +41 -0
- package/esm2022/material.module.mjs +199 -0
- package/esm2022/public-api.mjs +9 -0
- package/esm2022/sunbird-cb-tree-hierarchy.mjs +2 -0
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs +11577 -0
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -0
- package/index.d.ts +3 -0
- package/lib/components/action-bar/action-bar.component.d.ts +17 -0
- package/lib/components/action-bar/action-bar.component.d.ts.map +1 -0
- package/lib/components/approval/approval.component.d.ts +10 -0
- package/lib/components/approval/approval.component.d.ts.map +1 -0
- package/lib/components/approve-view/approve-view.component.d.ts +27 -0
- package/lib/components/approve-view/approve-view.component.d.ts.map +1 -0
- package/lib/components/categories-preview/categories-preview.component.d.ts +14 -0
- package/lib/components/categories-preview/categories-preview.component.d.ts.map +1 -0
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +20 -0
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +1 -0
- package/lib/components/connector/connector.component.d.ts +23 -0
- package/lib/components/connector/connector.component.d.ts.map +1 -0
- package/lib/components/create-categories/create-categories.component.d.ts +26 -0
- package/lib/components/create-categories/create-categories.component.d.ts.map +1 -0
- package/lib/components/create-term/create-term.component.d.ts +148 -0
- package/lib/components/create-term/create-term.component.d.ts.map +1 -0
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +105 -0
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +1 -0
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +31 -0
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +1 -0
- package/lib/components/pending-approval/pending-approval.component.d.ts +21 -0
- package/lib/components/pending-approval/pending-approval.component.d.ts.map +1 -0
- package/lib/components/term-card/term-card.component.d.ts +43 -0
- package/lib/components/term-card/term-card.component.d.ts.map +1 -0
- package/lib/components/tree-column-view/tree-column-view.component.d.ts +52 -0
- package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +1 -0
- package/lib/components/tree-view/tree-view.component.d.ts +91 -0
- package/lib/components/tree-view/tree-view.component.d.ts.map +1 -0
- package/lib/constants/app-constant.d.ts +44 -0
- package/lib/constants/app-constant.d.ts.map +1 -0
- package/lib/constants/data.d.ts +117 -0
- package/lib/constants/data.d.ts.map +1 -0
- package/lib/containers/config-framework/config-framework.component.d.ts +32 -0
- package/lib/containers/config-framework/config-framework.component.d.ts.map +1 -0
- package/lib/containers/dashboard/dashboard.component.d.ts +9 -0
- package/lib/containers/dashboard/dashboard.component.d.ts.map +1 -0
- package/lib/labels/strings.d.ts +40 -0
- package/lib/labels/strings.d.ts.map +1 -0
- package/lib/models/approval.model.d.ts +11 -0
- package/lib/models/approval.model.d.ts.map +1 -0
- package/lib/models/connection-type.model.d.ts +6 -0
- package/lib/models/connection-type.model.d.ts.map +1 -0
- package/lib/models/connection.model.d.ts +7 -0
- package/lib/models/connection.model.d.ts.map +1 -0
- package/lib/models/framework.model.d.ts +88 -0
- package/lib/models/framework.model.d.ts.map +1 -0
- package/lib/models/variable-type.model.d.ts +46 -0
- package/lib/models/variable-type.model.d.ts.map +1 -0
- package/lib/pipes/order-by.pipe.d.ts +10 -0
- package/lib/pipes/order-by.pipe.d.ts.map +1 -0
- package/lib/services/approval.service.d.ts +21 -0
- package/lib/services/approval.service.d.ts.map +1 -0
- package/lib/services/connection.service.d.ts +4 -0
- package/lib/services/connection.service.d.ts.map +1 -0
- package/lib/services/connector.service.d.ts +17 -0
- package/lib/services/connector.service.d.ts.map +1 -0
- package/lib/services/framework.service.d.ts +82 -0
- package/lib/services/framework.service.d.ts.map +1 -0
- package/lib/services/local-connection.service.d.ts +18 -0
- package/lib/services/local-connection.service.d.ts.map +1 -0
- package/lib/services/odcs.service.d.ts +11 -0
- package/lib/services/odcs.service.d.ts.map +1 -0
- package/lib/tree-hierarchy-routing.module.d.ts +8 -0
- package/lib/tree-hierarchy-routing.module.d.ts.map +1 -0
- package/lib/tree-hierarchy.component.d.ts +13 -0
- package/lib/tree-hierarchy.component.d.ts.map +1 -0
- package/lib/tree-hierarchy.module.d.ts +31 -0
- package/lib/tree-hierarchy.module.d.ts.map +1 -0
- package/lib/tree-hierarchy.service.d.ts +17 -0
- package/lib/tree-hierarchy.service.d.ts.map +1 -0
- package/material.module.d.ts +52 -0
- package/material.module.d.ts.map +1 -0
- package/package.json +43 -0
- package/public-api.d.ts +9 -0
- package/public-api.d.ts.map +1 -0
- package/sunbird-cb-tree-hierarchy.d.ts.map +1 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { CreateTermComponent } from '../create-term/create-term.component';
|
|
3
|
+
import { ConnectorComponent } from '../connector/connector.component';
|
|
4
|
+
import { defaultConfig, headerLineConfig } from '../../constants/app-constant';
|
|
5
|
+
import { labels } from '../../labels/strings';
|
|
6
|
+
import { CreateTermFromFrameworkComponent } from '../create-term-from-framework/create-term-from-framework.component';
|
|
7
|
+
import { OrgHierarchyAddModalComponent } from '../org-hierarchy-add-modal/org-hierarchy-add-modal.component';
|
|
8
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../../services/framework.service";
|
|
11
|
+
import * as i2 from "../../services/local-connection.service";
|
|
12
|
+
import * as i3 from "@angular/material/legacy-dialog";
|
|
13
|
+
import * as i4 from "../../services/approval.service";
|
|
14
|
+
import * as i5 from "@angular/material/legacy-snack-bar";
|
|
15
|
+
import * as i6 from "../../services/connector.service";
|
|
16
|
+
import * as i7 from "../../tree-hierarchy.service";
|
|
17
|
+
import * as i8 from "@angular/common";
|
|
18
|
+
import * as i9 from "@angular/material/button";
|
|
19
|
+
import * as i10 from "@angular/material/icon";
|
|
20
|
+
import * as i11 from "../tree-column-view/tree-column-view.component";
|
|
21
|
+
import * as i12 from "../action-bar/action-bar.component";
|
|
22
|
+
export class TreeViewComponent {
|
|
23
|
+
constructor(frameworkService, localSvc, dialog, approvalService, _snackBar, connectorSvc, cdr, treeHierarchySvc, changeDetector) {
|
|
24
|
+
this.frameworkService = frameworkService;
|
|
25
|
+
this.localSvc = localSvc;
|
|
26
|
+
this.dialog = dialog;
|
|
27
|
+
this.approvalService = approvalService;
|
|
28
|
+
this._snackBar = _snackBar;
|
|
29
|
+
this.connectorSvc = connectorSvc;
|
|
30
|
+
this.cdr = cdr;
|
|
31
|
+
this.treeHierarchySvc = treeHierarchySvc;
|
|
32
|
+
this.changeDetector = changeDetector;
|
|
33
|
+
this.approvalList = [];
|
|
34
|
+
this.isApprovalView = false;
|
|
35
|
+
this.workFlowStatus = '';
|
|
36
|
+
this.sentForApprove = new EventEmitter();
|
|
37
|
+
this.loaderEnable = new EventEmitter();
|
|
38
|
+
this.mapping = {};
|
|
39
|
+
this.heightLighted = [];
|
|
40
|
+
this.localList = [];
|
|
41
|
+
this.showPublish = false;
|
|
42
|
+
this.newTermSubscription = undefined;
|
|
43
|
+
this.loaded = {};
|
|
44
|
+
this.showActionBar = false;
|
|
45
|
+
this.approvalRequiredTerms = [];
|
|
46
|
+
this.draftTerms = [];
|
|
47
|
+
this.isLoading = false;
|
|
48
|
+
this.categoryList = [];
|
|
49
|
+
this.app_strings = labels;
|
|
50
|
+
this.isHideBtnEna = true;
|
|
51
|
+
this.columnId = '';
|
|
52
|
+
this.isFraworkLoading = true;
|
|
53
|
+
}
|
|
54
|
+
ngOnInit() {
|
|
55
|
+
}
|
|
56
|
+
ngOnChanges() {
|
|
57
|
+
this.draftTerms = this.approvalList;
|
|
58
|
+
this.init();
|
|
59
|
+
this.showActionBar = this.isApprovalView ? true : false;
|
|
60
|
+
this.frameworkService.afterAddOrEditSubject.subscribe(responseData => {
|
|
61
|
+
if (responseData && responseData.res && responseData.data) {
|
|
62
|
+
this.refreshData(responseData);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
this.isEnableds();
|
|
66
|
+
}
|
|
67
|
+
ngAfterContentChecked() {
|
|
68
|
+
this.cdr.detectChanges();
|
|
69
|
+
}
|
|
70
|
+
init() {
|
|
71
|
+
this.initConfig();
|
|
72
|
+
this.frameworkService.getFrameworkInfo((this.orgSelectedData) ? this.orgSelectedData : '').subscribe(() => {
|
|
73
|
+
this.connectorSvc.removeAllLines();
|
|
74
|
+
this.frameworkService.categoriesHash.value.forEach((cat) => {
|
|
75
|
+
this.loaded[cat.code] = true;
|
|
76
|
+
});
|
|
77
|
+
this.isLoading = false;
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
this.makeFirstTermSelected();
|
|
80
|
+
}, 500);
|
|
81
|
+
}, (err) => {
|
|
82
|
+
console.error('error in fetching framework', err);
|
|
83
|
+
});
|
|
84
|
+
this.loaderSubscription = this.treeHierarchySvc.loaderState$.subscribe(data => {
|
|
85
|
+
this.loaderEnable.emit(data);
|
|
86
|
+
this.changeDetector.detectChanges();
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
refreshData(resData) {
|
|
90
|
+
const res = resData.res;
|
|
91
|
+
if (res && res.created) {
|
|
92
|
+
this.showPublish = true;
|
|
93
|
+
}
|
|
94
|
+
if (res.multi && Array.isArray(res.term) && res.term.length) {
|
|
95
|
+
res.term = res.term[0];
|
|
96
|
+
}
|
|
97
|
+
this.loaded[res.term.category] = false;
|
|
98
|
+
const parentColumn = this.frameworkService.getPreviousCategory(res.term.category);
|
|
99
|
+
res.parent = null;
|
|
100
|
+
if (parentColumn) {
|
|
101
|
+
res.parent = this.frameworkService.selectionList.get(parentColumn.code);
|
|
102
|
+
if (resData.type === 'update') {
|
|
103
|
+
res.parent.children[res.parent.children.findIndex((el) => el.identifier === res.term.identifier)] = res.term;
|
|
104
|
+
this.loaded[res.term.category] = true;
|
|
105
|
+
res.term.selected = false;
|
|
106
|
+
this.frameworkService.selectionList.delete(res.term.category);
|
|
107
|
+
this.frameworkService.insertUpdateDeleteNotifier.next({ action: res.term.category, type: 'update', data: res.term });
|
|
108
|
+
this.updateFinalList({ selectedTerm: res.term, isSelected: true, parentData: res.parent, colIndex: resData.index }, 'update');
|
|
109
|
+
res.term.selected = true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
if (!res.multi) {
|
|
113
|
+
res.parent.children ? res.parent.children.push(res.term) : res.parent['children'] = [res.term];
|
|
114
|
+
}
|
|
115
|
+
this.updateFinalList({ selectedTerm: res.term, isSelected: false, parentData: res.parent, colIndex: resData.index });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
makeFirstTermSelected() {
|
|
120
|
+
const firstListItem = this.frameworkService.list.entries().next().value;
|
|
121
|
+
if (firstListItem && firstListItem.length >= 2) {
|
|
122
|
+
if (firstListItem[1] && firstListItem[1].children && firstListItem[1].children.length) {
|
|
123
|
+
const firstTerm = firstListItem[1].children[0];
|
|
124
|
+
const cardRef = document.getElementById(firstTerm.name);
|
|
125
|
+
firstTerm.selected = true;
|
|
126
|
+
this.frameworkService.cardClkData = firstTerm;
|
|
127
|
+
this.frameworkService.CurrentCardClk.next(firstTerm.category);
|
|
128
|
+
this.frameworkService.currentSelection.next({ type: firstTerm.category, data: firstTerm, cardRef });
|
|
129
|
+
this.isFraworkLoading = false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
updateTaxonomyTerm(data) {
|
|
134
|
+
if (data && data.selectedTerm && data.selectedTerm.category) {
|
|
135
|
+
if (!data.isUpdate) {
|
|
136
|
+
this.updateFinalList(data);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.updateFinalList(data, 'update');
|
|
140
|
+
}
|
|
141
|
+
this.updateSelection(data.selectedTerm.category, data.selectedTerm.code);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
updateSelection(category, selectedTermCode) {
|
|
145
|
+
const categoryData = this.frameworkService.list.get(category);
|
|
146
|
+
if (categoryData && categoryData.children) {
|
|
147
|
+
categoryData.children.map(item => {
|
|
148
|
+
item.selected = selectedTermCode === item.code ? true : false;
|
|
149
|
+
return item;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
updateFinalList(data, type) {
|
|
154
|
+
if (data.isSelected) {
|
|
155
|
+
this.frameworkService.selectionList.set(data.selectedTerm.category, data.selectedTerm);
|
|
156
|
+
const next = this.frameworkService.getNextCategory(data.selectedTerm.category);
|
|
157
|
+
if (next && next.code) {
|
|
158
|
+
this.frameworkService.selectionList.delete(next.code);
|
|
159
|
+
}
|
|
160
|
+
this.frameworkService.insertUpdateDeleteNotifier.next({ action: data.selectedTerm.category, type: type ? type : 'select', data: data.selectedTerm });
|
|
161
|
+
}
|
|
162
|
+
if (data.colIndex === 0 && !data.isSelected) {
|
|
163
|
+
this.isLoading = true;
|
|
164
|
+
setTimeout(() => {
|
|
165
|
+
this.init();
|
|
166
|
+
}, 3000);
|
|
167
|
+
}
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
this.loaded[data.selectedTerm.category] = true;
|
|
170
|
+
}, 100);
|
|
171
|
+
}
|
|
172
|
+
isEnabled(columnCode) {
|
|
173
|
+
return !!this.frameworkService.selectionList.get(columnCode);
|
|
174
|
+
}
|
|
175
|
+
isEnableds() {
|
|
176
|
+
if (this.frameworkService.CurrentCardClk) {
|
|
177
|
+
this.frameworkService.CurrentCardClk.subscribe((item) => {
|
|
178
|
+
const dataCode = this.frameworkService.getNextCategory(item);
|
|
179
|
+
if (dataCode && dataCode.code) {
|
|
180
|
+
this.dataConfig = this.frameworkService.getConfig(dataCode.code);
|
|
181
|
+
}
|
|
182
|
+
if (dataCode) {
|
|
183
|
+
this.configCodeBtn = dataCode.code;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
openCreateTermDialog(column, colIndex) {
|
|
189
|
+
if (!this.isEnabled(column.code)) {
|
|
190
|
+
const nextCat = column.code;
|
|
191
|
+
const nextNextCat = this.frameworkService.getNextCategory(nextCat);
|
|
192
|
+
if (nextCat) {
|
|
193
|
+
const selectedTerms = this.frameworkService.getPreviousSelectedTerms(nextCat);
|
|
194
|
+
const colInfo = Array.from(this.frameworkService.list.values()).filter(l => l.code === nextCat);
|
|
195
|
+
let nextColInfo = [];
|
|
196
|
+
if (nextNextCat && nextNextCat.code) {
|
|
197
|
+
nextColInfo = Array.from(this.frameworkService.list.values()).filter(l => l.code === nextNextCat.code);
|
|
198
|
+
}
|
|
199
|
+
let dialog;
|
|
200
|
+
if (this.environment && this.environment.frameworkType === 'MDO_DESIGNATION') {
|
|
201
|
+
dialog = this.dialog.open(CreateTermFromFrameworkComponent, {
|
|
202
|
+
data: {
|
|
203
|
+
mode: 'multi-create',
|
|
204
|
+
columnInfo: colInfo && colInfo.length ? colInfo[0] : [],
|
|
205
|
+
nextColInfo: nextColInfo && nextColInfo.length ? nextColInfo[0] : [],
|
|
206
|
+
frameworkId: this.frameworkService.getFrameworkId(),
|
|
207
|
+
selectedparents: this.heightLighted,
|
|
208
|
+
colIndex: nextCat.index,
|
|
209
|
+
selectedParentTerms: selectedTerms
|
|
210
|
+
},
|
|
211
|
+
width: '800px',
|
|
212
|
+
panelClass: 'custom-dialog-container',
|
|
213
|
+
position: { top: '50px' }
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
dialog = this.dialog.open(CreateTermComponent, {
|
|
218
|
+
data: {
|
|
219
|
+
mode: 'multi-create',
|
|
220
|
+
columnInfo: colInfo && colInfo.length ? colInfo[0] : [],
|
|
221
|
+
frameworkId: this.frameworkService.getFrameworkId(),
|
|
222
|
+
selectedparents: this.heightLighted,
|
|
223
|
+
colIndex: nextCat.index,
|
|
224
|
+
selectedParentTerms: selectedTerms
|
|
225
|
+
},
|
|
226
|
+
width: '800px',
|
|
227
|
+
panelClass: 'custom-dialog-container',
|
|
228
|
+
position: { top: '50px' }
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
dialog.afterClosed().subscribe((res) => {
|
|
232
|
+
if (!res) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (res && res.created) {
|
|
236
|
+
this.showPublish = true;
|
|
237
|
+
}
|
|
238
|
+
const data = this.frameworkService.cardClkData;
|
|
239
|
+
const responseData = {
|
|
240
|
+
res,
|
|
241
|
+
index: nextCat.index,
|
|
242
|
+
data,
|
|
243
|
+
type: 'multi-create'
|
|
244
|
+
};
|
|
245
|
+
if (!(res && res.stopUpdate)) {
|
|
246
|
+
this.frameworkService.updateAfterAddOrEditSubject(responseData);
|
|
247
|
+
}
|
|
248
|
+
this.loaded[res.term.category] = false;
|
|
249
|
+
const parentColumn = this.frameworkService.getPreviousCategory(res.term[0].category);
|
|
250
|
+
res.parent = null;
|
|
251
|
+
if (parentColumn) {
|
|
252
|
+
res.parent = this.frameworkService.selectionList.get(parentColumn.code);
|
|
253
|
+
res.parent.children ? res.parent.children.push(res.term[0]) : res.parent['children'] = [res.term[0]];
|
|
254
|
+
}
|
|
255
|
+
this.updateFinalList({ selectedTerm: res.term[0], isSelected: false, parentData: res.parent, colIndex: colIndex });
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
openOrganizationDialog(column, _index) {
|
|
261
|
+
const treeListData = this.frameworkService.getPreviousSelectedTerms(column.code);
|
|
262
|
+
const dialog = this.dialog.open(OrgHierarchyAddModalComponent, {
|
|
263
|
+
data: {
|
|
264
|
+
previous: treeListData,
|
|
265
|
+
currentData: column,
|
|
266
|
+
selectedOrgData: this.orgSelectedData,
|
|
267
|
+
},
|
|
268
|
+
autoFocus: true,
|
|
269
|
+
restoreFocus: true,
|
|
270
|
+
position: { right: '0' },
|
|
271
|
+
height: '100vh',
|
|
272
|
+
width: '50%',
|
|
273
|
+
panelClass: 'right-side-modal',
|
|
274
|
+
maxWidth: '100vw'
|
|
275
|
+
});
|
|
276
|
+
dialog.afterClosed().subscribe((_res) => {
|
|
277
|
+
if (_res && _res.length > 0) {
|
|
278
|
+
this.treeHierarchySvc.setLoaderState(true);
|
|
279
|
+
this.createTerms(_res, column);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
get list() {
|
|
284
|
+
return Array.from(this.frameworkService.list.values());
|
|
285
|
+
}
|
|
286
|
+
drawHeaderLine(len) {
|
|
287
|
+
const options = { ...defaultConfig, ...headerLineConfig };
|
|
288
|
+
for (let i = 1; i <= len; i++) {
|
|
289
|
+
const startEle = document.querySelector(`#box${i}count`);
|
|
290
|
+
const endEle = document.querySelector(`#box${i}Header`);
|
|
291
|
+
if (startEle && endEle) {
|
|
292
|
+
new LeaderLine(startEle, endEle, options);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
getColumn(columnCode) {
|
|
297
|
+
return this.frameworkService.list.get(columnCode);
|
|
298
|
+
}
|
|
299
|
+
newConnection() {
|
|
300
|
+
const dialog = this.dialog.open(ConnectorComponent, {
|
|
301
|
+
data: {},
|
|
302
|
+
width: '90%',
|
|
303
|
+
});
|
|
304
|
+
dialog.afterClosed().subscribe((res) => {
|
|
305
|
+
if ((res.source === 'online' && res.data.endpoint) || (res.source === 'offline')) {
|
|
306
|
+
this.localSvc.localStorage = res;
|
|
307
|
+
this.init();
|
|
308
|
+
}
|
|
309
|
+
else if (res.source === 'online' && !res.data.endpoint) {
|
|
310
|
+
this.localSvc.localStorage = res;
|
|
311
|
+
this.init();
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
updateDraftStatusTerms(event) {
|
|
316
|
+
if (event.checked) {
|
|
317
|
+
this.draftTerms.push(event.term);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.draftTerms = this.draftTerms.filter(d => event.term.identifier !== d.identifier);
|
|
321
|
+
}
|
|
322
|
+
this.showActionBar = this.draftTerms.length > 0 ? true : false;
|
|
323
|
+
}
|
|
324
|
+
getNoOfCards(event) {
|
|
325
|
+
if (this.categoryList.length > 0 && event.category !== '') {
|
|
326
|
+
let index = this.categoryList.findIndex((obj) => obj.category == event.category);
|
|
327
|
+
if (index > -1) {
|
|
328
|
+
this.categoryList.splice(index);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (event.category == '') {
|
|
332
|
+
this.categoryList[this.categoryList.length - 1].count = 0;
|
|
333
|
+
}
|
|
334
|
+
this.categoryList.push(event);
|
|
335
|
+
}
|
|
336
|
+
getCount(code) {
|
|
337
|
+
let count = 0;
|
|
338
|
+
if (this.categoryList) {
|
|
339
|
+
const category = this.categoryList.find((category) => category.category === code);
|
|
340
|
+
count = category && category.count ? category.count : 0;
|
|
341
|
+
}
|
|
342
|
+
return count;
|
|
343
|
+
}
|
|
344
|
+
sendForApproval() {
|
|
345
|
+
if (!this.isApprovalView) {
|
|
346
|
+
let parentList = [];
|
|
347
|
+
this.list.forEach(ele => {
|
|
348
|
+
const t = ele.children.filter((term) => term.selected === true);
|
|
349
|
+
if (t[0]) {
|
|
350
|
+
parentList.push(t[0]);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
const req = {
|
|
354
|
+
updateFieldValues: [...parentList, ...this.draftTerms]
|
|
355
|
+
};
|
|
356
|
+
this.approvalService.createApproval(req).subscribe(() => {
|
|
357
|
+
this.frameworkService.removeOldLine();
|
|
358
|
+
this._snackBar.open('Terms successfully sent for Approval.', 'cancel');
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
this.sentForApprove.emit(this.draftTerms);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
closeActionBar(_e) {
|
|
366
|
+
this.showActionBar = false;
|
|
367
|
+
}
|
|
368
|
+
initConfig() {
|
|
369
|
+
if (this.environment) {
|
|
370
|
+
this.frameworkService.updateEnvironment(this.environment);
|
|
371
|
+
this.frameworkService.setConfig(this.taxonomyConfig);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
ngOnDestroy() {
|
|
375
|
+
this.frameworkService.removeOldLine();
|
|
376
|
+
}
|
|
377
|
+
getNextCat(data) {
|
|
378
|
+
if (data && data.code) {
|
|
379
|
+
const nextCat = this.frameworkService.getNextCategory(data.code);
|
|
380
|
+
return nextCat;
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
isCurrentOrNextTerm(_column, index) {
|
|
385
|
+
if (!this.frameworkService.currentSelection.value) {
|
|
386
|
+
return index === 0;
|
|
387
|
+
}
|
|
388
|
+
const currentCategory = this.frameworkService.currentSelection.value.type;
|
|
389
|
+
if (!currentCategory) {
|
|
390
|
+
return index === 0;
|
|
391
|
+
}
|
|
392
|
+
let currentIndex = -1;
|
|
393
|
+
for (let i = 0; i < this.list.length; i++) {
|
|
394
|
+
if (this.list[i].code === currentCategory) {
|
|
395
|
+
currentIndex = i;
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (currentIndex === -1) {
|
|
400
|
+
return index === 0;
|
|
401
|
+
}
|
|
402
|
+
return index === currentIndex || index === currentIndex + 1;
|
|
403
|
+
}
|
|
404
|
+
shouldShowSvgBorderWrapper(column, index) {
|
|
405
|
+
if (this.isCurrentOrNextTerm(column, index) && this.getCount(column.code) === 0) {
|
|
406
|
+
return true;
|
|
407
|
+
}
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
createTerms(selectedList, column) {
|
|
411
|
+
const frameworkData = {
|
|
412
|
+
id: this.orgSelectedData.orgHierarchyFrameworkId || '',
|
|
413
|
+
category: column.code || '',
|
|
414
|
+
};
|
|
415
|
+
selectedList.forEach(async (ele) => {
|
|
416
|
+
const requestBody = {
|
|
417
|
+
request: {
|
|
418
|
+
term: {
|
|
419
|
+
name: ele.orgName || '',
|
|
420
|
+
description: ele.description || '',
|
|
421
|
+
code: uuidv4(),
|
|
422
|
+
additionalProperties: {
|
|
423
|
+
identifier: ele.ministryOrStateId || '',
|
|
424
|
+
parentOrgName: ele.ministryOrStateName || '',
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
const createTremsRes = await this.treeHierarchySvc.createTerm(requestBody, frameworkData).toPromise().catch(err => {
|
|
430
|
+
console.error('Error in creating term', err);
|
|
431
|
+
});
|
|
432
|
+
if (createTremsRes && createTremsRes.result && createTremsRes.result.node_id) {
|
|
433
|
+
this.updateAssociation(createTremsRes.result.node_id[0], frameworkData);
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
async updateAssociation(nodeId, frameworkData) {
|
|
438
|
+
const requestBody = {
|
|
439
|
+
request: {
|
|
440
|
+
term: {
|
|
441
|
+
associations: [
|
|
442
|
+
{
|
|
443
|
+
identifier: nodeId
|
|
444
|
+
},
|
|
445
|
+
]
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
const nodeIdParts = nodeId.split('_');
|
|
450
|
+
const codeId = nodeIdParts[nodeIdParts.length - 1];
|
|
451
|
+
const updateAssociationRes = await this.treeHierarchySvc.updateFrameworkAssociation(requestBody, frameworkData, codeId).toPromise().catch(err => {
|
|
452
|
+
console.error('Error in updating association', err);
|
|
453
|
+
});
|
|
454
|
+
if (updateAssociationRes && updateAssociationRes.result && updateAssociationRes.result.node_id) {
|
|
455
|
+
this.publishFramework(frameworkData);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
publishFramework(frameworkData) {
|
|
459
|
+
this.treeHierarchySvc.publishFreamework(frameworkData).subscribe((res) => {
|
|
460
|
+
if (res && res.result && res.result.publishStatus) {
|
|
461
|
+
this._snackBar.open(`${res.result.publishStatus}`, 'cancel');
|
|
462
|
+
this.treeHierarchySvc.setLoaderState(false);
|
|
463
|
+
this.init();
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
this._snackBar.open('Error in publishing framework', 'cancel');
|
|
467
|
+
this.treeHierarchySvc.setLoaderState(false);
|
|
468
|
+
}
|
|
469
|
+
}, (err) => {
|
|
470
|
+
console.error('Error in publishing framework', err);
|
|
471
|
+
this.treeHierarchySvc.setLoaderState(false);
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeViewComponent, deps: [{ token: i1.FrameworkService }, { token: i2.LocalConnectionService }, { token: i3.MatLegacyDialog }, { token: i4.ApprovalService }, { token: i5.MatLegacySnackBar }, { token: i6.ConnectorService }, { token: i0.ChangeDetectorRef }, { token: i7.TreeHierarchyService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
475
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TreeViewComponent, selector: "lib-tree-view", inputs: { approvalList: "approvalList", isApprovalView: "isApprovalView", workFlowStatus: "workFlowStatus", environment: "environment", taxonomyConfig: "taxonomyConfig", orgSelectedData: "orgSelectedData" }, outputs: { sentForApprove: "sentForApprove", loaderEnable: "loaderEnable" }, usesOnChanges: true, ngImport: i0, template: "<!-- <div class=\"flex flex-1 connectionSettings\">\n <button mat-raised-button color=\"accent\" (click)=\"newConnection()\">\n <mat-icon>{{app_strings.build}}</mat-icon>\n </button>\n</div> -->\n\n<div *ngIf=\"list && list.length > 0\" class=\"flex heightFix overflow-container\" id=\"treeViewContainer\">\n <ng-container *ngFor=\"let column of list; let i = index;\">\n <div class=\"flex-1 felx-col col-container containers{{list.length}}\" id=\"box{{i+1}}Container\">\n <div class=\"category-heading-sticky\">\n <div class=\"category-heading-container\">\n <div class='category-header'>\n <div class=\"category-header-items w-full\" id=\"box{{i}}Header\">\n <ng-container *ngIf=\"column?.config?.iconEnabled\">\n <mat-icon [ngStyle]=\"{'color':column.config.color}\">{{column.config.icon}}</mat-icon>\n </ng-container>\n <span class=\"flex-1 mat-body-1\">\n <!-- {{column.name}} -->\n {{column?.config?.categoryDisplayName || column.name }}\n <ng-container *ngIf=\"i != 0 && categoryList?.length > 0; else firstColumn\">\n <ng-container *ngIf=\"column.index !== 1\">\n <span class=\"count\">({{getCount(column.code)}})</span>\n </ng-container>\n </ng-container>\n </span>\n <ng-template #firstColumn>\n <span *ngIf=\"i == 0\" id=\"box{{i+1}}count\" class=\"count\">({{column.children.length}})</span>\n </ng-template>\n <ng-container class=\"\" *ngIf=\"column?.config?.createBtnEnabled && !column?.config?.addOrgEnabled\">\n <button mat-button class=\"add-btn\" [ngClass]=\"{'button-enabled': configCodeBtn== column?.code, 'button-disabled': configCodeBtn!== column?.code}\"\n (click)=\"openCreateTermDialog(column, i)\" type=\"button\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.addOrgEnabled && !column?.config?.createBtnEnabled\">\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i)\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <div class=\"arrow\" id=\"box{{i+1}}count\"></div>\n </div>\n </div>\n <!-- <div>\n Put search button here in future\n </div> -->\n </div>\n </div>\n <!-- {{column.code}} -->\n <div class=\"padding-x2 cat-columns container-box\" id=\"box{{i+1}}\">\n <ng-container *ngIf=\"column?.children && column?.children.length > 0\">\n <lib-tree-column-view *ngIf=\"loaded[column.code]\" #selectedTaxonomyTerm [column]=\"column\"\n [containerId]=\"'box'+(i+1)\" (updateTaxonomyTerm)=\"updateTaxonomyTerm($event)\"\n (updateTermList)=\"updateDraftStatusTerms($event)\" (cardsCount)=\"getNoOfCards($event)\">\n </lib-tree-column-view>\n </ng-container>\n <ng-container *ngIf=\"shouldShowSvgBorderWrapper(column, i)\">\n <div class=\"svg-border-wrapper\">\n <svg width=\"100%\" height=\"100%\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"#1B213352\" stroke-width=\"2\" \n stroke-dasharray=\"20, 10\" rx=\"10\" ry=\"10\"/>\n </svg>\n <div class=\"content flex flex-col w-full\">\n <div class=\"icon-container\">\n <mat-icon svgIcon=\"frac-no-connection\"></mat-icon>\n </div>\n <label>{{isLoading}} Select an organization to add or see further connections</label>\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i)\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <lib-action-bar *ngIf=\"showActionBar\" [actionType]=\"isApprovalView\" [configType]=\"workFlowStatus\"\n (sendApproval)=\"sendForApproval()\" (closeAction)=\"closeActionBar($event)\"></lib-action-bar>\n</div>\n<div *ngIf=\"!(list && list.length > 0 ) && isFraworkLoading\" class=\"flex heightFix \">\n <h1 i18n>{{app_strings.loading}}</h1>\n</div>", styles: [".connectionSettings{flex-direction:row-reverse;z-index:40;position:fixed;padding:0 4px 4px 0;bottom:0;right:0}.flex{display:flex}.w-full{width:100%;align-items:center;display:flex}.w-full.addCardButton{padding:.25em .8em;text-align:left;border:2px dotted #b1b1b1;color:#666;border-radius:8px}.w-full.addCardButton .mat-icon{position:absolute;top:0%;right:3%;height:100%;display:flex;align-items:center}.w-full .button-enabled{opacity:1;pointer-events:auto}.w-full .button-disabled{opacity:.5;pointer-events:none}.w-full.addCardButtonNew{padding:8px 12px;text-align:center;border-radius:24px;height:24px;background:#1b4ca1;color:#fff!important}.w-full.addCardButtonNew .mat-icon-custom{font-size:21px}.w-full.addCardButtonNew:disabled{opacity:.6}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100%;width:100%;justify-content:space-around;position:relative}.cat-columns{position:relative;height:inherit}.col-container{height:inherit;min-width:350px}.category-heading-sticky{top:0;position:sticky;width:100%;background:#fff;margin-bottom:16px;z-index:10}.category-heading-container{box-sizing:content-box;position:relative;display:block;padding:2px 2.5em}.category-heading-container .category-header{display:flex;align-items:center}.category-heading-container .category-header-items{display:flex;align-items:center;padding:0 10px}.category-heading-container .category-header h4{padding:0 10px;color:#00000080}.category-heading-container .category-header .count{padding:0 2px}.category-heading-container .category-header .category-header-items{font-size:12px;font-weight:600;font-family:Lato;color:#7c7c7c}.cat-columns:hover{overflow-y:scroll}.container-box{overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;height:calc(100% - 70px)}.container-box::-webkit-scrollbar{width:0;height:0}.spinner{position:fixed;display:flex;top:50%;left:50%}.arrow{left:30px;position:relative}@media only screen and (max-width: 1024px){::ng-deep mat-checkbox .mat-checkbox-inner-container{height:.8em;width:.8em}}@media only screen and (max-width: 1024px){.containers4{max-width:250px;font-size:10px}.containers5{max-width:230px}.containers6{max-width:150px}.containers7{max-width:100px}.w-full{height:3.5em}.w-full.mat-stroked-button{font-size:8px}.padding-x2,.category-heading-container{padding:0 2em}mat-icon{font-size:12px;width:1.25em;height:1.25em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .5em;line-height:2em}}@media only screen and (max-width: 992px){.containers4{max-width:220px;font-size:9px}.padding-x2,.category-heading-container{padding:0 1.5em}}@media only screen and (max-width: 768px){.containers4{max-width:165px;font-size:8px}.w-full{height:2.5em}.padding-x2,.category-heading-container{padding:0 1em}mat-icon{font-size:8px;width:1em;height:1em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .3em;line-height:1.5em}}.add-btn{height:24px;background:#1b4ca1;color:#fff!important;display:flex;flex-direction:row-reverse;justify-content:space-between;border-radius:12px}.overflow-container{width:100%;max-width:100%;overflow-x:auto;white-space:nowrap}.svg-border-wrapper{position:relative;width:100%;height:95%;min-height:100px}.svg-border-wrapper .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.content{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.content label{max-width:90%;margin:10px 0;font-size:16px;line-height:1.4;color:#000000b3;white-space:normal;word-wrap:break-word;font-weight:700}.icon-container{background:#0000000a;position:relative;width:40px;height:40px;border-radius:5px}.icon-container mat-icon{width:30px;height:30px;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.TreeColumnViewComponent, selector: "lib-tree-column-view", inputs: ["column", "containerId"], outputs: ["updateTaxonomyTerm", "updateTermList", "cardsCount"] }, { kind: "component", type: i12.ActionBarComponent, selector: "lib-action-bar", inputs: ["actionType", "configType"], outputs: ["sendApproval", "closeAction"] }] }); }
|
|
476
|
+
}
|
|
477
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeViewComponent, decorators: [{
|
|
478
|
+
type: Component,
|
|
479
|
+
args: [{ selector: 'lib-tree-view', template: "<!-- <div class=\"flex flex-1 connectionSettings\">\n <button mat-raised-button color=\"accent\" (click)=\"newConnection()\">\n <mat-icon>{{app_strings.build}}</mat-icon>\n </button>\n</div> -->\n\n<div *ngIf=\"list && list.length > 0\" class=\"flex heightFix overflow-container\" id=\"treeViewContainer\">\n <ng-container *ngFor=\"let column of list; let i = index;\">\n <div class=\"flex-1 felx-col col-container containers{{list.length}}\" id=\"box{{i+1}}Container\">\n <div class=\"category-heading-sticky\">\n <div class=\"category-heading-container\">\n <div class='category-header'>\n <div class=\"category-header-items w-full\" id=\"box{{i}}Header\">\n <ng-container *ngIf=\"column?.config?.iconEnabled\">\n <mat-icon [ngStyle]=\"{'color':column.config.color}\">{{column.config.icon}}</mat-icon>\n </ng-container>\n <span class=\"flex-1 mat-body-1\">\n <!-- {{column.name}} -->\n {{column?.config?.categoryDisplayName || column.name }}\n <ng-container *ngIf=\"i != 0 && categoryList?.length > 0; else firstColumn\">\n <ng-container *ngIf=\"column.index !== 1\">\n <span class=\"count\">({{getCount(column.code)}})</span>\n </ng-container>\n </ng-container>\n </span>\n <ng-template #firstColumn>\n <span *ngIf=\"i == 0\" id=\"box{{i+1}}count\" class=\"count\">({{column.children.length}})</span>\n </ng-template>\n <ng-container class=\"\" *ngIf=\"column?.config?.createBtnEnabled && !column?.config?.addOrgEnabled\">\n <button mat-button class=\"add-btn\" [ngClass]=\"{'button-enabled': configCodeBtn== column?.code, 'button-disabled': configCodeBtn!== column?.code}\"\n (click)=\"openCreateTermDialog(column, i)\" type=\"button\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"column?.config?.addOrgEnabled && !column?.config?.createBtnEnabled\">\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i)\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </ng-container>\n <div class=\"arrow\" id=\"box{{i+1}}count\"></div>\n </div>\n </div>\n <!-- <div>\n Put search button here in future\n </div> -->\n </div>\n </div>\n <!-- {{column.code}} -->\n <div class=\"padding-x2 cat-columns container-box\" id=\"box{{i+1}}\">\n <ng-container *ngIf=\"column?.children && column?.children.length > 0\">\n <lib-tree-column-view *ngIf=\"loaded[column.code]\" #selectedTaxonomyTerm [column]=\"column\"\n [containerId]=\"'box'+(i+1)\" (updateTaxonomyTerm)=\"updateTaxonomyTerm($event)\"\n (updateTermList)=\"updateDraftStatusTerms($event)\" (cardsCount)=\"getNoOfCards($event)\">\n </lib-tree-column-view>\n </ng-container>\n <ng-container *ngIf=\"shouldShowSvgBorderWrapper(column, i)\">\n <div class=\"svg-border-wrapper\">\n <svg width=\"100%\" height=\"100%\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"none\" stroke=\"#1B213352\" stroke-width=\"2\" \n stroke-dasharray=\"20, 10\" rx=\"10\" ry=\"10\"/>\n </svg>\n <div class=\"content flex flex-col w-full\">\n <div class=\"icon-container\">\n <mat-icon svgIcon=\"frac-no-connection\"></mat-icon>\n </div>\n <label>{{isLoading}} Select an organization to add or see further connections</label>\n <button mat-button class=\"add-btn\" (click)=\"openOrganizationDialog(column, i)\" type=\"button\" \n [ngClass]=\"{'button-enabled': isCurrentOrNextTerm(column, i), 'button-disabled': !isCurrentOrNextTerm(column, i)}\">\n <span>Add</span>\n <mat-icon class=\"margin-remove\">\n {{app_strings.add}}\n </mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <lib-action-bar *ngIf=\"showActionBar\" [actionType]=\"isApprovalView\" [configType]=\"workFlowStatus\"\n (sendApproval)=\"sendForApproval()\" (closeAction)=\"closeActionBar($event)\"></lib-action-bar>\n</div>\n<div *ngIf=\"!(list && list.length > 0 ) && isFraworkLoading\" class=\"flex heightFix \">\n <h1 i18n>{{app_strings.loading}}</h1>\n</div>", styles: [".connectionSettings{flex-direction:row-reverse;z-index:40;position:fixed;padding:0 4px 4px 0;bottom:0;right:0}.flex{display:flex}.w-full{width:100%;align-items:center;display:flex}.w-full.addCardButton{padding:.25em .8em;text-align:left;border:2px dotted #b1b1b1;color:#666;border-radius:8px}.w-full.addCardButton .mat-icon{position:absolute;top:0%;right:3%;height:100%;display:flex;align-items:center}.w-full .button-enabled{opacity:1;pointer-events:auto}.w-full .button-disabled{opacity:.5;pointer-events:none}.w-full.addCardButtonNew{padding:8px 12px;text-align:center;border-radius:24px;height:24px;background:#1b4ca1;color:#fff!important}.w-full.addCardButtonNew .mat-icon-custom{font-size:21px}.w-full.addCardButtonNew:disabled{opacity:.6}.mb1{margin-bottom:1em}flex-center{flex-wrap:nowrap;align-items:start;justify-content:center}.flex-1{flex:1}.felx-col{flex-direction:column}.padding-x2{padding:0 2.5em}.heightFix{height:100%;width:100%;justify-content:space-around;position:relative}.cat-columns{position:relative;height:inherit}.col-container{height:inherit;min-width:350px}.category-heading-sticky{top:0;position:sticky;width:100%;background:#fff;margin-bottom:16px;z-index:10}.category-heading-container{box-sizing:content-box;position:relative;display:block;padding:2px 2.5em}.category-heading-container .category-header{display:flex;align-items:center}.category-heading-container .category-header-items{display:flex;align-items:center;padding:0 10px}.category-heading-container .category-header h4{padding:0 10px;color:#00000080}.category-heading-container .category-header .count{padding:0 2px}.category-heading-container .category-header .category-header-items{font-size:12px;font-weight:600;font-family:Lato;color:#7c7c7c}.cat-columns:hover{overflow-y:scroll}.container-box{overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none;height:calc(100% - 70px)}.container-box::-webkit-scrollbar{width:0;height:0}.spinner{position:fixed;display:flex;top:50%;left:50%}.arrow{left:30px;position:relative}@media only screen and (max-width: 1024px){::ng-deep mat-checkbox .mat-checkbox-inner-container{height:.8em;width:.8em}}@media only screen and (max-width: 1024px){.containers4{max-width:250px;font-size:10px}.containers5{max-width:230px}.containers6{max-width:150px}.containers7{max-width:100px}.w-full{height:3.5em}.w-full.mat-stroked-button{font-size:8px}.padding-x2,.category-heading-container{padding:0 2em}mat-icon{font-size:12px;width:1.25em;height:1.25em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .5em;line-height:2em}}@media only screen and (max-width: 992px){.containers4{max-width:220px;font-size:9px}.padding-x2,.category-heading-container{padding:0 1.5em}}@media only screen and (max-width: 768px){.containers4{max-width:165px;font-size:8px}.w-full{height:2.5em}.padding-x2,.category-heading-container{padding:0 1em}mat-icon{font-size:8px;width:1em;height:1em}.connectionSettings .mat-raised-button{min-width:auto;padding:0 .3em;line-height:1.5em}}.add-btn{height:24px;background:#1b4ca1;color:#fff!important;display:flex;flex-direction:row-reverse;justify-content:space-between;border-radius:12px}.overflow-container{width:100%;max-width:100%;overflow-x:auto;white-space:nowrap}.svg-border-wrapper{position:relative;width:100%;height:95%;min-height:100px}.svg-border-wrapper .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.content{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.content label{max-width:90%;margin:10px 0;font-size:16px;line-height:1.4;color:#000000b3;white-space:normal;word-wrap:break-word;font-weight:700}.icon-container{background:#0000000a;position:relative;width:40px;height:40px;border-radius:5px}.icon-container mat-icon{width:30px;height:30px;margin:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}\n"] }]
|
|
480
|
+
}], ctorParameters: function () { return [{ type: i1.FrameworkService }, { type: i2.LocalConnectionService }, { type: i3.MatLegacyDialog }, { type: i4.ApprovalService }, { type: i5.MatLegacySnackBar }, { type: i6.ConnectorService }, { type: i0.ChangeDetectorRef }, { type: i7.TreeHierarchyService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { approvalList: [{
|
|
481
|
+
type: Input
|
|
482
|
+
}], isApprovalView: [{
|
|
483
|
+
type: Input
|
|
484
|
+
}], workFlowStatus: [{
|
|
485
|
+
type: Input
|
|
486
|
+
}], environment: [{
|
|
487
|
+
type: Input
|
|
488
|
+
}], taxonomyConfig: [{
|
|
489
|
+
type: Input
|
|
490
|
+
}], orgSelectedData: [{
|
|
491
|
+
type: Input
|
|
492
|
+
}], sentForApprove: [{
|
|
493
|
+
type: Output
|
|
494
|
+
}], loaderEnable: [{
|
|
495
|
+
type: Output
|
|
496
|
+
}] } });
|
|
497
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90cmVlLWhpZXJhcmNoeS9zcmMvbGliL2NvbXBvbmVudHMvdHJlZS12aWV3L3RyZWUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUtdmlldy90cmVlLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBZ0MsTUFBTSxlQUFlLENBQUM7QUFHN0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFPdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUN0SCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUU3RyxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQTs7Ozs7Ozs7Ozs7Ozs7QUFRbkMsTUFBTSxPQUFPLGlCQUFpQjtJQTJCNUIsWUFBb0IsZ0JBQWtDLEVBQzVDLFFBQWdDLEVBQ2pDLE1BQWlCLEVBQ2hCLGVBQWdDLEVBQ2hDLFNBQXNCLEVBQ3RCLFlBQThCLEVBQzlCLEdBQXNCLEVBQ3RCLGdCQUFzQyxFQUN0QyxjQUFpQztRQVJ2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtC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SCxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBM2lCVSxpQkFBaUI7bUdBQWpCLGlCQUFpQix1V0N6QjlCLCsrTEEyRk07OzRGRGxFTyxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsZUFBZTswV0FLaEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7IENyZWF0ZVRlcm1Db21wb25lbnQgfSBmcm9tICcuLi9jcmVhdGUtdGVybS9jcmVhdGUtdGVybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29ubmVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY29ubmVjdG9yL2Nvbm5lY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9jYWxDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvY2FsLWNvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJQ29ubmVjdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29ubmVjdGlvbi10eXBlLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29ubmVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Nvbm5lY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcHJvdmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcHJvdmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJztcbmltcG9ydCB7IGRlZmF1bHRDb25maWcsIGhlYWRlckxpbmVDb25maWcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvYXBwLWNvbnN0YW50JztcbmltcG9ydCB7IGxhYmVscyB9IGZyb20gJy4uLy4uL2xhYmVscy9zdHJpbmdzJztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmFyaWFibGUtdHlwZS5tb2RlbCc7XG5pbXBvcnQgeyBDcmVhdGVUZXJtRnJvbUZyYW1ld29ya0NvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPcmdIaWVyYXJjaHlBZGRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL29yZy1oaWVyYXJjaHktYWRkLW1vZGFsL29yZy1oaWVyYXJjaHktYWRkLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmVlSGllcmFyY2h5U2VydmljZSB9IGZyb20gJy4uLy4uL3RyZWUtaGllcmFyY2h5LnNlcnZpY2UnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCdcblxuZGVjbGFyZSB2YXIgTGVhZGVyTGluZTogYW55O1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXRyZWUtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cmVlLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVlLXZpZXcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUcmVlVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgYXBwcm92YWxMaXN0OiBBcnJheTxDYXJkPiA9IFtdO1xuICBASW5wdXQoKSBpc0FwcHJvdmFsVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB3b3JrRmxvd1N0YXR1czogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50OmFueTtcbiAgQElucHV0KCkgdGF4b25vbXlDb25maWc6IGFueTtcbiAgQElucHV0KCkgb3JnU2VsZWN0ZWREYXRhOiBhbnk7XG4gIEBPdXRwdXQoKSBzZW50Rm9yQXBwcm92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBsb2FkZXJFbmFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBtYXBwaW5nID0ge307XG4gIGhlaWdodExpZ2h0ZWQgPSBbXVxuICBsb2NhbExpc3QgPSBbXVxuICBzaG93UHVibGlzaDogYm9vbGVhbiA9IGZhbHNlXG4gIG5ld1Rlcm1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICBsb2FkZWQ6IGFueSA9IHt9XG4gIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSBmYWxzZVxuICBhcHByb3ZhbFJlcXVpcmVkVGVybXMgPSBbXVxuICBkcmFmdFRlcm1zOiBBcnJheTxDYXJkPiA9IFtdO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2F0ZWdvcnlMaXN0OmFueSA9IFtdO1xuICBhcHBfc3RyaW5nczogYW55ID0gbGFiZWxzO1xuICBpc0hpZGVCdG5FbmE6Ym9vbGVhbiA9dHJ1ZTtcbiAgY29sdW1uSWQ6c3RyaW5nID0gJyc7XG4gIGNvbmZpZ0NvZGVCdG46YW55O1xuICBkYXRhQ29uZmlnOmFueVxuICBpc0ZyYXdvcmtMb2FkaW5nID0gdHJ1ZVxuICBsb2FkZXJTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb25cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLCBcbiAgICBwcml2YXRlIGxvY2FsU3ZjOiBMb2NhbENvbm5lY3Rpb25TZXJ2aWNlLCBcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csIFxuICAgIHByaXZhdGUgYXBwcm92YWxTZXJ2aWNlOiBBcHByb3ZhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgY29ubmVjdG9yU3ZjOiBDb25uZWN0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRyZWVIaWVyYXJjaHlTdmM6IFRyZWVIaWVyYXJjaHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIFxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5kcmFmdFRlcm1zID0gdGhpcy5hcHByb3ZhbExpc3Q7XG4gICAgdGhpcy5pbml0KClcbiAgICB0aGlzLnNob3dBY3Rpb25CYXIgPSB0aGlzLmlzQXBwcm92YWxWaWV3P3RydWU6ZmFsc2U7XG4gICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmFmdGVyQWRkT3JFZGl0U3ViamVjdC5zdWJzY3JpYmUocmVzcG9uc2VEYXRhID0+IHtcbiAgICAgIGlmKHJlc3BvbnNlRGF0YSAmJiByZXNwb25zZURhdGEucmVzICYmIHJlc3BvbnNlRGF0YS5kYXRhKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEocmVzcG9uc2VEYXRhKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5pc0VuYWJsZWRzKClcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gfSBcblxuICBpbml0KCkge1xuICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJbmZvKCh0aGlzLm9yZ1NlbGVjdGVkRGF0YSkgPyB0aGlzLm9yZ1NlbGVjdGVkRGF0YSA6ICcnKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3JTdmMucmVtb3ZlQWxsTGluZXMoKVxuICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNhdGVnb3JpZXNIYXNoLnZhbHVlLmZvckVhY2goKGNhdDphbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZWRbY2F0LmNvZGVdID0gdHJ1ZVxuICAgICAgfSlcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgdGhpcy5kcmF3SGVhZGVyTGluZShyZXMucmVzdWx0LmZyYW1ld29yay5jYXRlZ29yaWVzLmxlbmd0aCk7ICBcbiAgICAgICAgICAgICB0aGlzLm1ha2VGaXJzdFRlcm1TZWxlY3RlZCgpXG4gICAgICAgIH0sNTAwKVxuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIGluIGZldGNoaW5nIGZyYW1ld29yaycsIGVycilcbiAgICB9KVxuXG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLnRyZWVIaWVyYXJjaHlTdmMubG9hZGVyU3RhdGUkLnN1YnNjcmliZShcbiAgICAgIGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlckVuYWJsZS5lbWl0KGRhdGEpXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICB9LFxuICAgIClcbiAgXG4gIH1cbiAgcmVmcmVzaERhdGEocmVzRGF0YTogYW55KSB7XG4gICAgY29uc3QgcmVzID0gcmVzRGF0YS5yZXNcbiAgICBpZiAocmVzICYmIHJlcy5jcmVhdGVkKSB7XG4gICAgICB0aGlzLnNob3dQdWJsaXNoID0gdHJ1ZVxuICAgIH1cbiAgICBpZihyZXMubXVsdGkgJiYgQXJyYXkuaXNBcnJheShyZXMudGVybSkgJiYgcmVzLnRlcm0ubGVuZ3RoKXtcbiAgICAgIHJlcy50ZXJtID0gcmVzLnRlcm1bMF1cbiAgICB9IFxuICAgIHRoaXMubG9hZGVkW3Jlcy50ZXJtLmNhdGVnb3J5XSA9IGZhbHNlXG4gICAgLy8gd2FpdFxuICAgIGNvbnN0IHBhcmVudENvbHVtbiA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHJlcy50ZXJtLmNhdGVnb3J5KVxuICAgIHJlcy5wYXJlbnQgPSBudWxsXG4gICAgaWYgKHBhcmVudENvbHVtbikge1xuICAgICAgcmVzLnBhcmVudCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW4uY29kZSlcbiAgICAgIGlmKHJlc0RhdGEudHlwZSA9PT0gJ3VwZGF0ZScpe1xuICAgICAgICBcbiAgICAgICAgcmVzLnBhcmVudC5jaGlsZHJlbltyZXMucGFyZW50LmNoaWxkcmVuLmZpbmRJbmRleCgoZWw6IGFueSkgPT4gZWwuaWRlbnRpZmllciA9PT0gcmVzLnRlcm0uaWRlbnRpZmllcildID0gIHJlcy50ZXJtXG4gICAgICAgIC8vIHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChyZXMucGFyZW50LmNhdGVnb3J5KS5jaGlsZHJlbiA9IFsuLi5yZXMucGFyZW50LmNoaWxkcmVuXVxuICAgICAgICBcbiAgICAgICAgXG5cbiAgICAgICAgLy8gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IHJlcy50ZXJtLmNhdGVnb3J5LCBkYXRhOiByZXMudGVybS5jaGlsZHJlbiwgY2FyZFJlZjpyZXNEYXRhLmNhcmRSZWYgfSlcbiAgICAgICAgLy8gdGhpcy51cGRhdGVTZWxlY3Rpb24ocmVzLnRlcm0uY2F0ZWdvcnksIHJlcy50ZXJtLmNvZGUpO1xuICAgICAgICAvLyB0aGlzLnVwZGF0ZVNlbGVjdGlvbihyZXMucGFyZW50LmNhdGVnb3J5LCByZXMucGFyZW50LmNvZGUpO1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogcmVzLnRlcm0uY2F0ZWdvcnksIGRhdGE6IHJlcy50ZXJtLmNoaWxkcmVuLCBjYXJkUmVmOnJlc0RhdGEuY2FyZFJlZiB9KVxuICAgICAgICAvLyB9LCAxMDApO1xuICAgICAgICAvLyB0aGlzLnVwZGF0ZUZpbmFsTGlzdCh7IHNlbGVjdGVkVGVybTogcmVzLnRlcm0sIGlzU2VsZWN0ZWQ6IHRydWUsIHBhcmVudERhdGE6IHJlcy5wYXJlbnQsIGNvbEluZGV4OnJlc0RhdGEuaW5kZXggfSlcbiAgICAgICAgIHRoaXMubG9hZGVkW3Jlcy50ZXJtLmNhdGVnb3J5XSA9IHRydWVcbiAgICAgICAgcmVzLnRlcm0uc2VsZWN0ZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUocmVzLnRlcm0uY2F0ZWdvcnkpXG4gICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuaW5zZXJ0VXBkYXRlRGVsZXRlTm90aWZpZXIubmV4dCh7IGFjdGlvbjogcmVzLnRlcm0uY2F0ZWdvcnksIHR5cGU6J3VwZGF0ZScsIGRhdGE6IHJlcy50ZXJtIH0pXG4gICAgICAgICB0aGlzLnVwZGF0ZUZpbmFsTGlzdCh7IHNlbGVjdGVkVGVybTogcmVzLnRlcm0sIGlzU2VsZWN0ZWQ6IHRydWUsIHBhcmVudERhdGE6IHJlcy5wYXJlbnQsIGNvbEluZGV4OnJlc0RhdGEuaW5kZXggfSwgJ3VwZGF0ZScpXG4gICAgICAgICByZXMudGVybS5zZWxlY3RlZCA9IHRydWVcbiAgICAgICAgLy8gY29uc3QgbmV4dCA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkocmVzLnRlcm0uY2F0ZWdvcnkpXG4gICAgICAgIFxuICAgICAgICAvLyAgIGlmIChuZXh0ICYmIG5leHQuY29kZSkge1xuICAgICAgICAvLyAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKG5leHQuY29kZSlcbiAgICAgICAgLy8gICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZighcmVzLm11bHRpKXtcbiAgICAgICAgICByZXMucGFyZW50LmNoaWxkcmVuPyByZXMucGFyZW50LmNoaWxkcmVuLnB1c2gocmVzLnRlcm0pIDpyZXMucGFyZW50WydjaGlsZHJlbiddID0gW3Jlcy50ZXJtXVxuICAgICAgICB9IFxuICAgICAgICB0aGlzLnVwZGF0ZUZpbmFsTGlzdCh7IHNlbGVjdGVkVGVybTogcmVzLnRlcm0sIGlzU2VsZWN0ZWQ6IGZhbHNlLCBwYXJlbnREYXRhOiByZXMucGFyZW50LCBjb2xJbmRleDpyZXNEYXRhLmluZGV4IH0sKVxuICAgICAgfVxuICAgIH1cbiAgIFxuICB9XG5cbiAgbWFrZUZpcnN0VGVybVNlbGVjdGVkKCkge1xuICAgIGNvbnN0IGZpcnN0TGlzdEl0ZW0gPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC5lbnRyaWVzKCkubmV4dCgpLnZhbHVlIGFzIGFueVxuICAgIGlmKGZpcnN0TGlzdEl0ZW0gJiYgZmlyc3RMaXN0SXRlbS5sZW5ndGggPj0gMil7XG4gICAgICBpZihmaXJzdExpc3RJdGVtWzFdICYmIGZpcnN0TGlzdEl0ZW1bMV0uY2hpbGRyZW4gJiYgZmlyc3RMaXN0SXRlbVsxXS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RUZXJtID0gZmlyc3RMaXN0SXRlbVsxXS5jaGlsZHJlblswXSBhcyBhbnlcbiAgICAgICAgY29uc3QgY2FyZFJlZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpcnN0VGVybS5uYW1lKVxuICAgICAgICAvLyB0aGlzLmNhdGVnb3J5TGlzdCA9IFtdXG4gICAgICAgIGZpcnN0VGVybS5zZWxlY3RlZCA9IHRydWVcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNhcmRDbGtEYXRhID0gZmlyc3RUZXJtO1xuICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuQ3VycmVudENhcmRDbGsubmV4dChmaXJzdFRlcm0uY2F0ZWdvcnkpXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBmaXJzdFRlcm0uY2F0ZWdvcnksIGRhdGE6IGZpcnN0VGVybSwgY2FyZFJlZiB9KVxuICAgICAgICB0aGlzLmlzRnJhd29ya0xvYWRpbmcgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRheG9ub215VGVybShkYXRhOiB7IHNlbGVjdGVkVGVybTogYW55LCBpc1NlbGVjdGVkOiBib29sZWFuLCBpc1VwZGF0ZT86YW55fSkge1xuICAgIGlmKGRhdGEgJiYgZGF0YS5zZWxlY3RlZFRlcm0gJiYgZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnkpIHtcbiAgICAgIGlmKCFkYXRhLmlzVXBkYXRlKXtcbiAgICAgICAgdGhpcy51cGRhdGVGaW5hbExpc3QoZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlRmluYWxMaXN0KGRhdGEsICd1cGRhdGUnKVxuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24oZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnksIGRhdGEuc2VsZWN0ZWRUZXJtLmNvZGUpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVTZWxlY3Rpb24oY2F0ZWdvcnk6IHN0cmluZywgc2VsZWN0ZWRUZXJtQ29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY2F0ZWdvcnlEYXRhID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QuZ2V0KGNhdGVnb3J5KTtcbiAgICBpZiAoY2F0ZWdvcnlEYXRhICYmIGNhdGVnb3J5RGF0YS5jaGlsZHJlbikge1xuICAgICAgY2F0ZWdvcnlEYXRhLmNoaWxkcmVuLm1hcChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5zZWxlY3RlZCA9IHNlbGVjdGVkVGVybUNvZGUgPT09IGl0ZW0uY29kZSA/IHRydWUgOiBmYWxzZVxuICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvL25lZWQgdG8gcmVmYWN0b3IgYXQgaGVpZ2ggbGV2ZWxcbiAgdXBkYXRlRmluYWxMaXN0KGRhdGE6IHsgc2VsZWN0ZWRUZXJtOiBhbnksIGlzU2VsZWN0ZWQ6IGJvb2xlYW4sIHBhcmVudERhdGE/OiBhbnksIGNvbEluZGV4PzogYW55fSwgdHlwZT86IGFueSkge1xuICAgIFxuICAgIGlmIChkYXRhLmlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIGRhdGEuc2VsZWN0ZWRUZXJtLnNlbGVjdGVkID0gZGF0YS5pc1NlbGVjdGVkXG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zZXQoZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnksIGRhdGEuc2VsZWN0ZWRUZXJtKTtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TmV4dENhdGVnb3J5KGRhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5KVxuICAgICAgaWYgKG5leHQgJiYgbmV4dC5jb2RlKSB7XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZShuZXh0LmNvZGUpXG4gICAgICB9XG4gICAgICAvLyBub3RpZnkgbmV4dFxuICAgICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmluc2VydFVwZGF0ZURlbGV0ZU5vdGlmaWVyLm5leHQoeyBhY3Rpb246IGRhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5LCB0eXBlOiB0eXBlID8gdHlwZSA6ICdzZWxlY3QnLCBkYXRhOiBkYXRhLnNlbGVjdGVkVGVybSB9KVxuICAgIH0gXG4gICAgaWYoZGF0YS5jb2xJbmRleCA9PT0gMCAmJiAhZGF0YS5pc1NlbGVjdGVkKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgICB0aGlzLmluaXQoKVxuICAgICAgfSwzMDAwKVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9hZGVkW2RhdGEuc2VsZWN0ZWRUZXJtLmNhdGVnb3J5XSA9IHRydWVcbiAgICAgIC8vIGlmKHR5cGUgJiYgdHlwZSA9PT0gJ3VwZGF0ZScpe1xuICAgICAgLy8gICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUoZGF0YS5zZWxlY3RlZFRlcm0uY2F0ZWdvcnkpO1xuICAgICAgLy8gICB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogZGF0YS5wYXJlbnREYXRhLmNhdGVnb3J5LCBkYXRhOiBkYXRhLnBhcmVudERhdGEuY2hpbGRyZW4gfSlcbiAgICAgIC8vIH1cbiAgICB9LCAxMDApO1xuXG4gIH1cbiAgaXNFbmFibGVkKGNvbHVtbkNvZGU6IHN0cmluZyk6IGJvb2xlYW4geyAgICBcbiAgICByZXR1cm4gISF0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQoY29sdW1uQ29kZSlcbiAgfVxuXG4gIGlzRW5hYmxlZHMoKSB7XG4gIC8vICByZXR1cm4gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmNhcmRDbGtEYXRhXG4gIGlmKHRoaXMuZnJhbWV3b3JrU2VydmljZS5DdXJyZW50Q2FyZENsayl7XG4gICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLkN1cnJlbnRDYXJkQ2xrLnN1YnNjcmliZSgoaXRlbSk9PntcbiAgICAgY29uc3QgZGF0YUNvZGU6IGFueSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXROZXh0Q2F0ZWdvcnkoaXRlbSlcbiAgICAgIGlmIChkYXRhQ29kZSAmJiBkYXRhQ29kZS5jb2RlKXtcbiAgICAgICAgdGhpcy5kYXRhQ29uZmlnID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldENvbmZpZyhkYXRhQ29kZS5jb2RlKVxuICAgICAgfVxuICAgICBpZihkYXRhQ29kZSl7XG4gICAgICB0aGlzLmNvbmZpZ0NvZGVCdG4gPSBkYXRhQ29kZS5jb2RlXG4gICAgIH1cbiAgICAgfSlcbiAgfVxuICBcbiAgXG4gIH1cblxuICAvLyBnZXRidG5FbmFibGVGbihfaXRlbTogYW55KSB7XG4gIC8vICAgY29uc3QgYWxsU2VsZWN0ZWRUZXJtOiBhbnkgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0QWxsU2VsZWN0ZWRUZXJtcygpXG4gIC8vICAgaWYgKGFsbFNlbGVjdGVkVGVybSAmJiBhbGxTZWxlY3RlZFRlcm0ubGVuZ3RoICYmIGFsbFNlbGVjdGVkVGVybS5maWx0ZXIoKHQ6IGFueSkgPT4gdC5jYXRlZ29yeSA9PT0gX2l0ZW0uY29kZSkubGVuZ3RoID4gMCkge1xuICAvLyAgICAgcmV0dXJuIHRydWVcbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIGZhbHNlXG4gIC8vIH1cblxuXG4gIG9wZW5DcmVhdGVUZXJtRGlhbG9nKGNvbHVtbjogYW55LCBjb2xJbmRleDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZChjb2x1bW4uY29kZSkpIHtcbiAgICAgIGNvbnN0IG5leHRDYXQgPSBjb2x1bW4uY29kZVxuICAgICAgY29uc3QgbmV4dE5leHRDYXQgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0TmV4dENhdGVnb3J5KG5leHRDYXQpXG4gICAgICBpZihuZXh0Q2F0KSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGVybXMgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0UHJldmlvdXNTZWxlY3RlZFRlcm1zKG5leHRDYXQpXG4gICAgICAgIGNvbnN0IGNvbEluZm8gPSBBcnJheS5mcm9tKHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LnZhbHVlcygpKS5maWx0ZXIobCA9PiBsLmNvZGUgPT09IG5leHRDYXQgKVxuICAgICAgICBsZXQgbmV4dENvbEluZm86IGFueSA9IFtdXG4gICAgICAgIGlmKG5leHROZXh0Q2F0ICYmIG5leHROZXh0Q2F0LmNvZGUpIHtcbiAgICAgICAgICBuZXh0Q29sSW5mbyA9IEFycmF5LmZyb20odGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmxpc3QudmFsdWVzKCkpLmZpbHRlcihsID0+IGwuY29kZSA9PT0gbmV4dE5leHRDYXQuY29kZSApXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpYWxvZzogYW55XG4gICAgICAgIGlmKHRoaXMuZW52aXJvbm1lbnQgJiYgdGhpcy5lbnZpcm9ubWVudC5mcmFtZXdvcmtUeXBlID09PSAnTURPX0RFU0lHTkFUSU9OJyl7XG4gICAgICAgICAgZGlhbG9nID0gdGhpcy5kaWFsb2cub3BlbihDcmVhdGVUZXJtRnJvbUZyYW1ld29ya0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogeyBcbiAgICAgICAgICAgICAgbW9kZTonbXVsdGktY3JlYXRlJyxcbiAgICAgICAgICAgICAgLy8gY2FyZENvbEluZm86IHRoaXMuZGF0YS5jb2x1bW5JbmZvLFxuICAgICAgICAgICAgICBjb2x1bW5JbmZvOiBjb2xJbmZvICYmIGNvbEluZm8ubGVuZ3RoID8gY29sSW5mb1swXSA6IFtdLFxuICAgICAgICAgICAgICBuZXh0Q29sSW5mbzogbmV4dENvbEluZm8gJiYgbmV4dENvbEluZm8ubGVuZ3RoID8gbmV4dENvbEluZm9bMF0gOiBbXSxcbiAgICAgICAgICAgICAgZnJhbWV3b3JrSWQ6IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRGcmFtZXdvcmtJZCgpLFxuICAgICAgICAgICAgICBzZWxlY3RlZHBhcmVudHM6IHRoaXMuaGVpZ2h0TGlnaHRlZCxcbiAgICAgICAgICAgICAgY29sSW5kZXg6IG5leHRDYXQuaW5kZXgsXG4gICAgICAgICAgICAgIC8vIGNoaWxkcmVuRGF0YTogZGF0YS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJlbnRUZXJtczogc2VsZWN0ZWRUZXJtc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZHRoOiAnODAwcHgnLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2N1c3RvbS1kaWFsb2ctY29udGFpbmVyJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHRvcDogJzUwcHgnIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpYWxvZyA9IHRoaXMuZGlhbG9nLm9wZW4oQ3JlYXRlVGVybUNvbXBvbmVudCwge1xuICAgICAgICAgICAgLy8gZGF0YToge1xuICAgICAgICAgICAgLy8gICBtb2RlOidjcmVhdGUnLFxuICAgICAgICAgICAgLy8gICBjb2x1bW5JbmZvOiBjb2x1bW4sXG4gICAgICAgICAgICAvLyAgIGZyYW1ld29ya0lkOiB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrSWQoKSxcbiAgICAgICAgICAgIC8vICAgc2VsZWN0ZWRwYXJlbnRzOiB0aGlzLmhlaWdodExpZ2h0ZWQsXG4gICAgICAgICAgICAvLyAgIGNvbEluZGV4OiBjb2xJbmRleCxcbiAgICAgICAgICAgIC8vICAgc2VsZWN0ZWRQYXJlbnRUZXJtczogc2VsZWN0ZWRUZXJtc1xuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgIGRhdGE6IHsgXG4gICAgICAgICAgICAgIG1vZGU6J211bHRpLWNyZWF0ZScsXG4gICAgICAgICAgICAgIGNvbHVtbkluZm86IGNvbEluZm8gJiYgY29sSW5mby5sZW5ndGggPyBjb2xJbmZvWzBdIDogW10sXG4gICAgICAgICAgICAgIGZyYW1ld29ya0lkOiB0aGlzLmZyYW1ld29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrSWQoKSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRwYXJlbnRzOiB0aGlzLmhlaWdodExpZ2h0ZWQsXG4gICAgICAgICAgICAgIGNvbEluZGV4OiBuZXh0Q2F0LmluZGV4LFxuICAgICAgICAgICAgICAvLyBjaGlsZHJlbkRhdGE6IGRhdGEuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHNlbGVjdGVkUGFyZW50VGVybXM6IHNlbGVjdGVkVGVybXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aWR0aDogJzgwMHB4JyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICdjdXN0b20tZGlhbG9nLWNvbnRhaW5lcicsXG4gICAgICAgICAgICBwb3NpdGlvbjogeyB0b3A6ICc1MHB4JyB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYoIXJlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNyZWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1B1Ymxpc2ggPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgY29uc3QgZGF0YSAgPSB0aGlzLmZyYW1ld29ya1NlcnZpY2UuY2FyZENsa0RhdGFcbiAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHtcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIGluZGV4OiBuZXh0Q2F0LmluZGV4LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHR5cGU6ICdtdWx0aS1jcmVhdGUnXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKCEocmVzICYmIHJlcy5zdG9wVXBkYXRlKSl7XG4gICAgICAgICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UudXBkYXRlQWZ0ZXJBZGRPckVkaXRTdWJqZWN0KHJlc3BvbnNlRGF0YSlcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5sb2FkZWRbcmVzLnRlcm0uY2F0ZWdvcnldID0gZmFsc2VcbiAgICAgICAgICAvLyB3YWl0XG4gICAgICAgICAgY29uc3QgcGFyZW50Q29sdW1uID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkocmVzLnRlcm1bMF0uY2F0ZWdvcnkpXG4gICAgICAgICAgcmVzLnBhcmVudCA9IG51bGxcbiAgICAgICAgICBpZiAocGFyZW50Q29sdW1uKSB7XG4gICAgICAgICAgICByZXMucGFyZW50ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbi5jb2RlKVxuICAgICAgICAgICAgcmVzLnBhcmVudC5jaGlsZHJlbj8gcmVzLnBhcmVudC5jaGlsZHJlbi5wdXNoKHJlcy50ZXJtWzBdKSA6cmVzLnBhcmVudFsnY2hpbGRyZW4nXSA9IFtyZXMudGVybVswXV1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVGaW5hbExpc3QoeyBzZWxlY3RlZFRlcm06IHJlcy50ZXJtWzBdLCBpc1NlbGVjdGVkOiBmYWxzZSwgcGFyZW50RGF0YTogcmVzLnBhcmVudCwgY29sSW5kZXg6Y29sSW5kZXggfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvcGVuT3JnYW5pemF0aW9uRGlhbG9nKGNvbHVtbjogYW55LCBfaW5kZXg6IGFueSkge1xuICAgIGNvbnN0IHRyZWVMaXN0RGF0YSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5nZXRQcmV2aW91c1NlbGVjdGVkVGVybXMoY29sdW1uLmNvZGUpICAgICBcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKE9yZ0hpZXJhcmNoeUFkZE1vZGFsQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByZXZpb3VzOiB0cmVlTGlzdERhdGEsXG4gICAgICAgIGN1cnJlbnREYXRhOiBjb2x1bW4sXG4gICAgICAgIHNlbGVjdGVkT3JnRGF0YTogdGhpcy5vcmdTZWxlY3RlZERhdGEsXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgICAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICAgICAgcG9zaXRpb246IHsgcmlnaHQ6ICcwJyB9LFxuICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgcGFuZWxDbGFzczogJ3JpZ2h0LXNpZGUtbW9kYWwnLFxuICAgICAgbWF4V2lkdGg6ICcxMDB2dydcbiAgICB9KTtcbiAgICBcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKF9yZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAoX3JlcyAmJiBfcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVUZXJtcyhfcmVzLCBjb2x1bW4pXG4gICAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBsaXN0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmZyYW1ld29ya1NlcnZpY2UubGlzdC52YWx1ZXMoKSlcbiAgfVxuICBcbiAgZHJhd0hlYWRlckxpbmUobGVuOiBudW1iZXIpe1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7Li4uZGVmYXVsdENvbmZpZywuLi5oZWFkZXJMaW5lQ29uZmlnIH1cbiAgICBmb3IobGV0IGk9MTsgaTw9bGVuOyBpKyspe1xuICAgICAgY29uc3Qgc3RhcnRFbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjYm94JHtpfWNvdW50YClcbiAgICAgIGNvbnN0IGVuZEVsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNib3gke2l9SGVhZGVyYClcbiAgICAgIGlmKHN0YXJ0RWxlICYmIGVuZEVsZSkge1xuICAgICAgICBuZXcgTGVhZGVyTGluZShzdGFydEVsZSwgZW5kRWxlLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb2x1bW4oY29sdW1uQ29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJhbWV3b3JrU2VydmljZS5saXN0LmdldChjb2x1bW5Db2RlKVxuICB9XG4gIFxuICBuZXdDb25uZWN0aW9uKCkgeyBcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENvbm5lY3RvckNvbXBvbmVudCwge1xuICAgICAgZGF0YToge30sXG4gICAgICB3aWR0aDogJzkwJScsXG4gICAgICAvLyBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInIFxuICAgIH0pXG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IElDb25uZWN0aW9uVHlwZSkgPT4ge1xuICAgICAgaWYgKChyZXMuc291cmNlID09PSAnb25saW5lJyAmJiByZXMuZGF0YS5lbmRwb2ludCkgfHwgKHJlcy5zb3VyY2UgPT09ICdvZmZsaW5lJykpIHtcbiAgICAgICAgdGhpcy5sb2NhbFN2Yy5sb2NhbFN0b3JhZ2UgPSByZXNcbiAgICAgICAgdGhpcy5pbml0KClcbiAgICAgIH0gZWxzZSBpZiAocmVzLnNvdXJjZSA9PT0gJ29ubGluZScgJiYgIXJlcy5kYXRhLmVuZHBvaW50KSB7XG4gICAgICAgIHRoaXMubG9jYWxTdmMubG9jYWxTdG9yYWdlID0gcmVzXG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZURyYWZ0U3RhdHVzVGVybXMoZXZlbnQ6IGFueSl7XG4gICAgaWYoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5kcmFmdFRlcm1zLnB1c2goZXZlbnQudGVybSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYWZ0VGVybXMgPSB0aGlzLmRyYWZ0VGVybXMuZmlsdGVyKGQgPT4gZXZlbnQudGVybS5pZGVudGlmaWVyICE9PSBkLmlkZW50aWZpZXIpXG4gICAgfVxuICAgIHRoaXMuc2hvd0FjdGlvbkJhciA9IHRoaXMuZHJhZnRUZXJtcy5sZW5ndGg+MD90cnVlOmZhbHNlXG4gIH1cblxuICBnZXROb09mQ2FyZHMoZXZlbnQ6YW55KSB7XG4gICAgaWYodGhpcy5jYXRlZ29yeUxpc3QubGVuZ3RoID4gMCAmJiBldmVudC5jYXRlZ29yeSAhPT0gJycpIHtcbiAgICAgIGxldCBpbmRleCA9IHRoaXMuY2F0ZWdvcnlMaXN0LmZpbmRJbmRleCgob2JqOmFueSkgPT4gb2JqLmNhdGVnb3J5ID09IGV2ZW50LmNhdGVnb3J5KTtcbiAgICAgIGlmKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5jYXRlZ29yeUxpc3Quc3BsaWNlKGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZXZlbnQuY2F0ZWdvcnkgPT0gJycpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcnlMaXN0W3RoaXMuY2F0ZWdvcnlMaXN0Lmxlbmd0aC0xXS5jb3VudCA9IDA7XG4gICAgfVxuICAgIHRoaXMuY2F0ZWdvcnlMaXN0LnB1c2goZXZlbnQpO1xuICB9XG4gIFxuICBnZXRDb3VudChjb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDBcbiAgICBpZiAodGhpcy5jYXRlZ29yeUxpc3QpIHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5ID0gdGhpcy5jYXRlZ29yeUxpc3QuZmluZCgoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnkuY2F0ZWdvcnkgPT09IGNvZGUpXG4gICAgICBjb3VudCA9IGNhdGVnb3J5ICYmIGNhdGVnb3J5LmNvdW50ID8gY2F0ZWdvcnkuY291bnQgOiAwXG4gICAgfVxuICAgIHJldHVybiBjb3VudFxuICB9XG5cbiAgc2VuZEZvckFwcHJvdmFsKCl7XG4gICAgaWYoIXRoaXMuaXNBcHByb3ZhbFZpZXcpe1xuICAgICAgICBsZXQgcGFyZW50TGlzdDogYW55ID0gW11cbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goZWxlID0+IHtcbiAgICAgICAgICBjb25zdCB0ID0gZWxlLmNoaWxkcmVuLmZpbHRlcigodGVybTogYW55KSA9PiB0ZXJtLnNlbGVjdGVkID09PSB0cnVlKVxuICAgICAgICAgIGlmKHRbMF0pe1xuICAgICAgICAgICAgcGFyZW50TGlzdC5wdXNoKHRbMF0pXG4gICAgICAgICAgfSBcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgIHVwZGF0ZUZpZWxkVmFsdWVzOlsuLi5wYXJlbnRMaXN0LCAuLi50aGlzLmRyYWZ0VGVybXNdXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHByb3ZhbFNlcnZpY2UuY3JlYXRlQXBwcm92YWwocmVxKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZW1vdmVPbGRMaW5lKClcbiAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKCdUZXJtcyBzdWNjZXNzZnVsbHkgc2VudCBmb3IgQXBwcm92YWwuJywgJ2NhbmNlbCcpXG4gICAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VudEZvckFwcHJvdmUuZW1pdCh0aGlzLmRyYWZ0VGVybXMpXG4gICAgfVxuICAgXG4gIH1cblxuICBjbG9zZUFjdGlvbkJhcihfZTphbnkpeyBcbiAgICB0aGlzLnNob3dBY3Rpb25CYXIgPSBmYWxzZTtcbiAgfVxuXG4gIGluaXRDb25maWcoKSB7XG4gICAgaWYodGhpcy5lbnZpcm9ubWVudCl7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UudXBkYXRlRW52aXJvbm1lbnQodGhpcy5lbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2Uuc2V0Q29uZmlnKHRoaXMudGF4b25vbXlDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgICB0aGlzLmZyYW1ld29ya1NlcnZpY2UucmVtb3ZlT2xkTGluZSgpO1xuICAgICAgLy8gdGhpcy5lbnZpcm9ubWVudCA9IG51bGxcbiAgICAgIC8vIHRoaXMuZnJhbWV3b3JrU2VydmljZS5yZXNldEFuZEZyZXNoKClcbiAgICAgIC8vIHRoaXMuY29ubmVjdG9yU3ZjLnJlbW92ZUFsbExpbmVzKClcbiAgICAgIC8vIHRoaXMuY29ubmVjdG9yU3ZjLnVwZGF0ZUNvbm5lY3RvcnNNYXAoe30pXG4gIH1cblxuICBnZXROZXh0Q2F0KGRhdGE6IGFueSkge1xuICAgIGlmKGRhdGEgICYmIGRhdGEuY29kZSl7XG4gICAgICBjb25zdCBuZXh0Q2F0ID0gdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmdldE5leHRDYXRlZ29yeShkYXRhLmNvZGUpXG4gICAgICByZXR1cm4gbmV4dENhdFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaXNDdXJyZW50T3JOZXh0VGVybShfY29sdW1uOiBhbnksIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VsZWN0aW9uLCBvbmx5IGVuYWJsZSB0aGUgZmlyc3QgY29sdW1uXG4gICAgaWYgKCF0aGlzLmZyYW1ld29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi52YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY2F0ZWdvcnkgZnJvbSB0aGUgY3VycmVudFNlbGVjdGlvblxuICAgIGNvbnN0IGN1cnJlbnRDYXRlZ29yeSA9IHRoaXMuZnJhbWV3b3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLnZhbHVlLnR5cGU7XG4gICAgaWYgKCFjdXJyZW50Q2F0ZWdvcnkpIHtcbiAgICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgYWN0aXZlIGNvbHVtblxuICAgIGxldCBjdXJyZW50SW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMubGlzdFtpXS5jb2RlID09PSBjdXJyZW50Q2F0ZWdvcnkpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgdGhlIGN1cnJlbnQgaW5kZXgsIG9ubHkgZW5hYmxlIHRoZSBmaXJzdCBjb2x1bW5cbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbmFibGUgdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGUgbmV4dCBvbmVcbiAgICByZXR1cm4gaW5kZXggPT09IGN1cnJlbnRJbmRleCB8fCBpbmRleCA9PT0gY3VycmVudEluZGV4ICsgMTtcbiAgfVxuXG4gIHNob3VsZFNob3dTdmdCb3JkZXJXcmFwcGVyKGNvbHVtbjogYW55LCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGluZGV4KSAmJiB0aGlzLmdldENvdW50KGNvbHVtbi5jb2RlKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNyZWF0ZVRlcm1zKHNlbGVjdGVkTGlzdDphbnksIGNvbHVtbjphbnkpIHtcbiAgICBjb25zdCBmcmFtZXdvcmtEYXRhID0ge1xuICAgICAgaWQ6IHRoaXMub3JnU2VsZWN0ZWREYXRhLm9yZ0hpZXJhcmNoeUZyYW1ld29ya0lkIHx8ICcnLFxuICAgICAgY2F0ZWdvcnk6IGNvbHVtbi5jb2RlIHx8ICcnLFxuICAgIH1cbiAgICBzZWxlY3RlZExpc3QuZm9yRWFjaChhc3luYyAoZWxlOmFueSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgbmFtZTogZWxlLm9yZ05hbWUgfHwgJycsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBlbGUuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICAgIGNvZGU6IHV1aWR2NCgpLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IGVsZS5taW5pc3RyeU9yU3RhdGVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICBwYXJlbnRPcmdOYW1lOiBlbGUubWluaXN0cnlPclN0YXRlTmFtZSB8fCAnJyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcmVhdGVUcmVtc1JlczphbnkgPSBhd2FpdCB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuY3JlYXRlVGVybShyZXF1ZXN0Qm9keSwgZnJhbWV3b3JrRGF0YSkudG9Qcm9taXNlKCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBjcmVhdGluZyB0ZXJtJywgZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGNyZWF0ZVRyZW1zUmVzICYmIGNyZWF0ZVRyZW1zUmVzLnJlc3VsdCAmJiBjcmVhdGVUcmVtc1Jlcy5yZXN1bHQubm9kZV9pZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlQXNzb2NpYXRpb24oY3JlYXRlVHJlbXNSZXMucmVzdWx0Lm5vZGVfaWRbMF0sIGZyYW1ld29ya0RhdGEpO1xuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBc3NvY2lhdGlvbihub2RlSWQ6IHN0cmluZywgZnJhbWV3b3JrRGF0YTogYW55KSB7XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIHRlcm06IHtcbiAgICAgICAgICBhc3NvY2lhdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWRlbnRpZmllcjogbm9kZUlkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gXG4gICAgY29uc3Qgbm9kZUlkUGFydHMgPSBub2RlSWQuc3BsaXQoJ18nKTtcbiAgICBjb25zdCBjb2RlSWQgPSBub2RlSWRQYXJ0c1tub2RlSWRQYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB1cGRhdGVBc3NvY2lhdGlvblJlczphbnkgPSBhd2FpdCB0aGlzLnRyZWVIaWVyYXJjaHlTdmMudXBkYXRlRnJhbWV3b3JrQXNzb2NpYXRpb24ocmVxdWVzdEJvZHksIGZyYW1ld29ya0RhdGEsIGNvZGVJZCkudG9Qcm9taXNlKCkuY2F0Y2goZXJyID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHVwZGF0aW5nIGFzc29jaWF0aW9uJywgZXJyKTtcbiAgICB9KVxuICAgIGlmICh1cGRhdGVBc3NvY2lhdGlvblJlcyAmJiB1cGRhdGVBc3NvY2lhdGlvblJlcy5yZXN1bHQgJiYgdXBkYXRlQXNzb2NpYXRpb25SZXMucmVzdWx0Lm5vZGVfaWQpIHtcbiAgICAgIHRoaXMucHVibGlzaEZyYW1ld29yayhmcmFtZXdvcmtEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaXNoRnJhbWV3b3JrKGZyYW1ld29ya0RhdGE6IGFueSkge1xuICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5wdWJsaXNoRnJlYW1ld29yayhmcmFtZXdvcmtEYXRhKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnB1Ymxpc2hTdGF0dXMpIHtcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgJHtyZXMucmVzdWx0LnB1Ymxpc2hTdGF0dXN9YCwgJ2NhbmNlbCcpO1xuICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oJ0Vycm9yIGluIHB1Ymxpc2hpbmcgZnJhbWV3b3JrJywgJ2NhbmNlbCcpO1xuICAgICAgICB0aGlzLnRyZWVIaWVyYXJjaHlTdmMuc2V0TG9hZGVyU3RhdGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHB1Ymxpc2hpbmcgZnJhbWV3b3JrJywgZXJyKTtcbiAgICAgIHRoaXMudHJlZUhpZXJhcmNoeVN2Yy5zZXRMb2FkZXJTdGF0ZShmYWxzZSk7XG4gICAgfSk7XG4gIH1cbn0iLCI8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBjb25uZWN0aW9uU2V0dGluZ3NcIj5cbiAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiYWNjZW50XCIgKGNsaWNrKT1cIm5ld0Nvbm5lY3Rpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24+e3thcHBfc3RyaW5ncy5idWlsZH19PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbjwvZGl2PiAtLT5cblxuPGRpdiAqbmdJZj1cImxpc3QgJiYgbGlzdC5sZW5ndGggPiAwXCIgY2xhc3M9XCJmbGV4IGhlaWdodEZpeCBvdmVyZmxvdy1jb250YWluZXJcIiBpZD1cInRyZWVWaWV3Q29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGxpc3Q7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmVseC1jb2wgIGNvbC1jb250YWluZXIgY29udGFpbmVyc3t7bGlzdC5sZW5ndGh9fVwiIGlkPVwiYm94e3tpKzF9fUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRpbmctc3RpY2t5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRpbmctY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NhdGVnb3J5LWhlYWRlcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyLWl0ZW1zIHctZnVsbFwiIGlkPVwiYm94e3tpfX1IZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uPy5jb25maWc/Lmljb25FbmFibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uY29uZmlnLmNvbG9yfVwiPnt7Y29sdW1uLmNvbmZpZy5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC0xIG1hdC1ib2R5LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e2NvbHVtbi5uYW1lfX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29sdW1uPy5jb25maWc/LmNhdGVnb3J5RGlzcGxheU5hbWUgfHwgY29sdW1uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgIT0gMCAmJiBjYXRlZ29yeUxpc3Q/Lmxlbmd0aCA+IDA7IGVsc2UgZmlyc3RDb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uaW5kZXggIT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50XCI+KHt7Z2V0Q291bnQoY29sdW1uLmNvZGUpfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZpcnN0Q29sdW1uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT0gMFwiIGlkPVwiYm94e3tpKzF9fWNvdW50XCIgY2xhc3M9XCJjb3VudFwiPih7e2NvbHVtbi5jaGlsZHJlbi5sZW5ndGh9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGNsYXNzPVwiXCIgKm5nSWY9XCJjb2x1bW4/LmNvbmZpZz8uY3JlYXRlQnRuRW5hYmxlZCAmJiAhY29sdW1uPy5jb25maWc/LmFkZE9yZ0VuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYWRkLWJ0blwiIFtuZ0NsYXNzXT1cInsnYnV0dG9uLWVuYWJsZWQnOiBjb25maWdDb2RlQnRuPT0gY29sdW1uPy5jb2RlLCAnYnV0dG9uLWRpc2FibGVkJzogY29uZmlnQ29kZUJ0biE9PSBjb2x1bW4/LmNvZGV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ3JlYXRlVGVybURpYWxvZyhjb2x1bW4sIGkpXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWFyZ2luLXJlbW92ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuYWRkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4/LmNvbmZpZz8uYWRkT3JnRW5hYmxlZCAmJiAhY29sdW1uPy5jb25maWc/LmNyZWF0ZUJ0bkVuYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYWRkLWJ0blwiIChjbGljayk9XCJvcGVuT3JnYW5pemF0aW9uRGlhbG9nKGNvbHVtbiwgaSlcIiB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYnV0dG9uLWVuYWJsZWQnOiBpc0N1cnJlbnRPck5leHRUZXJtKGNvbHVtbiwgaSksICdidXR0b24tZGlzYWJsZWQnOiAhaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGkpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWFyZ2luLXJlbW92ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuYWRkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvd1wiIGlkPVwiYm94e3tpKzF9fWNvdW50XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFB1dCBzZWFyY2ggYnV0dG9uIGhlcmUgaW4gZnV0dXJlXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSB7e2NvbHVtbi5jb2RlfX0gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFkZGluZy14MiBjYXQtY29sdW1ucyBjb250YWluZXItYm94XCIgaWQ9XCJib3h7e2krMX19XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbj8uY2hpbGRyZW4gJiYgY29sdW1uPy5jaGlsZHJlbi5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItdHJlZS1jb2x1bW4tdmlldyAqbmdJZj1cImxvYWRlZFtjb2x1bW4uY29kZV1cIiAjc2VsZWN0ZWRUYXhvbm9teVRlcm0gW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICBbY29udGFpbmVySWRdPVwiJ2JveCcrKGkrMSlcIiAodXBkYXRlVGF4b25vbXlUZXJtKT1cInVwZGF0ZVRheG9ub215VGVybSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZVRlcm1MaXN0KT1cInVwZGF0ZURyYWZ0U3RhdHVzVGVybXMoJGV2ZW50KVwiIChjYXJkc0NvdW50KT1cImdldE5vT2ZDYXJkcygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9saWItdHJlZS1jb2x1bW4tdmlldz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkU2hvd1N2Z0JvcmRlcldyYXBwZXIoY29sdW1uLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWJvcmRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzFCMjEzMzUyXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCIyMCwgMTBcIiByeD1cIjEwXCIgcnk9XCIxMFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQgZmxleCBmbGV4LWNvbCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJmcmFjLW5vLWNvbm5lY3Rpb25cIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e2lzTG9hZGluZ319IFNlbGVjdCBhbiBvcmdhbml6YXRpb24gdG8gYWRkIG9yIHNlZSBmdXJ0aGVyIGNvbm5lY3Rpb25zPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJhZGQtYnRuXCIgKGNsaWNrKT1cIm9wZW5Pcmdhbml6YXRpb25EaWFsb2coY29sdW1uLCBpKVwiIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2J1dHRvbi1lbmFibGVkJzogaXNDdXJyZW50T3JOZXh0VGVybShjb2x1bW4sIGkpLCAnYnV0dG9uLWRpc2FibGVkJzogIWlzQ3VycmVudE9yTmV4dFRlcm0oY29sdW1uLCBpKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXJnaW4tcmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmFkZH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxpYi1hY3Rpb24tYmFyICpuZ0lmPVwic2hvd0FjdGlvbkJhclwiIFthY3Rpb25UeXBlXT1cImlzQXBwcm92YWxWaWV3XCIgW2NvbmZpZ1R5cGVdPVwid29ya0Zsb3dTdGF0dXNcIlxuICAgICAgICAoc2VuZEFwcHJvdmFsKT1cInNlbmRGb3JBcHByb3ZhbCgpXCIgKGNsb3NlQWN0aW9uKT1cImNsb3NlQWN0aW9uQmFyKCRldmVudClcIj48L2xpYi1hY3Rpb24tYmFyPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiIShsaXN0ICYmIGxpc3QubGVuZ3RoID4gMCApICYmIGlzRnJhd29ya0xvYWRpbmdcIiBjbGFzcz1cImZsZXggaGVpZ2h0Rml4IFwiPlxuICAgIDxoMSBpMThuPnt7YXBwX3N0cmluZ3MubG9hZGluZ319PC9oMT5cbjwvZGl2PiJdfQ==
|