kwikid-agent-dashboard
Version:
KwikID's EKYC Agent Map View Module.
139 lines • 31.3 kB
JavaScript
/* eslint-disable no-prototype-builtins */
import { Component, EventEmitter, HostListener, Input, Output } from "@angular/core";
import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from "kwikid-toolkit";
import * as i0 from "@angular/core";
import * as i1 from "../../services/google-maps.service";
import * as i2 from "../../services/open-street-maps.service";
import * as i3 from "../../services/agent.service";
import * as i4 from "./status-pill/status-pill.component";
import * as i5 from "kwikui";
import * as i6 from "../action-button/action-button.component";
import * as i7 from "@angular/common";
export class CustomerTileComponent {
constructor(googleMapsService, openStreetMapsService, agentService, hostElement) {
this.googleMapsService = googleMapsService;
this.openStreetMapsService = openStreetMapsService;
this.agentService = agentService;
this.hostElement = hostElement;
this.customer = {};
this.index = undefined;
this.isMobileView = false;
this.viewTaskDetails = [];
this.taskId = "";
this.labelValuePairConfig = {};
this.labelValuePairData = [];
this.onClickPerformAction = new EventEmitter();
this.nextStep = new EventEmitter();
this.removeTask = new EventEmitter();
}
windowResizeWatcher() {
if (this.hostElement.nativeElement.offsetWidth < 600) {
this.isMobileView = true;
}
else {
this.isMobileView = false;
}
}
ngOnInit() {
this.parseData();
}
ngOnChanges(changes) {
const verifyChange = (key) => {
return changes.hasOwnProperty(key) && !changes[key].firstChange;
};
if (verifyChange("customer")) {
this.customer = changes.customer.currentValue;
this.parseData();
}
}
getValueFromArray(paths) {
let data = "";
// eslint-disable-next-line array-callback-return
paths.map((path) => {
const value = getObjectValueFromPath(this.customer, path);
data = `${data} ${value}`;
});
return data;
}
parseData() {
var _a, _b, _c, _d, _e, _f;
const identifier = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.taskIdentifier) !== null && _b !== void 0 ? _b : "user_id";
this.taskId = getObjectValueFromPath(this.customer, identifier);
let detailsConfig = [];
if (checkObjectPathExists(this.config, "taskUI.details.data") &&
isNotEmptyArray(this.config.taskUI.details.data)) {
const data = [];
detailsConfig = this.config.taskUI.details.data;
detailsConfig.map((field) => {
let value;
if (Array.isArray(field.path)) {
value = this.getValueFromArray(field.path);
}
else {
value = getObjectValueFromPath(this.customer, field.path);
}
data.push({ label: field.label, value });
return true;
});
this.labelValuePairData = data;
}
this.labelValuePairConfig = (_f = (_e = (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.taskUI) === null || _d === void 0 ? void 0 : _d.details) === null || _e === void 0 ? void 0 : _e.config) !== null && _f !== void 0 ? _f : {};
}
openDetails() {
var _a, _b, _c, _d;
const isDifferentTaskSelected = ((_a = this.agentService.currentTaskDetails) === null || _a === void 0 ? void 0 : _a.session_id) !==
((_b = this.customer) === null || _b === void 0 ? void 0 : _b.session_id);
if (isDifferentTaskSelected) {
this.agentService.currentTaskDetails = this.customer;
}
else {
this.agentService.currentTaskDetails = undefined;
}
if (this.agentService.showMapview) {
if (((_d = (_c = this.agentService.config) === null || _c === void 0 ? void 0 : _c.maps) === null || _d === void 0 ? void 0 : _d.mapType) === "google-maps") {
this.googleMapsService.plotDirectionsForSelectedTask(this.agentService.currentTaskDetails);
}
else {
this.openStreetMapsService.plotDirectionsForSelectedTask(this.agentService.currentTaskDetails);
}
}
}
goToMaps(location) {
window.open(`${location}`, "_blank");
}
handleOnClickPerformAction(event) {
this.onClickPerformAction.emit(event);
}
handleOnClickNext(e) {
this.nextStep.emit(e);
}
handleOnClickRemoveTask(task) {
this.removeTask.emit(task);
}
}
/** @nocollapse */ CustomerTileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomerTileComponent, deps: [{ token: i1.GoogleMapsService }, { token: i2.OpenStreetMapsService }, { token: i3.AgentService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ CustomerTileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: CustomerTileComponent, selector: "customer-tile", inputs: { customer: "customer", index: "index", config: "config" }, outputs: { onClickPerformAction: "onClickPerformAction", nextStep: "nextStep", removeTask: "removeTask" }, host: { listeners: { "window:resize": "windowResizeWatcher($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div\n [ngClass]=\"\n customer?.session_id == agentService.currentTaskDetails?.session_id\n ? 'customer-tile-wrapper customer-tile-active'\n : 'customer-tile-wrapper'\n \"\n>\n <div class=\"customer-tile-primary-container\">\n <div class=\"customer-tile-primary-container-data\">\n <div class=\"customer-tile-primary-container-userid\">\n {{ taskId }}\n </div>\n <status-pill\n *ngIf=\"config?.utilityFlags?.isShowTaskStatus\"\n [config]=\"config?.taskUI?.header?.taskStatus\"\n [status]=\"\n customer[config?.taskUI?.header?.taskStatus?.path ?? 'session_status']\n \"\n ></status-pill>\n </div>\n <kwikui-button\n *ngIf=\"!agentService.isMobileView && !agentService.showMapview\"\n [icon]=\"\n agentService.currentTaskDetails?.session_id == customer?.session_id\n ? 'tuiIconChevronLeftLarge'\n : 'tuiIconChevronRightLarge'\n \"\n [shape]=\"'rounded'\"\n appearance=\"icon\"\n size=\"s\"\n (onClick)=\"openDetails()\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"agentService.isMobileView || agentService.showMapview\"\n [icon]=\"\n agentService.currentTaskDetails?.session_id == customer?.session_id\n ? 'tuiIconChevronUpLarge'\n : 'tuiIconChevronDownLarge'\n \"\n [shape]=\"'rounded'\"\n appearance=\"icon\"\n size=\"s\"\n (onClick)=\"openDetails()\"\n ></kwikui-button>\n </div>\n <div\n *ngIf=\"\n customer?.session_id == agentService.currentTaskDetails?.session_id &&\n (agentService.isMobileView || agentService.showMapview)\n \"\n [ngClass]=\"\n customer?.session_id == agentService.currentTaskDetails?.session_id &&\n (agentService.isMobileView || agentService.showMapview)\n ? 'customer-tile-secondary-container'\n : 'data-collasped'\n \"\n >\n <div class=\"customer-tile-secondary-container-data\">\n <kwikui-label-value-pair\n [config]=\"labelValuePairConfig\"\n [data]=\"labelValuePairData\"\n ></kwikui-label-value-pair>\n <!-- <div\n *ngIf=\"\n agentService.config?.maps?.sho &&\n agentService.config?.isShowDistanceAndTime &&\n openStreetMapsService.getSelectedTaskDistanceAndTime()\n \"\n class=\"customer-tile-secondary-container-custom-details\"\n >\n Distance: {{ openStreetMapsService.getSelectedTaskDistanceAndTime()?.distance }} |\n Time: {{ openStreetMapsService.getSelectedTaskDistanceAndTime()?.time }}\n </div> -->\n </div>\n <div class=\"customer-tile-secondary-container-actions\">\n <ng-container *ngFor=\"let action of config?.taskUI?.details?.action\">\n <kwikid-action-button\n [action]=\"action\"\n [config]=\"config\"\n [customer]=\"customer\"\n (onClickPerformAction)=\"handleOnClickPerformAction($event)\"\n ></kwikid-action-button>\n </ng-container>\n <!-- <div class=\"customer-tile-secondary-container-task-buttons\">\n <kwikui-button\n *ngIf=\"config?.isAllowRemoveTask\"\n [icon]=\"'tuiIconTrash2'\"\n [shape]=\"'rounded'\"\n appearance=\"icon\"\n size=\"s\"\n (onClick)=\"handleOnClickRemoveTask(customer)\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"config?.isShowCopyLink\"\n icon=\"tuiIconCopy\"\n [shape]=\"'rounded'\"\n appearance=\"icon\"\n size=\"s\"\n (onClick)=\"\n handleOnClickNext({\n customer: customer,\n stepType: 'SHARE_JOURNEY_LINK'\n })\n \"\n ></kwikui-button>\n </div>\n <div class=\"customer-tile-secondary-container-journey-buttons\">\n <kwikui-button\n *ngIf=\"config?.isShowMaps && customer?.isValidLocation\"\n label=\"Show Directions\"\n appearance=\"flat\"\n size=\"s\"\n styles=\"font-size:0.7rem;\"\n (onClick)=\"goToMaps(customer.googleMapsUrl)\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"\n config?.isAllowStartJourney &&\n agentService.canStartJourney(customer.session_status)\n \"\n label=\"Start Journey\"\n appearance=\"primary\"\n size=\"s\"\n styles=\"font-size:0.7rem;\"\n (onClick)=\"\n handleOnClickNext({ customer: customer, stepType: 'START_JOURNEY' })\n \"\n ></kwikui-button>\n </div> -->\n </div>\n </div>\n</div>\n", styles: [".customer-tile-wrapper{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:stretch;flex:1;overflow:auto;grid-gap:.5rem;gap:.5rem;margin:1rem;padding:1rem .25rem 1rem 1rem;border-radius:1rem;border:.5px solid #ddd}.customer-tile-wrapper .customer-tile-primary-container{display:flex;grid-gap:.5rem;gap:.5rem;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;width:100%;height:100%}.customer-tile-wrapper .customer-tile-primary-container .customer-tile-primary-container-data{padding-left:.2rem;grid-gap:.6rem;gap:.6rem;display:flex;flex-direction:column;flex-wrap:wrap;align-content:stretch;justify-content:flex-start;align-items:flex-start}.customer-tile-wrapper .customer-tile-primary-container .customer-tile-primary-container-data .customer-tile-primary-container-userid{font-weight:500;font-size:1.1rem;line-height:1rem}.customer-tile-wrapper .customer-tile-secondary-container{width:100%;height:100%;display:flex;flex-direction:column;overflow:auto;grid-gap:.5rem;gap:.5rem}.customer-tile-wrapper .customer-tile-secondary-container .customer-tile-secondary-container-data{padding:.4rem .2rem;display:flex;flex-direction:column;font-size:.7rem;grid-gap:.3rem;gap:.3rem}.customer-tile-wrapper .customer-tile-secondary-container .customer-tile-secondary-container-data .customer-tile-secondary-container-custom-details{width:100%;height:100%;line-height:.9rem;word-wrap:break-word}.customer-tile-wrapper .customer-tile-secondary-container .customer-tile-secondary-container-actions{padding:.5rem 0;display:flex;flex-wrap:wrap;align-items:center;flex-direction:row;justify-content:flex-start;grid-gap:.5rem;gap:.5rem}.customer-tile-wrapper .data-collasped{display:none}.customer-tile-active{background-color:#dcedfd}\n"], components: [{ type: i4.StatusPillComponent, selector: "status-pill", inputs: ["config", "status"] }, { type: i5.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i5.KwikUILabelValuePairComponent, selector: "kwikui-label-value-pair", inputs: ["config", "data", "id"] }, { type: i6.ActionButtonComponent, selector: "kwikid-action-button", inputs: ["action", "config", "customer"], outputs: ["onClickPerformAction"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomerTileComponent, decorators: [{
type: Component,
args: [{
selector: "customer-tile",
templateUrl: "./customer-tile.component.html",
styleUrls: ["./customer-tile.component.scss"]
}]
}], ctorParameters: function () { return [{ type: i1.GoogleMapsService }, { type: i2.OpenStreetMapsService }, { type: i3.AgentService }, { type: i0.ElementRef }]; }, propDecorators: { windowResizeWatcher: [{
type: HostListener,
args: ["window:resize", ["$event"]]
}], customer: [{
type: Input
}], index: [{
type: Input
}], config: [{
type: Input
}], onClickPerformAction: [{
type: Output
}], nextStep: [{
type: Output
}], removeTask: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItdGlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjEvY29tcG9uZW50cy9jdXN0b21lci10aWxlL2N1c3RvbWVyLXRpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3YxL2NvbXBvbmVudHMvY3VzdG9tZXItdGlsZS9jdXN0b21lci10aWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBDQUEwQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQVl4QixNQUFNLE9BQU8scUJBQXFCO0lBc0NoQyxZQUNTLGlCQUFvQyxFQUNwQyxxQkFBNEMsRUFDNUMsWUFBMEIsRUFDekIsV0FBdUI7UUFIeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBL0JqQyxhQUFRLEdBQVEsRUFBRSxDQUFDO1FBR25CLFVBQUssR0FBVyxTQUFTLENBQUM7UUFLMUIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsb0JBQWUsR0FBa0IsRUFBRSxDQUFDO1FBRXBDLFdBQU0sR0FBUSxFQUFFLENBQUM7UUFFakIseUJBQW9CLEdBQVEsRUFBRSxDQUFDO1FBRS9CLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUc3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LENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsdUJBQXVCLENBQUMsSUFBSTtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOztzSUF6SVUscUJBQXFCOzBIQUFyQixxQkFBcUIsa1VDM0JsQyxnakpBb0lBOzRGRHpHYSxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFdBQVcsRUFBRSxnQ0FBZ0M7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QztnTUFHQyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVV6QyxRQUFRO3NCQURQLEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFjTixvQkFBb0I7c0JBRG5CLE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBjaGVja09iamVjdFBhdGhFeGlzdHMsXG4gIGdldE9iamVjdFZhbHVlRnJvbVBhdGgsXG4gIGlzTm90RW1wdHlBcnJheVxufSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcbmltcG9ydCB7IEdvb2dsZU1hcHNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2dvb2dsZS1tYXBzLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFnZW50U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hZ2VudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcGVuU3RyZWV0TWFwc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvb3Blbi1zdHJlZXQtbWFwcy5zZXJ2aWNlXCI7XG5cbmRlY2xhcmUgY29uc3QgZ29vZ2xlOiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjdXN0b21lci10aWxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3VzdG9tZXItdGlsZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vY3VzdG9tZXItdGlsZS5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21lclRpbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIHdpbmRvd1Jlc2l6ZVdhdGNoZXIoKSB7XG4gICAgaWYgKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA8IDYwMCkge1xuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGN1c3RvbWVyOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBpbmRleDogbnVtYmVyID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIGNvbmZpZzogYW55O1xuXG4gIGlzTW9iaWxlVmlldyA9IGZhbHNlO1xuXG4gIHZpZXdUYXNrRGV0YWlsczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIHRhc2tJZDogYW55ID0gXCJcIjtcblxuICBsYWJlbFZhbHVlUGFpckNvbmZpZzogYW55ID0ge307XG5cbiAgbGFiZWxWYWx1ZVBhaXJEYXRhOiBhbnkgPSBbXTtcblxuICBAT3V0cHV0KClcbiAgb25DbGlja1BlcmZvcm1BY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG5leHRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICByZW1vdmVUYXNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBnb29nbGVNYXBzU2VydmljZTogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHVibGljIG9wZW5TdHJlZXRNYXBzU2VydmljZTogT3BlblN0cmVldE1hcHNTZXJ2aWNlLFxuICAgIHB1YmxpYyBhZ2VudFNlcnZpY2U6IEFnZW50U2VydmljZSxcbiAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlRGF0YSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiY3VzdG9tZXJcIikpIHtcbiAgICAgIHRoaXMuY3VzdG9tZXIgPSBjaGFuZ2VzLmN1c3RvbWVyLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMucGFyc2VEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsdWVGcm9tQXJyYXkocGF0aHMpIHtcbiAgICBsZXQgZGF0YSA9IFwiXCI7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFycmF5LWNhbGxiYWNrLXJldHVyblxuICAgIHBhdGhzLm1hcCgocGF0aCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMuY3VzdG9tZXIsIHBhdGgpO1xuICAgICAgZGF0YSA9IGAke2RhdGF9ICR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcGFyc2VEYXRhKCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmNvbmZpZz8udGFza0lkZW50aWZpZXIgPz8gXCJ1c2VyX2lkXCI7XG4gICAgdGhpcy50YXNrSWQgPSBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMuY3VzdG9tZXIsIGlkZW50aWZpZXIpO1xuXG4gICAgbGV0IGRldGFpbHNDb25maWcgPSBbXTtcbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdFBhdGhFeGlzdHModGhpcy5jb25maWcsIFwidGFza1VJLmRldGFpbHMuZGF0YVwiKSAmJlxuICAgICAgaXNOb3RFbXB0eUFycmF5KHRoaXMuY29uZmlnLnRhc2tVSS5kZXRhaWxzLmRhdGEpXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXRhID0gW107XG4gICAgICBkZXRhaWxzQ29uZmlnID0gdGhpcy5jb25maWcudGFza1VJLmRldGFpbHMuZGF0YTtcbiAgICAgIGRldGFpbHNDb25maWcubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLnBhdGgpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbUFycmF5KGZpZWxkLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCh0aGlzLmN1c3RvbWVyLCBmaWVsZC5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLnB1c2goeyBsYWJlbDogZmllbGQubGFiZWwsIHZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxhYmVsVmFsdWVQYWlyRGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgdGhpcy5sYWJlbFZhbHVlUGFpckNvbmZpZyA9IHRoaXMuY29uZmlnPy50YXNrVUk/LmRldGFpbHM/LmNvbmZpZyA/PyB7fTtcbiAgfVxuXG4gIG9wZW5EZXRhaWxzKCkge1xuICAgIGNvbnN0IGlzRGlmZmVyZW50VGFza1NlbGVjdGVkID1cbiAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlscz8uc2Vzc2lvbl9pZCAhPT1cbiAgICAgIHRoaXMuY3VzdG9tZXI/LnNlc3Npb25faWQ7XG5cbiAgICBpZiAoaXNEaWZmZXJlbnRUYXNrU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlscyA9IHRoaXMuY3VzdG9tZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlscyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXcpIHtcbiAgICAgIGlmICh0aGlzLmFnZW50U2VydmljZS5jb25maWc/Lm1hcHM/Lm1hcFR5cGUgPT09IFwiZ29vZ2xlLW1hcHNcIikge1xuICAgICAgICB0aGlzLmdvb2dsZU1hcHNTZXJ2aWNlLnBsb3REaXJlY3Rpb25zRm9yU2VsZWN0ZWRUYXNrKFxuICAgICAgICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlsc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVuU3RyZWV0TWFwc1NlcnZpY2UucGxvdERpcmVjdGlvbnNGb3JTZWxlY3RlZFRhc2soXG4gICAgICAgICAgdGhpcy5hZ2VudFNlcnZpY2UuY3VycmVudFRhc2tEZXRhaWxzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ29Ub01hcHMobG9jYXRpb24pIHtcbiAgICB3aW5kb3cub3BlbihgJHtsb2NhdGlvbn1gLCBcIl9ibGFua1wiKTtcbiAgfVxuXG4gIGhhbmRsZU9uQ2xpY2tQZXJmb3JtQWN0aW9uKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpY2tQZXJmb3JtQWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaGFuZGxlT25DbGlja05leHQoZSkge1xuICAgIHRoaXMubmV4dFN0ZXAuZW1pdChlKTtcbiAgfVxuXG4gIGhhbmRsZU9uQ2xpY2tSZW1vdmVUYXNrKHRhc2spIHtcbiAgICB0aGlzLnJlbW92ZVRhc2suZW1pdCh0YXNrKTtcbiAgfVxufVxuIiwiPGRpdlxuICBbbmdDbGFzc109XCJcbiAgICBjdXN0b21lcj8uc2Vzc2lvbl9pZCA9PSBhZ2VudFNlcnZpY2UuY3VycmVudFRhc2tEZXRhaWxzPy5zZXNzaW9uX2lkXG4gICAgICA/ICdjdXN0b21lci10aWxlLXdyYXBwZXIgY3VzdG9tZXItdGlsZS1hY3RpdmUnXG4gICAgICA6ICdjdXN0b21lci10aWxlLXdyYXBwZXInXG4gIFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJjdXN0b21lci10aWxlLXByaW1hcnktY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLXRpbGUtcHJpbWFyeS1jb250YWluZXItZGF0YVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLXRpbGUtcHJpbWFyeS1jb250YWluZXItdXNlcmlkXCI+XG4gICAgICAgIHt7IHRhc2tJZCB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8c3RhdHVzLXBpbGxcbiAgICAgICAgKm5nSWY9XCJjb25maWc/LnV0aWxpdHlGbGFncz8uaXNTaG93VGFza1N0YXR1c1wiXG4gICAgICAgIFtjb25maWddPVwiY29uZmlnPy50YXNrVUk/LmhlYWRlcj8udGFza1N0YXR1c1wiXG4gICAgICAgIFtzdGF0dXNdPVwiXG4gICAgICAgICAgY3VzdG9tZXJbY29uZmlnPy50YXNrVUk/LmhlYWRlcj8udGFza1N0YXR1cz8ucGF0aCA/PyAnc2Vzc2lvbl9zdGF0dXMnXVxuICAgICAgICBcIlxuICAgICAgPjwvc3RhdHVzLXBpbGw+XG4gICAgPC9kaXY+XG4gICAgPGt3aWt1aS1idXR0b25cbiAgICAgICpuZ0lmPVwiIWFnZW50U2VydmljZS5pc01vYmlsZVZpZXcgJiYgIWFnZW50U2VydmljZS5zaG93TWFwdmlld1wiXG4gICAgICBbaWNvbl09XCJcbiAgICAgICAgYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlscz8uc2Vzc2lvbl9pZCA9PSBjdXN0b21lcj8uc2Vzc2lvbl9pZFxuICAgICAgICAgID8gJ3R1aUljb25DaGV2cm9uTGVmdExhcmdlJ1xuICAgICAgICAgIDogJ3R1aUljb25DaGV2cm9uUmlnaHRMYXJnZSdcbiAgICAgIFwiXG4gICAgICBbc2hhcGVdPVwiJ3JvdW5kZWQnXCJcbiAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgIHNpemU9XCJzXCJcbiAgICAgIChvbkNsaWNrKT1cIm9wZW5EZXRhaWxzKClcIlxuICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgPGt3aWt1aS1idXR0b25cbiAgICAgICpuZ0lmPVwiYWdlbnRTZXJ2aWNlLmlzTW9iaWxlVmlldyB8fCBhZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXdcIlxuICAgICAgW2ljb25dPVwiXG4gICAgICAgIGFnZW50U2VydmljZS5jdXJyZW50VGFza0RldGFpbHM/LnNlc3Npb25faWQgPT0gY3VzdG9tZXI/LnNlc3Npb25faWRcbiAgICAgICAgICA/ICd0dWlJY29uQ2hldnJvblVwTGFyZ2UnXG4gICAgICAgICAgOiAndHVpSWNvbkNoZXZyb25Eb3duTGFyZ2UnXG4gICAgICBcIlxuICAgICAgW3NoYXBlXT1cIidyb3VuZGVkJ1wiXG4gICAgICBhcHBlYXJhbmNlPVwiaWNvblwiXG4gICAgICBzaXplPVwic1wiXG4gICAgICAob25DbGljayk9XCJvcGVuRGV0YWlscygpXCJcbiAgICA+PC9rd2lrdWktYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgICpuZ0lmPVwiXG4gICAgICBjdXN0b21lcj8uc2Vzc2lvbl9pZCA9PSBhZ2VudFNlcnZpY2UuY3VycmVudFRhc2tEZXRhaWxzPy5zZXNzaW9uX2lkICYmXG4gICAgICAoYWdlbnRTZXJ2aWNlLmlzTW9iaWxlVmlldyB8fCBhZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXcpXG4gICAgXCJcbiAgICBbbmdDbGFzc109XCJcbiAgICAgIGN1c3RvbWVyPy5zZXNzaW9uX2lkID09IGFnZW50U2VydmljZS5jdXJyZW50VGFza0RldGFpbHM/LnNlc3Npb25faWQgJiZcbiAgICAgIChhZ2VudFNlcnZpY2UuaXNNb2JpbGVWaWV3IHx8IGFnZW50U2VydmljZS5zaG93TWFwdmlldylcbiAgICAgICAgPyAnY3VzdG9tZXItdGlsZS1zZWNvbmRhcnktY29udGFpbmVyJ1xuICAgICAgICA6ICdkYXRhLWNvbGxhc3BlZCdcbiAgICBcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLXRpbGUtc2Vjb25kYXJ5LWNvbnRhaW5lci1kYXRhXCI+XG4gICAgICA8a3dpa3VpLWxhYmVsLXZhbHVlLXBhaXJcbiAgICAgICAgW2NvbmZpZ109XCJsYWJlbFZhbHVlUGFpckNvbmZpZ1wiXG4gICAgICAgIFtkYXRhXT1cImxhYmVsVmFsdWVQYWlyRGF0YVwiXG4gICAgICA+PC9rd2lrdWktbGFiZWwtdmFsdWUtcGFpcj5cbiAgICAgIDwhLS0gPGRpdlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGFnZW50U2VydmljZS5jb25maWc/Lm1hcHM/LnNobyAmJlxuICAgICAgICAgIGFnZW50U2VydmljZS5jb25maWc/LmlzU2hvd0Rpc3RhbmNlQW5kVGltZSAmJlxuICAgICAgICAgIG9wZW5TdHJlZXRNYXBzU2VydmljZS5nZXRTZWxlY3RlZFRhc2tEaXN0YW5jZUFuZFRpbWUoKVxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cImN1c3RvbWVyLXRpbGUtc2Vjb25kYXJ5LWNvbnRhaW5lci1jdXN0b20tZGV0YWlsc1wiXG4gICAgICA+XG4gICAgICAgIERpc3RhbmNlOiB7eyBvcGVuU3RyZWV0TWFwc1NlcnZpY2UuZ2V0U2VsZWN0ZWRUYXNrRGlzdGFuY2VBbmRUaW1lKCk/LmRpc3RhbmNlIH19IHxcbiAgICAgICAgVGltZToge3sgb3BlblN0cmVldE1hcHNTZXJ2aWNlLmdldFNlbGVjdGVkVGFza0Rpc3RhbmNlQW5kVGltZSgpPy50aW1lIH19XG4gICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLXRpbGUtc2Vjb25kYXJ5LWNvbnRhaW5lci1hY3Rpb25zXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29uZmlnPy50YXNrVUk/LmRldGFpbHM/LmFjdGlvblwiPlxuICAgICAgICA8a3dpa2lkLWFjdGlvbi1idXR0b25cbiAgICAgICAgICBbYWN0aW9uXT1cImFjdGlvblwiXG4gICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgIFtjdXN0b21lcl09XCJjdXN0b21lclwiXG4gICAgICAgICAgKG9uQ2xpY2tQZXJmb3JtQWN0aW9uKT1cImhhbmRsZU9uQ2xpY2tQZXJmb3JtQWN0aW9uKCRldmVudClcIlxuICAgICAgICA+PC9rd2lraWQtYWN0aW9uLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3VzdG9tZXItdGlsZS1zZWNvbmRhcnktY29udGFpbmVyLXRhc2stYnV0dG9uc1wiPlxuICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiY29uZmlnPy5pc0FsbG93UmVtb3ZlVGFza1wiXG4gICAgICAgICAgW2ljb25dPVwiJ3R1aUljb25UcmFzaDInXCJcbiAgICAgICAgICBbc2hhcGVdPVwiJ3JvdW5kZWQnXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwiaWNvblwiXG4gICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tSZW1vdmVUYXNrKGN1c3RvbWVyKVwiXG4gICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJjb25maWc/LmlzU2hvd0NvcHlMaW5rXCJcbiAgICAgICAgICBpY29uPVwidHVpSWNvbkNvcHlcIlxuICAgICAgICAgIFtzaGFwZV09XCIncm91bmRlZCdcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgKG9uQ2xpY2spPVwiXG4gICAgICAgICAgICBoYW5kbGVPbkNsaWNrTmV4dCh7XG4gICAgICAgICAgICAgIGN1c3RvbWVyOiBjdXN0b21lcixcbiAgICAgICAgICAgICAgc3RlcFR5cGU6ICdTSEFSRV9KT1VSTkVZX0xJTksnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIFwiXG4gICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b21lci10aWxlLXNlY29uZGFyeS1jb250YWluZXItam91cm5leS1idXR0b25zXCI+XG4gICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJjb25maWc/LmlzU2hvd01hcHMgJiYgY3VzdG9tZXI/LmlzVmFsaWRMb2NhdGlvblwiXG4gICAgICAgICAgbGFiZWw9XCJTaG93IERpcmVjdGlvbnNcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJmbGF0XCJcbiAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgc3R5bGVzPVwiZm9udC1zaXplOjAuN3JlbTtcIlxuICAgICAgICAgIChvbkNsaWNrKT1cImdvVG9NYXBzKGN1c3RvbWVyLmdvb2dsZU1hcHNVcmwpXCJcbiAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgY29uZmlnPy5pc0FsbG93U3RhcnRKb3VybmV5ICYmXG4gICAgICAgICAgICBhZ2VudFNlcnZpY2UuY2FuU3RhcnRKb3VybmV5KGN1c3RvbWVyLnNlc3Npb25fc3RhdHVzKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgbGFiZWw9XCJTdGFydCBKb3VybmV5XCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgIHN0eWxlcz1cImZvbnQtc2l6ZTowLjdyZW07XCJcbiAgICAgICAgICAob25DbGljayk9XCJcbiAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tOZXh0KHsgY3VzdG9tZXI6IGN1c3RvbWVyLCBzdGVwVHlwZTogJ1NUQVJUX0pPVVJORVknIH0pXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgIDwvZGl2PiAtLT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==