@smarterplan/ngx-smarterplan-core 1.2.45 → 1.2.47

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 (170) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -59
  3. package/esm2020/lib/components/loader/loader.component.mjs +23 -23
  4. package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +80 -80
  5. package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +99 -99
  6. package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +384 -384
  7. package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +147 -147
  8. package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +40 -40
  9. package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -63
  10. package/esm2020/lib/components/support-modal/support-modal.component.mjs +66 -66
  11. package/esm2020/lib/config.mjs +4 -4
  12. package/esm2020/lib/helpers.service.mjs +470 -470
  13. package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +69 -69
  14. package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +51 -51
  15. package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +61 -61
  16. package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +158 -158
  17. package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +85 -85
  18. package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +128 -128
  19. package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +249 -249
  20. package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -98
  21. package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -64
  22. package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -221
  23. package/esm2020/lib/mattertagData.mjs +165 -165
  24. package/esm2020/lib/ngx-smarterplan-core.module.mjs +122 -122
  25. package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -14
  26. package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -66
  27. package/esm2020/lib/pipes/format-date-number-to-digits.pipe.mjs +30 -30
  28. package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -26
  29. package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -20
  30. package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -104
  31. package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -29
  32. package/esm2020/lib/services/amplify-cache.service.mjs +72 -72
  33. package/esm2020/lib/services/base-tab.service.mjs +24 -24
  34. package/esm2020/lib/services/baseVisibility.service.mjs +18 -18
  35. package/esm2020/lib/services/content.service.mjs +135 -135
  36. package/esm2020/lib/services/filter.service.mjs +599 -599
  37. package/esm2020/lib/services/intervention.service.mjs +236 -236
  38. package/esm2020/lib/services/locale.service.mjs +45 -45
  39. package/esm2020/lib/services/matterport-import.service.mjs +340 -340
  40. package/esm2020/lib/services/matterport.service.mjs +1587 -1587
  41. package/esm2020/lib/services/models/affectation.service.mjs +60 -60
  42. package/esm2020/lib/services/models/base-object.service.mjs +70 -70
  43. package/esm2020/lib/services/models/capture.service.mjs +34 -34
  44. package/esm2020/lib/services/models/comment.service.mjs +98 -98
  45. package/esm2020/lib/services/models/domain.service.mjs +78 -78
  46. package/esm2020/lib/services/models/equipment.service.mjs +683 -683
  47. package/esm2020/lib/services/models/event.service.mjs +128 -128
  48. package/esm2020/lib/services/models/feature.service.mjs +380 -380
  49. package/esm2020/lib/services/models/hashtag.service.mjs +38 -38
  50. package/esm2020/lib/services/models/layer.service.mjs +33 -33
  51. package/esm2020/lib/services/models/measurement.service.mjs +199 -199
  52. package/esm2020/lib/services/models/mission.service.mjs +206 -206
  53. package/esm2020/lib/services/models/navigation.service.mjs +92 -92
  54. package/esm2020/lib/services/models/node.service.mjs +31 -31
  55. package/esm2020/lib/services/models/object3D.service.mjs +364 -364
  56. package/esm2020/lib/services/models/operation.service.mjs +59 -59
  57. package/esm2020/lib/services/models/organisation.service.mjs +73 -73
  58. package/esm2020/lib/services/models/plan.service.mjs +799 -799
  59. package/esm2020/lib/services/models/poi.service.mjs +103 -103
  60. package/esm2020/lib/services/models/profile.service.mjs +58 -58
  61. package/esm2020/lib/services/models/property.service.mjs +44 -44
  62. package/esm2020/lib/services/models/space.service.mjs +204 -204
  63. package/esm2020/lib/services/models/template.service.mjs +41 -41
  64. package/esm2020/lib/services/models/ticket.service.mjs +526 -526
  65. package/esm2020/lib/services/models/visit.service.mjs +130 -130
  66. package/esm2020/lib/services/models/zone.service.mjs +225 -225
  67. package/esm2020/lib/services/navigator.service.mjs +212 -212
  68. package/esm2020/lib/services/s3.service.mjs +137 -137
  69. package/esm2020/lib/services/search.service.mjs +124 -124
  70. package/esm2020/lib/services/support.service.mjs +42 -42
  71. package/esm2020/lib/services/tag.service.mjs +111 -111
  72. package/esm2020/lib/services/user.service.mjs +501 -501
  73. package/esm2020/lib/services/validators.service.mjs +50 -50
  74. package/esm2020/lib/services/viewer.service.mjs +389 -389
  75. package/esm2020/lib/services/zone-drawer.service.mjs +76 -76
  76. package/esm2020/lib/services/zoneChange.service.mjs +30 -30
  77. package/esm2020/lib/types.service.mjs +311 -311
  78. package/esm2020/lib/validators/email.directive.mjs +7 -7
  79. package/esm2020/lib/validators/no-empty.directive.mjs +12 -12
  80. package/esm2020/lib/validators/number.directive.mjs +12 -12
  81. package/esm2020/lib/validators/text.directive.mjs +12 -12
  82. package/esm2020/public-api.mjs +72 -72
  83. package/esm2020/smarterplan-ngx-smarterplan-core.mjs +4 -4
  84. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +13014 -13014
  85. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  86. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12263 -12263
  87. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  88. package/lib/components/csv-export/csv-export.component.d.ts +18 -18
  89. package/lib/components/loader/loader.component.d.ts +10 -10
  90. package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
  91. package/lib/components/menu-bar/menu-bar.component.d.ts +38 -38
  92. package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +73 -73
  93. package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +35 -35
  94. package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
  95. package/lib/components/search-bar/search-bar.component.d.ts +16 -16
  96. package/lib/components/support-modal/support-modal.component.d.ts +26 -26
  97. package/lib/config.d.ts +22 -22
  98. package/lib/helpers.service.d.ts +79 -79
  99. package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
  100. package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
  101. package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
  102. package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
  103. package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
  104. package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
  105. package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
  106. package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
  107. package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
  108. package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
  109. package/lib/mattertagData.d.ts +70 -70
  110. package/lib/ngx-smarterplan-core.module.d.ts +29 -29
  111. package/lib/ngx-smarterplan-core.service.d.ts +6 -6
  112. package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
  113. package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
  114. package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
  115. package/lib/pipes/safe-url.pipe.d.ts +10 -10
  116. package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
  117. package/lib/pipes/username-from-id.pipe.d.ts +11 -11
  118. package/lib/services/amplify-cache.service.d.ts +37 -37
  119. package/lib/services/base-tab.service.d.ts +10 -10
  120. package/lib/services/baseVisibility.service.d.ts +9 -9
  121. package/lib/services/content.service.d.ts +28 -28
  122. package/lib/services/filter.service.d.ts +60 -60
  123. package/lib/services/intervention.service.d.ts +25 -25
  124. package/lib/services/locale.service.d.ts +23 -23
  125. package/lib/services/matterport-import.service.d.ts +53 -53
  126. package/lib/services/matterport.service.d.ts +336 -336
  127. package/lib/services/models/affectation.service.d.ts +14 -14
  128. package/lib/services/models/base-object.service.d.ts +20 -20
  129. package/lib/services/models/capture.service.d.ts +13 -13
  130. package/lib/services/models/comment.service.d.ts +26 -26
  131. package/lib/services/models/domain.service.d.ts +19 -19
  132. package/lib/services/models/equipment.service.d.ts +93 -93
  133. package/lib/services/models/event.service.d.ts +43 -43
  134. package/lib/services/models/feature.service.d.ts +75 -75
  135. package/lib/services/models/hashtag.service.d.ts +13 -13
  136. package/lib/services/models/layer.service.d.ts +11 -11
  137. package/lib/services/models/measurement.service.d.ts +51 -51
  138. package/lib/services/models/mission.service.d.ts +39 -39
  139. package/lib/services/models/navigation.service.d.ts +29 -29
  140. package/lib/services/models/node.service.d.ts +12 -12
  141. package/lib/services/models/object3D.service.d.ts +57 -57
  142. package/lib/services/models/operation.service.d.ts +15 -15
  143. package/lib/services/models/organisation.service.d.ts +19 -19
  144. package/lib/services/models/plan.service.d.ts +133 -133
  145. package/lib/services/models/poi.service.d.ts +25 -25
  146. package/lib/services/models/profile.service.d.ts +16 -16
  147. package/lib/services/models/property.service.d.ts +13 -13
  148. package/lib/services/models/space.service.d.ts +46 -46
  149. package/lib/services/models/template.service.d.ts +15 -15
  150. package/lib/services/models/ticket.service.d.ts +93 -93
  151. package/lib/services/models/visit.service.d.ts +24 -24
  152. package/lib/services/models/zone.service.d.ts +50 -50
  153. package/lib/services/navigator.service.d.ts +61 -61
  154. package/lib/services/s3.service.d.ts +14 -14
  155. package/lib/services/search.service.d.ts +20 -20
  156. package/lib/services/support.service.d.ts +17 -17
  157. package/lib/services/tag.service.d.ts +29 -29
  158. package/lib/services/user.service.d.ts +118 -118
  159. package/lib/services/validators.service.d.ts +18 -18
  160. package/lib/services/viewer.service.d.ts +110 -110
  161. package/lib/services/zone-drawer.service.d.ts +7 -7
  162. package/lib/services/zoneChange.service.d.ts +17 -17
  163. package/lib/types.service.d.ts +842 -842
  164. package/lib/validators/email.directive.d.ts +2 -2
  165. package/lib/validators/no-empty.directive.d.ts +2 -2
  166. package/lib/validators/number.directive.d.ts +2 -2
  167. package/lib/validators/text.directive.d.ts +2 -2
  168. package/package.json +2 -2
  169. package/public-api.d.ts +64 -64
  170. package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
