tango-app-ui-store-builder 1.0.5 → 1.0.6

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.
@@ -197,7 +197,8 @@ export class PlanoFilterComponent {
197
197
  raw = raw.replace(/[^0-9]/g, "").slice(0, 3);
198
198
  const num = Number(raw);
199
199
  this.customData[fi][field] = isNaN(num) ? null : Math.min(num, 100);
200
- this.processCompliance(fi);
200
+ this.validateCustomFilter();
201
+ this.emitFilterChanges();
201
202
  }
202
203
  validateCustomFilter() {
203
204
  const index = this.filters.findIndex((f) => f.type === "custom");
@@ -232,42 +233,6 @@ export class PlanoFilterComponent {
232
233
  default:
233
234
  this.isFilterProper = true;
234
235
  }
235
- // console.log('@@ ~ this.isFilterProper:', this.isFilterProper);
236
- }
237
- processCompliance(fi) {
238
- const selected = this.getSelectedItem(fi);
239
- if (!selected)
240
- return;
241
- const type = selected.value;
242
- const d = this.customData[fi];
243
- switch (type) {
244
- case "greaterThan":
245
- if (d.min != null) {
246
- d.max = 100;
247
- d.min = d.min + 1;
248
- }
249
- break;
250
- case "lesserThan":
251
- if (d.min != null) {
252
- d.max = d.min - 1;
253
- d.min = 0;
254
- }
255
- break;
256
- case "greaterThanAndEqual":
257
- if (d.min != null) {
258
- d.max = 100;
259
- }
260
- break;
261
- case "lesserThanAndEqual":
262
- if (d.min != null) {
263
- d.max = d.min;
264
- d.min = 0;
265
- }
266
- break;
267
- case "between":
268
- break;
269
- }
270
- this.emitFilterChanges();
271
236
  }
