@bpost/bp-address-auto-complete-by-component 1.1.6 → 1.1.7

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 (111) hide show
  1. package/VERSION.md +197 -0
  2. package/esm2022/lib/box-number/box-number.component.mjs +939 -0
  3. package/esm2022/lib/lib-address-autocomplete-by-component.component.mjs +1432 -0
  4. package/esm2022/lib/lib-address-autocomplete-by-component.module.mjs +45 -0
  5. package/esm2022/lib/lib-address-autocomplete-by-component.service.mjs +17 -0
  6. package/esm2022/lib/locality/locality.component.mjs +832 -0
  7. package/esm2022/lib/model/Box.mjs +35 -0
  8. package/esm2022/lib/model/Locality.mjs +35 -0
  9. package/esm2022/lib/model/Street.mjs +35 -0
  10. package/esm2022/lib/model/query-parameters.model.mjs +23 -0
  11. package/esm2022/lib/services/adress.service.mjs +69 -0
  12. package/esm2022/lib/services/http.service.mjs +61 -0
  13. package/esm2022/lib/services/locale.service.mjs +39 -0
  14. package/esm2022/lib/services/nis9.service.mjs +28 -0
  15. package/esm2022/lib/services/unicode.service.mjs +380 -0
  16. package/esm2022/lib/street/street.component.mjs +809 -0
  17. package/esm2022/lib/street-number/street-number.component.mjs +1026 -0
  18. package/{esm2020 → esm2022}/lib/utils/constants.mjs +2 -2
  19. package/esm2022/lib/utils/domhandler.mjs +51 -0
  20. package/esm2022/lib/utils/highlight-suggestion.pipe.mjs +76 -0
  21. package/esm2022/lib/utils/prefill-data.mjs +26 -0
  22. package/esm2022/lib/utils/prefilled-parameters.mjs +25 -0
  23. package/esm2022/lib/utils/preflll.event.mjs +9 -0
  24. package/esm2022/lib/utils/visible-suggestion.directive.mjs +41 -0
  25. package/{fesm2015 → fesm2022}/bpost-bp-address-auto-complete-by-component.mjs +1623 -1255
  26. package/fesm2022/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
  27. package/install-and-start-demo.bat +11 -0
  28. package/lib/box-number/box-number.component.d.ts +5 -1
  29. package/lib/lib-address-autocomplete-by-component.component.d.ts +8 -1
  30. package/lib/lib-address-autocomplete-by-component.module.d.ts +0 -15
  31. package/lib/locality/locality.component.d.ts +5 -1
  32. package/lib/street/street.component.d.ts +5 -1
  33. package/lib/street-number/street-number.component.d.ts +5 -1
  34. package/package.json +7 -13
  35. package/tutorial/aacwidget-tutorial/.editorconfig +16 -0
  36. package/tutorial/aacwidget-tutorial/angular.json +128 -0
  37. package/tutorial/aacwidget-tutorial/browserslist +13 -0
  38. package/tutorial/aacwidget-tutorial/e2e/protractor.conf.js +32 -0
  39. package/tutorial/aacwidget-tutorial/e2e/src/app.e2e-spec.ts +23 -0
  40. package/tutorial/aacwidget-tutorial/e2e/src/app.po.ts +11 -0
  41. package/tutorial/aacwidget-tutorial/e2e/tsconfig.json +13 -0
  42. package/tutorial/aacwidget-tutorial/karma.conf.js +32 -0
  43. package/tutorial/aacwidget-tutorial/package-lock.json +13314 -0
  44. package/tutorial/aacwidget-tutorial/src/app/app-routing.module.ts +18 -0
  45. package/tutorial/aacwidget-tutorial/src/app/app.component.html +6 -0
  46. package/tutorial/aacwidget-tutorial/src/app/app.component.scss +0 -0
  47. package/tutorial/aacwidget-tutorial/src/app/app.component.spec.ts +35 -0
  48. package/tutorial/aacwidget-tutorial/src/app/app.component.ts +28 -0
  49. package/tutorial/aacwidget-tutorial/src/app/app.module.ts +47 -0
  50. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.html +57 -0
  51. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.scss +0 -0
  52. package/tutorial/aacwidget-tutorial/src/app/widget-full/widget-full.component.ts +160 -0
  53. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.html +20 -0
  54. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.scss +0 -0
  55. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.spec.ts +25 -0
  56. package/tutorial/aacwidget-tutorial/src/app/widget-simple/widget-simple.component.ts +49 -0
  57. package/tutorial/aacwidget-tutorial/src/assets/.gitkeep +0 -0
  58. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/de.json +62 -0
  59. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/en.json +62 -0
  60. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/fr.json +62 -0
  61. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/i18n/nl.json +62 -0
  62. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/scss/aacwidget-custom.scss +81 -0
  63. package/tutorial/aacwidget-tutorial/src/assets/aacwidget/scss/aacwidget-default.scss +424 -0
  64. package/tutorial/aacwidget-tutorial/src/environments/environment.prod.ts +3 -0
  65. package/tutorial/aacwidget-tutorial/src/environments/environment.ts +16 -0
  66. package/tutorial/aacwidget-tutorial/src/favicon.ico +0 -0
  67. package/tutorial/aacwidget-tutorial/src/index.html +45 -0
  68. package/tutorial/aacwidget-tutorial/src/main.ts +12 -0
  69. package/tutorial/aacwidget-tutorial/src/polyfills.ts +63 -0
  70. package/tutorial/aacwidget-tutorial/src/styles.scss +4 -0
  71. package/tutorial/aacwidget-tutorial/src/test.ts +25 -0
  72. package/tutorial/aacwidget-tutorial/tsconfig.app.json +15 -0
  73. package/tutorial/aacwidget-tutorial/tsconfig.json +23 -0
  74. package/tutorial/aacwidget-tutorial/tsconfig.spec.json +18 -0
  75. package/tutorial/aacwidget-tutorial/tslint.json +148 -0
  76. package/tutorial/tutorial-videos.txt +41 -0
  77. package/esm2020/lib/box-number/box-number.component.mjs +0 -873
  78. package/esm2020/lib/lib-address-autocomplete-by-component.component.mjs +0 -1383
  79. package/esm2020/lib/lib-address-autocomplete-by-component.module.mjs +0 -65
  80. package/esm2020/lib/lib-address-autocomplete-by-component.service.mjs +0 -14
  81. package/esm2020/lib/locality/locality.component.mjs +0 -747
  82. package/esm2020/lib/model/Box.mjs +0 -30
  83. package/esm2020/lib/model/Locality.mjs +0 -30
  84. package/esm2020/lib/model/Street.mjs +0 -30
  85. package/esm2020/lib/model/query-parameters.model.mjs +0 -21
  86. package/esm2020/lib/services/adress.service.mjs +0 -64
  87. package/esm2020/lib/services/http.service.mjs +0 -57
  88. package/esm2020/lib/services/locale.service.mjs +0 -37
  89. package/esm2020/lib/services/nis9.service.mjs +0 -26
  90. package/esm2020/lib/services/unicode.service.mjs +0 -376
  91. package/esm2020/lib/street/street.component.mjs +0 -735
  92. package/esm2020/lib/street-number/street-number.component.mjs +0 -967
  93. package/esm2020/lib/utils/domhandler.mjs +0 -47
  94. package/esm2020/lib/utils/highlight-suggestion.pipe.mjs +0 -62
  95. package/esm2020/lib/utils/prefill-data.mjs +0 -24
  96. package/esm2020/lib/utils/prefilled-parameters.mjs +0 -23
  97. package/esm2020/lib/utils/preflll.event.mjs +0 -7
  98. package/esm2020/lib/utils/visible-suggestion.directive.mjs +0 -39
  99. package/fesm2015/bpost-bp-address-auto-complete-by-component.mjs.map +0 -1
  100. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs +0 -5592
  101. package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs.map +0 -1
  102. /package/{esm2020 → esm2022}/bpost-bp-address-auto-complete-by-component.mjs +0 -0
  103. /package/{esm2020 → esm2022}/lib/enum/address-level.enum.mjs +0 -0
  104. /package/{esm2020 → esm2022}/lib/enum/index.mjs +0 -0
  105. /package/{esm2020 → esm2022}/lib/enum/input-name.enum.mjs +0 -0
  106. /package/{esm2020 → esm2022}/lib/enum/source-type.enum.mjs +0 -0
  107. /package/{esm2020 → esm2022}/lib/enum/suggestion-level-type.enum.mjs +0 -0
  108. /package/{esm2020 → esm2022}/lib/enum/validation-message-option-type.enum.mjs +0 -0
  109. /package/{esm2020 → esm2022}/lib/enum/validation-message-type.enum.mjs +0 -0
  110. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  111. /package/{bpost-bp-address-auto-complete-by-component.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,809 @@
1
+ import { __values } from "tslib";
2
+ import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
3
+ import { ValidationMessageType } from '../enum/validation-message-type.enum';
4
+ import { DomHandler } from '../utils/domhandler';
5
+ import { ADDRESSLEVEL } from '../enum/address-level.enum';
6
+ import { QueryParameters } from '../model/query-parameters.model';
7
+ import { SourceType } from '../enum/source-type.enum';
8
+ import { PrefillEvent } from '../utils/preflll.event';
9
+ import { InputNameType } from '../enum/input-name.enum';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../services/adress.service";
12
+ import * as i2 from "../services/locale.service";
13
+ import * as i3 from "@ngx-translate/core";
14
+ import * as i4 from "../services/unicode.service";
15
+ var StreetComponent = /** @class */ (function () {
16
+ function StreetComponent(addressService, localeService, translateService, unicodeService) {
17
+ this.addressService = addressService;
18
+ this.localeService = localeService;
19
+ this.translateService = translateService;
20
+ this.unicodeService = unicodeService;
21
+ this.subscription = null;
22
+ // 2020-06-15
23
+ /* @Input()
24
+ onFocusShowSuggestionsAfterPrefill = true; */
25
+ this.labelResourceKey = 'common.label.streetName';
26
+ this.maxSuggesionCount = 5;
27
+ this.visibleSuggesionCount = 5;
28
+ this.sortCriteria = '';
29
+ this.showDebugMessageToConsole = true;
30
+ this.messageOption = 'Y';
31
+ this.isReadonly = false;
32
+ this.messageChanged = new EventEmitter();
33
+ this.addressChanged = new EventEmitter();
34
+ this.focusEvent = new EventEmitter();
35
+ this.blurEvent = new EventEmitter();
36
+ this.textChangeEvent = new EventEmitter();
37
+ this.clearInputEventEmitter = new EventEmitter();
38
+ this.prefillEventEmitter = new EventEmitter();
39
+ this.numberOfExceptionsEmitter = new EventEmitter();
40
+ this.validationMessageCode = null;
41
+ this.validationMessageOptions = null;
42
+ this.prefilling = false;
43
+ this.isPrefillWithNoMatch = false;
44
+ }
45
+ Object.defineProperty(StreetComponent.prototype, "inputLang", {
46
+ // @ts-ignore
47
+ set: function (val) {
48
+ var _this = this;
49
+ this.localeService.changeLang(val);
50
+ this.translateService.use(val).subscribe(function (res) {
51
+ _this.onChangedLanguage();
52
+ });
53
+ },
54
+ enumerable: false,
55
+ configurable: true
56
+ });
57
+ StreetComponent.prototype.ngOnInit = function () {
58
+ this.searchText = '';
59
+ // instance properties
60
+ this.addressIsValidated = false;
61
+ this.suggestionValidationMessage = '';
62
+ this.suggestions = [];
63
+ this.previousIndex = -1;
64
+ this.lastSearchValue = '';
65
+ this.wordList = [];
66
+ this.suggestionsWordList = [];
67
+ this.bpTypeAhead = '';
68
+ this.placeHolderText = '';
69
+ this.skipNextBlur = false; // OnBlur is triggered when the user clicks suggestion/validator button
70
+ this.errorCode = null;
71
+ // scope properties
72
+ this.selectedIndex = -1;
73
+ // properties
74
+ this.typeAheadWord = '';
75
+ this.collapseDropdown = false;
76
+ this.sequenceNumber = 1;
77
+ this.consumedNumber = 1;
78
+ // initialization
79
+ this.setSearchText('');
80
+ // this.setPlaceHolderText();
81
+ this.onChangedLanguage();
82
+ };
83
+ StreetComponent.prototype.ngOnDestroy = function () {
84
+ if (this.subscription) {
85
+ this.subscription.unsubscribe();
86
+ }
87
+ };
88
+ StreetComponent.prototype.onChangedLanguage = function () {
89
+ var _this = this;
90
+ // this.placeHolderText = this.translateService.instant('street.placeholder.input-placeholder');
91
+ this.translateService.get('street.placeholder.input-placeholder')
92
+ .subscribe(function (res) {
93
+ // console.log('new placeholder', res);
94
+ // => 'hello world'
95
+ _this.placeHolderText = res;
96
+ });
97
+ };
98
+ StreetComponent.prototype.ngAfterViewChecked = function () {
99
+ if (this.selectionChanged) {
100
+ var overlay_1 = this.streetList.nativeElement;
101
+ setTimeout(function () {
102
+ var listItem = DomHandler.findSingle(overlay_1, 'li.active');
103
+ if (listItem) {
104
+ DomHandler.scrollInView(overlay_1, listItem);
105
+ }
106
+ }, 1);
107
+ this.selectionChanged = false;
108
+ }
109
+ };
110
+ StreetComponent.prototype.ngOnChanges = function (changes) {
111
+ if (changes) {
112
+ if (changes.hasOwnProperty('prefillData') && !changes.prefillData.firstChange) {
113
+ this.prefilling = true;
114
+ this.searchText = this.loadParams(changes.prefillData.currentValue);
115
+ if (this.searchText !== '' && this.minLevel === ADDRESSLEVEL.STREET) {
116
+ /*
117
+ this.onInputChange('prefilled');
118
+ this.streetSearchInput.nativeElement.focus();
119
+ */
120
+ /*
121
+ this.prefilling = true;
122
+ this.collapseDropdown = true;
123
+ this.prefillMunicipalityName = this.transformMunicipalityInLowercaseAndWithoutDiacritics(this.addressParams.municipalityName);
124
+ this.onInputChange(/*'prefilled'* / // this.SOURCE_PREFILLED );
125
+ */
126
+ this.collapseDropdown = true;
127
+ this.prefillData.prefillStreetName
128
+ = this.transformStreetNameInLowercaseAndWithoutDiacritics(this.prefillData.parameters.streetName);
129
+ this.onInputChange(/*'prefilled'*/ SourceType.SOURCE_PREFILLED);
130
+ }
131
+ }
132
+ if (changes.hasOwnProperty('inputText') && !changes.inputText.firstChange) {
133
+ if (this.notEqualIgnoreCase(this.searchText, changes.inputText.currentValue)) {
134
+ this.clearWidget();
135
+ this.searchText = changes.inputText.currentValue;
136
+ }
137
+ }
138
+ // Reset Street search bar on locality change/reset
139
+ if (changes.hasOwnProperty('postalCode') && !changes.postalCode.firstChange && !changes.hasOwnProperty('prefillData')) {
140
+ this.minLevel = ADDRESSLEVEL.STREET;
141
+ if (changes.postalCode.currentValue === '') {
142
+ this.clearWidget();
143
+ this.valueChanged();
144
+ }
145
+ }
146
+ }
147
+ };
148
+ StreetComponent.prototype.transformStreetNameInLowercaseAndWithoutDiacritics = function (streetName) {
149
+ var result = null;
150
+ if (streetName !== null && streetName !== undefined) {
151
+ result = this.unicodeService.removeDiacritics(streetName);
152
+ result = result.toLowerCase();
153
+ }
154
+ if (this.showDebugMessageToConsole) {
155
+ console.log('prefill streetName', result);
156
+ }
157
+ return result;
158
+ };
159
+ StreetComponent.prototype.onClearInputEvent = function (event, focus) {
160
+ this.clearInput(focus);
161
+ };
162
+ StreetComponent.prototype.onBlur = function (ev) {
163
+ if (this.isBrowserIE() && this.isDropdownClicked(ev)) {
164
+ this.streetSearchInput.nativeElement.focus();
165
+ return;
166
+ }
167
+ if (this.skipNextBlur) {
168
+ this.skipNextBlur = false;
169
+ }
170
+ else {
171
+ this.collapseDropdown = true;
172
+ this.blurEvent.emit(ADDRESSLEVEL.STREET);
173
+ }
174
+ };
175
+ StreetComponent.prototype.isBrowserIE = function () {
176
+ return /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
177
+ };
178
+ StreetComponent.prototype.isDropdownClicked = function (ev) {
179
+ var target = ev.explicitOriginalTarget || document.activeElement;
180
+ return (target.id === 'bpaac-street-dropdown');
181
+ };
182
+ StreetComponent.prototype.onFocus = function () {
183
+ this.collapseDropdown = false;
184
+ // this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
185
+ // ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
186
+ if (this.showDebugMessageToConsole) {
187
+ console.log('street comp - onFocus', this.prefilling, this.prefillData, this.collapseDropdown);
188
+ }
189
+ // this.prefilling = false;
190
+ this.skipNextBlur = false;
191
+ this.focusEvent.emit(ADDRESSLEVEL.STREET);
192
+ };
193
+ StreetComponent.prototype.mayShowDropdown = function () {
194
+ return this.suggestions.length > 0 && !this.collapseDropdown;
195
+ };
196
+ StreetComponent.prototype.buildInputWordList = function () {
197
+ var e_1, _a, e_2, _b;
198
+ this.wordList = this.searchText.split(/[\s, ]+/);
199
+ // console.log('word list - street:', this.wordList);
200
+ if (this.suggestions && this.wordList) {
201
+ try {
202
+ for (var _c = __values(this.suggestions), _d = _c.next(); !_d.done; _d = _c.next()) {
203
+ var sug = _d.value;
204
+ if (!sug || !sug.hasOwnProperty('string')) {
205
+ continue;
206
+ }
207
+ var _loop_1 = function (w) {
208
+ var start = this_1.startsWithIgnoreDiacritics(sug.string, w);
209
+ if (start >= 0) {
210
+ var ww_1 = sug.string.substr(start, w.length);
211
+ // console.log('adding word:' + ww);
212
+ // ww is a candidate to be added to the wordlist if not already present in it
213
+ var present = this_1.wordList.find(function (w1) { return w1.toLowerCase() === ww_1.toLowerCase(); });
214
+ if (present === null || present === undefined) {
215
+ this_1.wordList.push(ww_1);
216
+ }
217
+ }
218
+ };
219
+ var this_1 = this;
220
+ try {
221
+ for (var _e = (e_2 = void 0, __values(this.wordList)), _f = _e.next(); !_f.done; _f = _e.next()) {
222
+ var w = _f.value;
223
+ _loop_1(w);
224
+ }
225
+ }
226
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
227
+ finally {
228
+ try {
229
+ if (_f && !_f.done && (_b = _e["return"])) _b.call(_e);
230
+ }
231
+ finally { if (e_2) throw e_2.error; }
232
+ }
233
+ }
234
+ }
235
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
236
+ finally {
237
+ try {
238
+ if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
239
+ }
240
+ finally { if (e_1) throw e_1.error; }
241
+ }
242
+ }
243
+ };
244
+ StreetComponent.prototype.startsWithIgnoreDiacritics = function (value, prefix) {
245
+ // console.log('Searching for prefix "' + prefix + '" inside suggestion: ' + value);
246
+ // tslint:disable-next-line:variable-name
247
+ var _value = this.unicodeService.removeDiacritics((value !== null && value !== undefined) ? value.toLowerCase() : value);
248
+ // tslint:disable-next-line:variable-name
249
+ var _prefix = this.unicodeService.removeDiacritics((prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix);
250
+ var start = _value.indexOf(_prefix);
251
+ // console.log('startsWithIgnoreDiacritics: ' + start);
252
+ return start;
253
+ };
254
+ StreetComponent.prototype.mayAddTypeAhead = function () {
255
+ if (this.searchText.length === 0) {
256
+ return false;
257
+ }
258
+ return (/[^\s, \\\/]$/).test(this.searchText);
259
+ };
260
+ StreetComponent.prototype.valueChanged = function () {
261
+ this.textChangeEvent.emit(this.searchText);
262
+ };
263
+ StreetComponent.prototype.buildTypeAhead = function (source) {
264
+ if (source === SourceType.SOURCE_PREFILLED) {
265
+ return false;
266
+ }
267
+ if (!this.mayAddTypeAhead()) {
268
+ return;
269
+ }
270
+ var searchTextWords = this.searchText.split(/[\s, ]+/);
271
+ var lastWord = searchTextWords[searchTextWords.length - 1];
272
+ if (this.suggestions.some(function (sug) {
273
+ if (!sug || !sug.hasOwnProperty('string')) {
274
+ return false;
275
+ }
276
+ return sug.string.split(/[\s-]+/).some(function (word) {
277
+ if (this.stringStartsWithIgnoreDiacritics(word, lastWord)) {
278
+ this.typeAheadWord = word;
279
+ return true;
280
+ }
281
+ }.bind(this));
282
+ }.bind(this))) {
283
+ var appendix = this.typeAheadWord.slice(lastWord.length, this.typeAheadWord.length).toLowerCase();
284
+ this.bpTypeAhead = this.searchText + appendix;
285
+ }
286
+ };
287
+ StreetComponent.prototype.stringStartsWithIgnoreDiacritics = function (value, prefix) {
288
+ // tslint:disable-next-line:variable-name
289
+ var _value = this.unicodeService.removeDiacritics((value !== null && value !== undefined) ? value.toLowerCase() : value);
290
+ // tslint:disable-next-line:variable-name
291
+ var _prefix = this.unicodeService.removeDiacritics((prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix);
292
+ var start = _value.slice(0, _prefix.length).toLowerCase().indexOf(_prefix) !== -1;
293
+ return start;
294
+ };
295
+ StreetComponent.prototype.getTopSuggestions = function (source) {
296
+ var _this = this;
297
+ this.sequenceNumber += 1;
298
+ var param = this.generateParameters();
299
+ if (this.showDebugMessageToConsole) {
300
+ console.log('STREET calling service params', param);
301
+ }
302
+ if (this.searchText) {
303
+ this.subscription = this.addressService.getStreet(this.baseUrl, this.locality, this.postalCode, param)
304
+ .subscribe(function (response) {
305
+ _this.handleGetStreetResponse(response, source);
306
+ if (source === SourceType.SOURCE_PREFILLED) {
307
+ _this.isPrefillWithNoMatch = _this.prefillData.prefillStreetPerfectMatchFound === true ? false : true;
308
+ _this.prefillAnalyzeData();
309
+ }
310
+ else {
311
+ _this.isPrefillWithNoMatch = false;
312
+ }
313
+ }, function () { return _this.handleGetStreetError(); });
314
+ }
315
+ };
316
+ StreetComponent.prototype.getTextColor = function () {
317
+ return (this.isPrefillWithNoMatch === true) ? 'orangered' : '';
318
+ };
319
+ StreetComponent.prototype.loadParams = function (prefillData) {
320
+ var concatStr = '';
321
+ if (prefillData !== null && prefillData.parameters !== null) {
322
+ if (prefillData.parameters.hasOwnProperty('minLevel')) {
323
+ this.minLevel = prefillData.parameters.minLevel;
324
+ }
325
+ /*
326
+ if (params.hasOwnProperty('unstructuredAddress') && this.isString(params.unstructuredAddress)) {
327
+ this.valueChanged();
328
+ }
329
+ */
330
+ if (prefillData.parameters.hasOwnProperty('postalCode') && this.isString(prefillData.parameters.postalCode)) {
331
+ this.postalCode = prefillData.parameters.postalCode;
332
+ }
333
+ if (prefillData.parameters.hasOwnProperty('municipalityName') && this.isString(prefillData.parameters.municipalityName)) {
334
+ this.locality = prefillData.parameters.municipalityName;
335
+ }
336
+ if (prefillData.parameters.hasOwnProperty('streetName')
337
+ && this.isString(prefillData.parameters.streetName) && this.isParamsComplete()) {
338
+ concatStr = prefillData.parameters.streetName;
339
+ }
340
+ }
341
+ return concatStr;
342
+ };
343
+ StreetComponent.prototype.isString = function (val) {
344
+ if (val === null || val === undefined) {
345
+ return false;
346
+ }
347
+ return val.constructor === String;
348
+ };
349
+ StreetComponent.prototype.isValid = function (val) {
350
+ return this.isString(val) && val !== '';
351
+ };
352
+ StreetComponent.prototype.isParamsComplete = function () {
353
+ if (!this.validatedByBackend) {
354
+ return this.isValid(this.postalCode) || this.isValid(this.locality);
355
+ }
356
+ else {
357
+ return this.isValid(this.postalCode) && this.isValid(this.locality);
358
+ }
359
+ };
360
+ StreetComponent.prototype.generateParameters = function () {
361
+ var param = new QueryParameters({
362
+ id: this.sequenceNumber,
363
+ q: this.searchText,
364
+ postalCode: this.postalCode,
365
+ locality: this.locality,
366
+ maxNumberOfSuggestions: this.maxSuggesionCount
367
+ });
368
+ if (this.sortCriteria === 'S') {
369
+ param.sortByStreet(true);
370
+ }
371
+ return param;
372
+ };
373
+ StreetComponent.prototype.handleGetStreetResponse = function (data, source) {
374
+ if (data && data.response && data.response.sequenceNumber && data.response.sequenceNumber >= this.consumedNumber &&
375
+ data.response.topSuggestions) {
376
+ this.consumedNumber = data.response.sequenceNumber;
377
+ this.clearSuggestions();
378
+ this.parseTopSuggestions(data.response.topSuggestions, source);
379
+ this.buildTypeAhead(source);
380
+ this.clearConnectionErrorMessage();
381
+ this.buildInputWordList();
382
+ }
383
+ this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
384
+ ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
385
+ };
386
+ StreetComponent.prototype.handleGetStreetError = function () {
387
+ if (this.allowNoValidation && this.validatedByBackend) {
388
+ this.numberOfExceptions += 1;
389
+ this.numberOfExceptionsEmitter.emit(this.numberOfExceptions);
390
+ }
391
+ this.setConnectionErrorMessage();
392
+ };
393
+ StreetComponent.prototype.setConnectionErrorMessage = function () {
394
+ this.errorCode = /*'service-unavailable'*/ ValidationMessageType.Service_Unavailable;
395
+ // this.setValidationMessage(this.errorCode);
396
+ this.emitTranslatedValidationMessage(ValidationMessageType.Service_Unavailable);
397
+ };
398
+ StreetComponent.prototype.clearConnectionErrorMessage = function () {
399
+ if (this.errorCode) {
400
+ var res = this.translateService.instant(this.errorCode);
401
+ if (this.suggestionValidationMessage === res) {
402
+ this.clearSuggestionValidationMessage();
403
+ }
404
+ this.errorCode = null;
405
+ }
406
+ };
407
+ StreetComponent.prototype.parseTopSuggestions = function (topSuggestions, source) {
408
+ var e_3, _a;
409
+ if (topSuggestions.constructor === Array) {
410
+ try {
411
+ // topSuggestions.forEach(this.parseSingleSuggestion.bind(this));
412
+ for (var topSuggestions_1 = __values(topSuggestions), topSuggestions_1_1 = topSuggestions_1.next(); !topSuggestions_1_1.done; topSuggestions_1_1 = topSuggestions_1.next()) {
413
+ var sug = topSuggestions_1_1.value;
414
+ this.parseSingleSuggestion(sug, source);
415
+ }
416
+ }
417
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
418
+ finally {
419
+ try {
420
+ if (topSuggestions_1_1 && !topSuggestions_1_1.done && (_a = topSuggestions_1["return"])) _a.call(topSuggestions_1);
421
+ }
422
+ finally { if (e_3) throw e_3.error; }
423
+ }
424
+ }
425
+ else {
426
+ this.parseSingleSuggestion(topSuggestions, source);
427
+ }
428
+ };
429
+ StreetComponent.prototype.parseSingleSuggestion = function (suggestion, source) {
430
+ var suggestionToAdd;
431
+ if (this.localeService.isLocaleFrench() && suggestion.hasOwnProperty('french')) {
432
+ suggestionToAdd = suggestion.french;
433
+ }
434
+ else if (this.localeService.isLocaleDutch() && suggestion.hasOwnProperty('dutch')) {
435
+ suggestionToAdd = suggestion.dutch;
436
+ }
437
+ else if (this.localeService.isLocaleGerman() && suggestion.hasOwnProperty('german')) {
438
+ suggestionToAdd = suggestion.german;
439
+ }
440
+ else if (suggestion.hasOwnProperty('address')) {
441
+ suggestionToAdd = suggestion.address;
442
+ }
443
+ if (suggestionToAdd) {
444
+ if (suggestion.messages) {
445
+ suggestionToAdd.messages = suggestion.messages;
446
+ }
447
+ this.suggestions.push(suggestionToAdd);
448
+ if (source === SourceType.SOURCE_PREFILLED) {
449
+ suggestion.address = suggestionToAdd;
450
+ this.prefillCheckForPerfectMatch(suggestion);
451
+ }
452
+ }
453
+ };
454
+ StreetComponent.prototype.prefillCheckForPerfectMatch = function (suggestion) {
455
+ if (this.showDebugMessageToConsole) {
456
+ console.log('street - checking suggestion for perfect match', this.prefillData, suggestion);
457
+ }
458
+ var sugAddress = suggestion.address;
459
+ // if (sugAddress.streetName === this.prefillData.parameters.streetName )
460
+ var suggestionLocality = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.localityName);
461
+ var suggestionMunicipality = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.municipalityName);
462
+ if (suggestionLocality === this.prefillData.prefillMunicipalityName
463
+ || suggestionMunicipality === this.prefillData.prefillMunicipalityName) {
464
+ var suggestionStreetName = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.streetName);
465
+ // console.log('comparing street names', suggestionStreetName, this.prefillData.prefillStreetName);
466
+ if (suggestionStreetName === this.prefillData.prefillStreetName) {
467
+ this.prefillData.prefillStreetPerfectMatchFound = true;
468
+ this.prefillData.prefillStreetPerfectMatchSuggestion = suggestion;
469
+ this.searchText = sugAddress.streetName;
470
+ }
471
+ if (this.prefillData.prefillStreetPerfectMatchFound === true) {
472
+ if (this.showDebugMessageToConsole) {
473
+ console.log('STREET - PREFILL - Perfect match - street:', suggestion);
474
+ }
475
+ }
476
+ else {
477
+ if (this.showDebugMessageToConsole) {
478
+ console.log('STREET - PREFILL - NO Perfect match:', suggestion);
479
+ }
480
+ }
481
+ }
482
+ };
483
+ StreetComponent.prototype.onInputChange = function (source) {
484
+ // console.log('street onInputChange : source ', source);
485
+ this.collapseDropdown = false;
486
+ this.resetArrowSelectedIndex();
487
+ if (!source) {
488
+ this.prefilling = false;
489
+ this.valueChanged();
490
+ }
491
+ this.clearSuggestionValidationMessage();
492
+ if (this.searchText === '') {
493
+ this.sequenceNumber += 1;
494
+ this.consumedNumber = this.sequenceNumber;
495
+ this.clearSuggestions();
496
+ }
497
+ else {
498
+ if (!this.validatedByBackend) {
499
+ var suggestion = {
500
+ 'string': this.searchText.toUpperCase(),
501
+ 'municipalityName': this.locality ? this.locality.toLocaleUpperCase() : '',
502
+ 'localityName': this.locality ? this.locality.toLocaleUpperCase() : '',
503
+ 'postalCode': this.postalCode,
504
+ 'searchBarString': this.searchText.toUpperCase(),
505
+ 'streetName': this.searchText.toUpperCase()
506
+ };
507
+ this.setSelectedAddress(suggestion);
508
+ }
509
+ else {
510
+ this.getTopSuggestions(source);
511
+ }
512
+ }
513
+ this.buildInputWordList();
514
+ };
515
+ StreetComponent.prototype.prefillAnalyzeData = function () {
516
+ if (this.prefillData.prefillStreetPerfectMatchFound === true) {
517
+ this.collapseDropdown = true;
518
+ }
519
+ this.prefillEventEmitter.emit(new PrefillEvent(ADDRESSLEVEL.STREET, this.prefillData));
520
+ };
521
+ StreetComponent.prototype.clickSuggestion = function (event, suggestion) {
522
+ this.isPrefillWithNoMatch = false;
523
+ if (this.showDebugMessageToConsole) {
524
+ console.log('streetNumber::clickSuggestion', event, suggestion);
525
+ }
526
+ event === null || event === void 0 ? void 0 : event.preventDefault();
527
+ this.clearTypeAhead();
528
+ this.resetArrowSelectedIndex();
529
+ this.setSearchText(suggestion.string);
530
+ this.collapseDropdown = true;
531
+ // if (suggestion.hasOwnProperty('isComplete')) {
532
+ // this.showAddressIsValidated();
533
+ // }
534
+ this.addressIsValidated = true;
535
+ if (event) {
536
+ this.clearSuggestions();
537
+ }
538
+ this.setSelectedAddress(suggestion);
539
+ };
540
+ StreetComponent.prototype.setSelectedAddress = function (suggestion) {
541
+ this.addressChanged.emit(suggestion);
542
+ };
543
+ StreetComponent.prototype.clearSelectedAddress = function () {
544
+ this.addressChanged.emit(null);
545
+ this.addressIsValidated = false;
546
+ };
547
+ StreetComponent.prototype.emitTranslatedValidationMessage = function (validationMessageType, options) {
548
+ // Momently, options are NOT used; so data type of these options will be reviewed once needed.
549
+ if (validationMessageType === null || validationMessageType === undefined) {
550
+ console.warn('Unable to emit validation message - message key is invalid!', validationMessageType);
551
+ return;
552
+ }
553
+ switch (validationMessageType) {
554
+ case ValidationMessageType.Address_Not_Found:
555
+ case ValidationMessageType.Address_Validated:
556
+ case ValidationMessageType.Service_Unavailable:
557
+ {
558
+ var message = this.translateService.instant(validationMessageType);
559
+ // this.messageChanged.emit(message);
560
+ this.messageChanged.emit({ messageType: validationMessageType, translatedMessage: message });
561
+ }
562
+ // tslint:disable-next-line:align
563
+ break;
564
+ default:
565
+ {
566
+ console.error('Unable to emit validation message - message key NOT supported!', validationMessageType);
567
+ }
568
+ // tslint:disable-next-line:align
569
+ break;
570
+ }
571
+ };
572
+ StreetComponent.prototype.showAddressIsValidated = function () {
573
+ // this.setValidationMessage('address-validated');
574
+ this.emitTranslatedValidationMessage(ValidationMessageType.Address_Validated);
575
+ };
576
+ StreetComponent.prototype.checkKeyDown = function (event) {
577
+ switch (event.which) {
578
+ // down key, increment selectedIndex
579
+ case 40:
580
+ event.preventDefault();
581
+ this.moveArrowSelectedIndexDown();
582
+ break;
583
+ // up key, decrement selectedIndex
584
+ case 38:
585
+ event.preventDefault();
586
+ this.moveArrowSelectedIndexUp();
587
+ break;
588
+ // right arrow key
589
+ case 39:
590
+ event.preventDefault();
591
+ if (this.cursorIsOnSuggestionList()) {
592
+ this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
593
+ }
594
+ else {
595
+ if (this.typeAheadWord && this.typeAheadIsShown()) {
596
+ this.setSearchText(this.bpTypeAhead);
597
+ this.typeAheadWord = '';
598
+ }
599
+ }
600
+ break;
601
+ // tab key
602
+ case 9:
603
+ if (!this.addressIsValidated && !event.shiftKey) {
604
+ event.preventDefault();
605
+ this.selectFirstInListOfSuggesions();
606
+ }
607
+ break;
608
+ case 46:
609
+ if (event.ctrlKey) {
610
+ this.clearWidget();
611
+ }
612
+ break;
613
+ // enter pressed
614
+ case 13:
615
+ event.preventDefault();
616
+ if (this.cursorIsOnSuggestionList()) {
617
+ this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
618
+ }
619
+ else {
620
+ }
621
+ break;
622
+ default:
623
+ this.clearTypeAhead();
624
+ break;
625
+ }
626
+ };
627
+ StreetComponent.prototype.clearWidget = function () {
628
+ this.addressIsValidated = false;
629
+ this.clearSearchText();
630
+ this.clearSuggestions();
631
+ this.clearTypeAhead();
632
+ this.prefillData = null;
633
+ this.prefilling = false;
634
+ };
635
+ StreetComponent.prototype.clearSearchText = function () {
636
+ this.searchText = '';
637
+ };
638
+ StreetComponent.prototype.typeAheadIsShown = function () {
639
+ return this.bpTypeAhead && this.bpTypeAhead.length > 0;
640
+ };
641
+ StreetComponent.prototype.resetArrowSelectedIndex = function () {
642
+ this.selectedIndex = -1;
643
+ };
644
+ StreetComponent.prototype.moveArrowSelectedIndexDown = function () {
645
+ if (this.selectedIndex + 1 !== this.suggestions.length) {
646
+ this.selectedIndex++;
647
+ this.changeSelection();
648
+ this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
649
+ }
650
+ };
651
+ StreetComponent.prototype.moveArrowSelectedIndexUp = function () {
652
+ if (this.selectedIndex - 1 !== -2) {
653
+ this.selectedIndex--;
654
+ this.changeSelection();
655
+ this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex + 1);
656
+ }
657
+ };
658
+ StreetComponent.prototype.cursorIsOnSuggestionList = function () {
659
+ return this.selectedIndex >= 0;
660
+ };
661
+ StreetComponent.prototype.setSearchTextBasedOnArrowSelection = function (newVal, oldVal) {
662
+ if (newVal === undefined || this.suggestions.length <= 0) {
663
+ return;
664
+ }
665
+ if (newVal !== -1) {
666
+ if (oldVal === -1) {
667
+ this.lastSearchValue = this.searchText;
668
+ }
669
+ this.setSearchText(this.suggestions[this.selectedIndex].string);
670
+ this.clearTypeAhead();
671
+ }
672
+ else {
673
+ this.setSearchText(this.lastSearchValue);
674
+ }
675
+ };
676
+ StreetComponent.prototype.mayShowClearButton = function () {
677
+ return this.searchText.length > 0;
678
+ };
679
+ StreetComponent.prototype.clearInput = function (focus, emit) {
680
+ if (emit === void 0) { emit = true; }
681
+ // console.warn('street clearInput called ...', focus, emit);
682
+ this.clearWidget();
683
+ this.resetArrowSelectedIndex();
684
+ this.previousIndex = -1;
685
+ this.lastSearchValue = '';
686
+ this.clearSuggestionValidationMessage();
687
+ this.valueChanged();
688
+ this.clearConnectionErrorMessage();
689
+ if (focus === true) {
690
+ // console.warn('street clearInput - set focus !!!', focus);
691
+ this.streetSearchInput.nativeElement.focus();
692
+ }
693
+ if (emit) {
694
+ this.clearInputEventEmitter.emit(/*'STREET'*/ InputNameType.STREET);
695
+ }
696
+ };
697
+ StreetComponent.prototype.clearSuggestions = function () {
698
+ this.wordList = [];
699
+ this.suggestions = [];
700
+ this.suggestionsWordList = [];
701
+ };
702
+ StreetComponent.prototype.clearTypeAhead = function () {
703
+ this.bpTypeAhead = '';
704
+ };
705
+ StreetComponent.prototype.clearSuggestionValidationMessage = function () {
706
+ this.suggestionValidationMessage = '';
707
+ this.addressIsValidated = false;
708
+ // this.messageChanged.emit(this.suggestionValidationMessage);
709
+ this.messageChanged.emit({ messageType: null, translatedMessage: this.suggestionValidationMessage });
710
+ this.validationMessageOptions = null;
711
+ this.validationMessageCode = null;
712
+ };
713
+ StreetComponent.prototype.setSearchText = function (value) {
714
+ this.searchText = value;
715
+ };
716
+ StreetComponent.prototype.selectFirstInListOfSuggesions = function () {
717
+ this.selectedIndex = 0;
718
+ this.changeSelection();
719
+ this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
720
+ };
721
+ StreetComponent.prototype.changeSelection = function () {
722
+ if (this.suggestions.length > 0) {
723
+ this.selectionChanged = true;
724
+ }
725
+ };
726
+ StreetComponent.prototype.suggestionMouseLeave = function () {
727
+ this.selectedIndex = -1;
728
+ };
729
+ StreetComponent.prototype.notEqualIgnoreCase = function (oldVal, newVal) {
730
+ return oldVal.toLowerCase() !== newVal.toLowerCase();
731
+ };
732
+ StreetComponent.prototype.showAddressNotFoundMessage = function () {
733
+ // this.setValidationMessage('address-not-found');
734
+ this.emitTranslatedValidationMessage(ValidationMessageType.Address_Not_Found);
735
+ };
736
+ StreetComponent.prototype.isDisabled = function () {
737
+ return (this.locality === '' || this.postalCode === '' || this.minLevel > ADDRESSLEVEL.STREET);
738
+ };
739
+ StreetComponent.prototype.onInputClick = function () {
740
+ if (this.showDebugMessageToConsole) {
741
+ console.log('street click');
742
+ }
743
+ this.prefilling = false;
744
+ this.collapseDropdown = false;
745
+ };
746
+ StreetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: StreetComponent, deps: [{ token: i1.AddressService }, { token: i2.LocaleService }, { token: i3.TranslateService }, { token: i4.UnicodeService }], target: i0.ɵɵFactoryTarget.Component });
747
+ StreetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: StreetComponent, selector: "bp-street", inputs: { labelResourceKey: "labelResourceKey", maxSuggesionCount: "maxSuggesionCount", visibleSuggesionCount: "visibleSuggesionCount", sortCriteria: "sortCriteria", baseUrl: "baseUrl", prefillData: "prefillData", showDebugMessageToConsole: "showDebugMessageToConsole", postalCode: "postalCode", locality: "locality", inputText: "inputText", messageOption: "messageOption", allowNoValidation: "allowNoValidation", validatedByBackend: "validatedByBackend", numberOfExceptions: "numberOfExceptions", inputLang: "inputLang", isReadonly: "isReadonly" }, outputs: { messageChanged: "messageChanged", addressChanged: "addressChanged", focusEvent: "focusEvent", blurEvent: "blurEvent", textChangeEvent: "textChangeEvent", clearInputEventEmitter: "clearInputEventEmitter", prefillEventEmitter: "prefillEventEmitter", numberOfExceptionsEmitter: "numberOfExceptionsEmitter" }, viewQueries: [{ propertyName: "streetSearchInput", first: true, predicate: ["streetSearchInput"], descendants: true }, { propertyName: "streetList", first: true, predicate: ["streetList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #streetSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"(validatedByBackend && (!locality || locality.trim().length === 0)) \n || (!validatedByBackend && ((!postalCode || postalCode.trim().length === 0) && (!locality || locality.trim().length === 0)))\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"streetInputField\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-street-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-street-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #streetList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-street-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-street-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [""] });
748
+ return StreetComponent;
749
+ }());
750
+ export { StreetComponent };
751
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: StreetComponent, decorators: [{
752
+ type: Component,
753
+ args: [{ selector: 'bp-street', template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #streetSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"(validatedByBackend && (!locality || locality.trim().length === 0)) \n || (!validatedByBackend && ((!postalCode || postalCode.trim().length === 0) && (!locality || locality.trim().length === 0)))\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"streetInputField\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-street-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-street-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #streetList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-street-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-street-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [""] }]
754
+ }], ctorParameters: function () { return [{ type: i1.AddressService }, { type: i2.LocaleService }, { type: i3.TranslateService }, { type: i4.UnicodeService }]; }, propDecorators: { streetSearchInput: [{
755
+ type: ViewChild,
756
+ args: ['streetSearchInput', { static: false }]
757
+ }], streetList: [{
758
+ type: ViewChild,
759
+ args: ['streetList', { static: false }]
760
+ }], labelResourceKey: [{
761
+ type: Input
762
+ }], maxSuggesionCount: [{
763
+ type: Input
764
+ }], visibleSuggesionCount: [{
765
+ type: Input
766
+ }], sortCriteria: [{
767
+ type: Input
768
+ }], baseUrl: [{
769
+ type: Input
770
+ }], prefillData: [{
771
+ type: Input
772
+ }], showDebugMessageToConsole: [{
773
+ type: Input
774
+ }], postalCode: [{
775
+ type: Input
776
+ }], locality: [{
777
+ type: Input
778
+ }], inputText: [{
779
+ type: Input
780
+ }], messageOption: [{
781
+ type: Input
782
+ }], allowNoValidation: [{
783
+ type: Input
784
+ }], validatedByBackend: [{
785
+ type: Input
786
+ }], numberOfExceptions: [{
787
+ type: Input
788
+ }], inputLang: [{
789
+ type: Input
790
+ }], isReadonly: [{
791
+ type: Input
792
+ }], messageChanged: [{
793
+ type: Output
794
+ }], addressChanged: [{
795
+ type: Output
796
+ }], focusEvent: [{
797
+ type: Output
798
+ }], blurEvent: [{
799
+ type: Output
800
+ }], textChangeEvent: [{
801
+ type: Output
802
+ }], clearInputEventEmitter: [{
803
+ type: Output
804
+ }], prefillEventEmitter: [{
805
+ type: Output
806
+ }], numberOfExceptionsEmitter: [{
807
+ type: Output
808
+ }] } });
809
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQvc3JjL2xpYi9zdHJlZXQvc3RyZWV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQvc3JjL2xpYi9zdHJlZXQvc3RyZWV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUQsTUFBTSxlQUFlLENBQUM7QUFHN0osT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFLN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQUV4RDtJQW9GRSx5QkFDVSxjQUE4QixFQUM5QixhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsY0FBOEI7UUFIOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBOUVoQyxpQkFBWSxHQUFpQixJQUFJLENBQUM7UUFFMUMsYUFBYTtR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aW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcmVmaWxsZWRQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvcHJlZmlsbGVkLXBhcmFtZXRlcnMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi4vZW51bS92YWxpZGF0aW9uLW1lc3NhZ2UtdHlwZS5lbnVtJztcbmltcG9ydCB7IEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWRyZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdW5pY29kZS5zZXJ2aWNlJztcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICcuLi91dGlscy9kb21oYW5kbGVyJztcbmltcG9ydCB7IEFERFJFU1NMRVZFTCB9IGZyb20gJy4uL2VudW0vYWRkcmVzcy1sZXZlbC5lbnVtJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1ldGVycyB9IGZyb20gJy4uL21vZGVsL3F1ZXJ5LXBhcmFtZXRlcnMubW9kZWwnO1xuaW1wb3J0IHsgUHJlZmlsbERhdGEgfSBmcm9tICcuLi91dGlscy9wcmVmaWxsLWRhdGEnO1xuaW1wb3J0IHsgU291cmNlVHlwZSB9IGZyb20gJy4uL2VudW0vc291cmNlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQcmVmaWxsRXZlbnQgfSBmcm9tICcuLi91dGlscy9wcmVmbGxsLmV2ZW50JztcbmltcG9ydCB7IElucHV0TmFtZVR5cGUgfSBmcm9tICcuLi9lbnVtL2lucHV0LW5hbWUuZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLXN0cmVldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdHJlZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHJlZXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdHJlZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdzdHJlZXRTZWFyY2hJbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSApIHN0cmVldFNlYXJjaElucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzdHJlZXRMaXN0Jywge3N0YXRpYzogZmFsc2V9ICkgc3RyZWV0TGlzdDogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAvLyAyMDIwLTA2LTE1XG4gIC8qICBASW5wdXQoKVxuICBvbkZvY3VzU2hvd1N1Z2dlc3Rpb25zQWZ0ZXJQcmVmaWxsID0gdHJ1ZTsgKi9cblxuICBASW5wdXQoKSBsYWJlbFJlc291cmNlS2V5ID0gJ2NvbW1vbi5sYWJlbC5zdHJlZXROYW1lJztcbiAgQElucHV0KCkgbWF4U3VnZ2VzaW9uQ291bnQgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzaW9uQ291bnQgPSA1O1xuICBASW5wdXQoKSBzb3J0Q3JpdGVyaWEgPSAnJztcbiAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nO1xuICAvLyBASW5wdXQoKSBhZGRyZXNzUGFyYW1zOiBQcmVmaWxsZWRQYXJhbWV0ZXJzO1xuICBASW5wdXQoKSBwcmVmaWxsRGF0YTogUHJlZmlsbERhdGE7XG4gIEBJbnB1dCgpIHNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHBvc3RhbENvZGU6IHN0cmluZztcbiAgQElucHV0KCkgbG9jYWxpdHk6IHN0cmluZztcbiAgQElucHV0KCkgaW5wdXRUZXh0OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbWVzc2FnZU9wdGlvbiA9ICdZJztcbiAgQElucHV0KCkgYWxsb3dOb1ZhbGlkYXRpb246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHZhbGlkYXRlZEJ5QmFja2VuZDogYm9vbGVhbjtcbiAgQElucHV0KCkgbnVtYmVyT2ZFeGNlcHRpb25zOiBudW1iZXI7XG4gIC8vIEB0cy1pZ25vcmVcbiAgQElucHV0KCkgc2V0IGlucHV0TGFuZyh2YWw6IHN0cmluZykge1xuICAgIHRoaXMubG9jYWxlU2VydmljZS5jaGFuZ2VMYW5nKHZhbCk7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZSh2YWwpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlZExhbmd1YWdlKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGlzUmVhZG9ubHk9ZmFsc2U7XG5cbiAgQE91dHB1dCgpIG1lc3NhZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8e21lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmd9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFkZHJlc3NDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgYmx1ckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRleHRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGNsZWFySW5wdXRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBwcmVmaWxsRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8UHJlZmlsbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UHJlZmlsbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgbnVtYmVyT2ZFeGNlcHRpb25zRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPW5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBcbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xuXG4gIGFkZHJlc3NJc1ZhbGlkYXRlZDogYm9vbGVhbjtcbiAgc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gIHN1Z2dlc3Rpb25zOiBhbnk7XG4gIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgbGFzdFNlYXJjaFZhbHVlOiBzdHJpbmc7XG4gIHdvcmRMaXN0OiBhbnk7XG4gIHN1Z2dlc3Rpb25zV29yZExpc3Q6IGFueTtcbiAgYnBUeXBlQWhlYWQ6IHN0cmluZztcbiAgcGxhY2VIb2xkZXJUZXh0OiBzdHJpbmc7XG4gIHNraXBOZXh0Qmx1cjogYm9vbGVhbjsgLy8gT25CbHVyIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzdWdnZXN0aW9uL3ZhbGlkYXRvciBidXR0b25cbiAgZXJyb3JDb2RlOiBhbnk7XG5cbiAgbWluTGV2ZWw6IG51bWJlcjtcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICBjb2xsYXBzZURyb3Bkb3duOiBib29sZWFuO1xuICB0eXBlQWhlYWRXb3JkOiBzdHJpbmc7XG4gIHNlcXVlbmNlTnVtYmVyOiBudW1iZXI7XG4gIGNvbnN1bWVkTnVtYmVyOiBudW1iZXI7XG4gIHNlbGVjdGlvbkNoYW5nZWQ6IGJvb2xlYW47XG4gIHZhbGlkYXRpb25NZXNzYWdlQ29kZSA9IG51bGw7XG4gIHZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG5cbiAgcHJlZmlsbGluZyA9IGZhbHNlO1xuICBpc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWRkcmVzc1NlcnZpY2U6IEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1bmljb2RlU2VydmljZTogVW5pY29kZVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAvLyBpbnN0YW5jZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSAtMTtcbiAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMud29yZExpc3QgPSBbXTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zV29yZExpc3QgPSBbXTtcbiAgICB0aGlzLmJwVHlwZUFoZWFkID0gJyc7XG4gICAgdGhpcy5wbGFjZUhvbGRlclRleHQgPSAnJztcbiAgICB0aGlzLnNraXBOZXh0Qmx1ciA9IGZhbHNlOyAvLyBPbkJsdXIgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHN1Z2dlc3Rpb24vdmFsaWRhdG9yIGJ1dHRvblxuICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICAvLyBzY29wZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgLy8gcHJvcGVydGllc1xuICAgIHRoaXMudHlwZUFoZWFkV29yZCA9ICcnO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgPSAxO1xuICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSAxO1xuICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5zZXRTZWFyY2hUZXh0KCcnKTtcbiAgICAvLyB0aGlzLnNldFBsYWNlSG9sZGVyVGV4dCgpO1xuICAgIHRoaXMub25DaGFuZ2VkTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZWRMYW5ndWFnZSgpIHtcbiAgICAvLyB0aGlzLnBsYWNlSG9sZGVyVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzdHJlZXQucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdzdHJlZXQucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ25ldyBwbGFjZWhvbGRlcicsIHJlcyk7XG4gICAgICAgIC8vID0+ICdoZWxsbyB3b3JsZCdcbiAgICAgICAgdGhpcy5wbGFjZUhvbGRlclRleHQgPSByZXM7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCkge1xuICAgICAgY29uc3Qgb3ZlcmxheTogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnN0cmVldExpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShvdmVybGF5LCAnbGkuYWN0aXZlJyk7XG4gICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgIERvbUhhbmRsZXIuc2Nyb2xsSW5WaWV3KG92ZXJsYXksIGxpc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSwgMSk7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdwcmVmaWxsRGF0YScpICYmICFjaGFuZ2VzLnByZWZpbGxEYXRhLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMucHJlZmlsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMubG9hZFBhcmFtcyhjaGFuZ2VzLnByZWZpbGxEYXRhLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRleHQgIT09ICcnICYmIHRoaXMubWluTGV2ZWwgPT09IEFERFJFU1NMRVZFTC5TVFJFRVQpIHtcbiAgICAgICAgICAvKlxuICAgICAgICAgIHRoaXMub25JbnB1dENoYW5nZSgncHJlZmlsbGVkJyk7XG4gICAgICAgICAgdGhpcy5zdHJlZXRTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgKi9cbiAgICAgICAgIC8qXG4gICAgICAgICAgdGhpcy5wcmVmaWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSB0cnVlO1xuICAgICAgICAgIHRoaXMucHJlZmlsbE11bmljaXBhbGl0eU5hbWUgID0gdGhpcy50cmFuc2Zvcm1NdW5pY2lwYWxpdHlJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHRoaXMuYWRkcmVzc1BhcmFtcy5tdW5pY2lwYWxpdHlOYW1lKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyogLyAvLyB0aGlzLlNPVVJDRV9QUkVGSUxMRUQgKTtcbiAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TmFtZVxuICAgICAgICAgICAgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyovIFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdpbnB1dFRleHQnKSAmJiAhY2hhbmdlcy5pbnB1dFRleHQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMubm90RXF1YWxJZ25vcmVDYXNlKHRoaXMuc2VhcmNoVGV4dCwgY2hhbmdlcy5pbnB1dFRleHQuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBjaGFuZ2VzLmlucHV0VGV4dC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgU3RyZWV0IHNlYXJjaCBiYXIgb24gbG9jYWxpdHkgY2hhbmdlL3Jlc2V0XG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgncG9zdGFsQ29kZScpICYmICFjaGFuZ2VzLnBvc3RhbENvZGUuZmlyc3RDaGFuZ2UgJiYgIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3ByZWZpbGxEYXRhJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5TVFJFRVQ7XG4gICAgICAgIGlmIChjaGFuZ2VzLnBvc3RhbENvZGUuY3VycmVudFZhbHVlID09PSAnJykge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhbnNmb3JtU3RyZWV0TmFtZUluTG93ZXJjYXNlQW5kV2l0aG91dERpYWNyaXRpY3Moc3RyZWV0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xuICAgIGlmIChzdHJlZXROYW1lICE9PSBudWxsICYmIHN0cmVldE5hbWUgIT09IHVuZGVmaW5lZCApXG4gICAge1xuICAgICAgcmVzdWx0ID0gdGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKHN0cmVldE5hbWUpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3ByZWZpbGwgc3RyZWV0TmFtZScsIHJlc3VsdCk7IH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25DbGVhcklucHV0RXZlbnQoZXZlbnQsIGZvY3VzKSB7XG4gICAgdGhpcy5jbGVhcklucHV0KGZvY3VzKTtcbiAgfVxuXG4gIG9uQmx1cihldjogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VySUUoKSAmJiB0aGlzLmlzRHJvcGRvd25DbGlja2VkKGV2KSkge1xuICAgICAgdGhpcy5zdHJlZXRTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNraXBOZXh0Qmx1cikge1xuICAgICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gICAgfVxuICB9XG5cbiAgaXNCcm93c2VySUUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9tc2llXFxzfHRyaWRlbnRcXC98ZWRnZVxcLy9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgaXNEcm9wZG93bkNsaWNrZWQoZXYpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldi5leHBsaWNpdE9yaWdpbmFsVGFyZ2V0IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuICh0YXJnZXQuaWQgPT09ICdicGFhYy1zdHJlZXQtZHJvcGRvd24nKTtcbiAgfVxuXG4gIG9uRm9jdXMoKSB7XG4gICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gZmFsc2U7XG4gICAgLy8gdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gKHRoaXMucHJlZmlsbGluZyA9PT0gdHJ1ZSAmJiB0aGlzLnByZWZpbGxEYXRhICE9PSBudWxsKVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgPyAhdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm9uRm9jdXNTaG93U3VnZ2VzdGlvbnNBZnRlclByZWZpbGwgOiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3N0cmVldCBjb21wIC0gb25Gb2N1cycsIHRoaXMucHJlZmlsbGluZywgdGhpcy5wcmVmaWxsRGF0YSwgdGhpcy5jb2xsYXBzZURyb3Bkb3duKTsgfVxuXG4gICAgLy8gdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgfVxuXG4gIG1heVNob3dEcm9wZG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggPiAwICYmICF0aGlzLmNvbGxhcHNlRHJvcGRvd247XG4gIH1cblxuICBidWlsZElucHV0V29yZExpc3QoKSB7XG4gICAgdGhpcy53b3JkTGlzdCA9IHRoaXMuc2VhcmNoVGV4dC5zcGxpdCgvW1xccywgXSsvKTtcbiAgICAvLyBjb25zb2xlLmxvZygnd29yZCBsaXN0IC0gc3RyZWV0OicsIHRoaXMud29yZExpc3QpO1xuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zICYmIHRoaXMud29yZExpc3QpIHtcbiAgICAgIGZvciAoY29uc3Qgc3VnIG9mIHRoaXMuc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgaWYgKCFzdWcgfHwgIXN1Zy5oYXNPd25Qcm9wZXJ0eSgnc3RyaW5nJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgdGhpcy53b3JkTGlzdCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyhzdWcuc3RyaW5nIGFzIHN0cmluZywgdyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCB3dyA9IHN1Zy5zdHJpbmcuc3Vic3RyKHN0YXJ0LCB3Lmxlbmd0aCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYWRkaW5nIHdvcmQ6JyArIHd3KTtcbiAgICAgICAgICAgIC8vIHd3IGlzIGEgY2FuZGlkYXRlIHRvIGJlIGFkZGVkIHRvIHRoZSB3b3JkbGlzdCBpZiBub3QgYWxyZWFkeSBwcmVzZW50IGluIGl0XG4gICAgICAgICAgICBjb25zdCBwcmVzZW50ID0gdGhpcy53b3JkTGlzdC5maW5kKCAodzE6IHN0cmluZykgID0+IHcxLnRvTG93ZXJDYXNlKCkgPT09IHd3LnRvTG93ZXJDYXNlKCkgKTtcbiAgICAgICAgICAgIGlmIChwcmVzZW50ID09PSBudWxsIHx8IHByZXNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLndvcmRMaXN0LnB1c2god3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXJ0c1dpdGhJZ25vcmVEaWFjcml0aWNzKHZhbHVlOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBjb25zb2xlLmxvZygnU2VhcmNoaW5nIGZvciBwcmVmaXggXCInICsgcHJlZml4ICsgJ1wiIGluc2lkZSBzdWdnZXN0aW9uOiAnICsgdmFsdWUpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgY29uc3QgX3ZhbHVlID0gdGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKCAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWUgKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIGNvbnN0IF9wcmVmaXggPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoIChwcmVmaXggIT09IG51bGwgJiYgcHJlZml4ICE9PSB1bmRlZmluZWQpID8gcHJlZml4LnRvTG93ZXJDYXNlKCkgOiBwcmVmaXgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gX3ZhbHVlLmluZGV4T2YoX3ByZWZpeCk7XG4gICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0c1dpdGhJZ25vcmVEaWFjcml0aWNzOiAnICsgc3RhcnQpO1xuICAgIHJldHVybiBzdGFydDtcbiAgfVxuXG4gIG1heUFkZFR5cGVBaGVhZCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKC9bXlxccywgXFxcXFxcL10kLykudGVzdCh0aGlzLnNlYXJjaFRleHQpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2VkKCkge1xuICAgIHRoaXMudGV4dENoYW5nZUV2ZW50LmVtaXQodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIGJ1aWxkVHlwZUFoZWFkKHNvdXJjZTogU291cmNlVHlwZSkge1xuICAgIGlmIChzb3VyY2UgPT09IFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAoIXRoaXMubWF5QWRkVHlwZUFoZWFkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoVGV4dFdvcmRzID0gdGhpcy5zZWFyY2hUZXh0LnNwbGl0KC9bXFxzLCBdKy8pO1xuICAgIGNvbnN0IGxhc3RXb3JkID0gc2VhcmNoVGV4dFdvcmRzW3NlYXJjaFRleHRXb3Jkcy5sZW5ndGggLSAxXTtcblxuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLnNvbWUoZnVuY3Rpb24oc3VnKSB7XG4gICAgICBpZiAoIXN1ZyB8fCAhc3VnLmhhc093blByb3BlcnR5KCdzdHJpbmcnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VnLnN0cmluZy5zcGxpdCgvW1xccy1dKy8pLnNvbWUoZnVuY3Rpb24od29yZCkge1xuICAgICAgICBpZiAodGhpcy5zdHJpbmdTdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyh3b3JkLCBsYXN0V29yZCkpIHtcbiAgICAgICAgICB0aGlzLnR5cGVBaGVhZFdvcmQgPSB3b3JkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0uYmluZCh0aGlzKSkpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGl4ID0gdGhpcy50eXBlQWhlYWRXb3JkLnNsaWNlKGxhc3RXb3JkLmxlbmd0aCwgdGhpcy50eXBlQWhlYWRXb3JkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMuYnBUeXBlQWhlYWQgPSB0aGlzLnNlYXJjaFRleHQgKyBhcHBlbmRpeDtcbiAgICB9XG4gIH1cblxuICBzdHJpbmdTdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyh2YWx1ZSwgcHJlZml4KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZSApO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgY29uc3QgX3ByZWZpeCA9IHRoaXMudW5pY29kZVNlcnZpY2UucmVtb3ZlRGlhY3JpdGljcyggKHByZWZpeCAhPT0gbnVsbCAmJiBwcmVmaXggIT09IHVuZGVmaW5lZCkgPyBwcmVmaXgudG9Mb3dlckNhc2UoKSA6IHByZWZpeCk7XG4gICAgY29uc3Qgc3RhcnQgPSBfdmFsdWUuc2xpY2UoMCwgX3ByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihfcHJlZml4KSAhPT0gLTE7XG4gICAgcmV0dXJuIHN0YXJ0O1xuICB9XG5cbiAgZ2V0VG9wU3VnZ2VzdGlvbnMoc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgKz0gMTtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMuZ2VuZXJhdGVQYXJhbWV0ZXJzKCk7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnU1RSRUVUIGNhbGxpbmcgc2VydmljZSBwYXJhbXMnLCBwYXJhbSk7IH1cbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuYWRkcmVzc1NlcnZpY2UuZ2V0U3RyZWV0KHRoaXMuYmFzZVVybCwgdGhpcy5sb2NhbGl0eSwgdGhpcy5wb3N0YWxDb2RlLCBwYXJhbSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdldFN0cmVldFJlc3BvbnNlKHJlc3BvbnNlLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gU291cmNlVHlwZS5TT1VSQ0VfUFJFRklMTEVEKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGlzLmlzUHJlZmlsbFdpdGhOb01hdGNoID0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucHJlZmlsbEFuYWx5emVEYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuaXNQcmVmaWxsV2l0aE5vTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLFxuICAgICAgICAgICgpID0+IHRoaXMuaGFuZGxlR2V0U3RyZWV0RXJyb3IoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXRUZXh0Q29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKCB0aGlzLmlzUHJlZmlsbFdpdGhOb01hdGNoID09PSB0cnVlICkgPyAnb3JhbmdlcmVkJyA6ICcnO1xuICB9XG5cbiAgbG9hZFBhcmFtcyhwcmVmaWxsRGF0YTogUHJlZmlsbERhdGEpIHtcbiAgICBsZXQgY29uY2F0U3RyID0gJyc7XG4gICAgaWYgKHByZWZpbGxEYXRhICE9PSBudWxsICYmIHByZWZpbGxEYXRhLnBhcmFtZXRlcnMgIT09IG51bGwpXG4gICAge1xuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ21pbkxldmVsJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubWluTGV2ZWw7XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgndW5zdHJ1Y3R1cmVkQWRkcmVzcycpICYmIHRoaXMuaXNTdHJpbmcocGFyYW1zLnVuc3RydWN0dXJlZEFkZHJlc3MpKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgICAqL1xuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ3Bvc3RhbENvZGUnKSAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSkpIHtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlO1xuICAgICAgfVxuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ211bmljaXBhbGl0eU5hbWUnKSAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2NhbGl0eSA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KCdzdHJlZXROYW1lJylcbiAgICAgICAgICAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TmFtZSkgJiYgdGhpcy5pc1BhcmFtc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgY29uY2F0U3RyID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uY2F0U3RyO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yID09PSBTdHJpbmc7XG4gIH1cblxuICBpc1ZhbGlkKHZhbCkge1xuICAgIHJldHVybiB0aGlzLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbiAgfVxuXG4gIGlzUGFyYW1zQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgaWYoIXRoaXMudmFsaWRhdGVkQnlCYWNrZW5kKXtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQodGhpcy5wb3N0YWxDb2RlKSB8fCB0aGlzLmlzVmFsaWQodGhpcy5sb2NhbGl0eSk7XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKHRoaXMucG9zdGFsQ29kZSkgJiYgdGhpcy5pc1ZhbGlkKHRoaXMubG9jYWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUGFyYW1ldGVycygpOiBRdWVyeVBhcmFtZXRlcnMge1xuICAgIGNvbnN0IHBhcmFtID0gbmV3IFF1ZXJ5UGFyYW1ldGVycyh7XG4gICAgICBpZDogdGhpcy5zZXF1ZW5jZU51bWJlcixcbiAgICAgIHE6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIHBvc3RhbENvZGU6IHRoaXMucG9zdGFsQ29kZSxcbiAgICAgIGxvY2FsaXR5OiB0aGlzLmxvY2FsaXR5LFxuICAgICAgbWF4TnVtYmVyT2ZTdWdnZXN0aW9uczogdGhpcy5tYXhTdWdnZXNpb25Db3VudFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydENyaXRlcmlhID09PSAnUycpIHtcbiAgICAgIHBhcmFtLnNvcnRCeVN0cmVldCh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtO1xuICB9XG5cbiAgaGFuZGxlR2V0U3RyZWV0UmVzcG9uc2UoZGF0YTogYW55LCBzb3VyY2U/OiBTb3VyY2VUeXBlKSB7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5yZXNwb25zZSAmJiBkYXRhLnJlc3BvbnNlLnNlcXVlbmNlTnVtYmVyICYmIGRhdGEucmVzcG9uc2Uuc2VxdWVuY2VOdW1iZXIgPj0gdGhpcy5jb25zdW1lZE51bWJlciAmJlxuICAgICAgZGF0YS5yZXNwb25zZS50b3BTdWdnZXN0aW9ucykge1xuICAgICAgdGhpcy5jb25zdW1lZE51bWJlciA9IGRhdGEucmVzcG9uc2Uuc2VxdWVuY2VOdW1iZXI7XG4gICAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvbnMoKTtcbiAgICAgIHRoaXMucGFyc2VUb3BTdWdnZXN0aW9ucyhkYXRhLnJlc3BvbnNlLnRvcFN1Z2dlc3Rpb25zLCBzb3VyY2UpO1xuICAgICAgdGhpcy5idWlsZFR5cGVBaGVhZChzb3VyY2UpO1xuICAgICAgdGhpcy5jbGVhckNvbm5lY3Rpb25FcnJvck1lc3NhZ2UoKTtcbiAgICAgIHRoaXMuYnVpbGRJbnB1dFdvcmRMaXN0KCk7XG4gICAgfVxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9ICh0aGlzLnByZWZpbGxpbmcgPT09IHRydWUgJiYgdGhpcy5wcmVmaWxsRGF0YSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICF0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMub25Gb2N1c1Nob3dTdWdnZXN0aW9uc0FmdGVyUHJlZmlsbCA6IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlR2V0U3RyZWV0RXJyb3IoKSB7XG4gICAgaWYodGhpcy5hbGxvd05vVmFsaWRhdGlvbiAmJiB0aGlzLnZhbGlkYXRlZEJ5QmFja2VuZCl7XG4gICAgICB0aGlzLm51bWJlck9mRXhjZXB0aW9ucys9MTtcbiAgICAgIHRoaXMubnVtYmVyT2ZFeGNlcHRpb25zRW1pdHRlci5lbWl0KHRoaXMubnVtYmVyT2ZFeGNlcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5zZXRDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gIH1cblxuICBzZXRDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIHRoaXMuZXJyb3JDb2RlID0gLyonc2VydmljZS11bmF2YWlsYWJsZScqLyBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuU2VydmljZV9VbmF2YWlsYWJsZTtcbiAgICAvLyB0aGlzLnNldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZXJyb3JDb2RlKTtcbiAgICB0aGlzLmVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGUpO1xuICB9XG5cbiAgY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5lcnJvckNvZGUpO1xuICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlID09PSByZXMgKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwYXJzZVRvcFN1Z2dlc3Rpb25zKHRvcFN1Z2dlc3Rpb25zLCBzb3VyY2U6IFNvdXJjZVR5cGUpIHtcbiAgICBpZiAodG9wU3VnZ2VzdGlvbnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICAvLyB0b3BTdWdnZXN0aW9ucy5mb3JFYWNoKHRoaXMucGFyc2VTaW5nbGVTdWdnZXN0aW9uLmJpbmQodGhpcykpO1xuICAgICAgZm9yIChjb25zdCBzdWcgb2YgdG9wU3VnZ2VzdGlvbnMpXG4gICAgICB7XG4gICAgICAgIHRoaXMucGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Zywgc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJzZVNpbmdsZVN1Z2dlc3Rpb24odG9wU3VnZ2VzdGlvbnMsIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IGFueSwgc291cmNlOiBTb3VyY2VUeXBlKSB7XG4gICAgbGV0IHN1Z2dlc3Rpb25Ub0FkZDogYW55O1xuICAgIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVGcmVuY2goKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdmcmVuY2gnKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5mcmVuY2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVEdXRjaCgpICYmIHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2R1dGNoJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uZHV0Y2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVHZXJtYW4oKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdnZXJtYW4nKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5nZXJtYW47XG4gICAgfSBlbHNlIGlmIChzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdhZGRyZXNzJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICB9XG4gICAgaWYgKHN1Z2dlc3Rpb25Ub0FkZCkge1xuICAgICAgaWYgKHN1Z2dlc3Rpb24ubWVzc2FnZXMpIHtcbiAgICAgICAgc3VnZ2VzdGlvblRvQWRkLm1lc3NhZ2VzID0gc3VnZ2VzdGlvbi5tZXNzYWdlcztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3VnZ2VzdGlvbnMucHVzaChzdWdnZXN0aW9uVG9BZGQpO1xuICAgICAgaWYgKHNvdXJjZSA9PT0gU291cmNlVHlwZS5TT1VSQ0VfUFJFRklMTEVEKVxuICAgICAge1xuICAgICAgICBzdWdnZXN0aW9uLmFkZHJlc3MgPSBzdWdnZXN0aW9uVG9BZGQ7XG4gICAgICAgIHRoaXMucHJlZmlsbENoZWNrRm9yUGVyZmVjdE1hdGNoKHN1Z2dlc3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByZWZpbGxDaGVja0ZvclBlcmZlY3RNYXRjaChzdWdnZXN0aW9uKVxuICB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdzdHJlZXQgLSBjaGVja2luZyBzdWdnZXN0aW9uIGZvciBwZXJmZWN0IG1hdGNoJywgdGhpcy5wcmVmaWxsRGF0YSwgc3VnZ2VzdGlvbik7IH1cbiAgICBjb25zdCBzdWdBZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgIC8vIGlmIChzdWdBZGRyZXNzLnN0cmVldE5hbWUgPT09IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lIClcbiAgICBjb25zdCBzdWdnZXN0aW9uTG9jYWxpdHkgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHN1Z0FkZHJlc3MubG9jYWxpdHlOYW1lKTtcbiAgICBjb25zdCBzdWdnZXN0aW9uTXVuaWNpcGFsaXR5ID0gdGhpcy50cmFuc2Zvcm1TdHJlZXROYW1lSW5Mb3dlcmNhc2VBbmRXaXRob3V0RGlhY3JpdGljcyhzdWdBZGRyZXNzLm11bmljaXBhbGl0eU5hbWUpO1xuICAgIGlmIChzdWdnZXN0aW9uTG9jYWxpdHkgPT09IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eU5hbWVcbiAgICAgIHx8IHN1Z2dlc3Rpb25NdW5pY2lwYWxpdHkgPT09IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eU5hbWUpXG4gICAge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvblN0cmVldE5hbWUgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHN1Z0FkZHJlc3Muc3RyZWV0TmFtZSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnY29tcGFyaW5nIHN0cmVldCBuYW1lcycsIHN1Z2dlc3Rpb25TdHJlZXROYW1lLCB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXROYW1lKTtcbiAgICAgIGlmIChzdWdnZXN0aW9uU3RyZWV0TmFtZSA9PT0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TmFtZSlcbiAgICAgIHtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uID0gc3VnZ2VzdGlvbjtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc3VnQWRkcmVzcy5zdHJlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgID09PSB0cnVlKVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdTVFJFRVQgLSBQUkVGSUxMIC0gUGVyZmVjdCBtYXRjaCAtIHN0cmVldDonLCBzdWdnZXN0aW9uKTsgfVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdTVFJFRVQgLSBQUkVGSUxMIC0gTk8gUGVyZmVjdCBtYXRjaDonLCBzdWdnZXN0aW9uKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRDaGFuZ2Uoc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdzdHJlZXQgb25JbnB1dENoYW5nZSA6IHNvdXJjZSAnLCBzb3VyY2UpO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgKz0gMTtcbiAgICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSB0aGlzLnNlcXVlbmNlTnVtYmVyO1xuICAgICAgdGhpcy5jbGVhclN1Z2dlc3Rpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLnZhbGlkYXRlZEJ5QmFja2VuZCl7XG4gICAgICAgIGxldCBzdWdnZXN0aW9uID0ge1xuICAgICAgICAgICdzdHJpbmcnOiB0aGlzLnNlYXJjaFRleHQudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAnbXVuaWNpcGFsaXR5TmFtZSc6IHRoaXMubG9jYWxpdHkgPyB0aGlzLmxvY2FsaXR5LnRvTG9jYWxlVXBwZXJDYXNlKCkgOicnLFxuICAgICAgICAgICdsb2NhbGl0eU5hbWUnOiB0aGlzLmxvY2FsaXR5ID8gdGhpcy5sb2NhbGl0eS50b0xvY2FsZVVwcGVyQ2FzZSgpIDonJyxcbiAgICAgICAgICAncG9zdGFsQ29kZSc6IHRoaXMucG9zdGFsQ29kZSxcbiAgICAgICAgICAnc2VhcmNoQmFyU3RyaW5nJzogdGhpcy5zZWFyY2hUZXh0LnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgJ3N0cmVldE5hbWUnOiB0aGlzLnNlYXJjaFRleHQudG9VcHBlckNhc2UoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRBZGRyZXNzKHN1Z2dlc3Rpb24pO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHRoaXMuZ2V0VG9wU3VnZ2VzdGlvbnMoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWlsZElucHV0V29yZExpc3QoKTtcbiAgfVxuXG4gIHByZWZpbGxBbmFseXplRGF0YSgpXG4gIHtcbiAgICBpZiAodGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUpXG4gICAge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wcmVmaWxsRXZlbnRFbWl0dGVyLmVtaXQobmV3IFByZWZpbGxFdmVudChBRERSRVNTTEVWRUwuU1RSRUVULCB0aGlzLnByZWZpbGxEYXRhKSApO1xuICB9XG5cblxuICBjbGlja1N1Z2dlc3Rpb24oZXZlbnQ6IGFueSwgc3VnZ2VzdGlvbjogYW55KSB7XG4gICAgdGhpcy5pc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3N0cmVldE51bWJlcjo6Y2xpY2tTdWdnZXN0aW9uJywgZXZlbnQsIHN1Z2dlc3Rpb24pOyB9XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICB0aGlzLnNldFNlYXJjaFRleHQoc3VnZ2VzdGlvbi5zdHJpbmcpO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgLy8gaWYgKHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2lzQ29tcGxldGUnKSkge1xuICAgIC8vICAgdGhpcy5zaG93QWRkcmVzc0lzVmFsaWRhdGVkKCk7XG4gICAgLy8gfVxuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLnNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uOiBhbnkpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQoc3VnZ2VzdGlvbik7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkQWRkcmVzcygpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQobnVsbCk7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIG9wdGlvbnM/OiBzdHJpbmdbXSkge1xuICAgIC8vIE1vbWVudGx5LCBvcHRpb25zIGFyZSBOT1QgdXNlZDsgc28gZGF0YSB0eXBlIG9mIHRoZXNlIG9wdGlvbnMgd2lsbCBiZSByZXZpZXdlZCBvbmNlIG5lZWRlZC5cbiAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VUeXBlID09PSBudWxsIHx8IHZhbGlkYXRpb25NZXNzYWdlVHlwZSA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gZW1pdCB2YWxpZGF0aW9uIG1lc3NhZ2UgLSBtZXNzYWdlIGtleSBpcyBpbnZhbGlkIScsIHZhbGlkYXRpb25NZXNzYWdlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh2YWxpZGF0aW9uTWVzc2FnZVR5cGUpIHtcblxuICAgICAgY2FzZSBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuQWRkcmVzc19Ob3RfRm91bmQ6XG4gICAgICBjYXNlIFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX1ZhbGlkYXRlZDpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGU6IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodmFsaWRhdGlvbk1lc3NhZ2VUeXBlKTtcbiAgICAgICAgICAvLyB0aGlzLm1lc3NhZ2VDaGFuZ2VkLmVtaXQobWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHttZXNzYWdlVHlwZTogdmFsaWRhdGlvbk1lc3NhZ2VUeXBlLCB0cmFuc2xhdGVkTWVzc2FnZTogbWVzc2FnZX0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTphbGlnblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBlbWl0IHZhbGlkYXRpb24gbWVzc2FnZSAtIG1lc3NhZ2Uga2V5IE5PVCBzdXBwb3J0ZWQhJywgdmFsaWRhdGlvbk1lc3NhZ2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gIH1cblxuICBzaG93QWRkcmVzc0lzVmFsaWRhdGVkKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3MtdmFsaWRhdGVkJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX1ZhbGlkYXRlZCk7XG4gIH1cblxuICBjaGVja0tleURvd24oZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAvLyBkb3duIGtleSwgaW5jcmVtZW50IHNlbGVjdGVkSW5kZXhcbiAgICAgIGNhc2UgNDA6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUFycm93U2VsZWN0ZWRJbmRleERvd24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIHVwIGtleSwgZGVjcmVtZW50IHNlbGVjdGVkSW5kZXhcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUFycm93U2VsZWN0ZWRJbmRleFVwKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gcmlnaHQgYXJyb3cga2V5XG4gICAgICBjYXNlIDM5OlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5jdXJzb3JJc09uU3VnZ2VzdGlvbkxpc3QoKSkge1xuICAgICAgICAgIHRoaXMuY2xpY2tTdWdnZXN0aW9uKGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGVBaGVhZFdvcmQgJiYgdGhpcy50eXBlQWhlYWRJc1Nob3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dCh0aGlzLmJwVHlwZUFoZWFkKTtcbiAgICAgICAgICAgIHRoaXMudHlwZUFoZWFkV29yZCA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIHRhYiBrZXlcbiAgICAgIGNhc2UgOTpcbiAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NJc1ZhbGlkYXRlZCAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RJbkxpc3RPZlN1Z2dlc2lvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0NjpcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBlbnRlciBwcmVzc2VkXG4gICAgICBjYXNlIDEzOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5jdXJzb3JJc09uU3VnZ2VzdGlvbkxpc3QoKSkge1xuICAgICAgICAgIHRoaXMuY2xpY2tTdWdnZXN0aW9uKGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmNsZWFyVHlwZUFoZWFkKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgfVxuICB9XG5cbiAgY2xlYXJXaWRnZXQoKSB7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyU2VhcmNoVGV4dCgpO1xuICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIHRoaXMuY2xlYXJUeXBlQWhlYWQoKTtcbiAgICB0aGlzLnByZWZpbGxEYXRhID0gbnVsbDtcbiAgICB0aGlzLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoVGV4dCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgfVxuXG4gIHR5cGVBaGVhZElzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYnBUeXBlQWhlYWQgJiYgdGhpcy5icFR5cGVBaGVhZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgcmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cblxuICBtb3ZlQXJyb3dTZWxlY3RlZEluZGV4RG93bigpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ICsgMSAhPT0gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xuICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVBcnJvd1NlbGVjdGVkSW5kZXhVcCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4IC0gMSAhPT0gLTIpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleC0tO1xuICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvcklzT25TdWdnZXN0aW9uTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGV4ID49IDA7XG4gIH1cblxuICBzZXRTZWFyY2hUZXh0QmFzZWRPbkFycm93U2VsZWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgaWYgKG5ld1ZhbCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5ld1ZhbCAhPT0gLTEpIHtcbiAgICAgIGlmIChvbGRWYWwgPT09IC0xKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hUZXh0O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTZWFyY2hUZXh0KHRoaXMuc3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS5zdHJpbmcpO1xuICAgICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFNlYXJjaFRleHQodGhpcy5sYXN0U2VhcmNoVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG1heVNob3dDbGVhckJ1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBjbGVhcklucHV0KGZvY3VzPywgZW1pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBjb25zb2xlLndhcm4oJ3N0cmVldCBjbGVhcklucHV0IGNhbGxlZCAuLi4nLCBmb2N1cywgZW1pdCk7XG4gICAgdGhpcy5jbGVhcldpZGdldCgpO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSAtMTtcbiAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMuY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gICAgaWYgKGZvY3VzID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLndhcm4oJ3N0cmVldCBjbGVhcklucHV0IC0gc2V0IGZvY3VzICEhIScsIGZvY3VzKTtcbiAgICAgIHRoaXMuc3RyZWV0U2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5jbGVhcklucHV0RXZlbnRFbWl0dGVyLmVtaXQoLyonU1RSRUVUJyovIElucHV0TmFtZVR5cGUuU1RSRUVUKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclN1Z2dlc3Rpb25zKCkge1xuICAgIHRoaXMud29yZExpc3QgPSBbXTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5zdWdnZXN0aW9uc1dvcmRMaXN0ID0gW107XG4gIH1cblxuICBjbGVhclR5cGVBaGVhZCgpIHtcbiAgICB0aGlzLmJwVHlwZUFoZWFkID0gJyc7XG4gIH1cblxuICBjbGVhclN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSgpIHtcbiAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB0aGlzLm1lc3NhZ2VDaGFuZ2VkLmVtaXQoe21lc3NhZ2VUeXBlOiBudWxsLCB0cmFuc2xhdGVkTWVzc2FnZTogdGhpcy5zdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2V9KTtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZUNvZGUgPSBudWxsO1xuICB9XG5cbiAgc2V0U2VhcmNoVGV4dCh2YWx1ZSkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlO1xuICB9XG5cbiAgc2VsZWN0Rmlyc3RJbkxpc3RPZlN1Z2dlc2lvbnMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIDEpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc3VnZ2VzdGlvbk1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cblxuICBub3RFcXVhbElnbm9yZUNhc2Uob2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG9sZFZhbC50b0xvd2VyQ2FzZSgpICE9PSBuZXdWYWwudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHNob3dBZGRyZXNzTm90Rm91bmRNZXNzYWdlKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3Mtbm90LWZvdW5kJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX05vdF9Gb3VuZCk7XG4gIH1cblxuICBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiAodGhpcy5sb2NhbGl0eSA9PT0gJycgfHwgdGhpcy5wb3N0YWxDb2RlID09PSAnJyB8fCB0aGlzLm1pbkxldmVsID4gQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gIH1cblxuICBvbklucHV0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnc3RyZWV0IGNsaWNrJyk7IH1cbiAgICB0aGlzLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSBmYWxzZTtcbiAgfVxuXG59XG4iLCI8c3BhbiAqbmdJZj1cImxhYmVsUmVzb3VyY2VLZXlcIj57eyBsYWJlbFJlc291cmNlS2V5IHwgdHJhbnNsYXRlfX08L3NwYW4+XG48ZGl2IGNsYXNzPVwiYnBhYWMtZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiYnBhYWMtc2VhcmNoLWJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnBhYWMtaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIiAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICNzdHJlZXRTZWFyY2hJbnB1dCBjbGFzcz1cImJwYWFjLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiIWlzUGFyYW1zQ29tcGxldGUoKSA/ICdsaWdodGdyZXknIDogJydcIiBcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIiBnZXRUZXh0Q29sb3IoKSBcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKHZhbGlkYXRlZEJ5QmFja2VuZCAmJiAoIWxvY2FsaXR5IHx8IGxvY2FsaXR5LnRyaW0oKS5sZW5ndGggPT09IDApKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIXZhbGlkYXRlZEJ5QmFja2VuZCAmJiAoKCFwb3N0YWxDb2RlIHx8IHBvc3RhbENvZGUudHJpbSgpLmxlbmd0aCA9PT0gMCkgJiYgKCFsb2NhbGl0eSB8fCBsb2NhbGl0eS50cmltKCkubGVuZ3RoID09PSAwKSkpXCIgKGtleWRvd24pPVwiY2hlY2tLZXlEb3duKCRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoKVwiIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIGlkPVwic3RyZWV0SW5wdXRGaWVsZFwiIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyVGV4dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIC8+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiYnBhYWMtY2xlYXItc3RyZWV0LWJ1dHRvblwiICpuZ0lmPVwibWF5U2hvd0NsZWFyQnV0dG9uKClcIiAoY2xpY2spPVwiY2xlYXJJbnB1dCh0cnVlKVwiIGNsYXNzPVwiYnBhYWMtY2xlYXJcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLTxkaXYgbmctdHJhbnNjbHVkZT48L2Rpdj4tLT5cbiAgICAgICAgPGlucHV0IGlkPVwiYnBhYWMtc3RyZWV0LXR5cGVhaGVhZFwiIHR5cGU9XCJ0ZXh0XCIgZGlzYWJsZWQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgWyhuZ01vZGVsKV09XCJicFR5cGVBaGVhZFwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBbaGlkZGVuXT1cImNvbGxhcHNlRHJvcGRvd25cIiBjbGFzcz1cImJwYWFjLWRyb3Bkb3duLW1lbnUtY29udGFpbmVyXCIgKm5nSWY9XCJzdWdnZXN0aW9ucyAmJiBzdWdnZXN0aW9ucy5sZW5ndGg+MFwiPlxuICAgICAgICA8ZGl2ICNzdHJlZXRMaXN0IFthcHBWaXNpYmxlU3VnZ2VzdGlvbl09XCJ2aXNpYmxlU3VnZ2VzaW9uQ291bnRcIiBpZD1cImJwYWFjLXN0cmVldC1kcm9wZG93blwiIGNsYXNzPVwiYnBhYWMtZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgPHVsIHJvbGU9XCJsaXN0Ym94XCIgaWQ9XCJicGFhYy1zdHJlZXQtc3VnZ2VzdGlvbnNMaXN0XCIgY2xhc3M9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgICAgICAgICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN1Z2dlc3Rpb25zOyBsZXQgaWR4ID0gaW5kZXhcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6KHNlbGVjdGVkSW5kZXg9PWlkeCl9XCIgKG1vdXNlZG93bik9XCJjbGlja1N1Z2dlc3Rpb24oJGV2ZW50LCBvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3RlZEluZGV4PWlkeFwiIChtb3VzZWxlYXZlKT1cInNlbGVjdGVkSW5kZXg9LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJvcHRpb25cIiBbaW5uZXJIdG1sXT1cIm9wdGlvbi5zdHJpbmcgfCBoaWdobGlnaHRTdWdnZXN0aW9uIDogd29yZExpc3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=