@rangertechnologies/ngnxt 2.1.242 → 2.1.243-beta

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 (90) hide show
  1. package/fesm2022/rangertechnologies-ngnxt.mjs +153 -185
  2. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  3. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  4. package/lib/components/pick-location/pick-location.component.d.ts +0 -1
  5. package/package.json +4 -6
  6. package/rangertechnologies-ngnxt-2.1.243-beta.tgz +0 -0
  7. package/esm2022/environments/version.mjs +0 -15
  8. package/esm2022/lib/ar.i18n.mjs +0 -29
  9. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -165
  10. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -371
  11. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -274
  12. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -51
  13. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -156
  14. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1625
  15. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -283
  16. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -104
  17. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
  18. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
  19. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
  20. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
  21. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
  22. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
  23. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
  24. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
  25. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
  26. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
  27. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
  28. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
  29. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
  30. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
  31. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
  32. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
  33. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
  34. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
  35. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
  36. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -403
  37. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2925
  38. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -101
  39. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -234
  40. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -413
  41. package/esm2022/lib/country.json +0 -43237
  42. package/esm2022/lib/en.i18n.mjs +0 -29
  43. package/esm2022/lib/i18n-config.service.mjs +0 -4
  44. package/esm2022/lib/i18n.component.mjs +0 -47
  45. package/esm2022/lib/i18n.module.mjs +0 -38
  46. package/esm2022/lib/i18n.pipe.mjs +0 -26
  47. package/esm2022/lib/i18n.service.mjs +0 -56
  48. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  49. package/esm2022/lib/interfaces/apimeta.mjs +0 -2
  50. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  51. package/esm2022/lib/model/bookletWrapper.mjs +0 -9
  52. package/esm2022/lib/model/changeWrapper.mjs +0 -11
  53. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  54. package/esm2022/lib/nxt-app.component.mjs +0 -22
  55. package/esm2022/lib/nxt-app.module.mjs +0 -139
  56. package/esm2022/lib/nxt-app.service.mjs +0 -14
  57. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -675
  58. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -466
  59. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -45
  60. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -89
  61. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1021
  62. package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -34
  63. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -676
  64. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1126
  65. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -841
  66. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2405
  67. package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -27
  68. package/esm2022/lib/pipe/date/date.pipe.mjs +0 -28
  69. package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +0 -28
  70. package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +0 -20
  71. package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +0 -20
  72. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -48
  73. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -39
  74. package/esm2022/lib/pipe/time/time.pipe.mjs +0 -26
  75. package/esm2022/lib/sample.mjs +0 -3715
  76. package/esm2022/lib/services/change.service.mjs +0 -50
  77. package/esm2022/lib/services/country.service.mjs +0 -135
  78. package/esm2022/lib/services/data.service.mjs +0 -103
  79. package/esm2022/lib/services/form-builder.service.mjs +0 -375
  80. package/esm2022/lib/services/pdf-designer.service.mjs +0 -401
  81. package/esm2022/lib/services/salesforce.service.mjs +0 -46
  82. package/esm2022/lib/services/shared.service.mjs +0 -100
  83. package/esm2022/lib/services/storage.service.mjs +0 -44
  84. package/esm2022/lib/services/template.service.mjs +0 -351
  85. package/esm2022/lib/services/translation.service.mjs +0 -62
  86. package/esm2022/lib/tam.i18n.mjs +0 -29
  87. package/esm2022/lib/wrapper.mjs +0 -175
  88. package/esm2022/public-api.mjs +0 -25
  89. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  90. package/rangertechnologies-ngnxt-2.1.242.tgz +0 -0
