tango-app-ui-analyse-traffic 3.4.1-country.1 → 3.8.0-alpha.0

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.
@@ -3,22 +3,27 @@ import { Subject, takeUntil } from 'rxjs';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@ng-bootstrap/ng-bootstrap";
5
5
  import * as i2 from "../../services/traffic.service";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/forms";
6
+ import * as i3 from "tango-app-ui-shared";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/forms";
8
9
  export class DuplicateComponent {
9
10
  activeModal;
10
11
  service;
12
+ toaster;
11
13
  inputData;
14
+ originalData;
12
15
  selectedTempId;
16
+ alreadyTagged;
13
17
  selectedTime;
14
18
  description;
15
19
  objectsArray = [{ 'folderName': '11 AM - 12 PM' }, { 'folderName': '12 PM - 1 PM' }, { 'folderName': '1 PM - 2 PM' }, { 'folderName': '2 PM - 3 PM' },];
16
20
  checkedIndexes = [];
17
21
  images = [];
18
22
  selectedData = [];
19
- constructor(activeModal, service) {
23
+ constructor(activeModal, service, toaster) {
20
24
  this.activeModal = activeModal;
21
25
  this.service = service;
26
+ this.toaster = toaster;
22
27
  this.checkedIndexes = this.images.map(() => false);
23
28
  }
24
29
  destroy$ = new Subject();
@@ -71,6 +76,7 @@ export class DuplicateComponent {
71
76
  const exists = this.selectedData.some((item) => item.tempId === data.tempId && item.selectedTime === data.selectedTime);
72
77
  if (exists) {
73
78
  this.selectedData = this.selectedData.filter((item) => !(item.tempId === data.tempId && item.selectedTime === data.selectedTime));
79
+ console.log(this.selectedData);
74
80
  }
75
81
  else {
76
82
  this.selectedData.push({ ...data });
@@ -89,60 +95,97 @@ export class DuplicateComponent {
89
95
  selectedTimes(obj) {
90
96
  this.selectedTime = obj;
91
97
  this.inputData.folderName = obj;
98
+ console.log(this.inputData.folderName);
92
99
  this.initialDataLoad();
93
100
  }
94
101
  onSubmit() {
95
102
  let payload = [];
96
- this.selectedData.push({ tempId: this.selectedTempId, selectedTime: this.selectedTime });
97
- this.selectedData.map((data) => {
98
- let obj = {
99
- clientId: this.inputData.clientId,
100
- storeId: this.inputData.storeId[0],
101
- timeRange: data.selectedTime,
102
- dateString: this.inputData.footfallDate,
103
- tempId: data.tempId,
104
- processType: this.inputData.processType,
105
- revopsType: "nonShopper",
106
- nonshoperType: "Duplicate",
107
- customerInfo: {
108
- name: "",
109
- mobile: "",
110
- email: "",
111
- location: "",
112
- age: "",
113
- gender: "",
114
- },
115
- description: this.description,
116
- status: "submitted",
117
- issueList: []
118
- };
119
- payload.push(obj);
120
- });
103
+ // const exists = this.selectedData.some(
104
+ // (item: any) => item.tempId === this.selectedTempId && item.selectedTime === this.selectedTime
105
+ // );
106
+ // console.log(exists,this.alreadyTagged)
107
+ // if(!exists&&!this.alreadyTagged){
108
+ // this.selectedData.push({tempId:this.selectedTempId,selectedTime:this.selectedTime})
109
+ // }
110
+ let inputData = {
111
+ clientId: this.inputData.clientId,
112
+ storeId: this.inputData.storeId[0],
113
+ dateString: this.inputData.footfallDate,
114
+ };
121
115
  this.service
122
- .submitRevopTagging(payload)
116
+ .revoptaggingcount(inputData)
123
117
  .pipe(takeUntil(this.destroy$))
124
118
  ?.subscribe({
125
119
  next: (res) => {
126
120
  if (res && res.code === 200) {
127
- this.activeModal.close('submit');
121
+ console.log(res.data.count, this.selectedData.length, this.originalData);
122
+ if (res.data.count <= 0 && this.originalData.length === 0 || res.data.count < this.selectedData.length && this.originalData.length === 0) {
123
+ this.toaster.getErrorToast("Tag limit reached! Try tagging under different categories");
124
+ return;
125
+ }
126
+ else {
127
+ if (this.originalData.length === 1 && this.selectedData.length > res.data.count) {
128
+ this.toaster.getErrorToast("Tag limit reached! Try tagging under different categories");
129
+ return;
130
+ }
131
+ this.selectedData = [...this.selectedData, ...this.originalData];
132
+ this.selectedData.map((data) => {
133
+ let obj = {
134
+ clientId: this.inputData.clientId,
135
+ storeId: this.inputData.storeId[0],
136
+ timeRange: data.selectedTime,
137
+ dateString: this.inputData.footfallDate,
138
+ tempId: data.tempId,
139
+ processType: this.inputData.processType,
140
+ revopsType: "nonShopper",
141
+ nonshoperType: "Duplicate",
142
+ customerInfo: {
143
+ name: "",
144
+ mobile: "",
145
+ email: "",
146
+ location: "",
147
+ age: "",
148
+ gender: "",
149
+ },
150
+ description: this.description,
151
+ status: "submitted",
152
+ issueList: []
153
+ };
154
+ payload.push(obj);
155
+ });
156
+ this.service
157
+ .submitRevopTagging(payload)
158
+ .pipe(takeUntil(this.destroy$))
159
+ ?.subscribe({
160
+ next: (res) => {
161
+ if (res && res.code === 200) {
162
+ this.activeModal.close('submit');
163
+ }
164
+ }, error: (err) => {
165
+ },
166
+ complete: () => { },
167
+ });
168
+ }
128
169
  }
129
- }, error: (err) => {
130
- },
131
- complete: () => { },
170
+ }
132
171
  });
133
172
  }
134
173
  cancel() {
135
174
  this.activeModal.close('cancel');
136
175
  }
137
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DuplicateComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TrafficService }], target: i0.ɵɵFactoryTarget.Component });
138
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DuplicateComponent, selector: "lib-duplicate", inputs: { inputData: "inputData", selectedTempId: "selectedTempId" }, ngImport: i0, template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-3 rounded border mt-3 p-3 border-2 me-5\" \r\n *ngFor=\"let obj of images\"\r\n [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\"\r\n >\r\n <div class=\"form-check mb-2\">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n \r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;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}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}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}.overflow-x{overflow-x:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
176
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DuplicateComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TrafficService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
177
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DuplicateComponent, selector: "lib-duplicate", inputs: { inputData: "inputData", originalData: "originalData", selectedTempId: "selectedTempId", alreadyTagged: "alreadyTagged" }, ngImport: i0, template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-4 \" \r\n *ngFor=\"let obj of images\"\r\n \r\n >\r\n <div class=\"p-3 rounded border mt-3 border-2 \" [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\">\r\n <div class=\"form-check mb-2 \">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;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}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}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}.overflow-x{overflow-x:auto}.scroll-y{overflow-x:hidden}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
139
178
  }
