tango-app-ui-manage-settings 3.7.37 → 3.7.39

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.
@@ -411,13 +411,13 @@ export class ActivityLogsComponent {
411
411
  this.getActivityLogs();
412
412
  }
413
413
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActivityLogsComponent, deps: [{ token: i1.ClientApiService }, { token: i0.ChangeDetectorRef }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
414
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ActivityLogsComponent, selector: "lib-activity-logs", host: { listeners: { "document:click": "onClick($event)" } }, ngImport: i0, template: "<div class=\"activity-card\">\r\n <ng-container *ngIf=\"pageState$ | async as pageState\" >\r\n <ng-container [ngSwitch]=\"pageState\" >\r\n <ng-container *ngSwitchCase=\"'loaded'\" >\r\n <div class=\"d-flex justify-content-between align-items-center mb-10\">\r\n <div class=\"header\">Activity Logs</div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"d-flex align-items-center position-relative me-5\">\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput ngxDaterangepickerMd\r\n [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\" [autoApply]=\"true\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" />\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- Searchable single-select store filter (self-contained;\r\n shows store name, sends storeId to the backend). -->\r\n <div class=\"store-filter position-relative me-5\">\r\n <button type=\"button\" (click)=\"toggleStoreDropdown($event)\"\r\n class=\"btn btn-default btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between align-items-center\"\r\n style=\"min-width: 180px;\">\r\n <span>{{ selectedStoreName ? selectedStoreName : 'All Stores' }}</span>\r\n <span class=\"d-flex align-items-center\">\r\n <svg *ngIf=\"selectedStoreName\" (click)=\"clearStore($event)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-1\">\r\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </button>\r\n <div *ngIf=\"storeDropdownOpen\" class=\"card py-1 position-absolute z-1 end-0\" style=\"min-width: 220px; max-height: 280px; overflow-y: auto; top: 44px;\">\r\n <div class=\"px-3 py-2\">\r\n <input type=\"text\" [value]=\"storeSearch\" (input)=\"onStoreSearch($event)\" (click)=\"$event.stopPropagation()\"\r\n placeholder=\"Search store\" class=\"form-control py-2\" />\r\n </div>\r\n <ul class=\"list-unstyled mb-0\">\r\n <li [ngClass]=\"!selectedStoreId ? 'active' : ''\" class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore({})\">All Stores</li>\r\n <li *ngFor=\"let s of filteredStoreOptions\" [ngClass]=\"selectedStoreId === s.storeId ? 'active' : ''\"\r\n class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore(s)\">{{ s.storeName }}</li>\r\n <li *ngIf=\"!filteredStoreOptions.length\" class=\"px-5 py-2 text-muted\">No stores found</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n\r\n </div>\r\n </div>\r\n \r\n <ng-container *ngIf=\"logList?.length\" >\r\n <ng-container *ngFor=\"let item of logList\">\r\n <div *ngIf=\"item?.type === 'angleChange'; else normalLog\"\r\n class=\"log-card mb-8 d-flex align-items-center justify-content-between\">\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"header me-3\">{{ storeNameById(item.storeId) }}</span>\r\n <span class=\"angle-badge\">Angle Changed</span>\r\n </div>\r\n <div class=\"sub mt-1\">{{ item.stream }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"time me-5\">{{ item.date }}</div>\r\n <button type=\"button\" class=\"angle-eye-btn\" title=\"Preview expected vs actual\"\r\n (click)=\"openAnglePreview(item, anglePreview)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\" stroke=\"#175CD3\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"#175CD3\" stroke-width=\"1.8\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <ng-template #normalLog>\r\n <div class=\"log-card mb-8\">\r\n <div class=\"d-flex me-10 w-75\">\r\n <div class=\"line me-4\"></div>\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"header me-4\">{{camelCaseToWords(item?.logSubType)}}</div>\r\n <div class=\"time\">{{formatDate(item?.date)}}</div>\r\n </div>\r\n <div class=\"sub\">{{arrayToString(item?.changes)}} <span *ngIf=\"item?.eventType\">{{item?.eventType + 'd'}}</span>\r\n </div>\r\n <div class=\"sub\">By {{item?.userName}} - {{item?.email}}</div>\r\n\r\n <div class=\"w-100\" *ngFor=\"let key of objectKeys(item?.updatedValue)\">\r\n <!-- <div class=\"header me-4\">{{camelCaseToWords(key)}}</div> -->\r\n <div class=\"sub w-75 tooltip-container\" container=\"body\"><b>{{ key }}</b> has been updated from <span class=\"red-badge\">{{\r\n (item?.updatedValue[key].previous ===\"\" || item?.updatedValue[key].previous ===null||\r\n item?.updatedValue[key].previous ===undefined)?\"null\":item?.updatedValue[key].previous}}</span> to\r\n <span\r\n class=\"green-badge\"> {{item?.updatedValue[key].current === \"\" || item?.updatedValue[key].current ===\r\n null ||item?.updatedValue[key].current === undefined?\"null\": item?.updatedValue[key].current }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chip text-end\">\r\n {{camelCaseToWords(item?.logType)}}\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <div *ngIf=\"logList?.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!logList?.length\">\r\n <div class=\"d-flex align-items-center justify-content-center\" >\r\n <img width=\"300px\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\"> \r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'loading'\" >\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n\n<!-- Angle-change preview modal: Expected vs Actual camera images. -->\n<ng-template #anglePreview let-modal>\n <div class=\"modal-header align-items-center\">\n <div class=\"d-flex align-items-center\">\n <span class=\"header me-3\">{{ previewItem?.stream }}</span>\n <span class=\"angle-badge\">Angle Changed</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"text-muted mb-4\">{{ storeNameById(previewItem?.storeId) }} \u00B7 {{ previewItem?.date }}</div>\n <div class=\"row\">\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.expected\" [src]=\"previewItem.expected\" alt=\"Expected camera angle\" />\n <div *ngIf=\"!previewItem?.expected\" class=\"angle-img-empty\">No expected image</div>\n </div>\n <div class=\"angle-img-label\">Expected</div>\n </div>\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.actual\" [src]=\"previewItem.actual\" alt=\"Actual camera angle\" />\n <div *ngIf=\"!previewItem?.actual\" class=\"angle-img-empty\">No actual image</div>\n </div>\n <div class=\"angle-img-label\">Actual</div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".activity-card{border-radius:8px;background:var(--White, #FFF);padding:24px}.log-card{display:flex;justify-content:space-between}.log-card .line{border-radius:2px;background:var(--Primary-600, #00A3FF);min-width:2px;height:100%}.log-card .header{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.log-card .time{color:var(--Gray-500, #667085);font-size:12px;font-weight:500;line-height:18px}.log-card .sub{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:24px}.log-card .chip{padding:2px 10px;border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);font-size:14px;font-weight:500;line-height:20px;height:100%;white-space:nowrap}.header{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.green-badge{color:#027a48;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#ecfdf3;padding:2px 8px}.tooltip-inner{max-width:800px!important;white-space:normal;word-wrap:break-word}.red-badge{color:#b42318;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#fef3f2;padding:2px 8px}.badge{background-color:#007bff;color:#fff;padding:4px 10px;border-radius:8px;font-weight:700;font-size:14px}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:400px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}.multi-select-dropdown{position:relative}.multi-select-dropdown .input-container{position:absolute;width:212px;right:0;z-index:1;margin-top:5px;background-color:#fff;min-height:200px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--White, #FFF);box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;display:flex;flex-direction:column;justify-content:space-between}.multi-select-dropdown .input-container ul{margin:0;padding:0}.multi-select-dropdown .input-container ul li{list-style:none;padding:10px 16px}.multi-select-dropdown .input-container .form-check{display:flex;align-items:center}.multi-select-dropdown .input-container .form-check-input{height:16px;width:16px;border-radius:4px;border:1px solid var(--Primary-600, #00A3FF)}.multi-select-dropdown .input-container .form-check-input:checked{--bs-form-check-bg-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB4SURBVHgBhY7NDUBQEIRnqcJNKXTg6qYTStCB+Isy6IQSNMDa9SLh5eWZZPcw+81kCX/quABhD73QyKXsGoyIvNCJSto2hEhNtY4N9cwYeMXEsVqB1GaSauRQOpty2tSmO3FgloAmF5nEhgyoesMO6CuFW66fn2xdFyA3ZzcRLrMAAAAASUVORK5CYII=);background-color:#eaf8ff;border-color:#00a3ff}.multi-select-dropdown .input-container .form-check-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.multi-select-dropdown .input-container .footer-seperator{border-top:1px solid #EAECF0}.multi-select-dropdown .input-container .btn-primary{padding:10px 16px!important;font-size:12px!important;font-weight:600!important}.multi-select-dropdown .input-container .btn-outline{padding:10px 16px;font-size:12px;font-weight:600}.tooltip-container{position:relative;display:inline-block}.angle-badge{display:inline-flex;align-items:center;gap:6px;padding:2px 10px;border-radius:12px;font-size:12px;font-weight:500;background:#fff4e5;color:#b54708;white-space:nowrap}.angle-badge:before{content:\"\";width:6px;height:6px;border-radius:50%;background:#f79009}.angle-eye-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer}.angle-eye-btn:hover{background:#eff8ff;border-color:#b2ddff}.angle-img-wrap{width:100%;aspect-ratio:16/9;background:#f2f4f7;border-radius:8px;overflow:hidden;display:flex;align-items:center;justify-content:center}.angle-img-wrap img{width:100%;height:100%;object-fit:contain}.angle-img-empty{color:#98a2b3;font-size:13px}.angle-img-label{text-align:center;margin-top:8px;font-weight:600;color:#344054}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i5.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "directive", type: i6.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
414
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ActivityLogsComponent, selector: "lib-activity-logs", host: { listeners: { "document:click": "onClick($event)" } }, ngImport: i0, template: "<div class=\"activity-card\">\r\n <ng-container *ngIf=\"pageState$ | async as pageState\" >\r\n <ng-container [ngSwitch]=\"pageState\" >\r\n <ng-container *ngSwitchCase=\"'loaded'\" >\r\n <div class=\"d-flex justify-content-between align-items-center mb-10\">\r\n <div class=\"header\">Activity Logs</div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"d-flex align-items-center position-relative me-5\">\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput ngxDaterangepickerMd\r\n [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\" [autoApply]=\"true\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" />\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- Searchable single-select store filter (self-contained;\r\n shows store name, sends storeId to the backend). -->\r\n <div class=\"store-filter position-relative me-5\">\r\n <button type=\"button\" (click)=\"toggleStoreDropdown($event)\"\r\n class=\"btn btn-default btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between align-items-center\"\r\n style=\"min-width: 180px;\">\r\n <span>{{ selectedStoreName ? selectedStoreName : 'All Stores' }}</span>\r\n <span class=\"d-flex align-items-center\">\r\n <svg *ngIf=\"selectedStoreName\" (click)=\"clearStore($event)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-1\">\r\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </button>\r\n <div *ngIf=\"storeDropdownOpen\" class=\"card py-1 position-absolute z-1 end-0\" style=\"min-width: 220px; max-height: 280px; overflow-y: auto; top: 44px;\">\r\n <div class=\"px-3 py-2\">\r\n <input type=\"text\" [value]=\"storeSearch\" (input)=\"onStoreSearch($event)\" (click)=\"$event.stopPropagation()\"\r\n placeholder=\"Search store\" class=\"form-control py-2\" />\r\n </div>\r\n <ul class=\"list-unstyled mb-0\">\r\n <li [ngClass]=\"!selectedStoreId ? 'active' : ''\" class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore({})\">All Stores</li>\r\n <li *ngFor=\"let s of filteredStoreOptions\" [ngClass]=\"selectedStoreId === s.storeId ? 'active' : ''\"\r\n class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore(s)\">{{ s.storeName }}</li>\r\n <li *ngIf=\"!filteredStoreOptions.length\" class=\"px-5 py-2 text-muted\">No stores found</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n\r\n </div>\r\n </div>\r\n \r\n <ng-container *ngIf=\"logList?.length\" >\r\n <ng-container *ngFor=\"let item of logList\">\r\n <div *ngIf=\"item?.type === 'angleChange'; else normalLog\"\r\n class=\"log-card mb-8 d-flex align-items-center justify-content-between\">\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"header me-3\">{{ storeNameById(item.storeId) }}</span>\r\n <span class=\"angle-badge\">Angle Changed</span>\r\n </div>\r\n <div class=\"sub mt-1\">{{ item.stream }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"time me-5\">{{ item.date }}</div>\r\n <button type=\"button\" class=\"angle-eye-btn\" title=\"Preview expected vs actual\"\r\n (click)=\"openAnglePreview(item, anglePreview)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\" stroke=\"#175CD3\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"#175CD3\" stroke-width=\"1.8\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <ng-template #normalLog>\r\n <div class=\"log-card mb-8\">\r\n <div class=\"d-flex me-10 w-75\">\r\n <div class=\"line me-4\"></div>\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"header me-4\">{{camelCaseToWords(item?.logSubType)}}</div>\r\n <div class=\"time\">{{formatDate(item?.date)}}</div>\r\n </div>\r\n <div class=\"sub\">{{arrayToString(item?.changes)}} <span *ngIf=\"item?.eventType\">{{item?.eventType + 'd'}}</span>\r\n </div>\r\n <!-- The \" - email\" part renders only when it adds information: system writers\r\n (e.g. the report scheduler) fill both fields with the same actor name,\r\n which read as \"By report-scheduler - report-scheduler\" (QA 2026-09-01). -->\r\n <div class=\"sub\">By {{item?.userName}}<span *ngIf=\"item?.email && item?.email !== item?.userName\"> - {{item?.email}}</span></div>\r\n\r\n <div class=\"w-100\" *ngFor=\"let key of objectKeys(item?.updatedValue)\">\r\n <!-- <div class=\"header me-4\">{{camelCaseToWords(key)}}</div> -->\r\n <div class=\"sub w-75 tooltip-container\" container=\"body\"><b>{{ key }}</b> has been updated from <span class=\"red-badge\">{{\r\n (item?.updatedValue[key].previous ===\"\" || item?.updatedValue[key].previous ===null||\r\n item?.updatedValue[key].previous ===undefined)?\"null\":item?.updatedValue[key].previous}}</span> to\r\n <span\r\n class=\"green-badge\"> {{item?.updatedValue[key].current === \"\" || item?.updatedValue[key].current ===\r\n null ||item?.updatedValue[key].current === undefined?\"null\": item?.updatedValue[key].current }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chip text-end\">\r\n {{camelCaseToWords(item?.logType)}}\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <div *ngIf=\"logList?.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!logList?.length\">\r\n <div class=\"d-flex align-items-center justify-content-center\" >\r\n <img width=\"300px\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\"> \r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'loading'\" >\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n\n<!-- Angle-change preview modal: Expected vs Actual camera images. -->\n<ng-template #anglePreview let-modal>\n <div class=\"modal-header align-items-center\">\n <div class=\"d-flex align-items-center\">\n <span class=\"header me-3\">{{ previewItem?.stream }}</span>\n <span class=\"angle-badge\">Angle Changed</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"text-muted mb-4\">{{ storeNameById(previewItem?.storeId) }} \u00B7 {{ previewItem?.date }}</div>\n <div class=\"row\">\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.expected\" [src]=\"previewItem.expected\" alt=\"Expected camera angle\" />\n <div *ngIf=\"!previewItem?.expected\" class=\"angle-img-empty\">No expected image</div>\n </div>\n <div class=\"angle-img-label\">Expected</div>\n </div>\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.actual\" [src]=\"previewItem.actual\" alt=\"Actual camera angle\" />\n <div *ngIf=\"!previewItem?.actual\" class=\"angle-img-empty\">No actual image</div>\n </div>\n <div class=\"angle-img-label\">Actual</div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".activity-card{border-radius:8px;background:var(--White, #FFF);padding:24px}.log-card{display:flex;justify-content:space-between}.log-card .line{border-radius:2px;background:var(--Primary-600, #00A3FF);min-width:2px;height:100%}.log-card .header{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.log-card .time{color:var(--Gray-500, #667085);font-size:12px;font-weight:500;line-height:18px}.log-card .sub{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:24px}.log-card .chip{padding:2px 10px;border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);font-size:14px;font-weight:500;line-height:20px;height:100%;white-space:nowrap}.header{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.green-badge{color:#027a48;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#ecfdf3;padding:2px 8px}.tooltip-inner{max-width:800px!important;white-space:normal;word-wrap:break-word}.red-badge{color:#b42318;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#fef3f2;padding:2px 8px}.badge{background-color:#007bff;color:#fff;padding:4px 10px;border-radius:8px;font-weight:700;font-size:14px}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:400px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}.multi-select-dropdown{position:relative}.multi-select-dropdown .input-container{position:absolute;width:212px;right:0;z-index:1;margin-top:5px;background-color:#fff;min-height:200px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--White, #FFF);box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;display:flex;flex-direction:column;justify-content:space-between}.multi-select-dropdown .input-container ul{margin:0;padding:0}.multi-select-dropdown .input-container ul li{list-style:none;padding:10px 16px}.multi-select-dropdown .input-container .form-check{display:flex;align-items:center}.multi-select-dropdown .input-container .form-check-input{height:16px;width:16px;border-radius:4px;border:1px solid var(--Primary-600, #00A3FF)}.multi-select-dropdown .input-container .form-check-input:checked{--bs-form-check-bg-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB4SURBVHgBhY7NDUBQEIRnqcJNKXTg6qYTStCB+Isy6IQSNMDa9SLh5eWZZPcw+81kCX/quABhD73QyKXsGoyIvNCJSto2hEhNtY4N9cwYeMXEsVqB1GaSauRQOpty2tSmO3FgloAmF5nEhgyoesMO6CuFW66fn2xdFyA3ZzcRLrMAAAAASUVORK5CYII=);background-color:#eaf8ff;border-color:#00a3ff}.multi-select-dropdown .input-container .form-check-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.multi-select-dropdown .input-container .footer-seperator{border-top:1px solid #EAECF0}.multi-select-dropdown .input-container .btn-primary{padding:10px 16px!important;font-size:12px!important;font-weight:600!important}.multi-select-dropdown .input-container .btn-outline{padding:10px 16px;font-size:12px;font-weight:600}.tooltip-container{position:relative;display:inline-block}.angle-badge{display:inline-flex;align-items:center;gap:6px;padding:2px 10px;border-radius:12px;font-size:12px;font-weight:500;background:#fff4e5;color:#b54708;white-space:nowrap}.angle-badge:before{content:\"\";width:6px;height:6px;border-radius:50%;background:#f79009}.angle-eye-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer}.angle-eye-btn:hover{background:#eff8ff;border-color:#b2ddff}.angle-img-wrap{width:100%;aspect-ratio:16/9;background:#f2f4f7;border-radius:8px;overflow:hidden;display:flex;align-items:center;justify-content:center}.angle-img-wrap img{width:100%;height:100%;object-fit:contain}.angle-img-empty{color:#98a2b3;font-size:13px}.angle-img-label{text-align:center;margin-top:8px;font-weight:600;color:#344054}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i5.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "directive", type: i6.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
415
415
  }
