tango-app-ui-store-builder 1.0.76 → 1.0.78

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.
@@ -65,8 +65,10 @@ export class CreatePlanogramComponent {
65
65
  this.destroyCadProcessingAnimation();
66
66
  }
67
67
  get isValidToCreatePlano() {
68
- return (this.selectedStore &&
69
- this.selectedFloor &&
68
+ const hasStoreSelection = !!this.selectedStore || !!this.newStoreDetails;
69
+ const floorNumber = this.selectedFloor || this.newStoreDetails?.floor;
70
+ return (hasStoreSelection &&
71
+ floorNumber &&
70
72
  (this.selectedFile || this.isManual));
71
73
  }
72
74
  get isModalBusy() {
@@ -120,21 +122,24 @@ export class CreatePlanogramComponent {
120
122
  if (!this.isValidToCreatePlano)
121
123
  return;
122
124
  const hasCadFile = !!this.selectedFile;
125
+ let shouldResetNewStoreSummary = false;
123
126
  try {
124
127
  this.isButtonLoading = true;
125
128
  if (hasCadFile) {
126
129
  this.showCadProcessingLoader();
127
130
  }
131
+ const storeContext = await this.ensureStoreForPlanoCreation();
132
+ if (!storeContext)
133
+ return;
128
134
  let planoRes;
129
135
  if (this.selectedFile) {
130
- const storeName = this.storeList.find((s) => s.value === this.selectedStore)?.label;
131
- planoRes = await firstValueFrom(this.storeBuilderService.createPlanoFromCAD(this.selectedFile, this.selectedStore, storeName ?? this.selectedStore, this.selectedFloor));
136
+ planoRes = await firstValueFrom(this.storeBuilderService.createPlanoFromCAD(this.selectedFile, storeContext.storeId, storeContext.storeName ?? storeContext.storeId, storeContext.floorNumber));
132
137
  }
133
138
  else {
134
139
  planoRes = await firstValueFrom(this.storeBuilderService.createEmptyPlano({
135
140
  clientId: this.clientId,
136
- storeId: this.selectedStore,
137
- floorNumber: this.selectedFloor,
141
+ storeId: storeContext.storeId,
142
+ floorNumber: storeContext.floorNumber,
138
143
  }));
139
144
  }
140
145
  if (!planoRes?.data)
@@ -142,6 +147,8 @@ export class CreatePlanogramComponent {
142
147
  this.activeModal.close(planoRes?.data);
143
148
  }
144
149
  catch (error) {
150
+ shouldResetNewStoreSummary =
151
+ !!this.newStoreDetails?.storeId && !!this.newStoreDetails?.infraTicketCreated;
145
152
  this.toastService.getErrorToast(error?.error?.error?.errMsg ?? "Failed to extract plano from CAD file.");
146
153
  console.log("@@ ~ onCreate [ERR]:", error);
147
154
  }
@@ -150,6 +157,11 @@ export class CreatePlanogramComponent {
150
157
  if (hasCadFile) {
151
158
  this.hideCadProcessingLoader();
152
159
  }
160
+ if (shouldResetNewStoreSummary) {
161
+ this.newStoreDetails = null;
162
+ this.selectedStoreFloors = [];
163
+ this.isLayoutExist = false;
164
+ }
153
165
  }
154
166
  }
155
167
  showCadProcessingLoader() {
@@ -185,60 +197,109 @@ export class CreatePlanogramComponent {
185
197
  const spocUser = await this.getSpocUserDetails(this.createStoreForm.value.storeName.trim());
186
198
  if (!spocUser)
187
199
  return;
188
- const createStorePayload = {
189
- storeName: this.createStoreForm.value.storeName?.toUpperCase()?.trim(),
190
- clientId: this.clientId,
191
- businessType: this.createStoreForm.value.businessType,
192
- cluster: [],
193
- storeType: {
194
- type: this.createStoreForm.value.storeType,
195
- name: this.createStoreForm.value?.storeTypeName?.trim(),
196
- },
197
- storeProfile: {
198
- storeCode: this.createStoreForm?.value?.storeCode,
199
- address: this.createStoreForm.value?.address,
200
- country: this.createStoreForm.value?.country,
201
- state: this.createStoreForm.value?.state,
202
- city: this.createStoreForm.value?.city,
203
- pincode: this.createStoreForm.value?.pincode,
204
- latitude: this.createStoreForm.value.latitude?.toString().trim()
205
- ? this.createStoreForm.value.latitude
206
- : 0,
207
- longitude: this.createStoreForm.value.longitude?.toString().trim()
208
- ? this.createStoreForm.value.longitude
209
- : 0,
210
- timeZone: "Asia/Kolkata",
211
- open: "10:00:00",
212
- close: "20:00:00",
213
- },
214
- edge: {
215
- serverType: false,
216
- },
217
- spocDetails: [spocUser],
200
+ this.selectedStore = "";
201
+ this.selectedFloor = this.createStoreForm.get("floor")?.value ?? 1;
202
+ this.selectedStoreFloors = [];
203
+ this.isLayoutExist = false;
204
+ this.newStoreDetails = this.buildPendingStoreDetails(spocUser);
205
+ this.isCreateStoreMode = false;
206
+ }
207
+ catch (error) {
208
+ this.toastService.getErrorToast("Failed to prepare store details");
209
+ }
210
+ finally {
211
+ this.isButtonLoading = false;
212
+ }
213
+ }
214
+ buildPendingStoreDetails(spocUser) {
215
+ const createStorePayload = {
216
+ storeName: this.createStoreForm.value.storeName?.toUpperCase()?.trim(),
217
+ clientId: this.clientId,
218
+ businessType: this.createStoreForm.value.businessType,
219
+ cluster: [],
220
+ storeType: {
221
+ type: this.createStoreForm.value.storeType,
222
+ name: this.createStoreForm.value?.storeTypeName?.trim(),
223
+ },
224
+ storeProfile: {
225
+ storeCode: this.createStoreForm?.value?.storeCode,
226
+ address: this.createStoreForm.value?.address,
227
+ country: this.createStoreForm.value?.country,
228
+ state: this.createStoreForm.value?.state,
229
+ city: this.createStoreForm.value?.city,
230
+ pincode: this.createStoreForm.value?.pincode,
231
+ latitude: this.createStoreForm.value.latitude?.toString().trim()
232
+ ? this.createStoreForm.value.latitude
233
+ : 0,
234
+ longitude: this.createStoreForm.value.longitude?.toString().trim()
235
+ ? this.createStoreForm.value.longitude
236
+ : 0,
237
+ timeZone: "Asia/Kolkata",
238
+ open: "10:00:00",
239
+ close: "20:00:00",
240
+ },
241
+ edge: {
242
+ serverType: false,
243
+ },
244
+ spocDetails: [spocUser],
245
+ };
246
+ return {
247
+ ...createStorePayload,
248
+ createStorePayload,
249
+ floor: this.createStoreForm.get("floor")?.value ?? 1,
250
+ storeId: null,
251
+ infraTicketCreated: false,
252
+ };
253
+ }
254
+ async ensureStoreForPlanoCreation() {
255
+ const floorNumber = this.selectedFloor || this.newStoreDetails?.floor;
256
+ if (!this.newStoreDetails) {
257
+ if (!this.selectedStore || !floorNumber)
258
+ return null;
259
+ const storeName = this.storeList.find((s) => s.value === this.selectedStore)?.label;
260
+ return {
261
+ storeId: this.selectedStore,
262
+ storeName: storeName ?? this.selectedStore,
263
+ floorNumber,
218
264
  };
219
- const res = await firstValueFrom(this.storeBuilderService.createStore(createStorePayload));
220
- const newStore = res?.data?.store;
221
- if (newStore && newStore?.storeId) {
222
- const ticketRes = await firstValueFrom(this.storeBuilderService.createInfraTicket({
223
- storeId: res?.data?.store?.storeId,
265
+ }
266
+ try {
267
+ if (!this.newStoreDetails.storeId) {
268
+ const res = await firstValueFrom(this.storeBuilderService.createStore(this.newStoreDetails.createStorePayload));
269
+ const newStore = res?.data?.store;
270
+ if (!newStore?.storeId) {
271
+ this.toastService.getErrorToast("Unable to create store");
272
+ return null;
273
+ }
274
+ this.newStoreDetails.storeId = newStore.storeId;
275
+ this.newStoreDetails.storeName = newStore.storeName;
276
+ this.selectedStore = newStore.storeId;
277
+ this.selectedFloor = floorNumber;
278
+ this.selectedStoreFloors = [];
279
+ this.isLayoutExist = false;
280
+ }
281
+ if (!this.newStoreDetails.infraTicketCreated) {
282
+ await firstValueFrom(this.storeBuilderService.createInfraTicket({
283
+ storeId: this.newStoreDetails.storeId,
224
284
  Date: new Date().toISOString().split("T")[0],
225
285
  issueType: "installation",
226
286
  }));
227
- if (ticketRes) {
228
- this.toastService.getSuccessToast("Store created successfully");
287
+ this.newStoreDetails.infraTicketCreated = true;
288
+ }
289
+ const storeContext = {
290
+ storeId: this.newStoreDetails.storeId,
291
+ storeName: this.newStoreDetails.storeName,
292
+ floorNumber,
293
+ };
294
+ if (this.newStoreDetails.storeId && this.newStoreDetails.infraTicketCreated) {
295
+ if (!this.storeList.some((store) => store.value === this.newStoreDetails.storeId)) {
229
296
  this.storeList.push({
230
- label: newStore.storeName,
231
- value: newStore.storeId,
297
+ label: this.newStoreDetails.storeName,
298
+ value: this.newStoreDetails.storeId,
232
299
  });
233
- this.selectedStore = newStore.storeId;
234
- this.selectedFloor = this.createStoreForm.get("floor")?.value ?? 1;
235
- this.newStoreDetails = createStorePayload;
236
- this.isCreateStoreMode = false;
237
300
  }
238
301
  }
239
- else {
240
- this.toastService.getErrorToast("Unable to create store");
241
- }
302
+ return storeContext;
242
303
  }
243
304
  catch (error) {
244
305
  if (error?.error?.error?.error === "StoreName already exists") {
@@ -247,9 +308,7 @@ export class CreatePlanogramComponent {
247
308
  else {
248
309
  this.toastService.getErrorToast("Failed to create store");
249
310
  }
250
- }
251
- finally {
252
- this.isButtonLoading = false;
311
+ return null;
253
312
  }
254
313
  }
255
314
  async getSpocUserDetails(storeName) {
@@ -395,6 +454,10 @@ export class CreatePlanogramComponent {
395
454
  onBack() {
396
455
  if (this.isModalBusy)
397
456
  return;
457
+ if (!this.isCreateStoreMode && this.newStoreDetails) {
458
+ this.isCreateStoreMode = true;
459
+ return;
460
+ }
398
461
  this.isCreateStoreMode = false;
399
462
  this.newStoreDetails = null;
400
463
  }
@@ -407,7 +470,7 @@ export class CreatePlanogramComponent {
407
470
  libraries: ["places"],
408
471
  }),
409
472
  },
410
- ], viewQueries: [{ propertyName: "cadProcessingLottieRef", first: true, predicate: ["cadProcessingLottie"], descendants: true }], ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\n placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\n formControlName=\"floor\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\n [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\n [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\n <div class=\"col-12 mb-4\">\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\n placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"state\" class=\"form-label mb-1\">State</label>\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\n placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\n placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n <div class=\"col-6\">\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n @if (isCadProcessing) {\r\n <div class=\"cad-loader-panel\">\r\n <!--\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n -->\r\n <div class=\"cad-loader-content\">\r\n <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n <p class=\"cad-loader-text mb-0\">\r\n Building layout\r\n <span class=\"loading-dots\" aria-hidden=\"true\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </p>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"row\">\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\n <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\n </div>\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\n <div class=\"d-flex gap-1 align-items-center\">\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\n [disabled]=\"isModalBusy\">\n <label for=\"manual\">Create manually</label>\n </div>\n </div>\n </div>\r\n }\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\n (click)=\"onCreateStore()\">\n <span *ngIf=\"!isButtonLoading\">\n Next\n </span>\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\n [disabled]=\"isModalBusy\">Back</button>\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\n [disabled]=\"isModalBusy\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\r\n\n Create new store\n </button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\n (click)=\"onCreateLayoutPlano()\">\n <span *ngIf=\"!isButtonLoading || isCadProcessing\">\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-panel{border:2px dashed #d7dce1;border-radius:12px;min-height:190px;display:flex;justify-content:center;align-items:center;text-align:center;background:#fff;transition:all .2s ease}.cad-loader-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:24px}.cad-lottie{width:220px;height:220px}.cad-basic-spinner{width:44px;height:44px;animation:cad-spin .9s linear infinite}.cad-basic-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}.cad-loader-text{color:#344054;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center}.loading-dots{display:inline-flex;min-width:18px;justify-content:flex-start}.loading-dots span{animation:cad-dot-pulse 1.2s infinite;opacity:.2}.loading-dots span:nth-child(2){animation-delay:.2s}.loading-dots span:nth-child(3){animation-delay:.4s}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}@keyframes cad-spin{to{transform:rotate(360deg)}}@keyframes cad-dot-pulse{0%,80%,to{opacity:.2}40%{opacity:1}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxGpAutocompleteModule }, { kind: "directive", type: i5.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
473
+ ], viewQueries: [{ propertyName: "cadProcessingLottieRef", first: true, predicate: ["cadProcessingLottie"], descendants: true }], ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\r\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n @if (isCadProcessing) {\r\n <div class=\"cad-loader-panel\">\r\n <!--\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n -->\r\n <div class=\"cad-loader-content\">\r\n <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n <p class=\"cad-loader-text mb-0\">\r\n Building layout\r\n <span class=\"loading-dots\" aria-hidden=\"true\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </p>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"row\">\r\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\r\n <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\r\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\r\n [disabled]=\"isModalBusy\">\r\n <label for=\"manual\">Create manually</label>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\r\n (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Next\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\r\n [disabled]=\"isModalBusy\">Back</button>\r\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\r\n [disabled]=\"isModalBusy\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Create new store\r\n </button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading || isCadProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-panel{border:2px dashed #d7dce1;border-radius:12px;min-height:190px;display:flex;justify-content:center;align-items:center;text-align:center;background:#fff;transition:all .2s ease}.cad-loader-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:24px}.cad-lottie{width:220px;height:220px}.cad-basic-spinner{width:44px;height:44px;animation:cad-spin .9s linear infinite}.cad-basic-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}.cad-loader-text{color:#344054;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center}.loading-dots{display:inline-flex;min-width:18px;justify-content:flex-start}.loading-dots span{animation:cad-dot-pulse 1.2s infinite;opacity:.2}.loading-dots span:nth-child(2){animation-delay:.2s}.loading-dots span:nth-child(3){animation-delay:.4s}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}@keyframes cad-spin{to{transform:rotate(360deg)}}@keyframes cad-dot-pulse{0%,80%,to{opacity:.2}40%{opacity:1}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxGpAutocompleteModule }, { kind: "directive", type: i5.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
411
474
  }
412
475
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, decorators: [{
413
476
  type: Component,
@@ -430,11 +493,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
430
493
  libraries: ["places"],
431
494
  }),
432
495
  },
433
- ], template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\n placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\n formControlName=\"floor\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\n [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\n [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\n <div class=\"col-12 mb-4\">\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\n placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"state\" class=\"form-label mb-1\">State</label>\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\n placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\n placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n <div class=\"col-6\">\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n @if (isCadProcessing) {\r\n <div class=\"cad-loader-panel\">\r\n <!--\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n -->\r\n <div class=\"cad-loader-content\">\r\n <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n <p class=\"cad-loader-text mb-0\">\r\n Building layout\r\n <span class=\"loading-dots\" aria-hidden=\"true\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </p>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"row\">\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\n <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\n </div>\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\n <div class=\"d-flex gap-1 align-items-center\">\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\n [disabled]=\"isModalBusy\">\n <label for=\"manual\">Create manually</label>\n </div>\n </div>\n </div>\r\n }\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\n (click)=\"onCreateStore()\">\n <span *ngIf=\"!isButtonLoading\">\n Next\n </span>\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\n [disabled]=\"isModalBusy\">Back</button>\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\n [disabled]=\"isModalBusy\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\r\n\n Create new store\n </button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\n (click)=\"onCreateLayoutPlano()\">\n <span *ngIf=\"!isButtonLoading || isCadProcessing\">\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-panel{border:2px dashed #d7dce1;border-radius:12px;min-height:190px;display:flex;justify-content:center;align-items:center;text-align:center;background:#fff;transition:all .2s ease}.cad-loader-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:24px}.cad-lottie{width:220px;height:220px}.cad-basic-spinner{width:44px;height:44px;animation:cad-spin .9s linear infinite}.cad-basic-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}.cad-loader-text{color:#344054;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center}.loading-dots{display:inline-flex;min-width:18px;justify-content:flex-start}.loading-dots span{animation:cad-dot-pulse 1.2s infinite;opacity:.2}.loading-dots span:nth-child(2){animation-delay:.2s}.loading-dots span:nth-child(3){animation-delay:.4s}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}@keyframes cad-spin{to{transform:rotate(360deg)}}@keyframes cad-dot-pulse{0%,80%,to{opacity:.2}40%{opacity:1}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
496
+ ], template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\r\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\r\n [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n @if (isCadProcessing) {\r\n <div class=\"cad-loader-panel\">\r\n <!--\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n -->\r\n <div class=\"cad-loader-content\">\r\n <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n <p class=\"cad-loader-text mb-0\">\r\n Building layout\r\n <span class=\"loading-dots\" aria-hidden=\"true\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </p>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"row\">\r\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\r\n <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\r\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\r\n [disabled]=\"isModalBusy\">\r\n <label for=\"manual\">Create manually</label>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\r\n (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Next\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\r\n [disabled]=\"isModalBusy\">Back</button>\r\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\r\n [disabled]=\"isModalBusy\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Create new store\r\n </button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading || isCadProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-panel{border:2px dashed #d7dce1;border-radius:12px;min-height:190px;display:flex;justify-content:center;align-items:center;text-align:center;background:#fff;transition:all .2s ease}.cad-loader-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:24px}.cad-lottie{width:220px;height:220px}.cad-basic-spinner{width:44px;height:44px;animation:cad-spin .9s linear infinite}.cad-basic-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}.cad-loader-text{color:#344054;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center}.loading-dots{display:inline-flex;min-width:18px;justify-content:flex-start}.loading-dots span{animation:cad-dot-pulse 1.2s infinite;opacity:.2}.loading-dots span:nth-child(2){animation-delay:.2s}.loading-dots span:nth-child(3){animation-delay:.4s}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}@keyframes cad-spin{to{transform:rotate(360deg)}}@keyframes cad-dot-pulse{0%,80%,to{opacity:.2}40%{opacity:1}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
434
497
  }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }, { type: i4.FormBuilder }], propDecorators: { clientId: [{
435
498
  type: Input
436
499
  }], cadProcessingLottieRef: [{
437
500
  type: ViewChild,
438
501
  args: ["cadProcessingLottie"]
439
502
  }] } });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFrQixVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBR0wsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FFakIsTUFBTSxtQ0FBbUMsQ0FB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QUN0QixDQUFDO3lCQUNIO3FCQUNGOzBLQUdRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRU4sc0JBQXNCO3NCQURyQixTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmLCBUaXRsZUNhc2VQaXBlLCBVcHBlckNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tIFwiQGdvb2dsZW1hcHMvanMtYXBpLWxvYWRlclwiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyLW1hZ2ljL25neC1ncC1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRmlsZVVwbG9hZENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBnZW5lcmFsVmFsaWRhdG9yLFxyXG4gIGdldE5hbWVGcm9tRW1haWwsXHJcbiAgaW5kaWFuUGluY29kZVZhbGlkYXRvcixcclxufSBmcm9tIFwiLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCBsb3R0aWUsIHsgQW5pbWF0aW9uSXRlbSB9IGZyb20gXCJsb3R0aWUtd2ViXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICAgIE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlLFxyXG4gICAgTmdiVG9vbHRpcCxcclxuICAgIFVwcGVyQ2FzZVBpcGUsXHJcbiAgICBUaXRsZUNhc2VQaXBlLFxyXG4gICAgTmdDbGFzcyxcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBMb2FkZXIsXHJcbiAgICAgIHVzZVZhbHVlOiBuZXcgTG9hZGVyKHtcclxuICAgICAgICBhcGlLZXk6IFwiQUl6YVN5QWZXUTlndUZzU1hvWUl1MlZGQnctWFEzVm51ZnZGQTNBXCIsXHJcbiAgICAgICAgbGlicmFyaWVzOiBbXCJwbGFjZXNcIl0sXHJcbiAgICAgIH0pLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlUGxhbm9ncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZChcImNhZFByb2Nlc3NpbmdMb3R0aWVcIilcclxuICBjYWRQcm9jZXNzaW5nTG90dGllUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNCdXR0b25Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQb3B1cExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NhZFByb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NyZWF0ZVN0b3JlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5ld1N0b3JlRGV0YWlsczogYW55O1xyXG4gIHByaXZhdGUgY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbj86IEFuaW1hdGlvbkl0ZW07XHJcblxyXG4gIGNyZWF0ZVN0b3JlRm9ybTogYW55O1xyXG4gIHN0b3JlVHlwZUxpc3Q6IHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6IFwiSGlnaCBTdHJlZXRcIiwgdmFsdWU6IFwiSGlnaCBTdHJlZXRcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJNYWxsIFN0b3JlXCIsIHZhbHVlOiBcIk1hbGwgU3RvcmVcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJLaW9za1wiLCB2YWx1ZTogXCJLaW9za1wiIH0sXHJcbiAgXTtcclxuXHJcbiAgYnVzaW5lc3NUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJDT0NPXCIsIHZhbHVlOiBcIkNPQ09cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJDT0ZPXCIsIHZhbHVlOiBcIkNPRk9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0ZPXCIsIHZhbHVlOiBcIkZPRk9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0NPXCIsIHZhbHVlOiBcIkZPQ09cIiB9LFxyXG4gIF07XHJcblxyXG4gIGlzTWFudWFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmVMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveUNhZFByb2Nlc3NpbmdBbmltYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkVG9DcmVhdGVQbGFubygpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgJiZcclxuICAgICAgKHRoaXMuc2VsZWN0ZWRGaWxlIHx8IHRoaXMuaXNNYW51YWwpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTW9kYWxCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNQb3B1cExvYWRpbmcgfHwgdGhpcy5pc0J1dHRvbkxvYWRpbmcgfHwgdGhpcy5pc0NhZFByb2Nlc3Npbmc7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTdG9yZUxpc3QoKSB7XHJcbiAgICB0aGlzLmlzUG9wdXBMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKSxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yZUxpc3QgPSBzdG9yZXM/LmRhdGE/Lm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHMuc3RvcmVOYW1lLCB2YWx1ZTogcy5zdG9yZUlkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc1BvcHVwTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3RvcmVDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsQnVzeSB8fCAhdGhpcy5zZWxlY3RlZFN0b3JlKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmxvb3JzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U3RvcmVGbG9vcnNMaXN0KHRoaXMuc2VsZWN0ZWRTdG9yZSksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycyA9IGZsb29ycz8uZGF0YSA/PyBbXTtcclxuICAgICAgdGhpcy5vbkZsb29yQ2hhbmdlKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZsb29yQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycy5zb21lKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuZmxvb3JOdW1iZXIgPT09IHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlQ2hhbmdlKGZpbGU6IEZpbGUgfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsQnVzeSkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DcmVhdGVMYXlvdXRQbGFubygpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFRvQ3JlYXRlUGxhbm8pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBoYXNDYWRGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Q2FkUHJvY2Vzc2luZ0xvYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBwbGFub1JlczogYW55O1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGUpIHtcclxuICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLnN0b3JlTGlzdC5maW5kKFxyXG4gICAgICAgICAgKHMpID0+IHMudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgICApPy5sYWJlbDtcclxuICAgICAgICBwbGFub1JlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVBsYW5vRnJvbUNBRChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUhLFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICAgIHN0b3JlTmFtZSA/PyB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwbGFub1JlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZUVtcHR5UGxhbm8oe1xyXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgICAgc3RvcmVJZDogdGhpcy5zZWxlY3RlZFN0b3JlLFxyXG4gICAgICAgICAgICBmbG9vck51bWJlcjogdGhpcy5zZWxlY3RlZEZsb29yLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwbGFub1Jlcz8uZGF0YSkgcmV0dXJuO1xyXG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHBsYW5vUmVzPy5kYXRhKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJNc2cgPz8gXCJGYWlsZWQgdG8gZXh0cmFjdCBwbGFubyBmcm9tIENBRCBmaWxlLlwiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DcmVhdGUgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlQ2FkUHJvY2Vzc2luZ0xvYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dDYWRQcm9jZXNzaW5nTG9hZGVyKCkge1xyXG4gICAgdGhpcy5pc0NhZFByb2Nlc3NpbmcgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCksIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlQ2FkUHJvY2Vzc2luZ0xvYWRlcigpIHtcclxuICAgIHRoaXMuaXNDYWRQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jYWRQcm9jZXNzaW5nTG90dGllUmVmPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCk7XHJcbiAgICB0aGlzLmNhZFByb2Nlc3NpbmdBbmltYXRpb24gPSBsb3R0aWUubG9hZEFuaW1hdGlvbih7XHJcbiAgICAgIGNvbnRhaW5lcixcclxuICAgICAgcmVuZGVyZXI6IFwic3ZnXCIsXHJcbiAgICAgIGxvb3A6IHRydWUsXHJcbiAgICAgIGF1dG9wbGF5OiB0cnVlLFxyXG4gICAgICBwYXRoOiBcImFzc2V0cy9hbmltYXRpb25zL3N0cmluZ19sb2FkaW5nLmpzb25cIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95Q2FkUHJvY2Vzc2luZ0FuaW1hdGlvbigpIHtcclxuICAgIHRoaXMuY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbj8uZGVzdHJveSgpO1xyXG4gICAgdGhpcy5jYWRQcm9jZXNzaW5nQW5pbWF0aW9uID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DcmVhdGVTdG9yZSgpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICBjb25zdCBzcG9jVXNlciA9IGF3YWl0IHRoaXMuZ2V0U3BvY1VzZXJEZXRhaWxzKFxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLnN0b3JlTmFtZS50cmltKCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXNwb2NVc2VyKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVTdG9yZVBheWxvYWQgPSB7XHJcbiAgICAgICAgc3RvcmVOYW1lOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZU5hbWU/LnRvVXBwZXJDYXNlKCk/LnRyaW0oKSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICBidXNpbmVzc1R5cGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmJ1c2luZXNzVHlwZSxcclxuICAgICAgICBjbHVzdGVyOiBbXSxcclxuICAgICAgICBzdG9yZVR5cGU6IHtcclxuICAgICAgICAgIHR5cGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLnN0b3JlVHlwZSxcclxuICAgICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5zdG9yZVR5cGVOYW1lPy50cmltKCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdG9yZVByb2ZpbGU6IHtcclxuICAgICAgICAgIHN0b3JlQ29kZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0/LnZhbHVlPy5zdG9yZUNvZGUsXHJcbiAgICAgICAgICBhZGRyZXNzOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uYWRkcmVzcyxcclxuICAgICAgICAgIGNvdW50cnk6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5jb3VudHJ5LFxyXG4gICAgICAgICAgc3RhdGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5zdGF0ZSxcclxuICAgICAgICAgIGNpdHk6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5jaXR5LFxyXG4gICAgICAgICAgcGluY29kZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LnBpbmNvZGUsXHJcbiAgICAgICAgICBsYXRpdHVkZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubGF0aXR1ZGU/LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICAgID8gdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubGF0aXR1ZGVcclxuICAgICAgICAgICAgOiAwLFxyXG4gICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5sb25naXR1ZGU/LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICAgID8gdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubG9uZ2l0dWRlXHJcbiAgICAgICAgICAgIDogMCxcclxuICAgICAgICAgIHRpbWVab25lOiBcIkFzaWEvS29sa2F0YVwiLFxyXG4gICAgICAgICAgb3BlbjogXCIxMDowMDowMFwiLFxyXG4gICAgICAgICAgY2xvc2U6IFwiMjA6MDA6MDBcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkZ2U6IHtcclxuICAgICAgICAgIHNlcnZlclR5cGU6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3BvY0RldGFpbHM6IFtzcG9jVXNlcl0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVTdG9yZShjcmVhdGVTdG9yZVBheWxvYWQpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbmV3U3RvcmUgPSByZXM/LmRhdGE/LnN0b3JlO1xyXG5cclxuICAgICAgaWYgKG5ld1N0b3JlICYmIG5ld1N0b3JlPy5zdG9yZUlkKSB7XHJcbiAgICAgICAgY29uc3QgdGlja2V0UmVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlSW5mcmFUaWNrZXQoe1xyXG4gICAgICAgICAgICBzdG9yZUlkOiByZXM/LmRhdGE/LnN0b3JlPy5zdG9yZUlkLFxyXG4gICAgICAgICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLFxyXG4gICAgICAgICAgICBpc3N1ZVR5cGU6IFwiaW5zdGFsbGF0aW9uXCIsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAodGlja2V0UmVzKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QoXCJTdG9yZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogbmV3U3RvcmUuc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICB2YWx1ZTogbmV3U3RvcmUuc3RvcmVJZCxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IG5ld1N0b3JlLnN0b3JlSWQ7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJmbG9vclwiKT8udmFsdWUgPz8gMTtcclxuICAgICAgICAgIHRoaXMubmV3U3RvcmVEZXRhaWxzID0gY3JlYXRlU3RvcmVQYXlsb2FkO1xyXG4gICAgICAgICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIGNyZWF0ZSBzdG9yZVwiKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICBpZiAoZXJyb3I/LmVycm9yPy5lcnJvcj8uZXJyb3IgPT09IFwiU3RvcmVOYW1lIGFscmVhZHkgZXhpc3RzXCIpIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiU3RvcmUgTmFtZSBhbHJlYWR5IGV4aXN0c1wiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGNyZWF0ZSBzdG9yZVwiKTtcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFNwb2NVc2VyRGV0YWlscyhzdG9yZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3Qgc2FmZVN0b3JlTmFtZSA9IHN0b3JlTmFtZVxyXG4gICAgICA/LnRvTG93ZXJDYXNlKClcclxuICAgICAgLnRyaW0oKVxyXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIl9cIilcclxuICAgICAgLnJlcGxhY2UoL1teYS16MC05Ll8tXS9nLCBcIlwiKTtcclxuXHJcbiAgICBjb25zdCBlbWFpbCA9XHJcbiAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImVtYWlsXCIpPy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fFxyXG4gICAgICBgJHtzYWZlU3RvcmVOYW1lfV9wbGFub2dyYW1AbGVuc2thcnQuY29tYDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2Uuc3BvY0VtYWlsQ2hlY2soe1xyXG4gICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICBlbWFpbDogW2VtYWlsXSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBuYW1lOiBnZXROYW1lRnJvbUVtYWlsKGVtYWlsKSxcclxuICAgICAgICAgIGVtYWlsOiBlbWFpbCxcclxuICAgICAgICAgIGNvbnRhY3Q6IFwiOTk5OTk5OTk5OVwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTcG9jVXNlckRldGFpbHMgW0VSUl06IFwiLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvciA/PyBcIlVuYWJsZSB0byBjcmVhdGUgVXNlclwiLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZE5ld1N0b3JlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBzdG9yZU5hbWU6IFtcclxuICAgICAgICBcIlwiLFxyXG4gICAgICAgIFtcclxuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICB0aGlzLnN0b3JlTmFtZVZhbGlkYXRvcigpLFxyXG4gICAgICAgICAgdGhpcy5zdG9yZU5hbWVFeGlzdHNWYWxpZGF0b3IoKSxcclxuICAgICAgICAgIGdlbmVyYWxWYWxpZGF0b3IoKSxcclxuICAgICAgICBdLFxyXG4gICAgICBdLFxyXG4gICAgICBlbWFpbDogW1wiXCIsIFZhbGlkYXRvcnMuZW1haWxdLFxyXG4gICAgICBmbG9vcjogWzFdLFxyXG4gICAgICBidXNpbmVzc1R5cGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RvcmVUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0b3JlVHlwZU5hbWU6IFtcIlwiLCBnZW5lcmFsVmFsaWRhdG9yKCldLFxyXG4gICAgICBhZGRyZXNzOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGNvdW50cnk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RhdGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgY2l0eTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwaW5jb2RlOiBbXHJcbiAgICAgICAgXCJcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgLy8gIGluZGlhblBpbmNvZGVWYWxpZGF0b3IoKVxyXG4gICAgICAgIF0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGxhdGl0dWRlOiBbXCJcIl0sXHJcbiAgICAgIGxvbmdpdHVkZTogW1wiXCJdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm1cclxuICAgICAgLmdldChcInN0b3JlVHlwZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IFwiTWFsbCBTdG9yZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJzdG9yZVR5cGVOYW1lXCIpPy5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm1cclxuICAgICAgLmdldChcInN0b3JlTmFtZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIGNvbnN0IHVwcGVyID0gdmFsdWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdXBwZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm1cclxuICAgICAgICAgICAgICAuZ2V0KFwic3RvcmVOYW1lXCIpXHJcbiAgICAgICAgICAgICAgPy5zZXRWYWx1ZSh1cHBlciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gY29uc3QgdXJsVHJlZSA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW1wiL21hbmFnZS9zdG9yZXMvYWRkLXNpbmdsZS1zdG9yZVwiXSk7XHJcbiAgICAvLyBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XHJcbiAgICAvLyB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVOYW1lRXhpc3RzVmFsaWRhdG9yID0gKCk6IFZhbGlkYXRvckZuID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcclxuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7IC8vIGFsbG93IHJlcXVpcmVkIHZhbGlkYXRvciB0byBoYW5kbGUgZW1wdHlcclxuXHJcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnN0b3JlTGlzdC5maW5kKFxyXG4gICAgICAgIChzKSA9PiBzPy5sYWJlbD8udHJpbSgpPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSB0cmltbWVkLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocykgcmV0dXJuIHsgZXhpc3RzOiB0cnVlIH07XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgc3RvcmVOYW1lVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWUudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0UGF0dGVybiA9IC9eU1RcXGR7NH0kLzsgLy8gU1QxMjM0XHJcbiAgICAgIGNvbnN0IGxrc3RQYXR0ZXJuID0gL15MS1NUXFxkezR9JC87IC8vIExLU1QxMjM0XHJcblxyXG4gICAgICBjb25zdCBpc1ZhbGlkID0gc3RQYXR0ZXJuLnRlc3QodmFsdWUpIHx8IGxrc3RQYXR0ZXJuLnRlc3QodmFsdWUpO1xyXG5cclxuICAgICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBpbnZhbGlkU3RvcmVOYW1lOiB0cnVlIH07XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25BZGRyZXNzQ2hhbmdlKHBsYWNlOiBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQgfCBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5IHx8ICF0aGlzLmNyZWF0ZVN0b3JlRm9ybSB8fCAhcGxhY2U/Lmdlb21ldHJ5KSByZXR1cm47XHJcblxyXG4gICAgbGV0IGNvdW50cnkgPSBcIlwiLFxyXG4gICAgICBjaXR5ID0gXCJcIixcclxuICAgICAgc3RhdGUgPSBcIlwiLFxyXG4gICAgICBwaW5jb2RlID0gXCJcIjtcclxuXHJcbiAgICBsZXQgbGF0aXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKTtcclxuICAgIGxldCBsb25naXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKTtcclxuXHJcbiAgICBwbGFjZS5hZGRyZXNzX2NvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcImNvdW50cnlcIikpIHtcclxuICAgICAgICBjb3VudHJ5ID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJsb2NhbGl0eVwiKSkge1xyXG4gICAgICAgIGNpdHkgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcImFkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMVwiKSkge1xyXG4gICAgICAgIHN0YXRlID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJwb3N0YWxfY29kZVwiKSkge1xyXG4gICAgICAgIHBpbmNvZGUgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJhZGRyZXNzXCIpPy5zZXRWYWx1ZShwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJjb3VudHJ5XCIpPy5zZXRWYWx1ZShjb3VudHJ5KTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImNpdHlcIik/LnNldFZhbHVlKGNpdHkpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwic3RhdGVcIik/LnNldFZhbHVlKHN0YXRlKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcInBpbmNvZGVcIik/LnNldFZhbHVlKHBpbmNvZGUpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwibGF0aXR1ZGVcIik/LnNldFZhbHVlKGxhdGl0dWRlKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImxvbmdpdHVkZVwiKT8uc2V0VmFsdWUobG9uZ2l0dWRlKTtcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuZGlzbWlzcygpO1xyXG4gIH1cclxuXHJcbiAgb25CYWNrKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV3U3RvcmVEZXRhaWxzID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLXdyYXBwZXJcIj5cclxuICA8ZGl2ICpuZ0lmPVwiaXNQb3B1cExvYWRpbmdcIiBjbGFzcz1cIm1vZGFsLWxvYWRlci1vdmVybGF5XCI+XHJcbiAgICA8c3ZnIGNsYXNzPVwibW9kYWwtc3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgPC9zdmc+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxoMyBjbGFzcz1cIm1iLTNcIj5DcmVhdGUgc3RvcmUgbGF5b3V0L3BsYW4gZnJvbSBDQUQ8L2gzPlxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgIDxwPlN0ZXAgMTogT25ib2FyZCBzdG9yZSB3aXRoIGJhc2ljIGRldGFpbHM8L3A+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgbmdiVG9vbHRpcD1cIkEgbmV3IHN0b3JlIHdpbGwgYmUgY3JlYXRlZCB3aGVuIHlvdSBwZXJmb3JtIHRoaXMgYWN0aW9uIChNYW5hZ2UgPiBTdG9yZXMpLlwiPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTEwLjAwMDMgMTMuMzMzN1YxMC4wMDAzTTEwLjAwMDMgNi42NjY5OUgxMC4wMDg3TTE4LjMzMzcgMTAuMDAwM0MxOC4zMzM3IDE0LjYwMjcgMTQuNjAyNyAxOC4zMzM3IDEwLjAwMDMgMTguMzMzN0M1LjM5Nzk1IDE4LjMzMzcgMS42NjY5OSAxNC42MDI3IDEuNjY2OTkgMTAuMDAwM0MxLjY2Njk5IDUuMzk3OTUgNS4zOTc5NSAxLjY2Njk5IDEwLjAwMDMgMS42NjY5OUMxNC42MDI3IDEuNjY2OTkgMTguMzMzNyA1LjM5Nzk1IDE4LjMzMzcgMTAuMDAwM1pcIlxyXG4gICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuXHJcblxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVN0b3JlRm9ybVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdG9yZU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0b3JlIG5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdG9yZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZU5hbWVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHN0b3JlIG5hbWUuIGVnOiBMS1NUMTIzNFwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaW52YWxpZFwiPlxyXG5cclxuICAgICAgICAgICAgQGlmKGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignZXhpc3RzJykpe1xyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFN0b3JlIG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgIFN0b3JlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuXHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignaW52YWxpZFN0b3JlTmFtZScpIFwiPlxyXG4gICAgICAgICAgICAgICAgU3RvcmUgbmFtZSBtdXN0IGJlIFNUMTIzNCBvciBMS1NUMTIzNCBmb3JtYXQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmbG9vclwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiYnVzaW5lc3NUeXBlTGlzdFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBidXNpbmVzcyB0eXBlJ1wiIGZvcm1Db250cm9sTmFtZT1cImJ1c2luZXNzVHlwZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBzdG9yZSB0eXBlJ1wiIGZvcm1Db250cm9sTmFtZT1cInN0b3JlVHlwZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmKGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZScpPy52YWx1ZSA9PSAnTWFsbCBTdG9yZScpe1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlVHlwZU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkVudGVyIE1hbGwgbmFtZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RvcmVUeXBlTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInN0b3JlVHlwZU5hbWVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIE1hbGwgbmFtZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgTWFsbCBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi00XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkFkZHJlc3M8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgZW50ZXIgYWRkcmVzc1wiIG5neC1ncC1hdXRvY29tcGxldGUgKG9uQWRkcmVzc0NoYW5nZSk9XCJvbkFkZHJlc3NDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Db3VudHJ5PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY291bnRyeVwiIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENvdW50cnlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NvdW50cnknKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIENvdW50cnkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0YXRlPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgU3RhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNpdHkgLyBUb3duPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENpdHkgLyBUb3duXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDaXR5IC8gVG93biBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5jb2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5QaW4gLyBaaXAgQ29kZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBpbmNvZGVcIiBmb3JtQ29udHJvbE5hbWU9XCJwaW5jb2RlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgUGluIC8gWmlwIENvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKSB8fCBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICBQaW5jb2RlIGNhbm5vdCBjb250YWluIHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCdpbnZhbGlkUGluY29kZScpXCI+XHJcbiAgICAgICAgICAgICAgRW50ZXIgYSB2YWxpZCA2LWRpZ2l0IHBpbmNvZGVcclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNwb2MgdXNlciBlbWFpbCAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHNwb2MgdXNlciBlbWFpbFwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnZW1haWwnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnZW1haWwnKT8uaGFzRXJyb3IoJ2VtYWlsJylcIj5cclxuICAgICAgICAgICAgICBFbWFpbCBpcyBpbnZhbGlkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICB9XHJcbiAgQGVsc2Uge1xyXG4gICAgQGlmKG5ld1N0b3JlRGV0YWlscyl7XHJcbiAgICAgIDxwIGNsYXNzPVwibWItNlwiPlN0ZXAgMjogQWRkIENBRCBmaWxlPC9wPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi02XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+U3RvcmUgbmFtZTwvcD5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5ldy1zdG9yZS10eHRcIj57e25ld1N0b3JlRGV0YWlscz8uc3RvcmVOYW1lfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkZsb29yPC9wPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibmV3LXN0b3JlLXR4dFwiPkZsb29yIHt7dGhpcy5zZWxlY3RlZEZsb29yfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkJ1c2luZXNzIHR5cGU8L3A+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJuZXctc3RvcmUtdHh0XCI+e3tuZXdTdG9yZURldGFpbHM/LmJ1c2luZXNzVHlwZSB8IHVwcGVyY2FzZX19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5TdG9yZSB0eXBlPC9wPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibmV3LXN0b3JlLXR4dFwiPnt7bmV3U3RvcmVEZXRhaWxzPy5zdG9yZVR5cGU/LnR5cGUgfCB0aXRsZWNhc2V9fTwvaDM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW3NlYXJjaF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFN0b3JlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXG4gICAgICAgICAgICBbZGF0YV09XCJzdG9yZUxpc3RcIiBbbGFiZWxdPVwiJ1NlbGVjdCBzdG9yZSdcIiBbYWN0aW9uXT1cInRydWVcIiAoYWN0aW9uQ2xpY2spPVwiYWRkTmV3U3RvcmUoKVwiXG4gICAgICAgICAgICBbYWN0aW9uTGFiZWxdPVwiJ0NyZWF0ZSBuZXcgc3RvcmUnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TdG9yZUNoYW5nZSgpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBmbG9vcidcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIj5cbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJpc0xheW91dEV4aXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13YXJuaW5nIG1iLTRcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNOS45OTk2NSA2LjY2NjY3VjEwTTkuOTk5NjUgMTMuMzMzM0gxMC4wMDhNOC41NzQ2NSAyLjM4MzM0TDEuNTE2MzIgMTQuMTY2N0MxLjM3MDc5IDE0LjQxODcgMS4yOTM3OSAxNC43MDQ0IDEuMjkyOTggMTQuOTk1NEMxLjI5MjE2IDE1LjI4NjUgMS4zNjc1NiAxNS41NzI2IDEuNTExNjcgMTUuODI1NEMxLjY1NTc5IDE2LjA3ODMgMS44NjM1OSAxNi4yODkgMi4xMTQ0MSAxNi40MzY2QzIuMzY1MjMgMTYuNTg0MSAyLjY1MDMyIDE2LjY2MzUgMi45NDEzMiAxNi42NjY3SDE3LjA1OEMxNy4zNDkgMTYuNjYzNSAxNy42MzQxIDE2LjU4NDEgMTcuODg0OSAxNi40MzY2QzE4LjEzNTcgMTYuMjg5IDE4LjM0MzUgMTYuMDc4MyAxOC40ODc2IDE1LjgyNTRDMTguNjMxNyAxNS41NzI2IDE4LjcwNzEgMTUuMjg2NSAxOC43MDYzIDE0Ljk5NTRDMTguNzA1NSAxNC43MDQ0IDE4LjYyODUgMTQuNDE4NyAxOC40ODMgMTQuMTY2N0wxMS40MjQ3IDIuMzgzMzRDMTEuMjc2MSAyLjEzODQzIDExLjA2NjkgMS45MzU5NCAxMC44MTczIDEuNzk1NDFDMTAuNTY3NyAxLjY1NDg4IDEwLjI4NjEgMS41ODEwNSA5Ljk5OTY1IDEuNTgxMDVDOS43MTMyMSAxLjU4MTA1IDkuNDMxNTkgMS42NTQ4OCA5LjE4MTk5IDEuNzk1NDFDOC45MzIzOCAxLjkzNTk0IDguNzIzMjEgMi4xMzg0MyA4LjU3NDY1IDIuMzgzMzRaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICBUaGlzIHN0b3JlIGFscmVhZHkgaGFzIGEgRmxvb3Ige3tzZWxlY3RlZEZsb29yfX0gcGxhbm9ncmFtLiBPdmVyd3JpdGUgaXQ/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgQGlmIChpc0NhZFByb2Nlc3NpbmcpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FkLWxvYWRlci1wYW5lbFwiPlxyXG4gICAgICAgICAgPCEtLVxyXG4gICAgICAgICAgPGRpdiAjY2FkUHJvY2Vzc2luZ0xvdHRpZSBjbGFzcz1cImNhZC1sb3R0aWVcIj48L2Rpdj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiY2FkLWxvYWRlci10ZXh0IG1iLTBcIj5DcmVhdGluZyBwbGFub2dyYW0gZnJvbSBDQUQuLi48L3A+XHJcbiAgICAgICAgICAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWQtbG9hZGVyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNhZC1iYXNpYy1zcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FkLWxvYWRlci10ZXh0IG1iLTBcIj5cclxuICAgICAgICAgICAgICBCdWlsZGluZyBsYXlvdXRcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvYWRpbmctZG90c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNlbGVjdGVkRmlsZSA/ICdjb2wtMTInIDonY29sLTYnXCI+XG4gICAgICAgICAgICA8ZmlsZS11cGxvYWQgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj48L2ZpbGUtdXBsb2FkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2VsZWN0ZWRGaWxlID8gJ2Qtbm9uZScgOidjb2wtNidcIlxuICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA4MCA4MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI0MFwiIGN5PVwiNDBcIiByPVwiNDBcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNNTUuNTAwOCAzNC4zNzVINTEuMzc1Mkw0Ny42MjU4IDM4LjEyNTNINDIuMzc1MlYzNC4zNzVIMzEuMTI1MlY0OS4zNzUzSDI3LjM3NThDMjYuODc4NSA0OS4zNjc2IDI2LjM4NDYgNDkuNDU4OSAyNS45MjI5IDQ5LjY0MzlDMjUuNDYxMiA0OS44Mjg5IDI1LjA0MDkgNTAuMTAzOSAyNC42ODY0IDUwLjQ1MjhDMjQuMzMyIDUwLjgwMTggMjQuMDUwNiA1MS4yMTc4IDIzLjg1ODQgNTEuNjc2NkMyMy42NjYzIDUyLjEzNTMgMjMuNTY3NCA1Mi42Mjc4IDIzLjU2NzQgNTMuMTI1MUMyMy41Njc0IDUzLjYyMjUgMjMuNjY2MyA1NC4xMTQ5IDIzLjg1ODQgNTQuNTczN0MyNC4wNTA2IDU1LjAzMjUgMjQuMzMyIDU1LjQ0ODUgMjQuNjg2NCA1NS43OTc1QzI1LjA0MDkgNTYuMTQ2NCAyNS40NjEyIDU2LjQyMTQgMjUuOTIyOSA1Ni42MDY0QzI2LjM4NDYgNTYuNzkxNCAyNi44Nzg1IDU2Ljg4MjcgMjcuMzc1OCA1Ni44NzVINTUuNTAwOEM1NS45OTggNTYuODc1IDU2LjQ3NDggNTYuNjc3NSA1Ni44MjY0IDU2LjMyNTlDNTcuMTc4IDU1Ljk3NDMgNTcuMzc1NSA1NS40OTc1IDU3LjM3NTUgNTUuMDAwM1YzNi4yNDk3QzU3LjM3NTUgMzUuNzUyNSA1Ny4xNzggMzUuMjc1NyA1Ni44MjY0IDM0LjkyNDFDNTYuNDc0OCAzNC41NzI1IDU1Ljk5OCAzNC4zNzUgNTUuNTAwOCAzNC4zNzVaTTMxLjEyNTIgMjguNzVWNDkuMzc1M0gyNy4zNzU4QzI2LjM4MTMgNDkuMzc1MyAyNS40Mjc1IDQ5Ljc3MDMgMjQuNzI0MiA1MC40NzM0QzI0LjAyMDkgNTEuMTc2NSAyMy42MjU3IDUyLjEzMDIgMjMuNjI1NSA1My4xMjQ3VjMyLjUwMDNDMjMuNjI1NSAzMS41MDU3IDI0LjAyMDYgMzAuNTUxOCAyNC43MjM5IDI5Ljg0ODRDMjUuNDI3MiAyOS4xNDUxIDI2LjM4MTEgMjguNzUgMjcuMzc1OCAyOC43NUgzMS4xMjUyWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0QwRDVERFwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNMzEuMTI1MiA0OS4zNzUzVjM0LjM3NUg0Mi4zNzUyVjM4LjEyNTNINDcuNjI1OEw1MS4zNzUyIDM0LjM3NUg1NS41MDA4QzU1Ljk5OCAzNC4zNzUgNTYuNDc0OCAzNC41NzI1IDU2LjgyNjQgMzQuOTI0MUM1Ny4xNzggMzUuMjc1NyA1Ny4zNzU1IDM1Ljc1MjUgNTcuMzc1NSAzNi4yNDk3VjU1LjAwMDNDNTcuMzc1NSA1NS40OTc1IDU3LjE3OCA1NS45NzQzIDU2LjgyNjQgNTYuMzI1OUM1Ni40NzQ4IDU2LjY3NzUgNTUuOTk4IDU2Ljg3NSA1NS41MDA4IDU2Ljg3NUgyNy4zNzU4QzI2Ljg3ODUgNTYuODgyNyAyNi4zODQ2IDU2Ljc5MTQgMjUuOTIyOSA1Ni42MDY0QzI1LjQ2MTIgNTYuNDIxNCAyNS4wNDA5IDU2LjE0NjQgMjQuNjg2NCA1NS43OTc1QzI0LjMzMiA1NS40NDg1IDI0LjA1MDYgNTUuMDMyNSAyMy44NTg0IDU0LjU3MzdDMjMuNjY2MyA1NC4xMTQ5IDIzLjU2NzQgNTMuNjIyNSAyMy41Njc0IDUzLjEyNTFDMjMuNTY3NCA1Mi42Mjc4IDIzLjY2NjMgNTIuMTM1MyAyMy44NTg0IDUxLjY3NjZDMjQuMDUwNiA1MS4yMTc4IDI0LjMzMiA1MC44MDE4IDI0LjY4NjQgNTAuNDUyOEMyNS4wNDA5IDUwLjEwMzkgMjUuNDYxMiA0OS44Mjg5IDI1LjkyMjkgNDkuNjQzOUMyNi4zODQ2IDQ5LjQ1ODkgMjYuODc4NSA0OS4zNjc2IDI3LjM3NTggNDkuMzc1M00zMS4xMjUyIDQ5LjM3NTNIMjcuMzc1OE0zMS4xMjUyIDQ5LjM3NTNWMjguNzVIMjcuMzc1OEMyNi4zODExIDI4Ljc1IDI1LjQyNzIgMjkuMTQ1MSAyNC43MjM5IDI5Ljg0ODRDMjQuMDIwNiAzMC41NTE4IDIzLjYyNTUgMzEuNTA1NyAyMy42MjU1IDMyLjUwMDNWNTMuMTI0N0MyMy42MjU3IDUyLjEzMDIgMjQuMDIwOSA1MS4xNzY1IDI0LjcyNDIgNTAuNDczNEMyNS40Mjc1IDQ5Ljc3MDMgMjYuMzgxMyA0OS4zNzUzIDI3LjM3NTggNDkuMzc1M1wiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMC44NDM3NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNNTYuODMxNyAyNi4yOTNMNTQuMjA2NCAyMy42Njg2QzUzLjg1NiAyMy4zMjUyIDUzLjM4NDkgMjMuMTMyOCA1Mi44OTQyIDIzLjEzMjhDNTIuNDAzNSAyMy4xMzI4IDUxLjkzMjQgMjMuMzI1MiA1MS41ODIgMjMuNjY4Nkw0Mi4zNzUgMzIuODc1NlYzOC4xMjUzSDQ3LjYyNTZMNTYuODMxNyAyOC45MTgzQzU3LjE3NTEgMjguNTY3OSA1Ny4zNjc1IDI4LjA5NjggNTcuMzY3NSAyNy42MDYxQzU3LjM2NzUgMjcuMTE1NSA1Ny4xNzUxIDI2LjY0MzQgNTYuODMxNyAyNi4yOTNaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjMzNCNUZGXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJpc01hbnVhbFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0zXCIgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJcIiBpZD1cIm1hbnVhbFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYW51YWxcIj5DcmVhdGUgbWFudWFsbHk8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWFjdGlvbnNcIj5cclxuICAgIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBtZS1hdXRvXCIgKGNsaWNrKT1cIm9uQmFjaygpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+QmFjazwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVN0b3JlRm9ybS5pbnZhbGlkIHx8IGlzTW9kYWxCdXN5XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlU3RvcmUoKVwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmdcIj5cbiAgICAgICAgICBOZXh0XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9QGVsc2Uge1xuICAgICAgPGJ1dHRvbiAqbmdJZj1cIm5ld1N0b3JlRGV0YWlsc1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBtZS1hdXRvXCIgKGNsaWNrKT1cIm9uQmFjaygpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+QmFjazwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFuZXdTdG9yZURldGFpbHNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtYXV0b1wiIChjbGljayk9XCJhZGROZXdTdG9yZSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjgyOSAwLjgzNDk2MVYxMi41MDE2TTAuODM0OTYxIDYuNjY4MjlIMTIuNTAxNlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxyXG5cbiAgICAgICAgQ3JlYXRlIG5ldyBzdG9yZVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZVBsYW5vIHx8IGlzTW9kYWxCdXN5XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTGF5b3V0UGxhbm8oKVwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmcgfHwgaXNDYWRQcm9jZXNzaW5nXCI+XG4gICAgICAgICAge3tpc0xheW91dEV4aXN0ID8gICdPdmVyd3JpdGUnIDogJ0NyZWF0ZSd9fVxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJpc0J1dHRvbkxvYWRpbmcgJiYgIWlzQ2FkUHJvY2Vzc2luZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
503
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFrQixVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBR0wsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FFakIsTUFBTSxtQ0FBbUMsQ0FB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LFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixJQUFJO3dCQUNKLHVCQUF1Qjt3QkFDdkIsVUFBVTt3QkFDVixhQUFhO3dCQUNiLGFBQWE7d0JBQ2IsT0FBTztxQkFDUixhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxNQUFNOzRCQUNmLFFBQVEsRUFBRSxJQUFJLE1BQU0sQ0FBQztnQ0FDbkIsTUFBTSxFQUFFLHlDQUF5QztnQ0FDakQsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOzZCQUN0QixDQUFDO3lCQUNIO3FCQUNGOzBLQUdRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRU4sc0JBQXNCO3NCQURyQixTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmLCBUaXRsZUNhc2VQaXBlLCBVcHBlckNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tIFwiQGdvb2dsZW1hcHMvanMtYXBpLWxvYWRlclwiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyLW1hZ2ljL25neC1ncC1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRmlsZVVwbG9hZENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBnZW5lcmFsVmFsaWRhdG9yLFxyXG4gIGdldE5hbWVGcm9tRW1haWwsXHJcbiAgaW5kaWFuUGluY29kZVZhbGlkYXRvcixcclxufSBmcm9tIFwiLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCBsb3R0aWUsIHsgQW5pbWF0aW9uSXRlbSB9IGZyb20gXCJsb3R0aWUtd2ViXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICAgIE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlLFxyXG4gICAgTmdiVG9vbHRpcCxcclxuICAgIFVwcGVyQ2FzZVBpcGUsXHJcbiAgICBUaXRsZUNhc2VQaXBlLFxyXG4gICAgTmdDbGFzcyxcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBMb2FkZXIsXHJcbiAgICAgIHVzZVZhbHVlOiBuZXcgTG9hZGVyKHtcclxuICAgICAgICBhcGlLZXk6IFwiQUl6YVN5QWZXUTlndUZzU1hvWUl1MlZGQnctWFEzVm51ZnZGQTNBXCIsXHJcbiAgICAgICAgbGlicmFyaWVzOiBbXCJwbGFjZXNcIl0sXHJcbiAgICAgIH0pLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlUGxhbm9ncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZChcImNhZFByb2Nlc3NpbmdMb3R0aWVcIilcclxuICBjYWRQcm9jZXNzaW5nTG90dGllUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNCdXR0b25Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQb3B1cExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NhZFByb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NyZWF0ZVN0b3JlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5ld1N0b3JlRGV0YWlsczogYW55O1xyXG4gIHByaXZhdGUgY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbj86IEFuaW1hdGlvbkl0ZW07XHJcblxyXG4gIGNyZWF0ZVN0b3JlRm9ybTogYW55O1xyXG4gIHN0b3JlVHlwZUxpc3Q6IHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6IFwiSGlnaCBTdHJlZXRcIiwgdmFsdWU6IFwiSGlnaCBTdHJlZXRcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJNYWxsIFN0b3JlXCIsIHZhbHVlOiBcIk1hbGwgU3RvcmVcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJLaW9za1wiLCB2YWx1ZTogXCJLaW9za1wiIH0sXHJcbiAgXTtcclxuXHJcbiAgYnVzaW5lc3NUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJDT0NPXCIsIHZhbHVlOiBcIkNPQ09cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJDT0ZPXCIsIHZhbHVlOiBcIkNPRk9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0ZPXCIsIHZhbHVlOiBcIkZPRk9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0NPXCIsIHZhbHVlOiBcIkZPQ09cIiB9LFxyXG4gIF07XHJcblxyXG4gIGlzTWFudWFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmVMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveUNhZFByb2Nlc3NpbmdBbmltYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkVG9DcmVhdGVQbGFubygpIHtcclxuICAgIGNvbnN0IGhhc1N0b3JlU2VsZWN0aW9uID0gISF0aGlzLnNlbGVjdGVkU3RvcmUgfHwgISF0aGlzLm5ld1N0b3JlRGV0YWlscztcclxuICAgIGNvbnN0IGZsb29yTnVtYmVyID0gdGhpcy5zZWxlY3RlZEZsb29yIHx8IHRoaXMubmV3U3RvcmVEZXRhaWxzPy5mbG9vcjtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBoYXNTdG9yZVNlbGVjdGlvbiAmJlxyXG4gICAgICBmbG9vck51bWJlciAmJlxyXG4gICAgICAodGhpcy5zZWxlY3RlZEZpbGUgfHwgdGhpcy5pc01hbnVhbClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNNb2RhbEJ1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1BvcHVwTG9hZGluZyB8fCB0aGlzLmlzQnV0dG9uTG9hZGluZyB8fCB0aGlzLmlzQ2FkUHJvY2Vzc2luZztcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlTGlzdCgpIHtcclxuICAgIHRoaXMuaXNQb3B1cExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc3RvcmVzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0QWxsU3RvcmVzKHRoaXMuY2xpZW50SWQpLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnN0b3JlTGlzdCA9IHN0b3Jlcz8uZGF0YT8ubWFwKChzOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4geyBsYWJlbDogcy5zdG9yZU5hbWUsIHZhbHVlOiBzLnN0b3JlSWQgfTtcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzUG9wdXBMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9IFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdG9yZUNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5IHx8ICF0aGlzLnNlbGVjdGVkU3RvcmUpIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmbG9vcnM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRTdG9yZUZsb29yc0xpc3QodGhpcy5zZWxlY3RlZFN0b3JlKSxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzID0gZmxvb3JzPy5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLm9uRmxvb3JDaGFuZ2UoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTdG9yZUxpc3QgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmxvb3JDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsQnVzeSkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IpIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzLnNvbWUoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5mbG9vck51bWJlciA9PT0gdGhpcy5zZWxlY3RlZEZsb29yLFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZmlsZTogRmlsZSB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNyZWF0ZUxheW91dFBsYW5vKCkge1xuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRUb0NyZWF0ZVBsYW5vKSByZXR1cm47XG5cbiAgICBjb25zdCBoYXNDYWRGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZTtcbiAgICBsZXQgc2hvdWxkUmVzZXROZXdTdG9yZVN1bW1hcnkgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XG4gICAgICBpZiAoaGFzQ2FkRmlsZSkge1xuICAgICAgICB0aGlzLnNob3dDYWRQcm9jZXNzaW5nTG9hZGVyKCk7XG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdG9yZUNvbnRleHQgPSBhd2FpdCB0aGlzLmVuc3VyZVN0b3JlRm9yUGxhbm9DcmVhdGlvbigpO1xyXG4gICAgICBpZiAoIXN0b3JlQ29udGV4dCkgcmV0dXJuO1xyXG5cclxuICAgICAgbGV0IHBsYW5vUmVzOiBhbnk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZSkge1xyXG4gICAgICAgIHBsYW5vUmVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlUGxhbm9Gcm9tQ0FEKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSEsXHJcbiAgICAgICAgICAgIHN0b3JlQ29udGV4dC5zdG9yZUlkLFxyXG4gICAgICAgICAgICBzdG9yZUNvbnRleHQuc3RvcmVOYW1lID8/IHN0b3JlQ29udGV4dC5zdG9yZUlkLFxyXG4gICAgICAgICAgICBzdG9yZUNvbnRleHQuZmxvb3JOdW1iZXIsXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGxhbm9SZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVFbXB0eVBsYW5vKHtcclxuICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIHN0b3JlSWQ6IHN0b3JlQ29udGV4dC5zdG9yZUlkLFxyXG4gICAgICAgICAgICBmbG9vck51bWJlcjogc3RvcmVDb250ZXh0LmZsb29yTnVtYmVyLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwbGFub1Jlcz8uZGF0YSkgcmV0dXJuO1xuICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZShwbGFub1Jlcz8uZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgc2hvdWxkUmVzZXROZXdTdG9yZVN1bW1hcnkgPVxuICAgICAgICAhIXRoaXMubmV3U3RvcmVEZXRhaWxzPy5zdG9yZUlkICYmICEhdGhpcy5uZXdTdG9yZURldGFpbHM/LmluZnJhVGlja2V0Q3JlYXRlZDtcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXG4gICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3I/LmVyck1zZyA/PyBcIkZhaWxlZCB0byBleHRyYWN0IHBsYW5vIGZyb20gQ0FEIGZpbGUuXCIsXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ3JlYXRlIFtFUlJdOlwiLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XG4gICAgICAgIHRoaXMuaGlkZUNhZFByb2Nlc3NpbmdMb2FkZXIoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXNldE5ld1N0b3JlU3VtbWFyeSkge1xuICAgICAgICB0aGlzLm5ld1N0b3JlRGV0YWlscyA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycyA9IFtdO1xuICAgICAgICB0aGlzLmlzTGF5b3V0RXhpc3QgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxyXG4gIHByaXZhdGUgc2hvd0NhZFByb2Nlc3NpbmdMb2FkZXIoKSB7XHJcbiAgICB0aGlzLmlzQ2FkUHJvY2Vzc2luZyA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZENhZFByb2Nlc3NpbmdBbmltYXRpb24oKSwgMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpZGVDYWRQcm9jZXNzaW5nTG9hZGVyKCkge1xyXG4gICAgdGhpcy5pc0NhZFByb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuZGVzdHJveUNhZFByb2Nlc3NpbmdBbmltYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZENhZFByb2Nlc3NpbmdBbmltYXRpb24oKSB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNhZFByb2Nlc3NpbmdMb3R0aWVSZWY/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZGVzdHJveUNhZFByb2Nlc3NpbmdBbmltYXRpb24oKTtcclxuICAgIHRoaXMuY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbiA9IGxvdHRpZS5sb2FkQW5pbWF0aW9uKHtcclxuICAgICAgY29udGFpbmVyLFxyXG4gICAgICByZW5kZXJlcjogXCJzdmdcIixcclxuICAgICAgbG9vcDogdHJ1ZSxcclxuICAgICAgYXV0b3BsYXk6IHRydWUsXHJcbiAgICAgIHBhdGg6IFwiYXNzZXRzL2FuaW1hdGlvbnMvc3RyaW5nX2xvYWRpbmcuanNvblwiLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCkge1xyXG4gICAgdGhpcy5jYWRQcm9jZXNzaW5nQW5pbWF0aW9uPy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLmNhZFByb2Nlc3NpbmdBbmltYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNyZWF0ZVN0b3JlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHNwb2NVc2VyID0gYXdhaXQgdGhpcy5nZXRTcG9jVXNlckRldGFpbHMoXHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuc3RvcmVOYW1lLnRyaW0oKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghc3BvY1VzZXIpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IFwiXCI7XG4gICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJmbG9vclwiKT8udmFsdWUgPz8gMTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycyA9IFtdO1xuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gZmFsc2U7XG4gICAgICB0aGlzLm5ld1N0b3JlRGV0YWlscyA9IHRoaXMuYnVpbGRQZW5kaW5nU3RvcmVEZXRhaWxzKHNwb2NVc2VyKTtcbiAgICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXCJGYWlsZWQgdG8gcHJlcGFyZSBzdG9yZSBkZXRhaWxzXCIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRQZW5kaW5nU3RvcmVEZXRhaWxzKHNwb2NVc2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IGNyZWF0ZVN0b3JlUGF5bG9hZCA9IHtcclxuICAgICAgc3RvcmVOYW1lOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZU5hbWU/LnRvVXBwZXJDYXNlKCk/LnRyaW0oKSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIGJ1c2luZXNzVHlwZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuYnVzaW5lc3NUeXBlLFxyXG4gICAgICBjbHVzdGVyOiBbXSxcclxuICAgICAgc3RvcmVUeXBlOiB7XHJcbiAgICAgICAgdHlwZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuc3RvcmVUeXBlLFxyXG4gICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5zdG9yZVR5cGVOYW1lPy50cmltKCksXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0b3JlUHJvZmlsZToge1xyXG4gICAgICAgIHN0b3JlQ29kZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0/LnZhbHVlPy5zdG9yZUNvZGUsXHJcbiAgICAgICAgYWRkcmVzczogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LmFkZHJlc3MsXHJcbiAgICAgICAgY291bnRyeTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LmNvdW50cnksXHJcbiAgICAgICAgc3RhdGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5zdGF0ZSxcclxuICAgICAgICBjaXR5OiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uY2l0eSxcclxuICAgICAgICBwaW5jb2RlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8ucGluY29kZSxcclxuICAgICAgICBsYXRpdHVkZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubGF0aXR1ZGU/LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICA/IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxhdGl0dWRlXHJcbiAgICAgICAgICA6IDAsXHJcbiAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5sb25naXR1ZGU/LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICA/IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxvbmdpdHVkZVxyXG4gICAgICAgICAgOiAwLFxyXG4gICAgICAgIHRpbWVab25lOiBcIkFzaWEvS29sa2F0YVwiLFxyXG4gICAgICAgIG9wZW46IFwiMTA6MDA6MDBcIixcclxuICAgICAgICBjbG9zZTogXCIyMDowMDowMFwiLFxyXG4gICAgICB9LFxyXG4gICAgICBlZGdlOiB7XHJcbiAgICAgICAgc2VydmVyVHlwZTogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHNwb2NEZXRhaWxzOiBbc3BvY1VzZXJdLFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5jcmVhdGVTdG9yZVBheWxvYWQsXHJcbiAgICAgIGNyZWF0ZVN0b3JlUGF5bG9hZCxcclxuICAgICAgZmxvb3I6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImZsb29yXCIpPy52YWx1ZSA/PyAxLFxyXG4gICAgICBzdG9yZUlkOiBudWxsLFxyXG4gICAgICBpbmZyYVRpY2tldENyZWF0ZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3RvcmVGb3JQbGFub0NyZWF0aW9uKCkge1xyXG4gICAgY29uc3QgZmxvb3JOdW1iZXIgPSB0aGlzLnNlbGVjdGVkRmxvb3IgfHwgdGhpcy5uZXdTdG9yZURldGFpbHM/LmZsb29yO1xyXG5cclxuICAgIGlmICghdGhpcy5uZXdTdG9yZURldGFpbHMpIHtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkU3RvcmUgfHwgIWZsb29yTnVtYmVyKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoXHJcbiAgICAgICAgKHMpID0+IHMudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgKT8ubGFiZWw7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0b3JlSWQ6IHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSA/PyB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgZmxvb3JOdW1iZXIsXHJcbiAgICAgIH07XHJcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZUlkKSB7XG4gICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVN0b3JlKFxuICAgICAgICAgICAgdGhpcy5uZXdTdG9yZURldGFpbHMuY3JlYXRlU3RvcmVQYXlsb2FkLFxuICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3U3RvcmUgPSByZXM/LmRhdGE/LnN0b3JlO1xyXG5cclxuICAgICAgICBpZiAoIW5ld1N0b3JlPy5zdG9yZUlkKSB7XG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgc3RvcmVcIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZUlkID0gbmV3U3RvcmUuc3RvcmVJZDtcbiAgICAgICAgdGhpcy5uZXdTdG9yZURldGFpbHMuc3RvcmVOYW1lID0gbmV3U3RvcmUuc3RvcmVOYW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUgPSBuZXdTdG9yZS5zdG9yZUlkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSBmbG9vck51bWJlcjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzID0gW107XG4gICAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IGZhbHNlO1xuICAgICAgfVxuXHJcbiAgICAgIGlmICghdGhpcy5uZXdTdG9yZURldGFpbHMuaW5mcmFUaWNrZXRDcmVhdGVkKSB7XHJcbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlSW5mcmFUaWNrZXQoe1xyXG4gICAgICAgICAgICBzdG9yZUlkOiB0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZUlkLFxyXG4gICAgICAgICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLFxyXG4gICAgICAgICAgICBpc3N1ZVR5cGU6IFwiaW5zdGFsbGF0aW9uXCIsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5ld1N0b3JlRGV0YWlscy5pbmZyYVRpY2tldENyZWF0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZUNvbnRleHQgPSB7XG4gICAgICAgIHN0b3JlSWQ6IHRoaXMubmV3U3RvcmVEZXRhaWxzLnN0b3JlSWQsXG4gICAgICAgIHN0b3JlTmFtZTogdGhpcy5uZXdTdG9yZURldGFpbHMuc3RvcmVOYW1lLFxuICAgICAgICBmbG9vck51bWJlcixcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZUlkICYmIHRoaXMubmV3U3RvcmVEZXRhaWxzLmluZnJhVGlja2V0Q3JlYXRlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMuc3RvcmVMaXN0LnNvbWUoXG4gICAgICAgICAgICAoc3RvcmUpID0+IHN0b3JlLnZhbHVlID09PSB0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZUlkLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLm5ld1N0b3JlRGV0YWlscy5zdG9yZUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cclxuICAgICAgcmV0dXJuIHN0b3JlQ29udGV4dDtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5lcnJvcj8uZXJyb3I/LmVycm9yID09PSBcIlN0b3JlTmFtZSBhbHJlYWR5IGV4aXN0c1wiKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlN0b3JlIE5hbWUgYWxyZWFkeSBleGlzdHNcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTcG9jVXNlckRldGFpbHMoc3RvcmVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHNhZmVTdG9yZU5hbWUgPSBzdG9yZU5hbWVcclxuICAgICAgPy50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIC50cmltKClcclxuICAgICAgLnJlcGxhY2UoL1xccysvZywgXCJfXCIpXHJcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0vZywgXCJcIik7XHJcblxyXG4gICAgY29uc3QgZW1haWwgPVxyXG4gICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJlbWFpbFwiKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgYCR7c2FmZVN0b3JlTmFtZX1fcGxhbm9ncmFtQGxlbnNrYXJ0LmNvbWA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnNwb2NFbWFpbENoZWNrKHtcclxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgZW1haWw6IFtlbWFpbF0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogZ2V0TmFtZUZyb21FbWFpbChlbWFpbCksXHJcbiAgICAgICAgICBlbWFpbDogZW1haWwsXHJcbiAgICAgICAgICBjb250YWN0OiBcIjk5OTk5OTk5OTlcIixcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3BvY1VzZXJEZXRhaWxzIFtFUlJdOiBcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3IgPz8gXCJVbmFibGUgdG8gY3JlYXRlIFVzZXJcIixcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGROZXdTdG9yZSgpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc3RvcmVOYW1lOiBbXHJcbiAgICAgICAgXCJcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgdGhpcy5zdG9yZU5hbWVWYWxpZGF0b3IoKSxcclxuICAgICAgICAgIHRoaXMuc3RvcmVOYW1lRXhpc3RzVmFsaWRhdG9yKCksXHJcbiAgICAgICAgICBnZW5lcmFsVmFsaWRhdG9yKCksXHJcbiAgICAgICAgXSxcclxuICAgICAgXSxcclxuICAgICAgZW1haWw6IFtcIlwiLCBWYWxpZGF0b3JzLmVtYWlsXSxcclxuICAgICAgZmxvb3I6IFsxXSxcclxuICAgICAgYnVzaW5lc3NUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0b3JlVHlwZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBzdG9yZVR5cGVOYW1lOiBbXCJcIiwgZ2VuZXJhbFZhbGlkYXRvcigpXSxcclxuICAgICAgYWRkcmVzczogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBjb3VudHJ5OiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0YXRlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGNpdHk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcGluY29kZTogW1xyXG4gICAgICAgIFwiXCIsXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIC8vICBpbmRpYW5QaW5jb2RlVmFsaWRhdG9yKClcclxuICAgICAgICBdLFxyXG4gICAgICBdLFxyXG4gICAgICBsYXRpdHVkZTogW1wiXCJdLFxyXG4gICAgICBsb25naXR1ZGU6IFtcIlwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtXHJcbiAgICAgIC5nZXQoXCJzdG9yZVR5cGVcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSBcIk1hbGwgU3RvcmVcIikge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwic3RvcmVUeXBlTmFtZVwiKT8ucmVzZXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtXHJcbiAgICAgIC5nZXQoXCJzdG9yZU5hbWVcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBjb25zdCB1cHBlciA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVwcGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtXHJcbiAgICAgICAgICAgICAgLmdldChcInN0b3JlTmFtZVwiKVxyXG4gICAgICAgICAgICAgID8uc2V0VmFsdWUodXBwZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IHVybFRyZWUgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtcIi9tYW5hZ2Uvc3RvcmVzL2FkZC1zaW5nbGUtc3RvcmVcIl0pO1xyXG4gICAgLy8gY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKHVybFRyZWUpO1xyXG4gICAgLy8gd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcclxuICB9XHJcblxyXG4gIHN0b3JlTmFtZUV4aXN0c1ZhbGlkYXRvciA9ICgpOiBWYWxpZGF0b3JGbiA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsOyAvLyBhbGxvdyByZXF1aXJlZCB2YWxpZGF0b3IgdG8gaGFuZGxlIGVtcHR5XHJcblxyXG4gICAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBjb25zdCBzID0gdGhpcy5zdG9yZUxpc3QuZmluZChcclxuICAgICAgICAocykgPT4gcz8ubGFiZWw/LnRyaW0oKT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gdHJpbW1lZCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHMpIHJldHVybiB7IGV4aXN0czogdHJ1ZSB9O1xyXG5cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHN0b3JlTmFtZVZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICBjb25zdCBzdFBhdHRlcm4gPSAvXlNUXFxkezR9JC87IC8vIFNUMTIzNFxyXG4gICAgICBjb25zdCBsa3N0UGF0dGVybiA9IC9eTEtTVFxcZHs0fSQvOyAvLyBMS1NUMTIzNFxyXG5cclxuICAgICAgY29uc3QgaXNWYWxpZCA9IHN0UGF0dGVybi50ZXN0KHZhbHVlKSB8fCBsa3N0UGF0dGVybi50ZXN0KHZhbHVlKTtcclxuXHJcbiAgICAgIHJldHVybiBpc1ZhbGlkID8gbnVsbCA6IHsgaW52YWxpZFN0b3JlTmFtZTogdHJ1ZSB9O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG9uQWRkcmVzc0NoYW5nZShwbGFjZTogZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0IHwgYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsQnVzeSB8fCAhdGhpcy5jcmVhdGVTdG9yZUZvcm0gfHwgIXBsYWNlPy5nZW9tZXRyeSkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBjb3VudHJ5ID0gXCJcIixcclxuICAgICAgY2l0eSA9IFwiXCIsXHJcbiAgICAgIHN0YXRlID0gXCJcIixcclxuICAgICAgcGluY29kZSA9IFwiXCI7XHJcblxyXG4gICAgbGV0IGxhdGl0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCk7XHJcbiAgICBsZXQgbG9uZ2l0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKCk7XHJcblxyXG4gICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJjb3VudHJ5XCIpKSB7XHJcbiAgICAgICAgY291bnRyeSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwibG9jYWxpdHlcIikpIHtcclxuICAgICAgICBjaXR5ID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzFcIikpIHtcclxuICAgICAgICBzdGF0ZSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwicG9zdGFsX2NvZGVcIikpIHtcclxuICAgICAgICBwaW5jb2RlID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiYWRkcmVzc1wiKT8uc2V0VmFsdWUocGxhY2UuZm9ybWF0dGVkX2FkZHJlc3MpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiY291bnRyeVwiKT8uc2V0VmFsdWUoY291bnRyeSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJjaXR5XCIpPy5zZXRWYWx1ZShjaXR5KTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcInN0YXRlXCIpPy5zZXRWYWx1ZShzdGF0ZSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJwaW5jb2RlXCIpPy5zZXRWYWx1ZShwaW5jb2RlKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImxhdGl0dWRlXCIpPy5zZXRWYWx1ZShsYXRpdHVkZSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJsb25naXR1ZGVcIik/LnNldFZhbHVlKGxvbmdpdHVkZSk7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoKTtcclxuICB9XHJcblxyXG4gIG9uQmFjaygpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzQ3JlYXRlU3RvcmVNb2RlICYmIHRoaXMubmV3U3RvcmVEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5uZXdTdG9yZURldGFpbHMgPSBudWxsO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtd3JhcHBlclwiPlxyXG4gIDxkaXYgKm5nSWY9XCJpc1BvcHVwTG9hZGluZ1wiIGNsYXNzPVwibW9kYWwtbG9hZGVyLW92ZXJsYXlcIj5cclxuICAgIDxzdmcgY2xhc3M9XCJtb2RhbC1zcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICA8L3N2Zz5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGgzIGNsYXNzPVwibWItM1wiPkNyZWF0ZSBzdG9yZSBsYXlvdXQvcGxhbiBmcm9tIENBRDwvaDM+XHJcbiAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgPHA+U3RlcCAxOiBPbmJvYXJkIHN0b3JlIHdpdGggYmFzaWMgZGV0YWlsczwvcD5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICBuZ2JUb29sdGlwPVwiQSBuZXcgc3RvcmUgd2lsbCBiZSBjcmVhdGVkIHdoZW4geW91IHBlcmZvcm0gdGhpcyBhY3Rpb24gKE1hbmFnZSA+IFN0b3JlcykuXCI+XHJcbiAgICAgICAgPHBhdGhcclxuICAgICAgICAgIGQ9XCJNMTAuMDAwMyAxMy4zMzM3VjEwLjAwMDNNMTAuMDAwMyA2LjY2Njk5SDEwLjAwODdNMTguMzMzNyAxMC4wMDAzQzE4LjMzMzcgMTQuNjAyNyAxNC42MDI3IDE4LjMzMzcgMTAuMDAwMyAxOC4zMzM3QzUuMzk3OTUgMTguMzMzNyAxLjY2Njk5IDE0LjYwMjcgMS42NjY5OSAxMC4wMDAzQzEuNjY2OTkgNS4zOTc5NSA1LjM5Nzk1IDEuNjY2OTkgMTAuMDAwMyAxLjY2Njk5QzE0LjYwMjcgMS42NjY5OSAxOC4zMzM3IDUuMzk3OTUgMTguMzMzNyAxMC4wMDAzWlwiXHJcbiAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuXHJcbiAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3JlYXRlU3RvcmVGb3JtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RvcmVOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TdG9yZSBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdG9yZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZU5hbWVcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgc3RvcmUgbmFtZS4gZWc6IExLU1QxMjM0XCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/LmludmFsaWRcIj5cclxuXHJcbiAgICAgICAgICAgIEBpZihjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ2V4aXN0cycpKXtcclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgU3RvcmUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcblxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ2ludmFsaWRTdG9yZU5hbWUnKSBcIj5cclxuICAgICAgICAgICAgICAgIFN0b3JlIG5hbWUgbXVzdCBiZSBTVDEyMzQgb3IgTEtTVDEyMzQgZm9ybWF0LlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZsb29yXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiYnVzaW5lc3NUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGJ1c2luZXNzIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnVzaW5lc3NUeXBlXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVUeXBlXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZihjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGUnKT8udmFsdWUgPT0gJ01hbGwgU3RvcmUnKXtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RvcmVUeXBlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RW50ZXIgTWFsbCBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0b3JlVHlwZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZVR5cGVOYW1lXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIE1hbGwgbmFtZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICBNYWxsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5BZGRyZXNzPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFuZCBlbnRlciBhZGRyZXNzXCIgbmd4LWdwLWF1dG9jb21wbGV0ZSAob25BZGRyZXNzQ2hhbmdlKT1cIm9uQWRkcmVzc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb3VudHJ5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TdGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgU3RhdGVcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNpdHkgLyBUb3duPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQ2l0eSAvIFRvd25cIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDaXR5IC8gVG93biBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInBpbmNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpbiAvIFppcCBDb2RlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5jb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwicGluY29kZVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBQaW4gLyBaaXAgQ29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpIHx8IGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIFBpbmNvZGUgY2Fubm90IGNvbnRhaW4gd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ2ludmFsaWRQaW5jb2RlJylcIj5cclxuICAgICAgICAgICAgICBFbnRlciBhIHZhbGlkIDYtZGlnaXQgcGluY29kZVxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TcG9jIHVzZXIgZW1haWwgKG9wdGlvbmFsKTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3BvYyB1c2VyIGVtYWlsXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/Lmhhc0Vycm9yKCdlbWFpbCcpXCI+XHJcbiAgICAgICAgICAgICAgRW1haWwgaXMgaW52YWxpZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgfVxyXG4gIEBlbHNlIHtcclxuICAgIEBpZihuZXdTdG9yZURldGFpbHMpe1xyXG4gICAgICA8cCBjbGFzcz1cIm1iLTZcIj5TdGVwIDI6IEFkZCBDQUQgZmlsZTwvcD5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPlN0b3JlIG5hbWU8L3A+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJuZXctc3RvcmUtdHh0XCI+e3tuZXdTdG9yZURldGFpbHM/LnN0b3JlTmFtZX19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5GbG9vcjwvcD5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5ldy1zdG9yZS10eHRcIj5GbG9vciB7e3RoaXMuc2VsZWN0ZWRGbG9vcn19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5CdXNpbmVzcyB0eXBlPC9wPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibmV3LXN0b3JlLXR4dFwiPnt7bmV3U3RvcmVEZXRhaWxzPy5idXNpbmVzc1R5cGUgfCB1cHBlcmNhc2V9fTwvaDM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+U3RvcmUgdHlwZTwvcD5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5ldy1zdG9yZS10eHRcIj57e25ld1N0b3JlRGV0YWlscz8uc3RvcmVUeXBlPy50eXBlIHwgdGl0bGVjYXNlfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW3NlYXJjaF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFN0b3JlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgIFtkYXRhXT1cInN0b3JlTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlJ1wiIFthY3Rpb25dPVwidHJ1ZVwiIChhY3Rpb25DbGljayk9XCJhZGROZXdTdG9yZSgpXCJcclxuICAgICAgICAgICAgW2FjdGlvbkxhYmVsXT1cIidDcmVhdGUgbmV3IHN0b3JlJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxyXG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxyXG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtZXhpc3Qtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cImlzTGF5b3V0RXhpc3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdhcm5pbmcgbWItNFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk05Ljk5OTY1IDYuNjY2NjdWMTBNOS45OTk2NSAxMy4zMzMzSDEwLjAwOE04LjU3NDY1IDIuMzgzMzRMMS41MTYzMiAxNC4xNjY3QzEuMzcwNzkgMTQuNDE4NyAxLjI5Mzc5IDE0LjcwNDQgMS4yOTI5OCAxNC45OTU0QzEuMjkyMTYgMTUuMjg2NSAxLjM2NzU2IDE1LjU3MjYgMS41MTE2NyAxNS44MjU0QzEuNjU1NzkgMTYuMDc4MyAxLjg2MzU5IDE2LjI4OSAyLjExNDQxIDE2LjQzNjZDMi4zNjUyMyAxNi41ODQxIDIuNjUwMzIgMTYuNjYzNSAyLjk0MTMyIDE2LjY2NjdIMTcuMDU4QzE3LjM0OSAxNi42NjM1IDE3LjYzNDEgMTYuNTg0MSAxNy44ODQ5IDE2LjQzNjZDMTguMTM1NyAxNi4yODkgMTguMzQzNSAxNi4wNzgzIDE4LjQ4NzYgMTUuODI1NEMxOC42MzE3IDE1LjU3MjYgMTguNzA3MSAxNS4yODY1IDE4LjcwNjMgMTQuOTk1NEMxOC43MDU1IDE0LjcwNDQgMTguNjI4NSAxNC40MTg3IDE4LjQ4MyAxNC4xNjY3TDExLjQyNDcgMi4zODMzNEMxMS4yNzYxIDIuMTM4NDMgMTEuMDY2OSAxLjkzNTk0IDEwLjgxNzMgMS43OTU0MUMxMC41Njc3IDEuNjU0ODggMTAuMjg2MSAxLjU4MTA1IDkuOTk5NjUgMS41ODEwNUM5LjcxMzIxIDEuNTgxMDUgOS40MzE1OSAxLjY1NDg4IDkuMTgxOTkgMS43OTU0MUM4LjkzMjM4IDEuOTM1OTQgOC43MjMyMSAyLjEzODQzIDguNTc0NjUgMi4zODMzNFpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgIFRoaXMgc3RvcmUgYWxyZWFkeSBoYXMgYSBGbG9vciB7e3NlbGVjdGVkRmxvb3J9fSBwbGFub2dyYW0uIE92ZXJ3cml0ZSBpdD8gVGhpcyBjYW7igJl0IGJlIHVuZG9uZS5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICBAaWYgKGlzQ2FkUHJvY2Vzc2luZykge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWQtbG9hZGVyLXBhbmVsXCI+XHJcbiAgICAgICAgICA8IS0tXHJcbiAgICAgICAgICA8ZGl2ICNjYWRQcm9jZXNzaW5nTG90dGllIGNsYXNzPVwiY2FkLWxvdHRpZVwiPjwvZGl2PlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJjYWQtbG9hZGVyLXRleHQgbWItMFwiPkNyZWF0aW5nIHBsYW5vZ3JhbSBmcm9tIENBRC4uLjwvcD5cclxuICAgICAgICAgIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhZC1sb2FkZXItY29udGVudFwiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2FkLWJhc2ljLXNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCI+XHJcbiAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjYWQtbG9hZGVyLXRleHQgbWItMFwiPlxyXG4gICAgICAgICAgICAgIEJ1aWxkaW5nIGxheW91dFxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9hZGluZy1kb3RzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJzZWxlY3RlZEZpbGUgPyAnY29sLTEyJyA6J2NvbC02J1wiPlxyXG4gICAgICAgICAgICA8ZmlsZS11cGxvYWQgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj48L2ZpbGUtdXBsb2FkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNlbGVjdGVkRmlsZSA/ICdkLW5vbmUnIDonY29sLTYnXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDgwIDgwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQwXCIgY3k9XCI0MFwiIHI9XCI0MFwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk01NS41MDA4IDM0LjM3NUg1MS4zNzUyTDQ3LjYyNTggMzguMTI1M0g0Mi4zNzUyVjM0LjM3NUgzMS4xMjUyVjQ5LjM3NTNIMjcuMzc1OEMyNi44Nzg1IDQ5LjM2NzYgMjYuMzg0NiA0OS40NTg5IDI1LjkyMjkgNDkuNjQzOUMyNS40NjEyIDQ5LjgyODkgMjUuMDQwOSA1MC4xMDM5IDI0LjY4NjQgNTAuNDUyOEMyNC4zMzIgNTAuODAxOCAyNC4wNTA2IDUxLjIxNzggMjMuODU4NCA1MS42NzY2QzIzLjY2NjMgNTIuMTM1MyAyMy41Njc0IDUyLjYyNzggMjMuNTY3NCA1My4xMjUxQzIzLjU2NzQgNTMuNjIyNSAyMy42NjYzIDU0LjExNDkgMjMuODU4NCA1NC41NzM3QzI0LjA1MDYgNTUuMDMyNSAyNC4zMzIgNTUuNDQ4NSAyNC42ODY0IDU1Ljc5NzVDMjUuMDQwOSA1Ni4xNDY0IDI1LjQ2MTIgNTYuNDIxNCAyNS45MjI5IDU2LjYwNjRDMjYuMzg0NiA1Ni43OTE0IDI2Ljg3ODUgNTYuODgyNyAyNy4zNzU4IDU2Ljg3NUg1NS41MDA4QzU1Ljk5OCA1Ni44NzUgNTYuNDc0OCA1Ni42Nzc1IDU2LjgyNjQgNTYuMzI1OUM1Ny4xNzggNTUuOTc0MyA1Ny4zNzU1IDU1LjQ5NzUgNTcuMzc1NSA1NS4wMDAzVjM2LjI0OTdDNTcuMzc1NSAzNS43NTI1IDU3LjE3OCAzNS4yNzU3IDU2LjgyNjQgMzQuOTI0MUM1Ni40NzQ4IDM0LjU3MjUgNTUuOTk4IDM0LjM3NSA1NS41MDA4IDM0LjM3NVpNMzEuMTI1MiAyOC43NVY0OS4zNzUzSDI3LjM3NThDMjYuMzgxMyA0OS4zNzUzIDI1LjQyNzUgNDkuNzcwMyAyNC43MjQyIDUwLjQ3MzRDMjQuMDIwOSA1MS4xNzY1IDIzLjYyNTcgNTIuMTMwMiAyMy42MjU1IDUzLjEyNDdWMzIuNTAwM0MyMy42MjU1IDMxLjUwNTcgMjQuMDIwNiAzMC41NTE4IDI0LjcyMzkgMjkuODQ4NEMyNS40MjcyIDI5LjE0NTEgMjYuMzgxMSAyOC43NSAyNy4zNzU4IDI4Ljc1SDMxLjEyNTJaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjRDBENUREXCIgLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0zMS4xMjUyIDQ5LjM3NTNWMzQuMzc1SDQyLjM3NTJWMzguMTI1M0g0Ny42MjU4TDUxLjM3NTIgMzQuMzc1SDU1LjUwMDhDNTUuOTk4IDM0LjM3NSA1Ni40NzQ4IDM0LjU3MjUgNTYuODI2NCAzNC45MjQxQzU3LjE3OCAzNS4yNzU3IDU3LjM3NTUgMzUuNzUyNSA1Ny4zNzU1IDM2LjI0OTdWNTUuMDAwM0M1Ny4zNzU1IDU1LjQ5NzUgNTcuMTc4IDU1Ljk3NDMgNTYuODI2NCA1Ni4zMjU5QzU2LjQ3NDggNTYuNjc3NSA1NS45OTggNTYuODc1IDU1LjUwMDggNTYuODc1SDI3LjM3NThDMjYuODc4NSA1Ni44ODI3IDI2LjM4NDYgNTYuNzkxNCAyNS45MjI5IDU2LjYwNjRDMjUuNDYxMiA1Ni40MjE0IDI1LjA0MDkgNTYuMTQ2NCAyNC42ODY0IDU1Ljc5NzVDMjQuMzMyIDU1LjQ0ODUgMjQuMDUwNiA1NS4wMzI1IDIzLjg1ODQgNTQuNTczN0MyMy42NjYzIDU0LjExNDkgMjMuNTY3NCA1My42MjI1IDIzLjU2NzQgNTMuMTI1MUMyMy41Njc0IDUyLjYyNzggMjMuNjY2MyA1Mi4xMzUzIDIzLjg1ODQgNTEuNjc2NkMyNC4wNTA2IDUxLjIxNzggMjQuMzMyIDUwLjgwMTggMjQuNjg2NCA1MC40NTI4QzI1LjA0MDkgNTAuMTAzOSAyNS40NjEyIDQ5LjgyODkgMjUuOTIyOSA0OS42NDM5QzI2LjM4NDYgNDkuNDU4OSAyNi44Nzg1IDQ5LjM2NzYgMjcuMzc1OCA0OS4zNzUzTTMxLjEyNTIgNDkuMzc1M0gyNy4zNzU4TTMxLjEyNTIgNDkuMzc1M1YyOC43NUgyNy4zNzU4QzI2LjM4MTEgMjguNzUgMjUuNDI3MiAyOS4xNDUxIDI0LjcyMzkgMjkuODQ4NEMyNC4wMjA2IDMwLjU1MTggMjMuNjI1NSAzMS41MDU3IDIzLjYyNTUgMzIuNTAwM1Y1My4xMjQ3QzIzLjYyNTcgNTIuMTMwMiAyNC4wMjA5IDUxLjE3NjUgMjQuNzI0MiA1MC40NzM0QzI1LjQyNzUgNDkuNzcwMyAyNi4zODEzIDQ5LjM3NTMgMjcuMzc1OCA0OS4zNzUzXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIwLjg0Mzc1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk01Ni44MzE3IDI2LjI5M0w1NC4yMDY0IDIzLjY2ODZDNTMuODU2IDIzLjMyNTIgNTMuMzg0OSAyMy4xMzI4IDUyLjg5NDIgMjMuMTMyOEM1Mi40MDM1IDIzLjEzMjggNTEuOTMyNCAyMy4zMjUyIDUxLjU4MiAyMy42Njg2TDQyLjM3NSAzMi44NzU2VjM4LjEyNTNINDcuNjI1Nkw1Ni44MzE3IDI4LjkxODNDNTcuMTc1MSAyOC41Njc5IDU3LjM2NzUgMjguMDk2OCA1Ny4zNjc1IDI3LjYwNjFDNTcuMzY3NSAyNy4xMTU1IDU3LjE3NTEgMjYuNjQzNCA1Ni44MzE3IDI2LjI5M1pcIlxyXG4gICAgICAgICAgICAgICAgZmlsbD1cIiMzM0I1RkZcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJpc01hbnVhbFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0zXCIgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJcIiBpZD1cIm1hbnVhbFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFudWFsXCI+Q3JlYXRlIG1hbnVhbGx5PC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1hY3Rpb25zXCI+XHJcbiAgICBAaWYoaXNDcmVhdGVTdG9yZU1vZGUpe1xyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBtZS1hdXRvXCIgKGNsaWNrKT1cIm9uQmFjaygpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+QmFjazwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IFwiIFtkaXNhYmxlZF09XCJjcmVhdGVTdG9yZUZvcm0uaW52YWxpZCB8fCBpc01vZGFsQnVzeVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlU3RvcmUoKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgTmV4dFxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCJuZXdTdG9yZURldGFpbHNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgbWUtYXV0b1wiIChjbGljayk9XCJvbkJhY2soKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+QmFjazwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIW5ld1N0b3JlRGV0YWlsc1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS1hdXRvXCIgKGNsaWNrKT1cImFkZE5ld1N0b3JlKClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk02LjY2ODI5IDAuODM0OTYxVjEyLjUwMTZNMC44MzQ5NjEgNi42NjgyOUgxMi41MDE2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICBDcmVhdGUgbmV3IHN0b3JlXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IFwiIFtkaXNhYmxlZF09XCIhaXNWYWxpZFRvQ3JlYXRlUGxhbm8gfHwgaXNNb2RhbEJ1c3lcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNyZWF0ZUxheW91dFBsYW5vKClcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmcgfHwgaXNDYWRQcm9jZXNzaW5nXCI+XHJcbiAgICAgICAgICB7e2lzTGF5b3V0RXhpc3QgPyAgJ092ZXJ3cml0ZScgOiAnQ3JlYXRlJ319XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXNCdXR0b25Mb2FkaW5nICYmICFpc0NhZFByb2Nlc3NpbmdcIiBjbGFzcz1cInNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCI+XHJcbiAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19