140
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DuplicateComponent, decorators: [{
141
180
  type: Component,
142
- args: [{ selector: 'lib-duplicate', template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-3 rounded border mt-3 p-3 border-2 me-5\" \r\n *ngFor=\"let obj of images\"\r\n [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\"\r\n >\r\n <div class=\"form-check mb-2\">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n \r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;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}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}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}.overflow-x{overflow-x:auto}\n"] }]
143
- }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.TrafficService }], propDecorators: { inputData: [{
181
+ args: [{ selector: 'lib-duplicate', template: "<div class=\"row h-550px scroll-container scroll-y w-100\">\r\n <div class=\"col-md-12 p-5\">\r\n <div class=\"row mb-3\">\r\n \r\n <h3 class=\"card-title mx-5\">\r\n <div class=\"title-text mx-2 mt-3\">Tag Duplicate ID</div>\r\n <div class=\"text-sub mx-2 my-1\">Identify and tag the original ID this entry duplicates.</div>\r\n </h3>\r\n\r\n </div>\r\n <div class=\"separator separator-double m-3\"></div>\r\n <div class=\"d-flex mt-2 mb-2 w-100 overflow-x px-0\">\r\n \r\n <div class=\"col text-nowrap\" *ngFor=\"let obj of objectsArray\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item cursor-pointer\">\r\n <a (click)=\"selectedTimes(obj.folderName)\"\r\n [ngClass]=\"selectedTime === obj?.folderName ? 'active' : ''\" class=\"nav-link cursor-pointer no-border mx-3 mb-2\">\r\n {{obj?.folderName}}<span class=\"mx-2 \" [ngClass]=\"selectedTime === obj?.folderName ? 'badge-num-primary' :'badge-num-muted'\">{{obj?.count?obj?.count:0}}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-gray-active1 mx-3 p-5\">\r\n\r\n <div class=\"row g-3\">\r\n <div \r\n class=\"col-md-4 \" \r\n *ngFor=\"let obj of images\"\r\n \r\n >\r\n <div class=\"p-3 rounded border mt-3 border-2 \" [ngClass]=\"{\r\n 'border-primary': isChecked(obj),\r\n 'border-secondary': !isChecked(obj)\r\n }\">\r\n <div class=\"form-check mb-2 \">\r\n <input *ngIf=\"selectedTempId!==obj?.tempId\"\r\n class=\"form-check-input mt-1\"\r\n type=\"checkbox\"\r\n [id]=\"'flexCheck' + obj.tempId\"\r\n (change)=\"toggleCheck(obj)\"\r\n [checked]=\"isChecked(obj)\"\r\n />\r\n <label class=\"form-check-label ms-1\" [for]=\"'flexCheck' + obj.tempId\">\r\n {{ obj?.tempId }}\r\n </label>\r\n </div>\r\n <img [src]=\"obj.image\" alt=\"Image\" class=\"img-fluid w-100 h-200px rounded\" />\r\n </div>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n \r\n <div class=\"col-md-12 mt-5 pb-5\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName\">Description (Optional)</label>\r\n <textarea [(ngModel)]=\"description\" class=\"form-control mt-3\" rows=\"3\" placeholder=\"\"></textarea>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-end mt-5\">\r\n <button type=\"button\" class=\"btn btn-outline mt-3 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"btn btn-primary mt-3\" (click)=\"onSubmit()\">Submit</button>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.badge-num-primary{border-radius:16px!important;background:var(--Primary-50, #EAF8FF)!important;color:var(--Primary-700, #009BF3)!important;text-align:center;font-size:14px!important;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.badge-num-muted{border-radius:16px!important;background:var(--Primary-50, #F2F4F7)!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.border-gray-active1{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--Primary-50, #ffffff);padding:12px!important}input[type=checkbox]{width:16px!important;height:16px!important;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}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}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}.overflow-x{overflow-x:auto}.scroll-y{overflow-x:hidden}\n"] }]
182
+ }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.TrafficService }, { type: i3.ToastService }], propDecorators: { inputData: [{
183
+ type: Input
184
+ }], originalData: [{
144
185
  type: Input
145
186
  }], selectedTempId: [{
146
187
  type: Input
188
+ }], alreadyTagged: [{
189
+ type: Input
147
190
  }] } });
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJhZmZpYy9zcmMvbGliL2NvbXBvbmVudHMvZHVwbGljYXRlL2R1cGxpY2F0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2R1cGxpY2F0ZS9kdXBsaWNhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU8xQyxNQUFNLE9BQU8sa0JBQWtCO0lBU1Q7SUFBcUM7SUFSaEQsU0FBUyxDQUFLO0lBQ2QsY0FBYyxDQUFLO0lBQzVCLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQztJQUM3SixjQUFjLEdBQWMsRUFBRSxDQUFDO0lBQy9CLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQTtJQUN0QixZQUFvQixXQUEyQixFQUFVLE9BQXVCO1FBQTVELGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQzlFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7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QyxDQUFBO0lBQ04sQ0FBQztJQUNELE1BQU07UUFDSixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO3dHQTlJVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiwySENUL0IsMHNHQXVFTTs7NEZEOURPLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxlQUFlO2dIQUtoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWR1cGxpY2F0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2R1cGxpY2F0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2R1cGxpY2F0ZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIER1cGxpY2F0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgaW5wdXREYXRhOiBhbnlcclxuICBASW5wdXQoKSBzZWxlY3RlZFRlbXBJZDogYW55XHJcbiAgc2VsZWN0ZWRUaW1lOiBhbnk7XHJcbiAgZGVzY3JpcHRpb246IGFueTtcclxuICBvYmplY3RzQXJyYXk6IGFueSA9IFt7ICdmb2xkZXJOYW1lJzogJzExIEFNIC0gMTIgUE0nIH0sIHsgJ2ZvbGRlck5hbWUnOiAnMTIgUE0gLSAxIFBNJyB9LCB7ICdmb2xkZXJOYW1lJzogJzEgUE0gLSAyIFBNJyB9LCB7ICdmb2xkZXJOYW1lJzogJzIgUE0gLSAzIFBNJyB9LF07XHJcbiAgY2hlY2tlZEluZGV4ZXM6IGJvb2xlYW5bXSA9IFtdO1xyXG4gIGltYWdlczogYW55ID0gW107XHJcbiAgc2VsZWN0ZWREYXRhOiBhbnkgPSBbXVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLCBwcml2YXRlIHNlcnZpY2U6IFRyYWZmaWNTZXJ2aWNlLCkge1xyXG4gICAgdGhpcy5jaGVja2VkSW5kZXhlcyA9IHRoaXMuaW1hZ2VzLm1hcCgoKSA9PiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGhpcy5pbnB1dERhdGEuZm9sZGVyTmFtZVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YUxvYWQoKVxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgc3RvcmVJZDogdGhpcy5pbnB1dERhdGEuc3RvcmVJZCxcclxuICAgICAgZm9vdGZhbGxEYXRlOiB0aGlzLmlucHV0RGF0YS5mb290ZmFsbERhdGUsXHJcbiAgICAgIHByb2Nlc3NUeXBlOiB0aGlzLmlucHV0RGF0YS5wcm9jZXNzVHlwZSxcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0Rm9vdGZhbGxEaXJlY3RvcnlGb2xkZXJzKHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgPy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0c0FycmF5ID0gcmVzLmRhdGEuZm9vdGZhbGxEYXRhO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGlzQ2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0YS5zb21lKFxyXG4gICAgICAoaXRlbTogYW55KSA9PiBpdGVtLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWQgJiYgaXRlbS5zZWxlY3RlZFRpbWUgPT09IGRhdGEuc2VsZWN0ZWRUaW1lXHJcbiAgICApO1xyXG4gIH1cclxuICBcclxuXHJcbiAgaW5pdGlhbERhdGFMb2FkKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEZvb3RmYWxsRGlyZWN0b3J5KHRoaXMuaW5wdXREYXRhKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXMuZGF0YS5mb290ZmFsbERhdGEgPSAgcmVzLmRhdGEuZm9vdGZhbGxEYXRhLmZpbHRlcigoZWxlOmFueSk9PmVsZS50ZW1wSWQhPT10aGlzLnNlbGVjdGVkVGVtcElkKVxyXG4gICAgICAgICAgICB0aGlzLmltYWdlcyA9IHJlcy5kYXRhLmZvb3RmYWxsRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICBpbWFnZTogZGF0YS5pbWFnZXMuZW50cnlUaW1lSW1hZ2UsXHJcbiAgICAgICAgICAgICAgdGVtcElkOiBkYXRhLnRlbXBJZCxcclxuICAgICAgICAgICAgICBzZWxlY3RlZFRpbWU6IHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWVcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNoZWNrKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWREYXRhLnNvbWUoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBkYXRhLnRlbXBJZCAmJiBpdGVtLnNlbGVjdGVkVGltZSA9PT0gZGF0YS5zZWxlY3RlZFRpbWVcclxuICAgICk7XHJcbiAgXHJcbiAgICBpZiAoZXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+ICEoaXRlbS50ZW1wSWQgPT09IGRhdGEudGVtcElkICYmIGl0ZW0uc2VsZWN0ZWRUaW1lID09PSBkYXRhLnNlbGVjdGVkVGltZSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goeyAuLi5kYXRhIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcbiAgLy8gdG9nZ2xlQ2hlY2soaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhpbmRleCwgZGF0YSlcclxuICAvLyAgIHRoaXMuY2hlY2tlZEluZGV4ZXNbaW5kZXhdID0gIXRoaXMuY2hlY2tlZEluZGV4ZXNbaW5kZXhdO1xyXG4gIC8vICAgbGV0IGV4aXRzQ291bnQgPSB0aGlzLnNlbGVjdGVkRGF0YS5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUudGVtcElkID09PSBkYXRhLnRlbXBJZCkubGVuZ3RoXHJcblxyXG4gIC8vICAgaWYoZXhpdHNDb3VudD4wICl7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKChvYmo6IGFueSkgPT4gb2JqLnRlbXBJZCAhPT0gZGF0YS50ZW1wSWQpXHJcbiAgLy8gICB9ZWxzZXtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZERhdGEucHVzaChkYXRhKVxyXG4gIC8vICAgfVxyXG5cclxuICAvLyB9XHJcbiAgc2VsZWN0ZWRUaW1lcyhvYmo6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSBvYmpcclxuICAgIHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWUgPSBvYmpcclxuICAgIHRoaXMuaW5pdGlhbERhdGFMb2FkKClcclxuICB9XHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBsZXQgcGF5bG9hZDogYW55ID0gW11cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goe3RlbXBJZDp0aGlzLnNlbGVjdGVkVGVtcElkLHNlbGVjdGVkVGltZTp0aGlzLnNlbGVjdGVkVGltZX0pXHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgICBzdG9yZUlkOiB0aGlzLmlucHV0RGF0YS5zdG9yZUlkWzBdLFxyXG4gICAgICAgIHRpbWVSYW5nZTogZGF0YS5zZWxlY3RlZFRpbWUsXHJcbiAgICAgICAgZGF0ZVN0cmluZzogdGhpcy5pbnB1dERhdGEuZm9vdGZhbGxEYXRlLFxyXG4gICAgICAgIHRlbXBJZDogZGF0YS50ZW1wSWQsXHJcbiAgICAgICAgcHJvY2Vzc1R5cGU6IHRoaXMuaW5wdXREYXRhLnByb2Nlc3NUeXBlLFxyXG4gICAgICAgIHJldm9wc1R5cGU6IFwibm9uU2hvcHBlclwiLFxyXG4gICAgICAgIG5vbnNob3BlclR5cGU6IFwiRHVwbGljYXRlXCIsXHJcbiAgICAgICAgY3VzdG9tZXJJbmZvOiB7XHJcbiAgICAgICAgICBuYW1lOiBcIlwiLFxyXG4gICAgICAgICAgbW9iaWxlOiBcIlwiLFxyXG4gICAgICAgICAgZW1haWw6IFwiXCIsXHJcbiAgICAgICAgICBsb2NhdGlvbjogXCJcIixcclxuICAgICAgICAgIGFnZTogXCJcIixcclxuICAgICAgICAgIGdlbmRlcjogXCJcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIHN0YXR1czogXCJzdWJtaXR0ZWRcIixcclxuICAgICAgICBpc3N1ZUxpc3Q6IFtdXHJcbiAgICAgIH1cclxuICAgICAgcGF5bG9hZC5wdXNoKG9iailcclxuICAgIH0pXHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLnN1Ym1pdFJldm9wVGFnZ2luZyhwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgICAgfSlcclxuICB9XHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnY2FuY2VsJyk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3cgaC01NTBweCBzY3JvbGwtY29udGFpbmVyIHNjcm9sbC15IHctMTAwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHAtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBteC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHQgbXgtMiBtdC0zXCI+VGFnIER1cGxpY2F0ZSBJRDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YiBteC0yIG15LTFcIj5JZGVudGlmeSBhbmQgdGFnIHRoZSBvcmlnaW5hbCBJRCB0aGlzIGVudHJ5IGR1cGxpY2F0ZXMuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2gzPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yIHNlcGFyYXRvci1kb3VibGUgbS0zXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiAgY2xhc3M9XCJkLWZsZXggbXQtMiBtYi0yIHctMTAwIG92ZXJmbG93LXggcHgtMFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPGRpdiAgY2xhc3M9XCJjb2wgdGV4dC1ub3dyYXBcIiAqbmdGb3I9XCJsZXQgb2JqIG9mIG9iamVjdHNBcnJheVwiPlxyXG4gICAgICAgICAgICAgIDx1bCAgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJzZWxlY3RlZFRpbWVzKG9iai5mb2xkZXJOYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRpbWUgPT09IG9iaj8uZm9sZGVyTmFtZSA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG5vLWJvcmRlciBteC0zIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e29iaj8uZm9sZGVyTmFtZX19PHNwYW4gY2xhc3M9XCJteC0yIFwiIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGltZSA9PT0gb2JqPy5mb2xkZXJOYW1lID8gJ2JhZGdlLW51bS1wcmltYXJ5JyA6J2JhZGdlLW51bS1tdXRlZCdcIj57e29iaj8uY291bnQ/b2JqPy5jb3VudDowfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci1ncmF5LWFjdGl2ZTEgbXgtMyBwLTVcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIHJvdW5kZWQgYm9yZGVyIG10LTMgcC0zIGJvcmRlci0yIG1lLTVcIiBcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb2JqIG9mIGltYWdlc1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1wcmltYXJ5JzogaXNDaGVja2VkKG9iaiksXHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLXNlY29uZGFyeSc6ICFpc0NoZWNrZWQob2JqKVxyXG4gICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic2VsZWN0ZWRUZW1wSWQhPT1vYmo/LnRlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidmbGV4Q2hlY2snICsgb2JqLnRlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ2hlY2sob2JqKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQ2hlY2tlZChvYmopXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1zLTFcIiBbZm9yXT1cIidmbGV4Q2hlY2snICsgb2JqLnRlbXBJZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvYmo/LnRlbXBJZCB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwib2JqLmltYWdlXCIgYWx0PVwiSW1hZ2VcIiBjbGFzcz1cImltZy1mbHVpZCB3LTEwMCBoLTIwMHB4IHJvdW5kZWRcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC01IHBiLTVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWVcIj5EZXNjcmlwdGlvbiAoT3B0aW9uYWwpPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICBbKG5nTW9kZWwpXT1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtM1wiIHJvd3M9XCIzXCIgcGxhY2Vob2xkZXI9XCJcIj48L3RleHRhcmVhPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgbXQtNVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtdC0zIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+U3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJhZmZpYy9zcmMvbGliL2NvbXBvbmVudHMvZHVwbGljYXRlL2R1cGxpY2F0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2R1cGxpY2F0ZS9kdXBsaWNhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFTMUMsTUFBTSxPQUFPLGtCQUFrQjtJQVdUO0lBQXFDO0lBQzdDO0lBWEgsU0FBUyxDQUFLO0lBQ2QsWUFBWSxDQUFLO0lBQ2pCLGNBQWMsQ0FBSztJQUNuQixhQUFhLENBQVM7SUFDL0IsWUFBWSxDQUFNO0lBQ2xCLFdBQVcsQ0FBTTtJQUNqQixZQUFZLEdBQVEsQ0FBQyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDO0lBQzdKLGNBQWMsR0FBYyxFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUNqQixZQUFZLEdBQVEsRUFBRSxDQUFBO0lBQ3RCLFlBQW9CLFdBQTJCLEVBQVUsT0FBdUIsRUFDcEUsT0FBcUI7UUFEYixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUNwRSxZQUFPLEdBQVAsT0FBTyxDQUFjO1FBQy9CLElBQUks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QUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUMvQixFQUFFLFNBQVMsQ0FBQzs0QkFDVixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQ0FDakIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUU7b0NBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lDQUVsQzs0QkFDSCxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7NEJBQ3ZCLENBQUM7NEJBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7eUJBQ3BCLENBQUMsQ0FBQTtxQkFDTDtpQkFDRjtZQUNILENBQUM7U0FDRixDQUFDLENBQUE7SUFNTixDQUFDO0lBQ0QsTUFBTTtRQUNKLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7d0dBNUxVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHlMQ1gvQiw4dUdBd0VNOzs0RkQ3RE8sa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWU7MklBS2hCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZHVwbGljYXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHVwbGljYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZHVwbGljYXRlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRHVwbGljYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IGFueVxyXG4gIEBJbnB1dCgpIG9yaWdpbmFsRGF0YTogYW55XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRUZW1wSWQ6IGFueVxyXG4gIEBJbnB1dCgpIGFscmVhZHlUYWdnZWQ6IGJvb2xlYW5cclxuICBzZWxlY3RlZFRpbWU6IGFueTtcclxuICBkZXNjcmlwdGlvbjogYW55O1xyXG4gIG9iamVjdHNBcnJheTogYW55ID0gW3sgJ2ZvbGRlck5hbWUnOiAnMTEgQU0gLSAxMiBQTScgfSwgeyAnZm9sZGVyTmFtZSc6ICcxMiBQTSAtIDEgUE0nIH0sIHsgJ2ZvbGRlck5hbWUnOiAnMSBQTSAtIDIgUE0nIH0sIHsgJ2ZvbGRlck5hbWUnOiAnMiBQTSAtIDMgUE0nIH0sXTtcclxuICBjaGVja2VkSW5kZXhlczogYm9vbGVhbltdID0gW107XHJcbiAgaW1hZ2VzOiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZERhdGE6IGFueSA9IFtdXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsIHByaXZhdGUgc2VydmljZTogVHJhZmZpY1NlcnZpY2UsXHJcbiAgICAgIHByaXZhdGUgdG9hc3RlcjogVG9hc3RTZXJ2aWNlLCkge1xyXG4gICAgdGhpcy5jaGVja2VkSW5kZXhlcyA9IHRoaXMuaW1hZ2VzLm1hcCgoKSA9PiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGhpcy5pbnB1dERhdGEuZm9sZGVyTmFtZVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YUxvYWQoKVxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgc3RvcmVJZDogdGhpcy5pbnB1dERhdGEuc3RvcmVJZCxcclxuICAgICAgZm9vdGZhbGxEYXRlOiB0aGlzLmlucHV0RGF0YS5mb290ZmFsbERhdGUsXHJcbiAgICAgIHByb2Nlc3NUeXBlOiB0aGlzLmlucHV0RGF0YS5wcm9jZXNzVHlwZSxcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0Rm9vdGZhbGxEaXJlY3RvcnlGb2xkZXJzKHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgPy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0c0FycmF5ID0gcmVzLmRhdGEuZm9vdGZhbGxEYXRhO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGlzQ2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0YS5zb21lKFxyXG4gICAgICAoaXRlbTogYW55KSA9PiBpdGVtLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWQgJiYgaXRlbS5zZWxlY3RlZFRpbWUgPT09IGRhdGEuc2VsZWN0ZWRUaW1lXHJcbiAgICApO1xyXG4gIH1cclxuICBcclxuXHJcbiAgaW5pdGlhbERhdGFMb2FkKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEZvb3RmYWxsRGlyZWN0b3J5KHRoaXMuaW5wdXREYXRhKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXMuZGF0YS5mb290ZmFsbERhdGEgPSAgcmVzLmRhdGEuZm9vdGZhbGxEYXRhLmZpbHRlcigoZWxlOmFueSk9PmVsZS50ZW1wSWQhPT10aGlzLnNlbGVjdGVkVGVtcElkKVxyXG4gICAgICAgICAgICB0aGlzLmltYWdlcyA9IHJlcy5kYXRhLmZvb3RmYWxsRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICBpbWFnZTogZGF0YS5pbWFnZXMuZW50cnlUaW1lSW1hZ2UsXHJcbiAgICAgICAgICAgICAgdGVtcElkOiBkYXRhLnRlbXBJZCxcclxuICAgICAgICAgICAgICBzZWxlY3RlZFRpbWU6IHRoaXMuaW5wdXREYXRhLmZvbGRlck5hbWVcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNoZWNrKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWREYXRhLnNvbWUoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udGVtcElkID09PSBkYXRhLnRlbXBJZCAmJiBpdGVtLnNlbGVjdGVkVGltZSA9PT0gZGF0YS5zZWxlY3RlZFRpbWVcclxuICAgICk7XHJcbiAgXHJcbiAgICBpZiAoZXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+ICEoaXRlbS50ZW1wSWQgPT09IGRhdGEudGVtcElkICYmIGl0ZW0uc2VsZWN0ZWRUaW1lID09PSBkYXRhLnNlbGVjdGVkVGltZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZERhdGEpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YS5wdXNoKHsgLi4uZGF0YSB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcblxyXG4gIC8vIHRvZ2dsZUNoZWNrKGluZGV4OiBudW1iZXIsIGRhdGE6IGFueSk6IHZvaWQge1xyXG4gIC8vICAgY29uc29sZS5sb2coaW5kZXgsIGRhdGEpXHJcbiAgLy8gICB0aGlzLmNoZWNrZWRJbmRleGVzW2luZGV4XSA9ICF0aGlzLmNoZWNrZWRJbmRleGVzW2luZGV4XTtcclxuICAvLyAgIGxldCBleGl0c0NvdW50ID0gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnRlbXBJZCA9PT0gZGF0YS50ZW1wSWQpLmxlbmd0aFxyXG5cclxuICAvLyAgIGlmKGV4aXRzQ291bnQ+MCApe1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0YSA9IHRoaXMuc2VsZWN0ZWREYXRhLmZpbHRlcigob2JqOiBhbnkpID0+IG9iai50ZW1wSWQgIT09IGRhdGEudGVtcElkKVxyXG4gIC8vICAgfWVsc2V7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRhLnB1c2goZGF0YSlcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gfVxyXG4gIHNlbGVjdGVkVGltZXMob2JqOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gb2JqXHJcbiAgICB0aGlzLmlucHV0RGF0YS5mb2xkZXJOYW1lID0gb2JqXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmlucHV0RGF0YS5mb2xkZXJOYW1lKVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YUxvYWQoKVxyXG4gIH1cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGxldCBwYXlsb2FkOiBhbnkgPSBbXVxyXG4gICAgLy8gY29uc3QgZXhpc3RzID0gdGhpcy5zZWxlY3RlZERhdGEuc29tZShcclxuICAgIC8vICAgKGl0ZW06IGFueSkgPT4gaXRlbS50ZW1wSWQgPT09IHRoaXMuc2VsZWN0ZWRUZW1wSWQgJiYgaXRlbS5zZWxlY3RlZFRpbWUgPT09IHRoaXMuc2VsZWN0ZWRUaW1lXHJcbiAgICAvLyApO1xyXG4gICAgLy8gY29uc29sZS5sb2coZXhpc3RzLHRoaXMuYWxyZWFkeVRhZ2dlZClcclxuICAgIC8vIGlmKCFleGlzdHMmJiF0aGlzLmFscmVhZHlUYWdnZWQpe1xyXG4gICAgLy8gICB0aGlzLnNlbGVjdGVkRGF0YS5wdXNoKHt0ZW1wSWQ6dGhpcy5zZWxlY3RlZFRlbXBJZCxzZWxlY3RlZFRpbWU6dGhpcy5zZWxlY3RlZFRpbWV9KVxyXG4gICAgLy8gfVxyXG5cclxuICAgIGxldCBpbnB1dERhdGEgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmlucHV0RGF0YS5jbGllbnRJZCxcclxuICAgICAgc3RvcmVJZDogdGhpcy5pbnB1dERhdGEuc3RvcmVJZFswXSxcclxuICAgICAgZGF0ZVN0cmluZzogdGhpcy5pbnB1dERhdGEuZm9vdGZhbGxEYXRlLFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAucmV2b3B0YWdnaW5nY291bnQoaW5wdXREYXRhKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcy5kYXRhLmNvdW50LHRoaXMuc2VsZWN0ZWREYXRhLmxlbmd0aCx0aGlzLm9yaWdpbmFsRGF0YSlcclxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmNvdW50IDw9IDAmJnRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aD09PTB8fHJlcy5kYXRhLmNvdW50PHRoaXMuc2VsZWN0ZWREYXRhLmxlbmd0aCYmdGhpcy5vcmlnaW5hbERhdGEubGVuZ3RoPT09MCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KFwiVGFnIGxpbWl0IHJlYWNoZWQhIFRyeSB0YWdnaW5nIHVuZGVyIGRpZmZlcmVudCBjYXRlZ29yaWVzXCIpXHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG5cclxuICAgICAgICAgICAgICBpZih0aGlzLm9yaWdpbmFsRGF0YS5sZW5ndGg9PT0xJiZ0aGlzLnNlbGVjdGVkRGF0YS5sZW5ndGg+cmVzLmRhdGEuY291bnQpe1xyXG4gICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXIuZ2V0RXJyb3JUb2FzdChcIlRhZyBsaW1pdCByZWFjaGVkISBUcnkgdGFnZ2luZyB1bmRlciBkaWZmZXJlbnQgY2F0ZWdvcmllc1wiKVxyXG4gICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gIFsuLi50aGlzLnNlbGVjdGVkRGF0YSwuLi50aGlzLm9yaWdpbmFsRGF0YV1cclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YS5tYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuaW5wdXREYXRhLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgICBzdG9yZUlkOiB0aGlzLmlucHV0RGF0YS5zdG9yZUlkWzBdLFxyXG4gICAgICAgICAgICAgICAgICB0aW1lUmFuZ2U6IGRhdGEuc2VsZWN0ZWRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICBkYXRlU3RyaW5nOiB0aGlzLmlucHV0RGF0YS5mb290ZmFsbERhdGUsXHJcbiAgICAgICAgICAgICAgICAgIHRlbXBJZDogZGF0YS50ZW1wSWQsXHJcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3NUeXBlOiB0aGlzLmlucHV0RGF0YS5wcm9jZXNzVHlwZSxcclxuICAgICAgICAgICAgICAgICAgcmV2b3BzVHlwZTogXCJub25TaG9wcGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgIG5vbnNob3BlclR5cGU6IFwiRHVwbGljYXRlXCIsXHJcbiAgICAgICAgICAgICAgICAgIGN1c3RvbWVySW5mbzoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9iaWxlOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGFnZTogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICBnZW5kZXI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VibWl0dGVkXCIsXHJcbiAgICAgICAgICAgICAgICAgIGlzc3VlTGlzdDogW11cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBheWxvYWQucHVzaChvYmopXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5zdWJtaXRSZXZvcFRhZ2dpbmcocGF5bG9hZClcclxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgICAgID8uc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcblxyXG5cclxuXHJcbiAgICBcclxuICB9XHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnY2FuY2VsJyk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3cgaC01NTBweCBzY3JvbGwtY29udGFpbmVyIHNjcm9sbC15IHctMTAwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHAtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBteC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHQgbXgtMiBtdC0zXCI+VGFnIER1cGxpY2F0ZSBJRDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YiBteC0yIG15LTFcIj5JZGVudGlmeSBhbmQgdGFnIHRoZSBvcmlnaW5hbCBJRCB0aGlzIGVudHJ5IGR1cGxpY2F0ZXMuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2gzPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yIHNlcGFyYXRvci1kb3VibGUgbS0zXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiAgY2xhc3M9XCJkLWZsZXggbXQtMiBtYi0yIHctMTAwIG92ZXJmbG93LXggcHgtMFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPGRpdiAgY2xhc3M9XCJjb2wgdGV4dC1ub3dyYXBcIiAqbmdGb3I9XCJsZXQgb2JqIG9mIG9iamVjdHNBcnJheVwiPlxyXG4gICAgICAgICAgICAgIDx1bCAgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJzZWxlY3RlZFRpbWVzKG9iai5mb2xkZXJOYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRpbWUgPT09IG9iaj8uZm9sZGVyTmFtZSA/ICdhY3RpdmUnIDogJydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG5vLWJvcmRlciBteC0zIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e29iaj8uZm9sZGVyTmFtZX19PHNwYW4gY2xhc3M9XCJteC0yIFwiIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGltZSA9PT0gb2JqPy5mb2xkZXJOYW1lID8gJ2JhZGdlLW51bS1wcmltYXJ5JyA6J2JhZGdlLW51bS1tdXRlZCdcIj57e29iaj8uY291bnQ/b2JqPy5jb3VudDowfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci1ncmF5LWFjdGl2ZTEgbXgtMyBwLTVcIj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC00IFwiIFxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvYmogb2YgaW1hZ2VzXCJcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIHJvdW5kZWQgYm9yZGVyIG10LTMgYm9yZGVyLTIgXCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1wcmltYXJ5JzogaXNDaGVja2VkKG9iaiksXHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLXNlY29uZGFyeSc6ICFpc0NoZWNrZWQob2JqKVxyXG4gICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic2VsZWN0ZWRUZW1wSWQhPT1vYmo/LnRlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0xXCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidmbGV4Q2hlY2snICsgb2JqLnRlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ2hlY2sob2JqKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQ2hlY2tlZChvYmopXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1zLTFcIiBbZm9yXT1cIidmbGV4Q2hlY2snICsgb2JqLnRlbXBJZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvYmo/LnRlbXBJZCB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwib2JqLmltYWdlXCIgYWx0PVwiSW1hZ2VcIiBjbGFzcz1cImltZy1mbHVpZCB3LTEwMCBoLTIwMHB4IHJvdW5kZWRcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC01IHBiLTVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWVcIj5EZXNjcmlwdGlvbiAoT3B0aW9uYWwpPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICBbKG5nTW9kZWwpXT1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtM1wiIHJvd3M9XCIzXCIgcGxhY2Vob2xkZXI9XCJcIj48L3RleHRhcmVhPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgbXQtNVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtdC0zIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+U3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19