416
416
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActivityLogsComponent, decorators: [{
417
417
  type: Component,
418
- args: [{ selector: 'lib-activity-logs', template: "<div class=\"activity-card\">\r\n <ng-container *ngIf=\"pageState$ | async as pageState\" >\r\n <ng-container [ngSwitch]=\"pageState\" >\r\n <ng-container *ngSwitchCase=\"'loaded'\" >\r\n <div class=\"d-flex justify-content-between align-items-center mb-10\">\r\n <div class=\"header\">Activity Logs</div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"d-flex align-items-center position-relative me-5\">\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput ngxDaterangepickerMd\r\n [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\" [autoApply]=\"true\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" />\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- Searchable single-select store filter (self-contained;\r\n shows store name, sends storeId to the backend). -->\r\n <div class=\"store-filter position-relative me-5\">\r\n <button type=\"button\" (click)=\"toggleStoreDropdown($event)\"\r\n class=\"btn btn-default btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between align-items-center\"\r\n style=\"min-width: 180px;\">\r\n <span>{{ selectedStoreName ? selectedStoreName : 'All Stores' }}</span>\r\n <span class=\"d-flex align-items-center\">\r\n <svg *ngIf=\"selectedStoreName\" (click)=\"clearStore($event)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-1\">\r\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </button>\r\n <div *ngIf=\"storeDropdownOpen\" class=\"card py-1 position-absolute z-1 end-0\" style=\"min-width: 220px; max-height: 280px; overflow-y: auto; top: 44px;\">\r\n <div class=\"px-3 py-2\">\r\n <input type=\"text\" [value]=\"storeSearch\" (input)=\"onStoreSearch($event)\" (click)=\"$event.stopPropagation()\"\r\n placeholder=\"Search store\" class=\"form-control py-2\" />\r\n </div>\r\n <ul class=\"list-unstyled mb-0\">\r\n <li [ngClass]=\"!selectedStoreId ? 'active' : ''\" class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore({})\">All Stores</li>\r\n <li *ngFor=\"let s of filteredStoreOptions\" [ngClass]=\"selectedStoreId === s.storeId ? 'active' : ''\"\r\n class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore(s)\">{{ s.storeName }}</li>\r\n <li *ngIf=\"!filteredStoreOptions.length\" class=\"px-5 py-2 text-muted\">No stores found</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n\r\n </div>\r\n </div>\r\n \r\n <ng-container *ngIf=\"logList?.length\" >\r\n <ng-container *ngFor=\"let item of logList\">\r\n <div *ngIf=\"item?.type === 'angleChange'; else normalLog\"\r\n class=\"log-card mb-8 d-flex align-items-center justify-content-between\">\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"header me-3\">{{ storeNameById(item.storeId) }}</span>\r\n <span class=\"angle-badge\">Angle Changed</span>\r\n </div>\r\n <div class=\"sub mt-1\">{{ item.stream }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"time me-5\">{{ item.date }}</div>\r\n <button type=\"button\" class=\"angle-eye-btn\" title=\"Preview expected vs actual\"\r\n (click)=\"openAnglePreview(item, anglePreview)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\" stroke=\"#175CD3\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"#175CD3\" stroke-width=\"1.8\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <ng-template #normalLog>\r\n <div class=\"log-card mb-8\">\r\n <div class=\"d-flex me-10 w-75\">\r\n <div class=\"line me-4\"></div>\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"header me-4\">{{camelCaseToWords(item?.logSubType)}}</div>\r\n <div class=\"time\">{{formatDate(item?.date)}}</div>\r\n </div>\r\n <div class=\"sub\">{{arrayToString(item?.changes)}} <span *ngIf=\"item?.eventType\">{{item?.eventType + 'd'}}</span>\r\n </div>\r\n <div class=\"sub\">By {{item?.userName}} - {{item?.email}}</div>\r\n\r\n <div class=\"w-100\" *ngFor=\"let key of objectKeys(item?.updatedValue)\">\r\n <!-- <div class=\"header me-4\">{{camelCaseToWords(key)}}</div> -->\r\n <div class=\"sub w-75 tooltip-container\" container=\"body\"><b>{{ key }}</b> has been updated from <span class=\"red-badge\">{{\r\n (item?.updatedValue[key].previous ===\"\" || item?.updatedValue[key].previous ===null||\r\n item?.updatedValue[key].previous ===undefined)?\"null\":item?.updatedValue[key].previous}}</span> to\r\n <span\r\n class=\"green-badge\"> {{item?.updatedValue[key].current === \"\" || item?.updatedValue[key].current ===\r\n null ||item?.updatedValue[key].current === undefined?\"null\": item?.updatedValue[key].current }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chip text-end\">\r\n {{camelCaseToWords(item?.logType)}}\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <div *ngIf=\"logList?.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!logList?.length\">\r\n <div class=\"d-flex align-items-center justify-content-center\" >\r\n <img width=\"300px\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\"> \r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'loading'\" >\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n\n<!-- Angle-change preview modal: Expected vs Actual camera images. -->\n<ng-template #anglePreview let-modal>\n <div class=\"modal-header align-items-center\">\n <div class=\"d-flex align-items-center\">\n <span class=\"header me-3\">{{ previewItem?.stream }}</span>\n <span class=\"angle-badge\">Angle Changed</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"text-muted mb-4\">{{ storeNameById(previewItem?.storeId) }} \u00B7 {{ previewItem?.date }}</div>\n <div class=\"row\">\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.expected\" [src]=\"previewItem.expected\" alt=\"Expected camera angle\" />\n <div *ngIf=\"!previewItem?.expected\" class=\"angle-img-empty\">No expected image</div>\n </div>\n <div class=\"angle-img-label\">Expected</div>\n </div>\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.actual\" [src]=\"previewItem.actual\" alt=\"Actual camera angle\" />\n <div *ngIf=\"!previewItem?.actual\" class=\"angle-img-empty\">No actual image</div>\n </div>\n <div class=\"angle-img-label\">Actual</div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".activity-card{border-radius:8px;background:var(--White, #FFF);padding:24px}.log-card{display:flex;justify-content:space-between}.log-card .line{border-radius:2px;background:var(--Primary-600, #00A3FF);min-width:2px;height:100%}.log-card .header{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.log-card .time{color:var(--Gray-500, #667085);font-size:12px;font-weight:500;line-height:18px}.log-card .sub{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:24px}.log-card .chip{padding:2px 10px;border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);font-size:14px;font-weight:500;line-height:20px;height:100%;white-space:nowrap}.header{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.green-badge{color:#027a48;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#ecfdf3;padding:2px 8px}.tooltip-inner{max-width:800px!important;white-space:normal;word-wrap:break-word}.red-badge{color:#b42318;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#fef3f2;padding:2px 8px}.badge{background-color:#007bff;color:#fff;padding:4px 10px;border-radius:8px;font-weight:700;font-size:14px}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:400px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}.multi-select-dropdown{position:relative}.multi-select-dropdown .input-container{position:absolute;width:212px;right:0;z-index:1;margin-top:5px;background-color:#fff;min-height:200px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--White, #FFF);box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;display:flex;flex-direction:column;justify-content:space-between}.multi-select-dropdown .input-container ul{margin:0;padding:0}.multi-select-dropdown .input-container ul li{list-style:none;padding:10px 16px}.multi-select-dropdown .input-container .form-check{display:flex;align-items:center}.multi-select-dropdown .input-container .form-check-input{height:16px;width:16px;border-radius:4px;border:1px solid var(--Primary-600, #00A3FF)}.multi-select-dropdown .input-container .form-check-input:checked{--bs-form-check-bg-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB4SURBVHgBhY7NDUBQEIRnqcJNKXTg6qYTStCB+Isy6IQSNMDa9SLh5eWZZPcw+81kCX/quABhD73QyKXsGoyIvNCJSto2hEhNtY4N9cwYeMXEsVqB1GaSauRQOpty2tSmO3FgloAmF5nEhgyoesMO6CuFW66fn2xdFyA3ZzcRLrMAAAAASUVORK5CYII=);background-color:#eaf8ff;border-color:#00a3ff}.multi-select-dropdown .input-container .form-check-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.multi-select-dropdown .input-container .footer-seperator{border-top:1px solid #EAECF0}.multi-select-dropdown .input-container .btn-primary{padding:10px 16px!important;font-size:12px!important;font-weight:600!important}.multi-select-dropdown .input-container .btn-outline{padding:10px 16px;font-size:12px;font-weight:600}.tooltip-container{position:relative;display:inline-block}.angle-badge{display:inline-flex;align-items:center;gap:6px;padding:2px 10px;border-radius:12px;font-size:12px;font-weight:500;background:#fff4e5;color:#b54708;white-space:nowrap}.angle-badge:before{content:\"\";width:6px;height:6px;border-radius:50%;background:#f79009}.angle-eye-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer}.angle-eye-btn:hover{background:#eff8ff;border-color:#b2ddff}.angle-img-wrap{width:100%;aspect-ratio:16/9;background:#f2f4f7;border-radius:8px;overflow:hidden;display:flex;align-items:center;justify-content:center}.angle-img-wrap img{width:100%;height:100%;object-fit:contain}.angle-img-empty{color:#98a2b3;font-size:13px}.angle-img-label{text-align:center;margin-top:8px;font-weight:600;color:#344054}\n"] }]
418
+ args: [{ selector: 'lib-activity-logs', template: "<div class=\"activity-card\">\r\n <ng-container *ngIf=\"pageState$ | async as pageState\" >\r\n <ng-container [ngSwitch]=\"pageState\" >\r\n <ng-container *ngSwitchCase=\"'loaded'\" >\r\n <div class=\"d-flex justify-content-between align-items-center mb-10\">\r\n <div class=\"header\">Activity Logs</div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"d-flex align-items-center position-relative me-5\">\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput ngxDaterangepickerMd\r\n [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\" [autoApply]=\"true\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" />\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- Searchable single-select store filter (self-contained;\r\n shows store name, sends storeId to the backend). -->\r\n <div class=\"store-filter position-relative me-5\">\r\n <button type=\"button\" (click)=\"toggleStoreDropdown($event)\"\r\n class=\"btn btn-default btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between align-items-center\"\r\n style=\"min-width: 180px;\">\r\n <span>{{ selectedStoreName ? selectedStoreName : 'All Stores' }}</span>\r\n <span class=\"d-flex align-items-center\">\r\n <svg *ngIf=\"selectedStoreName\" (click)=\"clearStore($event)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-1\">\r\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </button>\r\n <div *ngIf=\"storeDropdownOpen\" class=\"card py-1 position-absolute z-1 end-0\" style=\"min-width: 220px; max-height: 280px; overflow-y: auto; top: 44px;\">\r\n <div class=\"px-3 py-2\">\r\n <input type=\"text\" [value]=\"storeSearch\" (input)=\"onStoreSearch($event)\" (click)=\"$event.stopPropagation()\"\r\n placeholder=\"Search store\" class=\"form-control py-2\" />\r\n </div>\r\n <ul class=\"list-unstyled mb-0\">\r\n <li [ngClass]=\"!selectedStoreId ? 'active' : ''\" class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore({})\">All Stores</li>\r\n <li *ngFor=\"let s of filteredStoreOptions\" [ngClass]=\"selectedStoreId === s.storeId ? 'active' : ''\"\r\n class=\"px-5 fw-semibold cursor-pointer py-2\" (click)=\"selectStore(s)\">{{ s.storeName }}</li>\r\n <li *ngIf=\"!filteredStoreOptions.length\" class=\"px-5 py-2 text-muted\">No stores found</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n\r\n </div>\r\n </div>\r\n \r\n <ng-container *ngIf=\"logList?.length\" >\r\n <ng-container *ngFor=\"let item of logList\">\r\n <div *ngIf=\"item?.type === 'angleChange'; else normalLog\"\r\n class=\"log-card mb-8 d-flex align-items-center justify-content-between\">\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"header me-3\">{{ storeNameById(item.storeId) }}</span>\r\n <span class=\"angle-badge\">Angle Changed</span>\r\n </div>\r\n <div class=\"sub mt-1\">{{ item.stream }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"time me-5\">{{ item.date }}</div>\r\n <button type=\"button\" class=\"angle-eye-btn\" title=\"Preview expected vs actual\"\r\n (click)=\"openAnglePreview(item, anglePreview)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\" stroke=\"#175CD3\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"#175CD3\" stroke-width=\"1.8\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <ng-template #normalLog>\r\n <div class=\"log-card mb-8\">\r\n <div class=\"d-flex me-10 w-75\">\r\n <div class=\"line me-4\"></div>\r\n <div class=\"d-flex flex-column\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"header me-4\">{{camelCaseToWords(item?.logSubType)}}</div>\r\n <div class=\"time\">{{formatDate(item?.date)}}</div>\r\n </div>\r\n <div class=\"sub\">{{arrayToString(item?.changes)}} <span *ngIf=\"item?.eventType\">{{item?.eventType + 'd'}}</span>\r\n </div>\r\n <!-- The \" - email\" part renders only when it adds information: system writers\r\n (e.g. the report scheduler) fill both fields with the same actor name,\r\n which read as \"By report-scheduler - report-scheduler\" (QA 2026-09-01). -->\r\n <div class=\"sub\">By {{item?.userName}}<span *ngIf=\"item?.email && item?.email !== item?.userName\"> - {{item?.email}}</span></div>\r\n\r\n <div class=\"w-100\" *ngFor=\"let key of objectKeys(item?.updatedValue)\">\r\n <!-- <div class=\"header me-4\">{{camelCaseToWords(key)}}</div> -->\r\n <div class=\"sub w-75 tooltip-container\" container=\"body\"><b>{{ key }}</b> has been updated from <span class=\"red-badge\">{{\r\n (item?.updatedValue[key].previous ===\"\" || item?.updatedValue[key].previous ===null||\r\n item?.updatedValue[key].previous ===undefined)?\"null\":item?.updatedValue[key].previous}}</span> to\r\n <span\r\n class=\"green-badge\"> {{item?.updatedValue[key].current === \"\" || item?.updatedValue[key].current ===\r\n null ||item?.updatedValue[key].current === undefined?\"null\": item?.updatedValue[key].current }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chip text-end\">\r\n {{camelCaseToWords(item?.logType)}}\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <div *ngIf=\"logList?.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!logList?.length\">\r\n <div class=\"d-flex align-items-center justify-content-center\" >\r\n <img width=\"300px\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\"> \r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'loading'\" >\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n\n<!-- Angle-change preview modal: Expected vs Actual camera images. -->\n<ng-template #anglePreview let-modal>\n <div class=\"modal-header align-items-center\">\n <div class=\"d-flex align-items-center\">\n <span class=\"header me-3\">{{ previewItem?.stream }}</span>\n <span class=\"angle-badge\">Angle Changed</span>\n </div>\n <button type=\"button\" class=\"btn-close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"text-muted mb-4\">{{ storeNameById(previewItem?.storeId) }} \u00B7 {{ previewItem?.date }}</div>\n <div class=\"row\">\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.expected\" [src]=\"previewItem.expected\" alt=\"Expected camera angle\" />\n <div *ngIf=\"!previewItem?.expected\" class=\"angle-img-empty\">No expected image</div>\n </div>\n <div class=\"angle-img-label\">Expected</div>\n </div>\n <div class=\"col-md-6 mb-4\">\n <div class=\"angle-img-wrap\">\n <img *ngIf=\"previewItem?.actual\" [src]=\"previewItem.actual\" alt=\"Actual camera angle\" />\n <div *ngIf=\"!previewItem?.actual\" class=\"angle-img-empty\">No actual image</div>\n </div>\n <div class=\"angle-img-label\">Actual</div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".activity-card{border-radius:8px;background:var(--White, #FFF);padding:24px}.log-card{display:flex;justify-content:space-between}.log-card .line{border-radius:2px;background:var(--Primary-600, #00A3FF);min-width:2px;height:100%}.log-card .header{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.log-card .time{color:var(--Gray-500, #667085);font-size:12px;font-weight:500;line-height:18px}.log-card .sub{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:24px}.log-card .chip{padding:2px 10px;border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);font-size:14px;font-weight:500;line-height:20px;height:100%;white-space:nowrap}.header{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.green-badge{color:#027a48;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#ecfdf3;padding:2px 8px}.tooltip-inner{max-width:800px!important;white-space:normal;word-wrap:break-word}.red-badge{color:#b42318;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#fef3f2;padding:2px 8px}.badge{background-color:#007bff;color:#fff;padding:4px 10px;border-radius:8px;font-weight:700;font-size:14px}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:400px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}.multi-select-dropdown{position:relative}.multi-select-dropdown .input-container{position:absolute;width:212px;right:0;z-index:1;margin-top:5px;background-color:#fff;min-height:200px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--White, #FFF);box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;display:flex;flex-direction:column;justify-content:space-between}.multi-select-dropdown .input-container ul{margin:0;padding:0}.multi-select-dropdown .input-container ul li{list-style:none;padding:10px 16px}.multi-select-dropdown .input-container .form-check{display:flex;align-items:center}.multi-select-dropdown .input-container .form-check-input{height:16px;width:16px;border-radius:4px;border:1px solid var(--Primary-600, #00A3FF)}.multi-select-dropdown .input-container .form-check-input:checked{--bs-form-check-bg-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB4SURBVHgBhY7NDUBQEIRnqcJNKXTg6qYTStCB+Isy6IQSNMDa9SLh5eWZZPcw+81kCX/quABhD73QyKXsGoyIvNCJSto2hEhNtY4N9cwYeMXEsVqB1GaSauRQOpty2tSmO3FgloAmF5nEhgyoesMO6CuFW66fn2xdFyA3ZzcRLrMAAAAASUVORK5CYII=);background-color:#eaf8ff;border-color:#00a3ff}.multi-select-dropdown .input-container .form-check-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.multi-select-dropdown .input-container .footer-seperator{border-top:1px solid #EAECF0}.multi-select-dropdown .input-container .btn-primary{padding:10px 16px!important;font-size:12px!important;font-weight:600!important}.multi-select-dropdown .input-container .btn-outline{padding:10px 16px;font-size:12px;font-weight:600}.tooltip-container{position:relative;display:inline-block}.angle-badge{display:inline-flex;align-items:center;gap:6px;padding:2px 10px;border-radius:12px;font-size:12px;font-weight:500;background:#fff4e5;color:#b54708;white-space:nowrap}.angle-badge:before{content:\"\";width:6px;height:6px;border-radius:50%;background:#f79009}.angle-eye-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer}.angle-eye-btn:hover{background:#eff8ff;border-color:#b2ddff}.angle-img-wrap{width:100%;aspect-ratio:16/9;background:#f2f4f7;border-radius:8px;overflow:hidden;display:flex;align-items:center;justify-content:center}.angle-img-wrap img{width:100%;height:100%;object-fit:contain}.angle-img-empty{color:#98a2b3;font-size:13px}.angle-img-label{text-align:center;margin-top:8px;font-weight:600;color:#344054}\n"] }]
419
419
  }], ctorParameters: () => [{ type: i1.ClientApiService }, { type: i0.ChangeDetectorRef }, { type: i2.NgbModal }], propDecorators: { onClick: [{
420
420
  type: HostListener,
421
421
  args: ['document:click', ['$event']]
422
422
  }] } });
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2FjdGl2aXR5LWxvZ3MvYWN0aXZpdHktbG9ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2FjdGl2aXR5LWxvZ3MvYWN0aXZpdHktbG9ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQXFDLE1BQU0sZUFBZSxDQUFDO0FBRzlHLE9BQVEsS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMzQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDO0FBQ25DLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBQzNDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQU92QixNQUFNLE9BQU8scUJBQXFCO0lBdU1aO0lBQXNDO0lBQStCO0lBck16RixLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ2IsY0FBYyxDQUFNO0lBQ3BCLDhFQUE4RTtJQUM5RSx3RUFBd0U7SUFDeEUsWUFBWSxHQUFVLEVBQUUsQ0FBQyxDQUFVLHNDQUFzQztJQUN6RSxvQkFBb0IsR0FBVSxFQUFFLENBQUMsQ0FBRSx1QkFBdUI7SUFDMUQsV0FBVyxHQUFXLEVBQUUsQ0FB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WSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxhQUFhLEVBQUU7b0JBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDakU7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFDcEIsSUFBSSxPQUFPLEdBQXdCO1lBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGNBQWMsRUFBRyxJQUFJLENBQUMsY0FBYztTQUNyQyxDQUFBO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFBO1NBQzNFO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFBO1NBQ3ZFO1FBRUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzFCLENBQUM7d0dBaGFZLHFCQUFxQjs0RkFBckIscUJBQXFCLHVIQ2pCbEMseTdaQXdMQTs7NEZEdkthLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7NElBaUI3QixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCAgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBcImRheWpzL2xvY2FsZS9lblwiO1xyXG5pbXBvcnQgdXRjIGZyb20gXCJkYXlqcy9wbHVnaW4vdXRjXCI7XHJcbmltcG9ydCB0aW1lem9uZSBmcm9tIFwiZGF5anMvcGx1Z2luL3RpbWV6b25lXCI7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuZGF5anMuZXh0ZW5kKHV0Yyk7XHJcbmRheWpzLmV4dGVuZCh0aW1lem9uZSk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hY3Rpdml0eS1sb2dzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWN0aXZpdHktbG9ncy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FjdGl2aXR5LWxvZ3MuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUxvZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBkYXlqcyA9IGRheWpzXHJcbiAgZmlsdGVyQnlTdGF0dXM6IGFueTtcclxuICAvLyAtLS0tLSBTZWxmLWNvbnRhaW5lZCBzdG9yZSBmaWx0ZXIgKHNlYXJjaGFibGUgc2luZ2xlLXNlbGVjdCkuIEtlcHQgbG9jYWwgdG9cclxuICAvLyB0aGlzIGNvbXBvbmVudCBzbyBpdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHNoYXJlZCBsaWItZmlsdGVycy4gLS0tLS1cclxuICBzdG9yZU9wdGlvbnM6IGFueVtdID0gW107ICAgICAgICAgIC8vIGZ1bGwgbGlzdDogW3sgc3RvcmVJZCwgc3RvcmVOYW1lIH1dXHJcbiAgZmlsdGVyZWRTdG9yZU9wdGlvbnM6IGFueVtdID0gW107ICAvLyBzZWFyY2gtZmlsdGVyZWQgdmlld1xyXG4gIHN0b3JlU2VhcmNoOiBzdHJpbmcgPSAnJztcclxuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkU3RvcmVOYW1lOiBzdHJpbmcgPSAnJztcclxuICBzdG9yZURyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXRhcmdldC5jbG9zZXN0KCcuZHJvcGRvd24nKSkge1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXJzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDbG9zZSB0aGUgc3RvcmUgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlIGl0LlxyXG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLnN0b3JlLWZpbHRlcicpKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlRHJvcGRvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zdG9yZURyb3Bkb3duT3BlbiA9ICF0aGlzLnN0b3JlRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgb25TdG9yZVNlYXJjaChldmVudDogYW55KSB7XHJcbiAgICBjb25zdCB0ZXJtID0gKGV2ZW50Py50YXJnZXQ/LnZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICB0aGlzLnN0b3JlU2VhcmNoID0gdGVybTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZU9wdGlvbnMgPSB0ZXJtXHJcbiAgICAgID8gdGhpcy5zdG9yZU9wdGlvbnMuZmlsdGVyKChzKSA9PiBuZXcgUmVnRXhwKHRlcm0sICdpJykudGVzdChzLnN0b3JlTmFtZSB8fCAnJykpXHJcbiAgICAgIDogdGhpcy5zdG9yZU9wdGlvbnMuc2xpY2UoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN0b3JlKHN0b3JlOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gc3RvcmU/LnN0b3JlSWQgfHwgJyc7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVOYW1lID0gc3RvcmU/LnN0b3JlTmFtZSB8fCAnJztcclxuICAgIHRoaXMuc3RvcmVEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyU3RvcmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlSWQgPSAnJztcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZU5hbWUgPSAnJztcclxuICAgIHRoaXMuc3RvcmVTZWFyY2ggPSAnJztcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZU9wdGlvbnMgPSB0aGlzLnN0b3JlT3B0aW9ucy5zbGljZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLmdldEFjdGl2aXR5TG9ncygpO1xyXG4gIH1cclxuXHJcbiAgaXRlbXNQZXJQYWdlID0gMTBcclxuICBjdXJyZW50UGFnZSA9IDFcclxuICB0b3RhbEl0ZW1zID0gMFxyXG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXVxyXG4gIHBhZ2VTaXplID0gMTBcclxuICBzZWxlY3RlZERhdGVSYW5nZTogYW55ID0ge1xyXG4gICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKCkuc3VidHJhY3QoMzAsIFwiZGF5c1wiKSxcclxuICAgIGVuZERhdGU6IHRoaXMuZGF5anMoKVxyXG4gIH07XHJcbiAgY2xpZW50TGlzdDogYW55ID0gW11cclxuICBzZWxlY3RlZENsaWVudDogYW55XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBsb2dMaXN0OiBhbnk7XHJcbiAgZmlsdGVyU3RhcnREYXRlOiBzdHJpbmcgPSB0aGlzLmRheWpzKCkuc3VidHJhY3QoMzAsIFwiZGF5c1wiKS50b0lTT1N0cmluZygpXHJcbiAgZmlsdGVyRW5kRGF0ZTogc3RyaW5nID10aGlzLmRheWpzKCkuc3VidHJhY3QoMCwgXCJkYXlzXCIpLnRvSVNPU3RyaW5nKClcclxuICBzaG93RmlsdGVyczpib29sZWFuID0gZmFsc2VcclxuICBwYWdlU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnbG9hZGVkJyB8ICdsb2FkaW5nJz4oJ2xvYWRpbmcnKTtcclxuICBmaWx0ZXJzID0gW1xyXG4gICAge1xyXG4gICAgICBsYWJlbDonQnJhbmQgZGV0YWlscycsXHJcbiAgICAgIGlkOidicmFuZERldGFpbHMnLFxyXG4gICAgICBpc0NoZWNrZWQ6dHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6J0NvbmZpZ3VyYXRpb24nLFxyXG4gICAgICBpZDonY29uZmlndXJhdGlvbicsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonRG9jdW1lbnRzJyxcclxuICAgICAgaWQ6J2RvY3VtZW50cycsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonU3RvcmVzJyxcclxuICAgICAgaWQ6J3N0b3JlcycsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LCAgIFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonQ2x1c3RlcnMnLFxyXG4gICAgICBpZDonY2x1c3RlcicsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonVGVhbXMnLFxyXG4gICAgICBpZDondGVhbXMnLFxyXG4gICAgICBpc0NoZWNrZWQ6dHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6J1N1YnNjcmlwdGlvbicsXHJcbiAgICAgIGlkOidzdWJzY3JpcHRpb24nLFxyXG4gICAgICBpc0NoZWNrZWQ6dHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6J0ludm9pY2UnLFxyXG4gICAgICBpZDonaW52b2ljZScsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonQmlsbGluZycsXHJcbiAgICAgIGlkOidiaWxsaW5nJyxcclxuICAgICAgaXNDaGVja2VkOnRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0NhbWVyYScsXHJcbiAgICAgIGlkOidjYW1lcmFzJyxcclxuICAgICAgaXNDaGVja2VkOnRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J1pvbmUnLFxyXG4gICAgICBpZDonem9uZScsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gIF1cclxuICBkYXRhT2JqZWN0OiBhbnkgPSBbXHJcbiAgICB7IERlc2NyaXB0aW9uOiAnU3RhdHVzIExvZ3MnLCBJc3N1ZXM6W3tcclxuICAgICAgdGV4dDonQnJhbmQgZGV0YWlscycsXHJcbiAgICAgIGlkOidicmFuZERldGFpbHMnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDonQ29uZmlndXJhdGlvbicsXHJcbiAgICAgIGlkOidjb25maWd1cmF0aW9uJyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0RvY3VtZW50cycsXHJcbiAgICAgIGlkOidkb2N1bWVudHMnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDonU3RvcmVzJyxcclxuICAgICAgaWQ6J3N0b3JlcycsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OidDYW1lcmEnLFxyXG4gICAgICBpZDonY2FtZXJhcycsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OidDbHVzdGVycycsXHJcbiAgICAgIGlkOidjbHVzdGVyJyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J1VzZXJzJyxcclxuICAgICAgaWQ6J3VzZXJzJywgXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OidUZWFtcycsXHJcbiAgICAgIGlkOid0ZWFtcycsIFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDonU3Vic2NyaXB0aW9uJyxcclxuICAgICAgaWQ6J3N1YnNjcmlwdGlvbidcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0ludm9pY2UnLFxyXG4gICAgICBpZDonaW52b2ljZSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0JpbGxpbmcnLFxyXG4gICAgICBpZDonYmlsbGluZydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J1pvbmUnLFxyXG4gICAgICBpZDonem9uZSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIC8vIEN1c3RvbSByZXBvcnQgY3JlYXRlL3VwZGF0ZS9zY2hlZHVsZS9kZWxldGUgZW50cmllcyAobG9nVHlwZSAncmVwb3J0JyxcclxuICAgICAgLy8gd3JpdHRlbiBieSByZXRhaWwtYW5hbHlzaXMtcmVwb3J0LWFwaS12MydzIGN1c3RvbVJlcG9ydEFjdGl2aXR5TG9nKS5cclxuICAgICAgdGV4dDonUmVwb3J0JyxcclxuICAgICAgaWQ6J3JlcG9ydCdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0FuZ2xlIENoYW5nZScsXHJcbiAgICAgIGlkOidhbmdsZUNoYW5nZSdcclxuICAgIH0sXHJcbiAgXX1cclxuICBdXHJcbiAgLy8gQW5nbGUtY2hhbmdlIGltYWdlIHByZXZpZXcgKG9wZW5lZCBmcm9tIHRoZSBleWUgaWNvbiBvbiBhbiBhbmdsZSByb3cpLlxyXG4gIHByZXZpZXdJdGVtOiBhbnkgPSBudWxsO1xyXG5cclxuICBvcGVuQW5nbGVQcmV2aWV3KGl0ZW06IGFueSwgdHBsOiBhbnkpIHtcclxuICAgIHRoaXMucHJldmlld0l0ZW0gPSBpdGVtO1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0cGwsIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaVNlcnZpY2U6IENsaWVudEFwaVNlcnZpY2UsIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwpIHtcclxuICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRJZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGVcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9ICcnXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlTmFtZSA9ICcnXHJcbiAgICAgICAgdGhpcy5zdG9yZVNlYXJjaCA9ICcnXHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzRm9yRmlsdGVyKClcclxuICAgICAgICB0aGlzLmdldEFjdGl2aXR5TG9ncygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBsb2FkU3RvcmVzRm9yRmlsdGVyKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldFN0b3JlTGlzdCh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXM/LmRhdGE/LnJlc3VsdCB8fCBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVPcHRpb25zID0gdGhpcy5zdG9yZU9wdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAvLyBTdG9yZSBsaXN0IHVuYXZhaWxhYmxlIOKGkiBlbXB0eSBvcHRpb25zOyBsb2dzIHN0aWxsIGxvYWQgdW5maWx0ZXJlZC5cclxuICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnBhZ2VTdGF0ZSQuY29tcGxldGUoKTtcclxuXHJcbiAgfVxyXG5cclxuICBzdG9yZU5hbWVCeUlkKHN0b3JlSWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzID0gKHRoaXMuc3RvcmVPcHRpb25zIHx8IFtdKS5maW5kKCh4OiBhbnkpID0+IHguc3RvcmVJZCA9PT0gc3RvcmVJZCk7XHJcbiAgICByZXR1cm4gcz8uc3RvcmVOYW1lIHx8IHN0b3JlSWQ7XHJcbiAgfVxyXG5cclxuICBnZXRBY3Rpdml0eUxvZ3MoKSB7XHJcbiAgICBjb25zdCBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4tVVMnKTtcclxuICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkaW5nJylcclxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgbG9nVHlwZUZpbHRlcnMgOiB0aGlzLmZpbHRlckJ5U3RhdHVzLFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmlsdGVyU3RhcnREYXRlKSB7XHJcbiAgICAgIGZpbHRlcnMuc3RhcnREYXRlID0gZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZmlsdGVyU3RhcnREYXRlLCAneXl5eS1NTS1kZCcpXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWx0ZXJFbmREYXRlKSB7XHJcbiAgICAgIGZpbHRlcnMuZW5kRGF0ZSA9IGRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmZpbHRlckVuZERhdGUsICd5eXl5LU1NLWRkJylcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVJZCkge1xyXG4gICAgICBmaWx0ZXJzLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkU3RvcmVJZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZih0aGlzLmdldENoZWNrZWRJZHModGhpcy5maWx0ZXJzKT8ubGVuZ3RoKXtcclxuICAgIC8vICAgZmlsdGVycy5sb2dUeXBlRmlsdGVycyA9IHRoaXMuZ2V0Q2hlY2tlZElkcyh0aGlzLmZpbHRlcnMpXHJcbiAgICAvLyB9XHJcblxyXG4gICAgY29uc3QgdHlwZXMgPSB0aGlzLmZpbHRlckJ5U3RhdHVzIHx8IFtdO1xyXG4gICAgY29uc3QgaXNBbmdsZUNoYW5nZSA9IEFycmF5LmlzQXJyYXkodHlwZXMpICYmIHR5cGVzLmluY2x1ZGVzKCdhbmdsZUNoYW5nZScpO1xyXG4gICAgaWYgKGlzQW5nbGVDaGFuZ2UpIHtcclxuICAgICAgY29uc3QgYW5nbGVQYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxyXG4gICAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZUlkKSB7IGFuZ2xlUGF5bG9hZFsnc3RvcmVJZCddID0gdGhpcy5zZWxlY3RlZFN0b3JlSWQ7IH1cclxuICAgICAgaWYgKHRoaXMuZmlsdGVyU3RhcnREYXRlKSB7IGFuZ2xlUGF5bG9hZFsnc3RhcnREYXRlJ10gPSBkYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5maWx0ZXJTdGFydERhdGUsICd5eXl5LU1NLWRkJyk7IH1cclxuICAgICAgaWYgKHRoaXMuZmlsdGVyRW5kRGF0ZSkgeyBhbmdsZVBheWxvYWRbJ2VuZERhdGUnXSA9IGRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmZpbHRlckVuZERhdGUsICd5eXl5LU1NLWRkJyk7IH1cclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFuZ2xlQ2hhbmdlTG9ncyhhbmdsZVBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkZWQnKTtcclxuICAgICAgICAgIHRoaXMubG9nTGlzdCA9IGU/LmRhdGE/LmRhdGEgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBlPy5kYXRhPy5jb3VudCB8fCAwO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYWdlU3RhdGUkLm5leHQoJ2xvYWRlZCcpO1xyXG4gICAgICAgICAgdGhpcy5sb2dMaXN0ID0gW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjsgLy8gc2VwYXJhdGUgbW9kZSDigJQgc2tpcCB0aGUgbm9ybWFsIGFjdGl2aXR5LWxvZyBjYWxsXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFjdGl2aXR5TG9ncyhmaWx0ZXJzKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIGlmIChlPy5kYXRhPy5jb3VudCkge1xyXG4gICAgICAgICAgdGhpcy5sb2dMaXN0ID0gZS5kYXRhLmRhdGFcclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IGUuZGF0YS5jb3VudFxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5sb2dMaXN0ID0gW11cclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDBcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIHRoaXMubG9nTGlzdCA9IFtdXHJcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMFxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZGF0ZWNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQuc3RhcnREYXRlIHx8IGV2ZW50LmVuZERhdGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDFcclxuICAgICAgdGhpcy5maWx0ZXJTdGFydERhdGUgPSB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSkudXRjKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICB0aGlzLmZpbHRlckVuZERhdGUgPSB0aGlzLmRheWpzKGV2ZW50LmVuZERhdGUpLnV0YygpLnRvSVNPU3RyaW5nKClcclxuICAgICAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHJhbmdlczogYW55ID0ge1xyXG4gICAgVG9kYXk6IFt0aGlzLmRheWpzKCksIHRoaXMuZGF5anMoKV0sXHJcbiAgICBZZXN0ZXJkYXk6IFt0aGlzLmRheWpzKCkuc3VidHJhY3QoMSwgXCJkYXlzXCIpLCB0aGlzLmRheWpzKCkuc3VidHJhY3QoMSwgXCJkYXlzXCIpXSxcclxuICAgIFwiVGhpcyBXZWVrXCI6IFt0aGlzLmRheWpzKCkuc3VidHJhY3QoNiwgXCJkYXlzXCIpLCB0aGlzLmRheWpzKCldLFxyXG4gICAgXCJMYXN0IFdlZWtcIjogW1xyXG4gICAgICB0aGlzLmRheWpzKCkuc3VidHJhY3QoMTMsIFwiZGF5c1wiKS5zdGFydE9mKFwiZGF5c1wiKSxcclxuICAgICAgdGhpcy5kYXlqcygpLnN1YnRyYWN0KDcsIFwiZGF5c1wiKS5lbmRPZihcImRheXNcIiksXHJcbiAgICBdLFxyXG4gICAgXCJUaGlzIE1vbnRoXCI6IFt0aGlzLmRheWpzKCkuc3VidHJhY3QoMzAsIFwiZGF5c1wiKSwgLy8gU3RhcnQgZGF0ZSBpcyAzMCBkYXlzIGJlZm9yZSB0b2RheVxyXG4gICAgICB0aGlzLmRheWpzKCldLCBcclxuICAgIFwiTGFzdCBNb250aFwiOiBbXHJcbiAgICAgIHRoaXMuZGF5anMoKS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnN0YXJ0T2YoXCJtb250aFwiKSxcclxuICAgICAgdGhpcy5kYXlqcygpLnN1YnRyYWN0KDEsIFwibW9udGhcIikuZW5kT2YoXCJtb250aFwiKSxcclxuICAgIF0sXHJcbiAgfTtcclxuXHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlT2Zmc2V0XHJcbiAgICB0aGlzLmdldEFjdGl2aXR5TG9ncygpXHJcblxyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7ICAgXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMSBcclxuICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZVxyXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBwYWdlU2l6ZVxyXG4gICAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShpbnB1dERhdGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMuZGF5anMoaW5wdXREYXRlKTtcclxuICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBwYXJzZWREYXRlLmZvcm1hdCgnREQtTU0tWVlZWSB8IGhoOm1tIEEnKTtcclxuICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xyXG4gIH1cclxuXHJcbiAgY2FtZWxDYXNlVG9Xb3JkcyhjYW1lbENhc2VTdHJpbmc6IHN0cmluZykge1xyXG4gICAgY29uc3Qgd29yZHMgPSBjYW1lbENhc2VTdHJpbmcucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJyk7XHJcbiAgICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXJyYXlUb1N0cmluZyhhcnJheTogYW55KSB7XHJcbiAgICByZXR1cm4gYXJyYXkuam9pbignLCAnKTtcclxuICB9XHJcbiAgb2JqZWN0S2V5cyhvYmo6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwID8gT2JqZWN0LmtleXMob2JqKSA6IFtdO1xyXG4gIH1cclxuICBcclxuXHJcbiAgY2hlY2tJZkFsbFNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5ldmVyeSgoaXRlbTphbnkpID0+IGl0ZW0uaXNDaGVja2VkKTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IGl0ZW0uaXNDaGVja2VkID0gc2VsZWN0QWxsKTtcclxuICB9XHJcblxyXG4gICBnZXRDaGVja2VkSWRzKGZpbHRlcnM6YW55KSB7XHJcbiAgICBjb25zdCBjaGVja2VkSWRzID0gZmlsdGVycy5maWx0ZXIoKGZpbHRlcjphbnkpID0+IGZpbHRlci5pc0NoZWNrZWQpLm1hcCgoZmlsdGVyOmFueSkgPT4gZmlsdGVyLmlkKTtcclxuICAgIHJldHVybiBjaGVja2VkSWRzO1xyXG59XHJcblxyXG5hcHBseUZpbHRlcigpe1xyXG4gIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgdGhpcy5zaG93RmlsdGVycyA9IGZhbHNlXHJcbiAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKTtcclxufVxyXG5hcHBseUZpbHRlcnMoZXZlbnQ6YW55KXtcclxuICBjb25zdCBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4tVVMnKTtcclxuICBpZiAoZXZlbnQ/Lmxlbmd0aCkge1xyXG4gICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSBcIlN0YXR1cyBMb2dzXCIpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJ5U3RhdHVzID0gZWxlbWVudC5Jc3N1ZXMubWFwKCh2YWw6IGFueSkgPT4gdmFsPy5pZCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XHJcbiAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgbG9nVHlwZUZpbHRlcnMgOiB0aGlzLmZpbHRlckJ5U3RhdHVzLFxyXG4gIH1cclxuICBpZiAodGhpcy5maWx0ZXJTdGFydERhdGUpIHtcclxuICAgIGZpbHRlcnMuc3RhcnREYXRlID0gZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZmlsdGVyU3RhcnREYXRlLCAneXl5eS1NTS1kZCcpXHJcbiAgfVxyXG4gIGlmICh0aGlzLmZpbHRlckVuZERhdGUpIHtcclxuICAgIGZpbHRlcnMuZW5kRGF0ZSA9IGRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmZpbHRlckVuZERhdGUsICd5eXl5LU1NLWRkJylcclxuICB9XHJcbiBcclxuICAgIHRoaXMuZ2V0QWN0aXZpdHlMb2dzKClcclxufVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhY3Rpdml0eS1jYXJkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnZVN0YXRlJCB8IGFzeW5jIGFzIHBhZ2VTdGF0ZVwiID5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwYWdlU3RhdGVcIiA+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb2FkZWQnXCIgICA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5BY3Rpdml0eSBMb2dzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbWUtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZngtZGF0ZS1yYW5nZSBmb3JtLWNvbnRyb2wgcHMtMTRcIiBzdHlsZT1cIm1pbi13aWR0aDogMjYwcHggIWltcG9ydGFudDtcIiB0eXBlPVwidGV4dFwiIG1hdElucHV0IG5neERhdGVyYW5nZXBpY2tlck1kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgW3Jhbmdlc109XCJyYW5nZXNcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIiBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZERhdGVSYW5nZVwiIFthdXRvQXBwbHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJkYXRlY2hhbmdlKCRldmVudClcIiBuYW1lPVwiZGF0ZXJhbmdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjMzMzMgMS42NjY2M1Y0Ljk5OTk2TTYuNjY2NjcgMS42NjY2M1Y0Ljk5OTk2TTIuNSA4LjMzMzI5SDE3LjVNNC4xNjY2NyAzLjMzMzI5SDE1LjgzMzNDMTYuNzUzOCAzLjMzMzI5IDE3LjUgNC4wNzk0OCAxNy41IDQuOTk5OTZWMTYuNjY2NkMxNy41IDE3LjU4NzEgMTYuNzUzOCAxOC4zMzMzIDE1LjgzMzMgMTguMzMzM0g0LjE2NjY3QzMuMjQ2MTkgMTguMzMzMyAyLjUgMTcuNTg3MSAyLjUgMTYuNjY2NlY0Ljk5OTk2QzIuNSA0LjA3OTQ4IDMuMjQ2MTkgMy4zMzMyOSA0LjE2NjY3IDMuMzMzMjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoYWJsZSBzaW5nbGUtc2VsZWN0IHN0b3JlIGZpbHRlciAoc2VsZi1jb250YWluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd3Mgc3RvcmUgbmFtZSwgc2VuZHMgc3RvcmVJZCB0byB0aGUgYmFja2VuZCkuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtZmlsdGVyIHBvc2l0aW9uLXJlbGF0aXZlIG1lLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b2dnbGVTdG9yZURyb3Bkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lIGJ0bi1vdXRsaW5lLWRlZmF1bHQgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDE4MHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkU3RvcmVOYW1lID8gc2VsZWN0ZWRTdG9yZU5hbWUgOiAnQWxsIFN0b3JlcycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZFN0b3JlTmFtZVwiIChjbGljayk9XCJjbGVhclN0b3JlKCRldmVudClcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDVMNSAxNU01IDVsMTAgMTBcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdG9yZURyb3Bkb3duT3BlblwiIGNsYXNzPVwiY2FyZCBweS0xIHBvc2l0aW9uLWFic29sdXRlIHotMSBlbmQtMFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMjBweDsgbWF4LWhlaWdodDogMjgwcHg7IG92ZXJmbG93LXk6IGF1dG87IHRvcDogNDRweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMyBweS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJzdG9yZVNlYXJjaFwiIChpbnB1dCk9XCJvblN0b3JlU2VhcmNoKCRldmVudClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3JlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHktMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCIhc2VsZWN0ZWRTdG9yZUlkID8gJ2FjdGl2ZScgOiAnJ1wiIGNsYXNzPVwicHgtNSBmdy1zZW1pYm9sZCBjdXJzb3ItcG9pbnRlciBweS0yXCIgKGNsaWNrKT1cInNlbGVjdFN0b3JlKHt9KVwiPkFsbCBTdG9yZXM8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHMgb2YgZmlsdGVyZWRTdG9yZU9wdGlvbnNcIiBbbmdDbGFzc109XCJzZWxlY3RlZFN0b3JlSWQgPT09IHMuc3RvcmVJZCA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC01IGZ3LXNlbWlib2xkIGN1cnNvci1wb2ludGVyIHB5LTJcIiAoY2xpY2spPVwic2VsZWN0U3RvcmUocylcIj57eyBzLnN0b3JlTmFtZSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFmaWx0ZXJlZFN0b3JlT3B0aW9ucy5sZW5ndGhcIiBjbGFzcz1cInB4LTUgcHktMiB0ZXh0LW11dGVkXCI+Tm8gc3RvcmVzIGZvdW5kPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiZGF0YU9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZ0xpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbG9nTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LnR5cGUgPT09ICdhbmdsZUNoYW5nZSc7IGVsc2Ugbm9ybWFsTG9nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvZy1jYXJkIG1iLTggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyIG1lLTNcIj57eyBzdG9yZU5hbWVCeUlkKGl0ZW0uc3RvcmVJZCkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFuZ2xlLWJhZGdlXCI+QW5nbGUgQ2hhbmdlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWIgbXQtMVwiPnt7IGl0ZW0uc3RyZWFtIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUgbWUtNVwiPnt7IGl0ZW0uZGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFuZ2xlLWV5ZS1idG5cIiB0aXRsZT1cIlByZXZpZXcgZXhwZWN0ZWQgdnMgYWN0dWFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQW5nbGVQcmV2aWV3KGl0ZW0sIGFuZ2xlUHJldmlldylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiAxMnMzLjUtNyAxMC03IDEwIDcgMTAgNy0zLjUgNy0xMCA3LTEwLTctMTAtN1pcIiBzdHJva2U9XCIjMTc1Q0QzXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiIHN0cm9rZT1cIiMxNzVDRDNcIiBzdHJva2Utd2lkdGg9XCIxLjhcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsTG9nPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1jYXJkIG1iLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1lLTEwIHctNzVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmUgbWUtNFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBtZS00XCI+e3tjYW1lbENhc2VUb1dvcmRzKGl0ZW0/LmxvZ1N1YlR5cGUpfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZVwiPnt7Zm9ybWF0RGF0ZShpdGVtPy5kYXRlKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJcIj57e2FycmF5VG9TdHJpbmcoaXRlbT8uY2hhbmdlcyl9fSA8c3BhbiAqbmdJZj1cIml0ZW0/LmV2ZW50VHlwZVwiPnt7aXRlbT8uZXZlbnRUeXBlICsgJ2QnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJcIj5CeSB7e2l0ZW0/LnVzZXJOYW1lfX0gLSB7e2l0ZW0/LmVtYWlsfX08L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIiAqbmdGb3I9XCJsZXQga2V5IG9mIG9iamVjdEtleXMoaXRlbT8udXBkYXRlZFZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImhlYWRlciBtZS00XCI+e3tjYW1lbENhc2VUb1dvcmRzKGtleSl9fTwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViIHctNzUgdG9vbHRpcC1jb250YWluZXJcIiAgY29udGFpbmVyPVwiYm9keVwiPjxiPnt7IGtleSB9fTwvYj4gaGFzIGJlZW4gdXBkYXRlZCBmcm9tIDxzcGFuIGNsYXNzPVwicmVkLWJhZGdlXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtPy51cGRhdGVkVmFsdWVba2V5XS5wcmV2aW91cyA9PT1cIlwiIHx8IGl0ZW0/LnVwZGF0ZWRWYWx1ZVtrZXldLnByZXZpb3VzID09PW51bGx8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8udXBkYXRlZFZhbHVlW2tleV0ucHJldmlvdXMgPT09dW5kZWZpbmVkKT9cIm51bGxcIjppdGVtPy51cGRhdGVkVmFsdWVba2V5XS5wcmV2aW91c319PC9zcGFuPiB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmVlbi1iYWRnZVwiPiB7e2l0ZW0/LnVwZGF0ZWRWYWx1ZVtrZXldLmN1cnJlbnQgPT09IFwiXCIgfHwgaXRlbT8udXBkYXRlZFZhbHVlW2tleV0uY3VycmVudCA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgfHxpdGVtPy51cGRhdGVkVmFsdWVba2V5XS5jdXJyZW50ID09PSB1bmRlZmluZWQ/XCJudWxsXCI6IGl0ZW0/LnVwZGF0ZWRWYWx1ZVtrZXldLmN1cnJlbnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwIHRleHQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtZWxDYXNlVG9Xb3JkcyhpdGVtPy5sb2dUeXBlKX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9nTGlzdD8ubGVuZ3RoXCIgY2xhc3M9XCJteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCIgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvZ0xpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgd2lkdGg9XCIzMDBweFwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb2FkaW5nJ1wiICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcblxuPCEtLSBBbmdsZS1jaGFuZ2UgcHJldmlldyBtb2RhbDogRXhwZWN0ZWQgdnMgQWN0dWFsIGNhbWVyYSBpbWFnZXMuIC0tPlxuPG5nLXRlbXBsYXRlICNhbmdsZVByZXZpZXcgbGV0LW1vZGFsPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlciBtZS0zXCI+e3sgcHJldmlld0l0ZW0/LnN0cmVhbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5nbGUtYmFkZ2VcIj5BbmdsZSBDaGFuZ2VkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgbWItNFwiPnt7IHN0b3JlTmFtZUJ5SWQocHJldmlld0l0ZW0/LnN0b3JlSWQpIH19IMK3IHt7IHByZXZpZXdJdGVtPy5kYXRlIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuZ2xlLWltZy13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcmV2aWV3SXRlbT8uZXhwZWN0ZWRcIiBbc3JjXT1cInByZXZpZXdJdGVtLmV4cGVjdGVkXCIgYWx0PVwiRXhwZWN0ZWQgY2FtZXJhIGFuZ2xlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFwcmV2aWV3SXRlbT8uZXhwZWN0ZWRcIiBjbGFzcz1cImFuZ2xlLWltZy1lbXB0eVwiPk5vIGV4cGVjdGVkIGltYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuZ2xlLWltZy1sYWJlbFwiPkV4cGVjdGVkPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuZ2xlLWltZy13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcmV2aWV3SXRlbT8uYWN0dWFsXCIgW3NyY109XCJwcmV2aWV3SXRlbS5hY3R1YWxcIiBhbHQ9XCJBY3R1YWwgY2FtZXJhIGFuZ2xlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFwcmV2aWV3SXRlbT8uYWN0dWFsXCIgY2xhc3M9XCJhbmdsZS1pbWctZW1wdHlcIj5ObyBhY3R1YWwgaW1hZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5nbGUtaW1nLWxhYmVsXCI+QWN0dWFsPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2FjdGl2aXR5LWxvZ3MvYWN0aXZpdHktbG9ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2FjdGl2aXR5LWxvZ3MvYWN0aXZpdHktbG9ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQXFDLE1BQU0sZUFBZSxDQUFDO0FBRzlHLE9BQVEsS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMzQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDO0FBQ25DLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBQzNDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQU92QixNQUFNLE9BQU8scUJBQXFCO0lBdU1aO0lBQXNDO0lBQStCO0lBck16RixLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ2IsY0FBYyxDQUFNO0lBQ3BCLDhFQUE4RTtJQUM5RSx3RUFBd0U7SUFDeEUsWUFBWSxHQUFVLEVBQUUsQ0FBQyxDQUFVLHNDQUFzQztJQUN6RSxvQkFBb0IsR0FBVSxFQUFFLENBQUMsQ0FBRSx1QkFBdUI7SUFDMUQsV0FBVyxHQUFXLEVBQUUsQ0FB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WSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxhQUFhLEVBQUU7b0JBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDakU7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFDcEIsSUFBSSxPQUFPLEdBQXdCO1lBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGNBQWMsRUFBRyxJQUFJLENBQUMsY0FBYztTQUNyQyxDQUFBO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFBO1NBQzNFO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFBO1NBQ3ZFO1FBRUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzFCLENBQUM7d0dBaGFZLHFCQUFxQjs0RkFBckIscUJBQXFCLHVIQ2pCbEMsMjBhQTJMQTs7NEZEMUthLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7NElBaUI3QixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCAgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBcImRheWpzL2xvY2FsZS9lblwiO1xyXG5pbXBvcnQgdXRjIGZyb20gXCJkYXlqcy9wbHVnaW4vdXRjXCI7XHJcbmltcG9ydCB0aW1lem9uZSBmcm9tIFwiZGF5anMvcGx1Z2luL3RpbWV6b25lXCI7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuZGF5anMuZXh0ZW5kKHV0Yyk7XHJcbmRheWpzLmV4dGVuZCh0aW1lem9uZSk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hY3Rpdml0eS1sb2dzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWN0aXZpdHktbG9ncy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FjdGl2aXR5LWxvZ3MuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUxvZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBkYXlqcyA9IGRheWpzXHJcbiAgZmlsdGVyQnlTdGF0dXM6IGFueTtcclxuICAvLyAtLS0tLSBTZWxmLWNvbnRhaW5lZCBzdG9yZSBmaWx0ZXIgKHNlYXJjaGFibGUgc2luZ2xlLXNlbGVjdCkuIEtlcHQgbG9jYWwgdG9cclxuICAvLyB0aGlzIGNvbXBvbmVudCBzbyBpdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHNoYXJlZCBsaWItZmlsdGVycy4gLS0tLS1cclxuICBzdG9yZU9wdGlvbnM6IGFueVtdID0gW107ICAgICAgICAgIC8vIGZ1bGwgbGlzdDogW3sgc3RvcmVJZCwgc3RvcmVOYW1lIH1dXHJcbiAgZmlsdGVyZWRTdG9yZU9wdGlvbnM6IGFueVtdID0gW107ICAvLyBzZWFyY2gtZmlsdGVyZWQgdmlld1xyXG4gIHN0b3JlU2VhcmNoOiBzdHJpbmcgPSAnJztcclxuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkU3RvcmVOYW1lOiBzdHJpbmcgPSAnJztcclxuICBzdG9yZURyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXRhcmdldC5jbG9zZXN0KCcuZHJvcGRvd24nKSkge1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXJzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDbG9zZSB0aGUgc3RvcmUgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlIGl0LlxyXG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLnN0b3JlLWZpbHRlcicpKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlRHJvcGRvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zdG9yZURyb3Bkb3duT3BlbiA9ICF0aGlzLnN0b3JlRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgb25TdG9yZVNlYXJjaChldmVudDogYW55KSB7XHJcbiAgICBjb25zdCB0ZXJtID0gKGV2ZW50Py50YXJnZXQ/LnZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICB0aGlzLnN0b3JlU2VhcmNoID0gdGVybTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZU9wdGlvbnMgPSB0ZXJtXHJcbiAgICAgID8gdGhpcy5zdG9yZU9wdGlvbnMuZmlsdGVyKChzKSA9PiBuZXcgUmVnRXhwKHRlcm0sICdpJykudGVzdChzLnN0b3JlTmFtZSB8fCAnJykpXHJcbiAgICAgIDogdGhpcy5zdG9yZU9wdGlvbnMuc2xpY2UoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN0b3JlKHN0b3JlOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gc3RvcmU/LnN0b3JlSWQgfHwgJyc7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVOYW1lID0gc3RvcmU/LnN0b3JlTmFtZSB8fCAnJztcclxuICAgIHRoaXMuc3RvcmVEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyU3RvcmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlSWQgPSAnJztcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZU5hbWUgPSAnJztcclxuICAgIHRoaXMuc3RvcmVTZWFyY2ggPSAnJztcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZU9wdGlvbnMgPSB0aGlzLnN0b3JlT3B0aW9ucy5zbGljZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLmdldEFjdGl2aXR5TG9ncygpO1xyXG4gIH1cclxuXHJcbiAgaXRlbXNQZXJQYWdlID0gMTBcclxuICBjdXJyZW50UGFnZSA9IDFcclxuICB0b3RhbEl0ZW1zID0gMFxyXG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXVxyXG4gIHBhZ2VTaXplID0gMTBcclxuICBzZWxlY3RlZERhdGVSYW5nZTogYW55ID0ge1xyXG4gICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKCkuc3VidHJhY3QoMzAsIFwiZGF5c1wiKSxcclxuICAgIGVuZERhdGU6IHRoaXMuZGF5anMoKVxyXG4gIH07XHJcbiAgY2xpZW50TGlzdDogYW55ID0gW11cclxuICBzZWxlY3RlZENsaWVudDogYW55XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBsb2dMaXN0OiBhbnk7XHJcbiAgZmlsdGVyU3RhcnREYXRlOiBzdHJpbmcgPSB0aGlzLmRheWpzKCkuc3VidHJhY3QoMzAsIFwiZGF5c1wiKS50b0lTT1N0cmluZygpXHJcbiAgZmlsdGVyRW5kRGF0ZTogc3RyaW5nID10aGlzLmRheWpzKCkuc3VidHJhY3QoMCwgXCJkYXlzXCIpLnRvSVNPU3RyaW5nKClcclxuICBzaG93RmlsdGVyczpib29sZWFuID0gZmFsc2VcclxuICBwYWdlU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnbG9hZGVkJyB8ICdsb2FkaW5nJz4oJ2xvYWRpbmcnKTtcclxuICBmaWx0ZXJzID0gW1xyXG4gICAge1xyXG4gICAgICBsYWJlbDonQnJhbmQgZGV0YWlscycsXHJcbiAgICAgIGlkOidicmFuZERldGFpbHMnLFxyXG4gICAgICBpc0NoZWNrZWQ6dHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6J0NvbmZpZ3VyYXRpb24nLFxyXG4gICAgICBpZDonY29uZmlndXJhdGlvbicsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonRG9jdW1lbnRzJyxcclxuICAgICAgaWQ6J2RvY3VtZW50cycsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonU3RvcmVzJyxcclxuICAgICAgaWQ6J3N0b3JlcycsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LCAgIFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonQ2x1c3RlcnMnLFxyXG4gICAgICBpZDonY2x1c3RlcicsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonVGVhbXMnLFxyXG4gICAgICBpZDondGVhbXMnLFxyXG4gICAgICBpc0NoZWNrZWQ6dHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6J1N1YnNjcmlwdGlvbicsXHJcbiAgICAgIGlkOidzdWJzY3JpcHRpb24nLFxyXG4gICAgICBpc0NoZWNrZWQ6dHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbGFiZWw6J0ludm9pY2UnLFxyXG4gICAgICBpZDonaW52b2ljZScsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBsYWJlbDonQmlsbGluZycsXHJcbiAgICAgIGlkOidiaWxsaW5nJyxcclxuICAgICAgaXNDaGVja2VkOnRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0NhbWVyYScsXHJcbiAgICAgIGlkOidjYW1lcmFzJyxcclxuICAgICAgaXNDaGVja2VkOnRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J1pvbmUnLFxyXG4gICAgICBpZDonem9uZScsXHJcbiAgICAgIGlzQ2hlY2tlZDp0cnVlXHJcbiAgICB9LFxyXG4gIF1cclxuICBkYXRhT2JqZWN0OiBhbnkgPSBbXHJcbiAgICB7IERlc2NyaXB0aW9uOiAnU3RhdHVzIExvZ3MnLCBJc3N1ZXM6W3tcclxuICAgICAgdGV4dDonQnJhbmQgZGV0YWlscycsXHJcbiAgICAgIGlkOidicmFuZERldGFpbHMnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDonQ29uZmlndXJhdGlvbicsXHJcbiAgICAgIGlkOidjb25maWd1cmF0aW9uJyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0RvY3VtZW50cycsXHJcbiAgICAgIGlkOidkb2N1bWVudHMnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDonU3RvcmVzJyxcclxuICAgICAgaWQ6J3N0b3JlcycsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OidDYW1lcmEnLFxyXG4gICAgICBpZDonY2FtZXJhcycsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OidDbHVzdGVycycsXHJcbiAgICAgIGlkOidjbHVzdGVyJyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J1VzZXJzJyxcclxuICAgICAgaWQ6J3VzZXJzJywgXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OidUZWFtcycsXHJcbiAgICAgIGlkOid0ZWFtcycsIFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDonU3Vic2NyaXB0aW9uJyxcclxuICAgICAgaWQ6J3N1YnNjcmlwdGlvbidcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0ludm9pY2UnLFxyXG4gICAgICBpZDonaW52b2ljZSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0JpbGxpbmcnLFxyXG4gICAgICBpZDonYmlsbGluZydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J1pvbmUnLFxyXG4gICAgICBpZDonem9uZSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIC8vIEN1c3RvbSByZXBvcnQgY3JlYXRlL3VwZGF0ZS9zY2hlZHVsZS9kZWxldGUgZW50cmllcyAobG9nVHlwZSAncmVwb3J0JyxcclxuICAgICAgLy8gd3JpdHRlbiBieSByZXRhaWwtYW5hbHlzaXMtcmVwb3J0LWFwaS12MydzIGN1c3RvbVJlcG9ydEFjdGl2aXR5TG9nKS5cclxuICAgICAgdGV4dDonUmVwb3J0JyxcclxuICAgICAgaWQ6J3JlcG9ydCdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6J0FuZ2xlIENoYW5nZScsXHJcbiAgICAgIGlkOidhbmdsZUNoYW5nZSdcclxuICAgIH0sXHJcbiAgXX1cclxuICBdXHJcbiAgLy8gQW5nbGUtY2hhbmdlIGltYWdlIHByZXZpZXcgKG9wZW5lZCBmcm9tIHRoZSBleWUgaWNvbiBvbiBhbiBhbmdsZSByb3cpLlxyXG4gIHByZXZpZXdJdGVtOiBhbnkgPSBudWxsO1xyXG5cclxuICBvcGVuQW5nbGVQcmV2aWV3KGl0ZW06IGFueSwgdHBsOiBhbnkpIHtcclxuICAgIHRoaXMucHJldmlld0l0ZW0gPSBpdGVtO1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0cGwsIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaVNlcnZpY2U6IENsaWVudEFwaVNlcnZpY2UsIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwpIHtcclxuICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRJZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGVcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9ICcnXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlTmFtZSA9ICcnXHJcbiAgICAgICAgdGhpcy5zdG9yZVNlYXJjaCA9ICcnXHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzRm9yRmlsdGVyKClcclxuICAgICAgICB0aGlzLmdldEFjdGl2aXR5TG9ncygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBsb2FkU3RvcmVzRm9yRmlsdGVyKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldFN0b3JlTGlzdCh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXM/LmRhdGE/LnJlc3VsdCB8fCBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVPcHRpb25zID0gdGhpcy5zdG9yZU9wdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAvLyBTdG9yZSBsaXN0IHVuYXZhaWxhYmxlIOKGkiBlbXB0eSBvcHRpb25zOyBsb2dzIHN0aWxsIGxvYWQgdW5maWx0ZXJlZC5cclxuICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnBhZ2VTdGF0ZSQuY29tcGxldGUoKTtcclxuXHJcbiAgfVxyXG5cclxuICBzdG9yZU5hbWVCeUlkKHN0b3JlSWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzID0gKHRoaXMuc3RvcmVPcHRpb25zIHx8IFtdKS5maW5kKCh4OiBhbnkpID0+IHguc3RvcmVJZCA9PT0gc3RvcmVJZCk7XHJcbiAgICByZXR1cm4gcz8uc3RvcmVOYW1lIHx8IHN0b3JlSWQ7XHJcbiAgfVxyXG5cclxuICBnZXRBY3Rpdml0eUxvZ3MoKSB7XHJcbiAgICBjb25zdCBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4tVVMnKTtcclxuICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkaW5nJylcclxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgbG9nVHlwZUZpbHRlcnMgOiB0aGlzLmZpbHRlckJ5U3RhdHVzLFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmlsdGVyU3RhcnREYXRlKSB7XHJcbiAgICAgIGZpbHRlcnMuc3RhcnREYXRlID0gZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZmlsdGVyU3RhcnREYXRlLCAneXl5eS1NTS1kZCcpXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWx0ZXJFbmREYXRlKSB7XHJcbiAgICAgIGZpbHRlcnMuZW5kRGF0ZSA9IGRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmZpbHRlckVuZERhdGUsICd5eXl5LU1NLWRkJylcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVJZCkge1xyXG4gICAgICBmaWx0ZXJzLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkU3RvcmVJZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZih0aGlzLmdldENoZWNrZWRJZHModGhpcy5maWx0ZXJzKT8ubGVuZ3RoKXtcclxuICAgIC8vICAgZmlsdGVycy5sb2dUeXBlRmlsdGVycyA9IHRoaXMuZ2V0Q2hlY2tlZElkcyh0aGlzLmZpbHRlcnMpXHJcbiAgICAvLyB9XHJcblxyXG4gICAgY29uc3QgdHlwZXMgPSB0aGlzLmZpbHRlckJ5U3RhdHVzIHx8IFtdO1xyXG4gICAgY29uc3QgaXNBbmdsZUNoYW5nZSA9IEFycmF5LmlzQXJyYXkodHlwZXMpICYmIHR5cGVzLmluY2x1ZGVzKCdhbmdsZUNoYW5nZScpO1xyXG4gICAgaWYgKGlzQW5nbGVDaGFuZ2UpIHtcclxuICAgICAgY29uc3QgYW5nbGVQYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxyXG4gICAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZUlkKSB7IGFuZ2xlUGF5bG9hZFsnc3RvcmVJZCddID0gdGhpcy5zZWxlY3RlZFN0b3JlSWQ7IH1cclxuICAgICAgaWYgKHRoaXMuZmlsdGVyU3RhcnREYXRlKSB7IGFuZ2xlUGF5bG9hZFsnc3RhcnREYXRlJ10gPSBkYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5maWx0ZXJTdGFydERhdGUsICd5eXl5LU1NLWRkJyk7IH1cclxuICAgICAgaWYgKHRoaXMuZmlsdGVyRW5kRGF0ZSkgeyBhbmdsZVBheWxvYWRbJ2VuZERhdGUnXSA9IGRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmZpbHRlckVuZERhdGUsICd5eXl5LU1NLWRkJyk7IH1cclxuICAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFuZ2xlQ2hhbmdlTG9ncyhhbmdsZVBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkZWQnKTtcclxuICAgICAgICAgIHRoaXMubG9nTGlzdCA9IGU/LmRhdGE/LmRhdGEgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBlPy5kYXRhPy5jb3VudCB8fCAwO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYWdlU3RhdGUkLm5leHQoJ2xvYWRlZCcpO1xyXG4gICAgICAgICAgdGhpcy5sb2dMaXN0ID0gW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjsgLy8gc2VwYXJhdGUgbW9kZSDigJQgc2tpcCB0aGUgbm9ybWFsIGFjdGl2aXR5LWxvZyBjYWxsXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldEFjdGl2aXR5TG9ncyhmaWx0ZXJzKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIGlmIChlPy5kYXRhPy5jb3VudCkge1xyXG4gICAgICAgICAgdGhpcy5sb2dMaXN0ID0gZS5kYXRhLmRhdGFcclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IGUuZGF0YS5jb3VudFxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5sb2dMaXN0ID0gW11cclxuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDBcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZVN0YXRlJC5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIHRoaXMubG9nTGlzdCA9IFtdXHJcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMFxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZGF0ZWNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQuc3RhcnREYXRlIHx8IGV2ZW50LmVuZERhdGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDFcclxuICAgICAgdGhpcy5maWx0ZXJTdGFydERhdGUgPSB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSkudXRjKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICB0aGlzLmZpbHRlckVuZERhdGUgPSB0aGlzLmRheWpzKGV2ZW50LmVuZERhdGUpLnV0YygpLnRvSVNPU3RyaW5nKClcclxuICAgICAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHJhbmdlczogYW55ID0ge1xyXG4gICAgVG9kYXk6IFt0aGlzLmRheWpzKCksIHRoaXMuZGF5anMoKV0sXHJcbiAgICBZZXN0ZXJkYXk6IFt0aGlzLmRheWpzKCkuc3VidHJhY3QoMSwgXCJkYXlzXCIpLCB0aGlzLmRheWpzKCkuc3VidHJhY3QoMSwgXCJkYXlzXCIpXSxcclxuICAgIFwiVGhpcyBXZWVrXCI6IFt0aGlzLmRheWpzKCkuc3VidHJhY3QoNiwgXCJkYXlzXCIpLCB0aGlzLmRheWpzKCldLFxyXG4gICAgXCJMYXN0IFdlZWtcIjogW1xyXG4gICAgICB0aGlzLmRheWpzKCkuc3VidHJhY3QoMTMsIFwiZGF5c1wiKS5zdGFydE9mKFwiZGF5c1wiKSxcclxuICAgICAgdGhpcy5kYXlqcygpLnN1YnRyYWN0KDcsIFwiZGF5c1wiKS5lbmRPZihcImRheXNcIiksXHJcbiAgICBdLFxyXG4gICAgXCJUaGlzIE1vbnRoXCI6IFt0aGlzLmRheWpzKCkuc3VidHJhY3QoMzAsIFwiZGF5c1wiKSwgLy8gU3RhcnQgZGF0ZSBpcyAzMCBkYXlzIGJlZm9yZSB0b2RheVxyXG4gICAgICB0aGlzLmRheWpzKCldLCBcclxuICAgIFwiTGFzdCBNb250aFwiOiBbXHJcbiAgICAgIHRoaXMuZGF5anMoKS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnN0YXJ0T2YoXCJtb250aFwiKSxcclxuICAgICAgdGhpcy5kYXlqcygpLnN1YnRyYWN0KDEsIFwibW9udGhcIikuZW5kT2YoXCJtb250aFwiKSxcclxuICAgIF0sXHJcbiAgfTtcclxuXHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlT2Zmc2V0XHJcbiAgICB0aGlzLmdldEFjdGl2aXR5TG9ncygpXHJcblxyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7ICAgXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMSBcclxuICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZVxyXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBwYWdlU2l6ZVxyXG4gICAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZShpbnB1dERhdGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMuZGF5anMoaW5wdXREYXRlKTtcclxuICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBwYXJzZWREYXRlLmZvcm1hdCgnREQtTU0tWVlZWSB8IGhoOm1tIEEnKTtcclxuICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xyXG4gIH1cclxuXHJcbiAgY2FtZWxDYXNlVG9Xb3JkcyhjYW1lbENhc2VTdHJpbmc6IHN0cmluZykge1xyXG4gICAgY29uc3Qgd29yZHMgPSBjYW1lbENhc2VTdHJpbmcucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJyk7XHJcbiAgICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXJyYXlUb1N0cmluZyhhcnJheTogYW55KSB7XHJcbiAgICByZXR1cm4gYXJyYXkuam9pbignLCAnKTtcclxuICB9XHJcbiAgb2JqZWN0S2V5cyhvYmo6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwID8gT2JqZWN0LmtleXMob2JqKSA6IFtdO1xyXG4gIH1cclxuICBcclxuXHJcbiAgY2hlY2tJZkFsbFNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5ldmVyeSgoaXRlbTphbnkpID0+IGl0ZW0uaXNDaGVja2VkKTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IGl0ZW0uaXNDaGVja2VkID0gc2VsZWN0QWxsKTtcclxuICB9XHJcblxyXG4gICBnZXRDaGVja2VkSWRzKGZpbHRlcnM6YW55KSB7XHJcbiAgICBjb25zdCBjaGVja2VkSWRzID0gZmlsdGVycy5maWx0ZXIoKGZpbHRlcjphbnkpID0+IGZpbHRlci5pc0NoZWNrZWQpLm1hcCgoZmlsdGVyOmFueSkgPT4gZmlsdGVyLmlkKTtcclxuICAgIHJldHVybiBjaGVja2VkSWRzO1xyXG59XHJcblxyXG5hcHBseUZpbHRlcigpe1xyXG4gIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgdGhpcy5zaG93RmlsdGVycyA9IGZhbHNlXHJcbiAgdGhpcy5nZXRBY3Rpdml0eUxvZ3MoKTtcclxufVxyXG5hcHBseUZpbHRlcnMoZXZlbnQ6YW55KXtcclxuICBjb25zdCBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4tVVMnKTtcclxuICBpZiAoZXZlbnQ/Lmxlbmd0aCkge1xyXG4gICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSBcIlN0YXR1cyBMb2dzXCIpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJ5U3RhdHVzID0gZWxlbWVudC5Jc3N1ZXMubWFwKCh2YWw6IGFueSkgPT4gdmFsPy5pZCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XHJcbiAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgbG9nVHlwZUZpbHRlcnMgOiB0aGlzLmZpbHRlckJ5U3RhdHVzLFxyXG4gIH1cclxuICBpZiAodGhpcy5maWx0ZXJTdGFydERhdGUpIHtcclxuICAgIGZpbHRlcnMuc3RhcnREYXRlID0gZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZmlsdGVyU3RhcnREYXRlLCAneXl5eS1NTS1kZCcpXHJcbiAgfVxyXG4gIGlmICh0aGlzLmZpbHRlckVuZERhdGUpIHtcclxuICAgIGZpbHRlcnMuZW5kRGF0ZSA9IGRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmZpbHRlckVuZERhdGUsICd5eXl5LU1NLWRkJylcclxuICB9XHJcbiBcclxuICAgIHRoaXMuZ2V0QWN0aXZpdHlMb2dzKClcclxufVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhY3Rpdml0eS1jYXJkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnZVN0YXRlJCB8IGFzeW5jIGFzIHBhZ2VTdGF0ZVwiID5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwYWdlU3RhdGVcIiA+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb2FkZWQnXCIgICA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5BY3Rpdml0eSBMb2dzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbWUtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZngtZGF0ZS1yYW5nZSBmb3JtLWNvbnRyb2wgcHMtMTRcIiBzdHlsZT1cIm1pbi13aWR0aDogMjYwcHggIWltcG9ydGFudDtcIiB0eXBlPVwidGV4dFwiIG1hdElucHV0IG5neERhdGVyYW5nZXBpY2tlck1kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgW3Jhbmdlc109XCJyYW5nZXNcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIiBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZERhdGVSYW5nZVwiIFthdXRvQXBwbHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJkYXRlY2hhbmdlKCRldmVudClcIiBuYW1lPVwiZGF0ZXJhbmdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjMzMzMgMS42NjY2M1Y0Ljk5OTk2TTYuNjY2NjcgMS42NjY2M1Y0Ljk5OTk2TTIuNSA4LjMzMzI5SDE3LjVNNC4xNjY2NyAzLjMzMzI5SDE1LjgzMzNDMTYuNzUzOCAzLjMzMzI5IDE3LjUgNC4wNzk0OCAxNy41IDQuOTk5OTZWMTYuNjY2NkMxNy41IDE3LjU4NzEgMTYuNzUzOCAxOC4zMzMzIDE1LjgzMzMgMTguMzMzM0g0LjE2NjY3QzMuMjQ2MTkgMTguMzMzMyAyLjUgMTcuNTg3MSAyLjUgMTYuNjY2NlY0Ljk5OTk2QzIuNSA0LjA3OTQ4IDMuMjQ2MTkgMy4zMzMyOSA0LjE2NjY3IDMuMzMzMjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoYWJsZSBzaW5nbGUtc2VsZWN0IHN0b3JlIGZpbHRlciAoc2VsZi1jb250YWluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd3Mgc3RvcmUgbmFtZSwgc2VuZHMgc3RvcmVJZCB0byB0aGUgYmFja2VuZCkuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtZmlsdGVyIHBvc2l0aW9uLXJlbGF0aXZlIG1lLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b2dnbGVTdG9yZURyb3Bkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lIGJ0bi1vdXRsaW5lLWRlZmF1bHQgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDE4MHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkU3RvcmVOYW1lID8gc2VsZWN0ZWRTdG9yZU5hbWUgOiAnQWxsIFN0b3JlcycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZFN0b3JlTmFtZVwiIChjbGljayk9XCJjbGVhclN0b3JlKCRldmVudClcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDVMNSAxNU01IDVsMTAgMTBcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdG9yZURyb3Bkb3duT3BlblwiIGNsYXNzPVwiY2FyZCBweS0xIHBvc2l0aW9uLWFic29sdXRlIHotMSBlbmQtMFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMjBweDsgbWF4LWhlaWdodDogMjgwcHg7IG92ZXJmbG93LXk6IGF1dG87IHRvcDogNDRweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMyBweS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJzdG9yZVNlYXJjaFwiIChpbnB1dCk9XCJvblN0b3JlU2VhcmNoKCRldmVudClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3JlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHktMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCIhc2VsZWN0ZWRTdG9yZUlkID8gJ2FjdGl2ZScgOiAnJ1wiIGNsYXNzPVwicHgtNSBmdy1zZW1pYm9sZCBjdXJzb3ItcG9pbnRlciBweS0yXCIgKGNsaWNrKT1cInNlbGVjdFN0b3JlKHt9KVwiPkFsbCBTdG9yZXM8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHMgb2YgZmlsdGVyZWRTdG9yZU9wdGlvbnNcIiBbbmdDbGFzc109XCJzZWxlY3RlZFN0b3JlSWQgPT09IHMuc3RvcmVJZCA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC01IGZ3LXNlbWlib2xkIGN1cnNvci1wb2ludGVyIHB5LTJcIiAoY2xpY2spPVwic2VsZWN0U3RvcmUocylcIj57eyBzLnN0b3JlTmFtZSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFmaWx0ZXJlZFN0b3JlT3B0aW9ucy5sZW5ndGhcIiBjbGFzcz1cInB4LTUgcHktMiB0ZXh0LW11dGVkXCI+Tm8gc3RvcmVzIGZvdW5kPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiZGF0YU9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvZ0xpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbG9nTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LnR5cGUgPT09ICdhbmdsZUNoYW5nZSc7IGVsc2Ugbm9ybWFsTG9nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvZy1jYXJkIG1iLTggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyIG1lLTNcIj57eyBzdG9yZU5hbWVCeUlkKGl0ZW0uc3RvcmVJZCkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFuZ2xlLWJhZGdlXCI+QW5nbGUgQ2hhbmdlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWIgbXQtMVwiPnt7IGl0ZW0uc3RyZWFtIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUgbWUtNVwiPnt7IGl0ZW0uZGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFuZ2xlLWV5ZS1idG5cIiB0aXRsZT1cIlByZXZpZXcgZXhwZWN0ZWQgdnMgYWN0dWFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQW5nbGVQcmV2aWV3KGl0ZW0sIGFuZ2xlUHJldmlldylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiAxMnMzLjUtNyAxMC03IDEwIDcgMTAgNy0zLjUgNy0xMCA3LTEwLTctMTAtN1pcIiBzdHJva2U9XCIjMTc1Q0QzXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiIHN0cm9rZT1cIiMxNzVDRDNcIiBzdHJva2Utd2lkdGg9XCIxLjhcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsTG9nPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1jYXJkIG1iLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1lLTEwIHctNzVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmUgbWUtNFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBtZS00XCI+e3tjYW1lbENhc2VUb1dvcmRzKGl0ZW0/LmxvZ1N1YlR5cGUpfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZVwiPnt7Zm9ybWF0RGF0ZShpdGVtPy5kYXRlKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJcIj57e2FycmF5VG9TdHJpbmcoaXRlbT8uY2hhbmdlcyl9fSA8c3BhbiAqbmdJZj1cIml0ZW0/LmV2ZW50VHlwZVwiPnt7aXRlbT8uZXZlbnRUeXBlICsgJ2QnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIFwiIC0gZW1haWxcIiBwYXJ0IHJlbmRlcnMgb25seSB3aGVuIGl0IGFkZHMgaW5mb3JtYXRpb246IHN5c3RlbSB3cml0ZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSByZXBvcnQgc2NoZWR1bGVyKSBmaWxsIGJvdGggZmllbGRzIHdpdGggdGhlIHNhbWUgYWN0b3IgbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggcmVhZCBhcyBcIkJ5IHJlcG9ydC1zY2hlZHVsZXIgLSByZXBvcnQtc2NoZWR1bGVyXCIgKFFBIDIwMjYtMDktMDEpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJcIj5CeSB7e2l0ZW0/LnVzZXJOYW1lfX08c3BhbiAqbmdJZj1cIml0ZW0/LmVtYWlsICYmIGl0ZW0/LmVtYWlsICE9PSBpdGVtPy51c2VyTmFtZVwiPiAtIHt7aXRlbT8uZW1haWx9fTwvc3Bhbj48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIiAqbmdGb3I9XCJsZXQga2V5IG9mIG9iamVjdEtleXMoaXRlbT8udXBkYXRlZFZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImhlYWRlciBtZS00XCI+e3tjYW1lbENhc2VUb1dvcmRzKGtleSl9fTwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViIHctNzUgdG9vbHRpcC1jb250YWluZXJcIiAgY29udGFpbmVyPVwiYm9keVwiPjxiPnt7IGtleSB9fTwvYj4gaGFzIGJlZW4gdXBkYXRlZCBmcm9tIDxzcGFuIGNsYXNzPVwicmVkLWJhZGdlXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtPy51cGRhdGVkVmFsdWVba2V5XS5wcmV2aW91cyA9PT1cIlwiIHx8IGl0ZW0/LnVwZGF0ZWRWYWx1ZVtrZXldLnByZXZpb3VzID09PW51bGx8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8udXBkYXRlZFZhbHVlW2tleV0ucHJldmlvdXMgPT09dW5kZWZpbmVkKT9cIm51bGxcIjppdGVtPy51cGRhdGVkVmFsdWVba2V5XS5wcmV2aW91c319PC9zcGFuPiB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmVlbi1iYWRnZVwiPiB7e2l0ZW0/LnVwZGF0ZWRWYWx1ZVtrZXldLmN1cnJlbnQgPT09IFwiXCIgfHwgaXRlbT8udXBkYXRlZFZhbHVlW2tleV0uY3VycmVudCA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgfHxpdGVtPy51cGRhdGVkVmFsdWVba2V5XS5jdXJyZW50ID09PSB1bmRlZmluZWQ/XCJudWxsXCI6IGl0ZW0/LnVwZGF0ZWRWYWx1ZVtrZXldLmN1cnJlbnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwIHRleHQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtZWxDYXNlVG9Xb3JkcyhpdGVtPy5sb2dUeXBlKX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9nTGlzdD8ubGVuZ3RoXCIgY2xhc3M9XCJteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCIgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvZ0xpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgd2lkdGg9XCIzMDBweFwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb2FkaW5nJ1wiICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcblxuPCEtLSBBbmdsZS1jaGFuZ2UgcHJldmlldyBtb2RhbDogRXhwZWN0ZWQgdnMgQWN0dWFsIGNhbWVyYSBpbWFnZXMuIC0tPlxuPG5nLXRlbXBsYXRlICNhbmdsZVByZXZpZXcgbGV0LW1vZGFsPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlciBtZS0zXCI+e3sgcHJldmlld0l0ZW0/LnN0cmVhbSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5nbGUtYmFkZ2VcIj5BbmdsZSBDaGFuZ2VkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgbWItNFwiPnt7IHN0b3JlTmFtZUJ5SWQocHJldmlld0l0ZW0/LnN0b3JlSWQpIH19IMK3IHt7IHByZXZpZXdJdGVtPy5kYXRlIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuZ2xlLWltZy13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcmV2aWV3SXRlbT8uZXhwZWN0ZWRcIiBbc3JjXT1cInByZXZpZXdJdGVtLmV4cGVjdGVkXCIgYWx0PVwiRXhwZWN0ZWQgY2FtZXJhIGFuZ2xlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFwcmV2aWV3SXRlbT8uZXhwZWN0ZWRcIiBjbGFzcz1cImFuZ2xlLWltZy1lbXB0eVwiPk5vIGV4cGVjdGVkIGltYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuZ2xlLWltZy1sYWJlbFwiPkV4cGVjdGVkPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuZ2xlLWltZy13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcmV2aWV3SXRlbT8uYWN0dWFsXCIgW3NyY109XCJwcmV2aWV3SXRlbS5hY3R1YWxcIiBhbHQ9XCJBY3R1YWwgY2FtZXJhIGFuZ2xlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFwcmV2aWV3SXRlbT8uYWN0dWFsXCIgY2xhc3M9XCJhbmdsZS1pbWctZW1wdHlcIj5ObyBhY3R1YWwgaW1hZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5nbGUtaW1nLWxhYmVsXCI+QWN0dWFsPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19