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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +770 -200
  2. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
  3. package/index.d.ts +1052 -3
  4. package/index.d.ts.map +1 -0
  5. package/package.json +14 -16
  6. package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
  7. package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -41
  8. package/esm2022/lib/components/approval/approval.component.mjs +0 -19
  9. package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -64
  10. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -44
  11. package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -55
  12. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -74
  13. package/esm2022/lib/components/connector/connector.component.mjs +0 -59
  14. package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -83
  15. package/esm2022/lib/components/create-term/create-term.component.mjs +0 -847
  16. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -824
  17. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -223
  18. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -64
  19. package/esm2022/lib/components/term-card/term-card.component.mjs +0 -340
  20. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -354
  21. package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -826
  22. package/esm2022/lib/constants/app-constant.mjs +0 -40
  23. package/esm2022/lib/constants/data.mjs +0 -6972
  24. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -92
  25. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -14
  26. package/esm2022/lib/labels/strings.mjs +0 -40
  27. package/esm2022/lib/models/approval.model.mjs +0 -2
  28. package/esm2022/lib/models/connection-type.model.mjs +0 -2
  29. package/esm2022/lib/models/connection.model.mjs +0 -2
  30. package/esm2022/lib/models/framework.model.mjs +0 -2
  31. package/esm2022/lib/models/variable-type.model.mjs +0 -2
  32. package/esm2022/lib/pipes/order-by.pipe.mjs +0 -35
  33. package/esm2022/lib/services/approval.service.mjs +0 -47
  34. package/esm2022/lib/services/connection.service.mjs +0 -3
  35. package/esm2022/lib/services/connector.service.mjs +0 -286
  36. package/esm2022/lib/services/framework.service.mjs +0 -525
  37. package/esm2022/lib/services/local-connection.service.mjs +0 -75
  38. package/esm2022/lib/services/odcs.service.mjs +0 -23
  39. package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -43
  40. package/esm2022/lib/tree-hierarchy.component.mjs +0 -24
  41. package/esm2022/lib/tree-hierarchy.module.mjs +0 -145
  42. package/esm2022/lib/tree-hierarchy.service.mjs +0 -57
  43. package/esm2022/material.module.mjs +0 -199
  44. package/esm2022/public-api.mjs +0 -9
  45. package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
  46. package/lib/components/action-bar/action-bar.component.d.ts +0 -17
  47. package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
  48. package/lib/components/approval/approval.component.d.ts +0 -10
  49. package/lib/components/approval/approval.component.d.ts.map +0 -1
  50. package/lib/components/approve-view/approve-view.component.d.ts +0 -27
  51. package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
  52. package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
  53. package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
  54. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
  55. package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
  56. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
  57. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
  58. package/lib/components/connector/connector.component.d.ts +0 -23
  59. package/lib/components/connector/connector.component.d.ts.map +0 -1
  60. package/lib/components/create-categories/create-categories.component.d.ts +0 -26
  61. package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
  62. package/lib/components/create-term/create-term.component.d.ts +0 -148
  63. package/lib/components/create-term/create-term.component.d.ts.map +0 -1
  64. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
  65. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
  66. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
  67. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
  68. package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
  69. package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
  70. package/lib/components/term-card/term-card.component.d.ts +0 -53
  71. package/lib/components/term-card/term-card.component.d.ts.map +0 -1
  72. package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -56
  73. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
  74. package/lib/components/tree-view/tree-view.component.d.ts +0 -102
  75. package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
  76. package/lib/constants/app-constant.d.ts +0 -44
  77. package/lib/constants/app-constant.d.ts.map +0 -1
  78. package/lib/constants/data.d.ts +0 -117
  79. package/lib/constants/data.d.ts.map +0 -1
  80. package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
  81. package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
  82. package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
  83. package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
  84. package/lib/labels/strings.d.ts +0 -40
  85. package/lib/labels/strings.d.ts.map +0 -1
  86. package/lib/models/approval.model.d.ts +0 -11
  87. package/lib/models/approval.model.d.ts.map +0 -1
  88. package/lib/models/connection-type.model.d.ts +0 -6
  89. package/lib/models/connection-type.model.d.ts.map +0 -1
  90. package/lib/models/connection.model.d.ts +0 -7
  91. package/lib/models/connection.model.d.ts.map +0 -1
  92. package/lib/models/framework.model.d.ts +0 -89
  93. package/lib/models/framework.model.d.ts.map +0 -1
  94. package/lib/models/variable-type.model.d.ts +0 -46
  95. package/lib/models/variable-type.model.d.ts.map +0 -1
  96. package/lib/pipes/order-by.pipe.d.ts +0 -10
  97. package/lib/pipes/order-by.pipe.d.ts.map +0 -1
  98. package/lib/services/approval.service.d.ts +0 -21
  99. package/lib/services/approval.service.d.ts.map +0 -1
  100. package/lib/services/connection.service.d.ts +0 -4
  101. package/lib/services/connection.service.d.ts.map +0 -1
  102. package/lib/services/connector.service.d.ts +0 -18
  103. package/lib/services/connector.service.d.ts.map +0 -1
  104. package/lib/services/framework.service.d.ts +0 -89
  105. package/lib/services/framework.service.d.ts.map +0 -1
  106. package/lib/services/local-connection.service.d.ts +0 -18
  107. package/lib/services/local-connection.service.d.ts.map +0 -1
  108. package/lib/services/odcs.service.d.ts +0 -11
  109. package/lib/services/odcs.service.d.ts.map +0 -1
  110. package/lib/tree-hierarchy-routing.module.d.ts +0 -8
  111. package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
  112. package/lib/tree-hierarchy.component.d.ts +0 -13
  113. package/lib/tree-hierarchy.component.d.ts.map +0 -1
  114. package/lib/tree-hierarchy.module.d.ts +0 -33
  115. package/lib/tree-hierarchy.module.d.ts.map +0 -1
  116. package/lib/tree-hierarchy.service.d.ts +0 -21
  117. package/lib/tree-hierarchy.service.d.ts.map +0 -1
  118. package/material.module.d.ts +0 -52
  119. package/material.module.d.ts.map +0 -1
  120. package/public-api.d.ts +0 -9
  121. package/public-api.d.ts.map +0 -1
  122. package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