@@ -1,413 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, signal, HostListener } from "@angular/core";
2
- import { ChangeWrapper } from "../../model/changeWrapper";
3
- import { CommonModule } from "@angular/common";
4
- import { FormsModule } from "@angular/forms";
5
- import { NxtInput } from "../nxt-input/nxt-input.component";
6
- import { Subject, debounceTime, distinctUntilChanged, takeUntil } from "rxjs";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../services/data.service";
9
- import * as i2 from "../../i18n.service";
10
- import * as i3 from "../../services/country.service";
11
- import * as i4 from "@angular/common";
12
- export class NxtSearchBox {
13
- dataService;
14
- i18nService;
15
- countryService;
16
- elementRef;
17
- placeHolderText = '';
18
- question;
19
- apiMeta;
20
- id = '';
21
- readOnly = false;
22
- mode = 'edit';
23
- searchValueChange = new EventEmitter();
24
- searchWrapper;
25
- SearchItem;
26
- finalResults = signal([]);
27
- searchKeyWord = '';
28
- newResult;
29
- showResult = false;
30
- noResult = false;
31
- showSuggestion = false;
32
- isLoading = false;
33
- viewFilterName = '';
34
- isSingleFieldChange = false;
35
- valueObj;
36
- inputFocused = false;
37
- lastSearchLength = 0;
38
- filterName = '';
39
- destroy$ = new Subject();
40
- searchSubject = new Subject();
41
- // TrackBy function for performance optimization
42
- trackByFn = (index, item) => {
43
- return item.id || item.name || index;
44
- };
45
- constructor(dataService, i18nService, countryService, elementRef) {
46
- this.dataService = dataService;
47
- this.i18nService = i18nService;
48
- this.countryService = countryService;
49
- this.elementRef = elementRef;
50
- if (this.question?.input && typeof this.question?.input === 'object' && !Array.isArray(this.question?.input)) {
51
- this.clickItem(this.question?.input);
52
- }
53
- else {
54
- this.filterName = this.question?.input;
55
- }
56
- // Setup debounced search
57
- this.searchSubject
58
- .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))
59
- .subscribe(keyword => {
60
- if (this.lastSearchLength > 2)
61
- this.performSearch(keyword);
62
- });
63
- }
64
- ngOnInit() {
65
- if (this.question?.input && typeof this.question?.input === 'object' && !Array.isArray(this.question?.input)) {
66
- this.clickItem(this.question?.input);
67
- }
68
- else {
69
- this.filterName = this.question?.input;
70
- }
71
- this.parseApiMeta();
72
- }
73
- ngOnChanges(changes) {
74
- if (changes['mode']) {
75
- this.mode = changes['mode'].currentValue;
76
- }
77
- if (this.mode !== 'edit' && this.isSingleFieldChange && changes['filterName']) {
78
- const previous = changes['filterName'].previousValue;
79
- const current = changes['filterName'].currentValue;
80
- if (previous !== current) {
81
- this.filterName = previous;
82
- }
83
- }
84
- if (changes['apiMeta'] && this.apiMeta) {
85
- this.parseApiMeta();
86
- }
87
- }
88
- ngOnDestroy() {
89
- this.destroy$.next();
90
- this.destroy$.complete();
91
- this.resetComponentState();
92
- }
93
- // Handle clicks outside the search component
94
- onDocumentClick(event) {
95
- if (!this.elementRef.nativeElement.contains(event.target)) {
96
- this.hideSuggestions();
97
- }
98
- }
99
- // Handle escape key to close suggestions
100
- onEscapeKey(event) {
101
- this.hideSuggestions();
102
- }
103
- parseApiMeta() {
104
- if (this.apiMeta) {
105
- this.apiMeta = typeof this.apiMeta === 'object' ? this.apiMeta : JSON.parse(this.apiMeta || '{}');
106
- this.SearchItem = this.apiMeta.field || [];
107
- }
108
- }
109
- resetComponentState() {
110
- this.finalResults.set([]);
111
- this.searchKeyWord = '';
112
- this.showSuggestion = false;
113
- this.noResult = false;
114
- this.isLoading = false;
115
- this.inputFocused = false;
116
- this.lastSearchLength = 0;
117
- }
118
- hideSuggestions() {
119
- this.showSuggestion = false;
120
- this.inputFocused = false;
121
- }
122
- onInputFocus() {
123
- this.inputFocused = true;
124
- // Trigger a search with an empty keyword to show all data
125
- if (!this.searchKeyWord) {
126
- // this.performSearch('');
127
- }
128
- else if (this.finalResults().length > 0) {
129
- this.showSuggestion = true;
130
- }
131
- }
132
- onInputBlur() {
133
- // Don't immediately hide suggestions to allow for clicking
134
- // The document click handler will handle hiding
135
- }
136
- clearList() {
137
- // Remove the setTimeout delay that was causing issues
138
- this.hideSuggestions();
139
- }
140
- getSourceDataLocal(event) {
141
- if (!event?.value) {
142
- this.resetComponentState();
143
- return;
144
- }
145
- const searchValue = event.value.includes('|') ? event.value.split('|')[0].trim() : event.value.trim();
146
- const currentLength = searchValue.length;
147
- // Always update the search keyword
148
- this.searchKeyWord = searchValue;
149
- // Handle the case where user types 3+ characters
150
- if (currentLength > 2 && !this.isSingleFieldChange) {
151
- this.showSuggestion = !event.question?.singleFieldChange;
152
- this.showResult = false;
153
- this.noResult = false;
154
- // Always perform search when we have 3+ characters
155
- this.lastSearchLength = currentLength;
156
- this.searchSubject.next(searchValue);
157
- }
158
- else if (currentLength <= 2) {
159
- // When length is 2 or less, hide suggestions but keep the search keyword
160
- this.isSingleFieldChange = false;
161
- this.showSuggestion = false;
162
- this.noResult = false;
163
- this.lastSearchLength = currentLength;
164
- this.searchSubject.next(searchValue);
165
- this.finalResults.set([]);
166
- }
167
- }
168
- performSearch(keyword) {
169
- if (!this.apiMeta)
170
- return;
171
- this.parseApiMeta();
172
- if (!this.apiMeta.isStaticData) {
173
- this.searchFromApi(keyword);
174
- }
175
- else {
176
- this.searchFromStaticData(keyword);
177
- }
178
- }
179
- searchFromApi(keyword) {
180
- this.isLoading = true;
181
- this.finalResults.set([]);
182
- let finalGetCall = this.apiMeta.endpoint;
183
- // SKS18JUL25 query params creation
184
- // const isFieldArray = Array.isArray(this.apiMeta?.field);
185
- // const fields = isFieldArray ? this.apiMeta.field : [this.apiMeta.field]; // always an array now
186
- // // Build query params string
187
- // const queryParams = fields
188
- // .map(field => `${field}=${this.searchKeyWord}`)
189
- // .join('&');
190
- // // Check if endpoint already has query params
191
- // if (this.apiMeta.endpoint.includes('?')) {
192
- // finalGetCall += `&${queryParams}`;
193
- // } else {
194
- // finalGetCall += `?${queryParams}`;
195
- // }
196
- this.dataService.apiResponse(finalGetCall)
197
- .pipe(takeUntil(this.destroy$))
198
- .subscribe({
199
- next: (apiResponse) => {
200
- this.isLoading = false;
201
- this.processSearchResults(apiResponse, keyword);
202
- },
203
- error: (error) => {
204
- this.isLoading = false;
205
- this.noResult = true;
206
- this.finalResults.set([]);
207
- }
208
- });
209
- }
210
- searchFromStaticData(keyword) {
211
- const response = this.countryService.getCountryData(this.apiMeta.field);
212
- this.processSearchResults(response, keyword);
213
- }
214
- processSearchResults(apiResponse, keyword) {
215
- let response;
216
- if (this.apiMeta.variable) {
217
- response = this.dataService.getValue(apiResponse, this.apiMeta.variable);
218
- }
219
- else {
220
- response = apiResponse;
221
- }
222
- if (!Array.isArray(response)) {
223
- this.noResult = true;
224
- this.finalResults.set([]);
225
- return;
226
- }
227
- if (!keyword) {
228
- // If no keyword, show all results
229
- this.finalResults.set(response);
230
- this.noResult = response.length === 0;
231
- this.showSuggestion = true; // Ensure suggestions are visible
232
- }
233
- else {
234
- // Filter results based on the keyword
235
- const searchTerms = keyword.toLowerCase().split(" ").filter(term => term.length > 0);
236
- const results = response.filter(obj => {
237
- const combinedValues = this.getCombinedValuesFromColumns(obj, this.apiMeta.field);
238
- return searchTerms.every(term => combinedValues.includes(term));
239
- });
240
- this.noResult = results.length === 0;
241
- this.finalResults.set(results);
242
- this.showSuggestion = true; // Show suggestions only if there are results
243
- }
244
- }
245
- getNestedValue(obj, path) {
246
- if (!obj || !path)
247
- return '';
248
- const processedPath = path.replace(/\[(\d+)\]/g, '.$1');
249
- const parts = processedPath.split('.');
250
- let current = obj;
251
- for (const part of parts) {
252
- if (!current || typeof current !== 'object')
253
- return '';
254
- current = current[part];
255
- }
256
- return current !== null && current !== undefined
257
- ? String(current).toLowerCase().trim()
258
- : '';
259
- }
260
- getCombinedValuesFromColumns(obj, columns) {
261
- if (!obj || !columns)
262
- return '';
263
- const columnArray = Array.isArray(columns) ? columns : [columns];
264
- const values = [];
265
- for (const column of columnArray) {
266
- const value = this.getNestedValue(obj, column);
267
- if (value) {
268
- values.push(value);
269
- }
270
- }
271
- return values.join(' ');
272
- }
273
- getValues(element, columns) {
274
- const result = {};
275
- if (!element || !columns)
276
- return result;
277
- const columnArray = Array.isArray(columns) ? columns : [columns];
278
- columnArray.forEach((column) => {
279
- if (!column)
280
- return;
281
- let tempElement = element;
282
- const fields = column.split('.');
283
- for (const field of fields) {
284
- if (!tempElement)
285
- break;
286
- const splitFields = field.split('[');
287
- if (splitFields.length === 1) {
288
- tempElement = tempElement[field];
289
- }
290
- else {
291
- const indexMatch = splitFields[1]?.match(/(\d+)\]/);
292
- if (indexMatch) {
293
- const index = Number(indexMatch[1]);
294
- tempElement = tempElement[splitFields[0]]?.[index];
295
- }
296
- }
297
- }
298
- result[column] = tempElement || '';
299
- });
300
- return result;
301
- }
302
- getKeys(obj) {
303
- return obj ? Object.keys(obj) : [];
304
- }
305
- clickItem(event) {
306
- if (!this.apiMeta)
307
- return;
308
- this.parseApiMeta();
309
- const values = this.getValues(event, this.SearchItem);
310
- const displayValue = Object.values(values)
311
- .filter(val => val)
312
- .join(' | ');
313
- if (this.mode !== 'edit') {
314
- this.viewFilterName = displayValue;
315
- }
316
- this.filterName = displayValue;
317
- this.ngOnChanges({});
318
- const defaultField = this.apiMeta.defaultField ||
319
- (Array.isArray(this.apiMeta?.field) ? this.apiMeta?.field?.[0] : this.apiMeta.field);
320
- const change = new ChangeWrapper();
321
- change.fromQuestionId = this.id;
322
- change.valueObj = event;
323
- change.field = defaultField;
324
- this.valueObj = event;
325
- this.hideSuggestions();
326
- this.searchValueChange.emit({
327
- question: this.question,
328
- value: change
329
- });
330
- }
331
- removeCharacters(questionText) {
332
- if (!questionText)
333
- return '';
334
- return questionText.replace(/<[^>]*>/g, '');
335
- }
336
- inputValue(event, ques) {
337
- this.filterName = event.trim();
338
- if (!ques?.singleFieldChange || !this.apiMeta)
339
- return;
340
- this.isSingleFieldChange = true;
341
- this.parseApiMeta();
342
- const defaultField = this.apiMeta.defaultField ||
343
- (Array.isArray(this.apiMeta?.field) ? this.apiMeta?.field?.[0] : this.apiMeta.field);
344
- const change = new ChangeWrapper();
345
- change.fromQuestionId = this.id;
346
- change.valueObj = this.valueObj;
347
- change.field = defaultField;
348
- change.referenceField = this.question.referenceField;
349
- this.filterName = this.viewFilterName;
350
- this.searchValueChange.emit({
351
- question: ques,
352
- value: change
353
- });
354
- }
355
- highlightText(text, searchTerm) {
356
- if (!text || !searchTerm)
357
- return text || '';
358
- // Sanitize the input text
359
- const sanitizedText = this.sanitizeHtml(text);
360
- const terms = searchTerm.toLowerCase().split(' ').filter(term => term.length > 0);
361
- if (terms.length === 0)
362
- return sanitizedText;
363
- // Escape special regex characters
364
- const escapedTerms = terms.map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
365
- const regex = new RegExp(`(${escapedTerms.join('|')})`, 'gi');
366
- return sanitizedText.replace(regex, '<span class="highlight">$1</span>');
367
- }
368
- sanitizeHtml(text) {
369
- return text
370
- .replace(/&/g, '&amp;')
371
- .replace(/</g, '&lt;')
372
- .replace(/>/g, '&gt;')
373
- .replace(/"/g, '&quot;')
374
- .replace(/'/g, '&#39;');
375
- }
376
- removeValueEmit() {
377
- this.clickItem(null);
378
- }
379
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtSearchBox, deps: [{ token: i1.DataService }, { token: i2.I18nService }, { token: i3.CountryService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
380
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NxtSearchBox, isStandalone: true, selector: "nxt-search-box", inputs: { placeHolderText: "placeHolderText", question: "question", apiMeta: "apiMeta", id: "id", readOnly: "readOnly", mode: "mode" }, outputs: { searchValueChange: "searchValueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscapeKey($event)" } }, viewQueries: [{ propertyName: "searchWrapper", first: true, predicate: ["searchWrapper"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- VD 12Jun24 - readonly change -->\n<div class=\"search-wrapper\" #searchWrapper>\n <nxt-input \n [type]=\"'list'\" \n [mode]=\"mode\" \n [value]=\"mode === 'edit' ? filterName : viewFilterName\"\n [labelFont]=\"question.font\" \n [label]=\"removeCharacters(question?.questionText)\" \n [labelColor]=\"question.fontColor\"\n [labelSize]=\"question.fontSize\" \n [inputValueSize]=\"question.fontSize\" \n [labelWeight]=\"question.fontWeight\"\n [inputWeight]=\"question.fontWeight\" \n [showLabel]=\"question.style?.showLabel\" \n inputBorder=\"none\" \n svgHeight=\"20px\"\n svgWidth=\"20px\" \n [placeholder]=\"placeHolderText\" \n [required]=\"question.isOptional\" \n inputBgColor=\"#FAFAFA\"\n [inputId]=\"question.trackingId\" \n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"question.iconLeftSrc\" \n (inputValue)=\"getSourceDataLocal($event); inputValue($event.value, $event.question)\" \n (onFocus)=\"onInputFocus()\"\n (onBlur)=\"onInputBlur()\"\n [showSuggestion]=\"showSuggestion\" \n ariaOwns=\"selectList\" \n ariaHasPopup=\"listbox\" \n [isLoading]=\"isLoading\" \n [question]=\"question\"\n (removeValueEmit)=\"removeValueEmit()\">\n </nxt-input>\n\n <div id=\"selectList\" class=\"suggestion-wrapper\" role=\"listbox\" *ngIf=\"showSuggestion\">\n <div *ngIf=\"finalResults().length > 0\" class=\"nxt-suggestions-container\">\n <div *ngFor=\"let item of finalResults(); trackBy: trackByFn\" \n (click)=\"clickItem(item)\" \n class=\"suggestion-item\" \n role=\"option\"\n tabindex=\"0\"\n (keydown.enter)=\"clickItem(item)\"\n (keydown.space)=\"clickItem(item)\">\n <div class=\"item-content\">\n <div class=\"item-details\">\n <div *ngIf=\"item.thumbnail\" class=\"thumbnail-wrapper\">\n <img [src]=\"item.thumbnail\" [alt]=\"item.name + ' avatar'\" />\n </div>\n <div class=\"item-text\">\n <!-- Primary text (first key) -->\n <ng-container *ngIf=\"getKeys(getValues(item, SearchItem)).length > 0\">\n <div class=\"item-name primary\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[getKeys(getValues(item, SearchItem))[0]], searchKeyWord)\">\n </div>\n </ng-container>\n \n <!-- Secondary text (remaining keys) -->\n <div class=\"item-secondary\" *ngIf=\"getKeys(getValues(item, SearchItem)).length > 1\">\n <ng-container *ngFor=\"let key of getKeys(getValues(item, SearchItem)); let i = index\">\n <ng-container *ngIf=\"i > 0\">\n <span class=\"secondary-text\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[key], searchKeyWord)\">\n </span>\n <span class=\"separator\" *ngIf=\"i < getKeys(getValues(item, SearchItem)).length - 1\"> | </span>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"noResult && searchKeyWord\" class=\"no-results\">\n <div class=\"no-results-content\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <path d=\"m21 21-4.35-4.35\"></path>\n </svg>\n <p>No results found for \"{{searchKeyWord}}\"</p>\n </div>\n </div>\n </div>\n</div>", styles: [".search-wrapper{position:relative;width:100%}.suggestion-wrapper{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #e0e0e0;border-top:none;border-radius:0 0 4px 4px;box-shadow:0 2px 8px #0000001a;z-index:1000;max-height:300px;overflow:hidden}.nxt-suggestions-container{max-height:300px;overflow-y:auto;min-width:100%}.suggestion-item{cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .2s ease;outline:none}.suggestion-item:hover,.suggestion-item:focus{background-color:#f5f5f5}.suggestion-item:last-child{border-bottom:none}.item-content{padding:5px}.item-details{display:flex;align-items:flex-start;gap:12px;text-align:left}.thumbnail-wrapper{flex-shrink:0}.thumbnail-wrapper img{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #e0e0e0}.item-text{flex:1;min-width:0}.item-name{font-size:14px;font-weight:500;color:#333;line-height:1.4;margin-bottom:2px;word-wrap:break-word;overflow-wrap:break-word}.item-secondary{font-size:12px;color:#666;line-height:1.3;display:flex}.secondary-text{display:inline}.separator{color:#999;margin:0 3px}.no-results{padding:20px;text-align:center;color:#666}.no-results-content{display:flex;align-items:center;justify-content:center;gap:8px;flex-direction:column}.no-results-content svg{color:#d1d5db;margin-bottom:8px}.no-results-content p{color:#6b7280;margin:0;font-size:14px;font-weight:500}:host ::ng-deep .highlight{font-weight:700;display:inline}.nxt-suggestions-container::-webkit-scrollbar{width:6px}.nxt-suggestions-container::-webkit-scrollbar-track{background:#f1f1f1}.nxt-suggestions-container::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.nxt-suggestions-container::-webkit-scrollbar-thumb:hover{background:#a8a8a8}@media (max-width: 768px){.suggestion-wrapper,.nxt-suggestions-container{max-height:250px}.item-content{padding:10px 12px}.item-details{gap:8px}.thumbnail-wrapper img{width:32px;height:32px}.item-name{font-size:13px}.item-secondary{font-size:11px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit"] }] });
381
- }
382
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtSearchBox, decorators: [{
383
- type: Component,
384
- args: [{ selector: 'nxt-search-box', standalone: true, imports: [
385
- CommonModule,
386
- FormsModule,
387
- NxtInput
388
- ], template: "<!-- VD 12Jun24 - readonly change -->\n<div class=\"search-wrapper\" #searchWrapper>\n <nxt-input \n [type]=\"'list'\" \n [mode]=\"mode\" \n [value]=\"mode === 'edit' ? filterName : viewFilterName\"\n [labelFont]=\"question.font\" \n [label]=\"removeCharacters(question?.questionText)\" \n [labelColor]=\"question.fontColor\"\n [labelSize]=\"question.fontSize\" \n [inputValueSize]=\"question.fontSize\" \n [labelWeight]=\"question.fontWeight\"\n [inputWeight]=\"question.fontWeight\" \n [showLabel]=\"question.style?.showLabel\" \n inputBorder=\"none\" \n svgHeight=\"20px\"\n svgWidth=\"20px\" \n [placeholder]=\"placeHolderText\" \n [required]=\"question.isOptional\" \n inputBgColor=\"#FAFAFA\"\n [inputId]=\"question.trackingId\" \n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"question.iconLeftSrc\" \n (inputValue)=\"getSourceDataLocal($event); inputValue($event.value, $event.question)\" \n (onFocus)=\"onInputFocus()\"\n (onBlur)=\"onInputBlur()\"\n [showSuggestion]=\"showSuggestion\" \n ariaOwns=\"selectList\" \n ariaHasPopup=\"listbox\" \n [isLoading]=\"isLoading\" \n [question]=\"question\"\n (removeValueEmit)=\"removeValueEmit()\">\n </nxt-input>\n\n <div id=\"selectList\" class=\"suggestion-wrapper\" role=\"listbox\" *ngIf=\"showSuggestion\">\n <div *ngIf=\"finalResults().length > 0\" class=\"nxt-suggestions-container\">\n <div *ngFor=\"let item of finalResults(); trackBy: trackByFn\" \n (click)=\"clickItem(item)\" \n class=\"suggestion-item\" \n role=\"option\"\n tabindex=\"0\"\n (keydown.enter)=\"clickItem(item)\"\n (keydown.space)=\"clickItem(item)\">\n <div class=\"item-content\">\n <div class=\"item-details\">\n <div *ngIf=\"item.thumbnail\" class=\"thumbnail-wrapper\">\n <img [src]=\"item.thumbnail\" [alt]=\"item.name + ' avatar'\" />\n </div>\n <div class=\"item-text\">\n <!-- Primary text (first key) -->\n <ng-container *ngIf=\"getKeys(getValues(item, SearchItem)).length > 0\">\n <div class=\"item-name primary\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[getKeys(getValues(item, SearchItem))[0]], searchKeyWord)\">\n </div>\n </ng-container>\n \n <!-- Secondary text (remaining keys) -->\n <div class=\"item-secondary\" *ngIf=\"getKeys(getValues(item, SearchItem)).length > 1\">\n <ng-container *ngFor=\"let key of getKeys(getValues(item, SearchItem)); let i = index\">\n <ng-container *ngIf=\"i > 0\">\n <span class=\"secondary-text\" \n [innerHTML]=\"highlightText(getValues(item, SearchItem)[key], searchKeyWord)\">\n </span>\n <span class=\"separator\" *ngIf=\"i < getKeys(getValues(item, SearchItem)).length - 1\"> | </span>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"noResult && searchKeyWord\" class=\"no-results\">\n <div class=\"no-results-content\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <path d=\"m21 21-4.35-4.35\"></path>\n </svg>\n <p>No results found for \"{{searchKeyWord}}\"</p>\n </div>\n </div>\n </div>\n</div>", styles: [".search-wrapper{position:relative;width:100%}.suggestion-wrapper{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #e0e0e0;border-top:none;border-radius:0 0 4px 4px;box-shadow:0 2px 8px #0000001a;z-index:1000;max-height:300px;overflow:hidden}.nxt-suggestions-container{max-height:300px;overflow-y:auto;min-width:100%}.suggestion-item{cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .2s ease;outline:none}.suggestion-item:hover,.suggestion-item:focus{background-color:#f5f5f5}.suggestion-item:last-child{border-bottom:none}.item-content{padding:5px}.item-details{display:flex;align-items:flex-start;gap:12px;text-align:left}.thumbnail-wrapper{flex-shrink:0}.thumbnail-wrapper img{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #e0e0e0}.item-text{flex:1;min-width:0}.item-name{font-size:14px;font-weight:500;color:#333;line-height:1.4;margin-bottom:2px;word-wrap:break-word;overflow-wrap:break-word}.item-secondary{font-size:12px;color:#666;line-height:1.3;display:flex}.secondary-text{display:inline}.separator{color:#999;margin:0 3px}.no-results{padding:20px;text-align:center;color:#666}.no-results-content{display:flex;align-items:center;justify-content:center;gap:8px;flex-direction:column}.no-results-content svg{color:#d1d5db;margin-bottom:8px}.no-results-content p{color:#6b7280;margin:0;font-size:14px;font-weight:500}:host ::ng-deep .highlight{font-weight:700;display:inline}.nxt-suggestions-container::-webkit-scrollbar{width:6px}.nxt-suggestions-container::-webkit-scrollbar-track{background:#f1f1f1}.nxt-suggestions-container::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.nxt-suggestions-container::-webkit-scrollbar-thumb:hover{background:#a8a8a8}@media (max-width: 768px){.suggestion-wrapper,.nxt-suggestions-container{max-height:250px}.item-content{padding:10px 12px}.item-details{gap:8px}.thumbnail-wrapper img{width:32px;height:32px}.item-name{font-size:13px}.item-secondary{font-size:11px}}\n"] }]
389
- }], ctorParameters: () => [{ type: i1.DataService }, { type: i2.I18nService }, { type: i3.CountryService }, { type: i0.ElementRef }], propDecorators: { placeHolderText: [{
390
- type: Input
391
- }], question: [{
392
- type: Input
393
- }], apiMeta: [{
394
- type: Input
395
- }], id: [{
396
- type: Input
397
- }], readOnly: [{
398
- type: Input
399
- }], mode: [{
400
- type: Input
401
- }], searchValueChange: [{
402
- type: Output
403
- }], searchWrapper: [{
404
- type: ViewChild,
405
- args: ['searchWrapper', { static: true }]
406
- }], onDocumentClick: [{
407
- type: HostListener,
408
- args: ['document:click', ['$event']]
409
- }], onEscapeKey: [{
410
- type: HostListener,
411
- args: ['document:keydown.escape', ['$event']]
412
- }] } });
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBNkIsTUFBTSxFQUFtQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFak0sT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTVELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBYTlFLE1BQU0sT0FBTyxZQUFZO0lBa0NIO0lBQWlDO0lBQWtDO0lBQXdDO0lBakN0SCxlQUFlLEdBQVcsRUFBRSxDQUFDO0lBQzdCLFFBQVEsQ0FBTTtJQUNkLE9BQU8sQ0FBTTtJQUNiLEVBQUUsR0FBVyxFQUFFLENBQUM7SUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixJQUFJLEdBQThCLE1BQU0sQ0FBQztJQUV4QyxpQkFBaUIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUMzQixhQUFhLENBQWM7SUFFekUsVUFBVSxDQUFNO0lBQ1QsWUFBWSxHQUEw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IE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBTaW1wbGVDaGFuZ2VzLCBzaWduYWwsIFdyaXRhYmxlU2lnbmFsLCBUcmFja0J5RnVuY3Rpb24sIEhvc3RMaXN0ZW5lcn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZVdyYXBwZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWwvY2hhbmdlV3JhcHBlclwiO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vaTE4bi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTnh0SW5wdXQgfSBmcm9tIFwiLi4vbnh0LWlucHV0L254dC1pbnB1dC5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvdW50cnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NvdW50cnkuc2VydmljZVwiO1xuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LXNlYXJjaC1ib3gnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE54dElucHV0XG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWJveC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTnh0U2VhcmNoQm94IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyVGV4dDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHF1ZXN0aW9uOiBhbnk7XG4gIEBJbnB1dCgpIGFwaU1ldGE6IGFueTtcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBtb2RlOiAndmlldycgfCAnZWRpdCcgfCAncHJpbnQnID0gJ2VkaXQnO1xuICBcbiAgQE91dHB1dCgpIHNlYXJjaFZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAVmlld0NoaWxkKCdzZWFyY2hXcmFwcGVyJywgeyBzdGF0aWM6IHRydWUgfSkgc2VhcmNoV3JhcHBlciE6IEVsZW1lbnRSZWY7XG5cbiAgU2VhcmNoSXRlbTogYW55O1xuICBwdWJsaWMgZmluYWxSZXN1bHRzOiBXcml0YWJsZVNpZ25hbDxhbnlbXT4gPSBzaWduYWwoW10pO1xuICBwdWJsaWMgc2VhcmNoS2V5V29yZDogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBuZXdSZXN1bHQ6IGFueTtcbiAgcHVibGljIHNob3dSZXN1bHQgPSBmYWxzZTtcbiAgcHVibGljIG5vUmVzdWx0ID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyB2aWV3RmlsdGVyTmFtZTogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBpc1NpbmdsZUZpZWxkQ2hhbmdlID0gZmFsc2U7XG4gIHB1YmxpYyB2YWx1ZU9iajogYW55O1xuICBwdWJsaWMgaW5wdXRGb2N1c2VkID0gZmFsc2U7XG4gIHB1YmxpYyBsYXN0U2VhcmNoTGVuZ3RoID0gMDtcbiAgcHVibGljIGZpbHRlck5hbWUgPScnXG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgc2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAvLyBUcmFja0J5IGZ1bmN0aW9uIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgdHJhY2tCeUZuOiBUcmFja0J5RnVuY3Rpb248YW55PiA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IHtcbiAgICByZXR1cm4gaXRlbS5pZCB8fCBpdGVtLm5hbWUgfHwgaW5kZXg7XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsIHB1YmxpYyBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHByaXZhdGUgY291bnRyeVNlcnZpY2U6IENvdW50cnlTZXJ2aWNlLCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICBpZih0aGlzLnF1ZXN0aW9uPy5pbnB1dCAmJiB0eXBlb2YgdGhpcy5xdWVzdGlvbj8uaW5wdXQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHRoaXMucXVlc3Rpb24/LmlucHV0KSl7XG4gICAgICB0aGlzLmNsaWNrSXRlbSh0aGlzLnF1ZXN0aW9uPy5pbnB1dClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJOYW1lID0gdGhpcy5xdWVzdGlvbj8uaW5wdXRcbiAgICB9ICAgIFxuICAgIC8vIFNldHVwIGRlYm91bmNlZCBzZWFyY2hcbiAgICB0aGlzLnNlYXJjaFN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGtleXdvcmQgPT4ge1xuICAgICAgICBpZih0aGlzLmxhc3RTZWFyY2hMZW5ndGggPiAyKSB0aGlzLnBlcmZvcm1TZWFyY2goa2V5d29yZCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMucXVlc3Rpb24/LmlucHV0ICYmIHR5cGVvZiB0aGlzLnF1ZXN0aW9uPy5pbnB1dCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5xdWVzdGlvbj8uaW5wdXQpKXtcbiAgICAgIHRoaXMuY2xpY2tJdGVtKHRoaXMucXVlc3Rpb24/LmlucHV0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlck5hbWUgPSB0aGlzLnF1ZXN0aW9uPy5pbnB1dFxuICAgIH1cbiAgICB0aGlzLnBhcnNlQXBpTWV0YSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtb2RlJ10pIHtcbiAgICAgIHRoaXMubW9kZSA9IGNoYW5nZXNbJ21vZGUnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgIT09ICdlZGl0JyAmJiB0aGlzLmlzU2luZ2xlRmllbGRDaGFuZ2UgJiYgY2hhbmdlc1snZmlsdGVyTmFtZSddKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGNoYW5nZXNbJ2ZpbHRlck5hbWUnXS5wcmV2aW91c1ZhbHVlO1xuICAgICAgY29uc3QgY3VycmVudCA9IGNoYW5nZXNbJ2ZpbHRlck5hbWUnXS5jdXJyZW50VmFsdWU7XG4gICAgICBpZiAocHJldmlvdXMgIT09IGN1cnJlbnQpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJOYW1lID0gcHJldmlvdXM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydhcGlNZXRhJ10gJiYgdGhpcy5hcGlNZXRhKSB7XG4gICAgICB0aGlzLnBhcnNlQXBpTWV0YSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLnJlc2V0Q29tcG9uZW50U3RhdGUoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjbGlja3Mgb3V0c2lkZSB0aGUgc2VhcmNoIGNvbXBvbmVudFxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgZXNjYXBlIGtleSB0byBjbG9zZSBzdWdnZXN0aW9uc1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXG4gIG9uRXNjYXBlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VBcGlNZXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFwaU1ldGEpIHtcbiAgICAgIHRoaXMuYXBpTWV0YSA9IHR5cGVvZiB0aGlzLmFwaU1ldGEgPT09ICdvYmplY3QnID8gdGhpcy5hcGlNZXRhIDogSlNPTi5wYXJzZSh0aGlzLmFwaU1ldGEgfHwgJ3t9Jyk7XG4gICAgICB0aGlzLlNlYXJjaEl0ZW0gPSB0aGlzLmFwaU1ldGEuZmllbGQgfHwgW107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldENvbXBvbmVudFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZmluYWxSZXN1bHRzLnNldChbXSk7XG4gICAgdGhpcy5zZWFyY2hLZXlXb3JkID0gJyc7XG4gICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMubm9SZXN1bHQgPSBmYWxzZTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5sYXN0U2VhcmNoTGVuZ3RoID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZVN1Z2dlc3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gdHJ1ZTtcbiAgICAvLyBUcmlnZ2VyIGEgc2VhcmNoIHdpdGggYW4gZW1wdHkga2V5d29yZCB0byBzaG93IGFsbCBkYXRhXG4gICAgaWYgKCF0aGlzLnNlYXJjaEtleVdvcmQpIHtcbiAgICAgIC8vIHRoaXMucGVyZm9ybVNlYXJjaCgnJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZpbmFsUmVzdWx0cygpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIC8vIERvbid0IGltbWVkaWF0ZWx5IGhpZGUgc3VnZ2VzdGlvbnMgdG8gYWxsb3cgZm9yIGNsaWNraW5nXG4gICAgLy8gVGhlIGRvY3VtZW50IGNsaWNrIGhhbmRsZXIgd2lsbCBoYW5kbGUgaGlkaW5nXG4gIH1cblxuICBjbGVhckxpc3QoKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHRoZSBzZXRUaW1lb3V0IGRlbGF5IHRoYXQgd2FzIGNhdXNpbmcgaXNzdWVzXG4gICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcbiAgfVxuXG4gIGdldFNvdXJjZURhdGFMb2NhbChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFldmVudD8udmFsdWUpIHtcbiAgICAgIHRoaXMucmVzZXRDb21wb25lbnRTdGF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gIGV2ZW50LnZhbHVlLmluY2x1ZGVzKCd8JykgPyBldmVudC52YWx1ZS5zcGxpdCgnfCcpWzBdLnRyaW0oKSA6IGV2ZW50LnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBjdXJyZW50TGVuZ3RoID0gc2VhcmNoVmFsdWUubGVuZ3RoO1xuICAgIFxuICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhlIHNlYXJjaCBrZXl3b3JkXG4gICAgdGhpcy5zZWFyY2hLZXlXb3JkID0gc2VhcmNoVmFsdWU7XG4gICAgXG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHVzZXIgdHlwZXMgMysgY2hhcmFjdGVyc1xuICAgIGlmIChjdXJyZW50TGVuZ3RoID4gMiAmJiAhdGhpcy5pc1NpbmdsZUZpZWxkQ2hhbmdlKSB7XG4gICAgICB0aGlzLnNob3dTdWdnZXN0aW9uID0gIWV2ZW50LnF1ZXN0aW9uPy5zaW5nbGVGaWVsZENoYW5nZTtcbiAgICAgIHRoaXMuc2hvd1Jlc3VsdCA9IGZhbHNlO1xuICAgICAgdGhpcy5ub1Jlc3VsdCA9IGZhbHNlO1xuICAgICAgLy8gQWx3YXlzIHBlcmZvcm0gc2VhcmNoIHdoZW4gd2UgaGF2ZSAzKyBjaGFyYWN0ZXJzXG4gICAgICB0aGlzLmxhc3RTZWFyY2hMZW5ndGggPSBjdXJyZW50TGVuZ3RoO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoc2VhcmNoVmFsdWUpO1xuICAgICAgXG4gICAgfSBlbHNlIGlmIChjdXJyZW50TGVuZ3RoIDw9IDIpIHtcbiAgICAgIC8vIFdoZW4gbGVuZ3RoIGlzIDIgb3IgbGVzcywgaGlkZSBzdWdnZXN0aW9ucyBidXQga2VlcCB0aGUgc2VhcmNoIGtleXdvcmRcbiAgICAgIHRoaXMuaXNTaW5nbGVGaWVsZENoYW5nZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5ub1Jlc3VsdCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0U2VhcmNoTGVuZ3RoID0gY3VycmVudExlbmd0aDtcbiAgICAgIHRoaXMuc2VhcmNoU3ViamVjdC5uZXh0KHNlYXJjaFZhbHVlKTtcbiAgICAgIHRoaXMuZmluYWxSZXN1bHRzLnNldChbXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtU2VhcmNoKGtleXdvcmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcGlNZXRhKSByZXR1cm47XG5cbiAgICB0aGlzLnBhcnNlQXBpTWV0YSgpO1xuICAgIFxuICAgIGlmICghdGhpcy5hcGlNZXRhLmlzU3RhdGljRGF0YSkge1xuICAgICAgdGhpcy5zZWFyY2hGcm9tQXBpKGtleXdvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaEZyb21TdGF0aWNEYXRhKGtleXdvcmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VhcmNoRnJvbUFwaShrZXl3b3JkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5maW5hbFJlc3VsdHMuc2V0KFtdKTtcbiAgICBsZXQgZmluYWxHZXRDYWxsID0gdGhpcy5hcGlNZXRhLmVuZHBvaW50O1xuICAgIC8vIFNLUzE4SlVMMjUgcXVlcnkgcGFyYW1zIGNyZWF0aW9uXG4gICAgLy8gY29uc3QgaXNGaWVsZEFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLmFwaU1ldGE/LmZpZWxkKTtcbiAgICAvLyBjb25zdCBmaWVsZHMgPSBpc0ZpZWxkQXJyYXkgPyB0aGlzLmFwaU1ldGEuZmllbGQgOiBbdGhpcy5hcGlNZXRhLmZpZWxkXTsgLy8gYWx3YXlzIGFuIGFycmF5IG5vd1xuICAgIC8vIC8vIEJ1aWxkIHF1ZXJ5IHBhcmFtcyBzdHJpbmdcbiAgICAvLyBjb25zdCBxdWVyeVBhcmFtcyA9IGZpZWxkc1xuICAgIC8vICAgLm1hcChmaWVsZCA9PiBgJHtmaWVsZH09JHt0aGlzLnNlYXJjaEtleVdvcmR9YClcbiAgICAvLyAgIC5qb2luKCcmJyk7XG4gICAgLy8gLy8gQ2hlY2sgaWYgZW5kcG9pbnQgYWxyZWFkeSBoYXMgcXVlcnkgcGFyYW1zXG4gICAgLy8gaWYgKHRoaXMuYXBpTWV0YS5lbmRwb2ludC5pbmNsdWRlcygnPycpKSB7XG4gICAgLy8gICBmaW5hbEdldENhbGwgKz0gYCYke3F1ZXJ5UGFyYW1zfWA7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIGZpbmFsR2V0Q2FsbCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcbiAgICAvLyB9XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLmFwaVJlc3BvbnNlKGZpbmFsR2V0Q2FsbClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoYXBpUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc1NlYXJjaFJlc3VsdHMoYXBpUmVzcG9uc2UsIGtleXdvcmQpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm5vUmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmZpbmFsUmVzdWx0cy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2VhcmNoRnJvbVN0YXRpY0RhdGEoa2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmNvdW50cnlTZXJ2aWNlLmdldENvdW50cnlEYXRhKHRoaXMuYXBpTWV0YS5maWVsZCk7XG4gICAgdGhpcy5wcm9jZXNzU2VhcmNoUmVzdWx0cyhyZXNwb25zZSwga2V5d29yZCk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTZWFyY2hSZXN1bHRzKGFwaVJlc3BvbnNlOiBhbnksIGtleXdvcmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCByZXNwb25zZTtcbiAgXG4gICAgaWYgKHRoaXMuYXBpTWV0YS52YXJpYWJsZSkge1xuICAgICAgcmVzcG9uc2UgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGFwaVJlc3BvbnNlLCB0aGlzLmFwaU1ldGEudmFyaWFibGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNwb25zZSA9IGFwaVJlc3BvbnNlO1xuICAgIH1cbiAgXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xuICAgICAgdGhpcy5ub1Jlc3VsdCA9IHRydWU7XG4gICAgICB0aGlzLmZpbmFsUmVzdWx0cy5zZXQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgaWYgKCFrZXl3b3JkKSB7XG4gICAgICAvLyBJZiBubyBrZXl3b3JkLCBzaG93IGFsbCByZXN1bHRzXG4gICAgICB0aGlzLmZpbmFsUmVzdWx0cy5zZXQocmVzcG9uc2UpO1xuICAgICAgdGhpcy5ub1Jlc3VsdCA9IHJlc3BvbnNlLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSB0cnVlOyAvLyBFbnN1cmUgc3VnZ2VzdGlvbnMgYXJlIHZpc2libGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmlsdGVyIHJlc3VsdHMgYmFzZWQgb24gdGhlIGtleXdvcmRcbiAgICAgIGNvbnN0IHNlYXJjaFRlcm1zID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiIFwiKS5maWx0ZXIodGVybSA9PiB0ZXJtLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IHJlc3BvbnNlLmZpbHRlcihvYmogPT4ge1xuICAgICAgICBjb25zdCBjb21iaW5lZFZhbHVlcyA9IHRoaXMuZ2V0Q29tYmluZWRWYWx1ZXNGcm9tQ29sdW1ucyhvYmosIHRoaXMuYXBpTWV0YS5maWVsZCk7XG4gICAgICAgIHJldHVybiBzZWFyY2hUZXJtcy5ldmVyeSh0ZXJtID0+IGNvbWJpbmVkVmFsdWVzLmluY2x1ZGVzKHRlcm0pKTtcbiAgICAgIH0pO1xuICBcbiAgICAgIHRoaXMubm9SZXN1bHQgPSByZXN1bHRzLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuZmluYWxSZXN1bHRzLnNldChyZXN1bHRzKTtcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSB0cnVlOyAvLyBTaG93IHN1Z2dlc3Rpb25zIG9ubHkgaWYgdGhlcmUgYXJlIHJlc3VsdHNcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgcHJvY2Vzc2VkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxbKFxcZCspXFxdL2csICcuJDEnKTtcbiAgICBjb25zdCBwYXJ0cyA9IHByb2Nlc3NlZFBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgY3VycmVudCA9IG9iajtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuICcnO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudCAhPT0gdW5kZWZpbmVkIFxuICAgICAgPyBTdHJpbmcoY3VycmVudCkudG9Mb3dlckNhc2UoKS50cmltKCkgXG4gICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb21iaW5lZFZhbHVlc0Zyb21Db2x1bW5zKG9iajogYW55LCBjb2x1bW5zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgaWYgKCFvYmogfHwgIWNvbHVtbnMpIHJldHVybiAnJztcbiAgICBcbiAgICBjb25zdCBjb2x1bW5BcnJheSA9IEFycmF5LmlzQXJyYXkoY29sdW1ucykgPyBjb2x1bW5zIDogW2NvbHVtbnNdO1xuICAgIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbkFycmF5KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUob2JqLCBjb2x1bW4pO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYWx1ZXMoZWxlbWVudDogYW55LCBjb2x1bW5zOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKCFlbGVtZW50IHx8ICFjb2x1bW5zKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgY29uc3QgY29sdW1uQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcbiAgICBcbiAgICBjb2x1bW5BcnJheS5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGlmICghY29sdW1uKSByZXR1cm47XG4gICAgICBcbiAgICAgIGxldCB0ZW1wRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICBjb25zdCBmaWVsZHMgPSBjb2x1bW4uc3BsaXQoJy4nKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgaWYgKCF0ZW1wRWxlbWVudCkgYnJlYWs7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBzcGxpdEZpZWxkcyA9IGZpZWxkLnNwbGl0KCdbJyk7XG4gICAgICAgIGlmIChzcGxpdEZpZWxkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0ZW1wRWxlbWVudCA9IHRlbXBFbGVtZW50W2ZpZWxkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBpbmRleE1hdGNoID0gc3BsaXRGaWVsZHNbMV0/Lm1hdGNoKC8oXFxkKylcXF0vKTtcbiAgICAgICAgICBpZiAoaW5kZXhNYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoaW5kZXhNYXRjaFsxXSk7XG4gICAgICAgICAgICB0ZW1wRWxlbWVudCA9IHRlbXBFbGVtZW50W3NwbGl0RmllbGRzWzBdXT8uW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmVzdWx0W2NvbHVtbl0gPSB0ZW1wRWxlbWVudCB8fCAnJztcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRLZXlzKG9iajogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBvYmogPyBPYmplY3Qua2V5cyhvYmopIDogW107XG4gIH1cblxuICBwdWJsaWMgY2xpY2tJdGVtKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXBpTWV0YSkgcmV0dXJuO1xuICBcbiAgICB0aGlzLnBhcnNlQXBpTWV0YSgpO1xuICAgIFxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVzKGV2ZW50LCB0aGlzLlNlYXJjaEl0ZW0pO1xuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IE9iamVjdC52YWx1ZXModmFsdWVzKVxuICAgICAgLmZpbHRlcih2YWwgPT4gdmFsKVxuICAgICAgLmpvaW4oJyB8ICcpO1xuICAgIFxuICAgIGlmICh0aGlzLm1vZGUgIT09ICdlZGl0Jykge1xuICAgICAgdGhpcy52aWV3RmlsdGVyTmFtZSA9IGRpc3BsYXlWYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJOYW1lID0gZGlzcGxheVZhbHVlO1xuICAgIHRoaXMubmdPbkNoYW5nZXMoe30pXG4gIFxuICAgIGNvbnN0IGRlZmF1bHRGaWVsZCA9IHRoaXMuYXBpTWV0YS5kZWZhdWx0RmllbGQgfHwgXG4gICAgICAoQXJyYXkuaXNBcnJheSh0aGlzLmFwaU1ldGE/LmZpZWxkKSA/IHRoaXMuYXBpTWV0YT8uZmllbGQ/LlswXSA6IHRoaXMuYXBpTWV0YS5maWVsZCk7XG4gICAgXG4gICAgY29uc3QgY2hhbmdlID0gbmV3IENoYW5nZVdyYXBwZXIoKTtcbiAgICBjaGFuZ2UuZnJvbVF1ZXN0aW9uSWQgPSB0aGlzLmlkO1xuICAgIGNoYW5nZS52YWx1ZU9iaiA9IGV2ZW50O1xuICAgIGNoYW5nZS5maWVsZCA9IGRlZmF1bHRGaWVsZDtcbiAgICBcbiAgICB0aGlzLnZhbHVlT2JqID0gZXZlbnQ7XG4gICAgXG4gICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcbiAgICBcbiAgICB0aGlzLnNlYXJjaFZhbHVlQ2hhbmdlLmVtaXQoe1xuICAgICAgcXVlc3Rpb246IHRoaXMucXVlc3Rpb24sXG4gICAgICB2YWx1ZTogY2hhbmdlXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVDaGFyYWN0ZXJzKHF1ZXN0aW9uVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXF1ZXN0aW9uVGV4dCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBxdWVzdGlvblRleHQucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gIH1cblxuICBpbnB1dFZhbHVlKGV2ZW50OiBhbnksIHF1ZXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyTmFtZSA9IGV2ZW50LnRyaW0oKVxuICAgIGlmICghcXVlcz8uc2luZ2xlRmllbGRDaGFuZ2UgfHwgIXRoaXMuYXBpTWV0YSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1NpbmdsZUZpZWxkQ2hhbmdlID0gdHJ1ZTtcbiAgICB0aGlzLnBhcnNlQXBpTWV0YSgpO1xuXG4gICAgY29uc3QgZGVmYXVsdEZpZWxkID0gdGhpcy5hcGlNZXRhLmRlZmF1bHRGaWVsZCB8fCBcbiAgICAgIChBcnJheS5pc0FycmF5KHRoaXMuYXBpTWV0YT8uZmllbGQpID8gdGhpcy5hcGlNZXRhPy5maWVsZD8uWzBdIDogdGhpcy5hcGlNZXRhLmZpZWxkKTtcblxuICAgIGNvbnN0IGNoYW5nZSA9IG5ldyBDaGFuZ2VXcmFwcGVyKCk7XG4gICAgY2hhbmdlLmZyb21RdWVzdGlvbklkID0gdGhpcy5pZDtcbiAgICBjaGFuZ2UudmFsdWVPYmogPSB0aGlzLnZhbHVlT2JqO1xuICAgIGNoYW5nZS5maWVsZCA9IGRlZmF1bHRGaWVsZDtcbiAgICBjaGFuZ2UucmVmZXJlbmNlRmllbGQgPSB0aGlzLnF1ZXN0aW9uLnJlZmVyZW5jZUZpZWxkO1xuICAgIFxuICAgIHRoaXMuZmlsdGVyTmFtZSA9IHRoaXMudmlld0ZpbHRlck5hbWU7XG4gICAgXG4gICAgdGhpcy5zZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzLFxuICAgICAgdmFsdWU6IGNoYW5nZVxuICAgIH0pO1xuICB9XG5cbiAgaGlnaGxpZ2h0VGV4dCh0ZXh0OiBzdHJpbmcsIHNlYXJjaFRlcm06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0IHx8ICFzZWFyY2hUZXJtKSByZXR1cm4gdGV4dCB8fCAnJztcblxuICAgIC8vIFNhbml0aXplIHRoZSBpbnB1dCB0ZXh0XG4gICAgY29uc3Qgc2FuaXRpemVkVGV4dCA9IHRoaXMuc2FuaXRpemVIdG1sKHRleHQpO1xuICAgIGNvbnN0IHRlcm1zID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJykuZmlsdGVyKHRlcm0gPT4gdGVybS5sZW5ndGggPiAwKTtcbiAgICBcbiAgICBpZiAodGVybXMubGVuZ3RoID09PSAwKSByZXR1cm4gc2FuaXRpemVkVGV4dDtcblxuICAgIC8vIEVzY2FwZSBzcGVjaWFsIHJlZ2V4IGNoYXJhY3RlcnNcbiAgICBjb25zdCBlc2NhcGVkVGVybXMgPSB0ZXJtcy5tYXAodGVybSA9PiBcbiAgICAgIHRlcm0ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKVxuICAgICk7XG5cbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYCgke2VzY2FwZWRUZXJtcy5qb2luKCd8Jyl9KWAsICdnaScpO1xuICAgIHJldHVybiBzYW5pdGl6ZWRUZXh0LnJlcGxhY2UocmVnZXgsICc8c3BhbiBjbGFzcz1cImhpZ2hsaWdodFwiPiQxPC9zcGFuPicpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYW5pdGl6ZUh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlKC8nL2csICcmIzM5OycpO1xuICB9XG4gIHJlbW92ZVZhbHVlRW1pdCgpe1xuICAgIHRoaXMuY2xpY2tJdGVtKG51bGwpXG4gIH1cbn0iLCI8IS0tIFZEIDEySnVuMjQgLSByZWFkb25seSBjaGFuZ2UgLS0+XG48ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAjc2VhcmNoV3JhcHBlcj5cbiAgPG54dC1pbnB1dCBcbiAgICBbdHlwZV09XCInbGlzdCdcIiBcbiAgICBbbW9kZV09XCJtb2RlXCIgXG4gICAgW3ZhbHVlXT1cIm1vZGUgPT09ICdlZGl0JyA/IGZpbHRlck5hbWUgOiB2aWV3RmlsdGVyTmFtZVwiXG4gICAgW2xhYmVsRm9udF09XCJxdWVzdGlvbi5mb250XCIgXG4gICAgW2xhYmVsXT1cInJlbW92ZUNoYXJhY3RlcnMocXVlc3Rpb24/LnF1ZXN0aW9uVGV4dClcIiBcbiAgICBbbGFiZWxDb2xvcl09XCJxdWVzdGlvbi5mb250Q29sb3JcIlxuICAgIFtsYWJlbFNpemVdPVwicXVlc3Rpb24uZm9udFNpemVcIiBcbiAgICBbaW5wdXRWYWx1ZVNpemVdPVwicXVlc3Rpb24uZm9udFNpemVcIiBcbiAgICBbbGFiZWxXZWlnaHRdPVwicXVlc3Rpb24uZm9udFdlaWdodFwiXG4gICAgW2lucHV0V2VpZ2h0XT1cInF1ZXN0aW9uLmZvbnRXZWlnaHRcIiBcbiAgICBbc2hvd0xhYmVsXT1cInF1ZXN0aW9uLnN0eWxlPy5zaG93TGFiZWxcIiBcbiAgICBpbnB1dEJvcmRlcj1cIm5vbmVcIiBcbiAgICBzdmdIZWlnaHQ9XCIyMHB4XCJcbiAgICBzdmdXaWR0aD1cIjIwcHhcIiBcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXJUZXh0XCIgXG4gICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzT3B0aW9uYWxcIiBcbiAgICBpbnB1dEJnQ29sb3I9XCIjRkFGQUZBXCJcbiAgICBbaW5wdXRJZF09XCJxdWVzdGlvbi50cmFja2luZ0lkXCIgXG4gICAgW2Vycm9yTWVzc2FnZXNdPVwieyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnIH1cIlxuICAgIFtpbnB1dEljb25MZWZ0U3JjXT1cInF1ZXN0aW9uLmljb25MZWZ0U3JjXCIgXG4gICAgKGlucHV0VmFsdWUpPVwiZ2V0U291cmNlRGF0YUxvY2FsKCRldmVudCk7IGlucHV0VmFsdWUoJGV2ZW50LnZhbHVlLCAkZXZlbnQucXVlc3Rpb24pXCIgXG4gICAgKG9uRm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxuICAgIChvbkJsdXIpPVwib25JbnB1dEJsdXIoKVwiXG4gICAgW3Nob3dTdWdnZXN0aW9uXT1cInNob3dTdWdnZXN0aW9uXCIgXG4gICAgYXJpYU93bnM9XCJzZWxlY3RMaXN0XCIgXG4gICAgYXJpYUhhc1BvcHVwPVwibGlzdGJveFwiIFxuICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCIgXG4gICAgW3F1ZXN0aW9uXT1cInF1ZXN0aW9uXCJcbiAgICAocmVtb3ZlVmFsdWVFbWl0KT1cInJlbW92ZVZhbHVlRW1pdCgpXCI+XG4gIDwvbnh0LWlucHV0PlxuXG4gIDxkaXYgaWQ9XCJzZWxlY3RMaXN0XCIgY2xhc3M9XCJzdWdnZXN0aW9uLXdyYXBwZXJcIiByb2xlPVwibGlzdGJveFwiICpuZ0lmPVwic2hvd1N1Z2dlc3Rpb25cIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZmluYWxSZXN1bHRzKCkubGVuZ3RoID4gMFwiIGNsYXNzPVwibnh0LXN1Z2dlc3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaW5hbFJlc3VsdHMoKTsgdHJhY2tCeTogdHJhY2tCeUZuXCIgXG4gICAgICAgICAgIChjbGljayk9XCJjbGlja0l0ZW0oaXRlbSlcIiBcbiAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9uLWl0ZW1cIiBcbiAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsaWNrSXRlbShpdGVtKVwiXG4gICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cImNsaWNrSXRlbShpdGVtKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tZGV0YWlsc1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udGh1bWJuYWlsXCIgY2xhc3M9XCJ0aHVtYm5haWwtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaXRlbS50aHVtYm5haWxcIiBbYWx0XT1cIml0ZW0ubmFtZSArICcgYXZhdGFyJ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXRleHRcIj5cbiAgICAgICAgICAgICAgPCEtLSBQcmltYXJ5IHRleHQgKGZpcnN0IGtleSkgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRLZXlzKGdldFZhbHVlcyhpdGVtLCBTZWFyY2hJdGVtKSkubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLW5hbWUgcHJpbWFyeVwiIFxuICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KGdldFZhbHVlcyhpdGVtLCBTZWFyY2hJdGVtKVtnZXRLZXlzKGdldFZhbHVlcyhpdGVtLCBTZWFyY2hJdGVtKSlbMF1dLCBzZWFyY2hLZXlXb3JkKVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwhLS0gU2Vjb25kYXJ5IHRleHQgKHJlbWFpbmluZyBrZXlzKSAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tc2Vjb25kYXJ5XCIgKm5nSWY9XCJnZXRLZXlzKGdldFZhbHVlcyhpdGVtLCBTZWFyY2hJdGVtKSkubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRLZXlzKGdldFZhbHVlcyhpdGVtLCBTZWFyY2hJdGVtKSk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlY29uZGFyeS10ZXh0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChnZXRWYWx1ZXMoaXRlbSwgU2VhcmNoSXRlbSlba2V5XSwgc2VhcmNoS2V5V29yZClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvclwiICpuZ0lmPVwiaSA8IGdldEtleXMoZ2V0VmFsdWVzKGl0ZW0sIFNlYXJjaEl0ZW0pKS5sZW5ndGggLSAxXCI+IHwgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibm9SZXN1bHQgJiYgc2VhcmNoS2V5V29yZFwiIGNsYXNzPVwibm8tcmVzdWx0c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5vLXJlc3VsdHMtY29udGVudFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjFcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjhcIj48L2NpcmNsZT5cbiAgICAgICAgICA8cGF0aCBkPVwibTIxIDIxLTQuMzUtNC4zNVwiPjwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxwPk5vIHJlc3VsdHMgZm91bmQgZm9yIFwie3tzZWFyY2hLZXlXb3JkfX1cIjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==