@smarterplan/ngx-smarterplan-locations 0.2.20 → 0.2.21

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.
Files changed (59) hide show
  1. package/esm2020/lib/components/carousel/carousel.component.mjs +27 -27
  2. package/esm2020/lib/components/chevron/chevron.component.mjs +17 -17
  3. package/esm2020/lib/components/detail-location/detail-location.component.mjs +154 -154
  4. package/esm2020/lib/components/form-location/form-location.component.mjs +237 -237
  5. package/esm2020/lib/components/images/images.component.mjs +90 -90
  6. package/esm2020/lib/components/locations/locations.component.mjs +141 -141
  7. package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +65 -65
  8. package/esm2020/lib/components/locations/map/map.component.mjs +90 -90
  9. package/esm2020/lib/components/plans/calibration/calibration.component.mjs +468 -468
  10. package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +324 -324
  11. package/esm2020/lib/components/plans/plans.component.mjs +210 -210
  12. package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +41 -41
  13. package/esm2020/lib/components/visits/visits.component.mjs +235 -235
  14. package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +230 -230
  15. package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +294 -294
  16. package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +76 -76
  17. package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +413 -414
  18. package/esm2020/lib/components/zones/zones.component.mjs +232 -232
  19. package/esm2020/lib/helper.service.mjs +134 -134
  20. package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -49
  21. package/esm2020/lib/ngx-smarterplan-locations.module.mjs +122 -122
  22. package/esm2020/lib/ngx-smarterplan-locations.service.mjs +13 -13
  23. package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +27 -0
  24. package/esm2020/lib/radio-button/radio-button.component.mjs +26 -26
  25. package/esm2020/public-api.mjs +8 -8
  26. package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +4 -4
  27. package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3627 -3648
  28. package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
  29. package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +3475 -3494
  30. package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
  31. package/lib/components/carousel/carousel.component.d.ts +12 -12
  32. package/lib/components/chevron/chevron.component.d.ts +9 -9
  33. package/lib/components/detail-location/detail-location.component.d.ts +51 -51
  34. package/lib/components/form-location/form-location.component.d.ts +45 -45
  35. package/lib/components/images/images.component.d.ts +28 -28
  36. package/lib/components/locations/locations.component.d.ts +50 -50
  37. package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -22
  38. package/lib/components/locations/map/map.component.d.ts +22 -22
  39. package/lib/components/plans/calibration/calibration.component.d.ts +140 -140
  40. package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -55
  41. package/lib/components/plans/plans.component.d.ts +59 -59
  42. package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -13
  43. package/lib/components/visits/visits.component.d.ts +51 -51
  44. package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -63
  45. package/lib/components/zones/add-zone/add-zone.component.d.ts +67 -67
  46. package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -44
  47. package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +96 -96
  48. package/lib/components/zones/zones.component.d.ts +67 -67
  49. package/lib/helper.service.d.ts +53 -53
  50. package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -7
  51. package/lib/ngx-smarterplan-locations.module.d.ts +35 -35
  52. package/lib/ngx-smarterplan-locations.service.d.ts +6 -6
  53. package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -0
  54. package/lib/radio-button/radio-button.component.d.ts +12 -12
  55. package/package.json +2 -2
  56. package/public-api.d.ts +4 -4
  57. package/smarterplan-ngx-smarterplan-locations.d.ts +5 -5
  58. package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +0 -47
  59. package/lib/components/plan-legend/plan-legend.component.d.ts +0 -14
