@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.
Files changed (122) hide show
  1. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +710 -189
  2. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
  3. package/index.d.ts +1052 -3
  4. package/index.d.ts.map +1 -0
  5. package/package.json +13 -15
  6. package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
  7. package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -42
  8. package/esm2022/lib/components/approval/approval.component.mjs +0 -20
  9. package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -65
  10. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -45
  11. package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -56
  12. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -75
  13. package/esm2022/lib/components/connector/connector.component.mjs +0 -60
  14. package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -84
  15. package/esm2022/lib/components/create-term/create-term.component.mjs +0 -848
  16. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -825
  17. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -224
  18. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -65
  19. package/esm2022/lib/components/term-card/term-card.component.mjs +0 -343
  20. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -357
  21. package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -862
  22. package/esm2022/lib/constants/app-constant.mjs +0 -40
  23. package/esm2022/lib/constants/data.mjs +0 -6972
  24. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -93
  25. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -15
  26. package/esm2022/lib/labels/strings.mjs +0 -40
  27. package/esm2022/lib/models/approval.model.mjs +0 -2
  28. package/esm2022/lib/models/connection-type.model.mjs +0 -2
  29. package/esm2022/lib/models/connection.model.mjs +0 -2
  30. package/esm2022/lib/models/framework.model.mjs +0 -2
  31. package/esm2022/lib/models/variable-type.model.mjs +0 -2
  32. package/esm2022/lib/pipes/order-by.pipe.mjs +0 -36
  33. package/esm2022/lib/services/approval.service.mjs +0 -48
  34. package/esm2022/lib/services/connection.service.mjs +0 -3
  35. package/esm2022/lib/services/connector.service.mjs +0 -287
  36. package/esm2022/lib/services/framework.service.mjs +0 -532
  37. package/esm2022/lib/services/local-connection.service.mjs +0 -76
  38. package/esm2022/lib/services/odcs.service.mjs +0 -24
  39. package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -44
  40. package/esm2022/lib/tree-hierarchy.component.mjs +0 -25
  41. package/esm2022/lib/tree-hierarchy.module.mjs +0 -146
  42. package/esm2022/lib/tree-hierarchy.service.mjs +0 -62
  43. package/esm2022/material.module.mjs +0 -200
  44. package/esm2022/public-api.mjs +0 -9
  45. package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
  46. package/lib/components/action-bar/action-bar.component.d.ts +0 -17
  47. package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
  48. package/lib/components/approval/approval.component.d.ts +0 -10
  49. package/lib/components/approval/approval.component.d.ts.map +0 -1
  50. package/lib/components/approve-view/approve-view.component.d.ts +0 -27
  51. package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
  52. package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
  53. package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
  54. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
  55. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
  56. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
  57. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
  58. package/lib/components/connector/connector.component.d.ts +0 -23
  59. package/lib/components/connector/connector.component.d.ts.map +0 -1
  60. package/lib/components/create-categories/create-categories.component.d.ts +0 -26
  61. package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
  62. package/lib/components/create-term/create-term.component.d.ts +0 -148
  63. package/lib/components/create-term/create-term.component.d.ts.map +0 -1
  64. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
  65. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
  66. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
  67. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
  68. package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
  69. package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
  70. package/lib/components/term-card/term-card.component.d.ts +0 -54
  71. package/lib/components/term-card/term-card.component.d.ts.map +0 -1
  72. package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -57
  73. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
  74. package/lib/components/tree-view/tree-view.component.d.ts +0 -103
  75. package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
  76. package/lib/constants/app-constant.d.ts +0 -44
  77. package/lib/constants/app-constant.d.ts.map +0 -1
  78. package/lib/constants/data.d.ts +0 -117
  79. package/lib/constants/data.d.ts.map +0 -1
  80. package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
  81. package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
  82. package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
  83. package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
  84. package/lib/labels/strings.d.ts +0 -40
  85. package/lib/labels/strings.d.ts.map +0 -1
  86. package/lib/models/approval.model.d.ts +0 -11
  87. package/lib/models/approval.model.d.ts.map +0 -1
  88. package/lib/models/connection-type.model.d.ts +0 -6
  89. package/lib/models/connection-type.model.d.ts.map +0 -1
  90. package/lib/models/connection.model.d.ts +0 -7
  91. package/lib/models/connection.model.d.ts.map +0 -1
  92. package/lib/models/framework.model.d.ts +0 -89
  93. package/lib/models/framework.model.d.ts.map +0 -1
  94. package/lib/models/variable-type.model.d.ts +0 -46
  95. package/lib/models/variable-type.model.d.ts.map +0 -1
  96. package/lib/pipes/order-by.pipe.d.ts +0 -10
  97. package/lib/pipes/order-by.pipe.d.ts.map +0 -1
  98. package/lib/services/approval.service.d.ts +0 -21
  99. package/lib/services/approval.service.d.ts.map +0 -1
  100. package/lib/services/connection.service.d.ts +0 -4
  101. package/lib/services/connection.service.d.ts.map +0 -1
  102. package/lib/services/connector.service.d.ts +0 -18
  103. package/lib/services/connector.service.d.ts.map +0 -1
  104. package/lib/services/framework.service.d.ts +0 -89
  105. package/lib/services/framework.service.d.ts.map +0 -1
  106. package/lib/services/local-connection.service.d.ts +0 -18
  107. package/lib/services/local-connection.service.d.ts.map +0 -1
  108. package/lib/services/odcs.service.d.ts +0 -11
  109. package/lib/services/odcs.service.d.ts.map +0 -1
  110. package/lib/tree-hierarchy-routing.module.d.ts +0 -8
  111. package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
  112. package/lib/tree-hierarchy.component.d.ts +0 -13
  113. package/lib/tree-hierarchy.component.d.ts.map +0 -1
  114. package/lib/tree-hierarchy.module.d.ts +0 -33
  115. package/lib/tree-hierarchy.module.d.ts.map +0 -1
  116. package/lib/tree-hierarchy.service.d.ts +0 -22
  117. package/lib/tree-hierarchy.service.d.ts.map +0 -1
  118. package/material.module.d.ts +0 -52
  119. package/material.module.d.ts.map +0 -1
  120. package/public-api.d.ts +0 -9
  121. package/public-api.d.ts.map +0 -1
  122. package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
