kwikid-agent-dashboard 0.0.38 → 0.0.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.
- package/bundles/kwikid-agent-dashboard.umd.js +2269 -351
- package/bundles/kwikid-agent-dashboard.umd.js.map +1 -1
- package/esm2015/lib/kwikid-agent-dashboard.component.js +43 -23
- package/esm2015/lib/kwikid-agent-dashboard.module.js +84 -21
- package/esm2015/lib/v1/components/action-button/action-button.component.js +91 -0
- package/esm2015/lib/v1/components/customer-details/customer-details.component.js +139 -0
- package/esm2015/lib/v1/components/customer-list/customer-list.component.js +201 -0
- package/esm2015/lib/v1/components/customer-tile/customer-tile.component.js +137 -0
- package/esm2015/lib/v1/components/customer-tile/status-pill/status-pill.component.js +54 -0
- package/esm2015/lib/v1/components/customer-tile/status-pill/status-pill.definitions.js +36 -0
- package/esm2015/lib/v1/helpers/maps.helpers.js +46 -0
- package/esm2015/lib/v1/kwikid-agent-dashboard.component.js +177 -0
- package/esm2015/lib/v1/kwikid-agent-dashboard.module.js +120 -0
- package/esm2015/lib/v1/pipes/search-filter.pipe.js +62 -0
- package/esm2015/lib/v1/services/agent.service.js +149 -0
- package/esm2015/lib/v1/services/google-maps.service.js +201 -0
- package/esm2015/lib/v1/services/open-street-maps.service.js +252 -0
- package/esm2015/lib/v2/components/agent-info/agent-info.component.js +20 -0
- package/esm2015/lib/v2/components/agent-info/agent-info.module.js +37 -0
- package/esm2015/lib/v2/components/bottom-sheet/bottom-sheet.component.js +111 -0
- package/esm2015/lib/v2/components/bottom-sheet/bottom-sheet.module.js +41 -0
- package/esm2015/lib/v2/components/components.module.js +79 -0
- package/esm2015/lib/v2/components/map-view/map-view.component.js +39 -0
- package/esm2015/lib/v2/components/map-view/map-view.module.js +37 -0
- package/esm2015/lib/v2/components/primary-actions/primary-actions.component.js +65 -0
- package/esm2015/lib/v2/components/primary-actions/primary-actions.module.js +54 -0
- package/esm2015/lib/v2/components/task-detail/task-detail.component.js +82 -0
- package/esm2015/lib/v2/components/task-detail/task-detail.module.js +41 -0
- package/esm2015/lib/v2/components/task-item/task-item.component.js +107 -0
- package/esm2015/lib/v2/components/task-item/task-item.constant.js +12 -0
- package/esm2015/lib/v2/components/task-item/task-item.module.js +45 -0
- package/esm2015/lib/v2/components/task-item-status/task-item-status.component.js +51 -0
- package/esm2015/lib/v2/components/task-item-status/task-item-status.module.js +19 -0
- package/esm2015/lib/v2/components/task-list/task-list.component.js +186 -0
- package/esm2015/lib/v2/components/task-list/task-list.module.js +57 -0
- package/esm2015/lib/v2/components/task-list-search/task-list-search.component.js +118 -0
- package/esm2015/lib/v2/components/task-list-search/task-list-search.module.js +41 -0
- package/esm2015/lib/v2/components/task-preview/task-preview.component.js +30 -0
- package/esm2015/lib/v2/components/task-preview/task-preview.module.js +37 -0
- package/esm2015/lib/v2/helpers/array.helper.js +10 -0
- package/esm2015/lib/v2/helpers/date.helplers.js +17 -0
- package/esm2015/lib/v2/kwikid-agent-dashboard.component.js +61 -0
- package/esm2015/lib/v2/kwikid-agent-dashboard.module.js +45 -0
- package/esm2015/lib/v2/layout/layout-body/layout-body.component.js +274 -0
- package/esm2015/lib/v2/layout/layout-body/layout-body.module.js +55 -0
- package/esm2015/lib/v2/layout/layout-header/layout-header.component.js +60 -0
- package/esm2015/lib/v2/layout/layout-header/layout-header.module.js +48 -0
- package/esm2015/lib/v2/layout/layout.module.js +18 -0
- package/esm2015/lib/v2/pipes/search-filter.pipe.js +62 -0
- package/fesm2015/kwikid-agent-dashboard.js +2049 -324
- package/fesm2015/kwikid-agent-dashboard.js.map +1 -1
- package/lib/kwikid-agent-dashboard.component.d.ts +11 -3
- package/lib/kwikid-agent-dashboard.module.d.ts +12 -6
- package/lib/v1/components/action-button/action-button.component.d.ts +18 -0
- package/lib/v1/components/customer-details/customer-details.component.d.ts +35 -0
- package/lib/v1/components/customer-list/customer-list.component.d.ts +55 -0
- package/lib/v1/components/customer-tile/customer-tile.component.d.ts +34 -0
- package/lib/v1/components/customer-tile/status-pill/status-pill.component.d.ts +15 -0
- package/lib/v1/components/customer-tile/status-pill/status-pill.definitions.d.ts +19 -0
- package/lib/v1/helpers/maps.helpers.d.ts +3 -0
- package/lib/v1/kwikid-agent-dashboard.component.d.ts +54 -0
- package/lib/v1/kwikid-agent-dashboard.module.d.ts +23 -0
- package/lib/{pipes → v1/pipes}/search-filter.pipe.d.ts +1 -1
- package/lib/v1/services/agent.service.d.ts +77 -0
- package/lib/v1/services/google-maps.service.d.ts +29 -0
- package/lib/v1/services/open-street-maps.service.d.ts +39 -0
- package/lib/{components → v2/components}/agent-info/agent-info.component.d.ts +1 -1
- package/lib/{components → v2/components}/bottom-sheet/bottom-sheet.component.d.ts +2 -2
- package/lib/{components → v2/components}/map-view/map-view.component.d.ts +1 -1
- package/lib/{components → v2/components}/primary-actions/primary-actions.component.d.ts +1 -1
- package/lib/{components → v2/components}/task-detail/task-detail.component.d.ts +1 -1
- package/lib/{components → v2/components}/task-item/task-item.component.d.ts +1 -1
- package/lib/{components → v2/components}/task-item-status/task-item-status.component.d.ts +1 -1
- package/lib/{components → v2/components}/task-list/task-list.component.d.ts +4 -4
- package/lib/{components → v2/components}/task-list-search/task-list-search.component.d.ts +3 -3
- package/lib/{components → v2/components}/task-preview/task-preview.component.d.ts +1 -1
- package/lib/v2/kwikid-agent-dashboard.component.d.ts +17 -0
- package/lib/v2/kwikid-agent-dashboard.module.d.ts +13 -0
- package/lib/{layout → v2/layout}/layout-body/layout-body.component.d.ts +3 -3
- package/lib/{layout → v2/layout}/layout-header/layout-header.component.d.ts +1 -1
- package/lib/v2/pipes/search-filter.pipe.d.ts +25 -0
- package/package.json +1 -1
- package/esm2015/lib/components/agent-info/agent-info.component.js +0 -20
- package/esm2015/lib/components/agent-info/agent-info.module.js +0 -37
- package/esm2015/lib/components/bottom-sheet/bottom-sheet.component.js +0 -111
- package/esm2015/lib/components/bottom-sheet/bottom-sheet.module.js +0 -41
- package/esm2015/lib/components/components.module.js +0 -79
- package/esm2015/lib/components/map-view/map-view.component.js +0 -39
- package/esm2015/lib/components/map-view/map-view.module.js +0 -37
- package/esm2015/lib/components/primary-actions/primary-actions.component.js +0 -65
- package/esm2015/lib/components/primary-actions/primary-actions.module.js +0 -54
- package/esm2015/lib/components/task-detail/task-detail.component.js +0 -82
- package/esm2015/lib/components/task-detail/task-detail.module.js +0 -41
- package/esm2015/lib/components/task-item/task-item.component.js +0 -109
- package/esm2015/lib/components/task-item/task-item.constant.js +0 -12
- package/esm2015/lib/components/task-item/task-item.module.js +0 -45
- package/esm2015/lib/components/task-item-status/task-item-status.component.js +0 -51
- package/esm2015/lib/components/task-item-status/task-item-status.module.js +0 -19
- package/esm2015/lib/components/task-list/task-list.component.js +0 -186
- package/esm2015/lib/components/task-list/task-list.module.js +0 -57
- package/esm2015/lib/components/task-list-search/task-list-search.component.js +0 -117
- package/esm2015/lib/components/task-list-search/task-list-search.module.js +0 -41
- package/esm2015/lib/components/task-preview/task-preview.component.js +0 -30
- package/esm2015/lib/components/task-preview/task-preview.module.js +0 -37
- package/esm2015/lib/helpers/array.helper.js +0 -10
- package/esm2015/lib/helpers/date.helplers.js +0 -17
- package/esm2015/lib/layout/layout-body/layout-body.component.js +0 -274
- package/esm2015/lib/layout/layout-body/layout-body.module.js +0 -55
- package/esm2015/lib/layout/layout-header/layout-header.component.js +0 -60
- package/esm2015/lib/layout/layout-header/layout-header.module.js +0 -48
- package/esm2015/lib/layout/layout.module.js +0 -18
- package/esm2015/lib/pipes/search-filter.pipe.js +0 -62
- package/lib/{components → v2/components}/agent-info/agent-info.module.d.ts +0 -0
- package/lib/{components → v2/components}/bottom-sheet/bottom-sheet.module.d.ts +0 -0
- package/lib/{components → v2/components}/components.module.d.ts +0 -0
- package/lib/{components → v2/components}/map-view/map-view.module.d.ts +0 -0
- package/lib/{components → v2/components}/primary-actions/primary-actions.module.d.ts +0 -0
- package/lib/{components → v2/components}/task-detail/task-detail.module.d.ts +0 -0
- package/lib/{components → v2/components}/task-item/task-item.constant.d.ts +0 -0
- package/lib/{components → v2/components}/task-item/task-item.module.d.ts +0 -0
- package/lib/{components → v2/components}/task-item-status/task-item-status.module.d.ts +0 -0
- package/lib/{components → v2/components}/task-list/task-list.module.d.ts +0 -0
- package/lib/{components → v2/components}/task-list-search/task-list-search.module.d.ts +0 -0
- package/lib/{components → v2/components}/task-preview/task-preview.module.d.ts +0 -0
- package/lib/{helpers → v2/helpers}/array.helper.d.ts +0 -0
- package/lib/{helpers → v2/helpers}/date.helplers.d.ts +1 -1
- /package/lib/{layout → v2/layout}/layout-body/layout-body.module.d.ts +0 -0
- /package/lib/{layout → v2/layout}/layout-header/layout-header.module.d.ts +0 -0
- /package/lib/{layout → v2/layout}/layout.module.d.ts +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable, ViewChildren } from "@angular/core";
|
|
3
|
+
import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from "kwikid-toolkit";
|
|
4
|
+
import { map } from "rxjs/operators";
|
|
5
|
+
import { addressConcator, nearestNeighborAlgorithm } from "../helpers/maps.helpers";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./agent.service";
|
|
8
|
+
import * as i2 from "@angular/google-maps";
|
|
9
|
+
import * as i3 from "@angular/common/http";
|
|
10
|
+
export class GoogleMapsService {
|
|
11
|
+
constructor(agentService, mapDirectionsService, httpClient) {
|
|
12
|
+
this.agentService = agentService;
|
|
13
|
+
this.mapDirectionsService = mapDirectionsService;
|
|
14
|
+
this.httpClient = httpClient;
|
|
15
|
+
this.allMarkers = [];
|
|
16
|
+
}
|
|
17
|
+
// To get Current Position
|
|
18
|
+
getPosition() {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
navigator.geolocation.watchPosition((resp) => {
|
|
21
|
+
resolve({
|
|
22
|
+
lng: resp.coords.longitude,
|
|
23
|
+
lat: resp.coords.latitude
|
|
24
|
+
});
|
|
25
|
+
}, (err) => {
|
|
26
|
+
reject(err);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// To Initialize Google Maps
|
|
31
|
+
initializeMap() {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
this.myPosition = yield this.getPosition();
|
|
34
|
+
this.map = {
|
|
35
|
+
zoom: 10,
|
|
36
|
+
center: this.myPosition,
|
|
37
|
+
streetViewControl: false,
|
|
38
|
+
mapTypeControl: false,
|
|
39
|
+
fullscreenControl: false,
|
|
40
|
+
zoomControl: false
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// To extract Location from the Task Details
|
|
45
|
+
getLocation(task) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
49
|
+
let encodedAddres;
|
|
50
|
+
// If Fetch Address from Multiple Paths
|
|
51
|
+
if (checkObjectPathExists(this.agentService.config, "dashboard.taskLocationPaths")) {
|
|
52
|
+
// Get address string from multiple paths
|
|
53
|
+
const config = this.agentService.config.dashboard.taskLocationPaths;
|
|
54
|
+
const address = addressConcator(task, config);
|
|
55
|
+
// Encode the Address in URI
|
|
56
|
+
encodedAddres = encodeURI(address);
|
|
57
|
+
}
|
|
58
|
+
// If Fetch Address from Single Path
|
|
59
|
+
else if (checkObjectPathExists(this.agentService.config, "dashboard.taskLocationPath")) {
|
|
60
|
+
// Get Address from Single Path
|
|
61
|
+
const config = this.agentService.config.dashboard.taskLocationPath;
|
|
62
|
+
const address = getObjectValueFromPath(task, config);
|
|
63
|
+
// Encode the Address in URI
|
|
64
|
+
encodedAddres = encodeURI(address);
|
|
65
|
+
}
|
|
66
|
+
// Default Address Paths Avaiable
|
|
67
|
+
else {
|
|
68
|
+
const address = (_k = (_j = (_g = (_d = (_c = (_b = (_a = task === null || task === void 0 ? void 0 : task.extras) === null || _a === void 0 ? void 0 : _a.task_details) === null || _b === void 0 ? void 0 : _b.customer_details) === null || _c === void 0 ? void 0 : _c.address) !== null && _d !== void 0 ? _d : (_f = (_e = task === null || task === void 0 ? void 0 : task.task_details) === null || _e === void 0 ? void 0 : _e.customer_details) === null || _f === void 0 ? void 0 : _f.address) !== null && _g !== void 0 ? _g : (_h = task === null || task === void 0 ? void 0 : task.extras) === null || _h === void 0 ? void 0 : _h.address) !== null && _j !== void 0 ? _j : task === null || task === void 0 ? void 0 : task.address) !== null && _k !== void 0 ? _k : "";
|
|
69
|
+
// Encode the Address in URI
|
|
70
|
+
encodedAddres = encodeURI(address);
|
|
71
|
+
}
|
|
72
|
+
// URL to geocode Address String to Latitude & Longitude
|
|
73
|
+
const url = `https://maps.googleapis.com/maps/api/geocode/json?key=${this.apiKey}&address=${encodedAddres}`;
|
|
74
|
+
const response = yield fetch(url);
|
|
75
|
+
const data = yield response.json();
|
|
76
|
+
// Set Location {lat: LAT, lng: LNG} from address geocoded
|
|
77
|
+
const isValidLocation = isNotEmptyArray(data === null || data === void 0 ? void 0 : data.results);
|
|
78
|
+
const location = isValidLocation
|
|
79
|
+
? (_m = (_l = data === null || data === void 0 ? void 0 : data.results[0]) === null || _l === void 0 ? void 0 : _l.geometry) === null || _m === void 0 ? void 0 : _m.location
|
|
80
|
+
: { lat: null, lng: null };
|
|
81
|
+
// Set Location validation & Google Maps URL
|
|
82
|
+
location.isValidLocation = isValidLocation;
|
|
83
|
+
location.googleMapsUrl = `https://www.google.com/maps/place/${location === null || location === void 0 ? void 0 : location.lat},${location === null || location === void 0 ? void 0 : location.lng}`;
|
|
84
|
+
resolve(location);
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Get Tasks | Markers Location Co Ordinates
|
|
89
|
+
getMarkersLocation(myMarker, tasks) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
const markers = [];
|
|
93
|
+
markers.push(myMarker);
|
|
94
|
+
const promises = tasks.map((task) => __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
const marker = yield this.getLocation(task);
|
|
96
|
+
task = Object.assign(Object.assign({}, task), marker);
|
|
97
|
+
markers.push(task);
|
|
98
|
+
}));
|
|
99
|
+
yield Promise.all(promises);
|
|
100
|
+
resolve(markers);
|
|
101
|
+
}));
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// Plot All Markers
|
|
105
|
+
plotAllMarkers(tasks) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const path = [];
|
|
109
|
+
const promises = tasks.map((task) => {
|
|
110
|
+
if (task === null || task === void 0 ? void 0 : task.isValidLocation) {
|
|
111
|
+
path.push({
|
|
112
|
+
location: task,
|
|
113
|
+
stopover: true
|
|
114
|
+
});
|
|
115
|
+
this.allMarkers.push(task);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
yield Promise.all(promises);
|
|
119
|
+
resolve(path);
|
|
120
|
+
}));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// To Plot Directions for All Tasks
|
|
124
|
+
plotDirectionsForAllTasks(tasks) {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
this.allMarkers = [];
|
|
127
|
+
// Create Agent Marker & Plot It.
|
|
128
|
+
const myMarker = {
|
|
129
|
+
lat: this.myPosition.lat,
|
|
130
|
+
lng: this.myPosition.lng,
|
|
131
|
+
title: 0,
|
|
132
|
+
color: "red"
|
|
133
|
+
};
|
|
134
|
+
// Get All Markers Location Co Ordinates
|
|
135
|
+
const markers = yield this.getMarkersLocation(myMarker, tasks);
|
|
136
|
+
// Run Algorithm to get optimized Routes
|
|
137
|
+
const startingPoint = markers[0];
|
|
138
|
+
const unvisitedWaypoints = markers.slice(1);
|
|
139
|
+
const optimizedRoute = nearestNeighborAlgorithm(startingPoint, unvisitedWaypoints);
|
|
140
|
+
// Sort All Tasks as per optimized routes
|
|
141
|
+
tasks = optimizedRoute.slice(1);
|
|
142
|
+
this.allMarkers = [myMarker];
|
|
143
|
+
// Plot all markers & get path for directions
|
|
144
|
+
const path = yield this.plotAllMarkers(tasks);
|
|
145
|
+
// Set Directions in Google Maps
|
|
146
|
+
const request = {
|
|
147
|
+
origin: this.myPosition,
|
|
148
|
+
destination: this.myPosition,
|
|
149
|
+
waypoints: path,
|
|
150
|
+
travelMode: google.maps.TravelMode.DRIVING
|
|
151
|
+
};
|
|
152
|
+
this.directionsRenderOption = {
|
|
153
|
+
suppressMarkers: true
|
|
154
|
+
};
|
|
155
|
+
this.directionsResults$ = this.mapDirectionsService
|
|
156
|
+
.route(request)
|
|
157
|
+
.pipe(map((response) => response.result));
|
|
158
|
+
this.directionsResults$.subscribe((val) => { });
|
|
159
|
+
this.allDirectionsResults$ = this.directionsResults$;
|
|
160
|
+
return tasks;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// To Plot Directions for Selected Tasks
|
|
164
|
+
plotDirectionsForSelectedTask(task) {
|
|
165
|
+
if (task != null) {
|
|
166
|
+
const taskMarker = task;
|
|
167
|
+
// If Location is Available in Task Details
|
|
168
|
+
if (taskMarker === null || taskMarker === void 0 ? void 0 : taskMarker.isValidLocation) {
|
|
169
|
+
const request = {
|
|
170
|
+
origin: this.myPosition,
|
|
171
|
+
destination: taskMarker,
|
|
172
|
+
optimizeWaypoints: true,
|
|
173
|
+
travelMode: google.maps.TravelMode.DRIVING
|
|
174
|
+
};
|
|
175
|
+
this.directionsResults$ = this.mapDirectionsService
|
|
176
|
+
.route(request)
|
|
177
|
+
.pipe(map((response) => response.result));
|
|
178
|
+
this.directionsResults$.subscribe();
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
alert("No Location Available");
|
|
182
|
+
this.directionsResults$ = this.allDirectionsResults$;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
this.directionsResults$ = this.allDirectionsResults$;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** @nocollapse */ GoogleMapsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, deps: [{ token: i1.AgentService }, { token: i2.MapDirectionsService }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
191
|
+
/** @nocollapse */ GoogleMapsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, providedIn: "root" });
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: GoogleMapsService, decorators: [{
|
|
193
|
+
type: Injectable,
|
|
194
|
+
args: [{
|
|
195
|
+
providedIn: "root"
|
|
196
|
+
}]
|
|
197
|
+
}], ctorParameters: function () { return [{ type: i1.AgentService }, { type: i2.MapDirectionsService }, { type: i3.HttpClient }]; }, propDecorators: { directionsRenders: [{
|
|
198
|
+
type: ViewChildren,
|
|
199
|
+
args: ["directionsRender"]
|
|
200
|
+
}] } });
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQvc3JjL2xpYi92MS9zZXJ2aWNlcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFDTCxlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3pCLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBS2pDLE1BQU0sT0FBTyxpQkFBaUI7SUFtQjVCLFlBQ1UsWUFBMEIsRUFDM0Isb0JBQTBDLEVBQzFDLFVBQXNCO1FBRnJCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWYvQixlQUFVLEdBQVEsRUFBRSxDQUFDO0lBZ0JsQixDQUFDO0lBRUosMEJBQTBCO0lBQzFCLFdBQVc7UUFDVCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUNqQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLE9BQU8sQ0FBQztvQkFDTixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUMxQixDQUFDLENBQUM7WUFDTCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDTixNQUFN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O1lBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztZQUV4QiwyQ0FBMkM7WUFDM0MsSUFBSSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsZUFBZSxFQUFFO2dCQUMvQixNQUFNLE9BQU8sR0FBa0M7b0JBQzdDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDdkIsV0FBVyxFQUFFLFVBQVU7b0JBQ3ZCLGlCQUFpQixFQUFFLElBQUk7b0JBQ3ZCLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPO2lCQUMzQyxDQUFDO2dCQUVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CO3FCQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDO3FCQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUU1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7YUFDdEQ7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztTQUN0RDtJQUNILENBQUM7O2tJQS9PVSxpQkFBaUI7c0lBQWpCLGlCQUFpQixjQUZoQixNQUFNOzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7K0pBZ0JtQyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBpc05vdEVtcHR5QXJyYXlcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5cbmltcG9ydCB7IE1hcERpcmVjdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkBhbmd1bGFyL2dvb2dsZS1tYXBzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IEFnZW50U2VydmljZSB9IGZyb20gXCIuL2FnZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIGFkZHJlc3NDb25jYXRvcixcbiAgbmVhcmVzdE5laWdoYm9yQWxnb3JpdGhtXG59IGZyb20gXCIuLi9oZWxwZXJzL21hcHMuaGVscGVyc1wiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXG59KVxuZXhwb3J0IGNsYXNzIEdvb2dsZU1hcHNTZXJ2aWNlIHtcbiAgbXlQb3NpdGlvbjtcblxuICBtYXA6IGFueTtcblxuICBhcGlLZXk6IGFueTtcblxuICBhbGxNYXJrZXJzOiBhbnkgPSBbXTtcblxuICBkaXJlY3Rpb25zUmVuZGVyT3B0aW9uOiBhbnk7XG5cbiAgZGlyZWN0aW9uc1Jlc3VsdHMkOiBhbnk7XG5cbiAgYWxsRGlyZWN0aW9uc1Jlc3VsdHMkOiBhbnk7XG5cbiAgQFZpZXdDaGlsZHJlbihcImRpcmVjdGlvbnNSZW5kZXJcIikgZGlyZWN0aW9uc1JlbmRlcnM6IFF1ZXJ5TGlzdDxcbiAgICBFbGVtZW50UmVmPGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcj5cbiAgPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFnZW50U2VydmljZTogQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBtYXBEaXJlY3Rpb25zU2VydmljZTogTWFwRGlyZWN0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7fVxuXG4gIC8vIFRvIGdldCBDdXJyZW50IFBvc2l0aW9uXG4gIGdldFBvc2l0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKFxuICAgICAgICAocmVzcCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgbG5nOiByZXNwLmNvb3Jkcy5sb25naXR1ZGUsXG4gICAgICAgICAgICBsYXQ6IHJlc3AuY29vcmRzLmxhdGl0dWRlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRvIEluaXRpYWxpemUgR29vZ2xlIE1hcHNcbiAgYXN5bmMgaW5pdGlhbGl6ZU1hcCgpIHtcbiAgICB0aGlzLm15UG9zaXRpb24gPSBhd2FpdCB0aGlzLmdldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5tYXAgPSB7XG4gICAgICB6b29tOiAxMCxcbiAgICAgIGNlbnRlcjogdGhpcy5teVBvc2l0aW9uLFxuICAgICAgc3RyZWV0Vmlld0NvbnRyb2w6IGZhbHNlLFxuICAgICAgbWFwVHlwZUNvbnRyb2w6IGZhbHNlLFxuICAgICAgZnVsbHNjcmVlbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgem9vbUNvbnRyb2w6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRvIGV4dHJhY3QgTG9jYXRpb24gZnJvbSB0aGUgVGFzayBEZXRhaWxzXG4gIGFzeW5jIGdldExvY2F0aW9uKHRhc2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IGVuY29kZWRBZGRyZXM7XG5cbiAgICAgIC8vIElmIEZldGNoIEFkZHJlc3MgZnJvbSBNdWx0aXBsZSBQYXRoc1xuICAgICAgaWYgKFxuICAgICAgICBjaGVja09iamVjdFBhdGhFeGlzdHMoXG4gICAgICAgICAgdGhpcy5hZ2VudFNlcnZpY2UuY29uZmlnLFxuICAgICAgICAgIFwiZGFzaGJvYXJkLnRhc2tMb2NhdGlvblBhdGhzXCJcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEdldCBhZGRyZXNzIHN0cmluZyBmcm9tIG11bHRpcGxlIHBhdGhzXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZy5kYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aHM7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBhZGRyZXNzQ29uY2F0b3IodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIEZldGNoIEFkZHJlc3MgZnJvbSBTaW5nbGUgUGF0aFxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0UGF0aEV4aXN0cyhcbiAgICAgICAgICB0aGlzLmFnZW50U2VydmljZS5jb25maWcsXG4gICAgICAgICAgXCJkYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aFwiXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICAvLyBHZXQgQWRkcmVzcyBmcm9tIFNpbmdsZSBQYXRoXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZy5kYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aDtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgQWRkcmVzcyBQYXRocyBBdmFpYWJsZVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRhc2s/LmV4dHJhcz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uZXh0cmFzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uYWRkcmVzcyA/P1xuICAgICAgICAgIFwiXCI7XG5cbiAgICAgICAgLy8gRW5jb2RlIHRoZSBBZGRyZXNzIGluIFVSSVxuICAgICAgICBlbmNvZGVkQWRkcmVzID0gZW5jb2RlVVJJKGFkZHJlc3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBVUkwgdG8gZ2VvY29kZSBBZGRyZXNzIFN0cmluZyB0byBMYXRpdHVkZSAmIExvbmdpdHVkZVxuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9nZW9jb2RlL2pzb24/a2V5PSR7dGhpcy5hcGlLZXl9JmFkZHJlc3M9JHtlbmNvZGVkQWRkcmVzfWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgLy8gU2V0IExvY2F0aW9uIHtsYXQ6IExBVCwgbG5nOiBMTkd9IGZyb20gYWRkcmVzcyBnZW9jb2RlZFxuICAgICAgY29uc3QgaXNWYWxpZExvY2F0aW9uID0gaXNOb3RFbXB0eUFycmF5KGRhdGE/LnJlc3VsdHMpO1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBpc1ZhbGlkTG9jYXRpb25cbiAgICAgICAgPyBkYXRhPy5yZXN1bHRzWzBdPy5nZW9tZXRyeT8ubG9jYXRpb25cbiAgICAgICAgOiB7IGxhdDogbnVsbCwgbG5nOiBudWxsIH07XG5cbiAgICAgIC8vIFNldCBMb2NhdGlvbiB2YWxpZGF0aW9uICYgR29vZ2xlIE1hcHMgVVJMXG4gICAgICBsb2NhdGlvbi5pc1ZhbGlkTG9jYXRpb24gPSBpc1ZhbGlkTG9jYXRpb247XG4gICAgICBsb2NhdGlvbi5nb29nbGVNYXBzVXJsID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9wbGFjZS8ke2xvY2F0aW9uPy5sYXR9LCR7bG9jYXRpb24/LmxuZ31gO1xuXG4gICAgICByZXNvbHZlKGxvY2F0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBUYXNrcyB8IE1hcmtlcnMgTG9jYXRpb24gQ28gT3JkaW5hdGVzXG4gIGFzeW5jIGdldE1hcmtlcnNMb2NhdGlvbihteU1hcmtlciwgdGFza3MpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgbWFya2VycyA9IFtdO1xuICAgICAgbWFya2Vycy5wdXNoKG15TWFya2VyKTtcbiAgICAgIGNvbnN0IHByb21pc2VzID0gdGFza3MubWFwKGFzeW5jKHRhc2spID0+IHtcbiAgICAgICAgY29uc3QgbWFya2VyOiBhbnkgPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uKHRhc2spO1xuICAgICAgICB0YXNrID0geyAuLi50YXNrLCAuLi5tYXJrZXIgfTtcbiAgICAgICAgbWFya2Vycy5wdXNoKHRhc2spO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgICAgcmVzb2x2ZShtYXJrZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBsb3QgQWxsIE1hcmtlcnNcbiAgYXN5bmMgcGxvdEFsbE1hcmtlcnModGFza3MpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IFtdO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXNrcy5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgaWYgKHRhc2s/LmlzVmFsaWRMb2NhdGlvbikge1xuICAgICAgICAgIHBhdGgucHVzaCh7XG4gICAgICAgICAgICBsb2NhdGlvbjogdGFzayxcbiAgICAgICAgICAgIHN0b3BvdmVyOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hbGxNYXJrZXJzLnB1c2godGFzayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICAgIHJlc29sdmUocGF0aCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUbyBQbG90IERpcmVjdGlvbnMgZm9yIEFsbCBUYXNrc1xuICBhc3luYyBwbG90RGlyZWN0aW9uc0ZvckFsbFRhc2tzKHRhc2tzKSB7XG4gICAgdGhpcy5hbGxNYXJrZXJzID0gW107XG5cbiAgICAvLyBDcmVhdGUgQWdlbnQgTWFya2VyICYgUGxvdCBJdC5cbiAgICBjb25zdCBteU1hcmtlciA9IHtcbiAgICAgIGxhdDogdGhpcy5teVBvc2l0aW9uLmxhdCxcbiAgICAgIGxuZzogdGhpcy5teVBvc2l0aW9uLmxuZyxcbiAgICAgIHRpdGxlOiAwLFxuICAgICAgY29sb3I6IFwicmVkXCJcbiAgICB9O1xuXG4gICAgLy8gR2V0IEFsbCBNYXJrZXJzIExvY2F0aW9uIENvIE9yZGluYXRlc1xuICAgIGNvbnN0IG1hcmtlcnM6IGFueSA9IGF3YWl0IHRoaXMuZ2V0TWFya2Vyc0xvY2F0aW9uKG15TWFya2VyLCB0YXNrcyk7XG5cbiAgICAvLyBSdW4gQWxnb3JpdGhtIHRvIGdldCBvcHRpbWl6ZWQgUm91dGVzXG4gICAgY29uc3Qgc3RhcnRpbmdQb2ludCA9IG1hcmtlcnNbMF07XG4gICAgY29uc3QgdW52aXNpdGVkV2F5cG9pbnRzID0gbWFya2Vycy5zbGljZSgxKTtcbiAgICBjb25zdCBvcHRpbWl6ZWRSb3V0ZSA9IG5lYXJlc3ROZWlnaGJvckFsZ29yaXRobShcbiAgICAgIHN0YXJ0aW5nUG9pbnQsXG4gICAgICB1bnZpc2l0ZWRXYXlwb2ludHNcbiAgICApO1xuXG4gICAgLy8gU29ydCBBbGwgVGFza3MgYXMgcGVyIG9wdGltaXplZCByb3V0ZXNcbiAgICB0YXNrcyA9IG9wdGltaXplZFJvdXRlLnNsaWNlKDEpO1xuICAgIHRoaXMuYWxsTWFya2VycyA9IFtteU1hcmtlcl07XG5cbiAgICAvLyBQbG90IGFsbCBtYXJrZXJzICYgZ2V0IHBhdGggZm9yIGRpcmVjdGlvbnNcbiAgICBjb25zdCBwYXRoOiBhbnkgPSBhd2FpdCB0aGlzLnBsb3RBbGxNYXJrZXJzKHRhc2tzKTtcblxuICAgIC8vIFNldCBEaXJlY3Rpb25zIGluIEdvb2dsZSBNYXBzXG4gICAgY29uc3QgcmVxdWVzdDogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlcXVlc3QgPSB7XG4gICAgICBvcmlnaW46IHRoaXMubXlQb3NpdGlvbixcbiAgICAgIGRlc3RpbmF0aW9uOiB0aGlzLm15UG9zaXRpb24sXG4gICAgICB3YXlwb2ludHM6IHBhdGgsXG4gICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlLkRSSVZJTkdcbiAgICB9O1xuXG4gICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyT3B0aW9uID0ge1xuICAgICAgc3VwcHJlc3NNYXJrZXJzOiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMuZGlyZWN0aW9uc1Jlc3VsdHMkID0gdGhpcy5tYXBEaXJlY3Rpb25zU2VydmljZVxuICAgICAgLnJvdXRlKHJlcXVlc3QpXG4gICAgICAucGlwZShtYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQpKTtcblxuICAgIHRoaXMuZGlyZWN0aW9uc1Jlc3VsdHMkLnN1YnNjcmliZSgodmFsKSA9PiB7fSk7XG5cbiAgICB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJCA9IHRoaXMuZGlyZWN0aW9uc1Jlc3VsdHMkO1xuXG4gICAgcmV0dXJuIHRhc2tzO1xuICB9XG5cbiAgLy8gVG8gUGxvdCBEaXJlY3Rpb25zIGZvciBTZWxlY3RlZCBUYXNrc1xuICBwbG90RGlyZWN0aW9uc0ZvclNlbGVjdGVkVGFzayh0YXNrKSB7XG4gICAgaWYgKHRhc2sgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdGFza01hcmtlciA9IHRhc2s7XG5cbiAgICAgIC8vIElmIExvY2F0aW9uIGlzIEF2YWlsYWJsZSBpbiBUYXNrIERldGFpbHNcbiAgICAgIGlmICh0YXNrTWFya2VyPy5pc1ZhbGlkTG9jYXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdDogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlcXVlc3QgPSB7XG4gICAgICAgICAgb3JpZ2luOiB0aGlzLm15UG9zaXRpb24sXG4gICAgICAgICAgZGVzdGluYXRpb246IHRhc2tNYXJrZXIsXG4gICAgICAgICAgb3B0aW1pemVXYXlwb2ludHM6IHRydWUsXG4gICAgICAgICAgdHJhdmVsTW9kZTogZ29vZ2xlLm1hcHMuVHJhdmVsTW9kZS5EUklWSU5HXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLm1hcERpcmVjdGlvbnNTZXJ2aWNlXG4gICAgICAgICAgLnJvdXRlKHJlcXVlc3QpXG4gICAgICAgICAgLnBpcGUobWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVzdWx0KSk7XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQuc3Vic2NyaWJlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGVydChcIk5vIExvY2F0aW9uIEF2YWlsYWJsZVwiKTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVzdWx0cyQgPSB0aGlzLmFsbERpcmVjdGlvbnNSZXN1bHRzJDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable, ViewChildren } from "@angular/core";
|
|
3
|
+
import * as L from "leaflet";
|
|
4
|
+
import "leaflet-routing-machine";
|
|
5
|
+
import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from "kwikid-toolkit";
|
|
6
|
+
import { addressConcator, nearestNeighborAlgorithm } from "../helpers/maps.helpers";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./agent.service";
|
|
9
|
+
import * as i2 from "@angular/google-maps";
|
|
10
|
+
import * as i3 from "@angular/common/http";
|
|
11
|
+
export class OpenStreetMapsService {
|
|
12
|
+
constructor(agentService, mapDirectionsService, httpClient) {
|
|
13
|
+
this.agentService = agentService;
|
|
14
|
+
this.mapDirectionsService = mapDirectionsService;
|
|
15
|
+
this.httpClient = httpClient;
|
|
16
|
+
this.allMarkers = [];
|
|
17
|
+
}
|
|
18
|
+
// To get Current Position
|
|
19
|
+
getPosition() {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
navigator.geolocation.watchPosition((resp) => {
|
|
22
|
+
resolve({
|
|
23
|
+
lng: resp.coords.longitude,
|
|
24
|
+
lat: resp.coords.latitude
|
|
25
|
+
});
|
|
26
|
+
}, (err) => {
|
|
27
|
+
reject(err);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// To extract Location from the Task Details
|
|
32
|
+
getLocation(task) {
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
36
|
+
let encodedAddres;
|
|
37
|
+
// If Fetch Address from Multiple Paths
|
|
38
|
+
if (checkObjectPathExists(this.agentService.config, "dashboard.taskLocationPaths")) {
|
|
39
|
+
// Get address string from multiple paths
|
|
40
|
+
const config = this.agentService.config.dashboard.taskLocationPaths;
|
|
41
|
+
const address = addressConcator(task, config);
|
|
42
|
+
// Encode the Address in URI
|
|
43
|
+
encodedAddres = encodeURI(address);
|
|
44
|
+
}
|
|
45
|
+
// If Fetch Address from Single Path
|
|
46
|
+
else if (checkObjectPathExists(this.agentService.config, "dashboard.taskLocationPath")) {
|
|
47
|
+
// Get Address from Single Path
|
|
48
|
+
const config = this.agentService.config.dashboard.taskLocationPath;
|
|
49
|
+
const address = getObjectValueFromPath(task, config);
|
|
50
|
+
// Encode the Address in URI
|
|
51
|
+
encodedAddres = encodeURI(address);
|
|
52
|
+
}
|
|
53
|
+
// Default Address Paths Avaiable
|
|
54
|
+
else {
|
|
55
|
+
const address = (_k = (_j = (_g = (_d = (_c = (_b = (_a = task === null || task === void 0 ? void 0 : task.extras) === null || _a === void 0 ? void 0 : _a.task_details) === null || _b === void 0 ? void 0 : _b.customer_details) === null || _c === void 0 ? void 0 : _c.address) !== null && _d !== void 0 ? _d : (_f = (_e = task === null || task === void 0 ? void 0 : task.task_details) === null || _e === void 0 ? void 0 : _e.customer_details) === null || _f === void 0 ? void 0 : _f.address) !== null && _g !== void 0 ? _g : (_h = task === null || task === void 0 ? void 0 : task.extras) === null || _h === void 0 ? void 0 : _h.address) !== null && _j !== void 0 ? _j : task === null || task === void 0 ? void 0 : task.address) !== null && _k !== void 0 ? _k : "";
|
|
56
|
+
// Encode the Address in URI
|
|
57
|
+
encodedAddres = encodeURI(address);
|
|
58
|
+
}
|
|
59
|
+
// URL to geocode Address String to Latitude & Longitude
|
|
60
|
+
const url = `https://nominatim.openstreetmap.org/search?q=${encodedAddres}&format=json`;
|
|
61
|
+
const response = yield fetch(url);
|
|
62
|
+
const data = yield response.json();
|
|
63
|
+
// Set Location {lat: LAT, lng: LNG} from address geocoded
|
|
64
|
+
const isValidLocation = isNotEmptyArray(data) && ((_l = data[0]) === null || _l === void 0 ? void 0 : _l.lat) & ((_m = data[0]) === null || _m === void 0 ? void 0 : _m.lon);
|
|
65
|
+
const location = isValidLocation
|
|
66
|
+
? { lat: (_o = data[0]) === null || _o === void 0 ? void 0 : _o.lat, lng: (_p = data[0]) === null || _p === void 0 ? void 0 : _p.lon }
|
|
67
|
+
: { lat: null, lng: null };
|
|
68
|
+
// Set Location validation & Google Maps URL
|
|
69
|
+
location.isValidLocation = isValidLocation;
|
|
70
|
+
location.color = isValidLocation ? "blue" : "red";
|
|
71
|
+
location.googleMapsUrl = `https://www.google.com/maps/place/${location === null || location === void 0 ? void 0 : location.lat},${location === null || location === void 0 ? void 0 : location.lng}`;
|
|
72
|
+
resolve(location);
|
|
73
|
+
}));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Get Tasks | Markers Location Co Ordinates
|
|
77
|
+
getMarkersLocation(myMarker, tasks) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
const markers = [];
|
|
81
|
+
markers.push(myMarker);
|
|
82
|
+
const promises = tasks.map((task) => __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
const marker = yield this.getLocation(task);
|
|
84
|
+
task = Object.assign(Object.assign({}, task), marker);
|
|
85
|
+
markers.push(task);
|
|
86
|
+
}));
|
|
87
|
+
yield Promise.all(promises);
|
|
88
|
+
resolve(markers);
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// To Initialize Open Street Map
|
|
93
|
+
initializeMap() {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
console.log("Running Init Open Street Maps");
|
|
96
|
+
this.myPosition = yield this.getPosition();
|
|
97
|
+
this.map = L.map("map", {
|
|
98
|
+
center: [this.myPosition.lat, this.myPosition.lng],
|
|
99
|
+
zoom: 11
|
|
100
|
+
});
|
|
101
|
+
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png").addTo(this.map);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// To Add Open Street Marker in Map
|
|
105
|
+
addMarker({ lat, lng, title, color }) {
|
|
106
|
+
L.marker([lat, lng], {
|
|
107
|
+
icon: L.icon({
|
|
108
|
+
iconUrl: color == "red"
|
|
109
|
+
? "https://kwikid.s3.ap-south-1.amazonaws.com/CONFIG/USER/assets/map-marker-0.png"
|
|
110
|
+
: "https://kwikid.s3.ap-south-1.amazonaws.com/CONFIG/USER/assets/map-marker-1.png"
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
.addTo(this.map)
|
|
114
|
+
.bindPopup(title);
|
|
115
|
+
}
|
|
116
|
+
// To Plot Open Street Directions for All Tasks
|
|
117
|
+
plotDirectionsForAllTasks(tasks) {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
if (this.map) {
|
|
120
|
+
this.allMarkers = [];
|
|
121
|
+
// Create Agent Marker & Plot It.
|
|
122
|
+
const myMarker = {
|
|
123
|
+
lat: this.myPosition.lat,
|
|
124
|
+
lng: this.myPosition.lng,
|
|
125
|
+
title: 0,
|
|
126
|
+
color: "red"
|
|
127
|
+
};
|
|
128
|
+
this.addMarker(myMarker);
|
|
129
|
+
this.allMarkers.push(myMarker);
|
|
130
|
+
// Create Markers for all Tasks
|
|
131
|
+
this.allMarkers = yield this.getMarkersLocation(myMarker, tasks);
|
|
132
|
+
// Run Algorithm to get optimized Routes
|
|
133
|
+
const startingPoint = this.allMarkers[0];
|
|
134
|
+
const unvisitedWaypoints = this.allMarkers.slice(1);
|
|
135
|
+
const optimizedRoute = nearestNeighborAlgorithm(startingPoint, unvisitedWaypoints);
|
|
136
|
+
// Sort All Markers as per optimized routes
|
|
137
|
+
this.allMarkers = this.sortTasksAsPerDistance(optimizedRoute, this.allMarkers, true);
|
|
138
|
+
// Sort All Tasks as per optimized routes
|
|
139
|
+
tasks = this.sortTasksAsPerDistance(optimizedRoute.slice(1), tasks, false);
|
|
140
|
+
// Plot Markers for All Tasks
|
|
141
|
+
tasks.map((task) => {
|
|
142
|
+
if (task === null || task === void 0 ? void 0 : task.isValidLocation) {
|
|
143
|
+
const marker = this.getLocation(task);
|
|
144
|
+
this.addMarker(marker);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
// Set Styles for all Task Routes
|
|
148
|
+
const styles = [
|
|
149
|
+
{ color: "blue", opacity: 1, weight: 8 },
|
|
150
|
+
{ color: "white", opacity: 0.6, weight: 12 }
|
|
151
|
+
];
|
|
152
|
+
// Set Routes for all Tasks
|
|
153
|
+
this.allTasksRoutes = this.setRoutes(this.allMarkers, styles);
|
|
154
|
+
this.fitMapBounds();
|
|
155
|
+
}
|
|
156
|
+
return tasks;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// To plot Open Street Direction for selected Task
|
|
160
|
+
plotDirectionsForSelectedTask(task) {
|
|
161
|
+
if (task !== null) {
|
|
162
|
+
// Remove Previously Selected Task Route
|
|
163
|
+
if (this.selectedTaskRoutes) {
|
|
164
|
+
this.map.removeControl(this.selectedTaskRoutes);
|
|
165
|
+
}
|
|
166
|
+
// Remove All Tasks Routes
|
|
167
|
+
if (this.allTasksRoutes) {
|
|
168
|
+
this.map.removeControl(this.allTasksRoutes);
|
|
169
|
+
}
|
|
170
|
+
const taskMarker = task;
|
|
171
|
+
// If Location is Available in Task Details
|
|
172
|
+
if (taskMarker.color != "red") {
|
|
173
|
+
const markers = [this.allMarkers[0], taskMarker];
|
|
174
|
+
const styles = [
|
|
175
|
+
{ color: "green", opacity: 1, weight: 8 },
|
|
176
|
+
{ color: "white", opacity: 0.4, weight: 12 }
|
|
177
|
+
];
|
|
178
|
+
this.selectedTaskRoutes = this.setRoutes(markers, styles);
|
|
179
|
+
this.setSelectedTaskDistanceAndTime();
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
alert("No Location Available");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Set All Tasks Routes Again & Remove Selected Tasks route
|
|
186
|
+
else {
|
|
187
|
+
if (this.selectedTaskRoutes) {
|
|
188
|
+
this.map.removeControl(this.selectedTaskRoutes);
|
|
189
|
+
}
|
|
190
|
+
this.map.addControl(this.allTasksRoutes);
|
|
191
|
+
this.selectedTaskRoutes = undefined;
|
|
192
|
+
}
|
|
193
|
+
this.fitMapBounds();
|
|
194
|
+
}
|
|
195
|
+
// Get Distance & Time of Selected Task
|
|
196
|
+
getSelectedTaskDistanceAndTime() {
|
|
197
|
+
return this.selectedTaskDistanceAndTime;
|
|
198
|
+
}
|
|
199
|
+
// Set Distance & Time of Selected Task
|
|
200
|
+
setSelectedTaskDistanceAndTime() {
|
|
201
|
+
this.selectedTaskRoutes.on("routesfound", function (e) {
|
|
202
|
+
const { routes } = e;
|
|
203
|
+
const { summary } = routes[0];
|
|
204
|
+
const distance = summary.totalDistance / 1000;
|
|
205
|
+
const time = Math.round((summary.totalTime % 3600) / 60);
|
|
206
|
+
this.selectedTaskDistanceAndTime = {
|
|
207
|
+
distance,
|
|
208
|
+
time
|
|
209
|
+
};
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// To sort Open Street Maps Task as per nearest distance
|
|
213
|
+
sortTasksAsPerDistance(order, tasks, isMarker) {
|
|
214
|
+
const sortedTasks = [];
|
|
215
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
216
|
+
const title = isMarker ? order[i].title : order[i].title - 1;
|
|
217
|
+
const task = tasks[title];
|
|
218
|
+
sortedTasks.push(task);
|
|
219
|
+
}
|
|
220
|
+
return sortedTasks;
|
|
221
|
+
}
|
|
222
|
+
// To set Open Street routes in the maps
|
|
223
|
+
setRoutes(markers, styles) {
|
|
224
|
+
return L.Routing.control({
|
|
225
|
+
waypoints: markers,
|
|
226
|
+
lineOptions: {
|
|
227
|
+
styles
|
|
228
|
+
},
|
|
229
|
+
createMarker() {
|
|
230
|
+
return null;
|
|
231
|
+
},
|
|
232
|
+
routeWhileDragging: true
|
|
233
|
+
}).addTo(this.map);
|
|
234
|
+
}
|
|
235
|
+
// To set Open Street view point on the map
|
|
236
|
+
fitMapBounds() {
|
|
237
|
+
const markerLatLngs = this.allMarkers.map((marker) => L.latLng(marker.lat, marker.lng));
|
|
238
|
+
this.map.fitBounds(markerLatLngs);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** @nocollapse */ OpenStreetMapsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OpenStreetMapsService, deps: [{ token: i1.AgentService }, { token: i2.MapDirectionsService }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
242
|
+
/** @nocollapse */ OpenStreetMapsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OpenStreetMapsService, providedIn: "root" });
|
|
243
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: OpenStreetMapsService, decorators: [{
|
|
244
|
+
type: Injectable,
|
|
245
|
+
args: [{
|
|
246
|
+
providedIn: "root"
|
|
247
|
+
}]
|
|
248
|
+
}], ctorParameters: function () { return [{ type: i1.AgentService }, { type: i2.MapDirectionsService }, { type: i3.HttpClient }]; }, propDecorators: { directionsRenders: [{
|
|
249
|
+
type: ViewChildren,
|
|
250
|
+
args: ["directionsRender"]
|
|
251
|
+
}] } });
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1zdHJlZXQtbWFwcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3YxL3NlcnZpY2VzL29wZW4tc3RyZWV0LW1hcHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFjLFVBQVUsRUFBYSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxLQUFLLENBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFLeEIsT0FBTyxFQUNMLGVBQWUsRUFDZix3QkFBd0IsRUFDekIsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7QUFLakMsTUFBTSxPQUFPLHFCQUFxQjtJQWlCaEMsWUFDVSxZQUEwQixFQUMzQixvQkFBMEMsRUFDMUMsVUFBc0I7UUFGckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDM0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBZi9CLGVBQVUsR0FBUSxFQUFFLENBQUM7SUFnQmxCLENBQUM7SUFFSiwwQkFBMEI7SUFDMUIsV0FBVztRQUNULE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQ2pDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1AsT0FBTyxDQUFDO29CQUNOLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7b0JBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7aUJBQzFCLENBQUMsQ0FBQztZQUNMLENBQUMsRUFDRCxDQUFD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QyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O3NJQWxUVSxxQkFBcUI7MElBQXJCLHFCQUFxQixjQUZwQixNQUFNOzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7K0pBY21DLGlCQUFpQjtzQkFBbEQsWUFBWTt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgKiBhcyBMIGZyb20gXCJsZWFmbGV0XCI7XG5pbXBvcnQgXCJsZWFmbGV0LXJvdXRpbmctbWFjaGluZVwiO1xuaW1wb3J0IHtcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBpc05vdEVtcHR5QXJyYXlcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5cbmltcG9ydCB7IE1hcERpcmVjdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkBhbmd1bGFyL2dvb2dsZS1tYXBzXCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBBZ2VudFNlcnZpY2UgfSBmcm9tIFwiLi9hZ2VudC5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBhZGRyZXNzQ29uY2F0b3IsXG4gIG5lYXJlc3ROZWlnaGJvckFsZ29yaXRobVxufSBmcm9tIFwiLi4vaGVscGVycy9tYXBzLmhlbHBlcnNcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBPcGVuU3RyZWV0TWFwc1NlcnZpY2Uge1xuICBteVBvc2l0aW9uO1xuXG4gIG1hcDogYW55O1xuXG4gIGFsbE1hcmtlcnM6IGFueSA9IFtdO1xuXG4gIGFsbFRhc2tzUm91dGVzOiBhbnk7XG5cbiAgc2VsZWN0ZWRUYXNrUm91dGVzOiBhbnk7XG5cbiAgc2VsZWN0ZWRUYXNrRGlzdGFuY2VBbmRUaW1lOiBhbnk7XG5cbiAgQFZpZXdDaGlsZHJlbihcImRpcmVjdGlvbnNSZW5kZXJcIikgZGlyZWN0aW9uc1JlbmRlcnM6IFF1ZXJ5TGlzdDxcbiAgICBFbGVtZW50UmVmPGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcj5cbiAgPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFnZW50U2VydmljZTogQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBtYXBEaXJlY3Rpb25zU2VydmljZTogTWFwRGlyZWN0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7fVxuXG4gIC8vIFRvIGdldCBDdXJyZW50IFBvc2l0aW9uXG4gIGdldFBvc2l0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKFxuICAgICAgICAocmVzcCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgbG5nOiByZXNwLmNvb3Jkcy5sb25naXR1ZGUsXG4gICAgICAgICAgICBsYXQ6IHJlc3AuY29vcmRzLmxhdGl0dWRlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRvIGV4dHJhY3QgTG9jYXRpb24gZnJvbSB0aGUgVGFzayBEZXRhaWxzXG4gIGFzeW5jIGdldExvY2F0aW9uKHRhc2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IGVuY29kZWRBZGRyZXM7XG5cbiAgICAgIC8vIElmIEZldGNoIEFkZHJlc3MgZnJvbSBNdWx0aXBsZSBQYXRoc1xuICAgICAgaWYgKFxuICAgICAgICBjaGVja09iamVjdFBhdGhFeGlzdHMoXG4gICAgICAgICAgdGhpcy5hZ2VudFNlcnZpY2UuY29uZmlnLFxuICAgICAgICAgIFwiZGFzaGJvYXJkLnRhc2tMb2NhdGlvblBhdGhzXCJcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEdldCBhZGRyZXNzIHN0cmluZyBmcm9tIG11bHRpcGxlIHBhdGhzXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZy5kYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aHM7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBhZGRyZXNzQ29uY2F0b3IodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIEZldGNoIEFkZHJlc3MgZnJvbSBTaW5nbGUgUGF0aFxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0UGF0aEV4aXN0cyhcbiAgICAgICAgICB0aGlzLmFnZW50U2VydmljZS5jb25maWcsXG4gICAgICAgICAgXCJkYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aFwiXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICAvLyBHZXQgQWRkcmVzcyBmcm9tIFNpbmdsZSBQYXRoXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYWdlbnRTZXJ2aWNlLmNvbmZpZy5kYXNoYm9hcmQudGFza0xvY2F0aW9uUGF0aDtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGFzaywgY29uZmlnKTtcblxuICAgICAgICAvLyBFbmNvZGUgdGhlIEFkZHJlc3MgaW4gVVJJXG4gICAgICAgIGVuY29kZWRBZGRyZXMgPSBlbmNvZGVVUkkoYWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgQWRkcmVzcyBQYXRocyBBdmFpYWJsZVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRhc2s/LmV4dHJhcz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8udGFza19kZXRhaWxzPy5jdXN0b21lcl9kZXRhaWxzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uZXh0cmFzPy5hZGRyZXNzID8/XG4gICAgICAgICAgdGFzaz8uYWRkcmVzcyA/P1xuICAgICAgICAgIFwiXCI7XG5cbiAgICAgICAgLy8gRW5jb2RlIHRoZSBBZGRyZXNzIGluIFVSSVxuICAgICAgICBlbmNvZGVkQWRkcmVzID0gZW5jb2RlVVJJKGFkZHJlc3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBVUkwgdG8gZ2VvY29kZSBBZGRyZXNzIFN0cmluZyB0byBMYXRpdHVkZSAmIExvbmdpdHVkZVxuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3NlYXJjaD9xPSR7ZW5jb2RlZEFkZHJlc30mZm9ybWF0PWpzb25gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFNldCBMb2NhdGlvbiB7bGF0OiBMQVQsIGxuZzogTE5HfSBmcm9tIGFkZHJlc3MgZ2VvY29kZWRcbiAgICAgIGNvbnN0IGlzVmFsaWRMb2NhdGlvbiA9XG4gICAgICAgIGlzTm90RW1wdHlBcnJheShkYXRhKSAmJiBkYXRhWzBdPy5sYXQgJiBkYXRhWzBdPy5sb247XG4gICAgICBjb25zdCBsb2NhdGlvbjogYW55ID0gaXNWYWxpZExvY2F0aW9uXG4gICAgICAgID8geyBsYXQ6IGRhdGFbMF0/LmxhdCwgbG5nOiBkYXRhWzBdPy5sb24gfVxuICAgICAgICA6IHsgbGF0OiBudWxsLCBsbmc6IG51bGwgfTtcblxuICAgICAgLy8gU2V0IExvY2F0aW9uIHZhbGlkYXRpb24gJiBHb29nbGUgTWFwcyBVUkxcbiAgICAgIGxvY2F0aW9uLmlzVmFsaWRMb2NhdGlvbiA9IGlzVmFsaWRMb2NhdGlvbjtcbiAgICAgIGxvY2F0aW9uLmNvbG9yID0gaXNWYWxpZExvY2F0aW9uID8gXCJibHVlXCIgOiBcInJlZFwiO1xuICAgICAgbG9jYXRpb24uZ29vZ2xlTWFwc1VybCA9IGBodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvcGxhY2UvJHtsb2NhdGlvbj8ubGF0fSwke2xvY2F0aW9uPy5sbmd9YDtcblxuICAgICAgcmVzb2x2ZShsb2NhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBHZXQgVGFza3MgfCBNYXJrZXJzIExvY2F0aW9uIENvIE9yZGluYXRlc1xuICBhc3luYyBnZXRNYXJrZXJzTG9jYXRpb24obXlNYXJrZXIsIHRhc2tzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlcnMgPSBbXTtcbiAgICAgIG1hcmtlcnMucHVzaChteU1hcmtlcik7XG4gICAgICBjb25zdCBwcm9taXNlcyA9IHRhc2tzLm1hcChhc3luYyh0YXNrKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtlcjogYW55ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbih0YXNrKTtcbiAgICAgICAgdGFzayA9IHsgLi4udGFzaywgLi4ubWFya2VyIH07XG4gICAgICAgIG1hcmtlcnMucHVzaCh0YXNrKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICAgIHJlc29sdmUobWFya2Vycyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUbyBJbml0aWFsaXplIE9wZW4gU3RyZWV0IE1hcFxuICBhc3luYyBpbml0aWFsaXplTWFwKCkge1xuICAgIGNvbnNvbGUubG9nKFwiUnVubmluZyBJbml0IE9wZW4gU3RyZWV0IE1hcHNcIik7XG4gICAgdGhpcy5teVBvc2l0aW9uID0gYXdhaXQgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgIHRoaXMubWFwID0gTC5tYXAoXCJtYXBcIiwge1xuICAgICAgY2VudGVyOiBbdGhpcy5teVBvc2l0aW9uLmxhdCwgdGhpcy5teVBvc2l0aW9uLmxuZ10sXG4gICAgICB6b29tOiAxMVxuICAgIH0pO1xuICAgIEwudGlsZUxheWVyKFwiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmdcIikuYWRkVG8oXG4gICAgICB0aGlzLm1hcFxuICAgICk7XG4gIH1cblxuICAvLyBUbyBBZGQgT3BlbiBTdHJlZXQgTWFya2VyIGluIE1hcFxuICBhZGRNYXJrZXIoeyBsYXQsIGxuZywgdGl0bGUsIGNvbG9yIH0pIHtcbiAgICBMLm1hcmtlcihbbGF0LCBsbmddLCB7XG4gICAgICBpY29uOiBMLmljb24oe1xuICAgICAgICBpY29uVXJsOlxuICAgICAgICAgIGNvbG9yID09IFwicmVkXCJcbiAgICAgICAgICAgID8gXCJodHRwczovL2t3aWtpZC5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vQ09ORklHL1VTRVIvYXNzZXRzL21hcC1tYXJrZXItMC5wbmdcIlxuICAgICAgICAgICAgOiBcImh0dHBzOi8va3dpa2lkLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9DT05GSUcvVVNFUi9hc3NldHMvbWFwLW1hcmtlci0xLnBuZ1wiXG4gICAgICB9KVxuICAgIH0pXG4gICAgICAuYWRkVG8odGhpcy5tYXApXG4gICAgICAuYmluZFBvcHVwKHRpdGxlKTtcbiAgfVxuXG4gIC8vIFRvIFBsb3QgT3BlbiBTdHJlZXQgRGlyZWN0aW9ucyBmb3IgQWxsIFRhc2tzXG4gIGFzeW5jIHBsb3REaXJlY3Rpb25zRm9yQWxsVGFza3ModGFza3MpIHtcbiAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgIHRoaXMuYWxsTWFya2VycyA9IFtdO1xuXG4gICAgICAvLyBDcmVhdGUgQWdlbnQgTWFya2VyICYgUGxvdCBJdC5cbiAgICAgIGNvbnN0IG15TWFya2VyID0ge1xuICAgICAgICBsYXQ6IHRoaXMubXlQb3NpdGlvbi5sYXQsXG4gICAgICAgIGxuZzogdGhpcy5teVBvc2l0aW9uLmxuZyxcbiAgICAgICAgdGl0bGU6IDAsXG4gICAgICAgIGNvbG9yOiBcInJlZFwiXG4gICAgICB9O1xuICAgICAgdGhpcy5hZGRNYXJrZXIobXlNYXJrZXIpO1xuICAgICAgdGhpcy5hbGxNYXJrZXJzLnB1c2gobXlNYXJrZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgTWFya2VycyBmb3IgYWxsIFRhc2tzXG4gICAgICB0aGlzLmFsbE1hcmtlcnMgPSBhd2FpdCB0aGlzLmdldE1hcmtlcnNMb2NhdGlvbihteU1hcmtlciwgdGFza3MpO1xuXG4gICAgICAvLyBSdW4gQWxnb3JpdGhtIHRvIGdldCBvcHRpbWl6ZWQgUm91dGVzXG4gICAgICBjb25zdCBzdGFydGluZ1BvaW50ID0gdGhpcy5hbGxNYXJrZXJzWzBdO1xuICAgICAgY29uc3QgdW52aXNpdGVkV2F5cG9pbnRzID0gdGhpcy5hbGxNYXJrZXJzLnNsaWNlKDEpO1xuICAgICAgY29uc3Qgb3B0aW1pemVkUm91dGUgPSBuZWFyZXN0TmVpZ2hib3JBbGdvcml0aG0oXG4gICAgICAgIHN0YXJ0aW5nUG9pbnQsXG4gICAgICAgIHVudmlzaXRlZFdheXBvaW50c1xuICAgICAgKTtcblxuICAgICAgLy8gU29ydCBBbGwgTWFya2VycyBhcyBwZXIgb3B0aW1pemVkIHJvdXRlc1xuICAgICAgdGhpcy5hbGxNYXJrZXJzID0gdGhpcy5zb3J0VGFza3NBc1BlckRpc3RhbmNlKFxuICAgICAgICBvcHRpbWl6ZWRSb3V0ZSxcbiAgICAgICAgdGhpcy5hbGxNYXJrZXJzLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICAvLyBTb3J0IEFsbCBUYXNrcyBhcyBwZXIgb3B0aW1pemVkIHJvdXRlc1xuICAgICAgdGFza3MgPSB0aGlzLnNvcnRUYXNrc0FzUGVyRGlzdGFuY2UoXG4gICAgICAgIG9wdGltaXplZFJvdXRlLnNsaWNlKDEpLFxuICAgICAgICB0YXNrcyxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIC8vIFBsb3QgTWFya2VycyBmb3IgQWxsIFRhc2tzXG4gICAgICB0YXNrcy5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgaWYgKHRhc2s/LmlzVmFsaWRMb2NhdGlvbikge1xuICAgICAgICAgIGNvbnN0IG1hcmtlcjogYW55ID0gdGhpcy5nZXRMb2NhdGlvbih0YXNrKTtcbiAgICAgICAgICB0aGlzLmFkZE1hcmtlcihtYXJrZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IFN0eWxlcyBmb3IgYWxsIFRhc2sgUm91dGVzXG4gICAgICBjb25zdCBzdHlsZXMgPSBbXG4gICAgICAgIHsgY29sb3I6IFwiYmx1ZVwiLCBvcGFjaXR5OiAxLCB3ZWlnaHQ6IDggfSxcbiAgICAgICAgeyBjb2xvcjogXCJ3aGl0ZVwiLCBvcGFjaXR5OiAwLjYsIHdlaWdodDogMTIgfVxuICAgICAgXTtcblxuICAgICAgLy8gU2V0IFJvdXRlcyBmb3IgYWxsIFRhc2tzXG4gICAgICB0aGlzLmFsbFRhc2tzUm91dGVzID0gdGhpcy5zZXRSb3V0ZXModGhpcy5hbGxNYXJrZXJzLCBzdHlsZXMpO1xuICAgICAgdGhpcy5maXRNYXBCb3VuZHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tzO1xuICB9XG5cbiAgLy8gVG8gcGxvdCBPcGVuIFN0cmVldCBEaXJlY3Rpb24gZm9yIHNlbGVjdGVkIFRhc2tcbiAgcGxvdERpcmVjdGlvbnNGb3JTZWxlY3RlZFRhc2sodGFzaykge1xuICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAvLyBSZW1vdmUgUHJldmlvdXNseSBTZWxlY3RlZCBUYXNrIFJvdXRlXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMpIHtcbiAgICAgICAgdGhpcy5tYXAucmVtb3ZlQ29udHJvbCh0aGlzLnNlbGVjdGVkVGFza1JvdXRlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBBbGwgVGFza3MgUm91dGVzXG4gICAgICBpZiAodGhpcy5hbGxUYXNrc1JvdXRlcykge1xuICAgICAgICB0aGlzLm1hcC5yZW1vdmVDb250cm9sKHRoaXMuYWxsVGFza3NSb3V0ZXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXNrTWFya2VyID0gdGFzaztcblxuICAgICAgLy8gSWYgTG9jYXRpb24gaXMgQXZhaWxhYmxlIGluIFRhc2sgRGV0YWlsc1xuICAgICAgaWYgKHRhc2tNYXJrZXIuY29sb3IgIT0gXCJyZWRcIikge1xuICAgICAgICBjb25zdCBtYXJrZXJzID0gW3RoaXMuYWxsTWFya2Vyc1swXSwgdGFza01hcmtlcl07XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IFtcbiAgICAgICAgICB7IGNvbG9yOiBcImdyZWVuXCIsIG9wYWNpdHk6IDEsIHdlaWdodDogOCB9LFxuICAgICAgICAgIHsgY29sb3I6IFwid2hpdGVcIiwgb3BhY2l0eTogMC40LCB3ZWlnaHQ6IDEyIH1cbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMgPSB0aGlzLnNldFJvdXRlcyhtYXJrZXJzLCBzdHlsZXMpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkVGFza0Rpc3RhbmNlQW5kVGltZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxlcnQoXCJObyBMb2NhdGlvbiBBdmFpbGFibGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNldCBBbGwgVGFza3MgUm91dGVzIEFnYWluICYgUmVtb3ZlIFNlbGVjdGVkIFRhc2tzIHJvdXRlXG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMpIHtcbiAgICAgICAgdGhpcy5tYXAucmVtb3ZlQ29udHJvbCh0aGlzLnNlbGVjdGVkVGFza1JvdXRlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5hZGRDb250cm9sKHRoaXMuYWxsVGFza3NSb3V0ZXMpO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuZml0TWFwQm91bmRzKCk7XG4gIH1cblxuICAvLyBHZXQgRGlzdGFuY2UgJiBUaW1lIG9mIFNlbGVjdGVkIFRhc2tcbiAgZ2V0U2VsZWN0ZWRUYXNrRGlzdGFuY2VBbmRUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGFza0Rpc3RhbmNlQW5kVGltZTtcbiAgfVxuXG4gIC8vIFNldCBEaXN0YW5jZSAmIFRpbWUgb2YgU2VsZWN0ZWQgVGFza1xuICBzZXRTZWxlY3RlZFRhc2tEaXN0YW5jZUFuZFRpbWUoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFRhc2tSb3V0ZXMub24oXCJyb3V0ZXNmb3VuZFwiLCBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCB7IHJvdXRlcyB9ID0gZTtcbiAgICAgIGNvbnN0IHsgc3VtbWFyeSB9ID0gcm91dGVzWzBdO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHN1bW1hcnkudG90YWxEaXN0YW5jZSAvIDEwMDA7XG4gICAgICBjb25zdCB0aW1lID0gTWF0aC5yb3VuZCgoc3VtbWFyeS50b3RhbFRpbWUgJSAzNjAwKSAvIDYwKTtcblxuICAgICAgdGhpcy5zZWxlY3RlZFRhc2tEaXN0YW5jZUFuZFRpbWUgPSB7XG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB0aW1lXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVG8gc29ydCBPcGVuIFN0cmVldCBNYXBzIFRhc2sgYXMgcGVyIG5lYXJlc3QgZGlzdGFuY2VcbiAgc29ydFRhc2tzQXNQZXJEaXN0YW5jZShvcmRlciwgdGFza3MsIGlzTWFya2VyKSB7XG4gICAgY29uc3Qgc29ydGVkVGFza3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0aXRsZSA9IGlzTWFya2VyID8gb3JkZXJbaV0udGl0bGUgOiBvcmRlcltpXS50aXRsZSAtIDE7XG4gICAgICBjb25zdCB0YXNrID0gdGFza3NbdGl0bGVdO1xuICAgICAgc29ydGVkVGFza3MucHVzaCh0YXNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZFRhc2tzO1xuICB9XG5cbiAgLy8gVG8gc2V0IE9wZW4gU3RyZWV0IHJvdXRlcyBpbiB0aGUgbWFwc1xuICBzZXRSb3V0ZXMobWFya2Vycywgc3R5bGVzKSB7XG4gICAgcmV0dXJuIEwuUm91dGluZy5jb250cm9sKHtcbiAgICAgIHdheXBvaW50czogbWFya2VycyxcbiAgICAgIGxpbmVPcHRpb25zOiB7XG4gICAgICAgIHN0eWxlc1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZU1hcmtlcigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgcm91dGVXaGlsZURyYWdnaW5nOiB0cnVlXG4gICAgfSkuYWRkVG8odGhpcy5tYXApO1xuICB9XG5cbiAgLy8gVG8gc2V0IE9wZW4gU3RyZWV0IHZpZXcgcG9pbnQgb24gdGhlIG1hcFxuICBmaXRNYXBCb3VuZHMoKSB7XG4gICAgY29uc3QgbWFya2VyTGF0TG5ncyA9IHRoaXMuYWxsTWFya2Vycy5tYXAoKG1hcmtlcikgPT5cbiAgICAgIEwubGF0TG5nKG1hcmtlci5sYXQsIG1hcmtlci5sbmcpXG4gICAgKTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHMobWFya2VyTGF0TG5ncyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component } from "@angular/core";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class AgentInfoComponent {
|
|
5
|
+
constructor() { }
|
|
6
|
+
ngOnInit() {
|
|
7
|
+
return __awaiter(this, void 0, void 0, function* () { });
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** @nocollapse */ AgentInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11
|
+
/** @nocollapse */ AgentInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AgentInfoComponent, selector: "agent-info", ngImport: i0, template: "Agent Info\n", styles: [""] });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentInfoComponent, decorators: [{
|
|
13
|
+
type: Component,
|
|
14
|
+
args: [{
|
|
15
|
+
selector: "agent-info",
|
|
16
|
+
templateUrl: "./agent-info.component.html",
|
|
17
|
+
styleUrls: ["./agent-info.component.scss"]
|
|
18
|
+
}]
|
|
19
|
+
}], ctorParameters: function () { return []; } });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjIvY29tcG9uZW50cy9hZ2VudC1pbmZvL2FnZW50LWluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3YyL2NvbXBvbmVudHMvYWdlbnQtaW5mby9hZ2VudC1pbmZvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQU9sRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLGdCQUFlLENBQUM7SUFFVixRQUFROzhEQUFJLENBQUM7S0FBQTs7bUlBSFIsa0JBQWtCO3VIQUFsQixrQkFBa0Isa0RDUC9CLGNBQ0E7NEZETWEsa0JBQWtCO2tCQUw5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxTQUFTLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQztpQkFDM0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhZ2VudC1pbmZvXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWdlbnQtaW5mby5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vYWdlbnQtaW5mby5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBBZ2VudEluZm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7fVxufVxuIiwiQWdlbnQgSW5mb1xuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { NgModule } from "@angular/core";
|
|
3
|
+
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
|
4
|
+
import { KwikIDFormsModule } from "kwikid-forms";
|
|
5
|
+
import { KwikUIModule } from "kwikui";
|
|
6
|
+
import { AgentInfoComponent } from "./agent-info.component";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class AgentInfoModule {
|
|
9
|
+
}
|
|
10
|
+
/** @nocollapse */ AgentInfoModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentInfoModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
11
|
+
/** @nocollapse */ AgentInfoModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentInfoModule, declarations: [AgentInfoComponent], imports: [CommonModule,
|
|
12
|
+
FormsModule,
|
|
13
|
+
ReactiveFormsModule,
|
|
14
|
+
KwikUIModule,
|
|
15
|
+
KwikIDFormsModule], exports: [AgentInfoComponent] });
|
|
16
|
+
/** @nocollapse */ AgentInfoModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentInfoModule, imports: [[
|
|
17
|
+
CommonModule,
|
|
18
|
+
FormsModule,
|
|
19
|
+
ReactiveFormsModule,
|
|
20
|
+
KwikUIModule,
|
|
21
|
+
KwikIDFormsModule
|
|
22
|
+
]] });
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AgentInfoModule, decorators: [{
|
|
24
|
+
type: NgModule,
|
|
25
|
+
args: [{
|
|
26
|
+
declarations: [AgentInfoComponent],
|
|
27
|
+
imports: [
|
|
28
|
+
CommonModule,
|
|
29
|
+
FormsModule,
|
|
30
|
+
ReactiveFormsModule,
|
|
31
|
+
KwikUIModule,
|
|
32
|
+
KwikIDFormsModule
|
|
33
|
+
],
|
|
34
|
+
exports: [AgentInfoComponent]
|
|
35
|
+
}]
|
|
36
|
+
}] });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtaW5mby5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjIvY29tcG9uZW50cy9hZ2VudC1pbmZvL2FnZW50LWluZm8ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFhNUQsTUFBTSxPQUFPLGVBQWU7O2dJQUFmLGVBQWU7aUlBQWYsZUFBZSxpQkFWWCxrQkFBa0IsYUFFL0IsWUFBWTtRQUNaLFdBQVc7UUFDWCxtQkFBbUI7UUFDbkIsWUFBWTtRQUNaLGlCQUFpQixhQUVULGtCQUFrQjtpSUFFakIsZUFBZSxZQVRqQjtZQUNQLFlBQVk7WUFDWixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLFlBQVk7WUFDWixpQkFBaUI7U0FDbEI7NEZBR1UsZUFBZTtrQkFYM0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osaUJBQWlCO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgS3dpa0lERm9ybXNNb2R1bGUgfSBmcm9tIFwia3dpa2lkLWZvcm1zXCI7XG5pbXBvcnQgeyBLd2lrVUlNb2R1bGUgfSBmcm9tIFwia3dpa3VpXCI7XG5pbXBvcnQgeyBBZ2VudEluZm9Db21wb25lbnQgfSBmcm9tIFwiLi9hZ2VudC1pbmZvLmNvbXBvbmVudFwiO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtBZ2VudEluZm9Db21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgS3dpa1VJTW9kdWxlLFxuICAgIEt3aWtJREZvcm1zTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtBZ2VudEluZm9Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIEFnZW50SW5mb01vZHVsZSB7fVxuIl19
|