@@ -1,141 +1,141 @@
1
- import { Component } from '@angular/core';
2
- import { LevelStatus, enumToArray, SearchObjectType } from '@smarterplan/ngx-smarterplan-core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@smarterplan/ngx-smarterplan-core";
5
- import * as i2 from "@angular/router";
6
- import * as i3 from "../tab-navigation/tab-navigation.component";
7
- import * as i4 from "./map/map.component";
8
- import * as i5 from "../form-location/form-location.component";
9
- import * as i6 from "@angular/common";
10
- import * as i7 from "@ng-bootstrap/ng-bootstrap";
11
- import * as i8 from "@ngx-translate/core";
12
- export class LocationsComponent {
13
- constructor(spaceService, router, userService, viewerService, navigationService, navigatorService) {
14
- this.spaceService = spaceService;
15
- this.router = router;
16
- this.userService = userService;
17
- this.viewerService = viewerService;
18
- this.navigationService = navigationService;
19
- this.navigatorService = navigatorService;
20
- this.isAdding = false;
21
- this.filteredLocations = [];
22
- this.isManager = false;
23
- this.isMuseumUser = true;
24
- this.locations = [];
25
- this.menuItems = [];
26
- /** Last filtered Locations, used when we go back on all locations from the search bar location */
27
- this.lastFiltredLocations = [];
28
- this.levels = enumToArray(LevelStatus);
29
- this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {
30
- if (isConnected) {
31
- this.refresh();
32
- }
33
- });
34
- this.locationIDSubscription =
35
- this.navigatorService.locationIDChange.subscribe((id) => {
36
- this.changeSelectedLocation(id);
37
- this.setupMenuItems();
38
- });
39
- }
40
- async ngOnInit() {
41
- if (this.userService.cu) {
42
- this.resetList();
43
- this.updateUserRights();
44
- }
45
- this.setupMenuItems();
46
- }
47
- findSpaceById(id) {
48
- return this.locations.find((loc) => loc.id === id);
49
- }
50
- /**
51
- * Update when we change the selected location in filter (search bar)
52
- * @param id for a location, if null display all last filtred location
53
- */
54
- changeSelectedLocation(id) {
55
- const space = id ? this.findSpaceById(id) : null;
56
- this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location
57
- }
58
- refresh() {
59
- this.updateUserRights();
60
- this.resetList();
61
- }
62
- ngOnDestroy() {
63
- this.userSubcription.unsubscribe();
64
- this.locationIDSubscription.unsubscribe();
65
- }
66
- setupMenuItems() {
67
- this.menuItems = [{ label: "All Locations", url: "/localisation" }];
68
- if (this.isAdding) {
69
- this.menuItems.push({ label: "New" });
70
- }
71
- if (this.filteredLocations.length === 1) {
72
- const selectedLoc = this.filteredLocations[0];
73
- this.menuItems.push({ label: selectedLoc.name });
74
- }
75
- }
76
- updateUserRights() {
77
- this.isManager = this.userService.hasManagerRoleInAnyMission();
78
- this.isMuseumUser = this.userService.hasOnlyMuseumRole();
79
- }
80
- isManagerForSpace(spaceID) {
81
- return (this.userService.isManager(spaceID) ||
82
- this.userService.isGuide(spaceID));
83
- }
84
- async resetList() {
85
- this.locations = await this.spaceService.getLocationsForCurrentUser();
86
- this.filteredLocations = this.locations;
87
- this.lastFiltredLocations = this.locations;
88
- this.isAdding = false;
89
- this.changeSelectedLocation(this.navigatorService.currentNavBarLocationID); // Set for the current selected location
90
- this.setupMenuItems();
91
- }
92
- onAddLocation() {
93
- this.isAdding = true;
94
- this.setupMenuItems();
95
- }
96
- handleImageInput(files) {
97
- this.imageToUpload = files.item(0);
98
- }
99
- onFormChange(event) {
100
- this.navigatorService.locationIDChange.next(null); /** Remove selected location */
101
- this.isAdding = false;
102
- if (event) {
103
- this.resetList();
104
- }
105
- this.setupMenuItems();
106
- }
107
- async onVisitClick(loc, visit) {
108
- if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {
109
- // get allowed sweep for the user
110
- const allowedSweeps = await this.navigationService.getAllowedSweepsIDsForUserInSpace(loc.id);
111
- const firstSweep = allowedSweeps[0];
112
- this.viewerService.setSweepToMove(firstSweep);
113
- }
114
- if (this.userService.isGuide(loc.id)) {
115
- this.router.navigate(["museum", loc.id]);
116
- }
117
- else {
118
- this.router.navigate(["visit", loc.id], {
119
- queryParams: { model3D: visit.model3d },
120
- });
121
- }
122
- }
123
- applyResultsSearchBar(results) {
124
- this.filteredLocations = results || this.locations;
125
- this.lastFiltredLocations = this.filteredLocations;
126
- this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations
127
- }
128
- getSearchType() {
129
- return SearchObjectType.LOCATION;
130
- }
131
- getStringNoSpace(data) {
132
- return data.replace(/\s/g, '');
133
- }
134
- }
135
- LocationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LocationsComponent, deps: [{ token: i1.SpaceService }, { token: i2.Router }, { token: i1.BaseUserService }, { token: i1.ViewerService }, { token: i1.NavigationService }, { token: i1.NavigatorService }], target: i0.ɵɵFactoryTarget.Component });
136
- LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: LocationsComponent, selector: "lib-locations", ngImport: i0, template: "<div class=\"dashboard-tab\">\n <div class=\"header-dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\n </span>\n </div> \n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\n \n <div class=\"col-md-8\">\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\n {{'Add location' | translate}}</button>\n <!-- <div class=\"outer_circle\">\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\n </div> -->\n </div>\n </div>\n </div>\n <hr>\n <div class=\"row\" *ngIf=\"isAdding\">\n <div class=\"col-md-6\">\n <h4>{{'New location' | translate}}</h4>\n </div>\n </div>\n <section *ngIf=\"!isAdding\">\n <div class=\"row\">\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\n <li class=\"d-flex justify-content-between list-group-item\"\n *ngFor=\"let loc of filteredLocations; index as index\">\n <div class=\"d-flex\">\n <div class=\"col-md-5 img-main-container\">\n <div id=\"img_container\">\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\n <ng-template #elseBlock><img class=\"location-img\"\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\n </ng-template>\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" [routerLink]=\"[loc.id]\">\n {{'View details' | translate}}</button>\n </div>\n \n </div>\n <div class=\"col-md-7 location-info\">\n <p>{{loc.name}}</p>\n <p>{{loc.addresses}}</p>\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</p>\n </div>\n </div>\n </li>\n \n </ul>\n </div>\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\n </div>\n </div>\n </section>\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>\n", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0px;right:0px;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:12vw}.sp-row{display:flex;flex-direction:row}\n"], components: [{ type: i3.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i1.SearchBarComponent, selector: "lib-search-bar", inputs: ["searchable", "objectType"], outputs: ["searchEvent"] }, { type: i4.MapComponent, selector: "lib-map", inputs: ["spaces"] }, { type: i5.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "translate": i8.TranslatePipe } });
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LocationsComponent, decorators: [{
138
- type: Component,
139
- args: [{ selector: 'lib-locations', template: "<div class=\"dashboard-tab\">\n <div class=\"header-dashboard-tab\">\n <div class=\"m-3\">\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\n </span>\n </div> \n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\n \n <div class=\"col-md-8\">\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\n {{'Add location' | translate}}</button>\n <!-- <div class=\"outer_circle\">\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\n </div> -->\n </div>\n </div>\n </div>\n <hr>\n <div class=\"row\" *ngIf=\"isAdding\">\n <div class=\"col-md-6\">\n <h4>{{'New location' | translate}}</h4>\n </div>\n </div>\n <section *ngIf=\"!isAdding\">\n <div class=\"row\">\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\n <li class=\"d-flex justify-content-between list-group-item\"\n *ngFor=\"let loc of filteredLocations; index as index\">\n <div class=\"d-flex\">\n <div class=\"col-md-5 img-main-container\">\n <div id=\"img_container\">\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\n <ng-template #elseBlock><img class=\"location-img\"\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\n </ng-template>\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" [routerLink]=\"[loc.id]\">\n {{'View details' | translate}}</button>\n </div>\n \n </div>\n <div class=\"col-md-7 location-info\">\n <p>{{loc.name}}</p>\n <p>{{loc.addresses}}</p>\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</p>\n </div>\n </div>\n </li>\n \n </ul>\n </div>\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\n </div>\n </div>\n </section>\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>\n", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0px;right:0px;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:12vw}.sp-row{display:flex;flex-direction:row}\n"] }]
140
- }], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i2.Router }, { type: i1.BaseUserService }, { type: i1.ViewerService }, { type: i1.NavigationService }, { type: i1.NavigatorService }]; } });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9sb2NhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYXRpb25zL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSxXQUFXLEVBQTRGLFdBQVcsRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQVExTSxNQUFNLE9BQU8sa0JBQWtCO0lBMkIzQixZQUNZLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxXQUE0QixFQUM1QixhQUE0QixFQUM1QixpQkFBb0MsRUFDcEMsZ0JBQWtDO1FBTGxDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBekI5QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLHNCQUFpQixHQUFZLEVBQUUsQ0FBQztRQUVoQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFFeEIsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQU0zQixrR0FBa0c7UUFDbEcseUJBQW9CLEdBQVksRUFBRSxDQUFD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LENBQUM7OytHQXZLUSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxRENYL0IscXFHQStEQTsyRkRwRGEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IExldmVsU3RhdHVzLCBTcGFjZSwgU3BhY2VTZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIFZpZXdlclNlcnZpY2UsIE5hdmlnYXRpb25TZXJ2aWNlLCBOYXZpZ2F0b3JTZXJ2aWNlLCBlbnVtVG9BcnJheSwgVmlzaXQsIE1lbnVJdGVtLCBTZWFyY2hPYmplY3RUeXBlIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbG9jYXRpb25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xvY2F0aW9ucy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIExvY2F0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBjcmVhdGVGb3JtOiBGb3JtR3JvdXA7XG5cbiAgICBsZXZlbHM6IEFycmF5PExldmVsU3RhdHVzPjtcblxuICAgIGltYWdlVG9VcGxvYWQ6IEZpbGU7XG5cbiAgICBpc0FkZGluZyA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWRMb2NhdGlvbnM6IFNwYWNlW10gPSBbXTtcblxuICAgIGlzTWFuYWdlciA9IGZhbHNlO1xuXG4gICAgaXNNdXNldW1Vc2VyID0gdHJ1ZTtcblxuICAgIGxvY2F0aW9uczogU3BhY2VbXSA9IFtdO1xuXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG5cbiAgICB1c2VyU3ViY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGxvY2F0aW9uSURTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKiBMYXN0IGZpbHRlcmVkIExvY2F0aW9ucywgdXNlZCB3aGVuIHdlIGdvIGJhY2sgb24gYWxsIGxvY2F0aW9ucyBmcm9tIHRoZSBzZWFyY2ggYmFyIGxvY2F0aW9uICovXG4gICAgbGFzdEZpbHRyZWRMb2NhdGlvbnM6IFNwYWNlW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdG9yU2VydmljZTogTmF2aWdhdG9yU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5sZXZlbHMgPSBlbnVtVG9BcnJheShMZXZlbFN0YXR1cyk7XG4gICAgICAgIHRoaXMudXNlclN1YmNyaXB0aW9uID0gdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9jYXRpb25JRFN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZWxlY3RlZExvY2F0aW9uKGlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuY3UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJSaWdodHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG5cbiAgICBmaW5kU3BhY2VCeUlkKGlkOiBzdHJpbmcpOiBTcGFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9ucy5maW5kKChsb2MpID0+IGxvYy5pZCA9PT0gaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB3aGVuIHdlIGNoYW5nZSB0aGUgc2VsZWN0ZWQgbG9jYXRpb24gaW4gZmlsdGVyIChzZWFyY2ggYmFyKVxuICAgICAqIEBwYXJhbSBpZCBmb3IgYSBsb2NhdGlvbiwgaWYgbnVsbCBkaXNwbGF5IGFsbCBsYXN0IGZpbHRyZWQgbG9jYXRpb25cbiAgICAgKi9cbiAgICBjaGFuZ2VTZWxlY3RlZExvY2F0aW9uKGlkPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gaWQgPyB0aGlzLmZpbmRTcGFjZUJ5SWQoaWQpIDogbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHNwYWNlID8gW3NwYWNlXSA6IHRoaXMubGFzdEZpbHRyZWRMb2NhdGlvbnM7IC8vIE5ldyBzZWxlY3RlZCBzcGFjZSBvciBsYXN0IGZpbHRlcmVkIGxvY2F0aW9uXG4gICAgfVxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVVc2VyUmlnaHRzKCk7XG4gICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XG4gICAgfVxuXG4gICBcbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51c2VyU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbklEU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gW3sgbGFiZWw6IFwiQWxsIExvY2F0aW9uc1wiLCB1cmw6IFwiL2xvY2FsaXNhdGlvblwiIH1dO1xuICAgICAgICBpZiAodGhpcy5pc0FkZGluZykge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIk5ld1wiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2MgPSB0aGlzLmZpbHRlcmVkTG9jYXRpb25zWzBdO1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBzZWxlY3RlZExvYy5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVXNlclJpZ2h0cygpIHtcbiAgICAgICAgdGhpcy5pc01hbmFnZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc01hbmFnZXJSb2xlSW5BbnlNaXNzaW9uKCk7XG4gICAgICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xuICAgIH1cblxuICAgIGlzTWFuYWdlckZvclNwYWNlKHNwYWNlSUQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc01hbmFnZXIoc3BhY2VJRCkgfHxcbiAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZShzcGFjZUlEKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcbiAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRMb2NhdGlvbnNGb3JDdXJyZW50VXNlcigpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnM7XG4gICAgICAgIHRoaXMubGFzdEZpbHRyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcbiAgICAgICAgdGhpcy5pc0FkZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGVkTG9jYXRpb24oXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudE5hdkJhckxvY2F0aW9uSUQsXG4gICAgICAgICk7IC8vIFNldCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbG9jYXRpb25cbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xuICAgIH1cblxuICAgIG9uQWRkTG9jYXRpb24oKSB7XG4gICAgICAgIHRoaXMuaXNBZGRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW1hZ2VJbnB1dChmaWxlczogRmlsZUxpc3QpIHtcbiAgICAgICAgdGhpcy5pbWFnZVRvVXBsb2FkID0gZmlsZXMuaXRlbSgwKTtcbiAgICB9XG5cbiAgICBvbkZvcm1DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgKTsgLyoqIFJlbW92ZSBzZWxlY3RlZCBsb2NhdGlvbiAqL1xuICAgICAgICB0aGlzLmlzQWRkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25WaXNpdENsaWNrKGxvYzogU3BhY2UsIHZpc2l0OiBWaXNpdCkge1xuICAgICAgICBpZiAoIXRoaXMudXNlclNlcnZpY2UudXNlckhhc0FjY2Vzc1RvQWxsWm9uZXNJblNwYWNlKGxvYy5pZCkpIHtcbiAgICAgICAgICAgIC8vIGdldCBhbGxvd2VkIHN3ZWVwIGZvciB0aGUgdXNlclxuICAgICAgICAgICAgY29uc3QgYWxsb3dlZFN3ZWVwcyA9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRBbGxvd2VkU3dlZXBzSURzRm9yVXNlckluU3BhY2UoXG4gICAgICAgICAgICAgICAgICAgIGxvYy5pZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RTd2VlcCA9IGFsbG93ZWRTd2VlcHNbMF07XG4gICAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2Uuc2V0U3dlZXBUb01vdmUoZmlyc3RTd2VlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZShsb2MuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJtdXNldW1cIiwgbG9jLmlkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJ2aXNpdFwiLCBsb2MuaWRdLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgbW9kZWwzRDogdmlzaXQubW9kZWwzZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseVJlc3VsdHNTZWFyY2hCYXIocmVzdWx0czogU3BhY2VbXSkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gcmVzdWx0cyB8fCB0aGlzLmxvY2F0aW9ucztcbiAgICAgICAgdGhpcy5sYXN0RmlsdHJlZExvY2F0aW9ucyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnM7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5sb2NhdGlvbklEQ2hhbmdlLm5leHQobnVsbCk7IC8vIFdoZW4gd2Ugc2VhcmNoIHdpdGgga2V5d29yZCwgd2Ugd291bGQgbGlrZSB0byBzZWFyY2ggb24gYWxsIGxvY2F0aW9uc1xuICAgIH1cblxuICAgIGdldFNlYXJjaFR5cGUoKTogU2VhcmNoT2JqZWN0VHlwZSB7XG4gICAgICAgIHJldHVybiBTZWFyY2hPYmplY3RUeXBlLkxPQ0FUSU9OO1xuICAgIH1cblxuICAgIGdldFN0cmluZ05vU3BhY2UoZGF0YSk6c3RyaW5ne1xuICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKC9cXHMvZywnJyk7XG4gICAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXRhYlwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItZGFzaGJvYXJkLXRhYlwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm0tM1wiPlxuICAgICAgICA8bGliLXRhYi1uYXZpZ2F0aW9uIChvbkdvQmFjayk9XCJvbkZvcm1DaGFuZ2UobnVsbClcIiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJz48L2xpYi10YWItbmF2aWdhdGlvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0zIHJlZnJlc2hJY29uXCIgKGNsaWNrKT1cInJlZnJlc2goKVwiICpuZ0lmPVwiIShpc0FkZGluZylcIiBuZ2JUb29sdGlwPVwiUmVmcmVzaCBsaXN0XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5IHJlZnJlc2hJY29uXCIgZGF0YS1pY29uPVwiaW9uOnJlZnJlc2gtY2lyY2xlXCIgZGF0YS13aWR0aD1cIjM1XCIgZGF0YS1yb3RhdGU9XCI5MGRlZ1wiPjwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+ICBcbiAgICAgIDxsaWItc2VhcmNoLWJhciAqbmdJZj1cIiFpc0FkZGluZyAmJiAhaXNNdXNldW1Vc2VyXCIgW3NlYXJjaGFibGVdPVwibG9jYXRpb25zXCIgW29iamVjdFR5cGVdPVwiZ2V0U2VhcmNoVHlwZSgpXCJcbiAgICAgICAgKHNlYXJjaEV2ZW50KT1cImFwcGx5UmVzdWx0c1NlYXJjaEJhcigkZXZlbnQpXCI+PC9saWItc2VhcmNoLWJhcj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcC1yb3dcIiAqbmdJZj1cIiFpc0FkZGluZyAmJiBpc01hbmFnZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFkZC1sb2NhdGlvblwiIChjbGljayk9XCJvbkFkZExvY2F0aW9uKClcIj5cbiAgICAgICAgICAgIHt7J0FkZCBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm91dGVyX2NpcmNsZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD0nYnRuLWljb24nIChjbGljayk9XCJvbkFkZExvY2F0aW9uKClcIj48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGhyPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cImlzQWRkaW5nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgPGg0Pnt7J05ldyBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fTwvaDQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2VjdGlvbiAqbmdJZj1cIiFpc0FkZGluZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctNlwiICpuZ0lmPVwiZmlsdGVyZWRMb2NhdGlvbnNcIj5cbiAgICAgICAgICA8dWwgZGF0YS10ZXN0aWQ9XCJsb2NhdGlvbi1saXN0LWNvbnRhaW5lclwiIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvYyBvZiBmaWx0ZXJlZExvY2F0aW9uczsgaW5kZXggYXMgaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBpbWctbWFpbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJpbWdfY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJsb2NhdGlvbi1pbWdcIiAqbmdJZj1cImxvYy5hbm5leGVzOyBlbHNlIGVsc2VCbG9ja1wiIFtzcmNdPVwibG9jLmFubmV4ZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+PGltZyBjbGFzcz1cImxvY2F0aW9uLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuLy4uLy4uLy4uLy4uL2Fzc2V0cy9pbWFnZXMvdmlzdWVsLW9mZi1iaWcuanBnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbbmdDbGFzc109XCJbJ29wZW4tYnRuLScrZ2V0U3RyaW5nTm9TcGFjZShsb2MubmFtZSldXCIgKm5nSWY9XCJpc01hbmFnZXJGb3JTcGFjZShsb2MuaWQpXCIgY2xhc3M9XCJidG4tZGV0YWlsc1wiIFtyb3V0ZXJMaW5rXT1cIltsb2MuaWRdXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3snVmlldyBkZXRhaWxzJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03IGxvY2F0aW9uLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgIDxwPnt7bG9jLm5hbWV9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPnt7bG9jLmFkZHJlc3Nlc319PC9wPlxuICAgICAgICAgICAgICAgICAgPHAgW25nQ2xhc3NdPVwiWyd2aWV3LWJ0bi0nK2dldFN0cmluZ05vU3BhY2UobG9jLm5hbWUpXVwiICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBsb2MudmlzaXRzXCIgKGNsaWNrKT1cIm9uVmlzaXRDbGljayhsb2MsIHZpc2l0KVwiIGNsYXNzPVwidmlzaXQtbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCIgbmdiVG9vbHRpcD1cIlZpc2l0XCI+e3sgdmlzaXQubmFtZSA/IHZpc2l0Lm5hbWUgOiBsb2MubmFtZX19PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gIFxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctNlwiPlxuICAgICAgICAgIDxsaWItbWFwIFtzcGFjZXNdPVwiZmlsdGVyZWRMb2NhdGlvbnNcIj48L2xpYi1tYXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxsaWItZm9ybS1sb2NhdGlvbiAqbmdJZj1cImlzQWRkaW5nXCIgKG9uQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCI+PC9saWItZm9ybS1sb2NhdGlvbj5cbjwvZGl2PlxuIl19
1
+ import { Component } from '@angular/core';
2
+ import { LevelStatus, enumToArray, SearchObjectType } from '@smarterplan/ngx-smarterplan-core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@smarterplan/ngx-smarterplan-core";
5
+ import * as i2 from "@angular/router";
6
+ import * as i3 from "../tab-navigation/tab-navigation.component";
7
+ import * as i4 from "./map/map.component";
8
+ import * as i5 from "../form-location/form-location.component";
9
+ import * as i6 from "@angular/common";
10
+ import * as i7 from "@ng-bootstrap/ng-bootstrap";
11
+ import * as i8 from "@ngx-translate/core";
12
+ export class LocationsComponent {
13
+ constructor(spaceService, router, userService, viewerService, navigationService, navigatorService) {
14
+ this.spaceService = spaceService;
15
+ this.router = router;
16
+ this.userService = userService;
17
+ this.viewerService = viewerService;
18
+ this.navigationService = navigationService;
19
+ this.navigatorService = navigatorService;
20
+ this.isAdding = false;
21
+ this.filteredLocations = [];
22
+ this.isManager = false;
23
+ this.isMuseumUser = true;
24
+ this.locations = [];
25
+ this.menuItems = [];
26
+ /** Last filtered Locations, used when we go back on all locations from the search bar location */
27
+ this.lastFiltredLocations = [];
28
+ this.levels = enumToArray(LevelStatus);
29
+ this.userSubcription = this.userService.isChanged.subscribe((isConnected) => {
30
+ if (isConnected) {
31
+ this.refresh();
32
+ }
33
+ });
34
+ this.locationIDSubscription =
35
+ this.navigatorService.locationIDChange.subscribe((id) => {
36
+ this.changeSelectedLocation(id);
37
+ this.setupMenuItems();
38
+ });
39
+ }
40
+ async ngOnInit() {
41
+ if (this.userService.cu) {
42
+ this.resetList();
43
+ this.updateUserRights();
44
+ }
45
+ this.setupMenuItems();
46
+ }
47
+ findSpaceById(id) {
48
+ return this.locations.find((loc) => loc.id === id);
49
+ }
50
+ /**
51
+ * Update when we change the selected location in filter (search bar)
52
+ * @param id for a location, if null display all last filtred location
53
+ */
54
+ changeSelectedLocation(id) {
55
+ const space = id ? this.findSpaceById(id) : null;
56
+ this.filteredLocations = space ? [space] : this.lastFiltredLocations; // New selected space or last filtered location
57
+ }
58
+ refresh() {
59
+ this.updateUserRights();
60
+ this.resetList();
61
+ }
62
+ ngOnDestroy() {
63
+ this.userSubcription.unsubscribe();
64
+ this.locationIDSubscription.unsubscribe();
65
+ }
66
+ setupMenuItems() {
67
+ this.menuItems = [{ label: "All Locations", url: "/localisation" }];
68
+ if (this.isAdding) {
69
+ this.menuItems.push({ label: "New" });
70
+ }
71
+ if (this.filteredLocations.length === 1) {
72
+ const selectedLoc = this.filteredLocations[0];
73
+ this.menuItems.push({ label: selectedLoc.name });
74
+ }
75
+ }
76
+ updateUserRights() {
77
+ this.isManager = this.userService.hasManagerRoleInAnyMission();
78
+ this.isMuseumUser = this.userService.hasOnlyMuseumRole();
79
+ }
80
+ isManagerForSpace(spaceID) {
81
+ return (this.userService.isManager(spaceID) ||
82
+ this.userService.isGuide(spaceID));
83
+ }
84
+ async resetList() {
85
+ this.locations = await this.spaceService.getLocationsForCurrentUser();
86
+ this.filteredLocations = this.locations;
87
+ this.lastFiltredLocations = this.locations;
88
+ this.isAdding = false;
89
+ this.changeSelectedLocation(this.navigatorService.currentNavBarLocationID); // Set for the current selected location
90
+ this.setupMenuItems();
91
+ }
92
+ onAddLocation() {
93
+ this.isAdding = true;
94
+ this.setupMenuItems();
95
+ }
96
+ handleImageInput(files) {
97
+ this.imageToUpload = files.item(0);
98
+ }
99
+ onFormChange(event) {
100
+ this.navigatorService.locationIDChange.next(null); /** Remove selected location */
101
+ this.isAdding = false;
102
+ if (event) {
103
+ this.resetList();
104
+ }
105
+ this.setupMenuItems();
106
+ }
107
+ async onVisitClick(loc, visit) {
108
+ if (!this.userService.userHasAccessToAllZonesInSpace(loc.id)) {
109
+ // get allowed sweep for the user
110
+ const allowedSweeps = await this.navigationService.getAllowedSweepsIDsForUserInSpace(loc.id);
111
+ const firstSweep = allowedSweeps[0];
112
+ this.viewerService.setSweepToMove(firstSweep);
113
+ }
114
+ if (this.userService.isGuide(loc.id)) {
115
+ this.router.navigate(["museum", loc.id]);
116
+ }
117
+ else {
118
+ this.router.navigate(["visit", loc.id], {
119
+ queryParams: { model3D: visit.model3d },
120
+ });
121
+ }
122
+ }
123
+ applyResultsSearchBar(results) {
124
+ this.filteredLocations = results || this.locations;
125
+ this.lastFiltredLocations = this.filteredLocations;
126
+ this.navigatorService.locationIDChange.next(null); // When we search with keyword, we would like to search on all locations
127
+ }
128
+ getSearchType() {
129
+ return SearchObjectType.LOCATION;
130
+ }
131
+ getStringNoSpace(data) {
132
+ return data.replace(/\s/g, '');
133
+ }
134
+ }
135
+ LocationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LocationsComponent, deps: [{ token: i1.SpaceService }, { token: i2.Router }, { token: i1.BaseUserService }, { token: i1.ViewerService }, { token: i1.NavigationService }, { token: i1.NavigatorService }], target: i0.ɵɵFactoryTarget.Component });
136
+ LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: LocationsComponent, selector: "lib-locations", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\r\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\r\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\r\n </span>\r\n </div> \r\n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\r\n \r\n <div class=\"col-md-8\">\r\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\r\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\r\n {{'Add location' | translate}}</button>\r\n <!-- <div class=\"outer_circle\">\r\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"row\" *ngIf=\"isAdding\">\r\n <div class=\"col-md-6\">\r\n <h4>{{'New location' | translate}}</h4>\r\n </div>\r\n </div>\r\n <section *ngIf=\"!isAdding\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\r\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\r\n <li class=\"d-flex justify-content-between list-group-item\"\r\n *ngFor=\"let loc of filteredLocations; index as index\">\r\n <div class=\"d-flex\">\r\n <div class=\"col-md-5 img-main-container\">\r\n <div id=\"img_container\">\r\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\r\n <ng-template #elseBlock><img class=\"location-img\"\r\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\r\n </ng-template>\r\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" [routerLink]=\"[loc.id]\">\r\n {{'View details' | translate}}</button>\r\n </div>\r\n \r\n </div>\r\n <div class=\"col-md-7 location-info\">\r\n <p>{{loc.name}}</p>\r\n <p>{{loc.addresses}}</p>\r\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\r\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</p>\r\n </div>\r\n </div>\r\n </li>\r\n \r\n </ul>\r\n </div>\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\r\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\r\n </div>\r\n </div>\r\n </section>\r\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>\r\n", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0px;right:0px;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:12vw}.sp-row{display:flex;flex-direction:row}\n"], components: [{ type: i3.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i1.SearchBarComponent, selector: "lib-search-bar", inputs: ["searchable", "objectType"], outputs: ["searchEvent"] }, { type: i4.MapComponent, selector: "lib-map", inputs: ["spaces"] }, { type: i5.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "translate": i8.TranslatePipe } });
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LocationsComponent, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'lib-locations', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation (onGoBack)=\"onFormChange(null)\" [menuItems]='menuItems'></lib-tab-navigation>\r\n <span class=\"ml-3 refreshIcon\" (click)=\"refresh()\" *ngIf=\"!(isAdding)\" ngbTooltip=\"Refresh list\">\r\n <span class=\"iconify refreshIcon\" data-icon=\"ion:refresh-circle\" data-width=\"35\" data-rotate=\"90deg\"></span>\r\n </span>\r\n </div> \r\n <lib-search-bar *ngIf=\"!isAdding && !isMuseumUser\" [searchable]=\"locations\" [objectType]=\"getSearchType()\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\"></lib-search-bar>\r\n \r\n <div class=\"col-md-8\">\r\n <div class=\"sp-row\" *ngIf=\"!isAdding && isManager\">\r\n <button data-testid=\"new-location-btn\" class=\"btn btn-outline-primary rounded-pill add-location\" (click)=\"onAddLocation()\">\r\n {{'Add location' | translate}}</button>\r\n <!-- <div class=\"outer_circle\">\r\n <button id='btn-icon' (click)=\"onAddLocation()\"></button>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"row\" *ngIf=\"isAdding\">\r\n <div class=\"col-md-6\">\r\n <h4>{{'New location' | translate}}</h4>\r\n </div>\r\n </div>\r\n <section *ngIf=\"!isAdding\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\" *ngIf=\"filteredLocations\">\r\n <ul data-testid=\"location-list-container\" class=\"list-group list-group-flush\">\r\n <li class=\"d-flex justify-content-between list-group-item\"\r\n *ngFor=\"let loc of filteredLocations; index as index\">\r\n <div class=\"d-flex\">\r\n <div class=\"col-md-5 img-main-container\">\r\n <div id=\"img_container\">\r\n <img class=\"location-img\" *ngIf=\"loc.annexes; else elseBlock\" [src]=\"loc.annexes\">\r\n <ng-template #elseBlock><img class=\"location-img\"\r\n src=\"./../../../../assets/images/visuel-off-big.jpg\" />\r\n </ng-template>\r\n <button [ngClass]=\"['open-btn-'+getStringNoSpace(loc.name)]\" *ngIf=\"isManagerForSpace(loc.id)\" class=\"btn-details\" [routerLink]=\"[loc.id]\">\r\n {{'View details' | translate}}</button>\r\n </div>\r\n \r\n </div>\r\n <div class=\"col-md-7 location-info\">\r\n <p>{{loc.name}}</p>\r\n <p>{{loc.addresses}}</p>\r\n <p [ngClass]=\"['view-btn-'+getStringNoSpace(loc.name)]\" *ngFor=\"let visit of loc.visits\" (click)=\"onVisitClick(loc, visit)\" class=\"visit-name\"\r\n [style.cursor]=\"'pointer'\" ngbTooltip=\"Visit\">{{ visit.name ? visit.name : loc.name}}</p>\r\n </div>\r\n </div>\r\n </li>\r\n \r\n </ul>\r\n </div>\r\n <div class=\"col-sm-12 col-md-12 col-lg-6\">\r\n <lib-map [spaces]=\"filteredLocations\"></lib-map>\r\n </div>\r\n </div>\r\n </section>\r\n <lib-form-location *ngIf=\"isAdding\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>\r\n", styles: [".searchbar{margin-bottom:10px}input[type=file]{display:none}.form-control{border-radius:var(--form-control-border-radius)}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}section .list-group{margin-top:15px}section .list-group-item{padding:5px 0}section .location-info{font-size:1.1em}section .location-img{width:100%;object-fit:cover;object-position:center bottom;height:165px}#img_container{position:relative;display:inline-block;text-align:center;width:250px}.img-main-container{max-width:250px;width:250px!important;margin-right:10px}.visit-name{color:var(--smarterplan-primary);font-weight:600}.btn-details{background-color:var(--smarterplan-primary-transparent);position:absolute;color:#fff;bottom:0px;right:0px;width:100%;height:30%;border:none;font-size:1em;text-transform:lowercase}#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.refreshIcon{color:var(--smarterplan-primary);cursor:pointer}.refreshIcon svg{vertical-align:middle!important}.add-location{width:12vw}.sp-row{display:flex;flex-direction:row}\n"] }]
140
+ }], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i2.Router }, { type: i1.BaseUserService }, { type: i1.ViewerService }, { type: i1.NavigationService }, { type: i1.NavigatorService }]; } });
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9sb2NhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvbG9jYXRpb25zL2xvY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSxXQUFXLEVBQTRGLFdBQVcsRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7OztBQVExTSxNQUFNLE9BQU8sa0JBQWtCO0lBMkIzQixZQUNZLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxXQUE0QixFQUM1QixhQUE0QixFQUM1QixpQkFBb0MsRUFDcEMsZ0JBQWtDO1FBTGxDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBekI5QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLHNCQUFpQixHQUFZLEVBQUUsQ0FBQztRQUVoQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFFeEIsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQU0zQixrR0FBa0c7UUFDbEcseUJBQW9CLEdBQVksRUFBRSxDQUFD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LENBQUM7OytHQXZLUSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxRENYL0IsbXlHQStEQTsyRkRwRGEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IExldmVsU3RhdHVzLCBTcGFjZSwgU3BhY2VTZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIFZpZXdlclNlcnZpY2UsIE5hdmlnYXRpb25TZXJ2aWNlLCBOYXZpZ2F0b3JTZXJ2aWNlLCBlbnVtVG9BcnJheSwgVmlzaXQsIE1lbnVJdGVtLCBTZWFyY2hPYmplY3RUeXBlIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1sb2NhdGlvbnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb2NhdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xvY2F0aW9ucy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2NhdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIGNyZWF0ZUZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICBsZXZlbHM6IEFycmF5PExldmVsU3RhdHVzPjtcclxuXHJcbiAgICBpbWFnZVRvVXBsb2FkOiBGaWxlO1xyXG5cclxuICAgIGlzQWRkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgZmlsdGVyZWRMb2NhdGlvbnM6IFNwYWNlW10gPSBbXTtcclxuXHJcbiAgICBpc01hbmFnZXIgPSBmYWxzZTtcclxuXHJcbiAgICBpc011c2V1bVVzZXIgPSB0cnVlO1xyXG5cclxuICAgIGxvY2F0aW9uczogU3BhY2VbXSA9IFtdO1xyXG5cclxuICAgIG1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIHVzZXJTdWJjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIGxvY2F0aW9uSURTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKiogTGFzdCBmaWx0ZXJlZCBMb2NhdGlvbnMsIHVzZWQgd2hlbiB3ZSBnbyBiYWNrIG9uIGFsbCBsb2NhdGlvbnMgZnJvbSB0aGUgc2VhcmNoIGJhciBsb2NhdGlvbiAqL1xyXG4gICAgbGFzdEZpbHRyZWRMb2NhdGlvbnM6IFNwYWNlW10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmxldmVscyA9IGVudW1Ub0FycmF5KExldmVsU3RhdHVzKTtcclxuICAgICAgICB0aGlzLnVzZXJTdWJjcmlwdGlvbiA9IHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkLnN1YnNjcmliZSgoaXNDb25uZWN0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmxvY2F0aW9uSURTdWJzY3JpcHRpb24gPVxyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5zdWJzY3JpYmUoKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGVkTG9jYXRpb24oaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAodGhpcy51c2VyU2VydmljZS5jdSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJSaWdodHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmaW5kU3BhY2VCeUlkKGlkOiBzdHJpbmcpOiBTcGFjZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb25zLmZpbmQoKGxvYykgPT4gbG9jLmlkID09PSBpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgd2hlbiB3ZSBjaGFuZ2UgdGhlIHNlbGVjdGVkIGxvY2F0aW9uIGluIGZpbHRlciAoc2VhcmNoIGJhcilcclxuICAgICAqIEBwYXJhbSBpZCBmb3IgYSBsb2NhdGlvbiwgaWYgbnVsbCBkaXNwbGF5IGFsbCBsYXN0IGZpbHRyZWQgbG9jYXRpb25cclxuICAgICAqL1xyXG4gICAgY2hhbmdlU2VsZWN0ZWRMb2NhdGlvbihpZD86IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHNwYWNlID0gaWQgPyB0aGlzLmZpbmRTcGFjZUJ5SWQoaWQpIDogbnVsbDtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gc3BhY2UgPyBbc3BhY2VdIDogdGhpcy5sYXN0RmlsdHJlZExvY2F0aW9uczsgLy8gTmV3IHNlbGVjdGVkIHNwYWNlIG9yIGxhc3QgZmlsdGVyZWQgbG9jYXRpb25cclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVXNlclJpZ2h0cygpO1xyXG4gICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICB9XHJcblxyXG4gICBcclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMudXNlclN1YmNyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbklEU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbeyBsYWJlbDogXCJBbGwgTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfV07XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBZGRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIk5ld1wiIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZExvY2F0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2MgPSB0aGlzLmZpbHRlcmVkTG9jYXRpb25zWzBdO1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHsgbGFiZWw6IHNlbGVjdGVkTG9jLm5hbWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVVzZXJSaWdodHMoKSB7XHJcbiAgICAgICAgdGhpcy5pc01hbmFnZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc01hbmFnZXJSb2xlSW5BbnlNaXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5pc011c2V1bVVzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc09ubHlNdXNldW1Sb2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNYW5hZ2VyRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc01hbmFnZXIoc3BhY2VJRCkgfHxcclxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc0d1aWRlKHNwYWNlSUQpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXNldExpc3QoKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRMb2NhdGlvbnNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB0aGlzLmxhc3RGaWx0cmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnM7XHJcbiAgICAgICAgdGhpcy5pc0FkZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlU2VsZWN0ZWRMb2NhdGlvbihcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJMb2NhdGlvbklELFxyXG4gICAgICAgICk7IC8vIFNldCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbG9jYXRpb25cclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25BZGRMb2NhdGlvbigpIHtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSW1hZ2VJbnB1dChmaWxlczogRmlsZUxpc3QpIHtcclxuICAgICAgICB0aGlzLmltYWdlVG9VcGxvYWQgPSBmaWxlcy5pdGVtKDApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmxvY2F0aW9uSURDaGFuZ2UubmV4dChcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICApOyAvKiogUmVtb3ZlIHNlbGVjdGVkIGxvY2F0aW9uICovXHJcbiAgICAgICAgdGhpcy5pc0FkZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25WaXNpdENsaWNrKGxvYzogU3BhY2UsIHZpc2l0OiBWaXNpdCkge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyU2VydmljZS51c2VySGFzQWNjZXNzVG9BbGxab25lc0luU3BhY2UobG9jLmlkKSkge1xyXG4gICAgICAgICAgICAvLyBnZXQgYWxsb3dlZCBzd2VlcCBmb3IgdGhlIHVzZXJcclxuICAgICAgICAgICAgY29uc3QgYWxsb3dlZFN3ZWVwcyA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEFsbG93ZWRTd2VlcHNJRHNGb3JVc2VySW5TcGFjZShcclxuICAgICAgICAgICAgICAgICAgICBsb2MuaWQsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdFN3ZWVwID0gYWxsb3dlZFN3ZWVwc1swXTtcclxuICAgICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNldFN3ZWVwVG9Nb3ZlKGZpcnN0U3dlZXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy51c2VyU2VydmljZS5pc0d1aWRlKGxvYy5pZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wibXVzZXVtXCIsIGxvYy5pZF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInZpc2l0XCIsIGxvYy5pZF0sIHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IG1vZGVsM0Q6IHZpc2l0Lm1vZGVsM2QgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5UmVzdWx0c1NlYXJjaEJhcihyZXN1bHRzOiBTcGFjZVtdKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHJlc3VsdHMgfHwgdGhpcy5sb2NhdGlvbnM7XHJcbiAgICAgICAgdGhpcy5sYXN0RmlsdHJlZExvY2F0aW9ucyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnM7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmxvY2F0aW9uSURDaGFuZ2UubmV4dChudWxsKTsgLy8gV2hlbiB3ZSBzZWFyY2ggd2l0aCBrZXl3b3JkLCB3ZSB3b3VsZCBsaWtlIHRvIHNlYXJjaCBvbiBhbGwgbG9jYXRpb25zXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VhcmNoVHlwZSgpOiBTZWFyY2hPYmplY3RUeXBlIHtcclxuICAgICAgICByZXR1cm4gU2VhcmNoT2JqZWN0VHlwZS5MT0NBVElPTjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdHJpbmdOb1NwYWNlKGRhdGEpOnN0cmluZ3tcclxuICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKC9cXHMvZywnJyk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXNoYm9hcmQtdGFiXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm0tM1wiPlxyXG4gICAgICAgIDxsaWItdGFiLW5hdmlnYXRpb24gKG9uR29CYWNrKT1cIm9uRm9ybUNoYW5nZShudWxsKVwiIFttZW51SXRlbXNdPSdtZW51SXRlbXMnPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMyByZWZyZXNoSWNvblwiIChjbGljayk9XCJyZWZyZXNoKClcIiAqbmdJZj1cIiEoaXNBZGRpbmcpXCIgbmdiVG9vbHRpcD1cIlJlZnJlc2ggbGlzdFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5IHJlZnJlc2hJY29uXCIgZGF0YS1pY29uPVwiaW9uOnJlZnJlc2gtY2lyY2xlXCIgZGF0YS13aWR0aD1cIjM1XCIgZGF0YS1yb3RhdGU9XCI5MGRlZ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PiAgXHJcbiAgICAgIDxsaWItc2VhcmNoLWJhciAqbmdJZj1cIiFpc0FkZGluZyAmJiAhaXNNdXNldW1Vc2VyXCIgW3NlYXJjaGFibGVdPVwibG9jYXRpb25zXCIgW29iamVjdFR5cGVdPVwiZ2V0U2VhcmNoVHlwZSgpXCJcclxuICAgICAgICAoc2VhcmNoRXZlbnQpPVwiYXBwbHlSZXN1bHRzU2VhcmNoQmFyKCRldmVudClcIj48L2xpYi1zZWFyY2gtYmFyPlxyXG4gICAgICBcclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNwLXJvd1wiICpuZ0lmPVwiIWlzQWRkaW5nICYmIGlzTWFuYWdlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1idG5cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhZGQtbG9jYXRpb25cIiAoY2xpY2spPVwib25BZGRMb2NhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIHt7J0FkZCBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwib3V0ZXJfY2lyY2xlXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9J2J0bi1pY29uJyAoY2xpY2spPVwib25BZGRMb2NhdGlvbigpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aHI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJpc0FkZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICA8aDQ+e3snTmV3IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZX19PC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxzZWN0aW9uICpuZ0lmPVwiIWlzQWRkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctNlwiICpuZ0lmPVwiZmlsdGVyZWRMb2NhdGlvbnNcIj5cclxuICAgICAgICAgIDx1bCBkYXRhLXRlc3RpZD1cImxvY2F0aW9uLWxpc3QtY29udGFpbmVyXCIgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGxpc3QtZ3JvdXAtaXRlbVwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvYyBvZiBmaWx0ZXJlZExvY2F0aW9uczsgaW5kZXggYXMgaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgaW1nLW1haW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJpbWdfY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImxvY2F0aW9uLWltZ1wiICpuZ0lmPVwibG9jLmFubmV4ZXM7IGVsc2UgZWxzZUJsb2NrXCIgW3NyY109XCJsb2MuYW5uZXhlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPjxpbWcgY2xhc3M9XCJsb2NhdGlvbi1pbWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuLy4uLy4uLy4uLy4uL2Fzc2V0cy9pbWFnZXMvdmlzdWVsLW9mZi1iaWcuanBnXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwiWydvcGVuLWJ0bi0nK2dldFN0cmluZ05vU3BhY2UobG9jLm5hbWUpXVwiICpuZ0lmPVwiaXNNYW5hZ2VyRm9yU3BhY2UobG9jLmlkKVwiIGNsYXNzPVwiYnRuLWRldGFpbHNcIiBbcm91dGVyTGlua109XCJbbG9jLmlkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3snVmlldyBkZXRhaWxzJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTcgbG9jYXRpb24taW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICA8cD57e2xvYy5uYW1lfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgIDxwPnt7bG9jLmFkZHJlc3Nlc319PC9wPlxyXG4gICAgICAgICAgICAgICAgICA8cCBbbmdDbGFzc109XCJbJ3ZpZXctYnRuLScrZ2V0U3RyaW5nTm9TcGFjZShsb2MubmFtZSldXCIgKm5nRm9yPVwibGV0IHZpc2l0IG9mIGxvYy52aXNpdHNcIiAoY2xpY2spPVwib25WaXNpdENsaWNrKGxvYywgdmlzaXQpXCIgY2xhc3M9XCJ2aXNpdC1uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiIG5nYlRvb2x0aXA9XCJWaXNpdFwiPnt7IHZpc2l0Lm5hbWUgPyB2aXNpdC5uYW1lIDogbG9jLm5hbWV9fTwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gIFxyXG4gICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctNlwiPlxyXG4gICAgICAgICAgPGxpYi1tYXAgW3NwYWNlc109XCJmaWx0ZXJlZExvY2F0aW9uc1wiPjwvbGliLW1hcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgICA8bGliLWZvcm0tbG9jYXRpb24gKm5nSWY9XCJpc0FkZGluZ1wiIChvbkNoYW5nZSk9XCJvbkZvcm1DaGFuZ2UoJGV2ZW50KVwiPjwvbGliLWZvcm0tbG9jYXRpb24+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -1,66 +1,66 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/router";
4
- import * as i2 from "@angular/common";
5
- export class MapPopupComponent {
6
- constructor(router, ngZone) {
7
- this.router = router;
8
- this.ngZone = ngZone;
9
- this.isOnPopup = false;
10
- this.isMuseumUser = true;
11
- }
12
- ngOnInit() {
13
- this.marker.on("click", () => this.onClickVisitFirst());
14
- this.marker.on("mouseover", () => {
15
- this.isOnPopup = true;
16
- if (!this.marker.isPopupOpen()) {
17
- this.openPopup();
18
- }
19
- });
20
- }
21
- openPopup() {
22
- this.marker.openPopup();
23
- this.isOnPopup = false;
24
- this.popuparea = document.querySelector(".leaflet-popup");
25
- this.popuparea.addEventListener("mouseleave", () => {
26
- this.closePopup();
27
- });
28
- this.popuparea.addEventListener("mouseover", () => {
29
- this.isOnPopup = true;
30
- });
31
- this.marker.on("mouseout", () => {
32
- this.closePopup();
33
- });
34
- }
35
- closePopup() {
36
- this.isOnPopup = false;
37
- /** We want to wait to avoid glitch */
38
- setTimeout(() => {
39
- if (!this.isOnPopup) {
40
- this.marker.closePopup();
41
- }
42
- }, 100);
43
- }
44
- onClickVisitFirst() {
45
- if (this.space.visits.length === 0) {
46
- console.log("No space to visit !");
47
- }
48
- else {
49
- this.onVisitClick(this.space.visits[0]);
50
- }
51
- }
52
- async onVisitClick(visit) {
53
- this.ngZone.run(() => {
54
- this.router.navigate(["visit", this.space.id], {
55
- queryParams: { model3D: visit.model3d },
56
- });
57
- });
58
- }
59
- }
60
- MapPopupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MapPopupComponent, deps: [{ token: i1.Router }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
61
- MapPopupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MapPopupComponent, selector: "lib-map-popup", ngImport: i0, template: "<div id=\"map-popup\">\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\n <img [src]=\"space.annexes\" />\n </div>\n <div class=\"map-popup-details\">\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\n <span class=\"map-popup-address\">{{space.addresses}}</span>\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\n </div>\n</div>\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
62
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MapPopupComponent, decorators: [{
63
- type: Component,
64
- args: [{ selector: 'lib-map-popup', template: "<div id=\"map-popup\">\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\n <img [src]=\"space.annexes\" />\n </div>\n <div class=\"map-popup-details\">\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\n <span class=\"map-popup-address\">{{space.addresses}}</span>\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\n </div>\n</div>\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"] }]
65
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.NgZone }]; } });
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/router";
4
+ import * as i2 from "@angular/common";
5
+ export class MapPopupComponent {
6
+ constructor(router, ngZone) {
7
+ this.router = router;
8
+ this.ngZone = ngZone;
9
+ this.isOnPopup = false;
10
+ this.isMuseumUser = true;
11
+ }
12
+ ngOnInit() {
13
+ this.marker.on("click", () => this.onClickVisitFirst());
14
+ this.marker.on("mouseover", () => {
15
+ this.isOnPopup = true;
16
+ if (!this.marker.isPopupOpen()) {
17
+ this.openPopup();
18
+ }
19
+ });
20
+ }
21
+ openPopup() {
22
+ this.marker.openPopup();
23
+ this.isOnPopup = false;
24
+ this.popuparea = document.querySelector(".leaflet-popup");
25
+ this.popuparea.addEventListener("mouseleave", () => {
26
+ this.closePopup();
27
+ });
28
+ this.popuparea.addEventListener("mouseover", () => {
29
+ this.isOnPopup = true;
30
+ });
31
+ this.marker.on("mouseout", () => {
32
+ this.closePopup();
33
+ });
34
+ }
35
+ closePopup() {
36
+ this.isOnPopup = false;
37
+ /** We want to wait to avoid glitch */
38
+ setTimeout(() => {
39
+ if (!this.isOnPopup) {
40
+ this.marker.closePopup();
41
+ }
42
+ }, 100);
43
+ }
44
+ onClickVisitFirst() {
45
+ if (this.space.visits.length === 0) {
46
+ console.log("No space to visit !");
47
+ }
48
+ else {
49
+ this.onVisitClick(this.space.visits[0]);
50
+ }
51
+ }
52
+ async onVisitClick(visit) {
53
+ this.ngZone.run(() => {
54
+ this.router.navigate(["visit", this.space.id], {
55
+ queryParams: { model3D: visit.model3d },
56
+ });
57
+ });
58
+ }
59
+ }
60
+ MapPopupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MapPopupComponent, deps: [{ token: i1.Router }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
61
+ MapPopupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MapPopupComponent, selector: "lib-map-popup", ngImport: i0, template: "<div id=\"map-popup\">\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\n <img [src]=\"space.annexes\" />\n </div>\n <div class=\"map-popup-details\">\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\n <span class=\"map-popup-address\">{{space.addresses}}</span>\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\n </div>\n</div>\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MapPopupComponent, decorators: [{
63
+ type: Component,
64
+ args: [{ selector: 'lib-map-popup', template: "<div id=\"map-popup\">\n <div class=\"map-popup-header\" (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">\n <img [src]=\"space.annexes\" />\n </div>\n <div class=\"map-popup-details\">\n <h1 (click)=\"onClickVisitFirst()\" [style.cursor]=\"'pointer'\">{{space.name}}</h1>\n <span class=\"map-popup-address\">{{space.addresses}}</span>\n <span *ngFor=\"let visit of space.visits\" class=\"map-popup-visit\" (click)=\"onVisitClick(visit)\"\n [style.cursor]=\"'pointer'\">\u27A4 {{ visit.name ? visit.name : space.name}}</span>\n </div>\n</div>\n", styles: [".map-popup-header{height:120px;overflow:hidden;border-top-right-radius:20px;border-top-left-radius:20px}.map-popup-header img{width:100%;position:relative;top:50%;transform:translateY(-50%)}.map-popup-details{padding:5px 10px 10px;border-bottom-left-radius:20px;border-bottom-right-radius:20px;background-color:#fff;color:#000}.map-popup-details{display:flex;flex-direction:column}.map-popup-details h1{font-size:1.5rem;font-weight:700;margin-bottom:0;color:var(--smarterplan-primary)}.map-popup-address{align-self:flex-end;margin-bottom:10px}.map-popup-visit{color:var(--smarterplan-primary);font-size:1.15rem}.map-popup-visit:hover{color:var(--smarterplan-primary)}\n"] }]
65
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.NgZone }]; } });
66
66
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2xvY2F0aW9ucy9tYXAvbWFwLXBvcHVwL21hcC1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9sb2NhdGlvbnMvbWFwL21hcC1wb3B1cC9tYXAtcG9wdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7Ozs7QUFVMUQsTUFBTSxPQUFPLGlCQUFpQjtJQVkxQixZQUFvQixNQUFjLEVBQVUsTUFBYztRQUF0QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUoxRCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO0lBRTBDLENBQUM7SUFFL0QsUUFBUTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNwQjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFNBQVM7UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtZQUMvQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxVQUFVO1FBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsc0NBQXNDO1FBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUM1QjtRQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0M7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFZO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTthQUMxQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OzhHQWxFUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixxRENWOUIsMmxCQVdBOzJGRERhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBOZ1pvbmUsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1hcmtlciB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgU3BhY2UsIFZpc2l0IH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW1hcC1wb3B1cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAtcG9wdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAtcG9wdXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXBQb3B1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBzcGFjZTogU3BhY2U7XG5cbiAgICBtYXJrZXI6IE1hcmtlcjtcblxuICAgIHBvcHVwYXJlYTogSFRNTEVsZW1lbnQ7XG5cbiAgICBpc09uUG9wdXAgPSBmYWxzZTtcblxuICAgIGlzTXVzZXVtVXNlciA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm1hcmtlci5vbihcImNsaWNrXCIsICgpID0+IHRoaXMub25DbGlja1Zpc2l0Rmlyc3QoKSk7XG5cbiAgICAgICAgdGhpcy5tYXJrZXIub24oXCJtb3VzZW92ZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc09uUG9wdXAgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlci5pc1BvcHVwT3BlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3BlblBvcHVwKCkge1xuICAgICAgICB0aGlzLm1hcmtlci5vcGVuUG9wdXAoKTtcblxuICAgICAgICB0aGlzLmlzT25Qb3B1cCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBvcHVwYXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubGVhZmxldC1wb3B1cFwiKTtcblxuICAgICAgICB0aGlzLnBvcHVwYXJlYS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9wdXBhcmVhLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc09uUG9wdXAgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXJrZXIub24oXCJtb3VzZW91dFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xvc2VQb3B1cCgpIHtcbiAgICAgICAgdGhpcy5pc09uUG9wdXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIFdlIHdhbnQgdG8gd2FpdCB0byBhdm9pZCBnbGl0Y2ggKi9cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNPblBvcHVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrZXIuY2xvc2VQb3B1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgIH1cblxuICAgIG9uQ2xpY2tWaXNpdEZpcnN0KCkge1xuICAgICAgICBpZiAodGhpcy5zcGFjZS52aXNpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIHNwYWNlIHRvIHZpc2l0ICFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uVmlzaXRDbGljayh0aGlzLnNwYWNlLnZpc2l0c1swXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblZpc2l0Q2xpY2sodmlzaXQ6IFZpc2l0KSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJ2aXNpdFwiLCB0aGlzLnNwYWNlLmlkXSwge1xuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IG1vZGVsM0Q6IHZpc2l0Lm1vZGVsM2QgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbn1cbiIsIjxkaXYgaWQ9XCJtYXAtcG9wdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWFwLXBvcHVwLWhlYWRlclwiIChjbGljayk9XCJvbkNsaWNrVmlzaXRGaXJzdCgpXCIgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIj5cbiAgICAgICAgPGltZyBbc3JjXT1cInNwYWNlLmFubmV4ZXNcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYXAtcG9wdXAtZGV0YWlsc1wiPlxuICAgIDxoMSAoY2xpY2spPVwib25DbGlja1Zpc2l0Rmlyc3QoKVwiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+e3tzcGFjZS5uYW1lfX08L2gxPlxuICAgIDxzcGFuIGNsYXNzPVwibWFwLXBvcHVwLWFkZHJlc3NcIj57e3NwYWNlLmFkZHJlc3Nlc319PC9zcGFuPlxuICAgIDxzcGFuICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBzcGFjZS52aXNpdHNcIiBjbGFzcz1cIm1hcC1wb3B1cC12aXNpdFwiIChjbGljayk9XCJvblZpc2l0Q2xpY2sodmlzaXQpXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+4p6kIHt7IHZpc2l0Lm5hbWUgPyB2aXNpdC5uYW1lIDogc3BhY2UubmFtZX19PC9zcGFuPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=