@@ -1,848 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
3
- import { startWith, map } from 'rxjs/operators';
4
- import { Validators } from '@angular/forms';
5
- import * as appConstants from '../../constants/app-constant';
6
- import { labels } from '../../labels/strings';
7
- import * as _ from 'lodash';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/material/legacy-dialog";
10
- import * as i2 from "../../services/framework.service";
11
- import * as i3 from "@angular/forms";
12
- import * as i4 from "../../services/odcs.service";
13
- import * as i5 from "@angular/material/legacy-snack-bar";
14
- import * as i6 from "@angular/common";
15
- import * as i7 from "@angular/material/autocomplete";
16
- import * as i8 from "@angular/material/core";
17
- import * as i9 from "@angular/material/button";
18
- import * as i10 from "@angular/material/dialog";
19
- import * as i11 from "@angular/material/expansion";
20
- import * as i12 from "@angular/material/icon";
21
- import * as i13 from "@angular/material/input";
22
- import * as i14 from "@angular/material/form-field";
23
- import * as i15 from "@angular/cdk/text-field";
24
- import * as i16 from "@angular/material/progress-spinner";
25
- import * as i17 from "@angular/material/radio";
26
- import * as i18 from "@angular/material/select";
27
- import * as i19 from "@angular/material/tooltip";
28
- class CreateTermComponent {
29
- constructor(dialogRef, data, frameWorkService, fb, odcsService, _snackBar, cdr) {
30
- this.dialogRef = dialogRef;
31
- this.data = data;
32
- this.frameWorkService = frameWorkService;
33
- this.fb = fb;
34
- this.odcsService = odcsService;
35
- this._snackBar = _snackBar;
36
- this.cdr = cdr;
37
- this.name = '';
38
- this.termLists = [];
39
- this.createThemeForm = this.fb.group({});
40
- this.createThemeFormMulti = this.fb.group({});
41
- this.disableCreate = false;
42
- this.disableUpdate = false;
43
- this.disableMultiCreate = false;
44
- this.isTermExist = false;
45
- this.selectedTerm = {};
46
- this.app_strings = labels;
47
- this.colCode = '';
48
- this.savedDesignations = [];
49
- this.addedDesignationCount = 0;
50
- this.designationsList = [];
51
- this.panelOpenState = [];
52
- this.allCompetency = [];
53
- this.allCompetencyTheme = [];
54
- this.filteredallCompetencyTheme = [];
55
- this.allCompetencySubtheme = [];
56
- this.filteredallCompetencySubTheme = [];
57
- this.competencyForm = this.fb.group({});
58
- this.compLabeltext = '';
59
- this.masterList = [];
60
- this.filteredMasterList = [];
61
- this.expansionTitle = '';
62
- this.debounceDelay = 500;
63
- this.values = '';
64
- this.toolTipText = `You can customize this display name for learners to see, as it's what they will view.`;
65
- this.previousCategoryCode = '';
66
- this.previousTermCode = '';
67
- this.previousCatCode = '';
68
- this.previousTermCatCode = '';
69
- this.selectedTermArray = [];
70
- this.getKcmSearch();
71
- }
72
- ngOnInit() {
73
- this.termLists = this.data.columnInfo.children;
74
- this.compLabeltext = this.data.columnInfo.config.labelName;
75
- this.initTermForm();
76
- }
77
- ngAfterViewInit() {
78
- this.cdr.detectChanges();
79
- }
80
- initTermForm() {
81
- this.createTermForm = this.fb.group({
82
- name: ['', [Validators.required]],
83
- description: ['']
84
- });
85
- this.createThemeForm = this.fb.group({
86
- name: ['', [Validators.required]],
87
- dname: [{ value: '', disabled: true }, [Validators.required]],
88
- description: ['']
89
- });
90
- this.createThemeFormMulti = this.fb.group({
91
- themeFields: this.fb.array([this.createThemeFields()])
92
- });
93
- this.filtedTermLists = this.createTermForm.get('name').valueChanges.pipe(startWith(''), map(value => {
94
- if (value && this.createTermForm.controls.dname) {
95
- this.createTermForm.controls.dname.enable();
96
- }
97
- else if (this.createTermForm.controls.dname) {
98
- this.createTermForm.controls.dname.disable();
99
- }
100
- return this._filter(value || '');
101
- }));
102
- if (this.data &&
103
- (this.data.mode === 'view')) {
104
- switch (this.data.columnInfo.code) {
105
- case 'theme':
106
- this.updateFormView(this.createThemeForm, this.data);
107
- break;
108
- case 'subtheme':
109
- this.updateFormView(this.createThemeForm, this.data);
110
- break;
111
- default:
112
- this.updateFormView(this.createThemeForm, this.data);
113
- break;
114
- }
115
- this.disableCreate = true;
116
- }
117
- else if (this.data &&
118
- (this.data.mode === 'edit')) {
119
- switch (this.data.columnInfo.code) {
120
- case 'theme':
121
- this.updateFormEdit(this.createThemeForm, this.data);
122
- break;
123
- case 'subtheme':
124
- this.updateFormEdit(this.createThemeForm, this.data);
125
- break;
126
- default:
127
- this.updateFormEdit(this.createThemeForm, this.data);
128
- break;
129
- }
130
- }
131
- else if (this.data &&
132
- (this.data.mode === 'multi-create')) {
133
- }
134
- }
135
- getComptencyData() {
136
- }
137
- get themeFields() {
138
- return this.createThemeFormMulti.get('themeFields');
139
- }
140
- get themeFieldsControls() {
141
- const themeFields = this.createThemeFormMulti.get('themeFields');
142
- return themeFields['controls'];
143
- }
144
- createThemeFields() {
145
- return this.fb.group({
146
- name: ['', [Validators.required]],
147
- dname: [{ value: '', disabled: true }, [Validators.required]],
148
- description: ['',]
149
- });
150
- }
151
- addThemeFields() {
152
- this.values = '';
153
- this.filteredMasterList = [...this.masterList];
154
- if (this.data.mode === 'multi-create') {
155
- this.themeFields.insert(0, this.createThemeFields());
156
- }
157
- }
158
- removeThemeFields(index) {
159
- if (this.data.mode === 'multi-create') {
160
- this.themeFields.removeAt(index);
161
- }
162
- }
163
- getCreateName(name) {
164
- switch (name) {
165
- case 'Theme':
166
- return `Add Competency ${name}`;
167
- case 'Sub Theme':
168
- return `Add Competency ${name}`;
169
- default:
170
- return `Add ${name}`;
171
- }
172
- }
173
- getCategoryName(categoryName, term) {
174
- this.previousCategoryCode = categoryName;
175
- this.previousTermCode = term.code;
176
- switch (categoryName) {
177
- case 'competencyarea':
178
- return 'Competency Area';
179
- case 'theme':
180
- return 'Competency Theme';
181
- case 'subtheme':
182
- return 'Competency Sub Theme';
183
- default:
184
- return categoryName;
185
- }
186
- }
187
- getName(item) {
188
- return item.toUpperCase();
189
- }
190
- getLabelName(labelName) {
191
- switch (labelName) {
192
- case 'Theme':
193
- return `Competency ${labelName} name`;
194
- case 'Sub Theme':
195
- return `Competency ${labelName} name`;
196
- default:
197
- return labelName;
198
- }
199
- }
200
- createCompThemeFields() {
201
- return this.fb.group({
202
- competencyTheme: ['', [Validators.required]],
203
- competencySubTheme: ['', [Validators.required]]
204
- });
205
- }
206
- addCompetencyTheme() {
207
- if (this.data.mode === 'multi-create') {
208
- this.compThemeFields.push(this.createCompThemeFields());
209
- }
210
- }
211
- removeCompFields(index) {
212
- if (this.data.mode === 'multi-create') {
213
- this.compThemeFields.removeAt(index);
214
- }
215
- }
216
- get compThemeFields() {
217
- return this.competencyForm.get('compThemeFields');
218
- }
219
- updateFormView(form, data) {
220
- if (data && data.childrenData && data.childrenData.additionalProperties && data.childrenData.additionalProperties.displayName) {
221
- form.get('dname').patchValue(data.childrenData.additionalProperties.displayName);
222
- }
223
- form.get('description').patchValue(data.childrenData.description);
224
- if (data.childrenData.name && this.masterList.length) {
225
- const assignName = this.masterList.find(option => data.childrenData.refId === option.id);
226
- if (assignName) {
227
- form.controls['name'].setValue(assignName);
228
- }
229
- }
230
- setTimeout(() => {
231
- form.get('name').disable();
232
- form.get('dname').disable();
233
- form.get('description').disable();
234
- });
235
- }
236
- updateFormEdit(form, data) {
237
- form.get('dname').patchValue(data.childrenData.additionalProperties.displayName);
238
- form.get('description').patchValue(data.childrenData.description);
239
- if (data.childrenData.name && this.masterList.length) {
240
- const assignName = this.masterList.find(option => data.childrenData.name === option.title);
241
- if (assignName) {
242
- form.controls['name'].setValue(assignName);
243
- }
244
- }
245
- setTimeout(() => {
246
- form.get('name').disable();
247
- form.get('dname').enable();
248
- });
249
- }
250
- onKey(event) {
251
- clearTimeout(this.debounceTimeout);
252
- this.debounceTimeout = setTimeout(() => {
253
- this.values = event.target.value.toLowerCase();
254
- this.filteredMasterList = this.filterOrgValues(this.values, this.masterList);
255
- }, this.debounceDelay);
256
- }
257
- filterOrgValues(searchValue, array) {
258
- return array.filter((value) => value.title.toLowerCase().includes(searchValue.toLowerCase()));
259
- }
260
- getKcmSearch() {
261
- const requestObj = {
262
- filterCriteriaMap: {
263
- status: "Live",
264
- isActive: true
265
- },
266
- requestedFields: [],
267
- pageNumber: 0,
268
- pageSize: 1000
269
- };
270
- this.frameWorkService.getKcmSearchList(requestObj, this.data.columnInfo.code).subscribe((response) => {
271
- if (response.data && response.data.length) {
272
- this.masterList = response.data;
273
- this.filteredMasterList = [...this.masterList];
274
- setTimeout(() => {
275
- if (this.data &&
276
- (this.data.mode === 'edit')) {
277
- this.updateFormEdit(this.createThemeForm, this.data);
278
- }
279
- else if (this.data &&
280
- (this.data.mode === 'view')) {
281
- this.updateFormView(this.createThemeForm, this.data);
282
- }
283
- }, 1000);
284
- }
285
- });
286
- }
287
- onDisableTheme(option) {
288
- let parentCol;
289
- const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
290
- if (parentColumnConfigData) {
291
- parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
292
- }
293
- let result = -1;
294
- if (parentCol && parentCol.children && parentCol.children.length) {
295
- result = parentCol.children.findIndex((ele) => {
296
- if ((ele.refType === 'theme' || ele.refType === 'subtheme')) {
297
- return ele.name.toLowerCase() === option.title.toLowerCase();
298
- }
299
- return false;
300
- });
301
- }
302
- if (result < 0) {
303
- let formArray = this.createThemeFormMulti.get('themeFields');
304
- result = formArray.value.findIndex((formEle) => {
305
- if (formEle.name && formEle.name.id) {
306
- return formEle.name.id === option.id;
307
- }
308
- return false;
309
- });
310
- }
311
- return result >= 0 ? true : false;
312
- }
313
- multiCreate(form, _data) {
314
- this.disableMultiCreate = true;
315
- let counter = 0;
316
- let createdTerms = [];
317
- if (form.valid) {
318
- const themeFields = form && form.value && form.value.themeFields;
319
- if (themeFields && themeFields.length) {
320
- themeFields.forEach((val, _i) => {
321
- const term = {
322
- code: this.frameWorkService.getUuid(),
323
- name: _.get(val, 'name.title'),
324
- description: val.description,
325
- category: this.data.columnInfo.code,
326
- status: appConstants.LIVE,
327
- refId: val.name.id,
328
- refType: this.data.columnInfo.code,
329
- parents: [
330
- { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
331
- ],
332
- additionalProperties: {
333
- displayName: val.dname,
334
- timeStamp: new Date().getTime(),
335
- }
336
- };
337
- const requestBody = {
338
- request: {
339
- term: term
340
- }
341
- };
342
- this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).subscribe((res) => {
343
- requestBody.request.term['identifier'] = res.result.node_id[0];
344
- createdTerms.push(requestBody.request.term);
345
- counter++;
346
- if (counter === themeFields.length) {
347
- const parentColumn = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
348
- let parentCol = this.frameWorkService.selectionList.get(parentColumn.code);
349
- this.updateTermAssociationsMultiV2(createdTerms, parentCol);
350
- }
351
- });
352
- });
353
- this.disableMultiCreate = true;
354
- }
355
- }
356
- }
357
- async updateTermAssociationsMulti(createdTerms) {
358
- let parent;
359
- if (createdTerms && createdTerms.length) {
360
- let createdTermsCounter = 0;
361
- for (let createdTerm of createdTerms) {
362
- this.selectedTerm = createdTerm;
363
- let associations = [];
364
- let temp;
365
- let counter = 0;
366
- for (const [value] of this.frameWorkService.selectionList) {
367
- parent = value;
368
- counter++;
369
- temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
370
- associations = parent.children ? parent.children.map((c) => {
371
- return c.identifier ? { identifier: c.identifier } : null;
372
- }) : [];
373
- if (temp && temp.length) {
374
- this.isTermExist = true;
375
- return;
376
- }
377
- else {
378
- associations.push({ identifier: this.selectedTerm.identifier });
379
- this.isTermExist = false;
380
- const reguestBody = {
381
- request: {
382
- term: {
383
- ...(associations && associations.length) ? { associations: [...associations] } : null,
384
- }
385
- }
386
- };
387
- await this.callUpdateAssociations(counter, parent, reguestBody);
388
- }
389
- }
390
- createdTermsCounter++;
391
- if (createdTermsCounter === createdTerms.length) {
392
- this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parent, createdTerms);
393
- this.dialogClose({ term: [this.selectedTerm], created: true, multi: true });
394
- this.disableMultiCreate = false;
395
- if (createdTerms[0].category === 'theme') {
396
- this._snackBar.open(`Competency ${createdTerms[0].category} created successfully.`);
397
- }
398
- if (createdTerms[0].category === 'subtheme') {
399
- this._snackBar.open(`Competency ${createdTerms[0].category} created successfully.`);
400
- }
401
- }
402
- }
403
- }
404
- }
405
- callUpdateAssociations(counter, parent, reguestBody) {
406
- return new Promise((resolve) => {
407
- this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(() => {
408
- parent['children'] = parent && parent.children ? [...parent.children, ...[this.selectedTerm]] : [this.selectedTerm];
409
- if (counter === this.frameWorkService.selectionList.size) {
410
- this.disableUpdate = false;
411
- resolve(true);
412
- }
413
- else {
414
- return resolve(true);
415
- }
416
- }, (_err) => {
417
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
418
- });
419
- });
420
- }
421
- updateDname(_name, _form, _i) {
422
- }
423
- change(event, form, i) {
424
- if (this.data && this.data.mode) {
425
- if (this.data.mode === 'create') {
426
- form.get('dname').patchValue(event.source.value.title);
427
- this.expansionTitle = event.source.value.title;
428
- this.cdr.detectChanges();
429
- }
430
- if (this.data.mode === 'multi-create') {
431
- const formToUpdate = form.controls.themeFields.controls[i];
432
- formToUpdate.controls['dname'].patchValue(event.source.value.title);
433
- this.expansionTitle = event.source.value.title;
434
- this.cdr.detectChanges();
435
- if (formToUpdate.controls.name.valid && formToUpdate.controls.dname) {
436
- formToUpdate.controls.dname.enable();
437
- }
438
- else if (formToUpdate.controls.dname) {
439
- formToUpdate.controls.dname.disable();
440
- }
441
- }
442
- }
443
- }
444
- getExpansionTitle(form) {
445
- const details = form.get('name').value;
446
- return _.get(details, 'title', '');
447
- }
448
- get designationControls() {
449
- return this.createThemeForm.get('designations').controls;
450
- }
451
- loadDesignations() {
452
- this.odcsService.getDesignations({}).subscribe((data) => {
453
- this.designationsList = data.responseData;
454
- }, (_err) => {
455
- });
456
- }
457
- getFilteredDesignationList(index) {
458
- const filterKey = this.createThemeForm.value.designations[index].name.toLowerCase();
459
- if (filterKey && this.designationsList) {
460
- const filteredList = this.designationsList.filter((designation) => designation.name.toLowerCase().includes(filterKey));
461
- return filteredList;
462
- }
463
- return [];
464
- }
465
- addDesignation() {
466
- const newDesignation = this.fb.group({
467
- name: ['', Validators.required],
468
- id: [null, Validators.required],
469
- designationDescription: ['', [Validators.required, Validators.maxLength(600)]],
470
- isSaved: [false],
471
- creationId: this.addedDesignationCount
472
- });
473
- this.addedDesignationCount = this.addedDesignationCount + 1;
474
- this.createThemeForm.get('designations').insert(0, newDesignation);
475
- this.panelOpenState.splice(0, 0, true);
476
- }
477
- clearSelectedDesignaionOnChange(index, event) {
478
- const selectedName = this.createThemeForm.value.designations[index].name;
479
- if (selectedName !== event.value) {
480
- const designationsToReset = this.designationControls[index];
481
- designationsToReset.get('id').reset();
482
- }
483
- }
484
- deleteDesignation(index) {
485
- const reovedCreationId = this.designationControls[index].value.creationId;
486
- this.createThemeForm.get('designations').removeAt(index);
487
- this.savedDesignations = this.savedDesignations.filter((savedDesignation) => savedDesignation.creationId !== reovedCreationId);
488
- }
489
- saveDesignation(index) {
490
- const designations = this.designationControls;
491
- const designationToSave = designations[index];
492
- if (designationToSave.valid) {
493
- designationToSave.value.isSaved = true;
494
- const savedDesignationIndex = this.savedDesignations.findIndex((e) => e.creationId === designationToSave.value.creationId);
495
- if (savedDesignationIndex >= 0) {
496
- this.savedDesignations[savedDesignationIndex] = designationToSave.value;
497
- }
498
- else {
499
- this.savedDesignations.push(designationToSave.value);
500
- }
501
- }
502
- }
503
- submitDesignation() {
504
- }
505
- cancel() {
506
- this.dialogRef.close();
507
- }
508
- get enableAddBtn() {
509
- if (this.colCode === 'designation') {
510
- return this.designationControls.length > 0 ? true : false;
511
- }
512
- return false;
513
- }
514
- _filter(searchTxt) {
515
- let isExist;
516
- this.disableCreate = false;
517
- this.isTermExist = false;
518
- this.createTermForm.get('description').enable();
519
- const filterValue = typeof (searchTxt) === 'object' ? this._normalizeValue(searchTxt.name) : this._normalizeValue(searchTxt);
520
- isExist = this.termLists.filter((term) => this._normalizeValue(term.name).includes(filterValue));
521
- return isExist;
522
- }
523
- _normalizeValue(value) {
524
- return value.toLowerCase().replace(/\s/g, '');
525
- }
526
- onSelectionArea(option) {
527
- this.allCompetency.forEach((val) => {
528
- if (option.name === val.name) {
529
- this.seletedCompetencyArea = val;
530
- this.allCompetencyTheme = val.children;
531
- this.filteredallCompetencyTheme = this.allCompetencyTheme;
532
- }
533
- });
534
- }
535
- OnThemeSelection(event) {
536
- const selectedTheme = event.source.value;
537
- this.filteredallCompetencyTheme.forEach((val) => {
538
- if (selectedTheme.name === val.name) {
539
- this.allCompetencySubtheme = val.children;
540
- this.filteredallCompetencySubTheme = this.allCompetencySubtheme;
541
- }
542
- });
543
- }
544
- onSelect(term, form) {
545
- switch (this.colCode) {
546
- case 'designation':
547
- form.get('name').patchValue(term.value.name);
548
- form.get('id').patchValue(term.value.id);
549
- break;
550
- default:
551
- this.selectedTerm = term.value;
552
- form.get('name').patchValue(term.value.name);
553
- form.get('dname').patch(term.value.dname);
554
- form.get('description').patchValue(term.value.description);
555
- form.get('description').disable();
556
- this.disableCreate = true;
557
- }
558
- }
559
- saveTerm() {
560
- if (this._filter(this.createTermForm.value.name).length > 0) {
561
- this.isTermExist = true;
562
- return;
563
- }
564
- if (this.createTermForm.valid) {
565
- const term = {
566
- code: this.frameWorkService.getUuid(),
567
- name: this.createTermForm.value.name,
568
- description: this.createTermForm.value.description,
569
- category: this.data.columnInfo.code,
570
- status: appConstants.LIVE,
571
- parents: [
572
- { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
573
- ],
574
- additionalProperties: {
575
- displayName: this.createTermForm.value.dname,
576
- timeStamp: new Date().getTime(),
577
- }
578
- };
579
- const requestBody = {
580
- request: {
581
- term: term
582
- }
583
- };
584
- this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).subscribe((res) => {
585
- requestBody.request.term['identifier'] = res.result.node_id[0];
586
- this.dialogClose({ term: requestBody.request.term, created: true });
587
- this.selectedTerm = requestBody.request.term;
588
- this.updateTermAssociations();
589
- });
590
- }
591
- }
592
- updateTermData(form, data) {
593
- let additionalProperties = data.childrenData.additionalProperties;
594
- additionalProperties['displayName'] = this.createThemeForm.value.dname;
595
- form.value.additionalProperties = additionalProperties;
596
- form.value.displayName = form.value.dname;
597
- this.disableUpdate = true;
598
- const formData = {
599
- ...form.value,
600
- };
601
- const updateData = {
602
- formData,
603
- updateTermData: data.childrenData
604
- };
605
- this.updateTermDataAssociations(updateData);
606
- }
607
- updateTermDataAssociations(updateData) {
608
- this.disableMultiCreate = true;
609
- let selectionData = this.frameWorkService.selectionList.get(this.data.columnInfo.code);
610
- if (!selectionData) {
611
- selectionData = this.data.childrenData;
612
- }
613
- const listThme = this.frameWorkService.list.get(this.data.columnInfo.code);
614
- let themAssociations;
615
- if (listThme && listThme.children && listThme.children.length) {
616
- const data = listThme.children.find((c) => c.identifier === selectionData.identifier);
617
- themAssociations = data.associations ? data.associations.map((c) => {
618
- return c.identifier ? { identifier: c.identifier } : null;
619
- }) : [];
620
- }
621
- const reguestBody = {
622
- request: {
623
- term: {
624
- ...updateData.formData,
625
- ...(themAssociations && themAssociations.length) ? { associations: themAssociations } : null,
626
- }
627
- }
628
- };
629
- this.frameWorkService.updateTerm(this.data.frameworkId, selectionData.category, selectionData.code, reguestBody).subscribe(() => {
630
- const value = (this.selectedTerm && this.selectedTerm.identifier) ? this.selectedTerm : (updateData) ? { ...updateData.updateTermData, ...updateData.formData } : {};
631
- this.disableUpdate = false;
632
- selectionData['description'] = reguestBody.request.term.description;
633
- selectionData['additionalProperties'] = reguestBody.request.term.additionalProperties;
634
- selectionData['associations'] = themAssociations;
635
- this._snackBar.open(`Competency ${value.category} updated successfully`);
636
- this.dialogClose({ term: { ...value }, created: true });
637
- this.disableMultiCreate = false;
638
- this.frameWorkService.updateFullTermDataLocalMap(this.data.columnInfo.code, selectionData);
639
- }, (_err) => {
640
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
641
- });
642
- }
643
- updateTermAssociations(updateData) {
644
- let associations = [];
645
- let temp;
646
- let counter = 0;
647
- this.frameWorkService.selectionList.forEach((parent) => {
648
- counter++;
649
- temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
650
- associations = parent.children ? parent.children.map((c) => {
651
- return c.identifier ? { identifier: c.identifier } : null;
652
- }) : [];
653
- if (temp && temp.length) {
654
- this.isTermExist = true;
655
- return;
656
- }
657
- else {
658
- if (this.selectedTerm && this.selectedTerm.identifier) {
659
- associations.push({ identifier: this.selectedTerm.identifier });
660
- }
661
- this.isTermExist = false;
662
- const reguestBody = {
663
- request: {
664
- term: {
665
- ...(updateData && updateData.formData && updateData.updateTermData.code === parent.code) ? { ...updateData.formData } : null,
666
- ...(associations && associations.length) ? { associations: [...associations] } : null,
667
- }
668
- }
669
- };
670
- this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(() => {
671
- if (counter === this.frameWorkService.selectionList.size) {
672
- const value = (this.selectedTerm && this.selectedTerm.identifier) ? this.selectedTerm : (updateData) ? { ...updateData.updateTermData, ...updateData.formData } : {};
673
- this.disableUpdate = false;
674
- this._snackBar.open(`Competency ${value.category} updated successfully`);
675
- this.dialogClose({ term: { ...value }, created: true });
676
- }
677
- }, (_err) => {
678
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
679
- });
680
- }
681
- });
682
- }
683
- saveThemeTerm() {
684
- if (this._filter(this.createThemeForm.value.name).length > 0) {
685
- this.isTermExist = true;
686
- return;
687
- }
688
- if (this.createThemeForm.valid) {
689
- const term = {
690
- code: this.frameWorkService.getUuid(),
691
- name: this.createThemeForm.value.name,
692
- description: this.createThemeForm.value.description,
693
- category: this.data.columnInfo.code,
694
- status: appConstants.LIVE,
695
- parents: [
696
- { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
697
- ],
698
- additionalProperties: {
699
- displayName: this.createTermForm.value.dname,
700
- timeStamp: new Date().getTime(),
701
- }
702
- };
703
- const requestBody = {
704
- request: {
705
- term: term
706
- }
707
- };
708
- this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).subscribe((res) => {
709
- requestBody.request.term['identifier'] = res.result.node_id[0];
710
- this.dialogClose({ term: requestBody.request.term, created: true });
711
- this.selectedTerm = requestBody.request.term;
712
- this.updateTermAssociations();
713
- }, (_err) => {
714
- console.error(`Create ${this.data.columnInfo.name} failed, please try again later`);
715
- });
716
- }
717
- }
718
- dialogClose(term) {
719
- this.frameWorkService.publishFramework().subscribe(() => {
720
- this.dialogRef.close(term);
721
- });
722
- }
723
- async updateTermAssociationsMultiV2(createdTerms, parentSelectedTerm) {
724
- this.selectedTermArray = [];
725
- let createdTermsIdentifiers = [];
726
- this.selectedTermArray = createdTerms;
727
- this.selectedTerm = createdTerms[createdTerms.length - 1];
728
- for (let createdTerm of createdTerms) {
729
- createdTermsIdentifiers.push({ identifier: createdTerm.identifier });
730
- }
731
- let associations = [];
732
- let counter = 0;
733
- if (createdTerms && createdTerms.length) {
734
- let parent;
735
- let createdTermsCounter = 0;
736
- if (!parentSelectedTerm) {
737
- for (let createdTerm of createdTerms) {
738
- this.selectedTerm = createdTerm;
739
- let temp;
740
- for (const [value] of this.frameWorkService.selectionList) {
741
- parent = value;
742
- counter++;
743
- temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
744
- associations = parent.children ? parent.children.map((c) => {
745
- return c.identifier ? { identifier: c.identifier } : null;
746
- }) : [];
747
- if (temp && temp.length) {
748
- this.isTermExist = true;
749
- return;
750
- }
751
- else {
752
- associations.push({ identifier: this.selectedTerm.identifier });
753
- this.isTermExist = false;
754
- const reguestBody = {
755
- request: {
756
- term: {
757
- ...(associations && associations.length) ? { associations: [...associations] } : null,
758
- }
759
- }
760
- };
761
- await this.callUpdateAssociations(counter, parent, reguestBody);
762
- }
763
- }
764
- createdTermsCounter++;
765
- if (createdTermsCounter === createdTerms.length) {
766
- this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parent, createdTerms);
767
- this.dialogClose({ term: [this.selectedTerm], created: true, multi: true });
768
- this.disableMultiCreate = false;
769
- if (createdTerms[0].category === 'theme') {
770
- this._snackBar.open(`Competency ${createdTerms[0].category} created successfully.`);
771
- }
772
- if (createdTerms[0].category === 'subtheme') {
773
- this._snackBar.open(`Competency ${createdTerms[0].category} created successfully.`);
774
- }
775
- }
776
- }
777
- }
778
- else {
779
- const parent = parentSelectedTerm;
780
- associations = parent.children ? parent.children.map((c) => {
781
- return c.identifier ? { identifier: c.identifier } : null;
782
- }) : [];
783
- associations = [...associations, ...createdTermsIdentifiers];
784
- this.isTermExist = false;
785
- const reguestBody = {
786
- request: {
787
- term: {
788
- ...(associations && associations.length) ? { associations: [...associations] } : null,
789
- }
790
- }
791
- };
792
- await this.callUpdateAssociationsV2(counter, parent, reguestBody);
793
- this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parent, createdTerms);
794
- this.dialogClose({ term: this.selectedTermArray, created: true, multi: true });
795
- this.disableMultiCreate = false;
796
- if (createdTerms[0].category === 'theme') {
797
- this._snackBar.open(`Competency ${createdTerms[0].category} created successfully.`);
798
- }
799
- if (createdTerms[0].category === 'subtheme') {
800
- this._snackBar.open(`Competency ${createdTerms[0].category} created successfully.`);
801
- }
802
- }
803
- }
804
- }
805
- async callUpdateAssociationsV2(counter, parent, reguestBody) {
806
- return new Promise((resolve) => {
807
- this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
808
- parent['children'] = parent && parent.children ? [...parent.children, ...this.selectedTermArray] : this.selectedTermArray;
809
- let listData = this.frameWorkService.list.get(this.data.columnInfo.code);
810
- let differenceData = [];
811
- if (listData && listData.children && listData.children.length) {
812
- differenceData = _.differenceBy(this.selectedTermArray, listData.children, 'identifier');
813
- }
814
- else {
815
- differenceData = this.selectedTermArray;
816
- }
817
- listData['associations'] = listData && listData.associations ? [...listData.associations, ...differenceData] : differenceData;
818
- listData['children'] = listData && listData.children ? [...listData.children, ...differenceData] : differenceData;
819
- this.frameWorkService.selectionList.forEach((selectedData) => {
820
- let listData = this.frameWorkService.list.get(selectedData.category);
821
- if (listData && listData.children && listData.children.length) {
822
- this.frameWorkService.updateLocalList(listData, parent, this.selectedTermArray, 'create');
823
- }
824
- });
825
- if (counter === this.frameWorkService.selectionList.size) {
826
- this.disableUpdate = false;
827
- resolve(true);
828
- }
829
- else {
830
- return resolve(true);
831
- }
832
- }, (_err) => {
833
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
834
- });
835
- });
836
- }
837
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FrameworkService }, { token: i3.UntypedFormBuilder }, { token: i4.OdcsService }, { token: i5.MatLegacySnackBar }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
838
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateTermComponent, selector: "lib-create-term", ngImport: i0, template: "<ng-container [ngSwitch]=\"data?.columnInfo?.code || 'defaultCreate'\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'theme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'subtheme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'designation'\" [ngTemplateOutlet]=\"themeDesignation\"></ng-container>\n <ng-container *ngSwitchCase=\"'competency'\" [ngTemplateOutlet]=\"compTheme\"></ng-container>\n</ng-container>\n\n<ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>Add {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name }} </div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title></div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name}}</div>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultCreate>\n <div class=\"dialog\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <form [formGroup]=\"createTermForm\" novalidate (ngSubmit)=\"disableCreate?updateTermAssociations():saveTerm()\"\n class=\"defaultForm\">\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <input matInput formControlName=\"name\" placeholder=\"{{app_strings.name}}\" [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, createTermForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name }}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput formControlName=\"description\" placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"!disableCreate || disableMultiCreate\">{{app_strings.create}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"disableCreate\">{{app_strings.update}}</button>\n </footer>\n </form>\n </div>\n</ng-template>\n\n<ng-template #themeCreate >\n <div class=\"dialogNew\" [ngClass]=\"{'disabled-div': disableMultiCreate}\" >\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{getCategoryName(term.category,term)}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code !== 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeForm)\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeForm)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}}</mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n </mat-select>\n\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n \n <div class=\"flex\">\n\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n </div>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname \n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" >\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code === 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input autocomplete=\"off\" \n matInput [value]=\"data?.childrenData?.name\" disabled>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeFormMulti\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addThemeFields()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n </button>\n </div>\n <mat-accordion formArrayName=\"themeFields\">\n <mat-expansion-panel #mep=\"matExpansionPanel\" *ngFor=\"let field of themeFieldsControls; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{getExpansionTitle(field)}} \n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeThemeFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeFormMulti, i)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n \n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeFormMulti, i )\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeFormMulti, i)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}} </mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n \n </mat-select>\n \n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings?.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <div class=\"flex\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n \n \n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n \n \n \n \n </div>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" [disabled]=\"name?.value?.length === 0\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"flex flex-end\">\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"mep.expanded = false\"\n [disabled]=\"createThemeFormMulti?.get('themeFields')['controls'][i].invalid\">\n Save\n </button>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.add_btn}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.add_btn}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #themeDesignation>\n <div class=\"themDesignation\">\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"mb-2\">\n <span class=\"organisation\">Organisation</span>\n <div class=\"org-name pl-4 flex items-center\">\n <!-- <span>Department of Fisheries</span> -->\n <span>{{data?.columnInfo?.name}}</span>\n </div>\n </div>\n <div class=\"row-divider\"></div>\n <div class=\"flex w-full items-center justify-end mt-4\">\n <a class=\"add-designation flex justify-center items-center\" (click)=\"addDesignation()\">\n <mat-icon class=\"add-icon mr-2\">add_circle_outline</mat-icon>\n <span>Add Designations</span>\n </a>\n </div>\n <div class=\"mt-5\">\n <form [formGroup]=\"createThemeForm\">\n <mat-accordion class=\"flex flex-col gap-2\" formArrayName=\"designations\">\n <ng-container *ngFor=\"let designation of designationControls; let i = index\">\n <mat-expansion-panel [formGroupName]=\"i\" class=\"designation-panel\" [expanded]=\"panelOpenState[i]\">\n <mat-expansion-panel-header>\n <div class=\"flex w-full items-center justify-end\">\n <mat-icon class=\"deletDesignation mr-4\" (click)=\"deleteDesignation(i)\">delete</mat-icon>\n </div>\n </mat-expansion-panel-header>\n <div class=\"flex flex-col gap-2 \">\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Designation Name <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" placeholder=\"Type here\" [matAutocomplete]=\"auto\" (change)=\"clearSelectedDesignaionOnChange(i, $event)\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, designation)\">\n <mat-option *ngFor=\"let option of getFilteredDesignationList(i)\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete>\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n <!-- <mat-error>{{app_strings.alreadyExist}}</mat-error> -->\n </div>\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Description <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <textarea matInput formControlName=\"designationDescription\"\n placeholder=\"Type the decription in fewer than 600 characters\"></textarea>\n </mat-form-field>\n </div>\n \n <div class=\"w-full flex justify-end items-center\">\n <button mat-raised-button class=\"saveDesignaton flex justify-center items-center\"\n (click)=\"saveDesignation(i)\">Save</button>\n </div>\n </div>\n </mat-expansion-panel>\n </ng-container>\n </mat-accordion>\n </form>\n </div>\n </div>\n <div class=\"flex justify-end items-center gap-4 mt-5 designation-footer\">\n <button mat-raised-button class=\"cancel flex justify-center items-center\"\n (click)=\"cancel()\">Cancel</button>\n <button mat-raised-button [disabled]=\"!enableAddBtn\" class=\"addBtn flex justify-center items-center\" (click)=\"submitDesignation()\">Add</button>\n </div>\n </div>\n</ng-template>\n<ng-template #compTheme>\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{term.category}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button class=\"learning-section\" *ngFor=\"let item of allCompetency\" [value]=\"item\" (change)=\"onSelectionArea(item)\">{{item.name}}</mat-radio-button>\n \n </mat-radio-group>\n </div>\n </div>\n \n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Add Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n \n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add {{data.columnInfo.name}}\n </button>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <!-- {{name?.value}} -->\n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Select Competency Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" (onSelectionChange)=\"OnThemeSelection($event)\" >{{option.name}}</mat-option>\n </mat-select>\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <!-- <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n </mat-form-field>\n </div> -->\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Select Competency Sub-Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n \n </div>\n</ng-template>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:0 1rem}.dialogNew .mat-dialog-title{padding:1em;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.info-icon{color:#0009;font-size:19px;position:relative;top:3px}::ng-deep .tooltip-sec{background-color:0!important;font-size:12px!important;font-family:500!important;color:#fff!important}.assigneeSearch{height:50px!important;font-size:15px;padding-left:12px;box-sizing:border-box}.disabled-div{pointer-events:none;opacity:.5;background-color:#f9f9f9}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { 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: "directive", type: i10.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i11.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i11.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i11.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i11.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i14.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i14.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i15.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i17.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i17.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i18.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
839
- }
840
- export { CreateTermComponent };
841
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermComponent, decorators: [{
842
- type: Component,
843
- args: [{ selector: 'lib-create-term', template: "<ng-container [ngSwitch]=\"data?.columnInfo?.code || 'defaultCreate'\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'theme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'subtheme'\" [ngTemplateOutlet]=\"themeCreate\"></ng-container>\n <ng-container *ngSwitchCase=\"'designation'\" [ngTemplateOutlet]=\"themeDesignation\"></ng-container>\n <ng-container *ngSwitchCase=\"'competency'\" [ngTemplateOutlet]=\"compTheme\"></ng-container>\n</ng-container>\n\n<ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>Add {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name }} </div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title></div>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data?.columnInfo?.config?.categoryDisplayName || data.columnInfo.name}}</div>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultCreate>\n <div class=\"dialog\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <form [formGroup]=\"createTermForm\" novalidate (ngSubmit)=\"disableCreate?updateTermAssociations():saveTerm()\"\n class=\"defaultForm\">\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <input matInput formControlName=\"name\" placeholder=\"{{app_strings.name}}\" [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, createTermForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name }}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput formControlName=\"description\" placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"!disableCreate || disableMultiCreate\">{{app_strings.create}}</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n *ngIf=\"disableCreate\">{{app_strings.update}}</button>\n </footer>\n </form>\n </div>\n</ng-template>\n\n<ng-template #themeCreate >\n <div class=\"dialogNew\" [ngClass]=\"{'disabled-div': disableMultiCreate}\" >\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{getCategoryName(term.category,term)}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code !== 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeForm)\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeForm)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}}</mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n </mat-select>\n\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n \n <div class=\"flex\">\n\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n </div>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname \n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" >\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n <div class=\"flex gap-4 \" *ngIf=\"data.columnInfo?.code === 'competencyarea' && data.mode === 'view'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n \n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input autocomplete=\"off\" \n matInput [value]=\"data?.childrenData?.name\" disabled>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeFormMulti\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addThemeFields()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n </button>\n </div>\n <mat-accordion formArrayName=\"themeFields\">\n <mat-expansion-panel #mep=\"matExpansionPanel\" *ngFor=\"let field of themeFieldsControls; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{getExpansionTitle(field)}} \n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeThemeFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeFormMulti, i)\" maxlength=\"70\"> -->\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n \n <mat-select placeholder=\"{{app_strings?.name}}\" formControlName=\"name\" id=\"name\" #name (selectionChange)=\"change($event,createThemeFormMulti, i )\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" (keyup)=\"onKey($event)\" matInput>\n <mat-option *ngFor=\"let option of filteredMasterList\" (blur)=\"updateDname(option?.title, createThemeFormMulti, i)\" [disabled]=\"onDisableTheme(option)\" [value]=\"option\">{{option.title}} </mat-option>\n <mat-option *ngIf=\"filteredMasterList.length === 0\" disabled>\n No results found!\n </mat-option>\n \n </mat-select>\n \n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings?.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <div class=\"flex\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n \n \n <mat-icon class=\"info-icon cursor-pointer\" [matTooltip]=\"toolTipText\" \n matTooltipClass=\"tooltip-sec\">info_outline</mat-icon>\n \n \n \n \n \n </div>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Field automatically generated from the name field.\" maxlength=\"70\" [disabled]=\"name?.value?.length === 0\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\" maxlength=\"2000\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"flex flex-end\">\n <button mat-raised-button color=\"primary\" type=\"button\" (click)=\"mep.expanded = false\"\n [disabled]=\"createThemeFormMulti?.get('themeFields')['controls'][i].invalid\">\n Save\n </button>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.add_btn}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.add_btn}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #themeDesignation>\n <div class=\"themDesignation\">\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"mb-2\">\n <span class=\"organisation\">Organisation</span>\n <div class=\"org-name pl-4 flex items-center\">\n <!-- <span>Department of Fisheries</span> -->\n <span>{{data?.columnInfo?.name}}</span>\n </div>\n </div>\n <div class=\"row-divider\"></div>\n <div class=\"flex w-full items-center justify-end mt-4\">\n <a class=\"add-designation flex justify-center items-center\" (click)=\"addDesignation()\">\n <mat-icon class=\"add-icon mr-2\">add_circle_outline</mat-icon>\n <span>Add Designations</span>\n </a>\n </div>\n <div class=\"mt-5\">\n <form [formGroup]=\"createThemeForm\">\n <mat-accordion class=\"flex flex-col gap-2\" formArrayName=\"designations\">\n <ng-container *ngFor=\"let designation of designationControls; let i = index\">\n <mat-expansion-panel [formGroupName]=\"i\" class=\"designation-panel\" [expanded]=\"panelOpenState[i]\">\n <mat-expansion-panel-header>\n <div class=\"flex w-full items-center justify-end\">\n <mat-icon class=\"deletDesignation mr-4\" (click)=\"deleteDesignation(i)\">delete</mat-icon>\n </div>\n </mat-expansion-panel-header>\n <div class=\"flex flex-col gap-2 \">\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Designation Name <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" placeholder=\"Type here\" [matAutocomplete]=\"auto\" (change)=\"clearSelectedDesignaionOnChange(i, $event)\">\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option, designation)\">\n <mat-option *ngFor=\"let option of getFilteredDesignationList(i)\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete>\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n <!-- <mat-error>{{app_strings.alreadyExist}}</mat-error> -->\n </div>\n <div class=\"w-full\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\">\n Description <mat-icon class=\"info-icon\">info</mat-icon>\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <textarea matInput formControlName=\"designationDescription\"\n placeholder=\"Type the decription in fewer than 600 characters\"></textarea>\n </mat-form-field>\n </div>\n \n <div class=\"w-full flex justify-end items-center\">\n <button mat-raised-button class=\"saveDesignaton flex justify-center items-center\"\n (click)=\"saveDesignation(i)\">Save</button>\n </div>\n </div>\n </mat-expansion-panel>\n </ng-container>\n </mat-accordion>\n </form>\n </div>\n </div>\n <div class=\"flex justify-end items-center gap-4 mt-5 designation-footer\">\n <button mat-raised-button class=\"cancel flex justify-center items-center\"\n (click)=\"cancel()\">Cancel</button>\n <button mat-raised-button [disabled]=\"!enableAddBtn\" class=\"addBtn flex justify-center items-center\" (click)=\"submitDesignation()\">Add</button>\n </div>\n </div>\n</ng-template>\n<ng-template #compTheme>\n <div class=\"dialogNew\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{term.category}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button class=\"learning-section\" *ngFor=\"let item of allCompetency\" [value]=\"item\" (change)=\"onSelectionArea(item)\">{{item.name}}</mat-radio-button>\n \n </mat-radio-group>\n </div>\n </div>\n \n <ng-container *ngIf=\"data?.mode !== 'multi-create'\">\n <form class=\"themeForm\" [formGroup]=\"createThemeForm\" novalidate\n (ngSubmit)=\"disableCreate?updateTermAssociations():saveThemeTerm()\">\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Add Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"name\" id=\"name\" #name\n placeholder=\"{{app_strings.name}}\"\n (blur)=\"updateDname(name.value, createThemeForm)\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\"> -->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n <!-- <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Description\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <textarea matInput [cdkTextareaAutosize] [cdkAutosizeMaxRows]=\"10\"\n [cdkAutosizeMinRows]=\"3\" formControlName=\"description\"\n placeholder=\"{{app_strings.description}}\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\" [disabled]=\"createThemeForm?.invalid\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </form>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n \n <div class=\"flex flex-end mb-4\">\n <button type=\"button\" class=\"mat-button flex items-center \" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add {{data.columnInfo.name}}\n </button>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l\" [formGroupName]=\"i\" [expanded]=\"isFirst\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <!-- {{name?.value}} -->\n </mat-panel-title>\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Select Competency Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" (onSelectionChange)=\"OnThemeSelection($event)\" >{{option.name}}</mat-option>\n </mat-select>\n <!-- <input matInput formControlName=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option, createThemeForm)\">\n <mat-option *ngFor=\"let option of filtedTermLists | async\" [value]=\"option\">\n {{option.name}}\n </mat-option>\n </mat-autocomplete> -->\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n <!-- <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n Display Name\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput formControlName=\"dname\" id=\"dname\" #dname\n placeholder=\"Competency display name\">\n </mat-form-field>\n </div> -->\n </div>\n\n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n Select Competency Sub-Theme\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <!-- <mat-label>Enter {{data.name}} name</mat-label> -->\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <!-- <input #search autocomplete=\"off\" placeholder=\"Search\" class=\"assigneeSearch\"\n (keydown.space)=\"$event.stopPropagation()\" formControlName=\"assigneeText\" matInput> -->\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"createThemeForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"createThemeFormMulti.invalid\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(createThemeFormMulti, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(createThemeForm, data)\"\n [disabled]=\"createThemeForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n \n </div>\n</ng-template>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:0 1rem}.dialogNew .mat-dialog-title{padding:1em;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.info-icon{color:#0009;font-size:19px;position:relative;top:3px}::ng-deep .tooltip-sec{background-color:0!important;font-size:12px!important;font-family:500!important;color:#fff!important}.assigneeSearch{height:50px!important;font-size:15px;padding-left:12px;box-sizing:border-box}.disabled-div{pointer-events:none;opacity:.5;background-color:#f9f9f9}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}\n"] }]
844
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
845
- type: Inject,
846
- args: [MAT_DIALOG_DATA]
847
- }] }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.OdcsService }, { type: i5.MatLegacySnackBar }, { type: i0.ChangeDetectorRef }]; } });
848
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS9jcmVhdGUtdGVybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXNDLHNCQUFzQixJQUFJLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhJLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRyxPQUFPLEtBQUssWUFBWSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTNCLE1BTWEsbUJBQW1CO0lBd0M5QixZQUNTLFNBQTRDLEVBQ25CLElBQVMsRUFDakMsZ0JBQWtDLEVBQ2xDLEVBQXNCLEVBQ3RCLFdBQXdCLEVBQ3hCLFNBQXNCLEVBQ3RCLEdBQXFCO1FBTnRCLGNBQVMsR0FBVCxTQUFTLENBQW1DO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQUs7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixnQkFBVyxH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b0JBSzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDZDtxQkFBTTtvQkFDTCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDckI7WUFDSCxDQUFDLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFBO1lBQ25GLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSCxDQUFDOytHQWhqQ1UsbUJBQW1CLG9EQTBDcEIsZUFBZTttR0ExQ2QsbUJBQW1CLHVEQ3BCaEMsc3p5Q0F1bEJjOztTRG5rQkQsbUJBQW1COzRGQUFuQixtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCOzswQkErQ3hCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2dSZWYgYXMgTWF0RGlhbG9nUmVmLCBNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IHN0YXJ0V2l0aCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuLy8gaW1wb3J0IHsgSWRlbnRpZmllcnMgfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgeyBOU0ZyYW1ld29yayB9IGZyb20gJy4uLy4uL21vZGVscy9mcmFtZXdvcmsubW9kZWwnO1xuaW1wb3J0ICogYXMgYXBwQ29uc3RhbnRzIGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0IHsgbGFiZWxzIH0gZnJvbSAnLi4vLi4vbGFiZWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uLy4uL21vZGVscy92YXJpYWJsZS10eXBlLm1vZGVsJztcbmltcG9ydCB7IE9kY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb2Rjcy5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIGFzIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS10ZXJtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3JlYXRlLXRlcm0uY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVRlcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBuYW1lOiBzdHJpbmcgPSAnJztcbiAgdGVybUxpc3RzOiBBcnJheTxDYXJkPiA9IFtdO1xuICBmaWx0ZWRUZXJtTGlzdHM6IGFueTtcbiAgY3JlYXRlVGVybUZvcm06IGFueVxuICBjcmVhdGVUaGVtZUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgY3JlYXRlVGhlbWVGb3JtTXVsdGk6IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgZGlzYWJsZUNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVNdWx0aUNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1Rlcm1FeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZFRlcm06IENhcmQgPSB7fTtcbiAgYXBwX3N0cmluZ3MgPSBsYWJlbHM7XG4gIGNvbENvZGUgPSAnJ1xuICBzYXZlZERlc2lnbmF0aW9uczogYW55ID0gW11cbiAgYWRkZWREZXNpZ25hdGlvbkNvdW50ID0gMFxuICBkZXNpZ25hdGlvbnNMaXN0ID0gW11cbiAgcGFuZWxPcGVuU3RhdGU6IGFueVtdID0gW107XG4gIGFsbENvbXBldGVuY3k6YW55W109W11cbiAgc2VsZXRlZENvbXBldGVuY3lBcmVhOiBhbnlcbiAgYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGFsbENvbXBldGVuY3lTdWJ0aGVtZTphbnlbXT1bXVxuICBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZTphbnlbXT1bXVxuICBjb21wZXRlbmN5Rm9ybTogVW50eXBlZEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pXG4gIGNvbXBMYWJlbHRleHQ6c3RyaW5nID0gJydcbiAgbWFzdGVyTGlzdDphbnlbXT1bXTtcbiAgZmlsdGVyZWRNYXN0ZXJMaXN0OmFueVtdPVtdO1xuICBleHBhbnNpb25UaXRsZTpzdHJpbmcgPSAnJ1xuICBwcml2YXRlIGRlYm91bmNlVGltZW91dDogYW55O1xuICBwcml2YXRlIGRlYm91bmNlRGVsYXk6IG51bWJlciA9IDUwMDtcbiAgdmFsdWVzPSAnJ1xuICB0b29sVGlwVGV4dCA9IGBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGRpc3BsYXkgbmFtZSBmb3IgbGVhcm5lcnMgdG8gc2VlLCBhcyBpdCdzIHdoYXQgdGhleSB3aWxsIHZpZXcuYFxuICBwcmV2aW91c0NhdGVnb3J5Q29kZTpzdHJpbmcgPSAnJztcbiAgcHJldmlvdXNUZXJtQ29kZTpzdHJpbmcgPSAnJztcbiAgcHJldmlvdXNDYXRDb2RlOnN0cmluZyA9ICcnO1xuICBwcmV2aW91c1Rlcm1DYXRDb2RlOnN0cmluZz0nJ1xuICBzZWxlY3RlZFRlcm1BcnJheTogYW55PSBbXVxuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENyZWF0ZVRlcm1Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZnJhbWVXb3JrU2VydmljZTogRnJhbWV3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBvZGNzU2VydmljZTogT2Rjc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgY2RyOkNoYW5nZURldGVjdG9yUmVmXG4gICkgeyBcbiAgICB0aGlzLmdldEtjbVNlYXJjaCgpXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBcbiAgICB0aGlzLnRlcm1MaXN0cyA9IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNoaWxkcmVuXG4gICAgdGhpcy5jb21wTGFiZWx0ZXh0ID0gdGhpcy5kYXRhLmNvbHVtbkluZm8uY29uZmlnLmxhYmVsTmFtZVxuICAgIFxuICAgIHRoaXMuaW5pdFRlcm1Gb3JtKClcbiAgICBcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuXG4gIGluaXRUZXJtRm9ybSgpIHtcbiAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBkZXNjcmlwdGlvbjogWycnXVxuICAgIH0pXG4gICAgdGhpcy5jcmVhdGVUaGVtZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRuYW1lOiBbe3ZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWV9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJ11cbiAgICB9KVxuICAgIC8vIHRoaXMuY3JlYXRlVGhlbWVGb3JtLmNvbnRyb2xzWydkbmFtZSddLmRpc2FibGUoKVxuICAgIC8vIHRoaXMuY3JlYXRlVGhlbWVGb3JtLmNvbnRyb2xzWyduYW1lJ10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpPT57XG4gICAgLy8gICBpZih2YWx1ZS5sZW5ndGgpe1xuICAgIC8vICAgIHRoaXMuY3JlYXRlVGhlbWVGb3JtLmNvbnRyb2xzWydkbmFtZSddLmVuYWJsZSgpXG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgICB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB0aGVtZUZpZWxkczp0aGlzLmZiLmFycmF5KFt0aGlzLmNyZWF0ZVRoZW1lRmllbGRzKCldKVxuICAgIH0pXG4gICAgLy8gdGhpcy5pbml0aWFsaXplVmFsdWVDaGFuZ2VzKClcbiAgICB0aGlzLmZpbHRlZFRlcm1MaXN0cyA9IHRoaXMuY3JlYXRlVGVybUZvcm0uZ2V0KCduYW1lJykudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgbWFwKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMuY3JlYXRlVGVybUZvcm0uY29udHJvbHMuZG5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmNvbnRyb2xzLmRuYW1lLmVuYWJsZSgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jcmVhdGVUZXJtRm9ybS5jb250cm9scy5kbmFtZSkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlVGVybUZvcm0uY29udHJvbHMuZG5hbWUuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcih2YWx1ZSB8fCAnJylcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBpZiBtb2RlIGlzIFwidmlld1wiIHRoZW4gY2hlY2sgZm9yIHdoaWNoIHR5cGUgb2YgZm9ybSBoYXMgdG8gYmUgdXNlZCBhbmQgdGhlbiBhcHBlbmQgdGhlIHZhbHVlcyBpbiBmb3JtXG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhICYmXG4gICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICd2aWV3JylcbiAgICApIHtcbiAgICAgIHN3aXRjaCAodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSkge1xuICAgICAgICBjYXNlICd0aGVtZSc6IHRoaXMudXBkYXRlRm9ybVZpZXcodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzdWJ0aGVtZSc6IHRoaXMudXBkYXRlRm9ybVZpZXcodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB0aGlzLnVwZGF0ZUZvcm1WaWV3KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzYWJsZUNyZWF0ZSA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSAmJlxuICAgICAgKHRoaXMuZGF0YS5tb2RlID09PSAnZWRpdCcpKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpIHtcbiAgICAgICAgY2FzZSAndGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VidGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEgJiZcbiAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpKSB7XG4gICAgICAvLyBzd2l0Y2ggKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpIHtcbiAgICAgIC8vICAgY2FzZSAndGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgY2FzZSAnc3VidGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgZGVmYXVsdDogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcHRlbmN5RGF0YSgpe1xuICAgIC8vIGNvbnN0IGZpbHRlck9iaiA9IHtcbiAgICAvLyAgIHNlYXJjaDoge1xuICAgIC8vICAgICB0eXBlOiAnQ29tcGV0ZW5jeSBBcmVhJyxcbiAgICAvLyAgIH0sXG4gICAgLy8gICBmaWx0ZXI6IHtcbiAgICAvLyAgICAgaXNEZXRhaWw6IHRydWUsXG4gICAgLy8gICB9LFxuICAgIC8vIH1cbiAgICAvLyB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0RmlsdGVyRW50aXR5KGZpbHRlck9iaikuc3Vic2NyaWJlKChkYXRhKT0+e1xuICAgIFxuICAgIC8vICBpZihkYXRhICYmIGRhdGEubGVuZ3RoKXtcbiAgICAvLyAgIHRoaXMuYWxsQ29tcGV0ZW5jeSA9IGRhdGFcbiAgICAvLyAgfVxuICAgIC8vIH0pXG4gIH1cbiAgLy8gaW5pdGlhbGl6ZVZhbHVlQ2hhbmdlcygpIHtcbiAgLy8gICB0aGlzLnRoZW1lRmllbGRzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwOiBGb3JtR3JvdXApID0+IHtcbiAgLy8gICAgIHRoaXMuc2V0VXBWYWx1ZUNoYW5nZXMoZ3JvdXApO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gc2V0VXBWYWx1ZUNoYW5nZXMoZ3JvdXA6IEZvcm1Hcm91cCkge1xuICAvLyAgIGdyb3VwLmNvbnRyb2xzWyduYW1lJ10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gIC8vICAgICBjb25zdCBkbmFtZUNvbnRyb2wgPSBncm91cC5jb250cm9sc1snZG5hbWUnXTtcbiAgLy8gICAgIGRuYW1lQ29udHJvbC5kaXNhYmxlKCk7XG4gIC8vICAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCkge1xuICAvLyAgICAgICBkbmFtZUNvbnRyb2wuZW5hYmxlKCk7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICBkbmFtZUNvbnRyb2wuZGlzYWJsZSgpO1xuICAvLyAgICAgfVxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgZ2V0IHRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpLmdldCgndGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IHRoZW1lRmllbGRzQ29udHJvbHMoKSB7XG4gICAgY29uc3QgdGhlbWVGaWVsZHMgPSB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpLmdldCgndGhlbWVGaWVsZHMnKVxuICAgIHJldHVybiAoPGFueT50aGVtZUZpZWxkcylbJ2NvbnRyb2xzJ11cbiAgfVxuXG4gIGNyZWF0ZVRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRuYW1lOiBbe3ZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWV9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJyxdXG4gICAgfSk7XG4gIH1cblxuICBhZGRUaGVtZUZpZWxkcygpIHtcbiAgICB0aGlzLnZhbHVlcyA9ICcnXG4gICAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSBbLi4udGhpcy5tYXN0ZXJMaXN0XVxuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIC8vIHRoaXMudGhlbWVGaWVsZHMucHVzaCh0aGlzLmNyZWF0ZVRoZW1lRmllbGRzKCkpO1xuICAgICAgdGhpcy50aGVtZUZpZWxkcy5pbnNlcnQoMCwgdGhpcy5jcmVhdGVUaGVtZUZpZWxkcygpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVUaGVtZUZpZWxkcyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJykge1xuICAgICAgdGhpcy50aGVtZUZpZWxkcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuICB9XG4gIGdldENyZWF0ZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgIHN3aXRjaChuYW1lKXtcbiAgICBjYXNlICdUaGVtZSc6XG4gICAgICByZXR1cm4gYEFkZCBDb21wZXRlbmN5ICR7bmFtZX1gO1xuICAgIGNhc2UgJ1N1YiBUaGVtZSc6XG4gICAgICByZXR1cm4gYEFkZCBDb21wZXRlbmN5ICR7bmFtZX1gO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYEFkZCAke25hbWV9YDtcbiAgIH1cbiAgfVxuXG4gIGdldENhdGVnb3J5TmFtZShjYXRlZ29yeU5hbWU6YW55LCB0ZXJtOmFueSl7XG4gICAgdGhpcy5wcmV2aW91c0NhdGVnb3J5Q29kZSA9IGNhdGVnb3J5TmFtZTtcbiAgICB0aGlzLnByZXZpb3VzVGVybUNvZGUgPSB0ZXJtLmNvZGVcbiAgICBcbiAgICBzd2l0Y2goY2F0ZWdvcnlOYW1lKXtcbiAgICAgIGNhc2UgJ2NvbXBldGVuY3lhcmVhJzpcbiAgICAgICAgcmV0dXJuICdDb21wZXRlbmN5IEFyZWEnO1xuICAgICAgY2FzZSAndGhlbWUnOlxuICAgICAgICByZXR1cm4gJ0NvbXBldGVuY3kgVGhlbWUnO1xuICAgICAgY2FzZSAnc3VidGhlbWUnOlxuICAgICAgICByZXR1cm4gJ0NvbXBldGVuY3kgU3ViIFRoZW1lJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjYXRlZ29yeU5hbWU7IC8vIERlZmF1bHQgcmV0dXJuIHRvIGhhbmRsZSBhbnkgdW5tYXRjaGVkIGNhc2VcbiAgICAgfVxuICB9XG5cblxuICBnZXROYW1lKGl0ZW06YW55KXtcbiAgcmV0dXJuIGl0ZW0udG9VcHBlckNhc2UoKVxuICB9XG5cbiAgZ2V0TGFiZWxOYW1lKGxhYmVsTmFtZTpzdHJpbmcpOiBzdHJpbmcge1xuICAgIFxuICAgc3dpdGNoKGxhYmVsTmFtZSl7XG4gICAgY2FzZSAnVGhlbWUnOlxuICAgICAgcmV0dXJuIGBDb21wZXRlbmN5ICR7bGFiZWxOYW1lfSBuYW1lYDtcbiAgICAgIGNhc2UgJ1N1YiBUaGVtZSc6XG4gICAgICByZXR1cm4gYENvbXBldGVuY3kgJHtsYWJlbE5hbWV9IG5hbWVgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbGFiZWxOYW1lOyAvLyBEZWZhdWx0IHJldHVybiB0byBoYW5kbGUgYW55IHVubWF0Y2hlZCBjYXNlXG4gICB9XG4gIH1cblxuIFxuXG4gIGNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpOlVudHlwZWRGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbXBldGVuY3lUaGVtZTpbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBjb21wZXRlbmN5U3ViVGhlbWU6WycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSlcbiAgfVxuXG4gIGFkZENvbXBldGVuY3lUaGVtZSgpe1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnB1c2godGhpcy5jcmVhdGVDb21wVGhlbWVGaWVsZHMoKSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQ29tcEZpZWxkcyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJykge1xuICAgICAgdGhpcy5jb21wVGhlbWVGaWVsZHMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb21wVGhlbWVGaWVsZHMoKTogVW50eXBlZEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgLy8gZ2V0IGNvbXBUaGVtZUZpZWxkc0NvbnRyb2xzKCkge1xuICAvLyAgIGNvbnN0IGNyZWF0ZUNvbXBUaGVtZUZpZWxkcyA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjcmVhdGVDb21wVGhlbWVGaWVsZHMnKVxuICAvLyAgIHJldHVybiAoPGFueT5jcmVhdGVDb21wVGhlbWVGaWVsZHMpWydjb250cm9scyddXG4gIC8vIH1cblxuXG4gIHVwZGF0ZUZvcm1WaWV3KGZvcm06YW55LCBkYXRhOmFueSkge1xuICAgIGlmKGRhdGEgJiYgZGF0YS5jaGlsZHJlbkRhdGEgJiYgZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMgJiYgZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUpe1xuICAgICAgZm9ybS5nZXQoJ2RuYW1lJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5hZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5TmFtZSlcbiAgICB9XG4gICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5kZXNjcmlwdGlvbikgICAgXG4gICAgXG4gICAgICBpZiAoZGF0YS5jaGlsZHJlbkRhdGEubmFtZSAmJiB0aGlzLm1hc3Rlckxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFzc2lnbk5hbWUgPSB0aGlzLm1hc3Rlckxpc3QuZmluZChvcHRpb24gPT5cbiAgICAgICAgICBkYXRhLmNoaWxkcmVuRGF0YS5yZWZJZCA9PT0gb3B0aW9uLmlkXG4gICAgICAgIClcbiAgICAgICAgaWYgKGFzc2lnbk5hbWUpIHtcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzWyduYW1lJ10uc2V0VmFsdWUoYXNzaWduTmFtZSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgIH1cbiAgXG4gICAgXG4gICAgLy8gZm9ybS5nZXQoJ25hbWUnKS5wYXRjaFZhbHVlKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUpXG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3JtLmdldCgnbmFtZScpLmRpc2FibGUoKVxuICAgICAgZm9ybS5nZXQoJ2RuYW1lJykuZGlzYWJsZSgpXG4gICAgICBmb3JtLmdldCgnZGVzY3JpcHRpb24nKS5kaXNhYmxlKClcbiAgICAgIFxuICAgICAgXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZUZvcm1FZGl0KGZvcm06YW55LCBkYXRhOmFueSkge1xuICAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUpXG4gICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5kZXNjcmlwdGlvbilcbiAgICBpZiAoZGF0YS5jaGlsZHJlbkRhdGEubmFtZSAmJiB0aGlzLm1hc3Rlckxpc3QubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhc3NpZ25OYW1lID0gdGhpcy5tYXN0ZXJMaXN0LmZpbmQob3B0aW9uID0+XG4gICAgICAgIGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUgPT09IG9wdGlvbi50aXRsZVxuICAgICAgKVxuICAgICAgaWYgKGFzc2lnbk5hbWUpIHtcbiAgICAgICAgZm9ybS5jb250cm9sc1snbmFtZSddLnNldFZhbHVlKGFzc2lnbk5hbWUpXG4gICAgICB9XG4gICAgICBcbiAgICB9XG4gICAgLy8gZm9ybS5nZXQoJ25hbWUnKS5wYXRjaFZhbHVlKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUpXG4gICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZvcm0uZ2V0KCduYW1lJykuZGlzYWJsZSgpXG4gICAgICBmb3JtLmdldCgnZG5hbWUnKS5lbmFibGUoKVxuICAgIH0pXG4gIH1cblxuICBvbktleShldmVudDphbnkpe1xuICAgIC8vICB0aGlzLnZhbHVlcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICB0aGlzLmZpbHRlcmVkTWFzdGVyTGlzdCA9IHRoaXMuZmlsdGVyT3JnVmFsdWVzKHRoaXMudmFsdWVzLCB0aGlzLm1hc3Rlckxpc3QpXG5cbiAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVib3VuY2VUaW1lb3V0KTtcbiAgICBcbiAgICAgLy8gU2V0IHRoZSBuZXcgdGltZW91dFxuICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgIHRoaXMudmFsdWVzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSB0aGlzLmZpbHRlck9yZ1ZhbHVlcyh0aGlzLnZhbHVlcywgdGhpcy5tYXN0ZXJMaXN0KTtcbiAgICAgfSwgdGhpcy5kZWJvdW5jZURlbGF5KTtcbiAgfVxuXG4gXG5cbiAgZmlsdGVyT3JnVmFsdWVzKHNlYXJjaFZhbHVlOiBzdHJpbmcsIGFycmF5OiBhbnkpIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKCh2YWx1ZTogYW55KSA9PlxuICAgICAgdmFsdWUudGl0bGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKSlcbiAgfVxuXG4gIGdldEtjbVNlYXJjaCgpe1xuICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICBmaWx0ZXJDcml0ZXJpYU1hcDoge1xuICAgICAgICBzdGF0dXM6IFwiTGl2ZVwiLFxuICAgICAgICBpc0FjdGl2ZTogdHJ1ZVxuICAgIH0sXG4gICAgcmVxdWVzdGVkRmllbGRzOiBbXSxcbiAgICBwYWdlTnVtYmVyOiAwLFxuICAgIHBhZ2VTaXplOjEwMDBcbiAgICB9XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldEtjbVNlYXJjaExpc3QocmVxdWVzdE9iaix0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKS5zdWJzY3JpYmUoKHJlc3BvbnNlOmFueSk9PntcbiAgICAgIGlmKHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGgpe1xuICAgICAgICB0aGlzLm1hc3Rlckxpc3QgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICB0aGlzLmZpbHRlcmVkTWFzdGVyTGlzdCA9IFsuLi50aGlzLm1hc3Rlckxpc3RdXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICBpZih0aGlzLmRhdGEgJiZcbiAgICAgICAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ2VkaXQnKSl7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUVkaXQodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYodGhpcy5kYXRhICYmXG4gICAgICAgICAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ3ZpZXcnKSl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtVmlldyh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgXG4gICAgICAgIH0sMTAwMClcbiAgICAgICBcblxuICAgICAgfVxuICAgIH0pXG4gICBcbiAgICBcbiAgfVxuXG4gIG9uRGlzYWJsZVRoZW1lKG9wdGlvbjogYW55KXtcbiAgICBsZXQgcGFyZW50Q29sXG4gICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgaWYocGFyZW50Q29sdW1uQ29uZmlnRGF0YSkge1xuICAgICAgcGFyZW50Q29sID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IC0xXG4gICAgaWYocGFyZW50Q29sICYmIHBhcmVudENvbC5jaGlsZHJlbiAmJiBwYXJlbnRDb2wuY2hpbGRyZW4ubGVuZ3RoKXtcbiAgICAgIHJlc3VsdCA9IHBhcmVudENvbC5jaGlsZHJlbi5maW5kSW5kZXgoKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKCAoZWxlLnJlZlR5cGUgPT09ICd0aGVtZSd8fCBlbGUucmVmVHlwZSA9PT0gJ3N1YnRoZW1lJykgKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG9wdGlvbi50aXRsZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pXG4gICAgICBcbiAgIFxuICAgICAgXG4gICAgfVxuICAgIGlmKHJlc3VsdCA8IDApe1xuICAgICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY3JlYXRlVGhlbWVGb3JtTXVsdGkuZ2V0KCd0aGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICByZXN1bHQgPSBmb3JtQXJyYXkudmFsdWUuZmluZEluZGV4KChmb3JtRWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYoZm9ybUVsZS5uYW1lICYmIGZvcm1FbGUubmFtZS5pZCl7XG4gICAgICAgICAgcmV0dXJuIGZvcm1FbGUubmFtZS5pZCA9PT0gb3B0aW9uLmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICB9XG4gICAgLy9cbiAgICBcbiAgICByZXR1cm4gcmVzdWx0ID49IDAgPyB0cnVlOiBmYWxzZVxuICB9XG5cbiAgbXVsdGlDcmVhdGUoZm9ybTphbnksIF9kYXRhOmFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGxldCBjb3VudGVyID0gMFxuICAgIGxldCBjcmVhdGVkVGVybXM6YW55ID0gW11cbiAgICBpZihmb3JtLnZhbGlkKSB7XG4gICAgICBcbiAgICAgIGNvbnN0IHRoZW1lRmllbGRzID0gZm9ybSAmJiBmb3JtLnZhbHVlICYmIGZvcm0udmFsdWUudGhlbWVGaWVsZHNcbiAgICAgIFxuICAgICAgaWYodGhlbWVGaWVsZHMgJiYgdGhlbWVGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoZW1lRmllbGRzLmZvckVhY2goKHZhbDphbnksIF9pOmFueSkgPT57XG4gICAgICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgICAgbmFtZTogXy5nZXQodmFsLCAnbmFtZS50aXRsZScpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICAgIHJlZklkOnZhbC5uYW1lLmlkLFxuICAgICAgICAgICAgcmVmVHlwZTp0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgICAgLy8gZnJhbWV3b3JrOnRoaXMuZGF0YS5mcmFtZXdvcmtJZCxcbiAgICAgICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICAgICAgeyBpZGVudGlmaWVyOiBgJHt0aGlzLmRhdGEuZnJhbWV3b3JrSWQudG9Mb3dlckNhc2UoKX1fJHt0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlfWAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGRpc3BsYXlOYW1lOnZhbC5kbmFtZSxcbiAgICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdGVybTogdGVybVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3JlYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlcy5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICAgICAgY3JlYXRlZFRlcm1zLnB1c2gocmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYoY291bnRlciA9PT0gdGhlbWVGaWVsZHMubGVuZ3RoKXtcblxuXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbjphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uLmNvZGUpXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zICwgcGFyZW50Q29sKVxuICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aShjcmVhdGVkVGVybXMpXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBjcmVhdGVkVGVybXMsIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zOiBhbnlbXSkge1xuICAgICBsZXQgcGFyZW50OiBhbnlcbiAgICBpZihjcmVhdGVkVGVybXMgJiYgY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgbGV0IGNyZWF0ZWRUZXJtc0NvdW50ZXIgPSAwXG4gICAgICBmb3IobGV0IGNyZWF0ZWRUZXJtIG9mIGNyZWF0ZWRUZXJtcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtXG4gICAgICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgICAgICBsZXQgdGVtcFxuICAgICAgICBsZXQgY291bnRlciA9IDBcbiAgICAgICAgZm9yKGNvbnN0IFt2YWx1ZV0gb2YgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Qpe1xuICAgICAgICAgICBwYXJlbnQgPSB2YWx1ZVxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogYW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gKGNyZWF0ZWRUZXJtcy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgICBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50LCBjcmVhdGVkVGVybXMgKVxuICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPWZhbHNlO1xuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjYWxsVXBkYXRlQXNzb2NpYXRpb25zKGNvdW50ZXI6YW55LCBwYXJlbnQ6YW55LCByZWd1ZXN0Qm9keTphbnkpOiBQcm9taXNlPGFueT57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi5bdGhpcy5zZWxlY3RlZFRlcm1dXTpbdGhpcy5zZWxlY3RlZFRlcm1dXG5cbiAgICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuICBcbiAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgICAgLy8gY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6IHt9XG4gICAgICAgICAgLy8gY29uc3QgZm91bmQgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmluZChjPT4gYy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IGZhbHNlXG4gICAgICAgICAgLy8gaWYoIWZvdW5kKSB7XG4gICAgICAgICAgLy8gICBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzLnNlbGVjdGVkVGVybSkgOiBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBbdGhpcy5zZWxlY3RlZFRlcm1dXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgLy8gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnB1Ymxpc2hGcmFtZXdvcmsoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAvLyAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gICByZXR1cm4gcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKVxuICAgICAgICB9XG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlRG5hbWUoX25hbWU6IGFueSwgX2Zvcm06YW55LCBfaT86YW55KSB7XG4gICAgLy8gaWYodGhpcy5kYXRhLm1vZGUgPT09ICdjcmVhdGUnICYmICFmb3JtLmNvbnRyb2xzWydkbmFtZSddLnZhbHVlLnRyaW0oKS5sZW5ndGgpe1xuICAgIC8vICAgZm9ybS5nZXQoJ2RuYW1lJykucGF0Y2hWYWx1ZShuYW1lKVxuICAgIC8vIH1cbiAgICAvLyBpZih0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScgJiYgIWZvcm0uY29udHJvbHMudGhlbWVGaWVsZHMuY29udHJvbHNbaV0uY29udHJvbHNbJ2RuYW1lJ10udmFsdWUudHJpbSgpLmxlbmd0aCl7XG4gICAgLy8gICBmb3JtLmNvbnRyb2xzLnRoZW1lRmllbGRzLmNvbnRyb2xzW2ldLmNvbnRyb2xzWydkbmFtZSddLnBhdGNoVmFsdWUobmFtZSlcbiAgICAvLyB9XG4gIH1cbiAgY2hhbmdlKGV2ZW50OiBhbnksZm9ybTogYW55LCBpPzogYW55KXtcbiAgICBpZih0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLm1vZGUpIHsgXG4gICAgICBpZih0aGlzLmRhdGEubW9kZSA9PT0gJ2NyZWF0ZScpe1xuICAgICAgICBmb3JtLmdldCgnZG5hbWUnKS5wYXRjaFZhbHVlKGV2ZW50LnNvdXJjZS52YWx1ZS50aXRsZSlcbiAgICAgICAgdGhpcy5leHBhbnNpb25UaXRsZSA9IGV2ZW50LnNvdXJjZS52YWx1ZS50aXRsZVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcblxuICAgICAgfVxuICAgICAgaWYodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKXtcbiAgICAgICAgY29uc3QgZm9ybVRvVXBkYXRlID0gZm9ybS5jb250cm9scy50aGVtZUZpZWxkcy5jb250cm9sc1tpXVxuICAgICAgICBmb3JtVG9VcGRhdGUuY29udHJvbHNbJ2RuYW1lJ10ucGF0Y2hWYWx1ZShldmVudC5zb3VyY2UudmFsdWUudGl0bGUpXG4gICAgICAgIHRoaXMuZXhwYW5zaW9uVGl0bGUgPSBldmVudC5zb3VyY2UudmFsdWUudGl0bGVcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIGlmKGZvcm1Ub1VwZGF0ZS5jb250cm9scy5uYW1lLnZhbGlkICYmIGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZSkge1xuICAgICAgICAgIGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZS5lbmFibGUoKVxuICAgICAgICB9IGVsc2UgaWYoZm9ybVRvVXBkYXRlLmNvbnRyb2xzLmRuYW1lKSB7XG4gICAgICAgICAgZm9ybVRvVXBkYXRlLmNvbnRyb2xzLmRuYW1lLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgXG4gIH1cblxuICBnZXRFeHBhbnNpb25UaXRsZShmb3JtOiBhbnkpIHtcbiAgICBjb25zdCBkZXRhaWxzID0gZm9ybS5nZXQoJ25hbWUnKS52YWx1ZVxuICAgIHJldHVybiBfLmdldChkZXRhaWxzLCAndGl0bGUnLCAnJylcbiAgfVxuICBcblxuICAvLyNyZWdpb24gKGRlc2lnbmF0aW9ucylcblxuICBnZXQgZGVzaWduYXRpb25Db250cm9scygpIHtcbiAgICByZXR1cm4gKHRoaXMuY3JlYXRlVGhlbWVGb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgVW50eXBlZEZvcm1BcnJheSkuY29udHJvbHM7XG4gIH1cblxuICBsb2FkRGVzaWduYXRpb25zKCkge1xuICAgIHRoaXMub2Rjc1NlcnZpY2UuZ2V0RGVzaWduYXRpb25zKHt9KS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGVzaWduYXRpb25zTGlzdCA9IGRhdGEucmVzcG9uc2VEYXRhXG4gICAgICB9LFxuICAgICAgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgfSlcbiAgfVxuXG4gIGdldEZpbHRlcmVkRGVzaWduYXRpb25MaXN0KGluZGV4OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWx0ZXJLZXkgPSB0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5kZXNpZ25hdGlvbnNbaW5kZXhdLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgIGlmKGZpbHRlcktleSAmJiB0aGlzLmRlc2lnbmF0aW9uc0xpc3QpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkTGlzdCA9IHRoaXMuZGVzaWduYXRpb25zTGlzdC5maWx0ZXIoKGRlc2lnbmF0aW9uOiBhbnkpID0+IGRlc2lnbmF0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJLZXkpKVxuICAgICAgcmV0dXJuIGZpbHRlcmVkTGlzdFxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgYWRkRGVzaWduYXRpb24oKSB7XG4gICAgY29uc3QgbmV3RGVzaWduYXRpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBpZDpbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBkZXNpZ25hdGlvbkRlc2NyaXB0aW9uOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg2MDApXV0sXG4gICAgICBpc1NhdmVkOiBbZmFsc2VdLCAvLyBpc1NhdmVkIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBidXR0b24gdGV4dCBmcm9tIHNhdmUgdG8gdXBkYXRlIGlmIG5lZWRlZFxuICAgICAgY3JlYXRpb25JZDogdGhpcy5hZGRlZERlc2lnbmF0aW9uQ291bnQgLy8gY3JlYXRpb25JZCBpcyBjcmVhdGVkIHRvIHVzZSBsb2NhbGx5IHRvIGdpdmUgdW5pcXVlIGlkIHRvIGFkZGVkIHJlY29yZHNcbiAgICB9KTtcbiAgICB0aGlzLmFkZGVkRGVzaWduYXRpb25Db3VudCA9IHRoaXMuYWRkZWREZXNpZ25hdGlvbkNvdW50ICsgMTtcbiAgICAodGhpcy5jcmVhdGVUaGVtZUZvcm0uZ2V0KCdkZXNpZ25hdGlvbnMnKSBhcyBVbnR5cGVkRm9ybUFycmF5KS5pbnNlcnQoMCwgbmV3RGVzaWduYXRpb24pO1xuICAgIC8vIHRoaXMucGFuZWxPcGVuU3RhdGUuaW5zZXJ0KDAsIHRydWUpXG4gICAgdGhpcy5wYW5lbE9wZW5TdGF0ZS5zcGxpY2UoMCwgMCwgdHJ1ZSk7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkRGVzaWduYWlvbk9uQ2hhbmdlKGluZGV4OmFueSwgZXZlbnQ6YW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lID0gdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZGVzaWduYXRpb25zW2luZGV4XS5uYW1lXG4gICAgaWYoc2VsZWN0ZWROYW1lICE9PSBldmVudC52YWx1ZSkge1xuICAgICAgY29uc3QgZGVzaWduYXRpb25zVG9SZXNldDphbnkgPSB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHNbaW5kZXhdXG4gICAgICBkZXNpZ25hdGlvbnNUb1Jlc2V0LmdldCgnaWQnKS5yZXNldCgpXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlRGVzaWduYXRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlb3ZlZENyZWF0aW9uSWQgPSB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHNbaW5kZXhdLnZhbHVlLmNyZWF0aW9uSWQ7XG4gICAgKHRoaXMuY3JlYXRlVGhlbWVGb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgVW50eXBlZEZvcm1BcnJheSkucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuc2F2ZWREZXNpZ25hdGlvbnMgPSB0aGlzLnNhdmVkRGVzaWduYXRpb25zLmZpbHRlcigoc2F2ZWREZXNpZ25hdGlvbjogYW55KSA9PiBzYXZlZERlc2lnbmF0aW9uLmNyZWF0aW9uSWQgIT09IHJlb3ZlZENyZWF0aW9uSWQpXG4gIH1cblxuICBzYXZlRGVzaWduYXRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGRlc2lnbmF0aW9ucyA9IHRoaXMuZGVzaWduYXRpb25Db250cm9sc1xuICAgIGNvbnN0IGRlc2lnbmF0aW9uVG9TYXZlID0gZGVzaWduYXRpb25zW2luZGV4XVxuICAgIGlmIChkZXNpZ25hdGlvblRvU2F2ZS52YWxpZCkge1xuICAgICAgZGVzaWduYXRpb25Ub1NhdmUudmFsdWUuaXNTYXZlZCA9IHRydWVcbiAgICAgIGNvbnN0IHNhdmVkRGVzaWduYXRpb25JbmRleCA9IHRoaXMuc2F2ZWREZXNpZ25hdGlvbnMuZmluZEluZGV4KChlOmFueSkgPT4gZS5jcmVhdGlvbklkID09PSBkZXNpZ25hdGlvblRvU2F2ZS52YWx1ZS5jcmVhdGlvbklkKVxuICAgICAgaWYgKHNhdmVkRGVzaWduYXRpb25JbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuc2F2ZWREZXNpZ25hdGlvbnNbc2F2ZWREZXNpZ25hdGlvbkluZGV4XSA9IGRlc2lnbmF0aW9uVG9TYXZlLnZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhdmVkRGVzaWduYXRpb25zLnB1c2goZGVzaWduYXRpb25Ub1NhdmUudmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3VibWl0RGVzaWduYXRpb24oKSB7XG4gICAgXG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgZ2V0IGVuYWJsZUFkZEJ0bigpIHtcbiAgICBpZih0aGlzLmNvbENvZGUgPT09ICdkZXNpZ25hdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgcHJpdmF0ZSBfZmlsdGVyKHNlYXJjaFR4dDogYW55KTogQ2FyZFtdIHtcbiAgICBsZXQgaXNFeGlzdDtcbiAgICB0aGlzLmRpc2FibGVDcmVhdGUgPSBmYWxzZVxuICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgIHRoaXMuY3JlYXRlVGVybUZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLmVuYWJsZSgpXG4gICAgLy8gdGhpcy5jcmVhdGVUZXJtRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucGF0Y2hWYWx1ZSgnJylcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHR5cGVvZiAoc2VhcmNoVHh0KSA9PT0gJ29iamVjdCcgPyB0aGlzLl9ub3JtYWxpemVWYWx1ZShzZWFyY2hUeHQubmFtZSkgOiB0aGlzLl9ub3JtYWxpemVWYWx1ZShzZWFyY2hUeHQpO1xuICAgIGlzRXhpc3QgPSB0aGlzLnRlcm1MaXN0cy5maWx0ZXIoKHRlcm06YW55KSA9PiB0aGlzLl9ub3JtYWxpemVWYWx1ZSh0ZXJtLm5hbWUpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XG4gICAgcmV0dXJuIGlzRXhpc3RcbiAgfVxuXG4gIHByaXZhdGUgX25vcm1hbGl6ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gIH1cblxuICBvblNlbGVjdGlvbkFyZWEob3B0aW9uOmFueSl7XG4gICAgdGhpcy5hbGxDb21wZXRlbmN5LmZvckVhY2goKHZhbDphbnkpPT57XG4gICAgICBpZiAob3B0aW9uLm5hbWUgPT09IHZhbC5uYW1lKSB7XG4gICAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gdmFsXG4gICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lID0gdmFsLmNoaWxkcmVuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUgPSB0aGlzLmFsbENvbXBldGVuY3lUaGVtZVxuXG4gICAgICB9XG4gICAgfSlcbiAgIFxuICB9XG5cbiAgT25UaGVtZVNlbGVjdGlvbihldmVudDphbnkpIHtcbiAgICBcbiAgICBjb25zdCBzZWxlY3RlZFRoZW1lID0gZXZlbnQuc291cmNlLnZhbHVlXG4gICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZS5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkVGhlbWUubmFtZSA9PT0gdmFsLm5hbWUpIHtcbiAgICAgICAgdGhpcy5hbGxDb21wZXRlbmN5U3VidGhlbWUgPSB2YWwuY2hpbGRyZW5cbiAgICAgICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZSA9IHRoaXMuYWxsQ29tcGV0ZW5jeVN1YnRoZW1lXG4gICAgICB9XG5cbiAgICB9KVxuXG5cbiAgfVxuXG4gIC8vIGNvbXBBcmVhU2VsZWN0ZWQob3B0aW9uOiBhbnkpIHtcbiAgLy8gICB0aGlzLnJlc2V0Q29tcFN1YmZpZWxkcygpXG4gIC8vICAgdGhpcy5hbGxDb21wZXRlbmNpZXMuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgLy8gICAgIGlmIChvcHRpb24ubmFtZSA9PT0gdmFsLm5hbWUpIHtcbiAgLy8gICAgICAgdGhpcy5zZWxldGVkQ29tcGV0ZW5jeUFyZWEgPSB2YWxcbiAgLy8gICAgICAgdGhpcy5hbGxDb21wZXRlbmN5VGhlbWUgPSB2YWwuY2hpbGRyZW5cbiAgLy8gICAgICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZSA9IHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lXG4gIFxuICAvLyAgICAgfVxuICAvLyAgIH0pXG4gIC8vIH1cblxuICBvblNlbGVjdCh0ZXJtOmFueSwgZm9ybTphbnkpIHtcbiAgICBzd2l0Y2ggKHRoaXMuY29sQ29kZSkge1xuICAgICAgY2FzZSAnZGVzaWduYXRpb24nOlxuICAgICAgICBmb3JtLmdldCgnbmFtZScpLnBhdGNoVmFsdWUodGVybS52YWx1ZS5uYW1lKVxuICAgICAgICBmb3JtLmdldCgnaWQnKS5wYXRjaFZhbHVlKHRlcm0udmFsdWUuaWQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSB0ZXJtLnZhbHVlXG4gICAgICAgIGZvcm0uZ2V0KCduYW1lJykucGF0Y2hWYWx1ZSh0ZXJtLnZhbHVlLm5hbWUpXG4gICAgICAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoKHRlcm0udmFsdWUuZG5hbWUpXG4gICAgICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUodGVybS52YWx1ZS5kZXNjcmlwdGlvbilcbiAgICAgICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykuZGlzYWJsZSgpXG4gICAgICAgIHRoaXMuZGlzYWJsZUNyZWF0ZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICBzYXZlVGVybSgpIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyKHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUubmFtZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgIFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLmNyZWF0ZVRlcm1Gb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCB0ZXJtOiBOU0ZyYW1ld29yay5JQ3JlYXRlVGVybSA9IHtcbiAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgbmFtZTogdGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsXG4gICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgIC8vIGZyYW1ld29yazp0aGlzLmRhdGEuZnJhbWV3b3JrSWQsXG4gICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgXSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBkaXNwbGF5TmFtZTogdGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5kbmFtZSxcbiAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlcy5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtLCBjcmVhdGVkOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtXG4gICAgICAgIHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9ucygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRlcm1EYXRhKGZvcm06YW55LCBkYXRhOmFueSkge1xuICAgIGxldCBhZGRpdGlvbmFsUHJvcGVydGllcyA9ICBkYXRhLmNoaWxkcmVuRGF0YS5hZGRpdGlvbmFsUHJvcGVydGllc1xuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzWydkaXNwbGF5TmFtZSddID0gdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZG5hbWVcbiAgICBmb3JtLnZhbHVlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gYWRkaXRpb25hbFByb3BlcnRpZXNcbiAgICBcbiAgICBmb3JtLnZhbHVlLmRpc3BsYXlOYW1lID0gZm9ybS52YWx1ZS5kbmFtZVxuICAgIFxuICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IHRydWVcbiAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgIC8vIHVzZSB0aGlzIGlmIHlvdSBuZWVkIGRpc2FibGVkIGZpZWxkIHZhbHVlcyA6IGZvcm0uZ2V0UmF3VmFsdWUoKVxuICAgICAgLi4uZm9ybS52YWx1ZSxcbiAgICAgIC8vIGRpc3BsYXlOYW1lOnsuLi5mb3JtLnZhbHVlLmRuYW1lfVxuICAgIH1cbiAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgZm9ybURhdGEsXG4gICAgICB1cGRhdGVUZXJtRGF0YTogZGF0YS5jaGlsZHJlbkRhdGFcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUZXJtRGF0YUFzc29jaWF0aW9ucyh1cGRhdGVEYXRhKVxuICB9XG5cblxuICB1cGRhdGVUZXJtRGF0YUFzc29jaWF0aW9ucyh1cGRhdGVEYXRhOmFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGxldCBzZWxlY3Rpb25EYXRhID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgaWYoIXNlbGVjdGlvbkRhdGEgKSB7XG4gICAgICBzZWxlY3Rpb25EYXRhID0gdGhpcy5kYXRhLmNoaWxkcmVuRGF0YVxuICAgIH1cbiAgICBjb25zdCBsaXN0VGhtZSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgIGxldCB0aGVtQXNzb2NpYXRpb25zOiBhbnlcbiAgICBpZihsaXN0VGhtZSAmJiBsaXN0VGhtZS5jaGlsZHJlbiAmJiBsaXN0VGhtZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBsaXN0VGhtZS5jaGlsZHJlbi5maW5kKChjKSA9PiBjLmlkZW50aWZpZXIgPT09IHNlbGVjdGlvbkRhdGEuaWRlbnRpZmllcilcbiAgICAgIHRoZW1Bc3NvY2lhdGlvbnMgPSBkYXRhLmFzc29jaWF0aW9ucyA/IGRhdGEuYXNzb2NpYXRpb25zLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICB9KSA6IFtdXG4gICAgfVxuICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgLi4udXBkYXRlRGF0YS5mb3JtRGF0YSxcbiAgICAgICAgICAuLi4odGhlbUFzc29jaWF0aW9ucyAmJiB0aGVtQXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiB0aGVtQXNzb2NpYXRpb25zfSA6IG51bGwsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBzZWxlY3Rpb25EYXRhLmNhdGVnb3J5LCBzZWxlY3Rpb25EYXRhLmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuXG4gICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiAodXBkYXRlRGF0YSkgPyB7Li4udXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YSwgLi4udXBkYXRlRGF0YS5mb3JtRGF0YX0gOiB7fVxuICAgICAgICBcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkRhdGEgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgc2VsZWN0aW9uRGF0YVsnZGVzY3JpcHRpb24nXSA9IHJlZ3Vlc3RCb2R5LnJlcXVlc3QudGVybS5kZXNjcmlwdGlvblxuICAgICAgICBzZWxlY3Rpb25EYXRhWydhZGRpdGlvbmFsUHJvcGVydGllcyddID0gcmVndWVzdEJvZHkucmVxdWVzdC50ZXJtLmFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gICAgICAgIHNlbGVjdGlvbkRhdGFbJ2Fzc29jaWF0aW9ucyddID0gdGhlbUFzc29jaWF0aW9uc1xuICAgICAgICBcblxuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7dmFsdWUuY2F0ZWdvcnl9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5YClcbiAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHsgLi4udmFsdWUgfSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlRnVsbFRlcm1EYXRhTG9jYWxNYXAodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgc2VsZWN0aW9uRGF0YSlcbiAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlVGVybUFzc29jaWF0aW9ucyh1cGRhdGVEYXRhPzogYW55KSB7XG4gICAgbGV0IGFzc29jaWF0aW9ucyA9IFtdXG4gICAgbGV0IHRlbXBcbiAgICBsZXQgY291bnRlciA9IDBcbiAgICAvLyBsZXQgbG9jYWxJc0V4aXN0ID0gZmFsc2VcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5mb3JFYWNoKChwYXJlbnQpID0+IHtcbiAgICAgIGNvdW50ZXIrK1xuICAgICAgdGVtcCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOmFueSkgPT4gY2hpbGQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBudWxsXG4gICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAvLyByZXR1cm4geyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIsIGFwcHJvdmFsU3RhdHVzOiBjLmFzc29jaWF0aW9uUHJvcGVydGllcz9jLmFzc29jaWF0aW9uUHJvcGVydGllcy5hcHByb3ZhbFN0YXR1czogJ0RyYWZ0JyB9XG4gICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgIH0pIDogW11cbiAgICAgIGlmICh0ZW1wICYmIHRlbXAubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXNzb2NpYXRpb25zLnB1c2goeyBpZGVudGlmaWVyOiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYXBwQ29uc3RhbnRzLkRSQUZUIH0pXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAuLi4odXBkYXRlRGF0YSAmJiB1cGRhdGVEYXRhLmZvcm1EYXRhICYmIHVwZGF0ZURhdGEudXBkYXRlVGVybURhdGEuY29kZSA9PT0gcGFyZW50LmNvZGUpID8gey4uLnVwZGF0ZURhdGEuZm9ybURhdGF9OiBudWxsLFxuICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiAodXBkYXRlRGF0YSkgPyB7Li4udXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YSwgLi4udXBkYXRlRGF0YS5mb3JtRGF0YX0gOiB7fVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke3ZhbHVlLmNhdGVnb3J5fSB1cGRhdGVkIHN1Y2Nlc3NmdWxseWApXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogeyAuLi52YWx1ZSB9LCBjcmVhdGVkOiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRWRpdCAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNhdmVUaGVtZVRlcm0oKSB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlcih0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5uYW1lKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzVGVybUV4aXN0ID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgIGNvZGU6IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRVdWlkKCksXG4gICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlVGhlbWVGb3JtLnZhbHVlLm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICBcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsXG4gICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgXSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBkaXNwbGF5TmFtZTp0aGlzLmNyZWF0ZVRlcm1Gb3JtLnZhbHVlLmRuYW1lLFxuICAgICAgICAgIHRpbWVTdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3JlYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVsnaWRlbnRpZmllciddID0gcmVzLnJlc3VsdC5ub2RlX2lkWzBdXG4gICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1cbiAgICAgICAgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zKClcbiAgICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ3JlYXRlICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZGlhbG9nQ2xvc2UodGVybTogYW55KSB7XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnB1Ymxpc2hGcmFtZXdvcmsoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGVybSlcbiAgICB9KTtcbiAgfVxuXG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zOiBhbnlbXSwgcGFyZW50U2VsZWN0ZWRUZXJtPzphbnkpIHtcbiAgIFxuICAgIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkgPSBbXVxuICAgIC8vIGxldCBjcmVhdGVkVGVybXNDb3VudGVyID0gMFxuICAgIGxldCBjcmVhdGVkVGVybXNJZGVudGlmaWVycyA9IFtdXG4gICAgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSA9IGNyZWF0ZWRUZXJtc1xuICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1zW2NyZWF0ZWRUZXJtcy5sZW5ndGggLTFdXG4gICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgIGNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzLnB1c2goeyBpZGVudGlmaWVyOiBjcmVhdGVkVGVybS5pZGVudGlmaWVyIH0pXG4gICAgfVxuICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgIGxldCBjb3VudGVyID0gMFxuICAgaWYoY3JlYXRlZFRlcm1zICYmIGNyZWF0ZWRUZXJtcy5sZW5ndGgpIHtcbiAgICAgIGxldCBwYXJlbnQ6IGFueVxuICAgICBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICAgaWYoIXBhcmVudFNlbGVjdGVkVGVybSkge1xuICAgICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSBjcmVhdGVkVGVybVxuICAgICAgICBsZXQgdGVtcFxuICAgICAgICBmb3IoY29uc3QgW3ZhbHVlXSBvZiB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdCl7XG4gICAgICAgICAgIHBhcmVudCA9IHZhbHVlXG4gICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgdGVtcCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBhbnkpID0+IGNoaWxkLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogbnVsbFxuICAgICAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gKGNyZWF0ZWRUZXJtcy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgICBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50LCBjcmVhdGVkVGVybXMgKVxuICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPWZhbHNlO1xuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFNlbGVjdGVkVGVybVxuICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgfSkgOiBbXVxuICAgICAgICBhc3NvY2lhdGlvbnMgPSBbLi4uYXNzb2NpYXRpb25zLCAuLi5jcmVhdGVkVGVybXNJZGVudGlmaWVyc11cbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9uc1YyKGNvdW50ZXIsIHBhcmVudCwgcmVndWVzdEJvZHkpXG5cbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlRnJhbWV3b3JrTGlzdCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCBwYXJlbnQsIGNyZWF0ZWRUZXJtcyApXG4gICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUgfSlcbiAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9ZmFsc2U7XG4gICAgICAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAndGhlbWUnKXtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3N1YnRoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgfVxuICAgfVxuIH1cblxuIGFzeW5jIGNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyOmFueSwgcGFyZW50OmFueSwgcmVndWVzdEJvZHkgOmFueSk6IFByb21pc2U8YW55PntcbiAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgcGFyZW50LmNhdGVnb3J5LCBwYXJlbnQuY29kZSwgcmVndWVzdEJvZHkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi50aGlzLnNlbGVjdGVkVGVybUFycmF5XTp0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgIGxldCBsaXN0RGF0YSA6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICBsZXQgZGlmZmVyZW5jZURhdGEgPSBbXVxuICAgICAgICBpZihsaXN0RGF0YSAmJiBsaXN0RGF0YS5jaGlsZHJlbiAmJiBsaXN0RGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBkaWZmZXJlbmNlRGF0YSAgPSBfLmRpZmZlcmVuY2VCeSh0aGlzLnNlbGVjdGVkVGVybUFycmF5LGxpc3REYXRhLmNoaWxkcmVuLCAnaWRlbnRpZmllcicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmZlcmVuY2VEYXRhID0gdGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICB9XG4gICAgICAgIGxpc3REYXRhWydhc3NvY2lhdGlvbnMnXSA9IGxpc3REYXRhICYmIGxpc3REYXRhLmFzc29jaWF0aW9ucyA/Wy4uLmxpc3REYXRhLmFzc29jaWF0aW9ucywgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG4gICAgICAgIGxpc3REYXRhWydjaGlsZHJlbiddID0gbGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gP1suLi5saXN0RGF0YS5jaGlsZHJlbiwgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG5cbiAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgoc2VsZWN0ZWREYXRhOiBhbnkpPT4ge1xuICAgICAgICAgIGxldCBsaXN0RGF0YSA6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldChzZWxlY3RlZERhdGEuY2F0ZWdvcnkpXG4gICAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlTG9jYWxMaXN0KGxpc3REYXRhLHBhcmVudCwgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSwgJ2NyZWF0ZScpXG4gICAgICAgICAgfVxuICAgICAgICB9KSBcbiAgICAgICBpZiAoY291bnRlciA9PT0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2l6ZSkge1xuICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcbiBcbiAgICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAvLyAgY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6IHt9XG4gICAgICAgIC8vICBjb25zdCBmb3VuZCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maW5kKGM9PiBjLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogZmFsc2VcbiAgICAgICAgIC8vIGlmKCFmb3VuZCkge1xuICAgICAgICAgLy8gICBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzLnNlbGVjdGVkVGVybSkgOiBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBbdGhpcy5zZWxlY3RlZFRlcm1dXG4gICAgICAgICAvLyB9XG4gICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgLy8gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnB1Ymxpc2hGcmFtZXdvcmsoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgIC8vICAgLy8gdGhpcy5kaWFsb2dSZWYuY2xvc2UodGVybSlcbiAgICAgICAgIC8vICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgIC8vIH0pO1xuICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKVxuICAgICAgIH1cbiAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICB9KVxuICAgfSlcbiAgfVxuXG59IiwiPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSB8fCAnZGVmYXVsdENyZWF0ZSdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZU11bHRpQ3JlYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtMSB3LTEwMCBhYnNvbHV0ZSBsb2FkZXItYmcgaXRlbXMtY2VudGVyIHB0LTUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJkaXNwbGF5LWlubGluZS1ibG9jayBtYi01XCIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgIDwhLS0gPHA+e3tsb2FkZXJNc2d9fTwvcD4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0IFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lQ3JlYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RoZW1lJ1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lQ3JlYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N1YnRoZW1lJ1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lQ3JlYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Rlc2lnbmF0aW9uJ1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoZW1lRGVzaWduYXRpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29tcGV0ZW5jeSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wVGhlbWVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI21vZGFsVGl0bGU+XG4gICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZScgfHwgZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3tkYXRhLmNvbHVtbkluZm8ubmFtZSA9PT0gJ1RoZW1lJyA/IGFwcF9zdHJpbmdzLmFkZENvbXBldGVuY3kgOiBhcHBfc3RyaW5ncy5jcmVhdGVOZXd9fSB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPkFkZCB7e2RhdGE/LmNvbHVtbkluZm8/LmNvbmZpZz8uY2F0ZWdvcnlEaXNwbGF5TmFtZSB8fCBkYXRhLmNvbHVtbkluZm8ubmFtZSB9fSA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ3ZpZXcnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3thcHBfc3RyaW5ncy5lZGl0fX0ge3tkYXRhPy5jb2x1bW5JbmZvPy5jb25maWc/LmNhdGVnb3J5RGlzcGxheU5hbWUgfHwgZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Q3JlYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtb2RhbFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGVybUZvcm1cIiBub3ZhbGlkYXRlIChuZ1N1Ym1pdCk9XCJkaXNhYmxlQ3JlYXRlP3VwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKTpzYXZlVGVybSgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZGVmYXVsdEZvcm1cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGVybUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLmRlc2NyaXB0aW9ufX1cIiBtYXhsZW5ndGg9XCIyMDAwXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJkZWZhdWx0XCIgdHlwZT1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpYWxvZ0Nsb3NlKCcnKVwiPnt7YXBwX3N0cmluZ3MuY2FuY2VsfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZSB8fCBkaXNhYmxlTXVsdGlDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmNyZWF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MudXBkYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RoZW1lQ3JlYXRlID5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZC1kaXYnOiBkaXNhYmxlTXVsdGlDcmVhdGV9XCIgPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlcm0gb2YgZGF0YT8uc2VsZWN0ZWRQYXJlbnRUZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDYXRlZ29yeU5hbWUodGVybS5jYXRlZ29yeSx0ZXJtKX19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgbmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVybS5uYW1lXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSAhPT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwidGhlbWVGb3JtXCIgW2Zvcm1Hcm91cF09XCJjcmVhdGVUaGVtZUZvcm1cIiBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImRpc2FibGVDcmVhdGU/dXBkYXRlVGVybUFzc29jaWF0aW9ucygpOnNhdmVUaGVtZVRlcm0oKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIiAqbmdJZj1cImRhdGEuY29sdW1uSW5mbz8uY29kZSAhPT0gJ2NvbXBldGVuY3lhcmVhJyAmJiBkYXRhLm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzPy5uYW1lfX1cIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50LGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaCBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGNsYXNzPVwiYXNzaWduZWVTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgIChrZXl1cCk9XCJvbktleSgkZXZlbnQpXCIgbWF0SW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE1hc3Rlckxpc3RcIiAgICAoYmx1cik9XCJ1cGRhdGVEbmFtZShvcHRpb24/LnRpdGxlLCBjcmVhdGVUaGVtZUZvcm0pXCIgW2Rpc2FibGVkXT1cIm9uRGlzYWJsZVRoZW1lKG9wdGlvbilcIiBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24udGl0bGV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImZpbHRlcmVkTWFzdGVyTGlzdC5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVzdWx0cyBmb3VuZCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG5hbWUudmFsdWUsIGNyZWF0ZVRoZW1lRm9ybSlcIiBtYXhsZW5ndGg9XCI3MFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImluZm8taWNvbiBjdXJzb3ItcG9pbnRlclwiIFttYXRUb29sdGlwXT1cInRvb2xUaXBUZXh0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcC1zZWNcIj5pbmZvX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRuYW1lXCIgaWQ9XCJkbmFtZVwiICNkbmFtZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpZWxkIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIG5hbWUgZmllbGQuXCIgbWF4bGVuZ3RoPVwiNzBcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIiAqbmdJZj1cImRhdGEuY29sdW1uSW5mbz8uY29kZSA9PT0gJ2NvbXBldGVuY3lhcmVhJyAmJiBkYXRhLm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgW3ZhbHVlXT1cImRhdGE/LmNoaWxkcmVuRGF0YT8ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWxhYmVsPkVudGVyIHt7ZGF0YS5uYW1lfX0gbmFtZTwvbWF0LWxhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IFtjZGtUZXh0YXJlYUF1dG9zaXplXSBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5kZXNjcmlwdGlvbn19XCIgbWF4bGVuZ3RoPVwiMjAwMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRlcm1EYXRhKGNyZWF0ZVRoZW1lRm9ybSwgZGF0YSlcIiBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInRoZW1lRm9ybVwiIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGlcIiBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImRpc2FibGVDcmVhdGU/dXBkYXRlVGVybUFzc29jaWF0aW9ucygpOnNhdmVUaGVtZVRlcm0oKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZW5kIG1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYXQtYnV0dG9uIGZsZXggaXRlbXMtY2VudGVyIFwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiIChjbGljayk9XCJhZGRUaGVtZUZpZWxkcygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yIG1hdC1pY29uLWN1c3RvbSBcIj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIG1vcmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZm9ybUFycmF5TmFtZT1cInRoZW1lRmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICNtZXA9XCJtYXRFeHBhbnNpb25QYW5lbFwiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB0aGVtZUZpZWxkc0NvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0XCIgXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWJvdHRvbS1sXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtleHBhbmRlZF09XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRFeHBhbnNpb25UaXRsZShmaWVsZCl9fSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGhlbWVGaWVsZHMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLWN1c3RvbSBcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlciBtYXJnaW4tdG9wLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG5hbWUudmFsdWUsIGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBpKVwiIG1heGxlbmd0aD1cIjcwXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzPy5uYW1lfX1cIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2UoJGV2ZW50LGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBpIClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNzZWFyY2ggYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBjbGFzcz1cImFzc2lnbmVlU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAgIChrZXl1cCk9XCJvbktleSgkZXZlbnQpXCIgbWF0SW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRNYXN0ZXJMaXN0XCIgICAgKGJsdXIpPVwidXBkYXRlRG5hbWUob3B0aW9uPy50aXRsZSwgY3JlYXRlVGhlbWVGb3JtTXVsdGksIGkpXCIgW2Rpc2FibGVkXT1cIm9uRGlzYWJsZVRoZW1lKG9wdGlvbilcIiAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLnRpdGxlfX0gPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImZpbHRlcmVkTWFzdGVyTGlzdC5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlc3VsdHMgZm91bmQhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncz8uYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb24gY3Vyc29yLXBvaW50ZXJcIiBbbWF0VG9vbHRpcF09XCJ0b29sVGlwVGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJ0b29sdGlwLXNlY1wiPmluZm9fb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkbmFtZVwiIGlkPVwiZG5hbWVcIiAjZG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmllbGQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgbmFtZSBmaWVsZC5cIiBtYXhsZW5ndGg9XCI3MFwiIFtkaXNhYmxlZF09XCJuYW1lPy52YWx1ZT8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1hcmlhLWxhYmVsIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IFtjZGtUZXh0YXJlYUF1dG9zaXplXSBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0F1dG9zaXplTWluUm93c109XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MuZGVzY3JpcHRpb259fVwiIG1heGxlbmd0aD1cIjIwMDBcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1lcC5leHBhbmRlZCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGk/LmdldCgndGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXS5pbnZhbGlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgIDxmb290ZXIgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJkZWZhdWx0XCIgdHlwZT1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmFkZF9idG59fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGkuaW52YWxpZCB8fCBkaXNhYmxlTXVsdGlDcmVhdGVcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCIgKGNsaWNrKT1cIm11bHRpQ3JlYXRlKGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBkYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuYWRkX2J0bn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGhlbWVEZXNpZ25hdGlvbj5cbiAgICA8ZGl2IGNsYXNzPVwidGhlbURlc2lnbmF0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dOZXdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXNhdGlvblwiPk9yZ2FuaXNhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3JnLW5hbWUgcGwtNCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuPkRlcGFydG1lbnQgb2YgRmlzaGVyaWVzPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tkYXRhPy5jb2x1bW5JbmZvPy5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBtdC00XCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhZGQtZGVzaWduYXRpb24gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwiYWRkRGVzaWduYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGQtaWNvbiBtci0yXCI+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkIERlc2lnbmF0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgICAgICAgICAgPGZvcm0gIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGhlbWVGb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiIGZvcm1BcnJheU5hbWU9XCJkZXNpZ25hdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRlc2lnbmF0aW9uIG9mIGRlc2lnbmF0aW9uQ29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZm9ybUdyb3VwTmFtZV09XCJpXCIgIGNsYXNzPVwiZGVzaWduYXRpb24tcGFuZWxcIiBbZXhwYW5kZWRdPVwicGFuZWxPcGVuU3RhdGVbaV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRlbGV0RGVzaWduYXRpb24gbXItNFwiIChjbGljayk9XCJkZWxldGVEZXNpZ25hdGlvbihpKVwiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzaWduYXRpb24gTmFtZSA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJUeXBlIGhlcmVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIiAoY2hhbmdlKT1cImNsZWFyU2VsZWN0ZWREZXNpZ25haW9uT25DaGFuZ2UoaSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBkZXNpZ25hdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0RmlsdGVyZWREZXNpZ25hdGlvbkxpc3QoaSlcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkZXNpZ25hdGlvbkRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB0aGUgZGVjcmlwdGlvbiBpbiBmZXdlciB0aGFuIDYwMCBjaGFyYWN0ZXJzXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJzYXZlRGVzaWduYXRvbiBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlRGVzaWduYXRpb24oaSlcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBnYXAtNCBtdC01IGRlc2lnbmF0aW9uLWZvb3RlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCIhZW5hYmxlQWRkQnRuXCIgY2xhc3M9XCJhZGRCdG4gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwic3VibWl0RGVzaWduYXRpb24oKVwiPkFkZDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2NvbXBUaGVtZT5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBkYXRhPy5zZWxlY3RlZFBhcmVudFRlcm1zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e3Rlcm0uY2F0ZWdvcnl9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm0ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjb21wZXRlbmN5Rm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7J1NlbGVjdCBBcmVhJ319XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTVcIj5cbiAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wQXJlYVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwibGVhcm5pbmctc2VjdGlvblwiICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhbGxDb21wZXRlbmN5XCIgW3ZhbHVlXT1cIml0ZW1cIiAoY2hhbmdlKT1cIm9uU2VsZWN0aW9uQXJlYShpdGVtKVwiPnt7aXRlbS5uYW1lfX08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlICE9PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJ0aGVtZUZvcm1cIiBbZm9ybUdyb3VwXT1cImNyZWF0ZVRoZW1lRm9ybVwiIG5vdmFsaWRhdGVcbiAgICAgICAgICAgICAgICAobmdTdWJtaXQpPVwiZGlzYWJsZUNyZWF0ZT91cGRhdGVUZXJtQXNzb2NpYXRpb25zKCk6c2F2ZVRoZW1lVGVybSgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlciBtYXJnaW4tdG9wLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidXBkYXRlRG5hbWUobmFtZS52YWx1ZSwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZG5hbWVcIiBpZD1cImRuYW1lXCIgI2RuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb21wZXRlbmN5IGRpc3BsYXkgbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbY2RrVGV4dGFyZWFBdXRvc2l6ZV0gW2Nka0F1dG9zaXplTWF4Um93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MuZGVzY3JpcHRpb259fVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRlcm1EYXRhKGNyZWF0ZVRoZW1lRm9ybSwgZGF0YSlcIiBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWVuZCBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWF0LWJ1dHRvbiBmbGV4IGl0ZW1zLWNlbnRlciBcIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIiAoY2xpY2spPVwiYWRkQ29tcGV0ZW5jeVRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTIgbWF0LWljb24tY3VzdG9tIFwiPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBBZGQge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGZvcm1BcnJheU5hbWU9XCJjb21wVGhlbWVGaWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGNvbXBldGVuY3lGb3JtPy5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpWydjb250cm9scyddOyBsZXQgaSA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0XCIgXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWJvdHRvbS1sXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtleHBhbmRlZF09XCJpc0ZpcnN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e25hbWU/LnZhbHVlfX0gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb21wRmllbGRzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1jdXN0b20gXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IENvbXBldGVuY3kgVGhlbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFRoZW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgY2xhc3M9XCJhc3NpZ25lZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiICBmb3JtQ29udHJvbE5hbWU9XCJhc3NpZ25lZVRleHRcIiBtYXRJbnB1dD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lXCIgW3ZhbHVlXT1cIm9wdGlvblwiIChvblNlbGVjdGlvbkNoYW5nZSk9XCJPblRoZW1lU2VsZWN0aW9uKCRldmVudClcIiAgPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNUZXJtRXhpc3RcIj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZG5hbWVcIiBpZD1cImRuYW1lXCIgI2RuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNvbXBldGVuY3kgZGlzcGxheSBuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1hcmlhLWxhYmVsIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IENvbXBldGVuY3kgU3ViLVRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFRoZW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0ICNzZWFyY2ggYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBjbGFzcz1cImFzc2lnbmVlU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAgZm9ybUNvbnRyb2xOYW1lPVwiYXNzaWduZWVUZXh0XCIgbWF0SW5wdXQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgIDxmb290ZXIgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJkZWZhdWx0XCIgdHlwZT1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmNyZWF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm1NdWx0aS5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZShjcmVhdGVUaGVtZUZvcm1NdWx0aSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmNyZWF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgXG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==