272
237
  isAllVisibleSelected(filterIndex) {
273
238
  const visible = this.displayedOptions[filterIndex];
@@ -305,10 +270,53 @@ export class PlanoFilterComponent {
305
270
  getSelectedData() {
306
271
  return this.filters.map((f, i) => {
307
272
  if (f.type === "custom") {
308
- return {
309
- title: f.title,
310
- selected: this.customData[i].type ? { ...this.customData[i] } : null,
311
- };
273
+ const cd = this.customData[i];
274
+ if (!cd.type) {
275
+ return { title: f.title, selected: null };
276
+ }
277
+ let min = cd.min;
278
+ let max = cd.max;
279
+ switch (cd.type) {
280
+ case "lesserThan":
281
+ if (min != null) {
282
+ return {
283
+ title: f.title,
284
+ selected: { type: cd.type, min: 0, max: min - 1 },
285
+ };
286
+ }
287
+ break;
288
+ case "greaterThan":
289
+ if (min != null) {
290
+ return {
291
+ title: f.title,
292
+ selected: { type: cd.type, min: min + 1, max: 100 },
293
+ };
294
+ }
295
+ break;
296
+ case "lesserThanAndEqual":
297
+ if (min != null) {
298
+ return {
299
+ title: f.title,
300
+ selected: { type: cd.type, min: 0, max: min },
301
+ };
302
+ }
303
+ break;
304
+ case "greaterThanAndEqual":
305
+ if (min != null) {
306
+ return {
307
+ title: f.title,
308
+ selected: { type: cd.type, min: min, max: 100 },
309
+ };
310
+ }
311
+ break;
312
+ case "between":
313
+ if (min != null && max != null) {
314
+ return { title: f.title, selected: { type: cd.type, min, max } };
315
+ }
316
+ break;
317
+ }
318
+ // Invalid → return null
319
+ return { title: f.title, selected: null };
312
320
  }
313
321
  if (f.type === "single") {
314
322
  const sel = f.options.find((o) => o.checked);
@@ -365,11 +373,11 @@ export class PlanoFilterComponent {
365
373
  this.destroy$.complete();
366
374
  }
367
375
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlanoFilterComponent, deps: [{ token: i1.StoreBuilderService }], target: i0.ɵɵFactoryTarget.Component });
368
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PlanoFilterComponent, isStandalone: true, selector: "plano-filter", inputs: { clientId: "clientId" }, outputs: { applyFilters: "applyFilters", resetFilters: "resetFilters", filterChanged: "filterChanged" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Filter\r\n @if(isFilterApplied){\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n </svg>\r\n }\r\n\r\n </button>\r\n\r\n @if(isFilterOpen){\r\n <div class=\"filter-dropdown\">\r\n\r\n <div class=\"filter-header\">\r\n <h2>Filter Options</h2>\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\"\r\n [disabled]=\"!isFilterProper\">Apply</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-body\">\r\n\r\n @for (filter of filters; let fi = $index; track fi) {\r\n\r\n <div class=\"item-wrapper\">\r\n\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n @if(filter.type === 'multi'){\r\n {{filter.title}}\r\n @if(getSelectedCount(fi) > 0){\r\n <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n }\r\n }\r\n @else {\r\n {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n }\r\n </div>\r\n\r\n @if(filter.type === 'custom' && getSelectedItem(fi)?.value){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].min\" (ngModelChange)=\"validateCustomFilter()\" placeholder=\"0%\">\r\n\r\n\r\n @if(getSelectedItem(fi)?.value === 'between'){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].max\" (ngModelChange)=\"validateCustomFilter()\" placeholder=\"0%\">\r\n }\r\n }\r\n\r\n </div>\r\n\r\n @if(filter.isOpened){\r\n <div class=\"item-dropdown\">\r\n\r\n @if(filter.type === 'multi'){\r\n <div>\r\n <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n <label [for]=\"'selectAll' + fi\">Select all</label>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div class=\"my-2\">\r\n <span class=\"search-icon\">\r\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path\r\n d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n stroke=\"#667085\" stroke-width=\"1.3\" />\r\n </svg>\r\n </span>\r\n <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n (input)=\"onSearch($event, fi)\">\r\n </div>\r\n }\r\n\r\n @if(displayedOptions[fi].length == 0){\r\n <span class=\"no-data\">No Data</span>\r\n }\r\n @else {\r\n\r\n @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n @if(filter.type === 'single'){\r\n <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'multi'){\r\n <div class=\"mb-3\">\r\n <input type=\"checkbox\" [id]=\"option.value\" [(ngModel)]=\"option.checked\"\r\n (change)=\"onOptionChange(filter, option)\">\r\n <label [for]=\"option.value\">{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'custom'){\r\n <div class=\"custom-option\" [class.selected]=\"getSelectedItem(fi)?.value === option.value\"\r\n (click)=\"onCustomSelect(fi, filter, option)\">\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n }\r\n }\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [".active-filter{position:absolute;top:-6px;right:-6px;height:14px;width:14px}.filter-dropdown{padding:16px;min-width:350px;box-shadow:2px 4px 10px #0000001a;border-radius:12px;background-color:#fff;position:absolute;width:320px;top:50px;right:0;z-index:100}.filter-dropdown .filter-header{display:flex;justify-content:space-between;align-items:center}.filter-dropdown .filter-header h2{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px;margin:0}.filter-dropdown .filter-header .btn{font-size:13px!important;height:30px!important;line-height:10px!important;padding:8px 16px!important}.filter-dropdown .filter-body{margin-top:12px}.filter-dropdown .filter-body .item-wrapper{margin-top:12px;position:relative}.filter-dropdown .filter-body .item-button{cursor:pointer;background-color:#fff;padding:.775rem 3rem .775rem 1rem;border:1px solid #dbdfe9;border-radius:6px;color:#344054;font-size:14px;font-weight:600;line-height:20px;display:flex;justify-content:space-between}.filter-dropdown .filter-body .item-button .badge-count{background:#f2f4f7;color:#344054;padding:0 8px;border-radius:20px;font-size:12px;font-weight:600;margin-left:8px}.filter-dropdown .filter-body .custom-input{width:54px;padding:10px}.filter-dropdown .filter-body .item-dropdown{position:absolute;top:50px;width:100%;z-index:1;padding:10px;background-color:#fff;border-radius:8px;box-shadow:0 8px 16px #0003;max-height:200px;overflow:auto}.filter-dropdown .filter-body .item-dropdown .no-data{text-align:center;width:100%;display:block;font-size:14px}.filter-dropdown .filter-body .item-dropdown .search-field{padding-left:34px}.filter-dropdown .filter-body .item-dropdown .search-icon{margin-left:12px;margin-top:4px;position:absolute}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #d0d5dd);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff);background-color:var(--primary-50, #eaf8ff)}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-dropdown .filter-body .item-dropdown label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px;margin-left:4px}.filter-dropdown .filter-body .item-dropdown .single-option{display:flex;align-items:center;cursor:pointer;padding:8px 6px}.filter-dropdown .filter-body .item-dropdown .radio-circle{width:14px;height:14px;border:2px solid #667085;border-radius:50%;margin-right:8px}.filter-dropdown .filter-body .item-dropdown .radio-circle.selected{background-color:#00a3ff;border-color:#00a3ff}.filter-dropdown .filter-body .item-dropdown .custom-option{padding:8px;cursor:pointer;border-radius:6px}.filter-dropdown .filter-body .item-dropdown .custom-option label{cursor:pointer}.filter-dropdown .filter-body .item-dropdown .custom-option.selected{background:#eef7ff;border:1px solid #cfeefc}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }] });
376
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PlanoFilterComponent, isStandalone: true, selector: "plano-filter", inputs: { clientId: "clientId" }, outputs: { applyFilters: "applyFilters", resetFilters: "resetFilters", filterChanged: "filterChanged" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Filter\r\n @if(isFilterApplied){\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n </svg>\r\n }\r\n\r\n </button>\r\n\r\n @if(isFilterOpen){\r\n <div class=\"filter-dropdown\">\r\n\r\n <div class=\"filter-header\">\r\n <h2>Filter Options</h2>\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\"\r\n [disabled]=\"!isFilterProper\">Apply</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-body\">\r\n\r\n @for (filter of filters; let fi = $index; track fi) {\r\n\r\n <div class=\"item-wrapper\">\r\n\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n @if(filter.type === 'multi'){\r\n {{filter.title}}\r\n @if(getSelectedCount(fi) > 0){\r\n <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n }\r\n }\r\n @else {\r\n {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n }\r\n </div>\r\n\r\n @if(filter.type === 'custom' && getSelectedItem(fi)?.value){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].min\" (ngModelChange)=\"validateNumber(fi, 'min')\" placeholder=\"0%\">\r\n\r\n @if(getSelectedItem(fi)?.value === 'between'){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].max\" (ngModelChange)=\"validateNumber(fi, 'max')\" placeholder=\"0%\">\r\n }\r\n\r\n }\r\n\r\n </div>\r\n\r\n @if(filter.isOpened){\r\n <div class=\"item-dropdown\">\r\n\r\n @if(filter.type === 'multi'){\r\n <div>\r\n <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n <label [for]=\"'selectAll' + fi\">Select all</label>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div class=\"my-2\">\r\n <span class=\"search-icon\">\r\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path\r\n d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n stroke=\"#667085\" stroke-width=\"1.3\" />\r\n </svg>\r\n </span>\r\n <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n (input)=\"onSearch($event, fi)\">\r\n </div>\r\n }\r\n\r\n @if(displayedOptions[fi].length == 0){\r\n <span class=\"no-data\">No Data</span>\r\n }\r\n @else {\r\n\r\n @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n @if(filter.type === 'single'){\r\n <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'multi'){\r\n <div class=\"mb-3\">\r\n <input type=\"checkbox\" [id]=\"option.value\" [(ngModel)]=\"option.checked\"\r\n (change)=\"onOptionChange(filter, option)\">\r\n <label [for]=\"option.value\">{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'custom'){\r\n <div class=\"custom-option\" [class.selected]=\"getSelectedItem(fi)?.value === option.value\"\r\n (click)=\"onCustomSelect(fi, filter, option)\">\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n }\r\n }\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [".active-filter{position:absolute;top:-6px;right:-6px;height:14px;width:14px}.filter-dropdown{padding:16px;min-width:350px;box-shadow:2px 4px 10px #0000001a;border-radius:12px;background-color:#fff;position:absolute;width:320px;top:50px;right:0;z-index:100}.filter-dropdown .filter-header{display:flex;justify-content:space-between;align-items:center}.filter-dropdown .filter-header h2{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px;margin:0}.filter-dropdown .filter-header .btn{font-size:13px!important;height:30px!important;line-height:10px!important;padding:8px 16px!important}.filter-dropdown .filter-body{margin-top:12px}.filter-dropdown .filter-body .item-wrapper{margin-top:12px;position:relative}.filter-dropdown .filter-body .item-button{cursor:pointer;background-color:#fff;padding:.775rem 3rem .775rem 1rem;border:1px solid #dbdfe9;border-radius:6px;color:#344054;font-size:14px;font-weight:600;line-height:20px;display:flex;justify-content:space-between}.filter-dropdown .filter-body .item-button .badge-count{background:#f2f4f7;color:#344054;padding:0 8px;border-radius:20px;font-size:12px;font-weight:600;margin-left:8px}.filter-dropdown .filter-body .custom-input{width:54px;padding:10px}.filter-dropdown .filter-body .item-dropdown{position:absolute;top:50px;width:100%;z-index:1;padding:10px;background-color:#fff;border-radius:8px;box-shadow:0 8px 16px #0003;max-height:200px;overflow:auto}.filter-dropdown .filter-body .item-dropdown .no-data{text-align:center;width:100%;display:block;font-size:14px}.filter-dropdown .filter-body .item-dropdown .search-field{padding-left:34px}.filter-dropdown .filter-body .item-dropdown .search-icon{margin-left:12px;margin-top:4px;position:absolute}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #d0d5dd);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff);background-color:var(--primary-50, #eaf8ff)}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-dropdown .filter-body .item-dropdown label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px;margin-left:4px}.filter-dropdown .filter-body .item-dropdown .single-option{display:flex;align-items:center;cursor:pointer;padding:8px 6px}.filter-dropdown .filter-body .item-dropdown .radio-circle{width:14px;height:14px;border:2px solid #667085;border-radius:50%;margin-right:8px}.filter-dropdown .filter-body .item-dropdown .radio-circle.selected{background-color:#00a3ff;border-color:#00a3ff}.filter-dropdown .filter-body .item-dropdown .custom-option{padding:8px;cursor:pointer;border-radius:6px}.filter-dropdown .filter-body .item-dropdown .custom-option label{cursor:pointer}.filter-dropdown .filter-body .item-dropdown .custom-option.selected{background:#eef7ff;border:1px solid #cfeefc}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }] });
369
377
  }
370
378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlanoFilterComponent, decorators: [{
371
379
  type: Component,
372
- args: [{ selector: "plano-filter", standalone: true, imports: [FormsModule, CommonModule], template: "<div class=\"position-relative\">\r\n <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Filter\r\n @if(isFilterApplied){\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n </svg>\r\n }\r\n\r\n </button>\r\n\r\n @if(isFilterOpen){\r\n <div class=\"filter-dropdown\">\r\n\r\n <div class=\"filter-header\">\r\n <h2>Filter Options</h2>\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\"\r\n [disabled]=\"!isFilterProper\">Apply</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-body\">\r\n\r\n @for (filter of filters; let fi = $index; track fi) {\r\n\r\n <div class=\"item-wrapper\">\r\n\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n @if(filter.type === 'multi'){\r\n {{filter.title}}\r\n @if(getSelectedCount(fi) > 0){\r\n <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n }\r\n }\r\n @else {\r\n {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n }\r\n </div>\r\n\r\n @if(filter.type === 'custom' && getSelectedItem(fi)?.value){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].min\" (ngModelChange)=\"validateCustomFilter()\" placeholder=\"0%\">\r\n\r\n\r\n @if(getSelectedItem(fi)?.value === 'between'){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].max\" (ngModelChange)=\"validateCustomFilter()\" placeholder=\"0%\">\r\n }\r\n }\r\n\r\n </div>\r\n\r\n @if(filter.isOpened){\r\n <div class=\"item-dropdown\">\r\n\r\n @if(filter.type === 'multi'){\r\n <div>\r\n <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n <label [for]=\"'selectAll' + fi\">Select all</label>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div class=\"my-2\">\r\n <span class=\"search-icon\">\r\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path\r\n d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n stroke=\"#667085\" stroke-width=\"1.3\" />\r\n </svg>\r\n </span>\r\n <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n (input)=\"onSearch($event, fi)\">\r\n </div>\r\n }\r\n\r\n @if(displayedOptions[fi].length == 0){\r\n <span class=\"no-data\">No Data</span>\r\n }\r\n @else {\r\n\r\n @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n @if(filter.type === 'single'){\r\n <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'multi'){\r\n <div class=\"mb-3\">\r\n <input type=\"checkbox\" [id]=\"option.value\" [(ngModel)]=\"option.checked\"\r\n (change)=\"onOptionChange(filter, option)\">\r\n <label [for]=\"option.value\">{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'custom'){\r\n <div class=\"custom-option\" [class.selected]=\"getSelectedItem(fi)?.value === option.value\"\r\n (click)=\"onCustomSelect(fi, filter, option)\">\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n }\r\n }\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [".active-filter{position:absolute;top:-6px;right:-6px;height:14px;width:14px}.filter-dropdown{padding:16px;min-width:350px;box-shadow:2px 4px 10px #0000001a;border-radius:12px;background-color:#fff;position:absolute;width:320px;top:50px;right:0;z-index:100}.filter-dropdown .filter-header{display:flex;justify-content:space-between;align-items:center}.filter-dropdown .filter-header h2{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px;margin:0}.filter-dropdown .filter-header .btn{font-size:13px!important;height:30px!important;line-height:10px!important;padding:8px 16px!important}.filter-dropdown .filter-body{margin-top:12px}.filter-dropdown .filter-body .item-wrapper{margin-top:12px;position:relative}.filter-dropdown .filter-body .item-button{cursor:pointer;background-color:#fff;padding:.775rem 3rem .775rem 1rem;border:1px solid #dbdfe9;border-radius:6px;color:#344054;font-size:14px;font-weight:600;line-height:20px;display:flex;justify-content:space-between}.filter-dropdown .filter-body .item-button .badge-count{background:#f2f4f7;color:#344054;padding:0 8px;border-radius:20px;font-size:12px;font-weight:600;margin-left:8px}.filter-dropdown .filter-body .custom-input{width:54px;padding:10px}.filter-dropdown .filter-body .item-dropdown{position:absolute;top:50px;width:100%;z-index:1;padding:10px;background-color:#fff;border-radius:8px;box-shadow:0 8px 16px #0003;max-height:200px;overflow:auto}.filter-dropdown .filter-body .item-dropdown .no-data{text-align:center;width:100%;display:block;font-size:14px}.filter-dropdown .filter-body .item-dropdown .search-field{padding-left:34px}.filter-dropdown .filter-body .item-dropdown .search-icon{margin-left:12px;margin-top:4px;position:absolute}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #d0d5dd);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff);background-color:var(--primary-50, #eaf8ff)}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-dropdown .filter-body .item-dropdown label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px;margin-left:4px}.filter-dropdown .filter-body .item-dropdown .single-option{display:flex;align-items:center;cursor:pointer;padding:8px 6px}.filter-dropdown .filter-body .item-dropdown .radio-circle{width:14px;height:14px;border:2px solid #667085;border-radius:50%;margin-right:8px}.filter-dropdown .filter-body .item-dropdown .radio-circle.selected{background-color:#00a3ff;border-color:#00a3ff}.filter-dropdown .filter-body .item-dropdown .custom-option{padding:8px;cursor:pointer;border-radius:6px}.filter-dropdown .filter-body .item-dropdown .custom-option label{cursor:pointer}.filter-dropdown .filter-body .item-dropdown .custom-option.selected{background:#eef7ff;border:1px solid #cfeefc}\n"] }]
380
+ args: [{ selector: "plano-filter", standalone: true, imports: [FormsModule, CommonModule], template: "<div class=\"position-relative\">\r\n <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Filter\r\n @if(isFilterApplied){\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n </svg>\r\n }\r\n\r\n </button>\r\n\r\n @if(isFilterOpen){\r\n <div class=\"filter-dropdown\">\r\n\r\n <div class=\"filter-header\">\r\n <h2>Filter Options</h2>\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\"\r\n [disabled]=\"!isFilterProper\">Apply</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-body\">\r\n\r\n @for (filter of filters; let fi = $index; track fi) {\r\n\r\n <div class=\"item-wrapper\">\r\n\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n @if(filter.type === 'multi'){\r\n {{filter.title}}\r\n @if(getSelectedCount(fi) > 0){\r\n <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n }\r\n }\r\n @else {\r\n {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n }\r\n </div>\r\n\r\n @if(filter.type === 'custom' && getSelectedItem(fi)?.value){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].min\" (ngModelChange)=\"validateNumber(fi, 'min')\" placeholder=\"0%\">\r\n\r\n @if(getSelectedItem(fi)?.value === 'between'){\r\n <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\"\r\n [(ngModel)]=\"customData[fi].max\" (ngModelChange)=\"validateNumber(fi, 'max')\" placeholder=\"0%\">\r\n }\r\n\r\n }\r\n\r\n </div>\r\n\r\n @if(filter.isOpened){\r\n <div class=\"item-dropdown\">\r\n\r\n @if(filter.type === 'multi'){\r\n <div>\r\n <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n <label [for]=\"'selectAll' + fi\">Select all</label>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div class=\"my-2\">\r\n <span class=\"search-icon\">\r\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path\r\n d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n stroke=\"#667085\" stroke-width=\"1.3\" />\r\n </svg>\r\n </span>\r\n <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n (input)=\"onSearch($event, fi)\">\r\n </div>\r\n }\r\n\r\n @if(displayedOptions[fi].length == 0){\r\n <span class=\"no-data\">No Data</span>\r\n }\r\n @else {\r\n\r\n @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n @if(filter.type === 'single'){\r\n <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'multi'){\r\n <div class=\"mb-3\">\r\n <input type=\"checkbox\" [id]=\"option.value\" [(ngModel)]=\"option.checked\"\r\n (change)=\"onOptionChange(filter, option)\">\r\n <label [for]=\"option.value\">{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'custom'){\r\n <div class=\"custom-option\" [class.selected]=\"getSelectedItem(fi)?.value === option.value\"\r\n (click)=\"onCustomSelect(fi, filter, option)\">\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n }\r\n }\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [".active-filter{position:absolute;top:-6px;right:-6px;height:14px;width:14px}.filter-dropdown{padding:16px;min-width:350px;box-shadow:2px 4px 10px #0000001a;border-radius:12px;background-color:#fff;position:absolute;width:320px;top:50px;right:0;z-index:100}.filter-dropdown .filter-header{display:flex;justify-content:space-between;align-items:center}.filter-dropdown .filter-header h2{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px;margin:0}.filter-dropdown .filter-header .btn{font-size:13px!important;height:30px!important;line-height:10px!important;padding:8px 16px!important}.filter-dropdown .filter-body{margin-top:12px}.filter-dropdown .filter-body .item-wrapper{margin-top:12px;position:relative}.filter-dropdown .filter-body .item-button{cursor:pointer;background-color:#fff;padding:.775rem 3rem .775rem 1rem;border:1px solid #dbdfe9;border-radius:6px;color:#344054;font-size:14px;font-weight:600;line-height:20px;display:flex;justify-content:space-between}.filter-dropdown .filter-body .item-button .badge-count{background:#f2f4f7;color:#344054;padding:0 8px;border-radius:20px;font-size:12px;font-weight:600;margin-left:8px}.filter-dropdown .filter-body .custom-input{width:54px;padding:10px}.filter-dropdown .filter-body .item-dropdown{position:absolute;top:50px;width:100%;z-index:1;padding:10px;background-color:#fff;border-radius:8px;box-shadow:0 8px 16px #0003;max-height:200px;overflow:auto}.filter-dropdown .filter-body .item-dropdown .no-data{text-align:center;width:100%;display:block;font-size:14px}.filter-dropdown .filter-body .item-dropdown .search-field{padding-left:34px}.filter-dropdown .filter-body .item-dropdown .search-icon{margin-left:12px;margin-top:4px;position:absolute}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #d0d5dd);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff);background-color:var(--primary-50, #eaf8ff)}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-dropdown .filter-body .item-dropdown label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px;margin-left:4px}.filter-dropdown .filter-body .item-dropdown .single-option{display:flex;align-items:center;cursor:pointer;padding:8px 6px}.filter-dropdown .filter-body .item-dropdown .radio-circle{width:14px;height:14px;border:2px solid #667085;border-radius:50%;margin-right:8px}.filter-dropdown .filter-body .item-dropdown .radio-circle.selected{background-color:#00a3ff;border-color:#00a3ff}.filter-dropdown .filter-body .item-dropdown .custom-option{padding:8px;cursor:pointer;border-radius:6px}.filter-dropdown .filter-body .item-dropdown .custom-option label{cursor:pointer}.filter-dropdown .filter-body .item-dropdown .custom-option.selected{background:#eef7ff;border:1px solid #cfeefc}\n"] }]
373
381
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }], propDecorators: { clientId: [{
374
382
  type: Input
375
383
  }], applyFilters: [{
@@ -382,4 +390,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
382
390
  type: HostListener,
383
391
  args: ["document:click", ["$event"]]
384
392
  }] } });
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbm8tZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vZ3JhbS9wbGFuby10YWJsZS9wbGFuby1maWx0ZXIvcGxhbm8tZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vZ3JhbS9wbGFuby10YWJsZS9wbGFuby1maWx0ZXIvcGxhbm8tZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFVMUMsTUFBTSxPQUFPLG9CQUFvQjtJQW9EWDtJQW5EWCxRQUFRLENBQVM7SUFFMUIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixnQkFBZ0IsR0FBWSxFQUFFLENBQUM7SUFDL0IsY0FBYyxHQUFZLElBQUksQ0FBQztJQUMvQixlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLE9BQU8sR0FBRztRQUNSLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQVcsRUFBRTtRQUMxRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxR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LENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckUsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3BFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBdGJVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLGtUQ3ZCakMsMHFMQStITSx5MEdENUdNLFdBQVcsK3hCQUFFLFlBQVk7OzRGQUl4QixvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0UsY0FBYyxjQUNaLElBQUksV0FDUCxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUM7d0ZBSzNCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBeUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQXVGUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcInBsYW5vLWZpbHRlclwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0Zvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGxhbm8tZmlsdGVyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9wbGFuby1maWx0ZXIuY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYW5vRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgaXNGaWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgZGlzcGxheWVkT3B0aW9uczogYW55W11bXSA9IFtdO1xyXG4gIGlzRmlsdGVyUHJvcGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0ZpbHRlckFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZmlsdGVycyA9IFtcclxuICAgIHsgdGl0bGU6IFwiQ291bnRyeVwiLCB0eXBlOiBcIm11bHRpXCIsIGlzT3BlbmVkOiBmYWxzZSwgb3B0aW9uczogW10gYXMgYW55W10gfSxcclxuICAgIHsgdGl0bGU6IFwiQ2l0eVwiLCB0eXBlOiBcIm11bHRpXCIsIGlzT3BlbmVkOiBmYWxzZSwgb3B0aW9uczogW10gYXMgYW55W10gfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6IFwiQ29tcGxpYW5jZSBDb25kaXRpb25cIixcclxuICAgICAgdHlwZTogXCJjdXN0b21cIixcclxuICAgICAgaXNPcGVuZWQ6IGZhbHNlLFxyXG4gICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcIj4gR3JlYXRlciB0aGFuXCIsIHZhbHVlOiBcImdyZWF0ZXJUaGFuXCIsIGNoZWNrZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIjwgTGVzc2VyIHRoYW5cIiwgdmFsdWU6IFwibGVzc2VyVGhhblwiLCBjaGVja2VkOiBmYWxzZSB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6IFwiPj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIsXHJcbiAgICAgICAgICB2YWx1ZTogXCJncmVhdGVyVGhhbkFuZEVxdWFsXCIsXHJcbiAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6IFwiPD0gTGVzc2VyIHRoYW4gb3IgZXF1YWwgdG9cIixcclxuICAgICAgICAgIHZhbHVlOiBcImxlc3NlclRoYW5BbmRFcXVhbFwiLFxyXG4gICAgICAgICAgY2hlY2tlZDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IG5hbWU6IFwiKCApIEJldHdlZW5cIiwgdmFsdWU6IFwiYmV0d2VlblwiLCBjaGVja2VkOiBmYWxzZSB9LFxyXG4gICAgICBdLFxyXG4gICAgfSxcclxuICAgIC8vIHtcclxuICAgIC8vICAgdGl0bGU6IFwiU3RvcmUgbWV0aG9kXCIsXHJcbiAgICAvLyAgIHR5cGU6IFwic2luZ2xlXCIsXHJcbiAgICAvLyAgIGlzT3BlbmVkOiBmYWxzZSxcclxuICAgIC8vICAgb3B0aW9uczogW1xyXG4gICAgLy8gICAgIHsgbmFtZTogXCJJVk1cIiwgdmFsdWU6IFwiaXZtXCIsIGNoZWNrZWQ6IGZhbHNlIH0sXHJcbiAgICAvLyAgICAgeyBuYW1lOiBcIk5vbiBJVk1cIiwgdmFsdWU6IFwibm9uSXZtXCIsIGNoZWNrZWQ6IGZhbHNlIH0sXHJcbiAgICAvLyAgIF0sXHJcbiAgICAvLyB9LFxyXG4gIF07XHJcblxyXG4gIEBPdXRwdXQoKSBhcHBseUZpbHRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcmVzZXRGaWx0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZpbHRlckNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY3VzdG9tRGF0YToge1xyXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcclxuICAgIG1pbjogbnVtYmVyIHwgbnVsbDtcclxuICAgIG1heDogbnVtYmVyIHwgbnVsbDtcclxuICB9W10gPSBbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zID0gdGhpcy5maWx0ZXJzLm1hcCgoZikgPT5cclxuICAgICAgZi5vcHRpb25zID8gWy4uLmYub3B0aW9uc10gOiBbXVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoXywgaSkgPT4ge1xyXG4gICAgICB0aGlzLmN1c3RvbURhdGFbaV0gPSB7IHR5cGU6IG51bGwsIG1pbjogbnVsbCwgbWF4OiBudWxsIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiY2xpZW50SWRcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmxvYWRDb3VudHJpZXMoKTtcclxuICAgICAgdGhpcy5sb2FkQ2l0aWVzKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRDb3VudHJpZXMoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmdldENvdW50cmllcyh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkIH0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnRyaWVzID1cclxuICAgICAgICAgICAgICByZXM/LmRhdGE/LmNvdW50cnlEYXRhLm1hcCgoYzogYW55KSA9PiBjLmNvdW50cnkpID8/IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzWzBdLm9wdGlvbnMgPSBjb3VudHJpZXMubWFwKChjOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgICAgbmFtZTogYyxcclxuICAgICAgICAgICAgICB2YWx1ZTogYyxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbMF0gPSBbLi4udGhpcy5maWx0ZXJzWzBdLm9wdGlvbnNdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBsb2FkQ291bnRyaWVzIFtFUlJdOlwiLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZENpdGllcyhzZWxlY3RlZENvdW50cmllczogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBjb3VudHJ5OiBzZWxlY3RlZENvdW50cmllcyxcclxuICAgICAgY2l0eTogW10sXHJcbiAgICAgIGdyb3VwOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmdldFJlZ2lvbnMocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZWdpb25zID1cclxuICAgICAgICAgICAgICByZXM/LmRhdGE/LmxvY2F0aW9uRGF0YT8ubWFwKChyOiBhbnkpID0+IHI/LmNpdHkpID8/IFtdO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb2xkQ2hlY2tlZCA9IHRoaXMuZmlsdGVyc1sxXS5vcHRpb25zXHJcbiAgICAgICAgICAgICAgLmZpbHRlcigobykgPT4gby5jaGVja2VkKVxyXG4gICAgICAgICAgICAgIC5tYXAoKG8pID0+IG8udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzWzFdLm9wdGlvbnMgPSByZWdpb25zLm1hcCgoY2l0eTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgIG5hbWU6IGNpdHksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNpdHksXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogb2xkQ2hlY2tlZC5pbmNsdWRlcyhjaXR5KSxcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zWzFdID0gWy4uLnRoaXMuZmlsdGVyc1sxXS5vcHRpb25zXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gbG9hZENpdGllcyBbRVJSXTpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5pdGVtLWJ1dHRvblwiKSB8fCB0YXJnZXQuY2xvc2VzdChcIi5pdGVtLWRyb3Bkb3duXCIpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYsIGkpID0+IHtcclxuICAgICAgaWYgKGYuaXNPcGVuZWQpIHRoaXMucmVzZXRTZWFyY2goaSk7XHJcbiAgICAgIGYuaXNPcGVuZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5maWx0ZXItZHJvcGRvd25cIikpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gIXRoaXMuaXNGaWx0ZXJPcGVuO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSXRlbShldmVudDogTW91c2VFdmVudCwgaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmLCBpKSA9PiB7XHJcbiAgICAgIGlmIChpID09PSBpdGVtSW5kZXgpIHtcclxuICAgICAgICBmLmlzT3BlbmVkID0gIWYuaXNPcGVuZWQ7XHJcbiAgICAgICAgaWYgKCFmLmlzT3BlbmVkKSB0aGlzLnJlc2V0U2VhcmNoKGkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmLmlzT3BlbmVkKSB0aGlzLnJlc2V0U2VhcmNoKGkpO1xyXG4gICAgICAgIGYuaXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXNldFNlYXJjaChmaWx0ZXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdID0gWy4uLnRoaXMuZmlsdGVyc1tmaWx0ZXJJbmRleF0ub3B0aW9uc107XHJcbiAgfVxyXG5cclxuICBvblNpbmdsZVNlbGVjdChmaWx0ZXI6IGFueSwgb3B0aW9uOiBhbnkpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNbaW5kZXhdLm9wdGlvbnMuZm9yRWFjaCgobykgPT4gKG8uY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICBvcHRpb24uY2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2luZGV4XSA9IFsuLi50aGlzLmZpbHRlcnNbaW5kZXhdLm9wdGlvbnNdO1xyXG4gICAgdGhpcy5maWx0ZXJzW2luZGV4XS5pc09wZW5lZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChmaWx0ZXIudGl0bGUgPT09IFwiQ291bnRyeVwiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25DdXN0b21TZWxlY3QoZmk6IG51bWJlciwgZmlsdGVyOiBhbnksIG9wdGlvbjogYW55KSB7XHJcbiAgICB0aGlzLmZpbHRlcnNbZmldLm9wdGlvbnMuZm9yRWFjaCgobykgPT4gKG8uY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICBvcHRpb24uY2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ZpXSA9IFsuLi50aGlzLmZpbHRlcnNbZmldLm9wdGlvbnNdO1xyXG4gICAgdGhpcy5maWx0ZXJzW2ZpXS5pc09wZW5lZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuY3VzdG9tRGF0YVtmaV0gPSB7XHJcbiAgICAgIHR5cGU6IG9wdGlvbi52YWx1ZSxcclxuICAgICAgbWluOiBudWxsLFxyXG4gICAgICBtYXg6IG51bGwsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGVDdXN0b21GaWx0ZXIoKTtcclxuICAgIHRoaXMuZW1pdEZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uT3B0aW9uQ2hhbmdlKGZpbHRlcjogYW55LCBvcHRpb246IGFueSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbHRlcnMuaW5kZXhPZihmaWx0ZXIpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChmaWx0ZXIudGl0bGUgPT09IFwiQ291bnRyeVwiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLmZpbHRlcnNbMF0ub3B0aW9uc1xyXG4gICAgICAuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKG8pID0+IG8udmFsdWUpO1xyXG4gICAgdGhpcy5sb2FkQ2l0aWVzKHNlbGVjdGVkQ291bnRyaWVzKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlTnVtYmVyKGZpOiBudW1iZXIsIGZpZWxkOiBcIm1pblwiIHwgXCJtYXhcIikge1xyXG4gICAgbGV0IHJhdyA9IFN0cmluZyh0aGlzLmN1c3RvbURhdGFbZmldW2ZpZWxkXSA/PyBcIlwiKTtcclxuICAgIHJhdyA9IHJhdy5yZXBsYWNlKC9bXjAtOV0vZywgXCJcIikuc2xpY2UoMCwgMyk7XHJcblxyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XHJcbiAgICB0aGlzLmN1c3RvbURhdGFbZmldW2ZpZWxkXSA9IGlzTmFOKG51bSkgPyBudWxsIDogTWF0aC5taW4obnVtLCAxMDApO1xyXG5cclxuICAgIHRoaXMucHJvY2Vzc0NvbXBsaWFuY2UoZmkpO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVDdXN0b21GaWx0ZXIoKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmlsdGVycy5maW5kSW5kZXgoKGYpID0+IGYudHlwZSA9PT0gXCJjdXN0b21cIik7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbmYgPSB0aGlzLmN1c3RvbURhdGFbaW5kZXhdO1xyXG5cclxuICAgIGlmICghY29uZi50eXBlKSB7XHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJQcm9wZXIgPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWluID0gY29uZi5taW47XHJcbiAgICBjb25zdCBtYXggPSBjb25mLm1heDtcclxuXHJcbiAgICBzd2l0Y2ggKGNvbmYudHlwZSkge1xyXG4gICAgICBjYXNlIFwiZ3JlYXRlclRoYW5cIjpcclxuICAgICAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gbWluICE9PSBudWxsICYmIG1pbiA+PSAwICYmIG1pbiA8IDEwMDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJsZXNzZXJUaGFuXCI6XHJcbiAgICAgICAgdGhpcy5pc0ZpbHRlclByb3BlciA9IG1pbiAhPT0gbnVsbCAmJiBtaW4gPiAwICYmIG1pbiA8PSAxMDA7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiZ3JlYXRlclRoYW5BbmRFcXVhbFwiOlxyXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJQcm9wZXIgPSBtaW4gIT09IG51bGwgJiYgbWluID49IDAgJiYgbWluIDw9IDEwMDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJsZXNzZXJUaGFuQW5kRXF1YWxcIjpcclxuICAgICAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gbWluICE9PSBudWxsICYmIG1pbiA+PSAwICYmIG1pbiA8PSAxMDA7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYmV0d2VlblwiOlxyXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJQcm9wZXIgPVxyXG4gICAgICAgICAgbWluICE9PSBudWxsICYmIG1heCAhPT0gbnVsbCAmJiBtaW4gPj0gMCAmJiBtYXggPD0gMTAwICYmIG1pbiA8IG1heDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5pc0ZpbHRlclByb3BlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZygnQEAgfiB0aGlzLmlzRmlsdGVyUHJvcGVyOicsIHRoaXMuaXNGaWx0ZXJQcm9wZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0NvbXBsaWFuY2UoZmk6IG51bWJlcikge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGVkSXRlbShmaSk7XHJcbiAgICBpZiAoIXNlbGVjdGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IHNlbGVjdGVkLnZhbHVlO1xyXG4gICAgY29uc3QgZCA9IHRoaXMuY3VzdG9tRGF0YVtmaV07XHJcblxyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJncmVhdGVyVGhhblwiOlxyXG4gICAgICAgIGlmIChkLm1pbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICBkLm1heCA9IDEwMDtcclxuICAgICAgICAgIGQubWluID0gZC5taW4gKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJsZXNzZXJUaGFuXCI6XHJcbiAgICAgICAgaWYgKGQubWluICE9IG51bGwpIHtcclxuICAgICAgICAgIGQubWF4ID0gZC5taW4gLSAxO1xyXG4gICAgICAgICAgZC5taW4gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJncmVhdGVyVGhhbkFuZEVxdWFsXCI6XHJcbiAgICAgICAgaWYgKGQubWluICE9IG51bGwpIHtcclxuICAgICAgICAgIGQubWF4ID0gMTAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJsZXNzZXJUaGFuQW5kRXF1YWxcIjpcclxuICAgICAgICBpZiAoZC5taW4gIT0gbnVsbCkge1xyXG4gICAgICAgICAgZC5tYXggPSBkLm1pbjtcclxuICAgICAgICAgIGQubWluID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiYmV0d2VlblwiOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdEZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGlzQWxsVmlzaWJsZVNlbGVjdGVkKGZpbHRlckluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdO1xyXG4gICAgcmV0dXJuIHZpc2libGUubGVuZ3RoID4gMCAmJiB2aXNpYmxlLmV2ZXJ5KCh2KSA9PiB2LmNoZWNrZWQpO1xyXG4gIH1cclxuXHJcbiAgaXNBbGxWaXNpYmxlU2VsZWN0ZWRCeUZpbHRlcihmaWx0ZXI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaSA9IHRoaXMuZmlsdGVycy5pbmRleE9mKGZpbHRlcik7XHJcbiAgICBpZiAoaSA9PT0gLTEpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLmlzQWxsVmlzaWJsZVNlbGVjdGVkKGkpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsVmlzaWJsZShldmVudDogYW55LCBmaWx0ZXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdLmZvckVhY2goXHJcbiAgICAgIChvcHQpID0+IChvcHQuY2hlY2tlZCA9IGNoZWNrZWQpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcnNbZmlsdGVySW5kZXhdLnRpdGxlID09PSBcIkNvdW50cnlcIikge1xyXG4gICAgICB0aGlzLnVwZGF0ZUNpdHlMaXN0RnJvbUFQSSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdEZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbFZpc2libGVCeUZpbHRlcihldmVudDogYW55LCBmaWx0ZXI6IGFueSkge1xyXG4gICAgY29uc3QgaSA9IHRoaXMuZmlsdGVycy5pbmRleE9mKGZpbHRlcik7XHJcbiAgICBpZiAoaSA9PT0gLTEpIHJldHVybjtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0QWxsVmlzaWJsZShldmVudCwgaSk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaChldmVudDogYW55LCBmaWx0ZXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB0ZXJtID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgY29uc3QgZnVsbExpc3QgPSB0aGlzLmZpbHRlcnNbZmlsdGVySW5kZXhdLm9wdGlvbnM7XHJcblxyXG4gICAgaWYgKCF0ZXJtKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkT3B0aW9uc1tmaWx0ZXJJbmRleF0gPSBbLi4uZnVsbExpc3RdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ZpbHRlckluZGV4XSA9IGZ1bGxMaXN0LmZpbHRlcigobykgPT5cclxuICAgICAgby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzLm1hcCgoZiwgaSkgPT4ge1xyXG4gICAgICBpZiAoZi50eXBlID09PSBcImN1c3RvbVwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRpdGxlOiBmLnRpdGxlLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuY3VzdG9tRGF0YVtpXS50eXBlID8geyAuLi50aGlzLmN1c3RvbURhdGFbaV0gfSA6IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGYudHlwZSA9PT0gXCJzaW5nbGVcIikge1xyXG4gICAgICAgIGNvbnN0IHNlbCA9IGYub3B0aW9ucy5maW5kKChvKSA9PiBvLmNoZWNrZWQpO1xyXG4gICAgICAgIHJldHVybiB7IHRpdGxlOiBmLnRpdGxlLCBzZWxlY3RlZDogc2VsID8gc2VsLnZhbHVlIDogbnVsbCB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRpdGxlOiBmLnRpdGxlLFxyXG4gICAgICAgIHNlbGVjdGVkOiBmLm9wdGlvbnMuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpLm1hcCgobykgPT4gby52YWx1ZSksXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGVtaXRGaWx0ZXJDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2VkLmVtaXQodGhpcy5nZXRTZWxlY3RlZERhdGEoKSk7XHJcbiAgfVxyXG5cclxuICBvbkFwcGx5RmlsdGVyKCkge1xyXG4gICAgdGhpcy5pc0ZpbHRlck9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmKSA9PiAoZi5pc09wZW5lZCA9IGZhbHNlKSk7XHJcbiAgICBjb25zdCBmaW5hbERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSgpO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcnMuZW1pdChmaW5hbERhdGEpO1xyXG5cclxuICAgIGNvbnN0IGNvdW50cnkgPSBmaW5hbERhdGFbMF0uc2VsZWN0ZWQ7XHJcbiAgICBjb25zdCBjaXR5ID0gZmluYWxEYXRhWzFdLnNlbGVjdGVkO1xyXG4gICAgY29uc3QgY29tcGxpYW5jZSA9IGZpbmFsRGF0YVsyXS5zZWxlY3RlZDtcclxuICAgIC8vIGNvbnN0IG1ldGhvZCA9IGV2ZW50WzNdLnNlbGVjdGVkO1xyXG5cclxuICAgIGlmIChjb3VudHJ5Lmxlbmd0aCB8fCBjaXR5Lmxlbmd0aCB8fCBjb21wbGlhbmNlKSB7XHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJBcHBsaWVkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJBcHBsaWVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlc2V0RmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYpID0+IGYub3B0aW9ucy5mb3JFYWNoKChvKSA9PiAoby5jaGVja2VkID0gZmFsc2UpKSk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzWzFdLm9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuZGlzcGxheWVkT3B0aW9uc1sxXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChfLCBpKSA9PiB7XHJcbiAgICAgIHRoaXMuY3VzdG9tRGF0YVtpXSA9IHsgdHlwZTogbnVsbCwgbWluOiBudWxsLCBtYXg6IG51bGwgfTtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ldID0gWy4uLnRoaXMuZmlsdGVyc1tpXS5vcHRpb25zXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmKSA9PiAoZi5pc09wZW5lZCA9IGZhbHNlKSk7XHJcbiAgICB0aGlzLmxvYWRDaXRpZXMoW10pO1xyXG5cclxuICAgIHRoaXMucmVzZXRGaWx0ZXJzLmVtaXQodGhpcy5nZXRTZWxlY3RlZERhdGEoKSk7XHJcbiAgICB0aGlzLmlzRmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRDb3VudChpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW2luZGV4XS5vcHRpb25zLmZpbHRlcigobykgPT4gby5jaGVja2VkKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZEl0ZW0oaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpbmRleF0ub3B0aW9ucy5maW5kKChvKSA9PiBvLmNoZWNrZWQpID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGZpbHRlci1idXR0b24gcG9zaXRpb24tcmVsYXRpdmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyKCRldmVudClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRmlsdGVyXHJcbiAgICAgICAgQGlmKGlzRmlsdGVyQXBwbGllZCl7XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiYWN0aXZlLWZpbHRlclwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjVcIiBmaWxsPVwicmVkXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICB9XHJcblxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgQGlmKGlzRmlsdGVyT3Blbil7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyb3Bkb3duXCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxoMj5GaWx0ZXIgT3B0aW9uczwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uUmVzZXRGaWx0ZXIoKVwiPlJlc2V0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJvbkFwcGx5RmlsdGVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNGaWx0ZXJQcm9wZXJcIj5BcHBseTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICBAZm9yIChmaWx0ZXIgb2YgZmlsdGVyczsgbGV0IGZpID0gJGluZGV4OyB0cmFjayBmaSkge1xyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWJ1dHRvbiBmb3JtLXNlbGVjdFwiIChjbGljayk9XCJ0b2dnbGVJdGVtKCRldmVudCwgZmkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ211bHRpJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmlsdGVyLnRpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFNlbGVjdGVkQ291bnQoZmkpID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtY291bnRcIj57eyBnZXRTZWxlY3RlZENvdW50KGZpKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0U2VsZWN0ZWRJdGVtKGZpKT8ubmFtZSA/PyBmaWx0ZXIudGl0bGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdjdXN0b20nICYmIGdldFNlbGVjdGVkSXRlbShmaSk/LnZhbHVlKXtcclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgY3VzdG9tLWlucHV0XCIgdHlwZT1cInRleHRcIiBpbnB1dG1vZGU9XCJudW1lcmljXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXN0b21EYXRhW2ZpXS5taW5cIiAobmdNb2RlbENoYW5nZSk9XCJ2YWxpZGF0ZUN1c3RvbUZpbHRlcigpXCIgcGxhY2Vob2xkZXI9XCIwJVwiPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGdldFNlbGVjdGVkSXRlbShmaSk/LnZhbHVlID09PSAnYmV0d2Vlbicpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBjdXN0b20taW5wdXRcIiB0eXBlPVwidGV4dFwiIGlucHV0bW9kZT1cIm51bWVyaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1c3RvbURhdGFbZmldLm1heFwiIChuZ01vZGVsQ2hhbmdlKT1cInZhbGlkYXRlQ3VzdG9tRmlsdGVyKClcIiBwbGFjZWhvbGRlcj1cIjAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLmlzT3BlbmVkKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWRyb3Bkb3duXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ211bHRpJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInc2VsZWN0QWxsJyArIGZpXCIgW2NoZWNrZWRdPVwiaXNBbGxWaXNpYmxlU2VsZWN0ZWRCeUZpbHRlcihmaWx0ZXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsVmlzaWJsZUJ5RmlsdGVyKCRldmVudCwgZmlsdGVyKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInc2VsZWN0QWxsJyArIGZpXCI+U2VsZWN0IGFsbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxocj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDE2IDE3XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0IDE0LjVMMTEuMSAxMS42TTEyLjY2NjcgNy44MzMzM0MxMi42NjY3IDEwLjc3ODkgMTAuMjc4OSAxMy4xNjY3IDcuMzMzMzMgMTMuMTY2N0M0LjM4NzgxIDEzLjE2NjcgMiAxMC43Nzg5IDIgNy44MzMzM0MyIDQuODg3ODEgNC4zODc4MSAyLjUgNy4zMzMzMyAyLjVDMTAuMjc4OSAyLjUgMTIuNjY2NyA0Ljg4NzgxIDEyLjY2NjcgNy44MzMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZpZWxkXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoKCRldmVudCwgZmkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZGlzcGxheWVkT3B0aW9uc1tmaV0ubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm8tZGF0YVwiPk5vIERhdGE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGZvcihvcHRpb24gb2YgZGlzcGxheWVkT3B0aW9uc1tmaV07IGxldCBvaSA9ICRpbmRleDsgdHJhY2sgb2kpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdzaW5nbGUnKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLW9wdGlvblwiIChjbGljayk9XCJvblNpbmdsZVNlbGVjdChmaWx0ZXIsIG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYWRpby1jaXJjbGVcIiBbY2xhc3Muc2VsZWN0ZWRdPVwib3B0aW9uLmNoZWNrZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBvcHRpb24ubmFtZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdtdWx0aScpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwib3B0aW9uLnZhbHVlXCIgWyhuZ01vZGVsKV09XCJvcHRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uT3B0aW9uQ2hhbmdlKGZpbHRlciwgb3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubmFtZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdjdXN0b20nKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLW9wdGlvblwiIFtjbGFzcy5zZWxlY3RlZF09XCJnZXRTZWxlY3RlZEl0ZW0oZmkpPy52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ3VzdG9tU2VsZWN0KGZpLCBmaWx0ZXIsIG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IG9wdGlvbi5uYW1lIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuPC9kaXY+Il19
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbm8tZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vZ3JhbS9wbGFuby10YWJsZS9wbGFuby1maWx0ZXIvcGxhbm8tZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vZ3JhbS9wbGFuby10YWJsZS9wbGFuby1maWx0ZXIvcGxhbm8tZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFVMUMsTUFBTSxPQUFPLG9CQUFvQjtJQW9EWDtJQW5EWCxRQUFRLENBQVM7SUFFMUIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixnQkFBZ0IsR0FBWSxFQUFFLENBQUM7SUFDL0IsY0FBYyxHQUFZLElBQUksQ0FBQztJQUMvQixlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLE9BQU8sR0FBRztRQUNSLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQVcsRUFBRTtRQUMxRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxR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QixNQUFNO2dCQXVGUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcInBsYW5vLWZpbHRlclwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0Zvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGxhbm8tZmlsdGVyLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9wbGFuby1maWx0ZXIuY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYW5vRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgaXNGaWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgZGlzcGxheWVkT3B0aW9uczogYW55W11bXSA9IFtdO1xyXG4gIGlzRmlsdGVyUHJvcGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0ZpbHRlckFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZmlsdGVycyA9IFtcclxuICAgIHsgdGl0bGU6IFwiQ291bnRyeVwiLCB0eXBlOiBcIm11bHRpXCIsIGlzT3BlbmVkOiBmYWxzZSwgb3B0aW9uczogW10gYXMgYW55W10gfSxcclxuICAgIHsgdGl0bGU6IFwiQ2l0eVwiLCB0eXBlOiBcIm11bHRpXCIsIGlzT3BlbmVkOiBmYWxzZSwgb3B0aW9uczogW10gYXMgYW55W10gfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6IFwiQ29tcGxpYW5jZSBDb25kaXRpb25cIixcclxuICAgICAgdHlwZTogXCJjdXN0b21cIixcclxuICAgICAgaXNPcGVuZWQ6IGZhbHNlLFxyXG4gICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcIj4gR3JlYXRlciB0aGFuXCIsIHZhbHVlOiBcImdyZWF0ZXJUaGFuXCIsIGNoZWNrZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIjwgTGVzc2VyIHRoYW5cIiwgdmFsdWU6IFwibGVzc2VyVGhhblwiLCBjaGVja2VkOiBmYWxzZSB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6IFwiPj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIsXHJcbiAgICAgICAgICB2YWx1ZTogXCJncmVhdGVyVGhhbkFuZEVxdWFsXCIsXHJcbiAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6IFwiPD0gTGVzc2VyIHRoYW4gb3IgZXF1YWwgdG9cIixcclxuICAgICAgICAgIHZhbHVlOiBcImxlc3NlclRoYW5BbmRFcXVhbFwiLFxyXG4gICAgICAgICAgY2hlY2tlZDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IG5hbWU6IFwiKCApIEJldHdlZW5cIiwgdmFsdWU6IFwiYmV0d2VlblwiLCBjaGVja2VkOiBmYWxzZSB9LFxyXG4gICAgICBdLFxyXG4gICAgfSxcclxuICAgIC8vIHtcclxuICAgIC8vICAgdGl0bGU6IFwiU3RvcmUgbWV0aG9kXCIsXHJcbiAgICAvLyAgIHR5cGU6IFwic2luZ2xlXCIsXHJcbiAgICAvLyAgIGlzT3BlbmVkOiBmYWxzZSxcclxuICAgIC8vICAgb3B0aW9uczogW1xyXG4gICAgLy8gICAgIHsgbmFtZTogXCJJVk1cIiwgdmFsdWU6IFwiaXZtXCIsIGNoZWNrZWQ6IGZhbHNlIH0sXHJcbiAgICAvLyAgICAgeyBuYW1lOiBcIk5vbiBJVk1cIiwgdmFsdWU6IFwibm9uSXZtXCIsIGNoZWNrZWQ6IGZhbHNlIH0sXHJcbiAgICAvLyAgIF0sXHJcbiAgICAvLyB9LFxyXG4gIF07XHJcblxyXG4gIEBPdXRwdXQoKSBhcHBseUZpbHRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcmVzZXRGaWx0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZpbHRlckNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY3VzdG9tRGF0YToge1xyXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcclxuICAgIG1pbjogbnVtYmVyIHwgbnVsbDtcclxuICAgIG1heDogbnVtYmVyIHwgbnVsbDtcclxuICB9W10gPSBbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zID0gdGhpcy5maWx0ZXJzLm1hcCgoZikgPT5cclxuICAgICAgZi5vcHRpb25zID8gWy4uLmYub3B0aW9uc10gOiBbXVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoXywgaSkgPT4ge1xyXG4gICAgICB0aGlzLmN1c3RvbURhdGFbaV0gPSB7IHR5cGU6IG51bGwsIG1pbjogbnVsbCwgbWF4OiBudWxsIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiY2xpZW50SWRcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmxvYWRDb3VudHJpZXMoKTtcclxuICAgICAgdGhpcy5sb2FkQ2l0aWVzKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRDb3VudHJpZXMoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmdldENvdW50cmllcyh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkIH0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnRyaWVzID1cclxuICAgICAgICAgICAgICByZXM/LmRhdGE/LmNvdW50cnlEYXRhLm1hcCgoYzogYW55KSA9PiBjLmNvdW50cnkpID8/IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzWzBdLm9wdGlvbnMgPSBjb3VudHJpZXMubWFwKChjOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgICAgbmFtZTogYyxcclxuICAgICAgICAgICAgICB2YWx1ZTogYyxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbMF0gPSBbLi4udGhpcy5maWx0ZXJzWzBdLm9wdGlvbnNdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBsb2FkQ291bnRyaWVzIFtFUlJdOlwiLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZENpdGllcyhzZWxlY3RlZENvdW50cmllczogc3RyaW5nW10pIHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBjb3VudHJ5OiBzZWxlY3RlZENvdW50cmllcyxcclxuICAgICAgY2l0eTogW10sXHJcbiAgICAgIGdyb3VwOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmdldFJlZ2lvbnMocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZWdpb25zID1cclxuICAgICAgICAgICAgICByZXM/LmRhdGE/LmxvY2F0aW9uRGF0YT8ubWFwKChyOiBhbnkpID0+IHI/LmNpdHkpID8/IFtdO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb2xkQ2hlY2tlZCA9IHRoaXMuZmlsdGVyc1sxXS5vcHRpb25zXHJcbiAgICAgICAgICAgICAgLmZpbHRlcigobykgPT4gby5jaGVja2VkKVxyXG4gICAgICAgICAgICAgIC5tYXAoKG8pID0+IG8udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzWzFdLm9wdGlvbnMgPSByZWdpb25zLm1hcCgoY2l0eTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgIG5hbWU6IGNpdHksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNpdHksXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogb2xkQ2hlY2tlZC5pbmNsdWRlcyhjaXR5KSxcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zWzFdID0gWy4uLnRoaXMuZmlsdGVyc1sxXS5vcHRpb25zXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gbG9hZENpdGllcyBbRVJSXTpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5pdGVtLWJ1dHRvblwiKSB8fCB0YXJnZXQuY2xvc2VzdChcIi5pdGVtLWRyb3Bkb3duXCIpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYsIGkpID0+IHtcclxuICAgICAgaWYgKGYuaXNPcGVuZWQpIHRoaXMucmVzZXRTZWFyY2goaSk7XHJcbiAgICAgIGYuaXNPcGVuZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5maWx0ZXItZHJvcGRvd25cIikpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gIXRoaXMuaXNGaWx0ZXJPcGVuO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSXRlbShldmVudDogTW91c2VFdmVudCwgaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmLCBpKSA9PiB7XHJcbiAgICAgIGlmIChpID09PSBpdGVtSW5kZXgpIHtcclxuICAgICAgICBmLmlzT3BlbmVkID0gIWYuaXNPcGVuZWQ7XHJcbiAgICAgICAgaWYgKCFmLmlzT3BlbmVkKSB0aGlzLnJlc2V0U2VhcmNoKGkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmLmlzT3BlbmVkKSB0aGlzLnJlc2V0U2VhcmNoKGkpO1xyXG4gICAgICAgIGYuaXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXNldFNlYXJjaChmaWx0ZXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdID0gWy4uLnRoaXMuZmlsdGVyc1tmaWx0ZXJJbmRleF0ub3B0aW9uc107XHJcbiAgfVxyXG5cclxuICBvblNpbmdsZVNlbGVjdChmaWx0ZXI6IGFueSwgb3B0aW9uOiBhbnkpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNbaW5kZXhdLm9wdGlvbnMuZm9yRWFjaCgobykgPT4gKG8uY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICBvcHRpb24uY2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2luZGV4XSA9IFsuLi50aGlzLmZpbHRlcnNbaW5kZXhdLm9wdGlvbnNdO1xyXG4gICAgdGhpcy5maWx0ZXJzW2luZGV4XS5pc09wZW5lZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChmaWx0ZXIudGl0bGUgPT09IFwiQ291bnRyeVwiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25DdXN0b21TZWxlY3QoZmk6IG51bWJlciwgZmlsdGVyOiBhbnksIG9wdGlvbjogYW55KSB7XHJcbiAgICB0aGlzLmZpbHRlcnNbZmldLm9wdGlvbnMuZm9yRWFjaCgobykgPT4gKG8uY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICBvcHRpb24uY2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ZpXSA9IFsuLi50aGlzLmZpbHRlcnNbZmldLm9wdGlvbnNdO1xyXG4gICAgdGhpcy5maWx0ZXJzW2ZpXS5pc09wZW5lZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuY3VzdG9tRGF0YVtmaV0gPSB7XHJcbiAgICAgIHR5cGU6IG9wdGlvbi52YWx1ZSxcclxuICAgICAgbWluOiBudWxsLFxyXG4gICAgICBtYXg6IG51bGwsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGVDdXN0b21GaWx0ZXIoKTtcclxuICAgIHRoaXMuZW1pdEZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uT3B0aW9uQ2hhbmdlKGZpbHRlcjogYW55LCBvcHRpb246IGFueSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbHRlcnMuaW5kZXhPZihmaWx0ZXIpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChmaWx0ZXIudGl0bGUgPT09IFwiQ291bnRyeVwiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLmZpbHRlcnNbMF0ub3B0aW9uc1xyXG4gICAgICAuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKG8pID0+IG8udmFsdWUpO1xyXG4gICAgdGhpcy5sb2FkQ2l0aWVzKHNlbGVjdGVkQ291bnRyaWVzKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlTnVtYmVyKGZpOiBudW1iZXIsIGZpZWxkOiBcIm1pblwiIHwgXCJtYXhcIikge1xyXG4gICAgbGV0IHJhdyA9IFN0cmluZyh0aGlzLmN1c3RvbURhdGFbZmldW2ZpZWxkXSA/PyBcIlwiKTtcclxuICAgIHJhdyA9IHJhdy5yZXBsYWNlKC9bXjAtOV0vZywgXCJcIikuc2xpY2UoMCwgMyk7XHJcblxyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XHJcbiAgICB0aGlzLmN1c3RvbURhdGFbZmldW2ZpZWxkXSA9IGlzTmFOKG51bSkgPyBudWxsIDogTWF0aC5taW4obnVtLCAxMDApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGVDdXN0b21GaWx0ZXIoKTtcclxuICAgIHRoaXMuZW1pdEZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlQ3VzdG9tRmlsdGVyKCkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbHRlcnMuZmluZEluZGV4KChmKSA9PiBmLnR5cGUgPT09IFwiY3VzdG9tXCIpO1xyXG5cclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5pc0ZpbHRlclByb3BlciA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb25mID0gdGhpcy5jdXN0b21EYXRhW2luZGV4XTtcclxuXHJcbiAgICBpZiAoIWNvbmYudHlwZSkge1xyXG4gICAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1pbiA9IGNvbmYubWluO1xyXG4gICAgY29uc3QgbWF4ID0gY29uZi5tYXg7XHJcblxyXG4gICAgc3dpdGNoIChjb25mLnR5cGUpIHtcclxuICAgICAgY2FzZSBcImdyZWF0ZXJUaGFuXCI6XHJcbiAgICAgICAgdGhpcy5pc0ZpbHRlclByb3BlciA9IG1pbiAhPT0gbnVsbCAmJiBtaW4gPj0gMCAmJiBtaW4gPCAxMDA7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwibGVzc2VyVGhhblwiOlxyXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJQcm9wZXIgPSBtaW4gIT09IG51bGwgJiYgbWluID4gMCAmJiBtaW4gPD0gMTAwO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImdyZWF0ZXJUaGFuQW5kRXF1YWxcIjpcclxuICAgICAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gbWluICE9PSBudWxsICYmIG1pbiA+PSAwICYmIG1pbiA8PSAxMDA7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwibGVzc2VyVGhhbkFuZEVxdWFsXCI6XHJcbiAgICAgICAgdGhpcy5pc0ZpbHRlclByb3BlciA9IG1pbiAhPT0gbnVsbCAmJiBtaW4gPj0gMCAmJiBtaW4gPD0gMTAwO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImJldHdlZW5cIjpcclxuICAgICAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID1cclxuICAgICAgICAgIG1pbiAhPT0gbnVsbCAmJiBtYXggIT09IG51bGwgJiYgbWluID49IDAgJiYgbWF4IDw9IDEwMCAmJiBtaW4gPCBtYXg7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJQcm9wZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBbGxWaXNpYmxlU2VsZWN0ZWQoZmlsdGVySW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZGlzcGxheWVkT3B0aW9uc1tmaWx0ZXJJbmRleF07XHJcbiAgICByZXR1cm4gdmlzaWJsZS5sZW5ndGggPiAwICYmIHZpc2libGUuZXZlcnkoKHYpID0+IHYuY2hlY2tlZCk7XHJcbiAgfVxyXG5cclxuICBpc0FsbFZpc2libGVTZWxlY3RlZEJ5RmlsdGVyKGZpbHRlcjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpID09PSAtMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMuaXNBbGxWaXNpYmxlU2VsZWN0ZWQoaSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3RBbGxWaXNpYmxlKGV2ZW50OiBhbnksIGZpbHRlckluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZGlzcGxheWVkT3B0aW9uc1tmaWx0ZXJJbmRleF0uZm9yRWFjaChcclxuICAgICAgKG9wdCkgPT4gKG9wdC5jaGVja2VkID0gY2hlY2tlZClcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMuZmlsdGVyc1tmaWx0ZXJJbmRleF0udGl0bGUgPT09IFwiQ291bnRyeVwiKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2l0eUxpc3RGcm9tQVBJKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsVmlzaWJsZUJ5RmlsdGVyKGV2ZW50OiBhbnksIGZpbHRlcjogYW55KSB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpID09PSAtMSkgcmV0dXJuO1xyXG4gICAgdGhpcy50b2dnbGVTZWxlY3RBbGxWaXNpYmxlKGV2ZW50LCBpKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKGV2ZW50OiBhbnksIGZpbHRlckluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHRlcm0gPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMuZmlsdGVyc1tmaWx0ZXJJbmRleF0ub3B0aW9ucztcclxuXHJcbiAgICBpZiAoIXRlcm0pIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ZpbHRlckluZGV4XSA9IFsuLi5mdWxsTGlzdF07XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdID0gZnVsbExpc3QuZmlsdGVyKChvKSA9PlxyXG4gICAgICBvLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmLCBpKSA9PiB7XHJcbiAgICAgIGlmIChmLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcclxuICAgICAgICBjb25zdCBjZCA9IHRoaXMuY3VzdG9tRGF0YVtpXTtcclxuXHJcbiAgICAgICAgaWYgKCFjZC50eXBlKSB7XHJcbiAgICAgICAgICByZXR1cm4geyB0aXRsZTogZi50aXRsZSwgc2VsZWN0ZWQ6IG51bGwgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtaW4gPSBjZC5taW47XHJcbiAgICAgICAgbGV0IG1heCA9IGNkLm1heDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjZC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFwibGVzc2VyVGhhblwiOlxyXG4gICAgICAgICAgICBpZiAobWluICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IGYudGl0bGUsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogeyB0eXBlOiBjZC50eXBlLCBtaW46IDAsIG1heDogbWluIC0gMSB9LFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBcImdyZWF0ZXJUaGFuXCI6XHJcbiAgICAgICAgICAgIGlmIChtaW4gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogZi50aXRsZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB7IHR5cGU6IGNkLnR5cGUsIG1pbjogbWluICsgMSwgbWF4OiAxMDAgfSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgXCJsZXNzZXJUaGFuQW5kRXF1YWxcIjpcclxuICAgICAgICAgICAgaWYgKG1pbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBmLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHsgdHlwZTogY2QudHlwZSwgbWluOiAwLCBtYXg6IG1pbiB9LFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBcImdyZWF0ZXJUaGFuQW5kRXF1YWxcIjpcclxuICAgICAgICAgICAgaWYgKG1pbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBmLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHsgdHlwZTogY2QudHlwZSwgbWluOiBtaW4sIG1heDogMTAwIH0sXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFwiYmV0d2VlblwiOlxyXG4gICAgICAgICAgICBpZiAobWluICE9IG51bGwgJiYgbWF4ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICByZXR1cm4geyB0aXRsZTogZi50aXRsZSwgc2VsZWN0ZWQ6IHsgdHlwZTogY2QudHlwZSwgbWluLCBtYXggfSB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW52YWxpZCDihpIgcmV0dXJuIG51bGxcclxuICAgICAgICByZXR1cm4geyB0aXRsZTogZi50aXRsZSwgc2VsZWN0ZWQ6IG51bGwgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGYudHlwZSA9PT0gXCJzaW5nbGVcIikge1xyXG4gICAgICAgIGNvbnN0IHNlbCA9IGYub3B0aW9ucy5maW5kKChvKSA9PiBvLmNoZWNrZWQpO1xyXG4gICAgICAgIHJldHVybiB7IHRpdGxlOiBmLnRpdGxlLCBzZWxlY3RlZDogc2VsID8gc2VsLnZhbHVlIDogbnVsbCB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRpdGxlOiBmLnRpdGxlLFxyXG4gICAgICAgIHNlbGVjdGVkOiBmLm9wdGlvbnMuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpLm1hcCgobykgPT4gby52YWx1ZSksXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGVtaXRGaWx0ZXJDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2VkLmVtaXQodGhpcy5nZXRTZWxlY3RlZERhdGEoKSk7XHJcbiAgfVxyXG5cclxuICBvbkFwcGx5RmlsdGVyKCkge1xyXG4gICAgdGhpcy5pc0ZpbHRlck9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmKSA9PiAoZi5pc09wZW5lZCA9IGZhbHNlKSk7XHJcbiAgICBjb25zdCBmaW5hbERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSgpO1xyXG4gICAgdGhpcy5hcHBseUZpbHRlcnMuZW1pdChmaW5hbERhdGEpO1xyXG5cclxuICAgIGNvbnN0IGNvdW50cnkgPSBmaW5hbERhdGFbMF0uc2VsZWN0ZWQ7XHJcbiAgICBjb25zdCBjaXR5ID0gZmluYWxEYXRhWzFdLnNlbGVjdGVkO1xyXG4gICAgY29uc3QgY29tcGxpYW5jZSA9IGZpbmFsRGF0YVsyXS5zZWxlY3RlZDtcclxuICAgIC8vIGNvbnN0IG1ldGhvZCA9IGV2ZW50WzNdLnNlbGVjdGVkO1xyXG5cclxuICAgIGlmIChjb3VudHJ5Lmxlbmd0aCB8fCBjaXR5Lmxlbmd0aCB8fCBjb21wbGlhbmNlKSB7XHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJBcHBsaWVkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJBcHBsaWVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlc2V0RmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYpID0+IGYub3B0aW9ucy5mb3JFYWNoKChvKSA9PiAoby5jaGVja2VkID0gZmFsc2UpKSk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzWzFdLm9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuZGlzcGxheWVkT3B0aW9uc1sxXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChfLCBpKSA9PiB7XHJcbiAgICAgIHRoaXMuY3VzdG9tRGF0YVtpXSA9IHsgdHlwZTogbnVsbCwgbWluOiBudWxsLCBtYXg6IG51bGwgfTtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ldID0gWy4uLnRoaXMuZmlsdGVyc1tpXS5vcHRpb25zXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzRmlsdGVyUHJvcGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmKSA9PiAoZi5pc09wZW5lZCA9IGZhbHNlKSk7XHJcbiAgICB0aGlzLmxvYWRDaXRpZXMoW10pO1xyXG5cclxuICAgIHRoaXMucmVzZXRGaWx0ZXJzLmVtaXQodGhpcy5nZXRTZWxlY3RlZERhdGEoKSk7XHJcbiAgICB0aGlzLmlzRmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRDb3VudChpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW2luZGV4XS5vcHRpb25zLmZpbHRlcigobykgPT4gby5jaGVja2VkKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZEl0ZW0oaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpbmRleF0ub3B0aW9ucy5maW5kKChvKSA9PiBvLmNoZWNrZWQpID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGZpbHRlci1idXR0b24gcG9zaXRpb24tcmVsYXRpdmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyKCRldmVudClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRmlsdGVyXHJcbiAgICAgICAgQGlmKGlzRmlsdGVyQXBwbGllZCl7XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiYWN0aXZlLWZpbHRlclwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjVcIiBmaWxsPVwicmVkXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICB9XHJcblxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgQGlmKGlzRmlsdGVyT3Blbil7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyb3Bkb3duXCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxoMj5GaWx0ZXIgT3B0aW9uczwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uUmVzZXRGaWx0ZXIoKVwiPlJlc2V0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJvbkFwcGx5RmlsdGVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNGaWx0ZXJQcm9wZXJcIj5BcHBseTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICBAZm9yIChmaWx0ZXIgb2YgZmlsdGVyczsgbGV0IGZpID0gJGluZGV4OyB0cmFjayBmaSkge1xyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWJ1dHRvbiBmb3JtLXNlbGVjdFwiIChjbGljayk9XCJ0b2dnbGVJdGVtKCRldmVudCwgZmkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ211bHRpJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmlsdGVyLnRpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFNlbGVjdGVkQ291bnQoZmkpID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtY291bnRcIj57eyBnZXRTZWxlY3RlZENvdW50KGZpKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0U2VsZWN0ZWRJdGVtKGZpKT8ubmFtZSA/PyBmaWx0ZXIudGl0bGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdjdXN0b20nICYmIGdldFNlbGVjdGVkSXRlbShmaSk/LnZhbHVlKXtcclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgY3VzdG9tLWlucHV0XCIgdHlwZT1cInRleHRcIiBpbnB1dG1vZGU9XCJudW1lcmljXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXN0b21EYXRhW2ZpXS5taW5cIiAobmdNb2RlbENoYW5nZSk9XCJ2YWxpZGF0ZU51bWJlcihmaSwgJ21pbicpXCIgcGxhY2Vob2xkZXI9XCIwJVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0U2VsZWN0ZWRJdGVtKGZpKT8udmFsdWUgPT09ICdiZXR3ZWVuJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGN1c3RvbS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VzdG9tRGF0YVtmaV0ubWF4XCIgKG5nTW9kZWxDaGFuZ2UpPVwidmFsaWRhdGVOdW1iZXIoZmksICdtYXgnKVwiIHBsYWNlaG9sZGVyPVwiMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLmlzT3BlbmVkKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWRyb3Bkb3duXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ211bHRpJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInc2VsZWN0QWxsJyArIGZpXCIgW2NoZWNrZWRdPVwiaXNBbGxWaXNpYmxlU2VsZWN0ZWRCeUZpbHRlcihmaWx0ZXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsVmlzaWJsZUJ5RmlsdGVyKCRldmVudCwgZmlsdGVyKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInc2VsZWN0QWxsJyArIGZpXCI+U2VsZWN0IGFsbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxocj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDE2IDE3XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0IDE0LjVMMTEuMSAxMS42TTEyLjY2NjcgNy44MzMzM0MxMi42NjY3IDEwLjc3ODkgMTAuMjc4OSAxMy4xNjY3IDcuMzMzMzMgMTMuMTY2N0M0LjM4NzgxIDEzLjE2NjcgMiAxMC43Nzg5IDIgNy44MzMzM0MyIDQuODg3ODEgNC4zODc4MSAyLjUgNy4zMzMzMyAyLjVDMTAuMjc4OSAyLjUgMTIuNjY2NyA0Ljg4NzgxIDEyLjY2NjcgNy44MzMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZpZWxkXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoKCRldmVudCwgZmkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZGlzcGxheWVkT3B0aW9uc1tmaV0ubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm8tZGF0YVwiPk5vIERhdGE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGZvcihvcHRpb24gb2YgZGlzcGxheWVkT3B0aW9uc1tmaV07IGxldCBvaSA9ICRpbmRleDsgdHJhY2sgb2kpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdzaW5nbGUnKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLW9wdGlvblwiIChjbGljayk9XCJvblNpbmdsZVNlbGVjdChmaWx0ZXIsIG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYWRpby1jaXJjbGVcIiBbY2xhc3Muc2VsZWN0ZWRdPVwib3B0aW9uLmNoZWNrZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBvcHRpb24ubmFtZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdtdWx0aScpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwib3B0aW9uLnZhbHVlXCIgWyhuZ01vZGVsKV09XCJvcHRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uT3B0aW9uQ2hhbmdlKGZpbHRlciwgb3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubmFtZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoZmlsdGVyLnR5cGUgPT09ICdjdXN0b20nKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLW9wdGlvblwiIFtjbGFzcy5zZWxlY3RlZF09XCJnZXRTZWxlY3RlZEl0ZW0oZmkpPy52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ3VzdG9tU2VsZWN0KGZpLCBmaWx0ZXIsIG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IG9wdGlvbi5uYW1lIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuPC9kaXY+Il19