@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,824 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
4
- import { labels } from '../../labels/strings';
5
- import * as appConstants from '../../constants/app-constant';
6
- import _ from 'lodash';
7
- import { ConforamtionPopupComponent } from '../conforamtion-popup/conforamtion-popup.component';
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 "@angular/material/legacy-snack-bar";
13
- import * as i5 from "@angular/common";
14
- import * as i6 from "@angular/material/core";
15
- import * as i7 from "@angular/material/button";
16
- import * as i8 from "@angular/material/legacy-chips";
17
- import * as i9 from "@angular/material/dialog";
18
- import * as i10 from "@angular/material/expansion";
19
- import * as i11 from "@angular/material/icon";
20
- import * as i12 from "@angular/material/input";
21
- import * as i13 from "@angular/material/form-field";
22
- import * as i14 from "@angular/material/menu";
23
- import * as i15 from "@angular/material/progress-spinner";
24
- import * as i16 from "@angular/material/radio";
25
- import * as i17 from "@angular/material/select";
26
- import * as i18 from "@angular/material/chips";
27
- export class CreateTermFromFrameworkComponent {
28
- constructor(dialogRef, data, dialog, frameWorkService, fb, _snackBar) {
29
- this.dialogRef = dialogRef;
30
- this.data = data;
31
- this.dialog = dialog;
32
- this.frameWorkService = frameWorkService;
33
- this.fb = fb;
34
- this._snackBar = _snackBar;
35
- this.app_strings = labels;
36
- this.selectedTerm = {};
37
- this.selectedTermArray = [];
38
- this.isTermExist = false;
39
- this.disableCreate = false;
40
- this.disableMultiCreate = false;
41
- this.disableUpdate = false;
42
- this.kcmList = new Map();
43
- this.allCompetency = [];
44
- this.allCompetencyTheme = [];
45
- this.filteredallCompetencyTheme = [];
46
- this.allCompetencySubtheme = [];
47
- this.filteredallCompetencySubTheme = [];
48
- }
49
- ngOnInit() {
50
- this.environment = this.frameWorkService.getEnviroment();
51
- this.getComptencyData();
52
- this.kcmConfigData = this.frameWorkService.getConfigByFrameWorkId(this.environment.kcmFrameworkName);
53
- this.competencyForm = this.fb.group({
54
- compArea: ['', Validators.required],
55
- compThemeFields: this.fb.array([this.createCompThemeFields()])
56
- });
57
- }
58
- getComptencyData() {
59
- this.frameWorkService.getFrameworkRead(this.environment.kcmFrameworkName).subscribe((data) => {
60
- if (data.categories) {
61
- this.formateData(data, this.environment.kcmFrameworkName);
62
- this.selectedCardCompThemeData = '';
63
- if (this.data && this.data.selectedParentTerms) {
64
- this.data.selectedParentTerms.forEach((ele) => {
65
- if (ele.category === "competency") {
66
- this.selectedCardCompThemeData = ele;
67
- let option = this.selectedCardCompThemeData.additionalProperties.competencyArea;
68
- this.onSelectionArea(option);
69
- }
70
- });
71
- }
72
- }
73
- }, ((_err) => {
74
- this._snackBar.open(`KCM Framework read failed.`);
75
- }));
76
- }
77
- formateData(response, frameworkId) {
78
- (response.categories).forEach((a) => {
79
- if (a.code !== undefined) {
80
- this.kcmList.set(a.code, {
81
- code: a.code,
82
- identifier: a.identifier,
83
- index: a.index,
84
- name: a.name,
85
- description: a.description,
86
- config: this.frameWorkService.getConfigOfCategoryConfigByFrameWorkId(a.code, frameworkId),
87
- children: (a.terms || []).map((c) => {
88
- const associations = c.associations || [];
89
- if (associations.length > 0) {
90
- Object.assign(c, { children: associations });
91
- }
92
- return c;
93
- })
94
- });
95
- }
96
- });
97
- this.kcmList.forEach((a) => {
98
- if (a.code === _.get(this.kcmConfigData, 'config[0].category')) {
99
- this.competencyArea = a;
100
- }
101
- });
102
- }
103
- createCompThemeFields() {
104
- return this.fb.group({
105
- competencyTheme: ['', [Validators.required]],
106
- competencySubTheme: ['', [Validators.required]]
107
- });
108
- }
109
- getCreateName(data) {
110
- let popUpCategory = data.cardColInfo ? data.cardColInfo.name : data.columnInfo.name;
111
- switch (popUpCategory) {
112
- case 'Designation':
113
- return `Create Competency Mapping`;
114
- case 'Sub Theme':
115
- if (data.openMode === 'view') {
116
- return `View Competency ${popUpCategory}`;
117
- }
118
- return `Add Competency ${popUpCategory}`;
119
- case 'Competency':
120
- if (data.openMode === 'edit') {
121
- return `Edit Competency Theme`;
122
- }
123
- else if (data.openMode === 'view') {
124
- return `View Competency Theme`;
125
- }
126
- return `Create Competency Mapping`;
127
- default: return '';
128
- }
129
- }
130
- clearSelectedThemes(option) {
131
- if (this.isThemeSelected) {
132
- this.openConforamtionPopup(option);
133
- }
134
- else {
135
- this.onSelectionArea(option);
136
- }
137
- }
138
- get isThemeSelected() {
139
- let hasValue = false;
140
- if (this.competencyForm) {
141
- const compThemeFields = this.competencyForm.get('compThemeFields');
142
- if (compThemeFields) {
143
- compThemeFields.controls.forEach((element) => {
144
- if (element.get('competencyTheme')?.value || element.get('competencySubTheme')?.value) {
145
- hasValue = true;
146
- }
147
- });
148
- }
149
- }
150
- return hasValue;
151
- }
152
- openConforamtionPopup(option) {
153
- const dialogData = {
154
- dialogType: 'warning',
155
- descriptions: [
156
- {
157
- header: 'Are you sure you want to alter the competency area?',
158
- headerClass: 'flex items-center justify-center text-blue textBold',
159
- messages: [
160
- {
161
- msgClass: '',
162
- msg: `This action will result in the loss of your currently added data`,
163
- },
164
- ],
165
- },
166
- ],
167
- footerClass: 'items-center justify-center',
168
- buttons: [
169
- {
170
- btnText: 'Cancel',
171
- btnClass: 'btn-outline',
172
- response: false,
173
- },
174
- {
175
- btnText: 'Confirm',
176
- btnClass: 'btn-full-success',
177
- response: true,
178
- },
179
- ],
180
- };
181
- const dialogRef = this.dialog.open(ConforamtionPopupComponent, {
182
- data: dialogData,
183
- autoFocus: false,
184
- width: '600px',
185
- maxWidth: '80vw',
186
- maxHeight: '90vh',
187
- disableClose: true,
188
- });
189
- dialogRef.afterClosed().subscribe((res) => {
190
- if (res) {
191
- this.onSelectionArea(option);
192
- }
193
- else {
194
- const compAreaControl = this.competencyForm.get('compArea');
195
- if (compAreaControl) {
196
- compAreaControl.setValue(this.seletedCompetencyArea);
197
- compAreaControl.updateValueAndValidity();
198
- }
199
- }
200
- });
201
- }
202
- onSelectionArea(option) {
203
- this.competencyForm.reset();
204
- while (this.compThemeFields.length !== 0) {
205
- this.compThemeFields.removeAt(0);
206
- }
207
- this.compThemeFields.push(this.createCompThemeFields());
208
- if ('theme' === this.kcmConfigData.config[1].category) {
209
- this.seletedCompetencyArea = option;
210
- const compAreaControl = this.competencyForm.get('compArea');
211
- if (compAreaControl) {
212
- compAreaControl.patchValue(option);
213
- compAreaControl.updateValueAndValidity();
214
- }
215
- this.filteredallCompetencyTheme = [];
216
- this.allCompetencyTheme = [];
217
- if (option && option.children && option.children.length) {
218
- let themeValue = this.kcmList.get(this.kcmConfigData.config[1].category);
219
- option.children.forEach((ele) => {
220
- if (ele.category === 'theme') {
221
- let result = themeValue.children.findIndex((themeData) => {
222
- if (ele.refId === themeData.refId) {
223
- return themeData.children && themeData.children.length;
224
- }
225
- });
226
- if (result >= 0) {
227
- this.allCompetencyTheme.push(ele);
228
- this.filteredallCompetencyTheme.push(ele);
229
- }
230
- }
231
- });
232
- }
233
- else {
234
- if (this.competencyArea && this.competencyArea.children) {
235
- this.competencyArea.children.forEach((element) => {
236
- if (element.code === option.code) {
237
- this.seletedCompetencyArea = option;
238
- if (element.children && element.children.length) {
239
- element.children.forEach((ele) => {
240
- if (ele.category === 'theme') {
241
- this.allCompetencyTheme.push(ele);
242
- this.filteredallCompetencyTheme.push(ele);
243
- if (this.selectedCardCompThemeData.refId.toLowerCase() === ele.refId.toLowerCase()) {
244
- let formArray = this.competencyForm.get('compThemeFields');
245
- formArray.at(0).get('competencyTheme').patchValue(ele);
246
- formArray.at(0).get('competencyTheme').updateValueAndValidity();
247
- const compAreaControl = this.competencyForm.get('compArea');
248
- if (compAreaControl) {
249
- compAreaControl.patchValue(option);
250
- compAreaControl.updateValueAndValidity();
251
- }
252
- }
253
- }
254
- });
255
- }
256
- }
257
- });
258
- }
259
- }
260
- }
261
- }
262
- addCompetencyTheme() {
263
- if (this.data.mode === 'multi-create') {
264
- this.compThemeFields.insert(0, this.createCompThemeFields());
265
- }
266
- }
267
- removeCompFields(index) {
268
- if (this.data.mode === 'multi-create') {
269
- this.compThemeFields.removeAt(index);
270
- }
271
- }
272
- OnThemeSelection(event, _indexValue, optionData) {
273
- const selectedTheme = event.source.value;
274
- this.kcmList.forEach((ele) => {
275
- if (selectedTheme.category === ele.code) {
276
- if (ele.children && ele.children.length) {
277
- ele.children.forEach((themeChild) => {
278
- if (themeChild.identifier === selectedTheme.identifier) {
279
- if (themeChild.children && themeChild.children.length) {
280
- optionData['children'] = themeChild.children;
281
- this.filteredallCompetencySubTheme = themeChild.children;
282
- let matchedData = [];
283
- if (this.data.childrenData && this.data.childrenData.category === "subtheme") {
284
- matchedData = _.intersectionBy(themeChild.children, [this.data.childrenData], 'refId');
285
- }
286
- else {
287
- matchedData = _.intersectionBy(themeChild.children, this.selectedCardCompThemeData.children, 'refId');
288
- }
289
- let formArray = this.competencyForm.get('compThemeFields');
290
- const competencySubThemeControl = formArray.at(_indexValue).get('competencySubTheme');
291
- if (competencySubThemeControl) {
292
- competencySubThemeControl.patchValue(matchedData);
293
- competencySubThemeControl.updateValueAndValidity();
294
- }
295
- }
296
- }
297
- });
298
- }
299
- }
300
- });
301
- }
302
- onTermRemove(termData, indexValue) {
303
- let formArray = this.competencyForm.get('compThemeFields');
304
- const compThemeControl = formArray.at(indexValue).get('competencySubTheme');
305
- if (compThemeControl) {
306
- const themes = compThemeControl.value;
307
- if (themes) {
308
- const index = themes.indexOf(termData);
309
- if (index >= 0) {
310
- themes.splice(index, 1);
311
- compThemeControl.setValue(themes);
312
- }
313
- }
314
- }
315
- }
316
- OnSubThemeSelection(_event, _indexValue, _option) {
317
- }
318
- async multiCreate(form, _data) {
319
- this.disableMultiCreate = true;
320
- let counterSubTheme = 0;
321
- let parentCategory = {};
322
- let createdTerms = [];
323
- let createdSubTheme = [];
324
- if (form.valid) {
325
- const themeFields = form && form.value && form.value.compThemeFields;
326
- if (themeFields && themeFields.length) {
327
- let localCompArea = { ...this.seletedCompetencyArea };
328
- if (localCompArea.children && localCompArea.children.length) {
329
- delete localCompArea.children;
330
- }
331
- if (localCompArea.associations && localCompArea.associations.length) {
332
- delete localCompArea.associations;
333
- }
334
- for (let [index, objVal] of themeFields.entries()) {
335
- parentCategory = {};
336
- if (objVal['competencyTheme']) {
337
- createdTerms = [];
338
- let value = objVal['competencyTheme'];
339
- const term = {
340
- code: this.frameWorkService.getUuid(),
341
- name: value.name,
342
- description: value.description,
343
- category: this.data.columnInfo.code,
344
- status: appConstants.LIVE,
345
- refId: value.refId || '',
346
- refType: value.refType || '',
347
- parents: [
348
- { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
349
- ],
350
- additionalProperties: {
351
- competencyArea: localCompArea,
352
- timeStamp: new Date().getTime()
353
- }
354
- };
355
- const requestBody = {
356
- request: {
357
- term: term
358
- }
359
- };
360
- await this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).toPromise().then(async (res) => {
361
- requestBody.request.term['identifier'] = res.result.node_id[0];
362
- this.frameWorkService.selectionList.delete('competency');
363
- parentCategory = requestBody.request.term;
364
- createdTerms.push(requestBody.request.term);
365
- const parentColumn = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
366
- let parentCol = this.frameWorkService.selectionList.get(parentColumn.code);
367
- await this.updateTermAssociationsMultiV2(createdTerms, parentCol);
368
- let data = {
369
- "selected": false,
370
- "category": parentColumn.code,
371
- "cardSubType": "minimal",
372
- "isViewOnly": false,
373
- "index": parentColumn.index,
374
- "columnInfo": this.data.cardColInfo
375
- };
376
- const responseData12 = {
377
- res: { term: [this.selectedTerm], created: true, multi: true },
378
- index: this.data.columnInfo.index,
379
- data: data,
380
- type: 'multi-create'
381
- };
382
- this.frameWorkService.updateAfterAddOrEditSubject(responseData12);
383
- });
384
- }
385
- if (objVal['competencySubTheme']) {
386
- this.frameWorkService.selectionList.set(this.data.columnInfo.code, parentCategory);
387
- let value = objVal['competencySubTheme'];
388
- if (value && value.length) {
389
- counterSubTheme = 0;
390
- createdSubTheme = [];
391
- for (let ele of value) {
392
- const term = {
393
- code: this.frameWorkService.getUuid(),
394
- name: ele.name,
395
- description: ele.description,
396
- category: this.data.nextColInfo.code,
397
- status: appConstants.LIVE,
398
- refId: ele.refId || '',
399
- refType: ele.refType || '',
400
- parents: [
401
- { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.nextColInfo.code}` }
402
- ],
403
- additionalProperties: {
404
- timeStamp: new Date().getTime()
405
- }
406
- };
407
- const requestBody = {
408
- request: {
409
- term: term
410
- }
411
- };
412
- let responseData = await this.crateTerm(this.data.frameworkId, this.data.nextColInfo.code, requestBody);
413
- requestBody.request.term['identifier'] = responseData.result.node_id[0];
414
- createdSubTheme.push(requestBody.request.term);
415
- counterSubTheme++;
416
- if ((counterSubTheme === objVal['competencySubTheme'].length)) {
417
- const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.nextColInfo.code);
418
- let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
419
- await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol, index, themeFields.length);
420
- if (index === themeFields.length - 1) {
421
- this.frameWorkService.selectionList.delete('competency');
422
- this.dialogClose({ term: this.selectedTermArray, created: true, multi: false, callUpdate: false });
423
- this.disableMultiCreate = false;
424
- this._snackBar.open(`Competency Mapping created successfully.`);
425
- }
426
- }
427
- }
428
- }
429
- }
430
- }
431
- }
432
- }
433
- }
434
- async crateTerm(frameworkId, colCode, requestBody) {
435
- return new Promise(async (resolve) => {
436
- this.frameWorkService.createTerm(frameworkId, colCode, requestBody).subscribe((res) => {
437
- resolve(res);
438
- }, ((_err) => {
439
- this._snackBar.open(`Create Term failed.`);
440
- }));
441
- });
442
- }
443
- async updateTermAssociationsMultiV2(createdTerms, parentSelectedTerm, _runningIndex, _themFieldsLength) {
444
- if (createdTerms && createdTerms.length) {
445
- this.selectedTermArray = [];
446
- let createdTermsIdentifiers = [];
447
- this.selectedTermArray = createdTerms;
448
- this.selectedTerm = createdTerms[createdTerms.length - 1];
449
- for (let createdTerm of createdTerms) {
450
- createdTermsIdentifiers.push({ identifier: createdTerm.identifier });
451
- }
452
- let associations = [];
453
- let counter = 0;
454
- if (!parentSelectedTerm) {
455
- for (const [value] of this.frameWorkService.selectionList) {
456
- const parent = value;
457
- counter++;
458
- associations = parent.children ? parent.children.map((c) => {
459
- return c.identifier ? { identifier: c.identifier } : null;
460
- }) : [];
461
- associations = [...associations, ...createdTermsIdentifiers];
462
- this.isTermExist = false;
463
- const reguestBody = {
464
- request: {
465
- term: {
466
- ...(associations && associations.length) ? { associations: [...associations] } : null,
467
- }
468
- }
469
- };
470
- await this.callUpdateAssociationsV2(counter, parent, reguestBody);
471
- }
472
- }
473
- else {
474
- const parent = parentSelectedTerm;
475
- associations = parent.children ? parent.children.map((c) => {
476
- return c.identifier ? { identifier: c.identifier } : null;
477
- }) : [];
478
- associations = [...associations, ...createdTermsIdentifiers];
479
- this.isTermExist = false;
480
- const reguestBody = {
481
- request: {
482
- term: {
483
- ...(associations && associations.length) ? { associations: [...associations] } : null,
484
- }
485
- }
486
- };
487
- return await this.callUpdateAssociationsV2(counter, parent, reguestBody);
488
- this.disableMultiCreate = false;
489
- }
490
- }
491
- }
492
- async updateTermAssociationsMulti(createdTerms) {
493
- if (createdTerms && createdTerms.length) {
494
- for (let createdTerm of createdTerms) {
495
- this.selectedTerm = createdTerm;
496
- let associations = [];
497
- let temp;
498
- let counter = 0;
499
- for (const [value] of this.frameWorkService.selectionList) {
500
- const parent = value;
501
- counter++;
502
- temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
503
- associations = parent.children ? parent.children.map((c) => {
504
- return c.identifier ? { identifier: c.identifier } : null;
505
- }) : [];
506
- if (temp && temp.length) {
507
- this.isTermExist = true;
508
- return;
509
- }
510
- else {
511
- associations.push({ identifier: this.selectedTerm.identifier });
512
- this.isTermExist = false;
513
- const reguestBody = {
514
- request: {
515
- term: {
516
- ...(associations && associations.length) ? { associations: [...associations] } : null,
517
- }
518
- }
519
- };
520
- await this.callUpdateAssociations(counter, parent, reguestBody);
521
- }
522
- }
523
- }
524
- }
525
- }
526
- async callUpdateAssociationsV2(counter, parent, reguestBody) {
527
- return new Promise(async (resolve) => {
528
- this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
529
- parent['children'] = parent && parent.children ? [...parent.children, ...this.selectedTermArray] : this.selectedTermArray;
530
- let listData = this.frameWorkService.list.get(this.data.columnInfo.code);
531
- let differenceData = [];
532
- if (listData && listData.children && listData.children.length) {
533
- differenceData = _.differenceBy(this.selectedTermArray, listData.children, 'identifier');
534
- }
535
- else {
536
- differenceData = this.selectedTermArray;
537
- }
538
- listData['associations'] = listData && listData.associations ? [...listData.associations, ...differenceData] : differenceData;
539
- listData['children'] = listData && listData.children ? [...listData.children, ...differenceData] : differenceData;
540
- this.frameWorkService.selectionList.forEach((selectedData) => {
541
- let listData = this.frameWorkService.list.get(selectedData.category);
542
- if (listData && listData.children && listData.children.length) {
543
- this.updateLocalList(listData, parent, this.selectedTermArray);
544
- }
545
- });
546
- if (counter === this.frameWorkService.selectionList.size) {
547
- this.disableUpdate = false;
548
- let returnValue = true;
549
- resolve(true);
550
- await returnValue;
551
- }
552
- else {
553
- let returnValue = true;
554
- resolve(true);
555
- await returnValue;
556
- }
557
- }, (_err) => {
558
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
559
- this._snackBar.open(`Term Association failed.`);
560
- this.disableMultiCreate = false;
561
- });
562
- });
563
- }
564
- async callUpdateAssociations(counter, parent, reguestBody) {
565
- return new Promise(async (resolve) => {
566
- this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
567
- if (counter === this.frameWorkService.selectionList.size) {
568
- const found = parent.children ? parent.children.find((c) => c.identifier === this.selectedTerm.identifier) : false;
569
- if (!found) {
570
- parent.children ? parent.children.push(this.selectedTerm) : parent['children'] = [this.selectedTerm];
571
- }
572
- this.disableUpdate = false;
573
- let returnValue = true;
574
- resolve(true);
575
- await returnValue;
576
- }
577
- else {
578
- let returnValue = true;
579
- resolve(true);
580
- await returnValue;
581
- }
582
- }, (_err) => {
583
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
584
- });
585
- });
586
- }
587
- updateTermData(form, data) {
588
- this.disableUpdate = true;
589
- const formData = {
590
- ...form.value
591
- };
592
- const updateData = {
593
- formData,
594
- updateTermData: data.childrenData
595
- };
596
- this.updateTermAssociations(updateData);
597
- }
598
- updateTermAssociations(updateData) {
599
- let associations = [];
600
- let temp;
601
- let counter = 0;
602
- this.frameWorkService.selectionList.forEach((parent) => {
603
- counter++;
604
- temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
605
- associations = parent.children ? parent.children.map((c) => {
606
- return c.identifier ? { identifier: c.identifier } : null;
607
- }) : [];
608
- if (temp && temp.length) {
609
- this.isTermExist = true;
610
- return;
611
- }
612
- else {
613
- if (this.selectedTerm && this.selectedTerm.identifier) {
614
- associations.push({ identifier: this.selectedTerm.identifier });
615
- }
616
- this.isTermExist = false;
617
- const reguestBody = {
618
- request: {
619
- term: {
620
- ...(updateData && updateData.formData && updateData.updateTermData.code === parent.code) ? { ...updateData.formData } : null,
621
- ...(associations && associations.length) ? { associations: [...associations] } : null,
622
- }
623
- }
624
- };
625
- this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(() => {
626
- if (counter === this.frameWorkService.selectionList.size) {
627
- const value = (this.selectedTerm && this.selectedTerm.identifier) ? this.selectedTerm : (updateData) ? { ...updateData.updateTermData, ...updateData.formData } : {};
628
- this.disableUpdate = false;
629
- this.dialogClose({ term: { ...value }, created: true });
630
- }
631
- }, (_err) => {
632
- console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
633
- this._snackBar.open(`Term Association failed.`);
634
- this.disableMultiCreate = false;
635
- });
636
- }
637
- });
638
- }
639
- dialogClose(term) {
640
- this.frameWorkService.publishFramework().subscribe(() => {
641
- this.disableMultiCreate = false;
642
- this.dialogRef.close(term);
643
- }, (_err) => {
644
- this.disableMultiCreate = false;
645
- this.dialogRef.close(term);
646
- this._snackBar.open(`Publish failed.`);
647
- });
648
- }
649
- async multiCreateSubTheme(_form, data) {
650
- this.disableMultiCreate = true;
651
- let formArray = this.competencyForm.get('compThemeFields');
652
- let selectedFormData = formArray.at(0).get('competencySubTheme').value;
653
- let previousSubThemeData = data.childrenData.children;
654
- let newlyAdded = [];
655
- let removedExisting = [];
656
- let createdSubTheme = [];
657
- let counterSubTheme = 0;
658
- newlyAdded = _.differenceBy(selectedFormData, previousSubThemeData, 'refId');
659
- removedExisting = _.differenceBy(previousSubThemeData, selectedFormData, 'refId');
660
- if (newlyAdded && newlyAdded.length) {
661
- for (let val of newlyAdded) {
662
- const term = {
663
- code: this.frameWorkService.getUuid(),
664
- name: val.name,
665
- description: val.description,
666
- category: this.data.columnInfo.code,
667
- status: appConstants.LIVE,
668
- refId: val.refId,
669
- refType: val.refType,
670
- parents: [
671
- { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
672
- ],
673
- additionalProperties: {
674
- timeStamp: new Date().getTime()
675
- }
676
- };
677
- const requestBody = {
678
- request: {
679
- term: term
680
- }
681
- };
682
- const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
683
- let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
684
- let responseData = await this.crateTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody);
685
- requestBody.request.term['identifier'] = responseData.result.node_id[0];
686
- createdSubTheme.push(requestBody.request.term);
687
- counterSubTheme++;
688
- if (counterSubTheme === newlyAdded.length) {
689
- await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol);
690
- this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, createdSubTheme, 'create');
691
- if (!(removedExisting && removedExisting.length)) {
692
- this.dialogClose({ term: this.selectedTermArray, created: true, multi: true, callUpdate: false });
693
- this.disableMultiCreate = false;
694
- this._snackBar.open(`Competency theme updated successfully.`);
695
- }
696
- }
697
- }
698
- }
699
- if (removedExisting && removedExisting.length) {
700
- let removedTermsCollection = [];
701
- for (let removedTerm of removedExisting) {
702
- removedTermsCollection.push(removedTerm.code);
703
- }
704
- let subThemeRequest = {
705
- "request": {
706
- "contentIds": removedTermsCollection
707
- }
708
- };
709
- await this.frameWorkService.retireMultipleTerm(this.data.frameworkId, this.data.columnInfo.code, subThemeRequest).toPromise().then(async () => {
710
- const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
711
- let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
712
- const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
713
- const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
714
- parentCol['children'] = sectionListchildrenList;
715
- parentCol['associations'] = sectionListAssociationList;
716
- this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, removedExisting, 'delete');
717
- this.dialogClose({ term: [], created: true, multi: true, callUpdate: false });
718
- this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
719
- this.disableMultiCreate = false;
720
- this._snackBar.open(`Competency theme updated successfully.`);
721
- });
722
- }
723
- this.disableMultiCreate = false;
724
- }
725
- onDisableTheme(option) {
726
- const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
727
- let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
728
- let result = -1;
729
- if (parentCol && parentCol.children && parentCol.children.length) {
730
- result = parentCol.children.findIndex((ele) => {
731
- if ((ele.refType === 'theme') && (this.seletedCompetencyArea.code === ele.additionalProperties.competencyArea.code)) {
732
- return ele.refId === option.refId;
733
- }
734
- return false;
735
- });
736
- }
737
- if (result < 0) {
738
- let formArray = this.competencyForm.get('compThemeFields');
739
- result = formArray.value.findIndex((formEle) => {
740
- if (formEle.competencyTheme && formEle.competencyTheme.refId) {
741
- return formEle.competencyTheme.refId === option.refId;
742
- }
743
- return false;
744
- });
745
- }
746
- return result >= 0 ? true : false;
747
- }
748
- updateLocalList(item, parent, selectedTermArray, updateType) {
749
- if (item && item.children && item.children.length) {
750
- if (updateType === 'delete') {
751
- item.children.forEach((itmData) => {
752
- if (itmData.identifier === parent.identifier) {
753
- const associationList = _.differenceWith(itmData.associations, selectedTermArray, (a, b) => a.identifier === b.identifier);
754
- const childrenList = _.differenceWith(itmData.children, selectedTermArray, (a, b) => a.identifier === b.identifier);
755
- itmData['associations'] = associationList;
756
- itmData['children'] = childrenList;
757
- }
758
- if (itmData.children) {
759
- this.updateLocalList(itmData, parent, selectedTermArray, updateType);
760
- }
761
- });
762
- }
763
- else {
764
- item.children.forEach((itmData) => {
765
- if (itmData.identifier === parent.identifier) {
766
- let differenceData = [];
767
- if (itmData && itmData.children && itmData.children.length) {
768
- differenceData = _.differenceBy(selectedTermArray, itmData.children, 'identifier');
769
- }
770
- else {
771
- differenceData = selectedTermArray;
772
- }
773
- itmData['associations'] = itmData && itmData.associations ? [...itmData.associations, ...differenceData] : differenceData;
774
- itmData['children'] = itmData && itmData.children ? [...itmData.children, ...differenceData] : differenceData;
775
- }
776
- if (itmData.children) {
777
- this.updateLocalList(itmData, parent, selectedTermArray);
778
- }
779
- });
780
- }
781
- }
782
- }
783
- deleteTheme() {
784
- this.disableMultiCreate = true;
785
- const cardData = this.data.childrenData;
786
- let removedListTerm = [];
787
- removedListTerm.push(cardData.code);
788
- let subThemeRequest = {
789
- "request": {
790
- "contentIds": removedListTerm
791
- }
792
- };
793
- this.frameWorkService.retireMultipleTerm(this.frameWorkService.frameworkId, cardData.category, subThemeRequest).toPromise().then(async () => {
794
- let removedExisting = [cardData];
795
- const parentColumnConfigData = this.frameWorkService.getPreviousCategory(cardData.category);
796
- let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
797
- const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
798
- const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
799
- parentCol['children'] = sectionListchildrenList;
800
- parentCol['associations'] = sectionListAssociationList;
801
- this.frameWorkService.updateFrameworkList(cardData.category, parentCol, removedExisting, 'delete');
802
- this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
803
- this.dialogClose({});
804
- this.disableMultiCreate = false;
805
- this._snackBar.open(`Competency theme deleted successfully.`);
806
- }, ((_err) => {
807
- this.disableMultiCreate = false;
808
- this._snackBar.open(`Competency theme delete failed.`);
809
- }));
810
- }
811
- get compThemeFields() {
812
- return this.competencyForm.get('compThemeFields');
813
- }
814
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i1.MatLegacyDialog }, { token: i2.FrameworkService }, { token: i3.UntypedFormBuilder }, { token: i4.MatLegacySnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
815
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateTermFromFrameworkComponent, selector: "lib-create-term-from-framework", ngImport: i0, template: "\n<div class=\"\">\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 <div class=\"dialogNew\">\n <div class=\"flex items-center justify-between\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <button type=\"button\" mat-icon-button i18n-aria-label aria-label=\"action items\"\n [matMenuTriggerFor]=\"cardMenu\" [matMenuTriggerData]=\"{'data':data}\" class=\"action-btn\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <ng-container *ngIf=\"term.category !== 'competency'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{frameWorkService.getConfig(term.category).labelName}}\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 </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"competencyForm\">\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\" aria-label=\"First name labe \">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group class=\"competency-group\" aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" class=\"learning-section\" [ngClass]=\"{'active-btn':item?.code === seletedCompetencyArea?.code}\"\n *ngFor=\"let item of competencyArea?.children\" [value]=\"item\" [checked]=\"item?.code === seletedCompetencyArea?.code\" (change)=\"clearSelectedThemes(item)\">{{item.name}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <div class=\"flex flex-end mb-4\" >\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button type=\"button\" class=\"mat-button flex items-center create-accordion-btn\" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n <!-- {{data.columnInfo.name}} -->\n </button>\n </ng-container>\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 comp-theme-fields\" [formGroupName]=\"i\" [expanded]=\"isFirst\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.name}} \n </mat-panel-title>\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\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 </ng-container>\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 {{data.openMode !== 'view'? 'Select Competency Theme': 'Competency Theme Name'}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <ng-container >\n <ng-container >\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" [disabled]=\"onDisableTheme(option) || data.openMode ==='view'\" \n (onSelectionChange)=\"OnThemeSelection($event, i, option)\" >{{option.name}}\n <ng-container *ngIf=\"option.refId\">\n <span class=\"ml-2 ref-id\">({{option.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n </ng-container>\n </mat-select>\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\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\n {{data.openMode !== 'view'? 'Select Competency Sub-Theme': 'Competency Sub-Theme Name'}}\n \n </label>\n <!-- <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field> -->\n <!-- {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value |json}} -->\n <mat-form-field appearance=\"outline\" class=\"w-full field-height\" >\n <mat-select class=\" placeholder-text\" placeholder=\"Choose the Competency Sub-Theme\"\n formControlName=\"competencySubTheme\" multiple [disabled]=\"data.openMode ==='view'\" panelClass=\"full-width-panel\">\n <!-- [ngClass]=\"{'disbaledSelect':isHideData}\" -->\n <mat-select-trigger >\n <mat-chip-listbox>\n <!-- -->\n \n <mat-chip *ngFor=\"let item of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value\" \n (removed)=\"onTermRemove(item, i)\" [disabled]=\"data.openMode ==='view'\"\n [ngClass]=\"{'sub-theme-disable': data?.openMode ==='view'}\" [removable]=\"data?.openMode ==='view'? false: true\">\n <span >{{ item.name }}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-listbox>\n </mat-select-trigger>\n <!-- {{competencyForm?.get('compThemeFields') |json}} -->\n <!-- <mat-optgroup>\n <mat-form-field floatLabel=\"never\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" (keydown.space)=\"$event.stopPropagation()\"\n formControlName=\"competencySubTheme\" matInput>\n </mat-form-field>\n </mat-optgroup> -->\n <mat-optgroup *ngIf=\"filteredallCompetencySubTheme.length === 0\">\n <div>No results found!</div>\n </mat-optgroup>\n <!-- <mat-option *ngFor=\"let option of requestObjData.preferredProvider\" [value]=\"option.providerName\">{{option.providerName}}</mat-option> -->\n <ng-container *ngFor=\"let option of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.children\">\n <mat-option \n [value]=\"option\" class=\"mat-option-list\">{{option?.name}}\n <ng-container *ngIf=\"option?.refId\">\n <span class=\"ml-2 ref-id\">({{option?.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n \n </mat-select>\n <!-- <mat-error *ngIf=\"requestForm.controls['providerText'].hasError('required')\">\n Please select up to five preferred providers for the request.\n </mat-error> -->\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' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"competencyForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create' && data.openMode !=='view'\">\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(competencyForm, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.columnInfo?.code === 'subtheme'\">\n <!-- <ng-container *ngIf=\"competencyForm?.get('compThemeFields')['controls'][0]['controls']?.competencySubTheme?.value?.length;else updateBtn\"> -->\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.update}}\n </button>\n <!-- </ng-container> -->\n \n <!-- <ng-template #updateBtn>\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.delete}}\n </button>\n </ng-template> -->\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(competencyForm, data)\"\n [disabled]=\"competencyForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n </ng-container>\n \n </div>\n \n \n <!-- Title of the popup -->\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 <!-- {{data |json}} -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{getCreateName(data)}}</div>\n </ng-container>\n <!-- <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title>View {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data.columnInfo.name}}</div>\n </ng-container>\n </ng-template>\n</div>\n\n\n<mat-menu #cardMenu=\"matMenu\" class=\"menu-sec\">\n <ng-template matMenuContent let-rowData=\"data\" let-cardRef=\"cardRef\">\n <button (click)=\"deleteTheme()\"\n mat-menu-item name=\"channel-analytics-button\" class=\"ws-mat-primary-text\" i18n-aria-label\n aria-label=\"Analytics\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </ng-template>\n</mat-menu>", 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:1rem}.dialogNew .mat-dialog-title{padding:1em 0;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}.dialogNew .learning-section{padding:10px!important;border:1px solid rgba(0,0,0,.1803921569);border-radius:4px;margin-right:8px}.dialogNew .learning-section.active-btn{border:1px solid #1B4CA1!important}.learning-section.mat-radio-button .mat-radio-container .mat-radio-outer-circle{border-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-inner-circle{background-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#1b4ca1!important}.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}::ng-deep .full-width-panel{width:100%!important;min-width:300px}::ng-deep .full-width-panel .mat-option{white-space:normal}.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}::ng-deep .mat-option.mat-selected:not(.mat-option-disabled){color:#000000de!important}::ng-deep .theme-igot.day-mode .mat-pseudo-checkbox-checked{background:#0074b6!important}::ng-deep .mat-select-panel .mat-option{line-height:1!important}.comp-theme-fields{background:#eef1f7!important;border:1px solid #DBE0E9!important}.create-accordion-btn{color:#1b4ca1!important;padding:0!important}.create-accordion-btn mat-icon{color:#1b4ca1}.ref-id{font-size:10px}::ng-deep .mat-select-panel{min-width:103%!important;margin-left:32px}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}::ng-deep .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.8!important;cursor:none;filter:brightness(90%)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i8.MatLegacyChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i9.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i10.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.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: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i14.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i14.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i14.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i16.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i17.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i17.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.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: "component", type: i18.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i18.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i18.MatChipRemove, selector: "[matChipRemove]" }] }); }
816
- }
817
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, decorators: [{
818
- type: Component,
819
- args: [{ selector: 'lib-create-term-from-framework', template: "\n<div class=\"\">\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 <div class=\"dialogNew\">\n <div class=\"flex items-center justify-between\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <button type=\"button\" mat-icon-button i18n-aria-label aria-label=\"action items\"\n [matMenuTriggerFor]=\"cardMenu\" [matMenuTriggerData]=\"{'data':data}\" class=\"action-btn\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <ng-container *ngIf=\"term.category !== 'competency'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{frameWorkService.getConfig(term.category).labelName}}\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 </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"competencyForm\">\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\" aria-label=\"First name labe \">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group class=\"competency-group\" aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" class=\"learning-section\" [ngClass]=\"{'active-btn':item?.code === seletedCompetencyArea?.code}\"\n *ngFor=\"let item of competencyArea?.children\" [value]=\"item\" [checked]=\"item?.code === seletedCompetencyArea?.code\" (change)=\"clearSelectedThemes(item)\">{{item.name}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <div class=\"flex flex-end mb-4\" >\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button type=\"button\" class=\"mat-button flex items-center create-accordion-btn\" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n <!-- {{data.columnInfo.name}} -->\n </button>\n </ng-container>\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 comp-theme-fields\" [formGroupName]=\"i\" [expanded]=\"isFirst\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.name}} \n </mat-panel-title>\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\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 </ng-container>\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 {{data.openMode !== 'view'? 'Select Competency Theme': 'Competency Theme Name'}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <ng-container >\n <ng-container >\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" [disabled]=\"onDisableTheme(option) || data.openMode ==='view'\" \n (onSelectionChange)=\"OnThemeSelection($event, i, option)\" >{{option.name}}\n <ng-container *ngIf=\"option.refId\">\n <span class=\"ml-2 ref-id\">({{option.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n </ng-container>\n </mat-select>\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\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\n {{data.openMode !== 'view'? 'Select Competency Sub-Theme': 'Competency Sub-Theme Name'}}\n \n </label>\n <!-- <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field> -->\n <!-- {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value |json}} -->\n <mat-form-field appearance=\"outline\" class=\"w-full field-height\" >\n <mat-select class=\" placeholder-text\" placeholder=\"Choose the Competency Sub-Theme\"\n formControlName=\"competencySubTheme\" multiple [disabled]=\"data.openMode ==='view'\" panelClass=\"full-width-panel\">\n <!-- [ngClass]=\"{'disbaledSelect':isHideData}\" -->\n <mat-select-trigger >\n <mat-chip-listbox>\n <!-- -->\n \n <mat-chip *ngFor=\"let item of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value\" \n (removed)=\"onTermRemove(item, i)\" [disabled]=\"data.openMode ==='view'\"\n [ngClass]=\"{'sub-theme-disable': data?.openMode ==='view'}\" [removable]=\"data?.openMode ==='view'? false: true\">\n <span >{{ item.name }}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-listbox>\n </mat-select-trigger>\n <!-- {{competencyForm?.get('compThemeFields') |json}} -->\n <!-- <mat-optgroup>\n <mat-form-field floatLabel=\"never\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" (keydown.space)=\"$event.stopPropagation()\"\n formControlName=\"competencySubTheme\" matInput>\n </mat-form-field>\n </mat-optgroup> -->\n <mat-optgroup *ngIf=\"filteredallCompetencySubTheme.length === 0\">\n <div>No results found!</div>\n </mat-optgroup>\n <!-- <mat-option *ngFor=\"let option of requestObjData.preferredProvider\" [value]=\"option.providerName\">{{option.providerName}}</mat-option> -->\n <ng-container *ngFor=\"let option of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.children\">\n <mat-option \n [value]=\"option\" class=\"mat-option-list\">{{option?.name}}\n <ng-container *ngIf=\"option?.refId\">\n <span class=\"ml-2 ref-id\">({{option?.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n \n </mat-select>\n <!-- <mat-error *ngIf=\"requestForm.controls['providerText'].hasError('required')\">\n Please select up to five preferred providers for the request.\n </mat-error> -->\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' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"competencyForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create' && data.openMode !=='view'\">\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(competencyForm, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.columnInfo?.code === 'subtheme'\">\n <!-- <ng-container *ngIf=\"competencyForm?.get('compThemeFields')['controls'][0]['controls']?.competencySubTheme?.value?.length;else updateBtn\"> -->\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.update}}\n </button>\n <!-- </ng-container> -->\n \n <!-- <ng-template #updateBtn>\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.delete}}\n </button>\n </ng-template> -->\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(competencyForm, data)\"\n [disabled]=\"competencyForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n </ng-container>\n \n </div>\n \n \n <!-- Title of the popup -->\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 <!-- {{data |json}} -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{getCreateName(data)}}</div>\n </ng-container>\n <!-- <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title>View {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data.columnInfo.name}}</div>\n </ng-container>\n </ng-template>\n</div>\n\n\n<mat-menu #cardMenu=\"matMenu\" class=\"menu-sec\">\n <ng-template matMenuContent let-rowData=\"data\" let-cardRef=\"cardRef\">\n <button (click)=\"deleteTheme()\"\n mat-menu-item name=\"channel-analytics-button\" class=\"ws-mat-primary-text\" i18n-aria-label\n aria-label=\"Analytics\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </ng-template>\n</mat-menu>", 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:1rem}.dialogNew .mat-dialog-title{padding:1em 0;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}.dialogNew .learning-section{padding:10px!important;border:1px solid rgba(0,0,0,.1803921569);border-radius:4px;margin-right:8px}.dialogNew .learning-section.active-btn{border:1px solid #1B4CA1!important}.learning-section.mat-radio-button .mat-radio-container .mat-radio-outer-circle{border-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-inner-circle{background-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#1b4ca1!important}.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}::ng-deep .full-width-panel{width:100%!important;min-width:300px}::ng-deep .full-width-panel .mat-option{white-space:normal}.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}::ng-deep .mat-option.mat-selected:not(.mat-option-disabled){color:#000000de!important}::ng-deep .theme-igot.day-mode .mat-pseudo-checkbox-checked{background:#0074b6!important}::ng-deep .mat-select-panel .mat-option{line-height:1!important}.comp-theme-fields{background:#eef1f7!important;border:1px solid #DBE0E9!important}.create-accordion-btn{color:#1b4ca1!important;padding:0!important}.create-accordion-btn mat-icon{color:#1b4ca1}.ref-id{font-size:10px}::ng-deep .mat-select-panel{min-width:103%!important;margin-left:32px}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}::ng-deep .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.8!important;cursor:none;filter:brightness(90%)}\n"] }]
820
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
821
- type: Inject,
822
- args: [MAT_DIALOG_DATA]
823
- }] }, { type: i1.MatLegacyDialog }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.MatLegacySnackBar }]; } });
824
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBOEUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixJQUFJLGVBQWUsRUFBb0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5SixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHOUMsT0FBTyxLQUFLLFlBQVksTUFBTSw4QkFBOEIsQ0FBQztBQUc3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhHLE1BQU0sT0FBTyxnQ0FBZ0M7SUFnQzNDLFlBQ1MsU0FBeUQsRUFDaEMsSUFBUyxFQUNqQyxNQUFpQixFQUNsQixnQkFBa0MsRUFDakMsRUFBc0IsRUFDdEIsU0FBc0I7UUFMdkIsY0FBUyxHQUFULFNBQVMsQ0FBZ0Q7UUFDaEMsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDakMsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQXBDaEMsZ0JBQVcsR0FBRyxNQUFNLENBQUM7UUFHckIsaUJBQVksR0FBUyxFQUFFLENBQUM7UUFDeEIsc0JBQWlCLEdBQVMsRUFBRSxDQUFBO1FBSzVCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQU0vQixZQUFPLEdBQVEsSUFBSSxHQUFHLEVBQW1DLENBQUM7UUFLMUQsa0JBQWEsR0FBTyxFQUFFLENBQUE7UUFFdEIsdUJBQWtCLEdBQU8sRUFBRSxDQUFBO1FBQzNCLCtCQUEwQixHQUFPLEVBQUUsQ0FBQTtRQUNuQywwQkFBcUIsR0FBTyxFQUFFLENBQUE7UUFDOUIsa0NBQTZCLEdBQU8sRUFBRSxDQUFBO0lBU2xDLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDeEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3BHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEMsUUFBUSxFQUFDLENBQUMsRUFBRSxFQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDakMsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztTQUMvRCxDQUFDLENBQUE7SUFFSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUMsRUFBRTtZQUMzRixJQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtnQkFDekQsSUFBSSxDQUFDLHlCQUF5QixHQUFJLEVBQUUsQ0FBQTtnQkFFcEMsSUFBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7d0JBQ2pELElBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLEVBQUU7NEJBQ2hDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLENBQUE7NEJBQ3BDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUE7NEJBQy9FLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7eUJBQzdCO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBRUQ7UUFDRixDQUFDLEVBQUMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtRQUNuRCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFhLEVBQUUsV0FBbUI7UUFDNUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUU7WUFDdEMsSUFBRyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDdkIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO29CQUNaLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtvQkFDeEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNkLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDWixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7b0JBQzFCLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUM7b0JBRXpGLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUU7d0JBQ3RDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFBO3dCQUN6QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO3lCQUM3Qzt3QkFDRCxPQUFPLENBQUMsQ0FBQTtvQkFDVixDQUFDLENBQUM7aUJBQ0gsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDOUIsSUFBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxFQUFDO2dCQUM1RCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQTthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBR0osQ0FBQztJQUdELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLGVBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxrQkFBa0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBR0QsYUFBYSxDQUFDLElBQVM7UUFDbkIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFBO1FBQ25GLFFBQU8sYUFBYSxFQUFDO1lBQ25CLEtBQUssYUFBYTtnQkFDbEIsT0FBTywyQkFBMkIsQ0FBQztZQUNuQyxLQUFLLFdBQVc7Z0JBQ2QsSUFBRyxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtvQkFDM0IsT0FBTyxtQkFBbUIsYUFBYSxFQUFFLENBQUE7aUJBQzFDO2dCQUNILE9BQU8sa0JBQWtCLGFBQWEsRUFBRSxDQUFBO1lBQ3hDLEtBQUssWUFBWTtnQkFDZixJQUFHLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFO29CQUMzQixPQUFPLHVCQUF1QixDQUFBO2lCQUMvQjtxQkFBTSxJQUFHLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFO29CQUNsQyxPQUFPLHVCQUF1QixDQUFBO2lCQUMvQjtnQkFDRCxPQUFPLDJCQUEyQixDQUFBO1lBQ2xDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO1NBQ3JCO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQVU7UUFDNUIsSUFBRyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNuQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUM3QjtJQUNILENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3BCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQztZQUN2RixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtvQkFDL0MsSUFBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRSxLQUFLLEVBQUU7d0JBQ3BGLFFBQVEsR0FBRyxJQUFJLENBQUE7cUJBQ2hCO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxNQUFVO1FBQzlCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFlBQVksRUFBRTtnQkFDWjtvQkFDRSxNQUFNLEVBQUUscURBQXFEO29CQUM3RCxXQUFXLEVBQUUscURBQXFEO29CQUNsRSxRQUFRLEVBQUU7d0JBQ1I7NEJBQ0UsUUFBUSxFQUFFLEVBQUU7NEJBQ1osR0FBRyxFQUFFLGtFQUFrRTt5QkFDeEU7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNELFdBQVcsRUFBRSw2QkFBNkI7WUFDMUMsT0FBTyxFQUFFO2dCQUNQO29CQUNFLE9BQU8sRUFBRSxRQUFRO29CQUNqQixRQUFRLEVBQUUsYUFBYTtvQkFDdkIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxTQUFTO29CQUNsQixRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUUsSUFBSTtpQkFDZjthQUNGO1NBQ0YsQ0FBQTtRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQzdELElBQUksRUFBRSxVQUFVO1lBQ2hCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1lBQ2QsUUFBUSxFQUFFLE1BQU07WUFDaEIsU0FBUyxFQUFFLE1BQU07WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFBO1FBQ0YsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQzdDLElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDN0I7aUJBQU07Z0JBQ0wsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzVELElBQUksZUFBZSxFQUFFO29CQUNuQixlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUNyRCxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztpQkFDMUM7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFVO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDM0IsT0FBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUcsT0FBTyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBQztZQUNuRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFBO1lBQ25DLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVELElBQUksZUFBZSxFQUFFO2dCQUNuQixlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUE7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQTtZQUM1QixJQUFHLE1BQU0sSUFBSyxNQUFNLENBQUMsUUFBUSxJQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFDO2dCQUN2RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDeEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDbkMsSUFBRyxHQUFHLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRzt3QkFDMUIsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFjLEVBQUcsRUFBRTs0QkFDN0QsSUFBRyxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxLQUFLLEVBQUU7Z0NBQ2hDLE9BQU8sU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQTs2QkFDdkQ7d0JBQ0gsQ0FBQyxDQUFDLENBQUE7d0JBQ0YsSUFBRyxNQUFNLElBQUksQ0FBQyxFQUFDOzRCQUNiLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7NEJBQ2pDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7eUJBQzFDO3FCQUNGO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsSUFBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO29CQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTt3QkFDbkQsSUFBRyxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUE7NEJBQ25DLElBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQ0FDOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQ0FDcEMsSUFBRyxHQUFHLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRTt3Q0FDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTt3Q0FDakMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTt3Q0FFekMsSUFBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUM7NENBQ2hGLElBQUksU0FBUyxHQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFxQixDQUFDOzRDQUNuRixTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTs0Q0FDdEQsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFBOzRDQUMvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0Q0FDNUQsSUFBSSxlQUFlLEVBQUU7Z0RBQ25CLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0RBQ25DLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOzZDQUMxQzt5Q0FDRjtxQ0FDRjtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs2QkFDSjt5QkFDRjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjthQUNGO1NBRUY7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVSxFQUFFLFdBQWdCLEVBQUUsVUFBYztRQUUzRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO1lBQy9CLElBQUcsYUFBYSxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFO2dCQUN0QyxJQUFHLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQ3RDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUU7d0JBQ3ZDLElBQUcsVUFBVSxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsVUFBVSxFQUFFOzRCQUNyRCxJQUFHLFVBQVUsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0NBQ3BELFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFBO2dDQUM1QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQTtnQ0FFdkQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFBO2dDQUNwQixJQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUU7b0NBQzVFLFdBQVcsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lDQUN0RjtxQ0FBTTtvQ0FDTixXQUFXLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7aUNBQ3JHO2dDQUNBLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFxQixDQUFDO2dDQUMvRSxNQUFNLHlCQUF5QixHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0NBQ3RGLElBQUkseUJBQXlCLEVBQUU7b0NBQzdCLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQ0FDbEQseUJBQXlCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztpQ0FDcEQ7NkJBQ0o7eUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFhLEVBQUUsVUFBa0I7UUFDNUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQXFCLENBQUM7UUFDL0UsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBOEIsQ0FBQTtRQUN4RyxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQTtZQUNyQyxJQUFJLE1BQU0sRUFBRTtnQkFDVixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUN0QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7b0JBQ2QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7b0JBQ3ZCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQkFDbEM7YUFDRjtTQUNGO0lBRUgsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQVcsRUFBRSxXQUFtQixFQUFFLE9BQVk7SUFJbEUsQ0FBQztJQUdELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBUyxFQUFFLEtBQVU7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtRQUU5QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUE7UUFDdkIsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLElBQUksWUFBWSxHQUFPLEVBQUUsQ0FBQTtRQUN6QixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUE7UUFDeEIsSUFBRyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2IsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUE7WUFDcEUsSUFBRyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtnQkFDcEMsSUFBSSxhQUFhLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBQyxDQUFBO2dCQUNuRCxJQUFHLGFBQWEsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQzFELE9BQU8sYUFBYSxDQUFDLFFBQVEsQ0FBQTtpQkFDOUI7Z0JBQ0QsSUFBRyxhQUFhLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO29CQUNsRSxPQUFPLGFBQWEsQ0FBQyxZQUFZLENBQUE7aUJBQ2xDO2dCQUdELEtBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ2hELGNBQWMsR0FBRyxFQUFFLENBQUE7b0JBQ25CLElBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7d0JBQzVCLFlBQVksR0FBRSxFQUFFLENBQUE7d0JBQ2hCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO3dCQUNyQyxNQUFNLElBQUksR0FBNEI7NEJBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFOzRCQUNyQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7NEJBQ2hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVzs0QkFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7NEJBQ25DLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSTs0QkFDekIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTs0QkFDeEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRTs0QkFFNUIsT0FBTyxFQUFFO2dDQUNQLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUU7NkJBQ3RGOzRCQUNELG9CQUFvQixFQUFFO2dDQUNwQixjQUFjLEVBQUUsYUFBYTtnQ0FDN0IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFOzZCQUNoQzt5QkFDRixDQUFBO3dCQUNELE1BQU0sV0FBVyxHQUFPOzRCQUN0QixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLElBQUk7NkJBQ1g7eUJBQ0YsQ0FBQTt3QkFDRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7NEJBQ3hJLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBOzRCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTs0QkFDeEQsY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBOzRCQUN6QyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBRzNDLE1BQU0sWUFBWSxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTs0QkFDOUYsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBOzRCQUUvRSxNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUMsU0FBUyxDQUFDLENBQUE7NEJBRzVELElBQUksSUFBSSxHQUFHO2dDQUNULFVBQVUsRUFBRSxLQUFLO2dDQUNqQixVQUFVLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0NBQzdCLGFBQWEsRUFBRSxTQUFTO2dDQUN4QixZQUFZLEVBQUUsS0FBSztnQ0FDbkIsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLO2dDQUMzQixZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXOzZCQUNwQyxDQUFBOzRCQUNELE1BQU0sY0FBYyxHQUFHO2dDQUNyQixHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsSUFBSSxFQUFFO2dDQUM3RCxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztnQ0FDakMsSUFBSSxFQUFFLElBQUk7Z0NBQ1YsSUFBSSxFQUFFLGNBQWM7NkJBQ3JCLENBQUE7NEJBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLGNBQWMsQ0FBQyxDQUFBO3dCQUV2RSxDQUFDLENBQUMsQ0FBQTtxQkFDSDtvQkFDRCxJQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO3dCQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUE7d0JBRWxGLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO3dCQUN4QyxJQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFOzRCQUN4QixlQUFlLEdBQUcsQ0FBQyxDQUFBOzRCQUNuQixlQUFlLEdBQUcsRUFBRSxDQUFBOzRCQUVsQixLQUFJLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRTtnQ0FDdEIsTUFBTSxJQUFJLEdBQTRCO29DQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQ0FDckMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO29DQUNkLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztvQ0FDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7b0NBQ3BDLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSTtvQ0FDekIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtvQ0FDdEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRTtvQ0FDMUIsT0FBTyxFQUFFO3dDQUNQLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUU7cUNBQ3ZGO29DQUNELG9CQUFvQixFQUFFO3dDQUNwQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7cUNBQ2hDO2lDQUNGLENBQUE7Z0NBQ0QsTUFBTSxXQUFXLEdBQU87b0NBQ3RCLE9BQU8sRUFBRTt3Q0FDUCxJQUFJLEVBQUUsSUFBSTtxQ0FDWDtpQ0FDRixDQUFBO2dDQUdELElBQUksWUFBWSxHQUFRLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUE7Z0NBRTVHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dDQUN2RSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Z0NBQzlDLGVBQWUsRUFBRSxDQUFBO2dDQUNqQixJQUFHLENBQUMsZUFBZSxLQUFLLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFDO29DQUMzRCxNQUFNLHNCQUFzQixHQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQ0FDeEcsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7b0NBRXpGLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLGVBQWUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQ0FDOUYsSUFBRyxLQUFLLEtBQUssV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0NBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO3dDQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7d0NBQ2pHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7d0NBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUE7cUNBQ2hFO2lDQUNGOzZCQUVGO3lCQUNGO3FCQUNGO2lCQUVGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFHRCxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQWdCLEVBQUUsT0FBWSxFQUFFLFdBQWdCO1FBQzlELE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUMsRUFBRTtnQkFDeEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2QsQ0FBQyxFQUFDLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1lBQzVDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFJRCxLQUFLLENBQUMsNkJBQTZCLENBQUMsWUFBbUIsRUFBRSxrQkFBd0IsRUFBRSxhQUFzQixFQUFFLGlCQUEwQjtRQUNuSSxJQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUE7WUFFM0IsSUFBSSx1QkFBdUIsR0FBRyxFQUFFLENBQUE7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQTtZQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3hELEtBQUksSUFBSSxXQUFXLElBQUksWUFBWSxFQUFFO2dCQUNuQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7YUFDckU7WUFDRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUE7WUFDckIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFBO1lBQ2YsSUFBRyxDQUFDLGtCQUFrQixFQUFFO2dCQUN0QixLQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFDO29CQUN2RCxNQUFNLE1BQU0sR0FBTyxLQUFLLENBQUE7b0JBQ3hCLE9BQU8sRUFBRSxDQUFBO29CQUNULFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO3dCQUM3RCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO29CQUM1RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO29CQUNMLFlBQVksR0FBRyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsdUJBQXVCLENBQUMsQ0FBQTtvQkFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7b0JBQ3hCLE1BQU0sV0FBVyxHQUFHO3dCQUNsQixPQUFPLEVBQUU7NEJBQ1AsSUFBSSxFQUFFO2dDQUNKLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTs2QkFDcEY7eUJBQ0Y7cUJBQ0YsQ0FBQTtvQkFDRCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFBO2lCQWtCcEU7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQTtnQkFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUU7b0JBQzdELE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7Z0JBQzVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7Z0JBQ0wsWUFBWSxHQUFHLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQyxDQUFBO2dCQUM1RCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtnQkFDeEIsTUFBTSxXQUFXLEdBQUc7b0JBQ2xCLE9BQU8sRUFBRTt3QkFDUCxJQUFJLEVBQUU7NEJBQ0osR0FBRyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO3lCQUNwRjtxQkFDRjtpQkFDRixDQUFBO2dCQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQTtnQkFNeEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTthQUlsQztTQUNGO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxZQUFtQjtRQUNuRCxJQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO1lBRXRDLEtBQUksSUFBSSxXQUFXLElBQUksWUFBWSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQTtnQkFDL0IsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO2dCQUNyQixJQUFJLElBQUksQ0FBQTtnQkFDUixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUE7Z0JBR2YsS0FBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBQztvQkFDdkQsTUFBTSxNQUFNLEdBQU8sS0FBSyxDQUFBO29CQUN4QixPQUFPLEVBQUUsQ0FBQTtvQkFDVCxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO29CQUN4SCxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRTt3QkFDN0QsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtvQkFDNUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtvQkFDUCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTt3QkFDdkIsT0FBTTtxQkFDUDt5QkFBTTt3QkFDSCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTt3QkFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7d0JBRXRCLE1BQU0sV0FBVyxHQUFHOzRCQUNsQixPQUFPLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFO29DQUNKLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtpQ0FDcEY7NkJBQ0Y7eUJBQ0YsQ0FBQTt3QkFDRCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFBO3FCQUdwRTtpQkFDRjthQUVGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQVksRUFBRSxNQUFXLEVBQUUsV0FBZ0I7UUFDeEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN2SCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtnQkFDcEgsSUFBSSxRQUFRLEdBQVMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzlFLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQTtnQkFDdkIsSUFBRyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtvQkFDNUQsY0FBYyxHQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQzFGO3FCQUFNO29CQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7aUJBQ3hDO2dCQUNELFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQSxDQUFDLENBQUEsY0FBYyxDQUFBO2dCQUMxSCxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUEsQ0FBQyxDQUFBLGNBQWMsQ0FBQTtnQkFFOUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFpQixFQUFDLEVBQUU7b0JBQy9ELElBQUksUUFBUSxHQUFTLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDMUUsSUFBRyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTt3QkFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO3FCQUM5RDtnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFHSixJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtvQkFXeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7b0JBQzFCLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQTtvQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNiLE1BQU0sV0FBVyxDQUFBO2lCQUNsQjtxQkFBTTtvQkFDTCxJQUFJLFdBQVcsR0FBUyxJQUFJLENBQUE7b0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDYixNQUFNLFdBQVcsQ0FBQTtpQkFDbEI7WUFDSCxDQUFDLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFBO2dCQUNqRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO2dCQUMvQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO1lBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE9BQVksRUFBRSxNQUFXLEVBQUUsV0FBZ0I7UUFDdEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN2SCxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtvQkFNeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFLLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO29CQUNySCxJQUFHLENBQUMsS0FBSyxFQUFFO3dCQUNULE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO3FCQUNyRztvQkFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtvQkFDMUIsSUFBSSxXQUFXLEdBQVMsSUFBSSxDQUFBO29CQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ2IsTUFBTSxXQUFXLENBQUE7aUJBQ2xCO3FCQUFNO29CQUNMLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQTtvQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNiLE1BQU0sV0FBVyxDQUFBO2lCQUNsQjtZQUNILENBQUMsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGlDQUFpQyxDQUFDLENBQUE7WUFDbkYsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUSxFQUFFLElBQVM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDekIsTUFBTSxRQUFRLEdBQUc7WUFFZixHQUFHLElBQUksQ0FBQyxLQUFLO1NBQ2QsQ0FBQTtRQUNELE1BQU0sVUFBVSxHQUFHO1lBQ2pCLFFBQVE7WUFDUixjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDbEMsQ0FBQTtRQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsVUFBZ0I7UUFDckMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3JCLElBQUksSUFBSSxDQUFBO1FBQ1IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFBO1FBRWYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNyRCxPQUFPLEVBQUUsQ0FBQTtZQUNULElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDeEgsWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUU7Z0JBRTdELE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDNUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNQLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO2dCQUN2QixPQUFNO2FBQ1A7aUJBQU07Z0JBRUwsSUFBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO29CQUNwRCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtpQkFDaEU7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7Z0JBQ3hCLE1BQU0sV0FBVyxHQUFHO29CQUNsQixPQUFPLEVBQUU7d0JBQ1AsSUFBSSxFQUFFOzRCQUNKLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFDLENBQUEsQ0FBQyxDQUFDLElBQUk7NEJBQ3pILEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTt5QkFDcEY7cUJBQ0Y7aUJBQ0YsQ0FBQTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNoSCxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTt3QkFLeEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxVQUFVLENBQUMsY0FBYyxFQUFFLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7d0JBQ2xLLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO3dCQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtxQkFDeEQ7Z0JBQ0gsQ0FBQyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksaUNBQWlDLENBQUMsQ0FBQTtvQkFDakYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtvQkFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtnQkFDakMsQ0FBQyxDQUFDLENBQUE7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUdELFdBQVcsQ0FBQyxJQUFTO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1QixDQUFDLEVBQUMsQ0FBQyxJQUFRLEVBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFNRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBVSxFQUFFLElBQVM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtRQUM5QixJQUFJLFNBQVMsR0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQztRQUNuRixJQUFJLGdCQUFnQixHQUFRLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsS0FBSyxDQUFBO1FBQzNFLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUE7UUFDckQsSUFBSSxVQUFVLEdBQVEsRUFBRSxDQUFBO1FBQ3hCLElBQUksZUFBZSxHQUFPLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUE7UUFDeEIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBR3ZCLFVBQVUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdFLGVBQWUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xGLElBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFFaEMsS0FBSSxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxHQUE0QjtvQkFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7b0JBQ3JDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7b0JBQzVCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO29CQUNuQyxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUk7b0JBQ3pCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDaEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO29CQUVwQixPQUFPLEVBQUU7d0JBQ1AsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtxQkFDdEY7b0JBQ0Qsb0JBQW9CLEVBQUU7d0JBQ3BCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTtxQkFDaEM7aUJBQ0EsQ0FBQTtnQkFDRCxNQUFNLFdBQVcsR0FBTztvQkFDdEIsT0FBTyxFQUFFO3dCQUNQLElBQUksRUFBRSxJQUFJO3FCQUNYO2lCQUNGLENBQUE7Z0JBRUQsTUFBTSxzQkFBc0IsR0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3ZHLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUd6RixJQUFJLFlBQVksR0FBUSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO2dCQUMzRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDdkUsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM5QyxlQUFlLEVBQUUsQ0FBQTtnQkFDakIsSUFBRyxlQUFlLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBQztvQkFDdkMsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFBO29CQUVwRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7b0JBQzFHLElBQUcsQ0FBQyxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTt3QkFDaEcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTt3QkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtxQkFDOUQ7aUJBQ0Y7YUFDRjtTQUNKO1FBRUQsSUFBRyxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUM1QyxJQUFJLHNCQUFzQixHQUFHLEVBQUUsQ0FBQTtZQUMvQixLQUFJLElBQUksV0FBVyxJQUFJLGVBQWUsRUFBRTtnQkFDdEMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUM5QztZQUVDLElBQUksZUFBZSxHQUFFO2dCQUNuQixTQUFTLEVBQUU7b0JBQ1QsWUFBWSxFQUFFLHNCQUFzQjtpQkFDckM7YUFDRixDQUFBO1lBRUQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFHNUksTUFBTSxzQkFBc0IsR0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3ZHLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUl6RixNQUFNLHVCQUF1QixHQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFLLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0ksTUFBTSwwQkFBMEIsR0FBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRXBKLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyx1QkFBdUIsQ0FBQTtnQkFDL0MsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLDBCQUEwQixDQUFBO2dCQUd0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBRTFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtnQkFDNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2hJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7WUFFL0QsQ0FBQyxDQUFDLENBQUE7U0FDTDtRQUVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7SUFDakMsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFXO1FBQ3hCLE1BQU0sc0JBQXNCLEdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZHLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ2YsSUFBRyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBQztZQUM5RCxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3RILE9BQVEsR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFBO2lCQUNqQztnQkFDRCxPQUFPLEtBQUssQ0FBQTtZQUNkLENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFFRCxJQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDWixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBcUIsQ0FBQztZQUMvRSxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDbEQsSUFBRyxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFO29CQUMzRCxPQUFRLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUE7aUJBQ3ZEO2dCQUNELE9BQU8sS0FBSyxDQUFBO1lBQ2QsQ0FBQyxDQUFDLENBQUM7U0FDSDtRQUlGLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDbEMsQ0FBQztJQUdELGVBQWUsQ0FBQyxJQUFTLEVBQUUsTUFBVyxFQUFDLGlCQUFzQixFQUFFLFVBQWU7UUFDNUUsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNoRCxJQUFHLFVBQVUsS0FBSyxRQUFRLEVBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7b0JBQ3JDLElBQUcsT0FBTyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFO3dCQVEzQyxNQUFNLGVBQWUsR0FBUSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFLLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDeEksTUFBTSxZQUFZLEdBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBSyxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ2xJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxlQUFlLENBQUE7d0JBQ3pDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxZQUFZLENBQUE7cUJBQ25DO29CQUNELElBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRTt3QkFDbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLGlCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFBO3FCQUNuRTtnQkFDSCxDQUFDLENBQUMsQ0FBQTthQUNIO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7b0JBQ3JDLElBQUcsT0FBTyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFO3dCQUMzQyxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUE7d0JBQ3ZCLElBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7NEJBQ3pELGNBQWMsR0FBSSxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7eUJBQ3BGOzZCQUFNOzRCQUNMLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQTt5QkFDbkM7d0JBRUQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxjQUFjLENBQUE7d0JBQ3RILE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQSxDQUFDLENBQUEsY0FBYyxDQUFBO3FCQUMzRztvQkFDRCxJQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO3FCQUN6RDtnQkFDSCxDQUFDLENBQUMsQ0FBQTthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUE7UUFDdkMsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ25DLElBQUksZUFBZSxHQUFFO1lBQ25CLFNBQVMsRUFBRTtnQkFDVCxZQUFZLEVBQUUsZUFBZTthQUM5QjtTQUNGLENBQUE7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUUxSSxJQUFJLGVBQWUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sc0JBQXNCLEdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMvRixJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUV6RixNQUFNLHVCQUF1QixHQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFLLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3SSxNQUFNLDBCQUEwQixHQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFLLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVwSixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsdUJBQXVCLENBQUE7WUFDL0MsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLDBCQUEwQixDQUFBO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDbEcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDL0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFBO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDL0QsQ0FBQyxFQUFDLENBQUMsQ0FBQyxJQUFTLEVBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUE7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUN4RCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUtELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFxQixDQUFDO0lBQ3hFLENBQUM7K0dBcDhCVSxnQ0FBZ0Msb0RBa0NqQyxlQUFlO21HQWxDZCxnQ0FBZ0Msc0VDcEI3QywrMWlCQW1PVzs7NEZEL01FLGdDQUFnQztrQkFMNUMsU0FBUzsrQkFDRSxnQ0FBZ0M7OzBCQXNDdkMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSwgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZywgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJztcbmltcG9ydCB7IGxhYmVscyB9IGZyb20gJy4uLy4uL2xhYmVscy9zdHJpbmdzJztcbmltcG9ydCB7IEZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcmFtZXdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBOU0ZyYW1ld29yayB9IGZyb20gJy4uLy4uL21vZGVscy9mcmFtZXdvcmsubW9kZWwnO1xuaW1wb3J0ICogYXMgYXBwQ29uc3RhbnRzIGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uLy4uL21vZGVscy92YXJpYWJsZS10eXBlLm1vZGVsJztcbi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG4vLyBpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvbmZvcmFtdGlvblBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZm9yYW10aW9uLXBvcHVwL2NvbmZvcmFtdGlvbi1wb3B1cC5jb21wb25lbnQnO1xuLyogdHNsaW50OmVuYWJsZSAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBhcHBfc3RyaW5ncyA9IGxhYmVscztcbiAgZW52aXJvbm1lbnQ6IGFueVxuXG4gIHNlbGVjdGVkVGVybTogQ2FyZCA9IHt9O1xuICBzZWxlY3RlZFRlcm1BcnJheSA6IGFueSA9IFtdXG4gIGtjbUNvbmZpZ0RhdGE6IGFueVxuICBzZWxlY3RlZFRoZW1lRGF0YTogYW55XG5cblxuICBpc1Rlcm1FeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVNdWx0aUNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG5cblxuICBjb21wZXRlbmN5Rm9ybSE6IFVudHlwZWRGb3JtR3JvdXBcblxuXG4gIGtjbUxpc3QgOiBhbnk9IG5ldyBNYXA8c3RyaW5nLCBOU0ZyYW1ld29yay5JQ29sdW1uVmlldz4oKTtcbiAgLy8gY2F0ZWdvcmllc0hhc2g6IGFueVxuICBjb21wZXRlbmN5QXJlYTogYW55XG4gIHNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGE6IGFueVxuXG4gIGFsbENvbXBldGVuY3k6YW55W109W11cbiAgc2VsZXRlZENvbXBldGVuY3lBcmVhOiBhbnlcbiAgYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGFsbENvbXBldGVuY3lTdWJ0aGVtZTphbnlbXT1bXVxuICBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZTphbnlbXT1bXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDcmVhdGVUZXJtRnJvbUZyYW1ld29ya0NvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgZnJhbWVXb3JrU2VydmljZTogRnJhbWV3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0RW52aXJvbWVudCgpXG4gICAgdGhpcy5nZXRDb21wdGVuY3lEYXRhKClcbiAgICB0aGlzLmtjbUNvbmZpZ0RhdGEgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0Q29uZmlnQnlGcmFtZVdvcmtJZCh0aGlzLmVudmlyb25tZW50LmtjbUZyYW1ld29ya05hbWUpXG4gICAgdGhpcy5jb21wZXRlbmN5Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29tcEFyZWE6WycnLFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY29tcFRoZW1lRmllbGRzOiB0aGlzLmZiLmFycmF5KFt0aGlzLmNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpXSlcbiAgICB9KVxuXG4gIH1cblxuICBnZXRDb21wdGVuY3lEYXRhKCl7XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldEZyYW1ld29ya1JlYWQodGhpcy5lbnZpcm9ubWVudC5rY21GcmFtZXdvcmtOYW1lKS5zdWJzY3JpYmUoKGRhdGEpPT57XG4gICAgIGlmKGRhdGEuY2F0ZWdvcmllcykge1xuICAgICAgdGhpcy5mb3JtYXRlRGF0YShkYXRhLCB0aGlzLmVudmlyb25tZW50LmtjbUZyYW1ld29ya05hbWUpXG4gICAgICB0aGlzLnNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGEgPSAgJydcbiAgICAgIC8vIHRvIGRvOiBjaGFuZ2UgZ2V0dGluZyBzZWxlY3RlZFBhcmVudFRlcm1zIHRvIGR5bmFtaWNcbiAgICAgIGlmKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuc2VsZWN0ZWRQYXJlbnRUZXJtcykge1xuICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRQYXJlbnRUZXJtcy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmKGVsZS5jYXRlZ29yeSA9PT0gXCJjb21wZXRlbmN5XCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YSA9IGVsZVxuICAgICAgICAgICAgbGV0IG9wdGlvbiA9IHRoaXMuc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YS5hZGRpdGlvbmFsUHJvcGVydGllcy5jb21wZXRlbmN5QXJlYVxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkFyZWEob3B0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgfVxuICAgIH0sKChfZXJyOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYEtDTSBGcmFtZXdvcmsgcmVhZCBmYWlsZWQuYClcbiAgICB9KSlcbiAgfVxuXG4gIGZvcm1hdGVEYXRhKHJlc3BvbnNlOiBhbnksIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcbiAgICAocmVzcG9uc2UuY2F0ZWdvcmllcykuZm9yRWFjaCgoYTphbnkpID0+IHtcbiAgICAgIGlmKGEuY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMua2NtTGlzdC5zZXQoYS5jb2RlLCB7XG4gICAgICAgICAgY29kZTogYS5jb2RlLFxuICAgICAgICAgIGlkZW50aWZpZXI6IGEuaWRlbnRpZmllcixcbiAgICAgICAgICBpbmRleDogYS5pbmRleCxcbiAgICAgICAgICBuYW1lOiBhLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGEuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29uZmlnOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0Q29uZmlnT2ZDYXRlZ29yeUNvbmZpZ0J5RnJhbWVXb3JrSWQoYS5jb2RlLCBmcmFtZXdvcmtJZCksXG4gICAgICAgICAgLy8gY2hpbGRyZW46IChbLi4uYS50ZXJtcywgLi4ubG9jYWxEYXRhXSB8fCBbXSkubWFwKGMgPT4ge1xuICAgICAgICAgIGNoaWxkcmVuOiAoYS50ZXJtcyB8fCBbXSkubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRpb25zID0gYy5hc3NvY2lhdGlvbnMgfHwgW11cbiAgICAgICAgICAgIGlmIChhc3NvY2lhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGMsIHsgY2hpbGRyZW46IGFzc29jaWF0aW9ucyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMua2NtTGlzdC5mb3JFYWNoKChhOiBhbnkpID0+IHtcbiAgICAgIGlmKGEuY29kZSA9PT0gXy5nZXQodGhpcy5rY21Db25maWdEYXRhLCAnY29uZmlnWzBdLmNhdGVnb3J5Jykpe1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lBcmVhID0gYVxuICAgICAgfVxuICAgIH0pXG4gICAgXG5cbiAgfVxuXG5cbiAgY3JlYXRlQ29tcFRoZW1lRmllbGRzKCk6VW50eXBlZEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29tcGV0ZW5jeVRoZW1lOlsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGNvbXBldGVuY3lTdWJUaGVtZTpbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KVxuICB9XG5cblxuICBnZXRDcmVhdGVOYW1lKGRhdGE6IGFueSkge1xuICAgICAgbGV0IHBvcFVwQ2F0ZWdvcnkgPSBkYXRhLmNhcmRDb2xJbmZvID8gZGF0YS5jYXJkQ29sSW5mby5uYW1lIDogZGF0YS5jb2x1bW5JbmZvLm5hbWVcbiAgICAgIHN3aXRjaChwb3BVcENhdGVnb3J5KXtcbiAgICAgICAgY2FzZSAnRGVzaWduYXRpb24nOlxuICAgICAgICByZXR1cm4gYENyZWF0ZSBDb21wZXRlbmN5IE1hcHBpbmdgO1xuICAgICAgICBjYXNlICdTdWIgVGhlbWUnOlxuICAgICAgICAgIGlmKGRhdGEub3Blbk1vZGUgPT09ICd2aWV3Jykge1xuICAgICAgICAgICAgcmV0dXJuIGBWaWV3IENvbXBldGVuY3kgJHtwb3BVcENhdGVnb3J5fWBcbiAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBgQWRkIENvbXBldGVuY3kgJHtwb3BVcENhdGVnb3J5fWBcbiAgICAgICAgY2FzZSAnQ29tcGV0ZW5jeSc6XG4gICAgICAgICAgaWYoZGF0YS5vcGVuTW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gYEVkaXQgQ29tcGV0ZW5jeSBUaGVtZWBcbiAgICAgICAgICB9IGVsc2UgaWYoZGF0YS5vcGVuTW9kZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZpZXcgQ29tcGV0ZW5jeSBUaGVtZWBcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGBDcmVhdGUgQ29tcGV0ZW5jeSBNYXBwaW5nYFxuICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnJ1xuICAgICAgfVxuICB9XG5cbiAgY2xlYXJTZWxlY3RlZFRoZW1lcyhvcHRpb246YW55KXtcbiAgICBpZih0aGlzLmlzVGhlbWVTZWxlY3RlZCkge1xuICAgICAgdGhpcy5vcGVuQ29uZm9yYW10aW9uUG9wdXAob3B0aW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uU2VsZWN0aW9uQXJlYShvcHRpb24pXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzVGhlbWVTZWxlY3RlZCAoKSB7XG4gICAgbGV0IGhhc1ZhbHVlID0gZmFsc2VcbiAgICBpZiAodGhpcy5jb21wZXRlbmN5Rm9ybSkge1xuICAgICAgY29uc3QgY29tcFRoZW1lRmllbGRzID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBpZiAoY29tcFRoZW1lRmllbGRzKSB7XG4gICAgICAgIGNvbXBUaGVtZUZpZWxkcy5jb250cm9scy5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICAgIGlmKGVsZW1lbnQuZ2V0KCdjb21wZXRlbmN5VGhlbWUnKT8udmFsdWUgfHwgZWxlbWVudC5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpPy52YWx1ZSkge1xuICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc1ZhbHVlXG4gIH1cblxuICBvcGVuQ29uZm9yYW10aW9uUG9wdXAob3B0aW9uOmFueSkge1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSB7XG4gICAgICBkaWFsb2dUeXBlOiAnd2FybmluZycsXG4gICAgICBkZXNjcmlwdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBhbHRlciB0aGUgY29tcGV0ZW5jeSBhcmVhPycsXG4gICAgICAgICAgaGVhZGVyQ2xhc3M6ICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJsdWUgdGV4dEJvbGQnLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1zZ0NsYXNzOiAnJyxcbiAgICAgICAgICAgICAgbXNnOiBgVGhpcyBhY3Rpb24gd2lsbCByZXN1bHQgaW4gdGhlIGxvc3Mgb2YgeW91ciBjdXJyZW50bHkgYWRkZWQgZGF0YWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZm9vdGVyQ2xhc3M6ICdpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXInLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYnRuVGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgYnRuQ2xhc3M6ICdidG4tb3V0bGluZScsXG4gICAgICAgICAgcmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYnRuVGV4dDogJ0NvbmZpcm0nLFxuICAgICAgICAgIGJ0bkNsYXNzOiAnYnRuLWZ1bGwtc3VjY2VzcycsXG4gICAgICAgICAgcmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZvcmFtdGlvblBvcHVwQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgbWF4V2lkdGg6ICc4MHZ3JyxcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQXJlYShvcHRpb24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb21wQXJlYUNvbnRyb2wgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcEFyZWEnKTtcbiAgICAgICAgaWYgKGNvbXBBcmVhQ29udHJvbCkge1xuICAgICAgICAgIGNvbXBBcmVhQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYSk7XG4gICAgICAgICAgY29tcEFyZWFDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvblNlbGVjdGlvbkFyZWEob3B0aW9uOmFueSl7XG4gICAgdGhpcy5jb21wZXRlbmN5Rm9ybS5yZXNldCgpXG4gICAgd2hpbGUodGhpcy5jb21wVGhlbWVGaWVsZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgdGhpcy5jb21wVGhlbWVGaWVsZHMucHVzaCh0aGlzLmNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpKTtcbiAgICBpZigndGhlbWUnID09PSB0aGlzLmtjbUNvbmZpZ0RhdGEuY29uZmlnWzFdLmNhdGVnb3J5KXtcbiAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gb3B0aW9uXG4gICAgICBjb25zdCBjb21wQXJlYUNvbnRyb2wgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcEFyZWEnKTtcbiAgICAgIGlmIChjb21wQXJlYUNvbnRyb2wpIHtcbiAgICAgICAgY29tcEFyZWFDb250cm9sLnBhdGNoVmFsdWUob3B0aW9uKTtcbiAgICAgICAgY29tcEFyZWFDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUgPSBbXVxuICAgICAgdGhpcy5hbGxDb21wZXRlbmN5VGhlbWUgPSBbXVxuICAgICAgaWYob3B0aW9uICYmICBvcHRpb24uY2hpbGRyZW4gJiYgIG9wdGlvbi5jaGlsZHJlbi5sZW5ndGgpe1xuICAgICAgICBsZXQgdGhlbWVWYWx1ZSA9IHRoaXMua2NtTGlzdC5nZXQodGhpcy5rY21Db25maWdEYXRhLmNvbmZpZ1sxXS5jYXRlZ29yeSlcbiAgICAgICAgb3B0aW9uLmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYoZWxlLmNhdGVnb3J5ID09PSAndGhlbWUnICkge1xuICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhlbWVWYWx1ZS5jaGlsZHJlbi5maW5kSW5kZXgoKHRoZW1lRGF0YSA6YW55ICkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKGVsZS5yZWZJZCA9PT0gdGhlbWVEYXRhLnJlZklkKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVEYXRhLmNoaWxkcmVuICYmIHRoZW1lRGF0YS5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGlmKHJlc3VsdCA+PSAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFsbENvbXBldGVuY3lUaGVtZS5wdXNoKGVsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYodGhpcy5jb21wZXRlbmN5QXJlYSAmJiB0aGlzLmNvbXBldGVuY3lBcmVhLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jb21wZXRlbmN5QXJlYS5jaGlsZHJlbi5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICAgICAgaWYoZWxlbWVudC5jb2RlID09PSBvcHRpb24uY29kZSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYSA9IG9wdGlvblxuICAgICAgICAgICAgICBpZihlbGVtZW50LmNoaWxkcmVuICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYoZWxlLmNhdGVnb3J5ID09PSAndGhlbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICAgICAgICAvLyB0byBkbzogIHRvIGJlIGNoZWNrIGJhc2VkIG9uIHJlZmYgaWRcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhLnJlZklkLnRvTG93ZXJDYXNlKCkgPT09IGVsZS5yZWZJZC50b0xvd2VyQ2FzZSgpKXtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybUFycmF5OmFueSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheS5hdCgwKS5nZXQoJ2NvbXBldGVuY3lUaGVtZScpLnBhdGNoVmFsdWUoZWxlKVxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheS5hdCgwKS5nZXQoJ2NvbXBldGVuY3lUaGVtZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBBcmVhQ29udHJvbCA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wQXJlYScpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wQXJlYUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBBcmVhQ29udHJvbC5wYXRjaFZhbHVlKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wQXJlYUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgIH1cbiAgfVxuXG4gIGFkZENvbXBldGVuY3lUaGVtZSgpe1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLmluc2VydCgwLCB0aGlzLmNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDb21wRmllbGRzKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSB7XG4gICAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgT25UaGVtZVNlbGVjdGlvbihldmVudDogYW55LCBfaW5kZXhWYWx1ZTogYW55LCBvcHRpb25EYXRhOmFueSkge1xuICAgIC8vIGlmIChldmVudC5pc1VzZXJJbnB1dCB8fCB0aGlzLmRhdGEub3Blbk1vZGUgPT09ICd2aWV3JykgeyAgIFxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWUgPSBldmVudC5zb3VyY2UudmFsdWVcbiAgICB0aGlzLmtjbUxpc3QuZm9yRWFjaCgoZWxlOmFueSkgPT4ge1xuICAgICAgaWYoc2VsZWN0ZWRUaGVtZS5jYXRlZ29yeSA9PT0gZWxlLmNvZGUpIHtcbiAgICAgICAgaWYoZWxlLmNoaWxkcmVuICYmIGVsZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBlbGUuY2hpbGRyZW4uZm9yRWFjaCgodGhlbWVDaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZih0aGVtZUNoaWxkLmlkZW50aWZpZXIgPT09IHNlbGVjdGVkVGhlbWUuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICBpZih0aGVtZUNoaWxkLmNoaWxkcmVuICYmIHRoZW1lQ2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uRGF0YVsnY2hpbGRyZW4nXSA9IHRoZW1lQ2hpbGQuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lID0gdGhlbWVDaGlsZC5jaGlsZHJlbiBcbiAgICAgICAgICAgICAgICAgLy8gdG8gZG86ICB0byBiZSBjaGVjayBiYXNlZCBvbiByZWZmIGlkXG4gICAgICAgICAgICAgICAgIGxldCBtYXRjaGVkRGF0YSA9IFtdXG4gICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jaGlsZHJlbkRhdGEgJiYgdGhpcy5kYXRhLmNoaWxkcmVuRGF0YS5jYXRlZ29yeSA9PT0gXCJzdWJ0aGVtZVwiKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRGF0YSA9IF8uaW50ZXJzZWN0aW9uQnkodGhlbWVDaGlsZC5jaGlsZHJlbixbdGhpcy5kYXRhLmNoaWxkcmVuRGF0YV0sICdyZWZJZCcpO1xuICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hlZERhdGEgPSBfLmludGVyc2VjdGlvbkJ5KHRoZW1lQ2hpbGQuY2hpbGRyZW4sdGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhLmNoaWxkcmVuLCAncmVmSWQnKTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGV0ZW5jeVN1YlRoZW1lQ29udHJvbCA9IGZvcm1BcnJheS5hdChfaW5kZXhWYWx1ZSkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb21wZXRlbmN5U3ViVGhlbWVDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBldGVuY3lTdWJUaGVtZUNvbnRyb2wucGF0Y2hWYWx1ZShtYXRjaGVkRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBldGVuY3lTdWJUaGVtZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgLy8gfVxuICB9XG5cbiAgb25UZXJtUmVtb3ZlKHRlcm1EYXRhOiBhbnksIGluZGV4VmFsdWU6IG51bWJlcikge1xuICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICBjb25zdCBjb21wVGhlbWVDb250cm9sID0gZm9ybUFycmF5LmF0KGluZGV4VmFsdWUpLmdldCgnY29tcGV0ZW5jeVN1YlRoZW1lJykgYXMgVW50eXBlZEZvcm1Db250cm9sIHwgbnVsbFxuICAgIGlmIChjb21wVGhlbWVDb250cm9sKSB7XG4gICAgICBjb25zdCB0aGVtZXMgPSBjb21wVGhlbWVDb250cm9sLnZhbHVlXG4gICAgICBpZiAodGhlbWVzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhlbWVzLmluZGV4T2YodGVybURhdGEpXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhlbWVzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgICBjb21wVGhlbWVDb250cm9sLnNldFZhbHVlKHRoZW1lcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIE9uU3ViVGhlbWVTZWxlY3Rpb24oX2V2ZW50OiBhbnksIF9pbmRleFZhbHVlOiBudW1iZXIsIF9vcHRpb246IGFueSl7XG4gICAgLy8gbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIC8vIGNvbnN0IGNvbXBUaGVtZUNvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXhWYWx1ZSkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wgfCBudWxsXG4gICAgXG4gIH1cblxuICAvLyBhZGQgZm9ybVxuICBhc3luYyBtdWx0aUNyZWF0ZShmb3JtOiBhbnksIF9kYXRhOiBhbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICAvLyBsZXQgY291bnRlclRoZW1lID0gMFxuICAgIGxldCBjb3VudGVyU3ViVGhlbWUgPSAwXG4gICAgbGV0IHBhcmVudENhdGVnb3J5ID0ge31cbiAgICBsZXQgY3JlYXRlZFRlcm1zOmFueSA9IFtdXG4gICAgbGV0IGNyZWF0ZWRTdWJUaGVtZSA9IFtdXG4gICAgaWYoZm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgdGhlbWVGaWVsZHMgPSBmb3JtICYmIGZvcm0udmFsdWUgJiYgZm9ybS52YWx1ZS5jb21wVGhlbWVGaWVsZHNcbiAgICAgIGlmKHRoZW1lRmllbGRzICYmIHRoZW1lRmllbGRzLmxlbmd0aCkge1xuICAgICAgICBsZXQgbG9jYWxDb21wQXJlYSA9IHsuLi50aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYX1cbiAgICAgICAgaWYobG9jYWxDb21wQXJlYS5jaGlsZHJlbiAmJiBsb2NhbENvbXBBcmVhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIGRlbGV0ZSBsb2NhbENvbXBBcmVhLmNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgICAgaWYobG9jYWxDb21wQXJlYS5hc3NvY2lhdGlvbnMgJiYgbG9jYWxDb21wQXJlYS5hc3NvY2lhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgZGVsZXRlIGxvY2FsQ29tcEFyZWEuYXNzb2NpYXRpb25zXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGVtZUZpZWxkcy5mb3JFYWNoKGFzeW5jIChvYmpWYWwsIHRoZW1lSW5kZXgpID0+XG4gICAgICAgIGZvcihsZXQgW2luZGV4LCBvYmpWYWxdIG9mIHRoZW1lRmllbGRzLmVudHJpZXMoKSkge1xuICAgICAgICAgIHBhcmVudENhdGVnb3J5ID0ge31cbiAgICAgICAgICBpZihvYmpWYWxbJ2NvbXBldGVuY3lUaGVtZSddKSB7XG4gICAgICAgICAgICBjcmVhdGVkVGVybXM9IFtdXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpWYWxbJ2NvbXBldGVuY3lUaGVtZSddXG4gICAgICAgICAgICBjb25zdCB0ZXJtOiBOU0ZyYW1ld29yay5JQ3JlYXRlVGVybSA9IHtcbiAgICAgICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICAgICAgcmVmSWQ6IHZhbHVlLnJlZklkIHx8ICcnLFxuICAgICAgICAgICAgICByZWZUeXBlOiB2YWx1ZS5yZWZUeXBlIHx8ICcnLFxuICAgICAgICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgY29tcGV0ZW5jeUFyZWE6IGxvY2FsQ29tcEFyZWEsXG4gICAgICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWVXb3JrU2VydmljZS5jcmVhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcmVxdWVzdEJvZHkpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVsnaWRlbnRpZmllciddID0gcmVzLnJlc3VsdC5ub2RlX2lkWzBdXG4gICAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZSgnY29tcGV0ZW5jeScpXG4gICAgICAgICAgICAgIHBhcmVudENhdGVnb3J5ID0gcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtXG4gICAgICAgICAgICAgIGNyZWF0ZWRUZXJtcy5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICAgICAgLy8gY291bnRlclRoZW1lKytcblxuICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW46IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgICAgICAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW4uY29kZSlcbiAgXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zLHBhcmVudENvbClcbiAgICAgICAgICAgICAgLy8gLy8gYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zKVxuXG4gICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJzZWxlY3RlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBwYXJlbnRDb2x1bW4uY29kZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjYXJkU3ViVHlwZVwiOiBcIm1pbmltYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJpc1ZpZXdPbmx5XCI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBcImluZGV4XCI6IHBhcmVudENvbHVtbi5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb2x1bW5JbmZvXCI6IHRoaXMuZGF0YS5jYXJkQ29sSW5mb1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhMTIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlczogeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmRhdGEuY29sdW1uSW5mby5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ211bHRpLWNyZWF0ZSdcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVBZnRlckFkZE9yRWRpdFN1YmplY3QocmVzcG9uc2VEYXRhMTIpXG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKG9ialZhbFsnY29tcGV0ZW5jeVN1YlRoZW1lJ10pIHtcbiAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCBwYXJlbnRDYXRlZ29yeSlcblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqVmFsWydjb21wZXRlbmN5U3ViVGhlbWUnXVxuICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvdW50ZXJTdWJUaGVtZSA9IDBcbiAgICAgICAgICAgICAgY3JlYXRlZFN1YlRoZW1lID0gW11cbiAgICAgICAgICAgICAgLy8gdmFsdWUuZm9yRWFjaChhc3luYyAoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGVsZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGVsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGVsZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEubmV4dENvbEluZm8uY29kZSxcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgICAgICAgICAgICByZWZJZDogZWxlLnJlZklkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgcmVmVHlwZTogZWxlLnJlZlR5cGUgfHwgJycsXG4gICAgICAgICAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLm5leHRDb2xJbmZvLmNvZGV9YCB9XG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogYW55ID0gYXdhaXQgdGhpcy5jcmF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEubmV4dENvbEluZm8uY29kZSwgcmVxdWVzdEJvZHkpXG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlc3BvbnNlRGF0YS5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICAgICAgICAgIGNyZWF0ZWRTdWJUaGVtZS5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICAgICAgICBjb3VudGVyU3ViVGhlbWUrK1xuICAgICAgICAgICAgICAgIGlmKChjb3VudGVyU3ViVGhlbWUgPT09IG9ialZhbFsnY29tcGV0ZW5jeVN1YlRoZW1lJ10ubGVuZ3RoKSl7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW5Db25maWdEYXRhOmFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5uZXh0Q29sSW5mby5jb2RlKVxuICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGlWMihjcmVhdGVkU3ViVGhlbWUscGFyZW50Q29sLCBpbmRleCwgdGhlbWVGaWVsZHMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPT09IHRoZW1lRmllbGRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKCdjb21wZXRlbmN5JylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksIGNyZWF0ZWQ6IHRydWUsIG11bHRpOmZhbHNlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgTWFwcGluZyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgYXN5bmMgY3JhdGVUZXJtKGZyYW1ld29ya0lkOiBhbnksIGNvbENvZGU6IGFueSwgcmVxdWVzdEJvZHk6IGFueSl7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKT0+e1xuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0oZnJhbWV3b3JrSWQsIGNvbENvZGUsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoKHJlczogYW55KT0+e1xuICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgIH0sKChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ3JlYXRlIFRlcm0gZmFpbGVkLmApXG4gICAgICB9KSlcbiAgICB9KVxuICB9XG5cblxuXG4gIGFzeW5jIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRUZXJtczogYW55W10sIHBhcmVudFNlbGVjdGVkVGVybT86IGFueSwgX3J1bm5pbmdJbmRleD86IG51bWJlciwgX3RoZW1GaWVsZHNMZW5ndGg/OiBudW1iZXIpIHtcbiAgICBpZihjcmVhdGVkVGVybXMgJiYgY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSA9IFtdXG4gICAgICAvLyBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICAgIGxldCBjcmVhdGVkVGVybXNJZGVudGlmaWVycyA9IFtdXG4gICAgICB0aGlzLnNlbGVjdGVkVGVybUFycmF5ID0gY3JlYXRlZFRlcm1zXG4gICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtc1tjcmVhdGVkVGVybXMubGVuZ3RoIC0xXVxuICAgICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgICAgY3JlYXRlZFRlcm1zSWRlbnRpZmllcnMucHVzaCh7IGlkZW50aWZpZXI6IGNyZWF0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgIH1cbiAgICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgICBpZighcGFyZW50U2VsZWN0ZWRUZXJtKSB7XG4gICAgICAgIGZvcihjb25zdCBbdmFsdWVdIG9mIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0KXtcbiAgICAgICAgICBjb25zdCBwYXJlbnQ6YW55ID0gdmFsdWVcbiAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICAgIGFzc29jaWF0aW9ucyA9IFsuLi5hc3NvY2lhdGlvbnMsIC4uLmNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzXVxuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAvLyBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgICAgICAvLyBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgICAvLyBpZihydW5uaW5nSW5kZXggPT09IHRoZW1GaWVsZHNMZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUoJ2NvbXBldGVuY3knKVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAnc3VidGhlbWUnKXsgICAgICAgICBcblxuICAgICAgICAgICAgLy8gICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFNlbGVjdGVkVGVybVxuICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgfSkgOiBbXVxuICAgICAgICAgIGFzc29jaWF0aW9ucyA9IFsuLi5hc3NvY2lhdGlvbnMsIC4uLmNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzXVxuICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9uc1YyKGNvdW50ZXIsIHBhcmVudCwgcmVndWVzdEJvZHkpXG5cbiAgICAgICAgICAvLyBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBzdG9wVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAvLyBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpeyAgIFxuICAgICAgICAgIC8vICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpKGNyZWF0ZWRUZXJtczogYW55W10pIHtcbiAgICBpZihjcmVhdGVkVGVybXMgJiYgY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgLy8gbGV0IGNyZWF0ZWRUZXJtc0NvdW50ZXIgPSAwXG4gICAgICBmb3IobGV0IGNyZWF0ZWRUZXJtIG9mIGNyZWF0ZWRUZXJtcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtXG4gICAgICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgICAgICBsZXQgdGVtcFxuICAgICAgICBsZXQgY291bnRlciA9IDBcbiAgICAgICAgLy8gbGV0IGxvY2FsSXNFeGlzdCA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICBmb3IoY29uc3QgW3ZhbHVlXSBvZiB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdCl7XG4gICAgICAgICAgY29uc3QgcGFyZW50OmFueSA9IHZhbHVlXG4gICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgdGVtcCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOmFueSkgPT4gY2hpbGQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBudWxsXG4gICAgICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IChjcmVhdGVkVGVybXMubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnMoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBjYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlcjogYW55LCBwYXJlbnQ6IGFueSwgcmVndWVzdEJvZHk6IGFueSApOiBQcm9taXNlPGFueT57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBwYXJlbnQuY2F0ZWdvcnksIHBhcmVudC5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiA/Wy4uLnBhcmVudC5jaGlsZHJlbiwgLi4udGhpcy5zZWxlY3RlZFRlcm1BcnJheV06dGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgIGxldCBsaXN0RGF0YSA6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgIGxldCBkaWZmZXJlbmNlRGF0YSA9IFtdXG4gICAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSAgPSBfLmRpZmZlcmVuY2VCeSh0aGlzLnNlbGVjdGVkVGVybUFycmF5LGxpc3REYXRhLmNoaWxkcmVuLCAnaWRlbnRpZmllcicpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlzdERhdGFbJ2Fzc29jaWF0aW9ucyddID0gbGlzdERhdGEgJiYgbGlzdERhdGEuYXNzb2NpYXRpb25zID9bLi4ubGlzdERhdGEuYXNzb2NpYXRpb25zLCAuLi5kaWZmZXJlbmNlRGF0YV06ZGlmZmVyZW5jZURhdGFcbiAgICAgICAgICBsaXN0RGF0YVsnY2hpbGRyZW4nXSA9IGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuID9bLi4ubGlzdERhdGEuY2hpbGRyZW4sIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgoc2VsZWN0ZWREYXRhOiBhbnkpPT4ge1xuICAgICAgICAgICAgbGV0IGxpc3REYXRhIDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmxpc3QuZ2V0KHNlbGVjdGVkRGF0YS5jYXRlZ29yeSlcbiAgICAgICAgICAgIGlmKGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuICYmIGxpc3REYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsTGlzdChsaXN0RGF0YSxwYXJlbnQsIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgXG4gICAgICAgIC8vIGxldCBzZWxlY3RlZENhcmRJbmZvID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHRoaXMuZGF0YS5jYXJkQ29sSW5mby5jb2RlKVxuICAgICAgICAvLyB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogc2VsZWN0ZWRDYXJkSW5mby5jb2RlLCBkYXRhOnNlbGVjdGVkQ2FyZEluZm8sIGNhcmRSZWY6c2VsZWN0ZWRDYXJkSW5mby5jYXJkUmVmLCBpc1VwZGF0ZTogdHJ1ZX0pXG4gICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgIC8vIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIGNvbnN0IGZvdW5kID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbmQoYz0+IGMuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICAgIC8vIGlmKCFmb3VuZCkge1xuXG4gICAgICAgICAgICAvLyBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi50aGlzLnNlbGVjdGVkVGVybUFycmF5XTp0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICAvLyBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzLnNlbGVjdGVkVGVybSkgOiBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBbdGhpcy5zZWxlY3RlZFRlcm1dXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgbGV0IHJldHVyblZhbHVlIDogYW55ID0gdHJ1ZVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICBhd2FpdCByZXR1cm5WYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA6IGFueSA9IHRydWVcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgYXdhaXQgcmV0dXJuVmFsdWVcbiAgICAgICAgfVxuICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgVGVybSBBc3NvY2lhdGlvbiBmYWlsZWQuYClcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyOiBhbnksIHBhcmVudDogYW55LCByZWd1ZXN0Qm9keTogYW55ICk6IFByb21pc2U8YW55PntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoY291bnRlciA9PT0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2l6ZSkge1xuICAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRUZXJtWydhc3NvY2lhdGlvblByb3BlcnRpZXMnXVsnYXBwcm92YWxTdGF0dXMnXSA9ICdEcmFmdCc7XG4gIFxuICAgICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgICAvLyBjb25zdCB2YWx1ZSA9ICh0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA/IHRoaXMuc2VsZWN0ZWRUZXJtIDoge31cbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maW5kKChjOmFueSk9PiBjLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogZmFsc2VcbiAgICAgICAgICBpZighZm91bmQpIHtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMuc2VsZWN0ZWRUZXJtKSA6IHBhcmVudFsnY2hpbGRyZW4nXSA9IFt0aGlzLnNlbGVjdGVkVGVybV1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgOiBhbnkgPSB0cnVlXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHJldHVyblZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHVyblZhbHVlIDogYW55ID0gdHJ1ZVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICBhd2FpdCByZXR1cm5WYWx1ZVxuICAgICAgICB9XG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlVGVybURhdGEoZm9ybTphbnksIGRhdGE6IGFueSkge1xuICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IHRydWVcbiAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgIC8vIHVzZSB0aGlzIGlmIHlvdSBuZWVkIGRpc2FibGVkIGZpZWxkIHZhbHVlcyA6IGZvcm0uZ2V0UmF3VmFsdWUoKVxuICAgICAgLi4uZm9ybS52YWx1ZVxuICAgIH1cbiAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgZm9ybURhdGEsXG4gICAgICB1cGRhdGVUZXJtRGF0YTogZGF0YS5jaGlsZHJlbkRhdGFcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zKHVwZGF0ZURhdGEpXG4gIH1cblxuICB1cGRhdGVUZXJtQXNzb2NpYXRpb25zKHVwZGF0ZURhdGE/OiBhbnkpIHtcbiAgICBsZXQgYXNzb2NpYXRpb25zID0gW11cbiAgICBsZXQgdGVtcFxuICAgIGxldCBjb3VudGVyID0gMFxuICAgIC8vIGxldCBsb2NhbElzRXhpc3QgPSBmYWxzZVxuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY291bnRlcisrXG4gICAgICB0ZW1wID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6YW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgfSkgOiBbXVxuICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIsIGFwcHJvdmFsU3RhdHVzOiBhcHBDb25zdGFudHMuRFJBRlQgfSlcbiAgICAgICAgaWYodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikge1xuICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgIC4uLih1cGRhdGVEYXRhICYmIHVwZGF0ZURhdGEuZm9ybURhdGEgJiYgdXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YS5jb2RlID09PSBwYXJlbnQuY29kZSkgPyB7Li4udXBkYXRlRGF0YS5mb3JtRGF0YX06IG51bGwsXG4gICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiAodXBkYXRlRGF0YSkgPyB7Li4udXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YSwgLi4udXBkYXRlRGF0YS5mb3JtRGF0YX0gOiB7fVxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB7IC4uLnZhbHVlIH0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBUZXJtIEFzc29jaWF0aW9uIGZhaWxlZC5gKVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBkaWFsb2dDbG9zZSh0ZXJtOiBhbnkpIHtcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UucHVibGlzaEZyYW1ld29yaygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0ZXJtKVxuICAgIH0sKF9lcnI6YW55KT0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBQdWJsaXNoICBmYWlsZWQuYClcbiAgICB9KTtcbiAgfVxuXG5cblxuXG5cbiAgYXN5bmMgbXVsdGlDcmVhdGVTdWJUaGVtZShfZm9ybTogYW55LCBkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICBsZXQgZm9ybUFycmF5OmFueSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIGxldCBzZWxlY3RlZEZvcm1EYXRhOmFueSAgPSBmb3JtQXJyYXkuYXQoMCkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKS52YWx1ZVxuICAgIGxldCBwcmV2aW91c1N1YlRoZW1lRGF0YSA9IGRhdGEuY2hpbGRyZW5EYXRhLmNoaWxkcmVuXG4gICAgbGV0IG5ld2x5QWRkZWQ6IGFueSA9IFtdXG4gICAgbGV0IHJlbW92ZWRFeGlzdGluZzphbnkgPSBbXVxuICAgIGxldCBjcmVhdGVkU3ViVGhlbWUgPSBbXVxuICAgIGxldCBjb3VudGVyU3ViVGhlbWUgPSAwXG4gICAgLy8gbGV0IGNvdW50ZXJSZXRpcmVTdWJUaGVtZSA9IDBcbiAgICBcbiAgICBuZXdseUFkZGVkID0gXy5kaWZmZXJlbmNlQnkoc2VsZWN0ZWRGb3JtRGF0YSwgcHJldmlvdXNTdWJUaGVtZURhdGEsICdyZWZJZCcpO1xuICAgIHJlbW92ZWRFeGlzdGluZyA9IF8uZGlmZmVyZW5jZUJ5KHByZXZpb3VzU3ViVGhlbWVEYXRhLCBzZWxlY3RlZEZvcm1EYXRhLCAncmVmSWQnKTtcbiAgICBpZihuZXdseUFkZGVkICYmIG5ld2x5QWRkZWQubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5ld2x5QWRkZWQuZm9yRWFjaChhc3luYyAodmFsLCBpKSA9PntcbiAgICAgICAgZm9yKGxldCB2YWwgb2YgbmV3bHlBZGRlZCl7XG4gICAgICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICBuYW1lOiB2YWwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgICAgcmVmSWQ6IHZhbC5yZWZJZCxcbiAgICAgICAgICByZWZUeXBlOiB2YWwucmVmVHlwZSxcbiAgICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgICAgeyBpZGVudGlmaWVyOiBgJHt0aGlzLmRhdGEuZnJhbWV3b3JrSWQudG9Mb3dlckNhc2UoKX1fJHt0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlfWAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpbWVTdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdGVybTogdGVybVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgIGxldCByZXNwb25zZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuY3JhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXNwb25zZURhdGEucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgICBjcmVhdGVkU3ViVGhlbWUucHVzaChyZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0pXG4gICAgICAgICAgY291bnRlclN1YlRoZW1lKytcbiAgICAgICAgICBpZihjb3VudGVyU3ViVGhlbWUgPT09IG5ld2x5QWRkZWQubGVuZ3RoKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFN1YlRoZW1lLCBwYXJlbnRDb2wpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudENvbCwgY3JlYXRlZFN1YlRoZW1lLCAnY3JlYXRlJylcbiAgICAgICAgICAgIGlmKCEocmVtb3ZlZEV4aXN0aW5nICYmIHJlbW92ZWRFeGlzdGluZy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybUFycmF5LCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgdGhlbWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIFxuICAgIGlmKHJlbW92ZWRFeGlzdGluZyAmJiByZW1vdmVkRXhpc3RpbmcubGVuZ3RoKSB7XG4gICAgICBsZXQgcmVtb3ZlZFRlcm1zQ29sbGVjdGlvbiA9IFtdXG4gICAgICBmb3IobGV0IHJlbW92ZWRUZXJtIG9mIHJlbW92ZWRFeGlzdGluZykge1xuICAgICAgICByZW1vdmVkVGVybXNDb2xsZWN0aW9uLnB1c2gocmVtb3ZlZFRlcm0uY29kZSlcbiAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBzdWJUaGVtZVJlcXVlc3QgPXtcbiAgICAgICAgICBcInJlcXVlc3RcIjogeyBcbiAgICAgICAgICAgIFwiY29udGVudElkc1wiOiByZW1vdmVkVGVybXNDb2xsZWN0aW9uIFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYXdhaXQgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnJldGlyZU11bHRpcGxlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHN1YlRoZW1lUmVxdWVzdCkudG9Qcm9taXNlKCkudGhlbihhc3luYyAoKSA9PiB7XG5cbiAgICAgICAgICAvLyBjb3VudGVyUmV0aXJlU3ViVGhlbWUrK1xuICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuXG4gICAgICAgICAgLy8gbGV0IHNlY3Rpb25MaXN0ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBzZWN0aW9uTGlzdGNoaWxkcmVuTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChwYXJlbnRDb2wuY2hpbGRyZW4sIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCBzZWN0aW9uTGlzdEFzc29jaWF0aW9uTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChwYXJlbnRDb2wuYXNzb2NpYXRpb25zLCByZW1vdmVkRXhpc3RpbmcsIChhOmFueSwgYjogYW55KSA9PiBhLmlkZW50aWZpZXIgPT09IGIuaWRlbnRpZmllcik7XG4gICAgICAgICBcbiAgICAgICAgICBwYXJlbnRDb2xbJ2NoaWxkcmVuJ10gPSBzZWN0aW9uTGlzdGNoaWxkcmVuTGlzdFxuICAgICAgICAgIHBhcmVudENvbFsnYXNzb2NpYXRpb25zJ10gPSBzZWN0aW9uTGlzdEFzc29jaWF0aW9uTGlzdFxuICAgIFxuXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50Q29sLCByZW1vdmVkRXhpc3RpbmcsICdkZWxldGUnKVxuXG4gICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IFtdLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUsIGRhdGE6IHBhcmVudENvbCwgY2FyZFJlZjogcGFyZW50Q29sLmNhcmRSZWYgfSk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgdGhlbWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuYClcblxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgfVxuXG4gIG9uRGlzYWJsZVRoZW1lKG9wdGlvbjogYW55KXtcbiAgICBjb25zdCBwYXJlbnRDb2x1bW5Db25maWdEYXRhOmFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICBsZXQgcmVzdWx0ID0gLTFcbiAgICBpZihwYXJlbnRDb2wgJiYgcGFyZW50Q29sLmNoaWxkcmVuICYmIHBhcmVudENvbC5jaGlsZHJlbi5sZW5ndGgpe1xuICAgICAgcmVzdWx0ID0gcGFyZW50Q29sLmNoaWxkcmVuLmZpbmRJbmRleCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYoIChlbGUucmVmVHlwZSA9PT0gJ3RoZW1lJykgICYmICh0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYS5jb2RlID09PSBlbGUuYWRkaXRpb25hbFByb3BlcnRpZXMuY29tcGV0ZW5jeUFyZWEuY29kZSkpIHtcbiAgICAgICAgcmV0dXJuICBlbGUucmVmSWQgPT09IG9wdGlvbi5yZWZJZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZihyZXN1bHQgPCAwKXtcbiAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIHJlc3VsdCA9IGZvcm1BcnJheS52YWx1ZS5maW5kSW5kZXgoKGZvcm1FbGU6IGFueSkgPT4ge1xuICAgICAgICBpZihmb3JtRWxlLmNvbXBldGVuY3lUaGVtZSAmJiBmb3JtRWxlLmNvbXBldGVuY3lUaGVtZS5yZWZJZCApe1xuICAgICAgICAgIHJldHVybiAgZm9ybUVsZS5jb21wZXRlbmN5VGhlbWUucmVmSWQgPT09IG9wdGlvbi5yZWZJZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSk7XG4gICAgIH1cbiBcbiAgICAvLyBcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0ID49IDAgPyB0cnVlOiBmYWxzZVxuICB9XG5cblxuICB1cGRhdGVMb2NhbExpc3QoaXRlbTogYW55LCBwYXJlbnQ6IGFueSxzZWxlY3RlZFRlcm1BcnJheTogYW55LCB1cGRhdGVUeXBlPzphbnkpIHtcbiAgICBpZihpdGVtICYmIGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGlmKHVwZGF0ZVR5cGUgPT09ICdkZWxldGUnKXtcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChpdG1EYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihpdG1EYXRhLmlkZW50aWZpZXIgPT09IHBhcmVudC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAvLyBsZXQgZGlmZmVyZW5jZURhdGEgPSBbXVxuICAgICAgICAgICAgLy8gaWYoaXRtRGF0YSAmJiBpdG1EYXRhLmNoaWxkcmVuICYmIGl0bURhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyAgIGRpZmZlcmVuY2VEYXRhICA9IF8uZGlmZmVyZW5jZUJ5KGl0bURhdGEuY2hpbGRyZW4sc2VsZWN0ZWRUZXJtQXJyYXksICdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICBkaWZmZXJlbmNlRGF0YSA9IHNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIGNvbnN0IGFzc29jaWF0aW9uTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChpdG1EYXRhLmFzc29jaWF0aW9ucyxzZWxlY3RlZFRlcm1BcnJheSwgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChpdG1EYXRhLmNoaWxkcmVuLCBzZWxlY3RlZFRlcm1BcnJheSwgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGl0bURhdGFbJ2Fzc29jaWF0aW9ucyddID0gYXNzb2NpYXRpb25MaXN0XG4gICAgICAgICAgICBpdG1EYXRhWydjaGlsZHJlbiddID0gY2hpbGRyZW5MaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGl0bURhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxMaXN0KGl0bURhdGEsIHBhcmVudCxzZWxlY3RlZFRlcm1BcnJheSx1cGRhdGVUeXBlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaCgoaXRtRGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgaWYoaXRtRGF0YS5pZGVudGlmaWVyID09PSBwYXJlbnQuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2VEYXRhID0gW11cbiAgICAgICAgICAgIGlmKGl0bURhdGEgJiYgaXRtRGF0YS5jaGlsZHJlbiAmJiBpdG1EYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSAgPSBfLmRpZmZlcmVuY2VCeShzZWxlY3RlZFRlcm1BcnJheSxpdG1EYXRhLmNoaWxkcmVuLCAnaWRlbnRpZmllcicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlmZmVyZW5jZURhdGEgPSBzZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGlmZmVyZW5jZURhdGEgPSB0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICBpdG1EYXRhWydhc3NvY2lhdGlvbnMnXSA9IGl0bURhdGEgJiYgaXRtRGF0YS5hc3NvY2lhdGlvbnMgP1suLi5pdG1EYXRhLmFzc29jaWF0aW9ucywgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG4gICAgICAgICAgICBpdG1EYXRhWydjaGlsZHJlbiddID0gaXRtRGF0YSAmJiBpdG1EYXRhLmNoaWxkcmVuID9bLi4uaXRtRGF0YS5jaGlsZHJlbiwgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGl0bURhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxMaXN0KGl0bURhdGEsIHBhcmVudCwgc2VsZWN0ZWRUZXJtQXJyYXkpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVRoZW1lKCkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGNvbnN0IGNhcmREYXRhID0gdGhpcy5kYXRhLmNoaWxkcmVuRGF0YVxuICAgIGxldCByZW1vdmVkTGlzdFRlcm0gPSBbXVxuICAgIHJlbW92ZWRMaXN0VGVybS5wdXNoKGNhcmREYXRhLmNvZGUpXG4gICAgbGV0IHN1YlRoZW1lUmVxdWVzdCA9e1xuICAgICAgXCJyZXF1ZXN0XCI6IHsgXG4gICAgICAgIFwiY29udGVudElkc1wiOiByZW1vdmVkTGlzdFRlcm1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnJldGlyZU11bHRpcGxlVGVybSh0aGlzLmZyYW1lV29ya1NlcnZpY2UuZnJhbWV3b3JrSWQsIGNhcmREYXRhLmNhdGVnb3J5LCBzdWJUaGVtZVJlcXVlc3QpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgXG4gICAgICBsZXQgcmVtb3ZlZEV4aXN0aW5nID0gW2NhcmREYXRhXVxuICAgICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YTphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShjYXJkRGF0YS5jYXRlZ29yeSlcbiAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG4gICAgXG4gICAgICBjb25zdCBzZWN0aW9uTGlzdGNoaWxkcmVuTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChwYXJlbnRDb2wuY2hpbGRyZW4sIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25MaXN0QXNzb2NpYXRpb25MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5hc3NvY2lhdGlvbnMsIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICBcbiAgICAgIHBhcmVudENvbFsnY2hpbGRyZW4nXSA9IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0XG4gICAgICBwYXJlbnRDb2xbJ2Fzc29jaWF0aW9ucyddID0gc2VjdGlvbkxpc3RBc3NvY2lhdGlvbkxpc3RcbiAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KGNhcmREYXRhLmNhdGVnb3J5LCBwYXJlbnRDb2wsIHJlbW92ZWRFeGlzdGluZywgJ2RlbGV0ZScpXG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogcGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlLCBkYXRhOiBwYXJlbnRDb2wsIGNhcmRSZWY6IHBhcmVudENvbC5jYXJkUmVmIH0pXG4gICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHt9KVxuICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgIH0sKChfZXJyOiBhbnkpPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSBkZWxldGUgZmFpbGVkLmApXG4gICAgfSkpXG4gIH1cblxuXG4gIC8vIGdldHRlciBtZXRob2RzXG5cbiAgZ2V0IGNvbXBUaGVtZUZpZWxkcygpOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gIH1cblxufVxuIiwiXG48ZGl2IGNsYXNzPVwiXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVNdWx0aUNyZWF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgdy0xMDAgYWJzb2x1dGUgbG9hZGVyLWJnIGl0ZW1zLWNlbnRlciBwdC01IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwiZGlzcGxheS1pbmxpbmUtYmxvY2sgbWItNVwiIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8IS0tIDxwPnt7bG9hZGVyTXNnfX08L3A+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZ05ld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cImFjdGlvbiBpdGVtc1wiXG4gICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY2FyZE1lbnVcIiBbbWF0TWVudVRyaWdnZXJEYXRhXT1cInsnZGF0YSc6ZGF0YX1cIiBjbGFzcz1cImFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBkYXRhPy5zZWxlY3RlZFBhcmVudFRlcm1zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlcm0uY2F0ZWdvcnkgIT09ICdjb21wZXRlbmN5J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmcmFtZVdvcmtTZXJ2aWNlLmdldENvbmZpZyh0ZXJtLmNhdGVnb3J5KS5sYWJlbE5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0ZXJtLm5hbWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBldGVuY3lGb3JtXCI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNvbXBldGVuY3lGb3JtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snU2VsZWN0IEFyZWEnfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJjb21wZXRlbmN5LWdyb3VwXCIgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wQXJlYVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uICBbZGlzYWJsZWRdPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSA9PT0gJ3N1YnRoZW1lJyB8fCBkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiIGNsYXNzPVwibGVhcm5pbmctc2VjdGlvblwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWJ0bic6aXRlbT8uY29kZSA9PT0gc2VsZXRlZENvbXBldGVuY3lBcmVhPy5jb2RlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY3lBcmVhPy5jaGlsZHJlblwiIFt2YWx1ZV09XCJpdGVtXCIgW2NoZWNrZWRdPVwiaXRlbT8uY29kZSA9PT0gc2VsZXRlZENvbXBldGVuY3lBcmVhPy5jb2RlXCIgKGNoYW5nZSk9XCJjbGVhclNlbGVjdGVkVGhlbWVzKGl0ZW0pXCI+e3tpdGVtLm5hbWV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZW5kIG1iLTRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgIT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYXQtYnV0dG9uIGZsZXggaXRlbXMtY2VudGVyIGNyZWF0ZS1hY2NvcmRpb24tYnRuXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCIgKGNsaWNrKT1cImFkZENvbXBldGVuY3lUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yIG1hdC1pY29uLWN1c3RvbSBcIj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIG1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGZvcm1BcnJheU5hbWU9XCJjb21wVGhlbWVGaWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdGb3I9XCJsZXQgZmllbGQgb2YgY29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ107IGxldCBpID0gaW5kZXg7IGxldCBpc0ZpcnN0ID0gZmlyc3RcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1ib3R0b20tbCBjb21wLXRoZW1lLWZpZWxkc1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbZXhwYW5kZWRdPVwiaXNGaXJzdFwiPiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lUaGVtZT8udmFsdWU/Lm5hbWV9fSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgIT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbXBGaWVsZHMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1jdXN0b20gXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlciBtYXJnaW4tdG9wLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhLm9wZW5Nb2RlICE9PSAndmlldyc/ICdTZWxlY3QgQ29tcGV0ZW5jeSBUaGVtZSc6ICdDb21wZXRlbmN5IFRoZW1lIE5hbWUnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtkaXNhYmxlZF09XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlID09PSAnc3VidGhlbWUnIHx8IGRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgdGhlIENvbXBldGVuY3kgVGhlbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wZXRlbmN5VGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lXCIgIFt2YWx1ZV09XCJvcHRpb25cIiBbZGlzYWJsZWRdPVwib25EaXNhYmxlVGhlbWUob3B0aW9uKSB8fCBkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGlvbkNoYW5nZSk9XCJPblRoZW1lU2VsZWN0aW9uKCRldmVudCwgaSwgb3B0aW9uKVwiICA+e3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbi5yZWZJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMiByZWYtaWRcIj4oe3tvcHRpb24ucmVmSWR9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhLm9wZW5Nb2RlICE9PSAndmlldyc/ICdTZWxlY3QgQ29tcGV0ZW5jeSBTdWItVGhlbWUnOiAnQ29tcGV0ZW5jeSBTdWItVGhlbWUgTmFtZSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFRoZW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZVwiIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lTdWJUaGVtZT8udmFsdWUgfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGwgZmllbGQtaGVpZ2h0XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCIgcGxhY2Vob2xkZXItdGV4dFwiIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFN1Yi1UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lTdWJUaGVtZVwiIG11bHRpcGxlIFtkaXNhYmxlZF09XCJkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiIHBhbmVsQ2xhc3M9XCJmdWxsLXdpZHRoLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gW25nQ2xhc3NdPVwieydkaXNiYWxlZFNlbGVjdCc6aXNIaWRlRGF0YX1cIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlciA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLWxpc3Rib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lTdWJUaGVtZT8udmFsdWVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cIm9uVGVybVJlbW92ZShpdGVtLCBpKVwiIFtkaXNhYmxlZF09XCJkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3N1Yi10aGVtZS1kaXNhYmxlJzogZGF0YT8ub3Blbk1vZGUgPT09J3ZpZXcnfVwiICBbcmVtb3ZhYmxlXT1cImRhdGE/Lm9wZW5Nb2RlID09PSd2aWV3Jz8gZmFsc2U6IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e2NvbXBldGVuY3lGb3JtPy5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIHxqc29ufX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaCBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lTdWJUaGVtZVwiIG1hdElucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCAqbmdJZj1cImZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+Tm8gcmVzdWx0cyBmb3VuZCE8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiByZXF1ZXN0T2JqRGF0YS5wcmVmZXJyZWRQcm92aWRlclwiIFt2YWx1ZV09XCJvcHRpb24ucHJvdmlkZXJOYW1lXCI+e3tvcHRpb24ucHJvdmlkZXJOYW1lfX08L21hdC1vcHRpb24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgY29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lUaGVtZT8udmFsdWU/LmNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCIgY2xhc3M9XCJtYXQtb3B0aW9uLWxpc3RcIj57e29wdGlvbj8ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24/LnJlZklkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTIgcmVmLWlkXCI+KHt7b3B0aW9uPy5yZWZJZH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwicmVxdWVzdEZvcm0uY29udHJvbHNbJ3Byb3ZpZGVyVGV4dCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgdXAgdG8gZml2ZSBwcmVmZXJyZWQgcHJvdmlkZXJzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb290ZXIgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImRlZmF1bHRcIiB0eXBlPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJyAmJiBkYXRhLm9wZW5Nb2RlICE9PSd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybT8uaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmNyZWF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnICYmIGRhdGEub3Blbk1vZGUgIT09J3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlICE9PSAnc3VidGhlbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybS5pbnZhbGlkIHx8IGRpc2FibGVNdWx0aUNyZWF0ZVwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGUoY29tcGV0ZW5jeUZvcm0sIGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmNyZWF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlID09PSAnc3VidGhlbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVswXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVN1YlRoZW1lPy52YWx1ZT8ubGVuZ3RoO2Vsc2UgdXBkYXRlQnRuXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybS5pbnZhbGlkIHx8IGRpc2FibGVNdWx0aUNyZWF0ZVwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGVTdWJUaGVtZShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLnVwZGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctdGVtcGxhdGUgI3VwZGF0ZUJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29tcGV0ZW5jeUZvcm0uaW52YWxpZCB8fCBkaXNhYmxlTXVsdGlDcmVhdGVcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCIgKGNsaWNrKT1cIm11bHRpQ3JlYXRlU3ViVGhlbWUoY29tcGV0ZW5jeUZvcm0sIGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBfc3RyaW5ncy5kZWxldGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCcgJiYgZGF0YS5vcGVuTW9kZSAhPT0ndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVGVybURhdGEoY29tcGV0ZW5jeUZvcm0sIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICA8L2Rpdj5cbiAgICBcbiAgICBcbiAgICA8IS0tIFRpdGxlIG9mIHRoZSBwb3B1cCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI21vZGFsVGl0bGU+XG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57e2RhdGEuY29sdW1uSW5mby5uYW1lID09PSAnVGhlbWUnID8gYXBwX3N0cmluZ3MuYWRkQ29tcGV0ZW5jeSA6IGFwcF9zdHJpbmdzLmNyZWF0ZU5ld319IHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDwhLS0ge3tkYXRhIHxqc29ufX0gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJyB8fCBkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3tnZXRDcmVhdGVOYW1lKGRhdGEpfX08L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+VmlldyB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57e2FwcF9zdHJpbmdzLmVkaXR9fSB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG5cbjxtYXQtbWVudSAjY2FyZE1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJtZW51LXNlY1wiPlxuICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudCBsZXQtcm93RGF0YT1cImRhdGFcIiBsZXQtY2FyZFJlZj1cImNhcmRSZWZcIj5cbiAgICAgICAgPGJ1dHRvbiAgKGNsaWNrKT1cImRlbGV0ZVRoZW1lKClcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbSBuYW1lPVwiY2hhbm5lbC1hbmFseXRpY3MtYnV0dG9uXCIgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgaTE4bi1hcmlhLWxhYmVsXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQW5hbHl0aWNzXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPkRlbGV0ZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+Il19