@@ -1,847 +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
- export 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
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermComponent, decorators: [{
841
- type: Component,
842
- 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"] }]
843
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
844
- type: Inject,
845
- args: [MAT_DIALOG_DATA]
846
- }] }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.OdcsService }, { type: i5.MatLegacySnackBar }, { type: i0.ChangeDetectorRef }]; } });
847
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS9jcmVhdGUtdGVybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXNDLHNCQUFzQixJQUFJLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhJLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRyxPQUFPLEtBQUssWUFBWSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUk5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUTNCLE1BQU0sT0FBTyxtQkFBbUI7SUF3QzlCLFlBQ1MsU0FBNEMsRUFDbkIsSUFBUyxFQUNqQyxnQkFBa0MsRUFDbEMsRUFBc0IsRUFDdEIsV0FBd0IsRUFDeEIsU0FBc0IsRUFDdEIsR0FBcUI7UUFOdEIsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7UUE5Qy9CLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFHNUIsb0JBQWUsR0FBcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEQseUJBQW9CLEdBQXFCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNELGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixpQkFBWSxHQUFTLEVBQUUsQ0FBQztRQUN4QixnQkFBVyxHQUFHLE1BQU0sQ0FBQztRQUNyQixZQUFPLEdBQUcsRUFBRSxDQUFBO1FBQ1osc0JBQWlCLEdBQVEsRUFBRSxDQUFBO1FBQzNCLDBCQUFxQixHQUFHLENBQUMsQ0FBQTtRQUN6QixxQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDckIsbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFDM0Isa0JBQWEsR0FBTyxFQUFFLENBQUE7UUFFdEIsdUJBQWtCLEdBQU8sRUFBRSxDQUFBO1FBQzNCLCtCQUEwQixHQUFPLEVBQUUsQ0FBQTtRQUNuQywwQkFBcUIsR0FBTyxFQUFFLENBQUE7UUFDOUIsa0NBQTZCLEdBQU8sRUFBRSxDQUFBO1FBQ3RDLG1CQUFjLEdBQXFCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELGtCQUFhLEdBQVUsRUFBRSxDQUFBO1FBQ3pCLGVBQVUsR0FBTyxFQUFFLENBQUM7UUFDcEIsdUJBQWtCLEdBQU8sRUFBRSxDQUFDO1FBQzVCLG1CQUFjLEdBQVUsRUFBRSxDQUFBO1FBRWxCLGtCQUFhLEdBQVcsR0FBRyxDQUFDO1FBQ3BDLFdBQU0sR0FBRSxFQUFFLENBQUE7UUFDVixnQkFBVyxHQUFHLHVGQUF1RixDQUFBO1FBQ3JHLHlCQUFvQixHQUFVLEVBQUUsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFDN0Isb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsd0JBQW1CLEdBQVEsRUFBRSxDQUFBO1FBQzdCLHNCQUFpQixHQUFPLEVBQUUsQ0FBQTtRQVl4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVELFFBQVE7UUFFTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQTtRQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUE7UUFFMUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBRXJCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNsQixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNsQixDQUFDLENBQUE7UUFPRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDeEMsV0FBVyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztTQUN0RCxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3RFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFDYixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQTthQUM1QztpQkFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFBO2FBQzdDO1lBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNsQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBR0YsSUFDRSxJQUFJLENBQUMsSUFBSTtZQUNULENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQzNCO1lBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pDLEtBQUssT0FBTztvQkFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNoRSxNQUFLO2dCQUNQLEtBQUssVUFBVTtvQkFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNuRSxNQUFLO2dCQUNQO29CQUFTLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzNELE1BQUs7YUFDUjtZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1NBQzFCO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSTtZQUNsQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUFFO1lBQzdCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUNqQyxLQUFLLE9BQU87b0JBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDaEUsTUFBSztnQkFDUCxLQUFLLFVBQVU7b0JBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDbkUsTUFBSztnQkFDUDtvQkFBUyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUMzRCxNQUFLO2FBQ1I7U0FDRjthQUFNLElBQUksSUFBSSxDQUFDLElBQUk7WUFDbEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsRUFBRTtTQVN0QztJQUNILENBQUM7SUFFRCxnQkFBZ0I7SUFlaEIsQ0FBQztJQW1CRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFxQixDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2hFLE9BQWEsV0FBWSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1lBRXJDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWE7UUFDN0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBQ0QsYUFBYSxDQUFDLElBQVk7UUFDekIsUUFBTyxJQUFJLEVBQUM7WUFDWCxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxrQkFBa0IsSUFBSSxFQUFFLENBQUM7WUFDbEMsS0FBSyxXQUFXO2dCQUNkLE9BQU8sa0JBQWtCLElBQUksRUFBRSxDQUFDO1lBQ2xDO2dCQUNFLE9BQU8sT0FBTyxJQUFJLEVBQUUsQ0FBQztTQUN2QjtJQUNGLENBQUM7SUFFRCxlQUFlLENBQUMsWUFBZ0IsRUFBRSxJQUFRO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7UUFDekMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFFakMsUUFBTyxZQUFZLEVBQUM7WUFDbEIsS0FBSyxnQkFBZ0I7Z0JBQ25CLE9BQU8saUJBQWlCLENBQUM7WUFDM0IsS0FBSyxPQUFPO2dCQUNWLE9BQU8sa0JBQWtCLENBQUM7WUFDNUIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sc0JBQXNCLENBQUM7WUFDaEM7Z0JBQ0UsT0FBTyxZQUFZLENBQUM7U0FDdEI7SUFDSixDQUFDO0lBR0QsT0FBTyxDQUFDLElBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFnQjtRQUU1QixRQUFPLFNBQVMsRUFBQztZQUNoQixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxjQUFjLFNBQVMsT0FBTyxDQUFDO1lBQ3RDLEtBQUssV0FBVztnQkFDaEIsT0FBTyxjQUFjLFNBQVMsT0FBTyxDQUFBO1lBQ3JDO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1NBQ3JCO0lBQ0YsQ0FBQztJQUlELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLGVBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxrQkFBa0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQztJQUN4RSxDQUFDO0lBUUQsY0FBYyxDQUFDLElBQVEsRUFBRSxJQUFRO1FBQy9CLElBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBQztZQUMzSCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUvRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQ3RDLENBQUE7WUFDRCxJQUFJLFVBQVUsRUFBRTtnQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQTthQUMzQztTQUVGO1FBS0gsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBR25DLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFRLEVBQUUsSUFBUTtRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2hGLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDakUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsS0FBSyxDQUN4QyxDQUFBO1lBQ0QsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7YUFDM0M7U0FFRjtRQUdELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQVM7UUFJWixZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBR25DLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9FLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUlELGVBQWUsQ0FBQyxXQUFtQixFQUFFLEtBQVU7UUFDN0MsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLGlCQUFpQixFQUFFO2dCQUNqQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxRQUFRLEVBQUUsSUFBSTthQUNqQjtZQUNELGVBQWUsRUFBRSxFQUFFO1lBQ25CLFVBQVUsRUFBRSxDQUFDO1lBQ2IsUUFBUSxFQUFDLElBQUk7U0FDWixDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFZLEVBQUMsRUFBRTtZQUNyRyxJQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQzlDLFVBQVUsQ0FBQyxHQUFFLEVBQUU7b0JBQ2IsSUFBRyxJQUFJLENBQUMsSUFBSTt3QkFDVixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUFDO3dCQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUNyRDt5QkFDSSxJQUFHLElBQUksQ0FBQyxJQUFJO3dCQUNmLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUM7d0JBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ3ZEO2dCQUdMLENBQUMsRUFBQyxJQUFJLENBQUMsQ0FBQTthQUdSO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFHSixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQVc7UUFDeEIsSUFBSSxTQUFTLENBQUE7UUFDYixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRyxJQUFHLHNCQUFzQixFQUFFO1lBQ3pCLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNqRjtRQUNELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ2YsSUFBRyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBQztZQUM5RCxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFHLEdBQUcsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLEVBQUc7b0JBQzNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUM5RDtnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFBO1NBSUg7UUFDRCxJQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDWixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBcUIsQ0FBQztZQUNqRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDbEQsSUFBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFDO29CQUNqQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUM7aUJBQ3RDO2dCQUNELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7U0FDSDtRQUdGLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDbEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFRLEVBQUUsS0FBUztRQUM3QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQzlCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQTtRQUNmLElBQUksWUFBWSxHQUFPLEVBQUUsQ0FBQTtRQUN6QixJQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFFYixNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQTtZQUVoRSxJQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUNwQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQU0sRUFBRSxFQUFFO29CQUN0QyxNQUFNLElBQUksR0FBNEI7d0JBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO3dCQUNyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDO3dCQUM5QixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7d0JBQzVCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO3dCQUNuQyxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUk7d0JBQ3pCLEtBQUssRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2pCLE9BQU8sRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO3dCQUdqQyxPQUFPLEVBQUU7NEJBQ1AsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRTt5QkFDdEY7d0JBQ0Qsb0JBQW9CLEVBQUU7NEJBQ3BCLFdBQVcsRUFBQyxHQUFHLENBQUMsS0FBSzs0QkFDckIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO3lCQUNoQztxQkFDRixDQUFBO29CQUNELE1BQU0sV0FBVyxHQUFRO3dCQUN2QixPQUFPLEVBQUU7NEJBQ1AsSUFBSSxFQUFFLElBQUk7eUJBQ1g7cUJBQ0YsQ0FBQTtvQkFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTt3QkFDckgsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7d0JBQzlELFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFFM0MsT0FBTyxFQUFFLENBQUE7d0JBRVQsSUFBRyxPQUFPLEtBQUssV0FBVyxDQUFDLE1BQU0sRUFBQzs0QkFHaEMsTUFBTSxZQUFZLEdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBOzRCQUM3RixJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBQy9FLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUcsU0FBUyxDQUFDLENBQUE7eUJBRzdEO29CQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7YUFDL0I7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsWUFBbUI7UUFDbEQsSUFBSSxNQUFXLENBQUE7UUFDaEIsSUFBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUN0QyxJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtZQUMzQixLQUFJLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUE7Z0JBQy9CLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQTtnQkFDckIsSUFBSSxJQUFJLENBQUE7Z0JBQ1IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFBO2dCQUNmLEtBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUM7b0JBQ3RELE1BQU0sR0FBRyxLQUFLLENBQUE7b0JBQ2YsT0FBTyxFQUFFLENBQUE7b0JBQ1QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtvQkFDekgsWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUU7d0JBRTdELE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7b0JBQzVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7b0JBQ1AsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7d0JBQ3ZCLE9BQU07cUJBQ1A7eUJBQU07d0JBQ0gsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7d0JBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO3dCQUV0QixNQUFNLFdBQVcsR0FBRzs0QkFDbEIsT0FBTyxFQUFFO2dDQUNQLElBQUksRUFBRTtvQ0FDSixHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7aUNBQ3BGOzZCQUNGO3lCQUNGLENBQUE7d0JBRUQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtxQkFHcEU7aUJBQ0Y7Z0JBQ0QsbUJBQW1CLEVBQUUsQ0FBQTtnQkFDckIsSUFBRyxtQkFBbUIsS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFO29CQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUUsQ0FBQTtvQkFDM0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO29CQUMxRSxJQUFJLENBQUMsa0JBQWtCLEdBQUUsS0FBSyxDQUFDO29CQUMvQixJQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFDO3dCQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLHdCQUF3QixDQUFDLENBQUE7cUJBQ3BGO29CQUNELElBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUM7d0JBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsd0JBQXdCLENBQUMsQ0FBQTtxQkFDcEY7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELHNCQUFzQixDQUFDLE9BQVcsRUFBRSxNQUFVLEVBQUUsV0FBZTtRQUM3RCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDaEgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUVoSCxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtvQkFVeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7b0JBTTFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDZDtxQkFBTTtvQkFDTCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDckI7WUFDSCxDQUFDLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFBO1lBQ25GLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVUsRUFBRSxLQUFTLEVBQUUsRUFBTztJQU8xQyxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQVUsRUFBQyxJQUFTLEVBQUUsQ0FBTztRQUNsQyxJQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDOUIsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUM7Z0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQTtnQkFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTthQUV6QjtZQUNELElBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFDO2dCQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzFELFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNuRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQTtnQkFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtnQkFDeEIsSUFBRyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7b0JBQ2xFLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFBO2lCQUNyQztxQkFBTSxJQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO29CQUNyQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQTtpQkFDdEM7YUFDRjtTQUNGO0lBRUgsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQVM7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDdEMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUtELElBQUksbUJBQW1CO1FBQ3JCLE9BQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFzQixDQUFDLFFBQVEsQ0FBQztJQUNqRixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUM1QyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7UUFDM0MsQ0FBQyxFQUNELENBQUMsSUFBUyxFQUFFLEVBQUU7UUFDZCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxLQUFhO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDbkYsSUFBRyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQzNILE9BQU8sWUFBWSxDQUFBO1NBQ3BCO1FBRUQsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQy9CLEVBQUUsRUFBQyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzlCLHNCQUFzQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hCLFVBQVUsRUFBRSxJQUFJLENBQUMscUJBQXFCO1NBQ3ZDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELCtCQUErQixDQUFDLEtBQVMsRUFBRSxLQUFTO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDeEUsSUFBRyxZQUFZLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTtZQUMvQixNQUFNLG1CQUFtQixHQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMvRCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7U0FDdEM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBcUIsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxLQUFLLGdCQUFnQixDQUFDLENBQUE7SUFDckksQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQTtRQUM3QyxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QyxJQUFJLGlCQUFpQixDQUFDLEtBQUssRUFBRTtZQUMzQixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtZQUN0QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzlILElBQUkscUJBQXFCLElBQUksQ0FBQyxFQUFFO2dCQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUE7YUFDeEU7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUNyRDtTQUNGO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtJQUVqQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDeEIsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLElBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxhQUFhLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7U0FDMUQ7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFJTyxPQUFPLENBQUMsU0FBYztRQUM1QixJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBRS9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdILE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDckcsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxLQUFhO1FBQ25DLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFVO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFDLEVBQUU7WUFDcEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUE7Z0JBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFBO2dCQUN0QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFBO2FBRTFEO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBUztRQUV4QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUN4QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDbkQsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFBO2dCQUN6QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFBO2FBQ2hFO1FBRUgsQ0FBQyxDQUFDLENBQUE7SUFHSixDQUFDO0lBY0QsUUFBUSxDQUFDLElBQVEsRUFBRSxJQUFRO1FBQ3pCLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQixLQUFLLGFBQWE7Z0JBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ3hDLE1BQU07WUFDUjtnQkFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQzFELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1NBQzVCO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtZQUV2QixPQUFNO1NBQ1A7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUE0QjtnQkFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUNwQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVztnQkFDbEQsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7Z0JBQ25DLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSTtnQkFHekIsT0FBTyxFQUFFO29CQUNQLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUU7aUJBQ3RGO2dCQUNELG9CQUFvQixFQUFFO29CQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSztvQkFDNUMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO2lCQUNoQzthQUNGLENBQUE7WUFDRCxNQUFNLFdBQVcsR0FBTztnQkFDdEIsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxJQUFJO2lCQUNYO2FBQ0YsQ0FBQTtZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNySCxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQTtnQkFDNUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7WUFDL0IsQ0FBQyxDQUFDLENBQUE7U0FDSDtJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUSxFQUFFLElBQVE7UUFDL0IsSUFBSSxvQkFBb0IsR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFBO1FBQ2xFLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQTtRQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFBO1FBRXRELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFBO1FBRXpDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLE1BQU0sUUFBUSxHQUFHO1lBRWYsR0FBRyxJQUFJLENBQUMsS0FBSztTQUVkLENBQUE7UUFDRCxNQUFNLFVBQVUsR0FBRztZQUNqQixRQUFRO1lBQ1IsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2xDLENBQUE7UUFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUdELDBCQUEwQixDQUFDLFVBQWM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtRQUM5QixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0RixJQUFHLENBQUMsYUFBYSxFQUFHO1lBQ2xCLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQTtTQUN2QztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFFLElBQUksZ0JBQXFCLENBQUE7UUFDekIsSUFBRyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUM1RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDckYsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRTtnQkFFckUsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUM1RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1NBQ1I7UUFDRCxNQUFNLFdBQVcsR0FBRztZQUNsQixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFO29CQUNKLEdBQUcsVUFBVSxDQUFDLFFBQVE7b0JBQ3RCLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDM0Y7YUFDRjtTQUNGLENBQUE7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBSzVILE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBRWxLLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1lBRzFCLGFBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUE7WUFDbkUsYUFBYSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUE7WUFDckYsYUFBYSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGdCQUFnQixDQUFBO1lBR2hELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxDQUFDLFFBQVEsdUJBQXVCLENBQUMsQ0FBQTtZQUN4RSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUN2RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDOUYsQ0FBQyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFBO1FBQ25GLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELHNCQUFzQixDQUFDLFVBQWdCO1FBQ3JDLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNyQixJQUFJLElBQUksQ0FBQTtRQUNSLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQTtRQUVmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckQsT0FBTyxFQUFFLENBQUE7WUFDVCxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQ3hILFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO2dCQUU3RCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQzVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDUCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtnQkFDdkIsT0FBTTthQUNQO2lCQUFNO2dCQUVMLElBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRTtvQkFDcEQsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7aUJBQ2hFO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO2dCQUN4QixNQUFNLFdBQVcsR0FBRztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRTs0QkFDSixHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBQyxDQUFBLENBQUMsQ0FBQyxJQUFJOzRCQUN6SCxHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7eUJBQ3BGO3FCQUNGO2lCQUNGLENBQUE7Z0JBR0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDaEgsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7d0JBS3hELE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO3dCQUVsSyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTt3QkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxLQUFLLENBQUMsUUFBUSx1QkFBdUIsQ0FBQyxDQUFBO3dCQUN4RSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtxQkFDeEQ7Z0JBQ0gsQ0FBQyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksaUNBQWlDLENBQUMsQ0FBQTtnQkFDbkYsQ0FBQyxDQUFDLENBQUE7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM1RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtZQUN2QixPQUFNO1NBQ1A7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxHQUE0QjtnQkFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUNyQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsV0FBVztnQkFFbkQsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7Z0JBQ25DLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSTtnQkFFekIsT0FBTyxFQUFFO29CQUNQLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUU7aUJBQ3RGO2dCQUNELG9CQUFvQixFQUFFO29CQUNwQixXQUFXLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSztvQkFDM0MsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO2lCQUNoQzthQUNGLENBQUE7WUFDRCxNQUFNLFdBQVcsR0FBTztnQkFDdEIsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxJQUFJO2lCQUNYO2FBQ0YsQ0FBQTtZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNySCxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQTtnQkFDNUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7WUFDL0IsQ0FBQyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksaUNBQWlDLENBQUMsQ0FBQTtZQUNyRixDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFTO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsS0FBSyxDQUFDLDZCQUE2QixDQUFDLFlBQW1CLEVBQUUsa0JBQXVCO1FBRTlFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUE7UUFFM0IsSUFBSSx1QkFBdUIsR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQTtRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3hELEtBQUksSUFBSSxXQUFXLElBQUksWUFBWSxFQUFFO1lBQ25DLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtTQUNyRTtRQUNELElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUE7UUFDaEIsSUFBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxJQUFJLE1BQVcsQ0FBQTtZQUNoQixJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtZQUMzQixJQUFHLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3ZCLEtBQUksSUFBSSxXQUFXLElBQUksWUFBWSxFQUFFO29CQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQTtvQkFDL0IsSUFBSSxJQUFJLENBQUE7b0JBQ1IsS0FBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBQzt3QkFDdEQsTUFBTSxHQUFHLEtBQUssQ0FBQTt3QkFDZixPQUFPLEVBQUUsQ0FBQTt3QkFDVCxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO3dCQUN6SCxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTs0QkFFOUQsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTt3QkFDNUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTt3QkFDUCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTs0QkFDdkIsT0FBTTt5QkFDUDs2QkFBTTs0QkFDSCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTs0QkFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7NEJBRXRCLE1BQU0sV0FBVyxHQUFHO2dDQUNsQixPQUFPLEVBQUU7b0NBQ1AsSUFBSSxFQUFFO3dDQUNKLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtxQ0FDcEY7aUNBQ0Y7NkJBQ0YsQ0FBQTs0QkFFRCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFBO3lCQUdwRTtxQkFDRjtvQkFDRCxtQkFBbUIsRUFBRSxDQUFBO29CQUNyQixJQUFHLG1CQUFtQixLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7d0JBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBRSxDQUFBO3dCQUMzRixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksRUFBRSxDQUFDLENBQUE7d0JBQzFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRSxLQUFLLENBQUM7d0JBQy9CLElBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUM7NEJBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsd0JBQXdCLENBQUMsQ0FBQTt5QkFDcEY7d0JBQ0QsSUFBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBQzs0QkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSx3QkFBd0IsQ0FBQyxDQUFBO3lCQUNwRjtxQkFDRjtpQkFDRjthQUNEO2lCQUFNO2dCQUNOLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFBO2dCQUNqQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRTtvQkFDN0QsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtnQkFDNUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtnQkFDTCxZQUFZLEdBQUcsQ0FBQyxHQUFHLFlBQVksRUFBRSxHQUFHLHVCQUF1QixDQUFDLENBQUE7Z0JBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO2dCQUN4QixNQUFNLFdBQVcsR0FBRztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRTs0QkFDSixHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7eUJBQ3BGO3FCQUNGO2lCQUNGLENBQUE7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtnQkFFL0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFFLENBQUE7Z0JBQzNGLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksRUFBRSxDQUFDLENBQUE7Z0JBQzdFLElBQUksQ0FBQyxrQkFBa0IsR0FBRSxLQUFLLENBQUM7Z0JBQy9CLElBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUM7b0JBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsd0JBQXdCLENBQUMsQ0FBQTtpQkFDcEY7Z0JBQ0QsSUFBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBQztvQkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSx3QkFBd0IsQ0FBQyxDQUFBO2lCQUNwRjthQUNMO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQVcsRUFBRSxNQUFVLEVBQUUsV0FBZ0I7UUFDdEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDdEgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUMsaUJBQWlCLENBQUE7Z0JBQ3BILElBQUksUUFBUSxHQUFTLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM5RSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUE7Z0JBQ3ZCLElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQzVELGNBQWMsR0FBSSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO2lCQUMxRjtxQkFBTTtvQkFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFBO2lCQUN4QztnQkFDRCxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUEsQ0FBQyxDQUFBLGNBQWMsQ0FBQTtnQkFDMUgsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxjQUFjLENBQUE7Z0JBRTlHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBaUIsRUFBQyxFQUFFO29CQUMvRCxJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQzFFLElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7d0JBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUE7cUJBQ3pGO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNILElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO29CQVV4RCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtvQkFLMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNkO3FCQUFNO29CQUNMLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNyQjtZQUNILENBQUMsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGlDQUFpQyxDQUFDLENBQUE7WUFDbkYsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNILENBQUM7K0dBaGpDVSxtQkFBbUIsb0RBMENwQixlQUFlO21HQTFDZCxtQkFBbUIsdURDcEJoQyxzenlDQXVsQmM7OzRGRG5rQkQsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQjs7MEJBK0N4QixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZiwgTUFUX0xFR0FDWV9ESUFMT0dfREFUQSBhcyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7IEZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcmFtZXdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIGltcG9ydCB7IElkZW50aWZpZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHsgTlNGcmFtZXdvcmsgfSBmcm9tICcuLi8uLi9tb2RlbHMvZnJhbWV3b3JrLm1vZGVsJztcbmltcG9ydCAqIGFzIGFwcENvbnN0YW50cyBmcm9tICcuLi8uLi9jb25zdGFudHMvYXBwLWNvbnN0YW50JztcbmltcG9ydCB7IGxhYmVscyB9IGZyb20gJy4uLy4uL2xhYmVscy9zdHJpbmdzJztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmFyaWFibGUtdHlwZS5tb2RlbCc7XG5pbXBvcnQgeyBPZGNzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29kY3Muc2VydmljZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jcmVhdGUtdGVybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtdGVybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS10ZXJtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVUZXJtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgbmFtZTogc3RyaW5nID0gJyc7XG4gIHRlcm1MaXN0czogQXJyYXk8Q2FyZD4gPSBbXTtcbiAgZmlsdGVkVGVybUxpc3RzOiBhbnk7XG4gIGNyZWF0ZVRlcm1Gb3JtOiBhbnlcbiAgY3JlYXRlVGhlbWVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIGNyZWF0ZVRoZW1lRm9ybU11bHRpOiBVbnR5cGVkRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIGRpc2FibGVDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzYWJsZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlTXVsdGlDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNUZXJtRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRUZXJtOiBDYXJkID0ge307XG4gIGFwcF9zdHJpbmdzID0gbGFiZWxzO1xuICBjb2xDb2RlID0gJydcbiAgc2F2ZWREZXNpZ25hdGlvbnM6IGFueSA9IFtdXG4gIGFkZGVkRGVzaWduYXRpb25Db3VudCA9IDBcbiAgZGVzaWduYXRpb25zTGlzdCA9IFtdXG4gIHBhbmVsT3BlblN0YXRlOiBhbnlbXSA9IFtdO1xuICBhbGxDb21wZXRlbmN5OmFueVtdPVtdXG4gIHNlbGV0ZWRDb21wZXRlbmN5QXJlYTogYW55XG4gIGFsbENvbXBldGVuY3lUaGVtZTphbnlbXT1bXVxuICBmaWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZTphbnlbXT1bXVxuICBhbGxDb21wZXRlbmN5U3VidGhlbWU6YW55W109W11cbiAgZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWU6YW55W109W11cbiAgY29tcGV0ZW5jeUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KVxuICBjb21wTGFiZWx0ZXh0OnN0cmluZyA9ICcnXG4gIG1hc3Rlckxpc3Q6YW55W109W107XG4gIGZpbHRlcmVkTWFzdGVyTGlzdDphbnlbXT1bXTtcbiAgZXhwYW5zaW9uVGl0bGU6c3RyaW5nID0gJydcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBkZWJvdW5jZURlbGF5OiBudW1iZXIgPSA1MDA7XG4gIHZhbHVlcz0gJydcbiAgdG9vbFRpcFRleHQgPSBgWW91IGNhbiBjdXN0b21pemUgdGhpcyBkaXNwbGF5IG5hbWUgZm9yIGxlYXJuZXJzIHRvIHNlZSwgYXMgaXQncyB3aGF0IHRoZXkgd2lsbCB2aWV3LmBcbiAgcHJldmlvdXNDYXRlZ29yeUNvZGU6c3RyaW5nID0gJyc7XG4gIHByZXZpb3VzVGVybUNvZGU6c3RyaW5nID0gJyc7XG4gIHByZXZpb3VzQ2F0Q29kZTpzdHJpbmcgPSAnJztcbiAgcHJldmlvdXNUZXJtQ2F0Q29kZTpzdHJpbmc9JydcbiAgc2VsZWN0ZWRUZXJtQXJyYXk6IGFueT0gW11cblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDcmVhdGVUZXJtQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICBwcml2YXRlIGZyYW1lV29ya1NlcnZpY2U6IEZyYW1ld29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgb2Rjc1NlcnZpY2U6IE9kY3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3NuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGNkcjpDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgXG4gICAgdGhpcy5nZXRLY21TZWFyY2goKVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgXG4gICAgdGhpcy50ZXJtTGlzdHMgPSB0aGlzLmRhdGEuY29sdW1uSW5mby5jaGlsZHJlblxuICAgIHRoaXMuY29tcExhYmVsdGV4dCA9IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvbmZpZy5sYWJlbE5hbWVcbiAgICBcbiAgICB0aGlzLmluaXRUZXJtRm9ybSgpXG4gICAgXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cblxuICBpbml0VGVybUZvcm0oKSB7XG4gICAgdGhpcy5jcmVhdGVUZXJtRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZGVzY3JpcHRpb246IFsnJ11cbiAgICB9KVxuICAgIHRoaXMuY3JlYXRlVGhlbWVGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBkbmFtZTogW3t2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddXG4gICAgfSlcbiAgICAvLyB0aGlzLmNyZWF0ZVRoZW1lRm9ybS5jb250cm9sc1snZG5hbWUnXS5kaXNhYmxlKClcbiAgICAvLyB0aGlzLmNyZWF0ZVRoZW1lRm9ybS5jb250cm9sc1snbmFtZSddLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKT0+e1xuICAgIC8vICAgaWYodmFsdWUubGVuZ3RoKXtcbiAgICAvLyAgICB0aGlzLmNyZWF0ZVRoZW1lRm9ybS5jb250cm9sc1snZG5hbWUnXS5lbmFibGUoKVxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgdGhpcy5jcmVhdGVUaGVtZUZvcm1NdWx0aSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGhlbWVGaWVsZHM6dGhpcy5mYi5hcnJheShbdGhpcy5jcmVhdGVUaGVtZUZpZWxkcygpXSlcbiAgICB9KVxuICAgIC8vIHRoaXMuaW5pdGlhbGl6ZVZhbHVlQ2hhbmdlcygpXG4gICAgdGhpcy5maWx0ZWRUZXJtTGlzdHMgPSB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmdldCgnbmFtZScpLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmNvbnRyb2xzLmRuYW1lKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVUZXJtRm9ybS5jb250cm9scy5kbmFtZS5lbmFibGUoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3JlYXRlVGVybUZvcm0uY29udHJvbHMuZG5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmNvbnRyb2xzLmRuYW1lLmRpc2FibGUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gaWYgbW9kZSBpcyBcInZpZXdcIiB0aGVuIGNoZWNrIGZvciB3aGljaCB0eXBlIG9mIGZvcm0gaGFzIHRvIGJlIHVzZWQgYW5kIHRoZW4gYXBwZW5kIHRoZSB2YWx1ZXMgaW4gZm9ybVxuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YSAmJlxuICAgICAgKHRoaXMuZGF0YS5tb2RlID09PSAndmlldycpXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpIHtcbiAgICAgICAgY2FzZSAndGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1WaWV3KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VidGhlbWUnOiB0aGlzLnVwZGF0ZUZvcm1WaWV3KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhpcy51cGRhdGVGb3JtVmlldyh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB0aGlzLmRpc2FibGVDcmVhdGUgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEgJiZcbiAgICAgICh0aGlzLmRhdGEubW9kZSA9PT0gJ2VkaXQnKSkge1xuICAgICAgc3dpdGNoICh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKSB7XG4gICAgICAgIGNhc2UgJ3RoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N1YnRoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRoaXMudXBkYXRlRm9ybUVkaXQodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhICYmXG4gICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSkge1xuICAgICAgLy8gc3dpdGNoICh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKSB7XG4gICAgICAvLyAgIGNhc2UgJ3RoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyAgIGNhc2UgJ3N1YnRoZW1lJzogdGhpcy51cGRhdGVGb3JtRWRpdCh0aGlzLmNyZWF0ZVRoZW1lRm9ybSwgdGhpcy5kYXRhKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyAgIGRlZmF1bHQ6IHRoaXMudXBkYXRlRm9ybUVkaXQodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgIC8vICAgICBicmVha1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIGdldENvbXB0ZW5jeURhdGEoKXtcbiAgICAvLyBjb25zdCBmaWx0ZXJPYmogPSB7XG4gICAgLy8gICBzZWFyY2g6IHtcbiAgICAvLyAgICAgdHlwZTogJ0NvbXBldGVuY3kgQXJlYScsXG4gICAgLy8gICB9LFxuICAgIC8vICAgZmlsdGVyOiB7XG4gICAgLy8gICAgIGlzRGV0YWlsOiB0cnVlLFxuICAgIC8vICAgfSxcbiAgICAvLyB9XG4gICAgLy8gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldEZpbHRlckVudGl0eShmaWx0ZXJPYmopLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICBcbiAgICAvLyAgaWYoZGF0YSAmJiBkYXRhLmxlbmd0aCl7XG4gICAgLy8gICB0aGlzLmFsbENvbXBldGVuY3kgPSBkYXRhXG4gICAgLy8gIH1cbiAgICAvLyB9KVxuICB9XG4gIC8vIGluaXRpYWxpemVWYWx1ZUNoYW5nZXMoKSB7XG4gIC8vICAgdGhpcy50aGVtZUZpZWxkcy5jb250cm9scy5mb3JFYWNoKChncm91cDogRm9ybUdyb3VwKSA9PiB7XG4gIC8vICAgICB0aGlzLnNldFVwVmFsdWVDaGFuZ2VzKGdyb3VwKTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8vIHNldFVwVmFsdWVDaGFuZ2VzKGdyb3VwOiBGb3JtR3JvdXApIHtcbiAgLy8gICBncm91cC5jb250cm9sc1snbmFtZSddLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAvLyAgICAgY29uc3QgZG5hbWVDb250cm9sID0gZ3JvdXAuY29udHJvbHNbJ2RuYW1lJ107XG4gIC8vICAgICBkbmFtZUNvbnRyb2wuZGlzYWJsZSgpO1xuICAvLyAgICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgpIHtcbiAgLy8gICAgICAgZG5hbWVDb250cm9sLmVuYWJsZSgpO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgZG5hbWVDb250cm9sLmRpc2FibGUoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIGdldCB0aGVtZUZpZWxkcygpOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVUaGVtZUZvcm1NdWx0aS5nZXQoJ3RoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCB0aGVtZUZpZWxkc0NvbnRyb2xzKCkge1xuICAgIGNvbnN0IHRoZW1lRmllbGRzID0gdGhpcy5jcmVhdGVUaGVtZUZvcm1NdWx0aS5nZXQoJ3RoZW1lRmllbGRzJylcbiAgICByZXR1cm4gKDxhbnk+dGhlbWVGaWVsZHMpWydjb250cm9scyddXG4gIH1cblxuICBjcmVhdGVUaGVtZUZpZWxkcygpOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBkbmFtZTogW3t2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJycsXVxuICAgIH0pO1xuICB9XG5cbiAgYWRkVGhlbWVGaWVsZHMoKSB7XG4gICAgdGhpcy52YWx1ZXMgPSAnJ1xuICAgIHRoaXMuZmlsdGVyZWRNYXN0ZXJMaXN0ID0gWy4uLnRoaXMubWFzdGVyTGlzdF1cbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSB7XG4gICAgICAvLyB0aGlzLnRoZW1lRmllbGRzLnB1c2godGhpcy5jcmVhdGVUaGVtZUZpZWxkcygpKTtcbiAgICAgIHRoaXMudGhlbWVGaWVsZHMuaW5zZXJ0KDAsIHRoaXMuY3JlYXRlVGhlbWVGaWVsZHMoKSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlVGhlbWVGaWVsZHMoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMudGhlbWVGaWVsZHMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuICBnZXRDcmVhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICBzd2l0Y2gobmFtZSl7XG4gICAgY2FzZSAnVGhlbWUnOlxuICAgICAgcmV0dXJuIGBBZGQgQ29tcGV0ZW5jeSAke25hbWV9YDtcbiAgICBjYXNlICdTdWIgVGhlbWUnOlxuICAgICAgcmV0dXJuIGBBZGQgQ29tcGV0ZW5jeSAke25hbWV9YDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGBBZGQgJHtuYW1lfWA7XG4gICB9XG4gIH1cblxuICBnZXRDYXRlZ29yeU5hbWUoY2F0ZWdvcnlOYW1lOmFueSwgdGVybTphbnkpe1xuICAgIHRoaXMucHJldmlvdXNDYXRlZ29yeUNvZGUgPSBjYXRlZ29yeU5hbWU7XG4gICAgdGhpcy5wcmV2aW91c1Rlcm1Db2RlID0gdGVybS5jb2RlXG4gICAgXG4gICAgc3dpdGNoKGNhdGVnb3J5TmFtZSl7XG4gICAgICBjYXNlICdjb21wZXRlbmN5YXJlYSc6XG4gICAgICAgIHJldHVybiAnQ29tcGV0ZW5jeSBBcmVhJztcbiAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgcmV0dXJuICdDb21wZXRlbmN5IFRoZW1lJztcbiAgICAgIGNhc2UgJ3N1YnRoZW1lJzpcbiAgICAgICAgcmV0dXJuICdDb21wZXRlbmN5IFN1YiBUaGVtZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY2F0ZWdvcnlOYW1lOyAvLyBEZWZhdWx0IHJldHVybiB0byBoYW5kbGUgYW55IHVubWF0Y2hlZCBjYXNlXG4gICAgIH1cbiAgfVxuXG5cbiAgZ2V0TmFtZShpdGVtOmFueSl7XG4gIHJldHVybiBpdGVtLnRvVXBwZXJDYXNlKClcbiAgfVxuXG4gIGdldExhYmVsTmFtZShsYWJlbE5hbWU6c3RyaW5nKTogc3RyaW5nIHtcbiAgICBcbiAgIHN3aXRjaChsYWJlbE5hbWUpe1xuICAgIGNhc2UgJ1RoZW1lJzpcbiAgICAgIHJldHVybiBgQ29tcGV0ZW5jeSAke2xhYmVsTmFtZX0gbmFtZWA7XG4gICAgICBjYXNlICdTdWIgVGhlbWUnOlxuICAgICAgcmV0dXJuIGBDb21wZXRlbmN5ICR7bGFiZWxOYW1lfSBuYW1lYFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxhYmVsTmFtZTsgLy8gRGVmYXVsdCByZXR1cm4gdG8gaGFuZGxlIGFueSB1bm1hdGNoZWQgY2FzZVxuICAgfVxuICB9XG5cbiBcblxuICBjcmVhdGVDb21wVGhlbWVGaWVsZHMoKTpVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5VGhlbWU6WycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lOlsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgIH0pXG4gIH1cblxuICBhZGRDb21wZXRlbmN5VGhlbWUoKXtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSB7XG4gICAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5wdXNoKHRoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUNvbXBGaWVsZHMoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29tcFRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG4gIC8vIGdldCBjb21wVGhlbWVGaWVsZHNDb250cm9scygpIHtcbiAgLy8gICBjb25zdCBjcmVhdGVDb21wVGhlbWVGaWVsZHMgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY3JlYXRlQ29tcFRoZW1lRmllbGRzJylcbiAgLy8gICByZXR1cm4gKDxhbnk+Y3JlYXRlQ29tcFRoZW1lRmllbGRzKVsnY29udHJvbHMnXVxuICAvLyB9XG5cblxuICB1cGRhdGVGb3JtVmlldyhmb3JtOmFueSwgZGF0YTphbnkpIHtcbiAgICBpZihkYXRhICYmIGRhdGEuY2hpbGRyZW5EYXRhICYmIGRhdGEuY2hpbGRyZW5EYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmIGRhdGEuY2hpbGRyZW5EYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlOYW1lKXtcbiAgICAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXMuZGlzcGxheU5hbWUpXG4gICAgfVxuICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuZGVzY3JpcHRpb24pICAgIFxuICAgIFxuICAgICAgaWYgKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUgJiYgdGhpcy5tYXN0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhc3NpZ25OYW1lID0gdGhpcy5tYXN0ZXJMaXN0LmZpbmQob3B0aW9uID0+XG4gICAgICAgICAgZGF0YS5jaGlsZHJlbkRhdGEucmVmSWQgPT09IG9wdGlvbi5pZFxuICAgICAgICApXG4gICAgICAgIGlmIChhc3NpZ25OYW1lKSB7XG4gICAgICAgICAgZm9ybS5jb250cm9sc1snbmFtZSddLnNldFZhbHVlKGFzc2lnbk5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICB9XG4gIFxuICAgIFxuICAgIC8vIGZvcm0uZ2V0KCduYW1lJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5uYW1lKVxuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZm9ybS5nZXQoJ25hbWUnKS5kaXNhYmxlKClcbiAgICAgIGZvcm0uZ2V0KCdkbmFtZScpLmRpc2FibGUoKVxuICAgICAgZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykuZGlzYWJsZSgpXG4gICAgICBcbiAgICAgIFxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVGb3JtRWRpdChmb3JtOmFueSwgZGF0YTphbnkpIHtcbiAgICBmb3JtLmdldCgnZG5hbWUnKS5wYXRjaFZhbHVlKGRhdGEuY2hpbGRyZW5EYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlOYW1lKVxuICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUoZGF0YS5jaGlsZHJlbkRhdGEuZGVzY3JpcHRpb24pXG4gICAgaWYgKGRhdGEuY2hpbGRyZW5EYXRhLm5hbWUgJiYgdGhpcy5tYXN0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYXNzaWduTmFtZSA9IHRoaXMubWFzdGVyTGlzdC5maW5kKG9wdGlvbiA9PlxuICAgICAgICBkYXRhLmNoaWxkcmVuRGF0YS5uYW1lID09PSBvcHRpb24udGl0bGVcbiAgICAgIClcbiAgICAgIGlmIChhc3NpZ25OYW1lKSB7XG4gICAgICAgIGZvcm0uY29udHJvbHNbJ25hbWUnXS5zZXRWYWx1ZShhc3NpZ25OYW1lKVxuICAgICAgfVxuICAgICAgXG4gICAgfVxuICAgIC8vIGZvcm0uZ2V0KCduYW1lJykucGF0Y2hWYWx1ZShkYXRhLmNoaWxkcmVuRGF0YS5uYW1lKVxuICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3JtLmdldCgnbmFtZScpLmRpc2FibGUoKVxuICAgICAgZm9ybS5nZXQoJ2RuYW1lJykuZW5hYmxlKClcbiAgICB9KVxuICB9XG5cbiAgb25LZXkoZXZlbnQ6YW55KXtcbiAgICAvLyAgdGhpcy52YWx1ZXMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSB0aGlzLmZpbHRlck9yZ1ZhbHVlcyh0aGlzLnZhbHVlcywgdGhpcy5tYXN0ZXJMaXN0KVxuXG4gICAgIGNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZW91dCk7XG4gICAgXG4gICAgIC8vIFNldCB0aGUgbmV3IHRpbWVvdXRcbiAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICB0aGlzLnZhbHVlcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgIHRoaXMuZmlsdGVyZWRNYXN0ZXJMaXN0ID0gdGhpcy5maWx0ZXJPcmdWYWx1ZXModGhpcy52YWx1ZXMsIHRoaXMubWFzdGVyTGlzdCk7XG4gICAgIH0sIHRoaXMuZGVib3VuY2VEZWxheSk7XG4gIH1cblxuIFxuXG4gIGZpbHRlck9yZ1ZhbHVlcyhzZWFyY2hWYWx1ZTogc3RyaW5nLCBhcnJheTogYW55KSB7XG4gICAgcmV0dXJuIGFycmF5LmZpbHRlcigodmFsdWU6IGFueSkgPT5cbiAgICAgIHZhbHVlLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKSkpXG4gIH1cblxuICBnZXRLY21TZWFyY2goKXtcbiAgICBjb25zdCByZXF1ZXN0T2JqID0ge1xuICAgICAgZmlsdGVyQ3JpdGVyaWFNYXA6IHtcbiAgICAgICAgc3RhdHVzOiBcIkxpdmVcIixcbiAgICAgICAgaXNBY3RpdmU6IHRydWVcbiAgICB9LFxuICAgIHJlcXVlc3RlZEZpZWxkczogW10sXG4gICAgcGFnZU51bWJlcjogMCxcbiAgICBwYWdlU2l6ZToxMDAwXG4gICAgfVxuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRLY21TZWFyY2hMaXN0KHJlcXVlc3RPYmosdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSkuc3Vic2NyaWJlKChyZXNwb25zZTphbnkpPT57XG4gICAgICBpZihyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoKXtcbiAgICAgICAgdGhpcy5tYXN0ZXJMaXN0ID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZE1hc3Rlckxpc3QgPSBbLi4udGhpcy5tYXN0ZXJMaXN0XVxuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgaWYodGhpcy5kYXRhICYmXG4gICAgICAgICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICdlZGl0Jykpe1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1FZGl0KHRoaXMuY3JlYXRlVGhlbWVGb3JtLCB0aGlzLmRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKHRoaXMuZGF0YSAmJlxuICAgICAgICAgICAgICAodGhpcy5kYXRhLm1vZGUgPT09ICd2aWV3Jykpe1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybVZpZXcodGhpcy5jcmVhdGVUaGVtZUZvcm0sIHRoaXMuZGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIFxuICAgICAgICB9LDEwMDApXG4gICAgICAgXG5cbiAgICAgIH1cbiAgICB9KVxuICAgXG4gICAgXG4gIH1cblxuICBvbkRpc2FibGVUaGVtZShvcHRpb246IGFueSl7XG4gICAgbGV0IHBhcmVudENvbFxuICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGEgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgIGlmKHBhcmVudENvbHVtbkNvbmZpZ0RhdGEpIHtcbiAgICAgIHBhcmVudENvbCA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG4gICAgfVxuICAgIGxldCByZXN1bHQgPSAtMVxuICAgIGlmKHBhcmVudENvbCAmJiBwYXJlbnRDb2wuY2hpbGRyZW4gJiYgcGFyZW50Q29sLmNoaWxkcmVuLmxlbmd0aCl7XG4gICAgICByZXN1bHQgPSBwYXJlbnRDb2wuY2hpbGRyZW4uZmluZEluZGV4KChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiggKGVsZS5yZWZUeXBlID09PSAndGhlbWUnfHwgZWxlLnJlZlR5cGUgPT09ICdzdWJ0aGVtZScpICkge1xuICAgICAgICAgIHJldHVybiBlbGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBvcHRpb24udGl0bGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgXG4gICBcbiAgICAgIFxuICAgIH1cbiAgICBpZihyZXN1bHQgPCAwKXtcbiAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNyZWF0ZVRoZW1lRm9ybU11bHRpLmdldCgndGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgcmVzdWx0ID0gZm9ybUFycmF5LnZhbHVlLmZpbmRJbmRleCgoZm9ybUVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKGZvcm1FbGUubmFtZSAmJiBmb3JtRWxlLm5hbWUuaWQpe1xuICAgICAgICAgIHJldHVybiBmb3JtRWxlLm5hbWUuaWQgPT09IG9wdGlvbi5pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgfVxuICAgIC8vXG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdCA+PSAwID8gdHJ1ZTogZmFsc2VcbiAgfVxuXG4gIG11bHRpQ3JlYXRlKGZvcm06YW55LCBfZGF0YTphbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICBsZXQgY291bnRlciA9IDBcbiAgICBsZXQgY3JlYXRlZFRlcm1zOmFueSA9IFtdXG4gICAgaWYoZm9ybS52YWxpZCkge1xuICAgICAgXG4gICAgICBjb25zdCB0aGVtZUZpZWxkcyA9IGZvcm0gJiYgZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlLnRoZW1lRmllbGRzXG4gICAgICBcbiAgICAgIGlmKHRoZW1lRmllbGRzICYmIHRoZW1lRmllbGRzLmxlbmd0aCkge1xuICAgICAgICB0aGVtZUZpZWxkcy5mb3JFYWNoKCh2YWw6YW55LCBfaTphbnkpID0+e1xuICAgICAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICAgIG5hbWU6IF8uZ2V0KHZhbCwgJ25hbWUudGl0bGUnKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSxcbiAgICAgICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgICAgICByZWZJZDp2YWwubmFtZS5pZCxcbiAgICAgICAgICAgIHJlZlR5cGU6dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSxcbiAgICAgICAgICAgIC8vIGZyYW1ld29yazp0aGlzLmRhdGEuZnJhbWV3b3JrSWQsXG4gICAgICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTp2YWwuZG5hbWUsXG4gICAgICAgICAgICAgIHRpbWVTdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OiBhbnkgPSB7XG4gICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXMucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgICAgIGNyZWF0ZWRUZXJtcy5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGNvdW50ZXIgPT09IHRoZW1lRmllbGRzLmxlbmd0aCl7XG5cblxuICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW46YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbi5jb2RlKVxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRUZXJtcyAsIHBhcmVudENvbClcbiAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zKVxuICAgICAgICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogY3JlYXRlZFRlcm1zLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpKGNyZWF0ZWRUZXJtczogYW55W10pIHtcbiAgICAgbGV0IHBhcmVudDogYW55XG4gICAgaWYoY3JlYXRlZFRlcm1zICYmIGNyZWF0ZWRUZXJtcy5sZW5ndGgpIHtcbiAgICAgIGxldCBjcmVhdGVkVGVybXNDb3VudGVyID0gMFxuICAgICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm0gPSBjcmVhdGVkVGVybVxuICAgICAgICBsZXQgYXNzb2NpYXRpb25zID0gW11cbiAgICAgICAgbGV0IHRlbXBcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgICAgIGZvcihjb25zdCBbdmFsdWVdIG9mIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0KXtcbiAgICAgICAgICAgcGFyZW50ID0gdmFsdWVcbiAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICB0ZW1wID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4gY2hpbGQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBudWxsXG4gICAgICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IChjcmVhdGVkVGVybXMubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnMoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgICAgaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudCwgY3JlYXRlZFRlcm1zIClcbiAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogW3RoaXMuc2VsZWN0ZWRUZXJtXSwgY3JlYXRlZDogdHJ1ZSwgbXVsdGk6dHJ1ZSB9KVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID1mYWxzZTtcbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICd0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAnc3VidGhlbWUnKXtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyOmFueSwgcGFyZW50OmFueSwgcmVndWVzdEJvZHk6YW55KTogUHJvbWlzZTxhbnk+e1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBwYXJlbnQuY2F0ZWdvcnksIHBhcmVudC5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiA/Wy4uLnBhcmVudC5jaGlsZHJlbiwgLi4uW3RoaXMuc2VsZWN0ZWRUZXJtXV06W3RoaXMuc2VsZWN0ZWRUZXJtXVxuXG4gICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcbiAgXG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgIC8vIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAgIC8vIGNvbnN0IGZvdW5kID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbmQoYz0+IGMuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICAgIC8vIGlmKCFmb3VuZCkge1xuICAgICAgICAgIC8vICAgcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcy5zZWxlY3RlZFRlcm0pIDogcGFyZW50WydjaGlsZHJlbiddID0gW3RoaXMuc2VsZWN0ZWRUZXJtXVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgIC8vIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgLy8gICAvLyB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0ZXJtKVxuICAgICAgICAgIFxuICAgICAgICAgIC8vICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZURuYW1lKF9uYW1lOiBhbnksIF9mb3JtOmFueSwgX2k/OmFueSkge1xuICAgIC8vIGlmKHRoaXMuZGF0YS5tb2RlID09PSAnY3JlYXRlJyAmJiAhZm9ybS5jb250cm9sc1snZG5hbWUnXS52YWx1ZS50cmltKCkubGVuZ3RoKXtcbiAgICAvLyAgIGZvcm0uZ2V0KCdkbmFtZScpLnBhdGNoVmFsdWUobmFtZSlcbiAgICAvLyB9XG4gICAgLy8gaWYodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnICYmICFmb3JtLmNvbnRyb2xzLnRoZW1lRmllbGRzLmNvbnRyb2xzW2ldLmNvbnRyb2xzWydkbmFtZSddLnZhbHVlLnRyaW0oKS5sZW5ndGgpe1xuICAgIC8vICAgZm9ybS5jb250cm9scy50aGVtZUZpZWxkcy5jb250cm9sc1tpXS5jb250cm9sc1snZG5hbWUnXS5wYXRjaFZhbHVlKG5hbWUpXG4gICAgLy8gfVxuICB9XG4gIGNoYW5nZShldmVudDogYW55LGZvcm06IGFueSwgaT86IGFueSl7XG4gICAgaWYodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5tb2RlKSB7IFxuICAgICAgaWYodGhpcy5kYXRhLm1vZGUgPT09ICdjcmVhdGUnKXtcbiAgICAgICAgZm9ybS5nZXQoJ2RuYW1lJykucGF0Y2hWYWx1ZShldmVudC5zb3VyY2UudmFsdWUudGl0bGUpXG4gICAgICAgIHRoaXMuZXhwYW5zaW9uVGl0bGUgPSBldmVudC5zb3VyY2UudmFsdWUudGl0bGVcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICAgIH1cbiAgICAgIGlmKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJyl7XG4gICAgICAgIGNvbnN0IGZvcm1Ub1VwZGF0ZSA9IGZvcm0uY29udHJvbHMudGhlbWVGaWVsZHMuY29udHJvbHNbaV1cbiAgICAgICAgZm9ybVRvVXBkYXRlLmNvbnRyb2xzWydkbmFtZSddLnBhdGNoVmFsdWUoZXZlbnQuc291cmNlLnZhbHVlLnRpdGxlKVxuICAgICAgICB0aGlzLmV4cGFuc2lvblRpdGxlID0gZXZlbnQuc291cmNlLnZhbHVlLnRpdGxlXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxuICAgICAgICBpZihmb3JtVG9VcGRhdGUuY29udHJvbHMubmFtZS52YWxpZCAmJiBmb3JtVG9VcGRhdGUuY29udHJvbHMuZG5hbWUpIHtcbiAgICAgICAgICBmb3JtVG9VcGRhdGUuY29udHJvbHMuZG5hbWUuZW5hYmxlKClcbiAgICAgICAgfSBlbHNlIGlmKGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZSkge1xuICAgICAgICAgIGZvcm1Ub1VwZGF0ZS5jb250cm9scy5kbmFtZS5kaXNhYmxlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgIFxuICB9XG5cbiAgZ2V0RXhwYW5zaW9uVGl0bGUoZm9ybTogYW55KSB7XG4gICAgY29uc3QgZGV0YWlscyA9IGZvcm0uZ2V0KCduYW1lJykudmFsdWVcbiAgICByZXR1cm4gXy5nZXQoZGV0YWlscywgJ3RpdGxlJywgJycpXG4gIH1cbiAgXG5cbiAgLy8jcmVnaW9uIChkZXNpZ25hdGlvbnMpXG5cbiAgZ2V0IGRlc2lnbmF0aW9uQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNyZWF0ZVRoZW1lRm9ybS5nZXQoJ2Rlc2lnbmF0aW9ucycpIGFzIFVudHlwZWRGb3JtQXJyYXkpLmNvbnRyb2xzO1xuICB9XG5cbiAgbG9hZERlc2lnbmF0aW9ucygpIHtcbiAgICB0aGlzLm9kY3NTZXJ2aWNlLmdldERlc2lnbmF0aW9ucyh7fSkuc3Vic2NyaWJlKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRlc2lnbmF0aW9uc0xpc3QgPSBkYXRhLnJlc3BvbnNlRGF0YVxuICAgICAgfSxcbiAgICAgIChfZXJyOiBhbnkpID0+IHtcbiAgICAgIH0pXG4gIH1cblxuICBnZXRGaWx0ZXJlZERlc2lnbmF0aW9uTGlzdChpbmRleDogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsdGVyS2V5ID0gdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZGVzaWduYXRpb25zW2luZGV4XS5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICBpZihmaWx0ZXJLZXkgJiYgdGhpcy5kZXNpZ25hdGlvbnNMaXN0KSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZExpc3QgPSB0aGlzLmRlc2lnbmF0aW9uc0xpc3QuZmlsdGVyKChkZXNpZ25hdGlvbjogYW55KSA9PiBkZXNpZ25hdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyS2V5KSlcbiAgICAgIHJldHVybiBmaWx0ZXJlZExpc3RcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGFkZERlc2lnbmF0aW9uKCkge1xuICAgIGNvbnN0IG5ld0Rlc2lnbmF0aW9uID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgaWQ6W251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZGVzaWduYXRpb25EZXNjcmlwdGlvbjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNjAwKV1dLFxuICAgICAgaXNTYXZlZDogW2ZhbHNlXSwgLy8gaXNTYXZlZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgYnV0dG9uIHRleHQgZnJvbSBzYXZlIHRvIHVwZGF0ZSBpZiBuZWVkZWRcbiAgICAgIGNyZWF0aW9uSWQ6IHRoaXMuYWRkZWREZXNpZ25hdGlvbkNvdW50IC8vIGNyZWF0aW9uSWQgaXMgY3JlYXRlZCB0byB1c2UgbG9jYWxseSB0byBnaXZlIHVuaXF1ZSBpZCB0byBhZGRlZCByZWNvcmRzXG4gICAgfSk7XG4gICAgdGhpcy5hZGRlZERlc2lnbmF0aW9uQ291bnQgPSB0aGlzLmFkZGVkRGVzaWduYXRpb25Db3VudCArIDE7XG4gICAgKHRoaXMuY3JlYXRlVGhlbWVGb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgVW50eXBlZEZvcm1BcnJheSkuaW5zZXJ0KDAsIG5ld0Rlc2lnbmF0aW9uKTtcbiAgICAvLyB0aGlzLnBhbmVsT3BlblN0YXRlLmluc2VydCgwLCB0cnVlKVxuICAgIHRoaXMucGFuZWxPcGVuU3RhdGUuc3BsaWNlKDAsIDAsIHRydWUpO1xuICB9XG5cbiAgY2xlYXJTZWxlY3RlZERlc2lnbmFpb25PbkNoYW5nZShpbmRleDphbnksIGV2ZW50OmFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkTmFtZSA9IHRoaXMuY3JlYXRlVGhlbWVGb3JtLnZhbHVlLmRlc2lnbmF0aW9uc1tpbmRleF0ubmFtZVxuICAgIGlmKHNlbGVjdGVkTmFtZSAhPT0gZXZlbnQudmFsdWUpIHtcbiAgICAgIGNvbnN0IGRlc2lnbmF0aW9uc1RvUmVzZXQ6YW55ID0gdGhpcy5kZXNpZ25hdGlvbkNvbnRyb2xzW2luZGV4XVxuICAgICAgZGVzaWduYXRpb25zVG9SZXNldC5nZXQoJ2lkJykucmVzZXQoKVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZURlc2lnbmF0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZW92ZWRDcmVhdGlvbklkID0gdGhpcy5kZXNpZ25hdGlvbkNvbnRyb2xzW2luZGV4XS52YWx1ZS5jcmVhdGlvbklkO1xuICAgICh0aGlzLmNyZWF0ZVRoZW1lRm9ybS5nZXQoJ2Rlc2lnbmF0aW9ucycpIGFzIFVudHlwZWRGb3JtQXJyYXkpLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLnNhdmVkRGVzaWduYXRpb25zID0gdGhpcy5zYXZlZERlc2lnbmF0aW9ucy5maWx0ZXIoKHNhdmVkRGVzaWduYXRpb246IGFueSkgPT4gc2F2ZWREZXNpZ25hdGlvbi5jcmVhdGlvbklkICE9PSByZW92ZWRDcmVhdGlvbklkKVxuICB9XG5cbiAgc2F2ZURlc2lnbmF0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBkZXNpZ25hdGlvbnMgPSB0aGlzLmRlc2lnbmF0aW9uQ29udHJvbHNcbiAgICBjb25zdCBkZXNpZ25hdGlvblRvU2F2ZSA9IGRlc2lnbmF0aW9uc1tpbmRleF1cbiAgICBpZiAoZGVzaWduYXRpb25Ub1NhdmUudmFsaWQpIHtcbiAgICAgIGRlc2lnbmF0aW9uVG9TYXZlLnZhbHVlLmlzU2F2ZWQgPSB0cnVlXG4gICAgICBjb25zdCBzYXZlZERlc2lnbmF0aW9uSW5kZXggPSB0aGlzLnNhdmVkRGVzaWduYXRpb25zLmZpbmRJbmRleCgoZTphbnkpID0+IGUuY3JlYXRpb25JZCA9PT0gZGVzaWduYXRpb25Ub1NhdmUudmFsdWUuY3JlYXRpb25JZClcbiAgICAgIGlmIChzYXZlZERlc2lnbmF0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnNhdmVkRGVzaWduYXRpb25zW3NhdmVkRGVzaWduYXRpb25JbmRleF0gPSBkZXNpZ25hdGlvblRvU2F2ZS52YWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYXZlZERlc2lnbmF0aW9ucy5wdXNoKGRlc2lnbmF0aW9uVG9TYXZlLnZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1Ym1pdERlc2lnbmF0aW9uKCkge1xuICAgIFxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgfVxuXG4gIGdldCBlbmFibGVBZGRCdG4oKSB7XG4gICAgaWYodGhpcy5jb2xDb2RlID09PSAnZGVzaWduYXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNpZ25hdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyNlbmRyZWdpb25cbiAgXG4gIHByaXZhdGUgX2ZpbHRlcihzZWFyY2hUeHQ6IGFueSk6IENhcmRbXSB7XG4gICAgbGV0IGlzRXhpc3Q7XG4gICAgdGhpcy5kaXNhYmxlQ3JlYXRlID0gZmFsc2VcbiAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICB0aGlzLmNyZWF0ZVRlcm1Gb3JtLmdldCgnZGVzY3JpcHRpb24nKS5lbmFibGUoKVxuICAgIC8vIHRoaXMuY3JlYXRlVGVybUZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLnBhdGNoVmFsdWUoJycpXG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0eXBlb2YgKHNlYXJjaFR4dCkgPT09ICdvYmplY3QnID8gdGhpcy5fbm9ybWFsaXplVmFsdWUoc2VhcmNoVHh0Lm5hbWUpIDogdGhpcy5fbm9ybWFsaXplVmFsdWUoc2VhcmNoVHh0KTtcbiAgICBpc0V4aXN0ID0gdGhpcy50ZXJtTGlzdHMuZmlsdGVyKCh0ZXJtOmFueSkgPT4gdGhpcy5fbm9ybWFsaXplVmFsdWUodGVybS5uYW1lKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xuICAgIHJldHVybiBpc0V4aXN0XG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25BcmVhKG9wdGlvbjphbnkpe1xuICAgIHRoaXMuYWxsQ29tcGV0ZW5jeS5mb3JFYWNoKCh2YWw6YW55KT0+e1xuICAgICAgaWYgKG9wdGlvbi5uYW1lID09PSB2YWwubmFtZSkge1xuICAgICAgICB0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYSA9IHZhbFxuICAgICAgICB0aGlzLmFsbENvbXBldGVuY3lUaGVtZSA9IHZhbC5jaGlsZHJlblxuICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lID0gdGhpcy5hbGxDb21wZXRlbmN5VGhlbWVcblxuICAgICAgfVxuICAgIH0pXG4gICBcbiAgfVxuXG4gIE9uVGhlbWVTZWxlY3Rpb24oZXZlbnQ6YW55KSB7XG4gICAgXG4gICAgY29uc3Qgc2VsZWN0ZWRUaGVtZSA9IGV2ZW50LnNvdXJjZS52YWx1ZVxuICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZFRoZW1lLm5hbWUgPT09IHZhbC5uYW1lKSB7XG4gICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVN1YnRoZW1lID0gdmFsLmNoaWxkcmVuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWUgPSB0aGlzLmFsbENvbXBldGVuY3lTdWJ0aGVtZVxuICAgICAgfVxuXG4gICAgfSlcblxuXG4gIH1cblxuICAvLyBjb21wQXJlYVNlbGVjdGVkKG9wdGlvbjogYW55KSB7XG4gIC8vICAgdGhpcy5yZXNldENvbXBTdWJmaWVsZHMoKVxuICAvLyAgIHRoaXMuYWxsQ29tcGV0ZW5jaWVzLmZvckVhY2goKHZhbDogYW55KSA9PiB7XG4gIC8vICAgICBpZiAob3B0aW9uLm5hbWUgPT09IHZhbC5uYW1lKSB7XG4gIC8vICAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gdmFsXG4gIC8vICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lID0gdmFsLmNoaWxkcmVuXG4gIC8vICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUgPSB0aGlzLmFsbENvbXBldGVuY3lUaGVtZVxuICBcbiAgLy8gICAgIH1cbiAgLy8gICB9KVxuICAvLyB9XG5cbiAgb25TZWxlY3QodGVybTphbnksIGZvcm06YW55KSB7XG4gICAgc3dpdGNoICh0aGlzLmNvbENvZGUpIHtcbiAgICAgIGNhc2UgJ2Rlc2lnbmF0aW9uJzpcbiAgICAgICAgZm9ybS5nZXQoJ25hbWUnKS5wYXRjaFZhbHVlKHRlcm0udmFsdWUubmFtZSlcbiAgICAgICAgZm9ybS5nZXQoJ2lkJykucGF0Y2hWYWx1ZSh0ZXJtLnZhbHVlLmlkKVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gdGVybS52YWx1ZVxuICAgICAgICBmb3JtLmdldCgnbmFtZScpLnBhdGNoVmFsdWUodGVybS52YWx1ZS5uYW1lKVxuICAgICAgICBmb3JtLmdldCgnZG5hbWUnKS5wYXRjaCh0ZXJtLnZhbHVlLmRuYW1lKVxuICAgICAgICBmb3JtLmdldCgnZGVzY3JpcHRpb24nKS5wYXRjaFZhbHVlKHRlcm0udmFsdWUuZGVzY3JpcHRpb24pXG4gICAgICAgIGZvcm0uZ2V0KCdkZXNjcmlwdGlvbicpLmRpc2FibGUoKVxuICAgICAgICB0aGlzLmRpc2FibGVDcmVhdGUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgc2F2ZVRlcm0oKSB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlcih0aGlzLmNyZWF0ZVRlcm1Gb3JtLnZhbHVlLm5hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICBcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5jcmVhdGVUZXJtRm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgIGNvZGU6IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRVdWlkKCksXG4gICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICBzdGF0dXM6IGFwcENvbnN0YW50cy5MSVZFLFxuICAgICAgICAvLyBmcmFtZXdvcms6dGhpcy5kYXRhLmZyYW1ld29ya0lkLFxuICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgIF0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuY3JlYXRlVGVybUZvcm0udmFsdWUuZG5hbWUsXG4gICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdEJvZHk6YW55ID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdGVybTogdGVybVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jcmVhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcmVxdWVzdEJvZHkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXMucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVxuICAgICAgICB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUZXJtRGF0YShmb3JtOmFueSwgZGF0YTphbnkpIHtcbiAgICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXMgPSAgZGF0YS5jaGlsZHJlbkRhdGEuYWRkaXRpb25hbFByb3BlcnRpZXNcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllc1snZGlzcGxheU5hbWUnXSA9IHRoaXMuY3JlYXRlVGhlbWVGb3JtLnZhbHVlLmRuYW1lXG4gICAgZm9ybS52YWx1ZS5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gICAgXG4gICAgZm9ybS52YWx1ZS5kaXNwbGF5TmFtZSA9IGZvcm0udmFsdWUuZG5hbWVcbiAgICBcbiAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSB0cnVlXG4gICAgY29uc3QgZm9ybURhdGEgPSB7XG4gICAgICAvLyB1c2UgdGhpcyBpZiB5b3UgbmVlZCBkaXNhYmxlZCBmaWVsZCB2YWx1ZXMgOiBmb3JtLmdldFJhd1ZhbHVlKClcbiAgICAgIC4uLmZvcm0udmFsdWUsXG4gICAgICAvLyBkaXNwbGF5TmFtZTp7Li4uZm9ybS52YWx1ZS5kbmFtZX1cbiAgICB9XG4gICAgY29uc3QgdXBkYXRlRGF0YSA9IHtcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgdXBkYXRlVGVybURhdGE6IGRhdGEuY2hpbGRyZW5EYXRhXG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGVybURhdGFBc3NvY2lhdGlvbnModXBkYXRlRGF0YSlcbiAgfVxuXG5cbiAgdXBkYXRlVGVybURhdGFBc3NvY2lhdGlvbnModXBkYXRlRGF0YTphbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICBsZXQgc2VsZWN0aW9uRGF0YSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgIGlmKCFzZWxlY3Rpb25EYXRhICkge1xuICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuZGF0YS5jaGlsZHJlbkRhdGFcbiAgICB9XG4gICAgY29uc3QgbGlzdFRobWUgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICBsZXQgdGhlbUFzc29jaWF0aW9uczogYW55XG4gICAgaWYobGlzdFRobWUgJiYgbGlzdFRobWUuY2hpbGRyZW4gJiYgbGlzdFRobWUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBkYXRhID0gbGlzdFRobWUuY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZGVudGlmaWVyID09PSBzZWxlY3Rpb25EYXRhLmlkZW50aWZpZXIpXG4gICAgICB0aGVtQXNzb2NpYXRpb25zID0gZGF0YS5hc3NvY2lhdGlvbnMgPyBkYXRhLmFzc29jaWF0aW9ucy5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgfSkgOiBbXVxuICAgIH1cbiAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdGVybToge1xuICAgICAgICAgIC4uLnVwZGF0ZURhdGEuZm9ybURhdGEsXG4gICAgICAgICAgLi4uKHRoZW1Bc3NvY2lhdGlvbnMgJiYgdGhlbUFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogdGhlbUFzc29jaWF0aW9uc30gOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgc2VsZWN0aW9uRGF0YS5jYXRlZ29yeSwgc2VsZWN0aW9uRGF0YS5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcblxuICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA/IHRoaXMuc2VsZWN0ZWRUZXJtIDogKHVwZGF0ZURhdGEpID8gey4uLnVwZGF0ZURhdGEudXBkYXRlVGVybURhdGEsIC4uLnVwZGF0ZURhdGEuZm9ybURhdGF9IDoge31cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICAvLyBjb25zdCBzZWxlY3Rpb25EYXRhID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgICAgIHNlbGVjdGlvbkRhdGFbJ2Rlc2NyaXB0aW9uJ10gPSByZWd1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0uZGVzY3JpcHRpb25cbiAgICAgICAgc2VsZWN0aW9uRGF0YVsnYWRkaXRpb25hbFByb3BlcnRpZXMnXSA9IHJlZ3Vlc3RCb2R5LnJlcXVlc3QudGVybS5hZGRpdGlvbmFsUHJvcGVydGllc1xuICAgICAgICBzZWxlY3Rpb25EYXRhWydhc3NvY2lhdGlvbnMnXSA9IHRoZW1Bc3NvY2lhdGlvbnNcbiAgICAgICAgXG5cbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke3ZhbHVlLmNhdGVnb3J5fSB1cGRhdGVkIHN1Y2Nlc3NmdWxseWApXG4gICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB7IC4uLnZhbHVlIH0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZ1bGxUZXJtRGF0YUxvY2FsTWFwKHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHNlbGVjdGlvbkRhdGEpXG4gICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihgRWRpdCAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnModXBkYXRlRGF0YT86IGFueSkge1xuICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgIGxldCB0ZW1wXG4gICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgLy8gbGV0IGxvY2FsSXNFeGlzdCA9IGZhbHNlXG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgocGFyZW50KSA9PiB7XG4gICAgICBjb3VudGVyKytcbiAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDphbnkpID0+IGNoaWxkLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogbnVsbFxuICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICB9KSA6IFtdXG4gICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGFwcENvbnN0YW50cy5EUkFGVCB9KVxuICAgICAgICBpZih0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgYXNzb2NpYXRpb25zLnB1c2goeyBpZGVudGlmaWVyOiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgLi4uKHVwZGF0ZURhdGEgJiYgdXBkYXRlRGF0YS5mb3JtRGF0YSAmJiB1cGRhdGVEYXRhLnVwZGF0ZVRlcm1EYXRhLmNvZGUgPT09IHBhcmVudC5jb2RlKSA/IHsuLi51cGRhdGVEYXRhLmZvcm1EYXRhfTogbnVsbCxcbiAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBwYXJlbnQuY2F0ZWdvcnksIHBhcmVudC5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAoY291bnRlciA9PT0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2l6ZSkge1xuICAgICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcblxuICAgICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA/IHRoaXMuc2VsZWN0ZWRUZXJtIDogKHVwZGF0ZURhdGEpID8gey4uLnVwZGF0ZURhdGEudXBkYXRlVGVybURhdGEsIC4uLnVwZGF0ZURhdGEuZm9ybURhdGF9IDoge31cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHt2YWx1ZS5jYXRlZ29yeX0gdXBkYXRlZCBzdWNjZXNzZnVsbHlgKVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHsgLi4udmFsdWUgfSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzYXZlVGhlbWVUZXJtKCkge1xuICAgIGlmICh0aGlzLl9maWx0ZXIodGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUubmFtZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICBuYW1lOiB0aGlzLmNyZWF0ZVRoZW1lRm9ybS52YWx1ZS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jcmVhdGVUaGVtZUZvcm0udmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICBzdGF0dXM6IGFwcENvbnN0YW50cy5MSVZFLFxuICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgIF0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZGlzcGxheU5hbWU6dGhpcy5jcmVhdGVUZXJtRm9ybS52YWx1ZS5kbmFtZSxcbiAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlcy5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtLCBjcmVhdGVkOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtXG4gICAgICAgIHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9ucygpXG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENyZWF0ZSAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGRpYWxvZ0Nsb3NlKHRlcm06IGFueSkge1xuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgfSk7XG4gIH1cblxuXG4gIGFzeW5jIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRUZXJtczogYW55W10sIHBhcmVudFNlbGVjdGVkVGVybT86YW55KSB7XG4gICBcbiAgICB0aGlzLnNlbGVjdGVkVGVybUFycmF5ID0gW11cbiAgICAvLyBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICBsZXQgY3JlYXRlZFRlcm1zSWRlbnRpZmllcnMgPSBbXVxuICAgIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkgPSBjcmVhdGVkVGVybXNcbiAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtc1tjcmVhdGVkVGVybXMubGVuZ3RoIC0xXVxuICAgIGZvcihsZXQgY3JlYXRlZFRlcm0gb2YgY3JlYXRlZFRlcm1zKSB7XG4gICAgICBjcmVhdGVkVGVybXNJZGVudGlmaWVycy5wdXNoKHsgaWRlbnRpZmllcjogY3JlYXRlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgIH1cbiAgICBsZXQgYXNzb2NpYXRpb25zID0gW11cbiAgICBsZXQgY291bnRlciA9IDBcbiAgIGlmKGNyZWF0ZWRUZXJtcyAmJiBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICBsZXQgcGFyZW50OiBhbnlcbiAgICAgbGV0IGNyZWF0ZWRUZXJtc0NvdW50ZXIgPSAwXG4gICAgIGlmKCFwYXJlbnRTZWxlY3RlZFRlcm0pIHtcbiAgICAgIGZvcihsZXQgY3JlYXRlZFRlcm0gb2YgY3JlYXRlZFRlcm1zKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1cbiAgICAgICAgbGV0IHRlbXBcbiAgICAgICAgZm9yKGNvbnN0IFt2YWx1ZV0gb2YgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Qpe1xuICAgICAgICAgICBwYXJlbnQgPSB2YWx1ZVxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogYW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IChjcmVhdGVkVGVybXMubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnMoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgICAgaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudCwgY3JlYXRlZFRlcm1zIClcbiAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogW3RoaXMuc2VsZWN0ZWRUZXJtXSwgY3JlYXRlZDogdHJ1ZSwgbXVsdGk6dHJ1ZSB9KVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID1mYWxzZTtcbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICd0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAnc3VidGhlbWUnKXtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRTZWxlY3RlZFRlcm1cbiAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgIH0pIDogW11cbiAgICAgICAgYXNzb2NpYXRpb25zID0gWy4uLmFzc29jaWF0aW9ucywgLi4uY3JlYXRlZFRlcm1zSWRlbnRpZmllcnNdXG4gICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50LCBjcmVhdGVkVGVybXMgKVxuICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybUFycmF5LCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPWZhbHNlO1xuICAgICAgICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpe1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICB9XG4gICAgIH1cbiAgIH1cbiB9XG5cbiBhc3luYyBjYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlcjphbnksIHBhcmVudDphbnksIHJlZ3Vlc3RCb2R5IDphbnkpOiBQcm9taXNlPGFueT57XG4gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiA/Wy4uLnBhcmVudC5jaGlsZHJlbiwgLi4udGhpcy5zZWxlY3RlZFRlcm1BcnJheV06dGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICBsZXQgbGlzdERhdGEgOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgbGV0IGRpZmZlcmVuY2VEYXRhID0gW11cbiAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgZGlmZmVyZW5jZURhdGEgID0gXy5kaWZmZXJlbmNlQnkodGhpcy5zZWxlY3RlZFRlcm1BcnJheSxsaXN0RGF0YS5jaGlsZHJlbiwgJ2lkZW50aWZpZXInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgfVxuICAgICAgICBsaXN0RGF0YVsnYXNzb2NpYXRpb25zJ10gPSBsaXN0RGF0YSAmJiBsaXN0RGF0YS5hc3NvY2lhdGlvbnMgP1suLi5saXN0RGF0YS5hc3NvY2lhdGlvbnMsIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuICAgICAgICBsaXN0RGF0YVsnY2hpbGRyZW4nXSA9IGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuID9bLi4ubGlzdERhdGEuY2hpbGRyZW4sIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuXG4gICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmZvckVhY2goKHNlbGVjdGVkRGF0YTogYW55KT0+IHtcbiAgICAgICAgICBsZXQgbGlzdERhdGEgOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQoc2VsZWN0ZWREYXRhLmNhdGVnb3J5KVxuICAgICAgICAgIGlmKGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuICYmIGxpc3REYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUxvY2FsTGlzdChsaXN0RGF0YSxwYXJlbnQsIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksICdjcmVhdGUnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSkgXG4gICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRUZXJtWydhc3NvY2lhdGlvblByb3BlcnRpZXMnXVsnYXBwcm92YWxTdGF0dXMnXSA9ICdEcmFmdCc7XG4gXG4gICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgLy8gIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAvLyAgY29uc3QgZm91bmQgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmluZChjPT4gYy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IGZhbHNlXG4gICAgICAgICAvLyBpZighZm91bmQpIHtcbiAgICAgICAgIC8vICAgcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcy5zZWxlY3RlZFRlcm0pIDogcGFyZW50WydjaGlsZHJlbiddID0gW3RoaXMuc2VsZWN0ZWRUZXJtXVxuICAgICAgICAgLy8gfVxuICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgIC8vIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAvLyAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgICAgICAvLyAgIHJldHVybiByZXNvbHZlKHRydWUpXG4gICAgICAgICAvLyB9KTtcbiAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSlcbiAgICAgICB9XG4gICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgfSlcbiAgIH0pXG4gIH1cblxufSIsIjxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgfHwgJ2RlZmF1bHRDcmVhdGUnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVNdWx0aUNyZWF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgdy0xMDAgYWJzb2x1dGUgbG9hZGVyLWJnIGl0ZW1zLWNlbnRlciBwdC01IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwiZGlzcGxheS1pbmxpbmUtYmxvY2sgbWItNVwiIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8IS0tIDxwPnt7bG9hZGVyTXNnfX08L3A+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdCBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZUNyZWF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aGVtZSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZUNyZWF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdWJ0aGVtZSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZUNyZWF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZXNpZ25hdGlvbidcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aGVtZURlc2lnbmF0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbXBldGVuY3knXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29tcFRoZW1lXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNtb2RhbFRpdGxlPlxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS5jb2x1bW5JbmZvLm5hbWUgPT09ICdUaGVtZScgPyBhcHBfc3RyaW5ncy5hZGRDb21wZXRlbmN5IDogYXBwX3N0cmluZ3MuY3JlYXRlTmV3fX0ge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJyB8fCBkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT5BZGQge3tkYXRhPy5jb2x1bW5JbmZvPy5jb25maWc/LmNhdGVnb3J5RGlzcGxheU5hbWUgfHwgZGF0YS5jb2x1bW5JbmZvLm5hbWUgfX0gPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7YXBwX3N0cmluZ3MuZWRpdH19IHt7ZGF0YT8uY29sdW1uSW5mbz8uY29uZmlnPy5jYXRlZ29yeURpc3BsYXlOYW1lIHx8IGRhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENyZWF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVRlcm1Gb3JtXCIgbm92YWxpZGF0ZSAobmdTdWJtaXQpPVwiZGlzYWJsZUNyZWF0ZT91cGRhdGVUZXJtQXNzb2NpYXRpb25zKCk6c2F2ZVRlcm0oKVwiXG4gICAgICAgICAgICBjbGFzcz1cImRlZmF1bHRGb3JtXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRlcm1Gb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5kZXNjcmlwdGlvbn19XCIgbWF4bGVuZ3RoPVwiMjAwMFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGUgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0aGVtZUNyZWF0ZSA+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZ05ld1wiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQtZGl2JzogZGlzYWJsZU11bHRpQ3JlYXRlfVwiID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtb2RhbFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGRhdGE/LnNlbGVjdGVkUGFyZW50VGVybXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCIgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0Q2F0ZWdvcnlOYW1lKHRlcm0uY2F0ZWdvcnksdGVybSl9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm0ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgIT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInRoZW1lRm9ybVwiIFtmb3JtR3JvdXBdPVwiY3JlYXRlVGhlbWVGb3JtXCIgbm92YWxpZGF0ZVxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJkaXNhYmxlQ3JlYXRlP3VwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKTpzYXZlVGhlbWVUZXJtKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1hcmdpbi10b3Atc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgXCIgKm5nSWY9XCJkYXRhLmNvbHVtbkluZm8/LmNvZGUgIT09ICdjb21wZXRlbmN5YXJlYScgJiYgZGF0YS5tb2RlID09PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncz8ubmFtZX19XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlKCRldmVudCxjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNzZWFyY2ggYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBjbGFzcz1cImFzc2lnbmVlU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiICAoa2V5dXApPVwib25LZXkoJGV2ZW50KVwiIG1hdElucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRNYXN0ZXJMaXN0XCIgICAgKGJsdXIpPVwidXBkYXRlRG5hbWUob3B0aW9uPy50aXRsZSwgY3JlYXRlVGhlbWVGb3JtKVwiIFtkaXNhYmxlZF09XCJvbkRpc2FibGVUaGVtZShvcHRpb24pXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLnRpdGxlfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJmaWx0ZXJlZE1hc3Rlckxpc3QubGVuZ3RoID09PSAwXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlc3VsdHMgZm91bmQhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJ1cGRhdGVEbmFtZShuYW1lLnZhbHVlLCBjcmVhdGVUaGVtZUZvcm0pXCIgbWF4bGVuZ3RoPVwiNzBcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb24gY3Vyc29yLXBvaW50ZXJcIiBbbWF0VG9vbHRpcF09XCJ0b29sVGlwVGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXAtc2VjXCI+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkbmFtZVwiIGlkPVwiZG5hbWVcIiAjZG5hbWUgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWVsZCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBuYW1lIGZpZWxkLlwiIG1heGxlbmd0aD1cIjcwXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLCBjcmVhdGVUaGVtZUZvcm0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZWRUZXJtTGlzdHMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgXCIgKm5nSWY9XCJkYXRhLmNvbHVtbkluZm8/LmNvZGUgPT09ICdjb21wZXRlbmN5YXJlYScgJiYgZGF0YS5tb2RlID09PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0IFt2YWx1ZV09XCJkYXRhPy5jaGlsZHJlbkRhdGE/Lm5hbWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbD5FbnRlciB7e2RhdGEubmFtZX19IG5hbWU8L21hdC1sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbY2RrVGV4dGFyZWFBdXRvc2l6ZV0gW2Nka0F1dG9zaXplTWF4Um93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MuZGVzY3JpcHRpb259fVwiIG1heGxlbmd0aD1cIjIwMDBcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImRlZmF1bHRcIiB0eXBlPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpYWxvZ0Nsb3NlKCcnKVwiPnt7YXBwX3N0cmluZ3MuY2FuY2VsfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MuY3JlYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJ0aGVtZUZvcm1cIiBbZm9ybUdyb3VwXT1cImNyZWF0ZVRoZW1lRm9ybU11bHRpXCIgbm92YWxpZGF0ZVxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJkaXNhYmxlQ3JlYXRlP3VwZGF0ZVRlcm1Bc3NvY2lhdGlvbnMoKTpzYXZlVGhlbWVUZXJtKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWVuZCBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWF0LWJ1dHRvbiBmbGV4IGl0ZW1zLWNlbnRlciBcIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIiAoY2xpY2spPVwiYWRkVGhlbWVGaWVsZHMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMiBtYXQtaWNvbi1jdXN0b20gXCI+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBtb3JlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGZvcm1BcnJheU5hbWU9XCJ0aGVtZUZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAjbWVwPVwibWF0RXhwYW5zaW9uUGFuZWxcIiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdGhlbWVGaWVsZHNDb250cm9sczsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1ib3R0b20tbFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbZXhwYW5kZWRdPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0RXhwYW5zaW9uVGl0bGUoZmllbGQpfX0gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRoZW1lRmllbGRzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1jdXN0b20gXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJ1cGRhdGVEbmFtZShuYW1lLnZhbHVlLCBjcmVhdGVUaGVtZUZvcm1NdWx0aSwgaSlcIiBtYXhsZW5ndGg9XCI3MFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncz8ubmFtZX19XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlKCRldmVudCxjcmVhdGVUaGVtZUZvcm1NdWx0aSwgaSApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgY2xhc3M9XCJhc3NpZ25lZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgICAoa2V5dXApPVwib25LZXkoJGV2ZW50KVwiIG1hdElucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkTWFzdGVyTGlzdFwiICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG9wdGlvbj8udGl0bGUsIGNyZWF0ZVRoZW1lRm9ybU11bHRpLCBpKVwiIFtkaXNhYmxlZF09XCJvbkRpc2FibGVUaGVtZShvcHRpb24pXCIgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi50aXRsZX19IDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJmaWx0ZXJlZE1hc3Rlckxpc3QubGVuZ3RoID09PSAwXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZXN1bHRzIGZvdW5kIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3M/LmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uIGN1cnNvci1wb2ludGVyXCIgW21hdFRvb2x0aXBdPVwidG9vbFRpcFRleHRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcC1zZWNcIj5pbmZvX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZG5hbWVcIiBpZD1cImRuYW1lXCIgI2RuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpZWxkIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIG5hbWUgZmllbGQuXCIgbWF4bGVuZ3RoPVwiNzBcIiBbZGlzYWJsZWRdPVwibmFtZT8udmFsdWU/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbY2RrVGV4dGFyZWFBdXRvc2l6ZV0gW2Nka0F1dG9zaXplTWF4Um93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLmRlc2NyaXB0aW9ufX1cIiBtYXhsZW5ndGg9XCIyMDAwXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtZXAuZXhwYW5kZWQgPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybU11bHRpPy5nZXQoJ3RoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV0uaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5hZGRfYnRufX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybU11bHRpLmludmFsaWQgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZShjcmVhdGVUaGVtZUZvcm1NdWx0aSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmFkZF9idG59fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVGVybURhdGEoY3JlYXRlVGhlbWVGb3JtLCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RoZW1lRGVzaWduYXRpb24+XG4gICAgPGRpdiBjbGFzcz1cInRoZW1EZXNpZ25hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbmlzYXRpb25cIj5PcmdhbmlzYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yZy1uYW1lIHBsLTQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3Bhbj5EZXBhcnRtZW50IG9mIEZpc2hlcmllczwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZGF0YT8uY29sdW1uSW5mbz8ubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWRkLWRlc2lnbmF0aW9uIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cImFkZERlc2lnbmF0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRkLWljb24gbXItMlwiPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkFkZCBEZXNpZ25hdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxuICAgICAgICAgICAgICAgIDxmb3JtICBbZm9ybUdyb3VwXT1cImNyZWF0ZVRoZW1lRm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWFjY29yZGlvbiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIiBmb3JtQXJyYXlOYW1lPVwiZGVzaWduYXRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkZXNpZ25hdGlvbiBvZiBkZXNpZ25hdGlvbkNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiICBjbGFzcz1cImRlc2lnbmF0aW9uLXBhbmVsXCIgW2V4cGFuZGVkXT1cInBhbmVsT3BlblN0YXRlW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkZWxldERlc2lnbmF0aW9uIG1yLTRcIiAoY2xpY2spPVwiZGVsZXRlRGVzaWduYXRpb24oaSlcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lnbmF0aW9uIE5hbWUgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiVHlwZSBoZXJlXCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCIgKGNoYW5nZSk9XCJjbGVhclNlbGVjdGVkRGVzaWduYWlvbk9uQ2hhbmdlKGksICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgZGVzaWduYXRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGdldEZpbHRlcmVkRGVzaWduYXRpb25MaXN0KGkpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1lcnJvcj57e2FwcF9zdHJpbmdzLmFscmVhZHlFeGlzdH19PC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGVzaWduYXRpb25EZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgdGhlIGRlY3JpcHRpb24gaW4gZmV3ZXIgdGhhbiA2MDAgY2hhcmFjdGVyc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwic2F2ZURlc2lnbmF0b24gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZURlc2lnbmF0aW9uKGkpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTQgbXQtNSBkZXNpZ25hdGlvbi1mb290ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJjYW5jZWwgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiIWVuYWJsZUFkZEJ0blwiIGNsYXNzPVwiYWRkQnRuIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cInN1Ym1pdERlc2lnbmF0aW9uKClcIj5BZGQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNjb21wVGhlbWU+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZ05ld1wiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlcm0gb2YgZGF0YT8uc2VsZWN0ZWRQYXJlbnRUZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWxcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3t0ZXJtLmNhdGVnb3J5fX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBuYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0ZXJtLm5hbWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1kaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY29tcGV0ZW5jeUZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCIgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eydTZWxlY3QgQXJlYSd9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJTZWxlY3QgYW4gb3B0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcEFyZWFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cImxlYXJuaW5nLXNlY3Rpb25cIiAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWxsQ29tcGV0ZW5jeVwiIFt2YWx1ZV09XCJpdGVtXCIgKGNoYW5nZSk9XCJvblNlbGVjdGlvbkFyZWEoaXRlbSlcIj57e2l0ZW0ubmFtZX19PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgIFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSAhPT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwidGhlbWVGb3JtXCIgW2Zvcm1Hcm91cF09XCJjcmVhdGVUaGVtZUZvcm1cIiBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImRpc2FibGVDcmVhdGU/dXBkYXRlVGVybUFzc29jaWF0aW9ucygpOnNhdmVUaGVtZVRlcm0oKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgbWFyZ2luLXRvcC1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsIHJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInVwZGF0ZURuYW1lKG5hbWUudmFsdWUsIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uU2VsZWN0KCRldmVudC5vcHRpb24sIGNyZWF0ZVRoZW1lRm9ybSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlZFRlcm1MaXN0cyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRuYW1lXCIgaWQ9XCJkbmFtZVwiICNkbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29tcGV0ZW5jeSBkaXNwbGF5IG5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuPVwiRmlyc3QgTmFtZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciBmaXJzdCBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1hcmlhLWxhYmVsIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtbGFiZWw+RW50ZXIge3tkYXRhLm5hbWV9fSBuYW1lPC9tYXQtbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Nka1RleHRhcmVhQXV0b3NpemVdIFtjZGtBdXRvc2l6ZU1heFJvd3NdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0F1dG9zaXplTWluUm93c109XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLmRlc2NyaXB0aW9ufX1cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImRlZmF1bHRcIiB0eXBlPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpYWxvZ0Nsb3NlKCcnKVwiPnt7YXBwX3N0cmluZ3MuY2FuY2VsfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtPy5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MuY3JlYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjcmVhdGVUaGVtZUZvcm0sIGRhdGEpXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MudXBkYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9mb290ZXI+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1lbmQgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1hdC1idXR0b24gZmxleCBpdGVtcy1jZW50ZXIgXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCIgKGNsaWNrKT1cImFkZENvbXBldGVuY3lUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yIG1hdC1pY29uLWN1c3RvbSBcIj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWFjY29yZGlvbiBmb3JtQXJyYXlOYW1lPVwiY29tcFRoZW1lRmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXTsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1ib3R0b20tbFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbZXhwYW5kZWRdPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tuYW1lPy52YWx1ZX19ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29tcEZpZWxkcyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tY3VzdG9tIFwiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1hcmdpbi10b3Atc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBDb21wZXRlbmN5IFRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIkNob29zZSB0aGUgQ29tcGV0ZW5jeSBUaGVtZVwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lUaGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgI3NlYXJjaCBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGNsYXNzPVwiYXNzaWduZWVTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAgZm9ybUNvbnRyb2xOYW1lPVwiYXNzaWduZWVUZXh0XCIgbWF0SW5wdXQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZVwiIFt2YWx1ZV09XCJvcHRpb25cIiAob25TZWxlY3Rpb25DaGFuZ2UpPVwiT25UaGVtZVNlbGVjdGlvbigkZXZlbnQpXCIgID57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiICNuYW1lIHBsYWNlaG9sZGVyPVwie3thcHBfc3RyaW5ncy5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50Lm9wdGlvbiwgY3JlYXRlVGhlbWVGb3JtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVkVGVybUxpc3RzIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRuYW1lXCIgaWQ9XCJkbmFtZVwiICNkbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb21wZXRlbmN5IGRpc3BsYXkgbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG49XCJGaXJzdCBOYW1lIGxhYmVsfExhYmVsIHdoaWNoIGV4cGxhaW5zIHRoZSB1c2VyIHRvIGVudGVyIGZpcnN0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBDb21wZXRlbmN5IFN1Yi1UaGVtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWxhYmVsPkVudGVyIHt7ZGF0YS5uYW1lfX0gbmFtZTwvbWF0LWxhYmVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIkNob29zZSB0aGUgQ29tcGV0ZW5jeSBUaGVtZVwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lTdWJUaGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgY2xhc3M9XCJhc3NpZ25lZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgIGZvcm1Db250cm9sTmFtZT1cImFzc2lnbmVlVGV4dFwiIG1hdElucHV0PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZVwiIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjcmVhdGVUaGVtZUZvcm0/LmludmFsaWRcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy5jcmVhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3JlYXRlVGhlbWVGb3JtTXVsdGkuaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGUoY3JlYXRlVGhlbWVGb3JtTXVsdGksIGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBfc3RyaW5ncy5jcmVhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVGVybURhdGEoY3JlYXRlVGhlbWVGb3JtLCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNyZWF0ZVRoZW1lRm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCI+e3thcHBfc3RyaW5ncy51cGRhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIFxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=