@@ -1,225 +1,225 @@
1
- /* eslint-disable class-methods-use-this */
2
- import { Inject, Injectable } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../user.service";
5
- export class ZoneService {
6
- constructor(apiInjected, userService) {
7
- this.userService = userService;
8
- this.API = apiInjected;
9
- }
10
- async getZonesBySpace(spaceID) {
11
- const list = [];
12
- if (this.API.__proto__.hasOwnProperty('ZonesBySpace')) {
13
- const zones = await this.API.__proto__.ZonesBySpace(spaceID);
14
- if (zones) {
15
- for (const zone of zones.items) {
16
- const zoneObject = { ...zone };
17
- zoneObject.virtual = this.zoneIsVirtual(zone);
18
- list.push(zoneObject);
19
- }
20
- }
21
- return list;
22
- }
23
- else {
24
- throw new Error('ZonesBySpace not implemented');
25
- }
26
- }
27
- async getZonesBySpaceForUser(spaceID) {
28
- const missionForLocation = this.userService.currentMission(spaceID);
29
- const list = [];
30
- if (missionForLocation && missionForLocation.zoneID) {
31
- const allowedZone = await this.getZone(missionForLocation.zoneID);
32
- allowedZone.virtual = this.zoneIsVirtual(allowedZone);
33
- if (!allowedZone.parent) {
34
- // the whole building is authorized
35
- return this.getZonesBySpace(spaceID);
36
- }
37
- list.push(allowedZone);
38
- // allow all children zones of an allowed parent
39
- const children = (await this.API.__proto__.ZonesByZone(allowedZone.id))
40
- .items;
41
- if (children.length > 0) {
42
- for (const child of children) {
43
- const childZone = { ...child };
44
- childZone.virtual = this.zoneIsVirtual(child);
45
- list.push(childZone);
46
- }
47
- }
48
- // allow the parent Floor of the allowed zone
49
- if (allowedZone.parent.layer &&
50
- allowedZone.parent.layer.name === 'FLOOR') {
51
- list.push(allowedZone.parent);
52
- }
53
- }
54
- else {
55
- return this.getZonesBySpace(spaceID);
56
- }
57
- return list;
58
- }
59
- async filterZonesIDsForUser(zones) {
60
- const { spaceID } = zones[0];
61
- const zoneIDs = new Set(zones.map((zone) => zone.id));
62
- const allowedZones = await this.getZonesBySpaceForUser(spaceID);
63
- const filteredZones = allowedZones.filter((zone) => zoneIDs.has(zone.id));
64
- return filteredZones;
65
- }
66
- async deleteZone(zoneID) {
67
- return this.API.__proto__.DeleteZone({ id: zoneID });
68
- }
69
- async getZonesForSweepForSpace(sweepID, spaceID) {
70
- const zonesSpace = (await this.API.__proto__.ZonesBySpace(spaceID)).items;
71
- return zonesSpace.filter((zone) => zone.sweepIDs && zone.sweepIDs.includes(sweepID));
72
- }
73
- // // eslint-disable-next-line class-methods-use-this
74
- sortZonesFromChildToParent(zonesToSort) {
75
- // get default
76
- const defaultZone = zonesToSort.find((z) => !z.parentID);
77
- if (defaultZone) {
78
- const indexOf = zonesToSort.indexOf(defaultZone);
79
- zonesToSort.splice(indexOf, 1);
80
- }
81
- const zones = zonesToSort.sort((a, b) => {
82
- if (a.parentID === b.id) {
83
- return -1;
84
- }
85
- return 0;
86
- });
87
- // so far by number of navigation points in them
88
- // const zones = zonesToSort.sort(
89
- // (a, b) => a.navigations.items.length - b.navigations.items.length,
90
- // );
91
- if (defaultZone) {
92
- zones.push(defaultZone);
93
- }
94
- return zones;
95
- }
96
- async getZonesForObject(object) {
97
- if (object.pois.items && object.pois.items.length > 0) {
98
- const [poi] = object.pois.items;
99
- if (poi.matterportSweepID) {
100
- const zones = await this.getZonesForSweepForSpace(poi.matterportSweepID, object.spaceID);
101
- return zones;
102
- }
103
- }
104
- return null;
105
- }
106
- async createVirtualZone(zoneInput) {
107
- zoneInput.sweepIDs = [];
108
- const zone = await this.API.__proto__.CreateZone(zoneInput);
109
- console.log('virtual zone created', zone);
110
- return zone;
111
- }
112
- zoneIsVirtual(zone) {
113
- if (!zone.sweepIDs) {
114
- return true;
115
- }
116
- if ((zone.tags && zone.tags.includes('virtual')) ||
117
- zone.sweepIDs.length === 0) {
118
- return true;
119
- }
120
- return false;
121
- }
122
- async getModel3DForZone(zoneID) {
123
- const zone = await this.API.__proto__.GetZone(zoneID);
124
- if (zone.nodeIDs) {
125
- const node = await this.API.__proto__.GetNode(zone.nodeIDs[0]);
126
- return node.model3D;
127
- }
128
- return null;
129
- }
130
- async getZone(zoneID) {
131
- return this.API.__proto__.GetZone(zoneID);
132
- }
133
- async getDefaultZoneForSpace(spaceID) {
134
- return this.getZonesBySpace(spaceID).then(async (zones) => {
135
- const zonesBuilding = zones.filter((zone) => zone.layer && zone.layer.name === 'BUILDING');
136
- if (zonesBuilding.length === 1) {
137
- return zonesBuilding[0];
138
- }
139
- const parentZone = zones.find((zone) => !zone.parentID);
140
- return parentZone;
141
- });
142
- }
143
- async create(input) {
144
- return this.API.__proto__.CreateZone(input);
145
- }
146
- // async getSortedZonesForSweepForUser(
147
- // sweep: string,
148
- // spaceID: string,
149
- // ): Promise<Zone[]> {
150
- // if (!spaceID) {
151
- // return [];
152
- // }
153
- // const zones = await this.getZonesForSweepForSpace(sweep, spaceID);
154
- // if (zones.length === 0) {
155
- // return [];
156
- // }
157
- // const filteredZones = await this.filterZonesIDsForUser(zones);
158
- // if (filteredZones.length > 0) {
159
- // let zonesSorted = this.sortZonesFromChildToParent(filteredZones);
160
- // zonesSorted = zonesSorted.filter((zone) => zone !== undefined);
161
- // return zonesSorted;
162
- // }
163
- // return [];
164
- // }
165
- async updateZone(input) {
166
- return this.API.__proto__.UpdateZone(input);
167
- }
168
- async getZonesForNodeForSpace(nodeID, spaceID) {
169
- return this.API.__proto__.ZonesBySpace(spaceID).then(async (zones) => {
170
- const filteredZones = zones.items.filter((zone) => zone.nodeIDs && zone.nodeIDs.includes(nodeID));
171
- return filteredZones;
172
- });
173
- }
174
- /**
175
- * Gets the Zone (layer FLOOR) for a matterport sweep ID in a given Space
176
- * @param sweepID
177
- * @param spaceID
178
- * @returns Zone
179
- */
180
- async getFloorZoneForSweepInSpace(sweepID, spaceID) {
181
- const zones = await this.getZonesForSweepForSpace(sweepID, spaceID);
182
- const floors = zones.filter((zone) => zone.layer && zone.layer.name.includes('FLOOR'));
183
- return floors.length > 0 ? floors[0] : null;
184
- }
185
- /**
186
- * Get zones with audio track for entire space
187
- * @param spaceID
188
- * @returns Promise<Zone[]>
189
- */
190
- async getAudioZonesForSpace(spaceID) {
191
- const allZones = await this.getZonesBySpace(spaceID);
192
- return allZones.filter((zone) => zone.audioID);
193
- }
194
- /**
195
- * Get audio zones for user (within allowed zones)
196
- * @param spaceID
197
- * @returns Promise<Zone[]>
198
- */
199
- async getAudioZonesForUserForSpace(spaceID) {
200
- const userZones = await this.getZonesBySpaceForUser(spaceID);
201
- return userZones.filter((zone) => zone.audioID);
202
- }
203
- /**
204
- * Get Zones by Parent Zone ID
205
- * @param parentZoneID string
206
- * @returns Promise<Zone[]>
207
- */
208
- async getZonesByParentZone(parentZoneID) {
209
- return this.API.__proto__
210
- .ZonesByZone(parentZoneID)
211
- .then((res) => res.items);
212
- }
213
- }
214
- ZoneService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZoneService, deps: [{ token: 'currentAPIService' }, { token: i1.BaseUserService }], target: i0.ɵɵFactoryTarget.Injectable });
215
- ZoneService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZoneService, providedIn: 'root' });
216
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZoneService, decorators: [{
217
- type: Injectable,
218
- args: [{
219
- providedIn: 'root',
220
- }]
221
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
222
- type: Inject,
223
- args: ['currentAPIService']
224
- }] }, { type: i1.BaseUserService }]; } });
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tb2RlbHMvem9uZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBT25ELE1BQU0sT0FBTyxXQUFXO0lBR3RCLFlBQytCLFdBQWdCLEVBQ3JDLFdBQTRCO1FBQTVCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFlO1FBQ25DLE1BQU0sSUFBSSxHQUFXLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQzlCLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQVUsQ0FBQztvQkFDdkMsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN2QjthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztJQUVE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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQWU7UUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDRCQUE0QixDQUFDLE9BQWU7UUFDaEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBb0I7UUFDN0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVM7YUFDdEIsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOzt3R0E3UFUsV0FBVyxrQkFJWixtQkFBbUI7NEdBSmxCLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFLSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGJPYmplY3RUeXBlLCBab25lIH0gZnJvbSAnLi4vLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgWm9uZVNlcnZpY2Uge1xuICBBUEk6IGFueTsgLy9BV1MgQVBJU2VydmljZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ2N1cnJlbnRBUElTZXJ2aWNlJykgYXBpSW5qZWN0ZWQ6IGFueSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcbiAgfVxuXG4gIGFzeW5jIGdldFpvbmVzQnlTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PFpvbmU+PiB7XG4gICAgY29uc3QgbGlzdDogWm9uZVtdID0gW107XG4gICAgaWYgKHRoaXMuQVBJLl9fcHJvdG9fXy5oYXNPd25Qcm9wZXJ0eSgnWm9uZXNCeVNwYWNlJykpIHtcbiAgICAgIGNvbnN0IHpvbmVzID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLlpvbmVzQnlTcGFjZShzcGFjZUlEKTtcbiAgICAgIGlmICh6b25lcykge1xuICAgICAgICBmb3IgKGNvbnN0IHpvbmUgb2Ygem9uZXMuaXRlbXMpIHtcbiAgICAgICAgICBjb25zdCB6b25lT2JqZWN0ID0geyAuLi56b25lIH0gYXMgWm9uZTtcbiAgICAgICAgICB6b25lT2JqZWN0LnZpcnR1YWwgPSB0aGlzLnpvbmVJc1ZpcnR1YWwoem9uZSk7XG4gICAgICAgICAgbGlzdC5wdXNoKHpvbmVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lc0J5U3BhY2Ugbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Wm9uZXNCeVNwYWNlRm9yVXNlcihzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPFpvbmVbXT4ge1xuICAgIGNvbnN0IG1pc3Npb25Gb3JMb2NhdGlvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oc3BhY2VJRCk7XG4gICAgY29uc3QgbGlzdCA9IFtdO1xuICAgIGlmIChtaXNzaW9uRm9yTG9jYXRpb24gJiYgbWlzc2lvbkZvckxvY2F0aW9uLnpvbmVJRCkge1xuICAgICAgY29uc3QgYWxsb3dlZFpvbmUgPSBhd2FpdCB0aGlzLmdldFpvbmUobWlzc2lvbkZvckxvY2F0aW9uLnpvbmVJRCk7XG4gICAgICBhbGxvd2VkWm9uZS52aXJ0dWFsID0gdGhpcy56b25lSXNWaXJ0dWFsKGFsbG93ZWRab25lKTtcbiAgICAgIGlmICghYWxsb3dlZFpvbmUucGFyZW50KSB7XG4gICAgICAgIC8vIHRoZSB3aG9sZSBidWlsZGluZyBpcyBhdXRob3JpemVkXG4gICAgICAgIHJldHVybiB0aGlzLmdldFpvbmVzQnlTcGFjZShzcGFjZUlEKTtcbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChhbGxvd2VkWm9uZSk7XG4gICAgICAvLyBhbGxvdyBhbGwgY2hpbGRyZW4gem9uZXMgb2YgYW4gYWxsb3dlZCBwYXJlbnRcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5ab25lc0J5Wm9uZShhbGxvd2VkWm9uZS5pZCkpXG4gICAgICAgIC5pdGVtcztcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBjaGlsZFpvbmUgPSB7IC4uLmNoaWxkIH0gYXMgWm9uZTtcbiAgICAgICAgICBjaGlsZFpvbmUudmlydHVhbCA9IHRoaXMuem9uZUlzVmlydHVhbChjaGlsZCk7XG4gICAgICAgICAgbGlzdC5wdXNoKGNoaWxkWm9uZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGFsbG93IHRoZSBwYXJlbnQgRmxvb3Igb2YgdGhlIGFsbG93ZWQgem9uZVxuICAgICAgaWYgKFxuICAgICAgICBhbGxvd2VkWm9uZS5wYXJlbnQubGF5ZXIgJiZcbiAgICAgICAgYWxsb3dlZFpvbmUucGFyZW50LmxheWVyLm5hbWUgPT09ICdGTE9PUidcbiAgICAgICkge1xuICAgICAgICBsaXN0LnB1c2goYWxsb3dlZFpvbmUucGFyZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Wm9uZXNCeVNwYWNlKHNwYWNlSUQpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGFzeW5jIGZpbHRlclpvbmVzSURzRm9yVXNlcih6b25lczogWm9uZVtdKTogUHJvbWlzZTxab25lW10+IHtcbiAgICBjb25zdCB7IHNwYWNlSUQgfSA9IHpvbmVzWzBdO1xuICAgIGNvbnN0IHpvbmVJRHMgPSBuZXcgU2V0KHpvbmVzLm1hcCgoem9uZSkgPT4gem9uZS5pZCkpO1xuICAgIGNvbnN0IGFsbG93ZWRab25lcyA9IGF3YWl0IHRoaXMuZ2V0Wm9uZXNCeVNwYWNlRm9yVXNlcihzcGFjZUlEKTtcbiAgICBjb25zdCBmaWx0ZXJlZFpvbmVzID0gYWxsb3dlZFpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZUlEcy5oYXMoem9uZS5pZCkpO1xuICAgIHJldHVybiBmaWx0ZXJlZFpvbmVzO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlWm9uZSh6b25lSUQ6IHN0cmluZyk6IFByb21pc2U8Wm9uZT4ge1xuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlWm9uZSh7IGlkOiB6b25lSUQgfSk7XG4gIH1cblxuICBhc3luYyBnZXRab25lc0ZvclN3ZWVwRm9yU3BhY2UoXG4gICAgc3dlZXBJRDogc3RyaW5nLFxuICAgIHNwYWNlSUQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFpvbmVbXT4ge1xuICAgIGNvbnN0IHpvbmVzU3BhY2UgPSAoYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLlpvbmVzQnlTcGFjZShzcGFjZUlEKSkuaXRlbXM7XG4gICAgcmV0dXJuIHpvbmVzU3BhY2UuZmlsdGVyKFxuICAgICAgKHpvbmUpID0+IHpvbmUuc3dlZXBJRHMgJiYgem9uZS5zd2VlcElEcy5pbmNsdWRlcyhzd2VlcElEKVxuICAgICk7XG4gIH1cblxuICAvLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBzb3J0Wm9uZXNGcm9tQ2hpbGRUb1BhcmVudCh6b25lc1RvU29ydDogWm9uZVtdKSB7XG4gICAgLy8gZ2V0IGRlZmF1bHRcbiAgICBjb25zdCBkZWZhdWx0Wm9uZSA9IHpvbmVzVG9Tb3J0LmZpbmQoKHopID0+ICF6LnBhcmVudElEKTtcbiAgICBpZiAoZGVmYXVsdFpvbmUpIHtcbiAgICAgIGNvbnN0IGluZGV4T2YgPSB6b25lc1RvU29ydC5pbmRleE9mKGRlZmF1bHRab25lKTtcbiAgICAgIHpvbmVzVG9Tb3J0LnNwbGljZShpbmRleE9mLCAxKTtcbiAgICB9XG4gICAgY29uc3Qgem9uZXMgPSB6b25lc1RvU29ydC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoYS5wYXJlbnRJRCA9PT0gYi5pZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgICAvLyBzbyBmYXIgYnkgbnVtYmVyIG9mIG5hdmlnYXRpb24gcG9pbnRzIGluIHRoZW1cbiAgICAvLyBjb25zdCB6b25lcyA9IHpvbmVzVG9Tb3J0LnNvcnQoXG4gICAgLy8gICAgIChhLCBiKSA9PiBhLm5hdmlnYXRpb25zLml0ZW1zLmxlbmd0aCAtIGIubmF2aWdhdGlvbnMuaXRlbXMubGVuZ3RoLFxuICAgIC8vICk7XG4gICAgaWYgKGRlZmF1bHRab25lKSB7XG4gICAgICB6b25lcy5wdXNoKGRlZmF1bHRab25lKTtcbiAgICB9XG4gICAgcmV0dXJuIHpvbmVzO1xuICB9XG5cbiAgYXN5bmMgZ2V0Wm9uZXNGb3JPYmplY3Qob2JqZWN0OiBEYk9iamVjdFR5cGUpOiBQcm9taXNlPFpvbmVbXT4ge1xuICAgIGlmIChvYmplY3QucG9pcy5pdGVtcyAmJiBvYmplY3QucG9pcy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcG9pXSA9IG9iamVjdC5wb2lzLml0ZW1zO1xuICAgICAgaWYgKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCkge1xuICAgICAgICBjb25zdCB6b25lcyA9IGF3YWl0IHRoaXMuZ2V0Wm9uZXNGb3JTd2VlcEZvclNwYWNlKFxuICAgICAgICAgIHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCxcbiAgICAgICAgICBvYmplY3Quc3BhY2VJRFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gem9uZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVmlydHVhbFpvbmUoem9uZUlucHV0OiBab25lKTogUHJvbWlzZTxab25lPiB7XG4gICAgem9uZUlucHV0LnN3ZWVwSURzID0gW107XG4gICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVab25lKHpvbmVJbnB1dCk7XG4gICAgY29uc29sZS5sb2coJ3ZpcnR1YWwgem9uZSBjcmVhdGVkJywgem9uZSk7XG4gICAgcmV0dXJuIHpvbmU7XG4gIH1cblxuICB6b25lSXNWaXJ0dWFsKHpvbmU6IFpvbmUpOiBib29sZWFuIHtcbiAgICBpZiAoIXpvbmUuc3dlZXBJRHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAoem9uZS50YWdzICYmIHpvbmUudGFncy5pbmNsdWRlcygndmlydHVhbCcpKSB8fFxuICAgICAgem9uZS5zd2VlcElEcy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBnZXRNb2RlbDNERm9yWm9uZSh6b25lSUQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5HZXRab25lKHpvbmVJRCk7XG4gICAgaWYgKHpvbmUubm9kZUlEcykge1xuICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5HZXROb2RlKHpvbmUubm9kZUlEc1swXSk7XG4gICAgICByZXR1cm4gbm9kZS5tb2RlbDNEO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdldFpvbmUoem9uZUlEOiBzdHJpbmcpOiBQcm9taXNlPFpvbmU+IHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldFpvbmUoem9uZUlEKTtcbiAgfVxuXG4gIGFzeW5jIGdldERlZmF1bHRab25lRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxab25lPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Wm9uZXNCeVNwYWNlKHNwYWNlSUQpLnRoZW4oYXN5bmMgKHpvbmVzKSA9PiB7XG4gICAgICBjb25zdCB6b25lc0J1aWxkaW5nID0gem9uZXMuZmlsdGVyKFxuICAgICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUgPT09ICdCVUlMRElORydcbiAgICAgICk7XG4gICAgICBpZiAoem9uZXNCdWlsZGluZy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHpvbmVzQnVpbGRpbmdbMF07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRab25lID0gem9uZXMuZmluZCgoem9uZSkgPT4gIXpvbmUucGFyZW50SUQpO1xuICAgICAgcmV0dXJuIHBhcmVudFpvbmU7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoaW5wdXQ6IFpvbmUpOiBQcm9taXNlPFpvbmU+IHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZVpvbmUoaW5wdXQpO1xuICB9XG5cbiAgLy8gYXN5bmMgZ2V0U29ydGVkWm9uZXNGb3JTd2VlcEZvclVzZXIoXG4gIC8vICAgICBzd2VlcDogc3RyaW5nLFxuICAvLyAgICAgc3BhY2VJRDogc3RyaW5nLFxuICAvLyApOiBQcm9taXNlPFpvbmVbXT4ge1xuICAvLyAgICAgaWYgKCFzcGFjZUlEKSB7XG4gIC8vICAgICAgICAgcmV0dXJuIFtdO1xuICAvLyAgICAgfVxuICAvLyAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLmdldFpvbmVzRm9yU3dlZXBGb3JTcGFjZShzd2VlcCwgc3BhY2VJRCk7XG4gIC8vICAgICBpZiAoem9uZXMubGVuZ3RoID09PSAwKSB7XG4gIC8vICAgICAgICAgcmV0dXJuIFtdO1xuICAvLyAgICAgfVxuICAvLyAgICAgY29uc3QgZmlsdGVyZWRab25lcyA9IGF3YWl0IHRoaXMuZmlsdGVyWm9uZXNJRHNGb3JVc2VyKHpvbmVzKTtcbiAgLy8gICAgIGlmIChmaWx0ZXJlZFpvbmVzLmxlbmd0aCA+IDApIHtcbiAgLy8gICAgICAgICBsZXQgem9uZXNTb3J0ZWQgPSB0aGlzLnNvcnRab25lc0Zyb21DaGlsZFRvUGFyZW50KGZpbHRlcmVkWm9uZXMpO1xuICAvLyAgICAgICAgIHpvbmVzU29ydGVkID0gem9uZXNTb3J0ZWQuZmlsdGVyKCh6b25lKSA9PiB6b25lICE9PSB1bmRlZmluZWQpO1xuICAvLyAgICAgICAgIHJldHVybiB6b25lc1NvcnRlZDtcbiAgLy8gICAgIH1cbiAgLy8gICAgIHJldHVybiBbXTtcbiAgLy8gfVxuXG4gIGFzeW5jIHVwZGF0ZVpvbmUoaW5wdXQ6IGFueSk6IFByb21pc2U8Wm9uZT4ge1xuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uVXBkYXRlWm9uZShpbnB1dCk7XG4gIH1cblxuICBhc3luYyBnZXRab25lc0Zvck5vZGVGb3JTcGFjZShcbiAgICBub2RlSUQ6IHN0cmluZyxcbiAgICBzcGFjZUlEOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxab25lW10+IHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLlpvbmVzQnlTcGFjZShzcGFjZUlEKS50aGVuKGFzeW5jICh6b25lcykgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRab25lcyA9IHpvbmVzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgKHpvbmUpID0+IHpvbmUubm9kZUlEcyAmJiB6b25lLm5vZGVJRHMuaW5jbHVkZXMobm9kZUlEKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBmaWx0ZXJlZFpvbmVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFpvbmUgKGxheWVyIEZMT09SKSBmb3IgYSBtYXR0ZXJwb3J0IHN3ZWVwIElEIGluIGEgZ2l2ZW4gU3BhY2VcbiAgICogQHBhcmFtIHN3ZWVwSURcbiAgICogQHBhcmFtIHNwYWNlSURcbiAgICogQHJldHVybnMgWm9uZVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmxvb3Jab25lRm9yU3dlZXBJblNwYWNlKFxuICAgIHN3ZWVwSUQ6IHN0cmluZyxcbiAgICBzcGFjZUlEOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxab25lPiB7XG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLmdldFpvbmVzRm9yU3dlZXBGb3JTcGFjZShzd2VlcElELCBzcGFjZUlEKTtcbiAgICBjb25zdCBmbG9vcnMgPSB6b25lcy5maWx0ZXIoXG4gICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUuaW5jbHVkZXMoJ0ZMT09SJylcbiAgICApO1xuICAgIHJldHVybiBmbG9vcnMubGVuZ3RoID4gMCA/IGZsb29yc1swXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHpvbmVzIHdpdGggYXVkaW8gdHJhY2sgZm9yIGVudGlyZSBzcGFjZVxuICAgKiBAcGFyYW0gc3BhY2VJRFxuICAgKiBAcmV0dXJucyAgUHJvbWlzZTxab25lW10+XG4gICAqL1xuICBhc3luYyBnZXRBdWRpb1pvbmVzRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxab25lW10+IHtcbiAgICBjb25zdCBhbGxab25lcyA9IGF3YWl0IHRoaXMuZ2V0Wm9uZXNCeVNwYWNlKHNwYWNlSUQpO1xuICAgIHJldHVybiBhbGxab25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuYXVkaW9JRCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1ZGlvIHpvbmVzIGZvciB1c2VyICh3aXRoaW4gYWxsb3dlZCB6b25lcylcbiAgICogQHBhcmFtIHNwYWNlSURcbiAgICogQHJldHVybnMgIFByb21pc2U8Wm9uZVtdPlxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaW9ab25lc0ZvclVzZXJGb3JTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPFpvbmVbXT4ge1xuICAgIGNvbnN0IHVzZXJab25lcyA9IGF3YWl0IHRoaXMuZ2V0Wm9uZXNCeVNwYWNlRm9yVXNlcihzcGFjZUlEKTtcbiAgICByZXR1cm4gdXNlclpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5hdWRpb0lEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgWm9uZXMgYnkgUGFyZW50IFpvbmUgSURcbiAgICogQHBhcmFtIHBhcmVudFpvbmVJRCBzdHJpbmdcbiAgICogQHJldHVybnMgUHJvbWlzZTxab25lW10+XG4gICAqL1xuICBhc3luYyBnZXRab25lc0J5UGFyZW50Wm9uZShwYXJlbnRab25lSUQ6IHN0cmluZyk6IFByb21pc2U8Wm9uZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fX1xuICAgICAgLlpvbmVzQnlab25lKHBhcmVudFpvbmVJRClcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5pdGVtcyk7XG4gIH1cbn1cbiJdfQ==
1
+ /* eslint-disable class-methods-use-this */
2
+ import { Inject, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../user.service";
5
+ export class ZoneService {
6
+ constructor(apiInjected, userService) {
7
+ this.userService = userService;
8
+ this.API = apiInjected;
9
+ }
10
+ async getZonesBySpace(spaceID) {
11
+ const list = [];
12
+ if (this.API.__proto__.hasOwnProperty('ZonesBySpace')) {
13
+ const zones = await this.API.__proto__.ZonesBySpace(spaceID);
14
+ if (zones) {
15
+ for (const zone of zones.items) {
16
+ const zoneObject = { ...zone };
17
+ zoneObject.virtual = this.zoneIsVirtual(zone);
18
+ list.push(zoneObject);
19
+ }
20
+ }
21
+ return list;
22
+ }
23
+ else {
24
+ throw new Error('ZonesBySpace not implemented');
25
+ }
26
+ }
27
+ async getZonesBySpaceForUser(spaceID) {
28
+ const missionForLocation = this.userService.currentMission(spaceID);
29
+ const list = [];
30
+ if (missionForLocation && missionForLocation.zoneID) {
31
+ const allowedZone = await this.getZone(missionForLocation.zoneID);
32
+ allowedZone.virtual = this.zoneIsVirtual(allowedZone);
33
+ if (!allowedZone.parent) {
34
+ // the whole building is authorized
35
+ return this.getZonesBySpace(spaceID);
36
+ }
37
+ list.push(allowedZone);
38
+ // allow all children zones of an allowed parent
39
+ const children = (await this.API.__proto__.ZonesByZone(allowedZone.id))
40
+ .items;
41
+ if (children.length > 0) {
42
+ for (const child of children) {
43
+ const childZone = { ...child };
44
+ childZone.virtual = this.zoneIsVirtual(child);
45
+ list.push(childZone);
46
+ }
47
+ }
48
+ // allow the parent Floor of the allowed zone
49
+ if (allowedZone.parent.layer &&
50
+ allowedZone.parent.layer.name === 'FLOOR') {
51
+ list.push(allowedZone.parent);
52
+ }
53
+ }
54
+ else {
55
+ return this.getZonesBySpace(spaceID);
56
+ }
57
+ return list;
58
+ }
59
+ async filterZonesIDsForUser(zones) {
60
+ const { spaceID } = zones[0];
61
+ const zoneIDs = new Set(zones.map((zone) => zone.id));
62
+ const allowedZones = await this.getZonesBySpaceForUser(spaceID);
63
+ const filteredZones = allowedZones.filter((zone) => zoneIDs.has(zone.id));
64
+ return filteredZones;
65
+ }
66
+ async deleteZone(zoneID) {
67
+ return this.API.__proto__.DeleteZone({ id: zoneID });
68
+ }
69
+ async getZonesForSweepForSpace(sweepID, spaceID) {
70
+ const zonesSpace = (await this.API.__proto__.ZonesBySpace(spaceID)).items;
71
+ return zonesSpace.filter((zone) => zone.sweepIDs && zone.sweepIDs.includes(sweepID));
72
+ }
73
+ // // eslint-disable-next-line class-methods-use-this
74
+ sortZonesFromChildToParent(zonesToSort) {
75
+ // get default
76
+ const defaultZone = zonesToSort.find((z) => !z.parentID);
77
+ if (defaultZone) {
78
+ const indexOf = zonesToSort.indexOf(defaultZone);
79
+ zonesToSort.splice(indexOf, 1);
80
+ }
81
+ const zones = zonesToSort.sort((a, b) => {
82
+ if (a.parentID === b.id) {
83
+ return -1;
84
+ }
85
+ return 0;
86
+ });
87
+ // so far by number of navigation points in them
88
+ // const zones = zonesToSort.sort(
89
+ // (a, b) => a.navigations.items.length - b.navigations.items.length,
90
+ // );
91
+ if (defaultZone) {
92
+ zones.push(defaultZone);
93
+ }
94
+ return zones;
95
+ }
96
+ async getZonesForObject(object) {
97
+ if (object.pois.items && object.pois.items.length > 0) {
98
+ const [poi] = object.pois.items;
99
+ if (poi.matterportSweepID) {
100
+ const zones = await this.getZonesForSweepForSpace(poi.matterportSweepID, object.spaceID);
101
+ return zones;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ async createVirtualZone(zoneInput) {
107
+ zoneInput.sweepIDs = [];
108
+ const zone = await this.API.__proto__.CreateZone(zoneInput);
109
+ console.log('virtual zone created', zone);
110
+ return zone;
111
+ }
112
+ zoneIsVirtual(zone) {
113
+ if (!zone.sweepIDs) {
114
+ return true;
115
+ }
116
+ if ((zone.tags && zone.tags.includes('virtual')) ||
117
+ zone.sweepIDs.length === 0) {
118
+ return true;
119
+ }
120
+ return false;
121
+ }
122
+ async getModel3DForZone(zoneID) {
123
+ const zone = await this.API.__proto__.GetZone(zoneID);
124
+ if (zone.nodeIDs) {
125
+ const node = await this.API.__proto__.GetNode(zone.nodeIDs[0]);
126
+ return node.model3D;
127
+ }
128
+ return null;
129
+ }
130
+ async getZone(zoneID) {
131
+ return this.API.__proto__.GetZone(zoneID);
132
+ }
133
+ async getDefaultZoneForSpace(spaceID) {
134
+ return this.getZonesBySpace(spaceID).then(async (zones) => {
135
+ const zonesBuilding = zones.filter((zone) => zone.layer && zone.layer.name === 'BUILDING');
136
+ if (zonesBuilding.length === 1) {
137
+ return zonesBuilding[0];
138
+ }
139
+ const parentZone = zones.find((zone) => !zone.parentID);
140
+ return parentZone;
141
+ });
142
+ }
143
+ async create(input) {
144
+ return this.API.__proto__.CreateZone(input);
145
+ }
146
+ // async getSortedZonesForSweepForUser(
147
+ // sweep: string,
148
+ // spaceID: string,
149
+ // ): Promise<Zone[]> {
150
+ // if (!spaceID) {
151
+ // return [];
152
+ // }
153
+ // const zones = await this.getZonesForSweepForSpace(sweep, spaceID);
154
+ // if (zones.length === 0) {
155
+ // return [];
156
+ // }
157
+ // const filteredZones = await this.filterZonesIDsForUser(zones);
158
+ // if (filteredZones.length > 0) {
159
+ // let zonesSorted = this.sortZonesFromChildToParent(filteredZones);
160
+ // zonesSorted = zonesSorted.filter((zone) => zone !== undefined);
161
+ // return zonesSorted;
162
+ // }
163
+ // return [];
164
+ // }
165
+ async updateZone(input) {
166
+ return this.API.__proto__.UpdateZone(input);
167
+ }
168
+ async getZonesForNodeForSpace(nodeID, spaceID) {
169
+ return this.API.__proto__.ZonesBySpace(spaceID).then(async (zones) => {
170
+ const filteredZones = zones.items.filter((zone) => zone.nodeIDs && zone.nodeIDs.includes(nodeID));
171
+ return filteredZones;
172
+ });
173
+ }
174
+ /**
175
+ * Gets the Zone (layer FLOOR) for a matterport sweep ID in a given Space
176
+ * @param sweepID
177
+ * @param spaceID
178
+ * @returns Zone
179
+ */
180
+ async getFloorZoneForSweepInSpace(sweepID, spaceID) {
181
+ const zones = await this.getZonesForSweepForSpace(sweepID, spaceID);
182
+ const floors = zones.filter((zone) => zone.layer && zone.layer.name.includes('FLOOR'));
183
+ return floors.length > 0 ? floors[0] : null;
184
+ }
185
+ /**
186
+ * Get zones with audio track for entire space
187
+ * @param spaceID
188
+ * @returns Promise<Zone[]>
189
+ */
190
+ async getAudioZonesForSpace(spaceID) {
191
+ const allZones = await this.getZonesBySpace(spaceID);
192
+ return allZones.filter((zone) => zone.audioID);
193
+ }
194
+ /**
195
+ * Get audio zones for user (within allowed zones)
196
+ * @param spaceID
197
+ * @returns Promise<Zone[]>
198
+ */
199
+ async getAudioZonesForUserForSpace(spaceID) {
200
+ const userZones = await this.getZonesBySpaceForUser(spaceID);
201
+ return userZones.filter((zone) => zone.audioID);
202
+ }
203
+ /**
204
+ * Get Zones by Parent Zone ID
205
+ * @param parentZoneID string
206
+ * @returns Promise<Zone[]>
207
+ */
208
+ async getZonesByParentZone(parentZoneID) {
209
+ return this.API.__proto__
210
+ .ZonesByZone(parentZoneID)
211
+ .then((res) => res.items);
212
+ }
213
+ }
214
+ ZoneService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZoneService, deps: [{ token: 'currentAPIService' }, { token: i1.BaseUserService }], target: i0.ɵɵFactoryTarget.Injectable });
215
+ ZoneService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZoneService, providedIn: 'root' });
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZoneService, decorators: [{
217
+ type: Injectable,
218
+ args: [{
219
+ providedIn: 'root',
220
+ }]
221
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
222
+ type: Inject,
223
+ args: ['currentAPIService']
224
+ }] }, { type: i1.BaseUserService }]; } });
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tb2RlbHMvem9uZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBT25ELE1BQU0sT0FBTyxXQUFXO0lBR3RCLFlBQytCLFdBQWdCLEVBQ3JDLFdBQTRCO1FBQTVCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFlO1FBQ25DLE1BQU0sSUFBSSxHQUFXLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQzlCLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQVUsQ0FBQztvQkFDdkMsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN2QjthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztJQUVE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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQWU7UUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDRCQUE0QixDQUFDLE9BQWU7UUFDaEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBb0I7UUFDN0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVM7YUFDdEIsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOzt3R0E3UFUsV0FBVyxrQkFJWixtQkFBbUI7NEdBSmxCLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFLSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERiT2JqZWN0VHlwZSwgWm9uZSB9IGZyb20gJy4uLy4uL3R5cGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFpvbmVTZXJ2aWNlIHtcclxuICBBUEk6IGFueTsgLy9BV1MgQVBJU2VydmljZVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2N1cnJlbnRBUElTZXJ2aWNlJykgYXBpSW5qZWN0ZWQ6IGFueSxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFpvbmVzQnlTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PFpvbmU+PiB7XHJcbiAgICBjb25zdCBsaXN0OiBab25lW10gPSBbXTtcclxuICAgIGlmICh0aGlzLkFQSS5fX3Byb3RvX18uaGFzT3duUHJvcGVydHkoJ1pvbmVzQnlTcGFjZScpKSB7XHJcbiAgICAgIGNvbnN0IHpvbmVzID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLlpvbmVzQnlTcGFjZShzcGFjZUlEKTtcclxuICAgICAgaWYgKHpvbmVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB6b25lIG9mIHpvbmVzLml0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCB6b25lT2JqZWN0ID0geyAuLi56b25lIH0gYXMgWm9uZTtcclxuICAgICAgICAgIHpvbmVPYmplY3QudmlydHVhbCA9IHRoaXMuem9uZUlzVmlydHVhbCh6b25lKTtcclxuICAgICAgICAgIGxpc3QucHVzaCh6b25lT2JqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmVzQnlTcGFjZSBub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFpvbmVzQnlTcGFjZUZvclVzZXIoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxab25lW10+IHtcclxuICAgIGNvbnN0IG1pc3Npb25Gb3JMb2NhdGlvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oc3BhY2VJRCk7XHJcbiAgICBjb25zdCBsaXN0ID0gW107XHJcbiAgICBpZiAobWlzc2lvbkZvckxvY2F0aW9uICYmIG1pc3Npb25Gb3JMb2NhdGlvbi56b25lSUQpIHtcclxuICAgICAgY29uc3QgYWxsb3dlZFpvbmUgPSBhd2FpdCB0aGlzLmdldFpvbmUobWlzc2lvbkZvckxvY2F0aW9uLnpvbmVJRCk7XHJcbiAgICAgIGFsbG93ZWRab25lLnZpcnR1YWwgPSB0aGlzLnpvbmVJc1ZpcnR1YWwoYWxsb3dlZFpvbmUpO1xyXG4gICAgICBpZiAoIWFsbG93ZWRab25lLnBhcmVudCkge1xyXG4gICAgICAgIC8vIHRoZSB3aG9sZSBidWlsZGluZyBpcyBhdXRob3JpemVkXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Wm9uZXNCeVNwYWNlKHNwYWNlSUQpO1xyXG4gICAgICB9XHJcbiAgICAgIGxpc3QucHVzaChhbGxvd2VkWm9uZSk7XHJcbiAgICAgIC8vIGFsbG93IGFsbCBjaGlsZHJlbiB6b25lcyBvZiBhbiBhbGxvd2VkIHBhcmVudFxyXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IChhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uWm9uZXNCeVpvbmUoYWxsb3dlZFpvbmUuaWQpKVxyXG4gICAgICAgIC5pdGVtcztcclxuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGlsZFpvbmUgPSB7IC4uLmNoaWxkIH0gYXMgWm9uZTtcclxuICAgICAgICAgIGNoaWxkWm9uZS52aXJ0dWFsID0gdGhpcy56b25lSXNWaXJ0dWFsKGNoaWxkKTtcclxuICAgICAgICAgIGxpc3QucHVzaChjaGlsZFpvbmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBhbGxvdyB0aGUgcGFyZW50IEZsb29yIG9mIHRoZSBhbGxvd2VkIHpvbmVcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGFsbG93ZWRab25lLnBhcmVudC5sYXllciAmJlxyXG4gICAgICAgIGFsbG93ZWRab25lLnBhcmVudC5sYXllci5uYW1lID09PSAnRkxPT1InXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxpc3QucHVzaChhbGxvd2VkWm9uZS5wYXJlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRab25lc0J5U3BhY2Uoc3BhY2VJRCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbHRlclpvbmVzSURzRm9yVXNlcih6b25lczogWm9uZVtdKTogUHJvbWlzZTxab25lW10+IHtcclxuICAgIGNvbnN0IHsgc3BhY2VJRCB9ID0gem9uZXNbMF07XHJcbiAgICBjb25zdCB6b25lSURzID0gbmV3IFNldCh6b25lcy5tYXAoKHpvbmUpID0+IHpvbmUuaWQpKTtcclxuICAgIGNvbnN0IGFsbG93ZWRab25lcyA9IGF3YWl0IHRoaXMuZ2V0Wm9uZXNCeVNwYWNlRm9yVXNlcihzcGFjZUlEKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkWm9uZXMgPSBhbGxvd2VkWm9uZXMuZmlsdGVyKCh6b25lKSA9PiB6b25lSURzLmhhcyh6b25lLmlkKSk7XHJcbiAgICByZXR1cm4gZmlsdGVyZWRab25lcztcclxuICB9XHJcblxyXG4gIGFzeW5jIGRlbGV0ZVpvbmUoem9uZUlEOiBzdHJpbmcpOiBQcm9taXNlPFpvbmU+IHtcclxuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlWm9uZSh7IGlkOiB6b25lSUQgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRab25lc0ZvclN3ZWVwRm9yU3BhY2UoXHJcbiAgICBzd2VlcElEOiBzdHJpbmcsXHJcbiAgICBzcGFjZUlEOiBzdHJpbmdcclxuICApOiBQcm9taXNlPFpvbmVbXT4ge1xyXG4gICAgY29uc3Qgem9uZXNTcGFjZSA9IChhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uWm9uZXNCeVNwYWNlKHNwYWNlSUQpKS5pdGVtcztcclxuICAgIHJldHVybiB6b25lc1NwYWNlLmZpbHRlcihcclxuICAgICAgKHpvbmUpID0+IHpvbmUuc3dlZXBJRHMgJiYgem9uZS5zd2VlcElEcy5pbmNsdWRlcyhzd2VlcElEKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXHJcbiAgc29ydFpvbmVzRnJvbUNoaWxkVG9QYXJlbnQoem9uZXNUb1NvcnQ6IFpvbmVbXSkge1xyXG4gICAgLy8gZ2V0IGRlZmF1bHRcclxuICAgIGNvbnN0IGRlZmF1bHRab25lID0gem9uZXNUb1NvcnQuZmluZCgoeikgPT4gIXoucGFyZW50SUQpO1xyXG4gICAgaWYgKGRlZmF1bHRab25lKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4T2YgPSB6b25lc1RvU29ydC5pbmRleE9mKGRlZmF1bHRab25lKTtcclxuICAgICAgem9uZXNUb1NvcnQuc3BsaWNlKGluZGV4T2YsIDEpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgem9uZXMgPSB6b25lc1RvU29ydC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGlmIChhLnBhcmVudElEID09PSBiLmlkKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgICAvLyBzbyBmYXIgYnkgbnVtYmVyIG9mIG5hdmlnYXRpb24gcG9pbnRzIGluIHRoZW1cclxuICAgIC8vIGNvbnN0IHpvbmVzID0gem9uZXNUb1NvcnQuc29ydChcclxuICAgIC8vICAgICAoYSwgYikgPT4gYS5uYXZpZ2F0aW9ucy5pdGVtcy5sZW5ndGggLSBiLm5hdmlnYXRpb25zLml0ZW1zLmxlbmd0aCxcclxuICAgIC8vICk7XHJcbiAgICBpZiAoZGVmYXVsdFpvbmUpIHtcclxuICAgICAgem9uZXMucHVzaChkZWZhdWx0Wm9uZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gem9uZXM7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRab25lc0Zvck9iamVjdChvYmplY3Q6IERiT2JqZWN0VHlwZSk6IFByb21pc2U8Wm9uZVtdPiB7XHJcbiAgICBpZiAob2JqZWN0LnBvaXMuaXRlbXMgJiYgb2JqZWN0LnBvaXMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBbcG9pXSA9IG9iamVjdC5wb2lzLml0ZW1zO1xyXG4gICAgICBpZiAocG9pLm1hdHRlcnBvcnRTd2VlcElEKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLmdldFpvbmVzRm9yU3dlZXBGb3JTcGFjZShcclxuICAgICAgICAgIHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCxcclxuICAgICAgICAgIG9iamVjdC5zcGFjZUlEXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gem9uZXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlVmlydHVhbFpvbmUoem9uZUlucHV0OiBab25lKTogUHJvbWlzZTxab25lPiB7XHJcbiAgICB6b25lSW5wdXQuc3dlZXBJRHMgPSBbXTtcclxuICAgIGNvbnN0IHpvbmUgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlWm9uZSh6b25lSW5wdXQpO1xyXG4gICAgY29uc29sZS5sb2coJ3ZpcnR1YWwgem9uZSBjcmVhdGVkJywgem9uZSk7XHJcbiAgICByZXR1cm4gem9uZTtcclxuICB9XHJcblxyXG4gIHpvbmVJc1ZpcnR1YWwoem9uZTogWm9uZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF6b25lLnN3ZWVwSURzKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICAoem9uZS50YWdzICYmIHpvbmUudGFncy5pbmNsdWRlcygndmlydHVhbCcpKSB8fFxyXG4gICAgICB6b25lLnN3ZWVwSURzLmxlbmd0aCA9PT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TW9kZWwzREZvclpvbmUoem9uZUlEOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5HZXRab25lKHpvbmVJRCk7XHJcbiAgICBpZiAoem9uZS5ub2RlSURzKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uR2V0Tm9kZSh6b25lLm5vZGVJRHNbMF0pO1xyXG4gICAgICByZXR1cm4gbm9kZS5tb2RlbDNEO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRab25lKHpvbmVJRDogc3RyaW5nKTogUHJvbWlzZTxab25lPiB7XHJcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldFpvbmUoem9uZUlEKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldERlZmF1bHRab25lRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxab25lPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRab25lc0J5U3BhY2Uoc3BhY2VJRCkudGhlbihhc3luYyAoem9uZXMpID0+IHtcclxuICAgICAgY29uc3Qgem9uZXNCdWlsZGluZyA9IHpvbmVzLmZpbHRlcihcclxuICAgICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUgPT09ICdCVUlMRElORydcclxuICAgICAgKTtcclxuICAgICAgaWYgKHpvbmVzQnVpbGRpbmcubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuIHpvbmVzQnVpbGRpbmdbMF07XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcGFyZW50Wm9uZSA9IHpvbmVzLmZpbmQoKHpvbmUpID0+ICF6b25lLnBhcmVudElEKTtcclxuICAgICAgcmV0dXJuIHBhcmVudFpvbmU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZShpbnB1dDogWm9uZSk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVab25lKGlucHV0KTtcclxuICB9XHJcblxyXG4gIC8vIGFzeW5jIGdldFNvcnRlZFpvbmVzRm9yU3dlZXBGb3JVc2VyKFxyXG4gIC8vICAgICBzd2VlcDogc3RyaW5nLFxyXG4gIC8vICAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgLy8gKTogUHJvbWlzZTxab25lW10+IHtcclxuICAvLyAgICAgaWYgKCFzcGFjZUlEKSB7XHJcbiAgLy8gICAgICAgICByZXR1cm4gW107XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLmdldFpvbmVzRm9yU3dlZXBGb3JTcGFjZShzd2VlcCwgc3BhY2VJRCk7XHJcbiAgLy8gICAgIGlmICh6b25lcy5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgICAgIHJldHVybiBbXTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBjb25zdCBmaWx0ZXJlZFpvbmVzID0gYXdhaXQgdGhpcy5maWx0ZXJab25lc0lEc0ZvclVzZXIoem9uZXMpO1xyXG4gIC8vICAgICBpZiAoZmlsdGVyZWRab25lcy5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgICAgICBsZXQgem9uZXNTb3J0ZWQgPSB0aGlzLnNvcnRab25lc0Zyb21DaGlsZFRvUGFyZW50KGZpbHRlcmVkWm9uZXMpO1xyXG4gIC8vICAgICAgICAgem9uZXNTb3J0ZWQgPSB6b25lc1NvcnRlZC5maWx0ZXIoKHpvbmUpID0+IHpvbmUgIT09IHVuZGVmaW5lZCk7XHJcbiAgLy8gICAgICAgICByZXR1cm4gem9uZXNTb3J0ZWQ7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIFtdO1xyXG4gIC8vIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlWm9uZShpbnB1dDogYW55KTogUHJvbWlzZTxab25lPiB7XHJcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLlVwZGF0ZVpvbmUoaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0Wm9uZXNGb3JOb2RlRm9yU3BhY2UoXHJcbiAgICBub2RlSUQ6IHN0cmluZyxcclxuICAgIHNwYWNlSUQ6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Wm9uZVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLlpvbmVzQnlTcGFjZShzcGFjZUlEKS50aGVuKGFzeW5jICh6b25lcykgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFpvbmVzID0gem9uZXMuaXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICh6b25lKSA9PiB6b25lLm5vZGVJRHMgJiYgem9uZS5ub2RlSURzLmluY2x1ZGVzKG5vZGVJRClcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGZpbHRlcmVkWm9uZXM7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIFpvbmUgKGxheWVyIEZMT09SKSBmb3IgYSBtYXR0ZXJwb3J0IHN3ZWVwIElEIGluIGEgZ2l2ZW4gU3BhY2VcclxuICAgKiBAcGFyYW0gc3dlZXBJRFxyXG4gICAqIEBwYXJhbSBzcGFjZUlEXHJcbiAgICogQHJldHVybnMgWm9uZVxyXG4gICAqL1xyXG4gIGFzeW5jIGdldEZsb29yWm9uZUZvclN3ZWVwSW5TcGFjZShcclxuICAgIHN3ZWVwSUQ6IHN0cmluZyxcclxuICAgIHNwYWNlSUQ6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLmdldFpvbmVzRm9yU3dlZXBGb3JTcGFjZShzd2VlcElELCBzcGFjZUlEKTtcclxuICAgIGNvbnN0IGZsb29ycyA9IHpvbmVzLmZpbHRlcihcclxuICAgICAgKHpvbmUpID0+IHpvbmUubGF5ZXIgJiYgem9uZS5sYXllci5uYW1lLmluY2x1ZGVzKCdGTE9PUicpXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGZsb29ycy5sZW5ndGggPiAwID8gZmxvb3JzWzBdIDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB6b25lcyB3aXRoIGF1ZGlvIHRyYWNrIGZvciBlbnRpcmUgc3BhY2VcclxuICAgKiBAcGFyYW0gc3BhY2VJRFxyXG4gICAqIEByZXR1cm5zICBQcm9taXNlPFpvbmVbXT5cclxuICAgKi9cclxuICBhc3luYyBnZXRBdWRpb1pvbmVzRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxab25lW10+IHtcclxuICAgIGNvbnN0IGFsbFpvbmVzID0gYXdhaXQgdGhpcy5nZXRab25lc0J5U3BhY2Uoc3BhY2VJRCk7XHJcbiAgICByZXR1cm4gYWxsWm9uZXMuZmlsdGVyKCh6b25lKSA9PiB6b25lLmF1ZGlvSUQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGF1ZGlvIHpvbmVzIGZvciB1c2VyICh3aXRoaW4gYWxsb3dlZCB6b25lcylcclxuICAgKiBAcGFyYW0gc3BhY2VJRFxyXG4gICAqIEByZXR1cm5zICBQcm9taXNlPFpvbmVbXT5cclxuICAgKi9cclxuICBhc3luYyBnZXRBdWRpb1pvbmVzRm9yVXNlckZvclNwYWNlKHNwYWNlSUQ6IHN0cmluZyk6IFByb21pc2U8Wm9uZVtdPiB7XHJcbiAgICBjb25zdCB1c2VyWm9uZXMgPSBhd2FpdCB0aGlzLmdldFpvbmVzQnlTcGFjZUZvclVzZXIoc3BhY2VJRCk7XHJcbiAgICByZXR1cm4gdXNlclpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5hdWRpb0lEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBab25lcyBieSBQYXJlbnQgWm9uZSBJRFxyXG4gICAqIEBwYXJhbSBwYXJlbnRab25lSUQgc3RyaW5nXHJcbiAgICogQHJldHVybnMgUHJvbWlzZTxab25lW10+XHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Wm9uZXNCeVBhcmVudFpvbmUocGFyZW50Wm9uZUlEOiBzdHJpbmcpOiBQcm9taXNlPFpvbmVbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fX1xyXG4gICAgICAuWm9uZXNCeVpvbmUocGFyZW50Wm9uZUlEKVxyXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuaXRlbXMpO1xyXG4gIH1cclxufVxyXG4iXX0=