@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,389 +1,389 @@
1
- /* eslint-disable no-await-in-loop */
2
- /* eslint-disable camelcase */
3
- /* eslint-disable no-underscore-dangle */
4
- /* eslint-disable class-methods-use-this */
5
- import { Injectable } from '@angular/core';
6
- import { Subject } from 'rxjs';
7
- import { ViewerInteractions, PoiType, SpModule, } from '../types.service';
8
- import { makeSecurityCamera, securityCameraType } from "../matterport-extensions/security-camera/SecurityCamera";
9
- import { ViewFrustumMeshType, makeViewFrustumMesh } from "../matterport-extensions/view-frustum-mesh/ViewFrustumMesh";
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./models/poi.service";
12
- import * as i2 from "./matterport.service";
13
- export class ViewerService {
14
- constructor(poiService, matterportService) {
15
- this.poiService = poiService;
16
- this.matterportService = matterportService;
17
- this.viewerMode = 'Matterport';
18
- this.viewerIsOn = new Subject();
19
- this.dataIsLoaded = new Subject();
20
- this.isLoaded = false;
21
- this.showingViewer = false;
22
- this.toolboxStates = {
23
- dollhouse: {
24
- stat: false,
25
- iconId: 'ui-dollhouse',
26
- show() {
27
- },
28
- hide() {
29
- },
30
- },
31
- floorplan: {
32
- stat: false,
33
- },
34
- mesure: {
35
- stat: false,
36
- iconId: 'ui-mesure',
37
- show() {
38
- },
39
- hide() {
40
- },
41
- },
42
- filter: {
43
- stat: false,
44
- },
45
- };
46
- this.isObjectLoaded = false;
47
- this.setMode('Matterport');
48
- }
49
- /*-----------------------------------------------------------------------------------------------------------------
50
- Utils
51
- -----------------------------------------------------------------------------------------------------------------*/
52
- checkMode(indexMode) {
53
- return this.viewerMode === indexMode;
54
- }
55
- /*-----------------------------------------------------------------------------------------------------------------
56
- Setters
57
- -----------------------------------------------------------------------------------------------------------------*/
58
- setMode(indexMode) {
59
- this.viewerMode = indexMode;
60
- }
61
- setTourUrl(model3d, showIconPlan = true, showIconDollhouse = true, showIconFloors = true, enableQuickStart = true) {
62
- // this.tourUrl = `https://my.matterport.com/show/?m=${model3d}&play=1&hr=0&gt=0&title=0&log=0&brand=0&search=0&applicationKey=qn9wsasuy5h2fzrbrn1nzr0id&mds=0&newtags=1`;
63
- this.tourUrl = `/assets/bundle/showcase.html?m=${model3d}&play=1&hr=0&gt=0&title=0&log=0&brand=0&search=0&applicationKey=qn9wsasuy5h2fzrbrn1nzr0id&mds=0&newtags=1`;
64
- if (!showIconPlan) {
65
- this.tourUrl += '&fp=0';
66
- }
67
- if (!showIconDollhouse) {
68
- this.tourUrl += '&dh=0';
69
- }
70
- if (!showIconFloors) {
71
- this.tourUrl += '&f=0';
72
- }
73
- if (enableQuickStart) {
74
- this.tourUrl += '&qs=1';
75
- }
76
- }
77
- async clearAll() {
78
- // this.sweepToMove = null;
79
- // this.rotationToMove = null;
80
- if (this.checkMode('Matterport')) {
81
- this.showingViewer = false;
82
- this.isLoaded = false;
83
- await this.matterportService.clearAll();
84
- this.viewerIsOn.next({
85
- spaceID: null,
86
- model3D: null,
87
- sweep: null,
88
- rotation: null,
89
- });
90
- }
91
- }
92
- /*-----------------------------------------------------------------------------------------------------------------
93
- Getters
94
- -----------------------------------------------------------------------------------------------------------------*/
95
- getMode() {
96
- return this.viewerMode;
97
- }
98
- getViewerSelectedService() {
99
- // Matterport
100
- // if (this.checkMode("Matterport")) {
101
- // return this.getMatterportService();
102
- // }
103
- return this.getMatterportService();
104
- }
105
- getTourUrl() {
106
- return this.tourUrl;
107
- }
108
- getMatterportService() {
109
- return this.matterportService;
110
- }
111
- /*-----------------------------------------------------------------------------------------------------------------
112
- Generic Main action functions
113
- -----------------------------------------------------------------------------------------------------------------*/
114
- setSweepToMove(sweep) {
115
- this.sweepToMove = sweep;
116
- }
117
- setRotationToMove(rotation) {
118
- this.rotationToMove = rotation;
119
- }
120
- async action_move_to_tag(elementId) {
121
- // Matterport
122
- if (this.checkMode('Matterport')) {
123
- const result = this.matterportService.getTagFromElementId(elementId);
124
- if (result.tag) {
125
- await this.matterportService.goToTag(result.tag);
126
- return true;
127
- }
128
- if (result.sweep) {
129
- this.sweepToMove = result.sweep;
130
- }
131
- return false;
132
- }
133
- return false;
134
- }
135
- /**
136
- * Adds Mattertags to Viewer
137
- * @param objects List of objects (tickets, equipments) etc to be added as Mattertags
138
- */
139
- async addObjectTagsToViewer(objects) {
140
- await Promise.all(objects.map(async (object) => {
141
- const poi = await this.poiService.getPoiByElementId(object.id);
142
- if (poi && poi.coordinate) {
143
- await this.actionAddObjectFromPOI(object, poi);
144
- }
145
- }));
146
- }
147
- async actionAddObjectFromPOI(object, poi) {
148
- if (this.checkMode('Matterport')) {
149
- return this.matterportService.createMattertagFromPOI(poi.type, object, poi);
150
- }
151
- // Cupix
152
- // TODO
153
- return Promise.resolve();
154
- }
155
- async action_delete_element(element) {
156
- // Matterport
157
- if (this.checkMode('Matterport')) {
158
- await this.matterportService.deleteMattertagForObject(element.id);
159
- }
160
- }
161
- /**
162
- * Enable tag placement menu to add a new element depending on its type (TICKET, DATA, EQUIPMENT etc)
163
- */
164
- async actionAddNewElementToViewer(poiType) {
165
- this.action_toolbox_inside_view();
166
- // Matterport
167
- if (this.checkMode('Matterport') &&
168
- this.matterportService.getInteractionMode() === ViewerInteractions.DEFAULT) {
169
- await this.matterportService.addMattertagWhenAdding(poiType);
170
- }
171
- }
172
- /**
173
- * Launches the repositioning of an existing Mattertag related to parameter object
174
- * @param element object (TICKET, EQUIPMENT, FEATURE, etc)
175
- * @param poiType type of object
176
- */
177
- async actionRepositionElementInViewer(element, poiType) {
178
- if (this.checkMode('Matterport') &&
179
- this.matterportService.getInteractionMode() === ViewerInteractions.DEFAULT) {
180
- await this.matterportService.addMattertagWhenRepositioning(poiType, element);
181
- }
182
- }
183
- /**
184
- * Enable ticket placement menu to add a new ticket
185
- */
186
- action_canceled() {
187
- // Matterport
188
- if (this.checkMode('Matterport')) {
189
- this.matterportService.cancelFollowingCursor();
190
- }
191
- }
192
- action_toolbox_inside_view() {
193
- // Matterport
194
- if (this.checkMode('Matterport')) {
195
- this.matterportService.action_toolbox_inside_view();
196
- }
197
- }
198
- actionShowAllFloors() {
199
- // Matterport
200
- if (this.checkMode('Matterport')) {
201
- this.matterportService.actionShowAllFloors();
202
- }
203
- }
204
- action_toolbox_dollhouse() {
205
- if (this.matterportService.getInteractionMode() !== ViewerInteractions.DEFAULT) {
206
- this.action_canceled();
207
- }
208
- this.action_toolbox_cancel_mesure();
209
- // Matterport
210
- if (this.checkMode('Matterport')) {
211
- this.matterportService.action_toolbox_dollhouse();
212
- }
213
- }
214
- async action_floorplan() {
215
- if (this.matterportService.getInteractionMode() !== ViewerInteractions.DEFAULT) {
216
- this.action_canceled();
217
- }
218
- // Matterport
219
- if (this.checkMode('Matterport')) {
220
- await this.matterportService.action_toolbox_floorplan();
221
- }
222
- }
223
- action_toolbox_mesure() {
224
- if (this.matterportService.getInteractionMode() !== ViewerInteractions.DEFAULT) {
225
- this.action_canceled();
226
- }
227
- this.action_toolbox_inside_view();
228
- // Matterport
229
- if (this.checkMode('Matterport')) {
230
- this.matterportService.action_toolbox_mesure();
231
- }
232
- }
233
- action_toolbox_cancel_mesure() {
234
- // Matterport
235
- if (this.checkMode('Matterport')) {
236
- this.matterportService.action_toolbox_cancel_mesure();
237
- }
238
- }
239
- async action_update_poi(poi, isValid, element) {
240
- if (this.checkMode('Matterport')) {
241
- if (isValid) {
242
- const lastTag = this.matterportService.mattertagToFollow
243
- ? this.matterportService.mattertagToFollow
244
- : this.matterportService.getLastTag();
245
- if (!lastTag) {
246
- return Promise.resolve(poi);
247
- }
248
- const tagData = this.matterportService.getMatterTagDataForMattertag(lastTag);
249
- if (!tagData) {
250
- return Promise.resolve(poi);
251
- }
252
- const poiMetadata = (!!poi && poi.metadata) ? JSON.parse(poi.metadata) : {};
253
- poiMetadata.normal = tagData.getNormal();
254
- if (!poi) {
255
- return Promise.resolve({});
256
- }
257
- const poiInput = {
258
- id: poi.id,
259
- coordinate: tagData.getCoordinateString(),
260
- matterportSweepID: tagData.getSweepID(),
261
- metadata: JSON.stringify(poiMetadata),
262
- };
263
- const updatedPoi = await this.poiService.updatePoi(poiInput);
264
- tagData.setPoi(updatedPoi);
265
- await this.matterportService.setObjectAndPoiInTag(lastTag, element, PoiType.DESK, updatedPoi);
266
- await this.matterportService.injectHtmlInTag(poi.type, element, lastTag);
267
- await this.matterportService.setTagIconAndOpacity(lastTag, tagData);
268
- this.matterportService.goToTag(lastTag);
269
- return Promise.resolve(updatedPoi);
270
- }
271
- this.matterportService.deleteLastMattertag();
272
- return Promise.resolve(poi);
273
- }
274
- return Promise.resolve(poi);
275
- }
276
- editOnlyTagStyleForPoi(poi, object) {
277
- if (this.checkMode('Matterport')) {
278
- const tagData = this.matterportService.getTagFromElementId(poi.elementID);
279
- if (tagData.tag) {
280
- const mattertagData = this.matterportService.getMatterTagDataForMattertag(tagData.tag);
281
- mattertagData.setObject(object, PoiType.ROOM);
282
- this.matterportService.setTagIconAndOpacity(tagData.tag, mattertagData);
283
- }
284
- }
285
- }
286
- addIconAndSetForPoi(poi, iconPath) {
287
- if (this.checkMode('Matterport')) {
288
- const tagData = this.matterportService.getTagFromElementId(poi.elementID);
289
- if (tagData.tag) {
290
- this.matterportService.addNewIconAndSetForTag(tagData.tag, iconPath);
291
- }
292
- }
293
- }
294
- changeToRegistredIconForPoi(poi, iconName) {
295
- if (this.checkMode('Matterport')) {
296
- const tagData = this.matterportService.getTagFromElementId(poi.elementID);
297
- if (tagData.tag) {
298
- this.matterportService.setRegistredIconForTag(tagData.tag, iconName);
299
- }
300
- }
301
- }
302
- async updateHtmlTagForPoiWithObject(poi, object) {
303
- if (this.checkMode('Matterport')) {
304
- const tagData = this.matterportService.getTagFromElementId(poi.elementID);
305
- if (tagData.tag) {
306
- await this.matterportService.updateInjectedHtmlForTagID(tagData.tag, object, poi.type);
307
- }
308
- }
309
- }
310
- /**
311
- * Move an existing poi in Matterport
312
- * @param poi
313
- * @param element
314
- */
315
- async action_move_poi_visually(poi, element) {
316
- await this.action_delete_element(element);
317
- await this.actionAddObjectFromPOI(element, poi);
318
- }
319
- /*-----------------------------------------------------------------------------------------------------------------
320
- Cupix
321
- -----------------------------------------------------------------------------------------------------------------*/
322
- /*-----------------------------------------------------------------------------------------------------------------
323
- Matterport
324
- https://matterport.github.io/showcase-sdk/docs/sdk/reference/current/modules/mattertag.html#add
325
- https://matterport.github.io/showcase-sdk/docs/sdk/reference/current/modules/mattertag.html#remove
326
- -----------------------------------------------------------------------------------------------------------------*/
327
- async initMatterportSdk(spaceID, model3D, tagService, module = SpModule.IMMO) {
328
- this.isLoaded = false;
329
- this.matterportService.currentSpaceID = spaceID;
330
- if (this.matterportService.sdk) {
331
- await this.clearAll();
332
- }
333
- return this.matterportService
334
- .initSdk(tagService, module)
335
- .then(async (result) => {
336
- if (result) {
337
- const { sdk } = this.matterportService;
338
- // TODO: add condition whether we want to enable it or not
339
- // Additionnal extensions for Matterport
340
- // 1. Security Camera with Frustum (FOV)
341
- // 2. TODO register all new Matterport extensions here (nestSensor, lods, slots, ...)
342
- await Promise.all([
343
- sdk.Scene.register(securityCameraType, makeSecurityCamera.bind(sdk.Scene)),
344
- sdk.Scene.register(ViewFrustumMeshType, makeViewFrustumMesh.bind(sdk.Scene))
345
- ]);
346
- sdk.App.state.subscribe(function (appState) {
347
- // app state has changed
348
- // console.log('The current phase: ', appState.phase);
349
- if (appState.phase === sdk.App.Phase.PLAYING) {
350
- // console.log('The app is playing');
351
- this.showingViewer = true;
352
- this.viewerIsOn.next({
353
- spaceID,
354
- model3D,
355
- sweep: this.sweepToMove,
356
- rotation: this.rotationToMove,
357
- });
358
- this.dataIsLoaded.next(true);
359
- this.isLoaded = true;
360
- this.sweepToMove = null;
361
- this.rotationToMove = null;
362
- }
363
- }.bind(this));
364
- return Promise.resolve();
365
- }
366
- return Promise.reject();
367
- });
368
- }
369
- removeForbiddenSweeps(forbiddenSweeps) {
370
- if (this.checkMode('Matterport')) {
371
- this.matterportService.removeForbiddenSweeps(forbiddenSweeps);
372
- }
373
- }
374
- setObject3DLoadedInPosition(objectLoaded) {
375
- this.isObjectLoaded = objectLoaded;
376
- }
377
- isObject3DLoadedInPosition() {
378
- return this.isObjectLoaded;
379
- }
380
- }
381
- ViewerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ViewerService, deps: [{ token: i1.PoiService }, { token: i2.MatterportService }], target: i0.ɵɵFactoryTarget.Injectable });
382
- ViewerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ViewerService, providedIn: 'root' });
383
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ViewerService, decorators: [{
384
- type: Injectable,
385
- args: [{
386
- providedIn: 'root',
387
- }]
388
- }], ctorParameters: function () { return [{ type: i1.PoiService }, { type: i2.MatterportService }]; } });
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHN0IsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixPQUFPLEVBS1AsUUFBUSxHQUNULE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFDLE1BQU0seURBQXlELENBQUM7QUFDL0csT0FBTyxFQUFDLG1CQUFtQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sNERBQTRELENBQUM7Ozs7QUFNcEgsTUFBTSxPQUFPLGFBQWE7SUFrRHhCLFlBQ1UsVUFBc0IsRUFDdEIsaUJBQW9DO1FBRHBDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQW5EdEMsZUFBVSxHQUFXLFlBQVksQ0FBQztRQU1uQyxlQUFVLEdBS1osSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVaLGlCQUFZLEdBQXFCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFL0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQU10QixrQkFBYSxHQUFHO1lBQ3JCLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUUsY0FBYztnQkFDdEIsSUFBSTtnQkFDSixDQUFDO2dCQUNELElBQUk7Z0JBQ0osQ0FBQzthQUNGO1lBQ0QsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxLQUFLO2FBQ1o7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLElBQUk7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJO2dCQUNKLENBQUM7YUFDRjtZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsS0FBSzthQUNaO1NBQ0YsQ0FBQztRQUNNLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBTXRDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUdEOzt5SEFFcUg7SUFFckgsU0FBUyxDQUFDLFNBQWlCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVEOzt5SEFFcUg7SUFFckgsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRCxVQUFVLENBQ1IsT0FBZSxFQUNmLGVBQXdCLElBQUksRUFDNUIsb0JBQTZCLElBQUksRUFDakMsaUJBQTBCLElBQUksRUFDOUIsbUJBQTRCLElBQUk7UUFFaEMsMEtBQTBLO1FBQzFLLElBQUksQ0FBQyxPQUFPLEdBQUcsa0NBQWtDLE9BQU8sMkdBQTJHLENBQUM7UUFFcEssSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN0QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUM7U0FDeEI7UUFDRCxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osMkJBQTJCO1FBQzNCLDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ25CLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRSxJQUFJO2dCQUNYLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7O3lIQUVxSDtJQUVySCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsYUFBYTtRQUNiLHNDQUFzQztRQUN0QywwQ0FBMEM7UUFDMUMsSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O3lIQUVxSDtJQUNySCxjQUFjLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBbUM7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUFpQjtRQUN4QyxhQUFhO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2pDO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxPQUF1QjtRQUNqRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUN6QixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUFvQixFQUFFLEdBQVE7UUFDekQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUNsRCxHQUFHLENBQUMsSUFBSyxFQUNULE1BQU0sRUFDTixHQUFHLENBQ0osQ0FBQztTQUNIO1FBQ0QsUUFBUTtRQUNSLE9BQU87UUFDUCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQXFCO1FBQy9DLGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25FO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQWdCO1FBQ2hELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRWxDLGFBQWE7UUFDYixJQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLGtCQUFrQixDQUFDLE9BQU8sRUFDMUU7WUFDQSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5RDtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxPQUFxQixFQUNyQixPQUFnQjtRQUVoQixJQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLGtCQUFrQixDQUFDLE9BQU8sRUFDMUU7WUFDQSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDOUU7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNyRDtJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM5QztJQUNILENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsSUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLEVBQzFFO1lBQ0EsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLElBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLEtBQUssa0JBQWtCLENBQUMsT0FBTyxFQUMxRTtZQUNBLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUNELGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUN6RDtJQUNILENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLEVBQzFFO1lBQ0EsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFRCw0QkFBNEI7UUFDMUIsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztTQUN2RDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQ3JCLEdBQVEsRUFDUixPQUFnQixFQUNoQixPQUFxQjtRQUVyQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUI7b0JBQzFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ1osT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM3QjtnQkFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ1osT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM3QjtnQkFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxXQUFXLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDUixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQzVCO2dCQUNELE1BQU0sUUFBUSxHQUFHO29CQUNmLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFDVixVQUFVLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFO29CQUN6QyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUN2QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7aUJBQ3RDLENBQUM7Z0JBQ0YsTUFBTSxVQUFVLEdBQVEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM5RixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQzFDLEdBQUcsQ0FBQyxJQUFLLEVBQ1QsT0FBTyxFQUNQLE9BQU8sQ0FDUixDQUFDO2dCQUNGLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFeEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0MsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxHQUFRLEVBQUUsTUFBb0I7UUFDbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUNmLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FDdkUsT0FBTyxDQUFDLEdBQUcsQ0FDWixDQUFDO2dCQUNGLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDekU7U0FDRjtJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxHQUFRLEVBQUUsUUFBZ0I7UUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsMkJBQTJCLENBQUMsR0FBUSxFQUFFLFFBQWdCO1FBQ3BELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN0RTtTQUNGO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxHQUFRLEVBQUUsTUFBb0I7UUFDaEUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUNmLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLDBCQUEwQixDQUNyRCxPQUFPLENBQUMsR0FBRyxFQUNYLE1BQU0sRUFDTixHQUFHLENBQUMsSUFBSSxDQUNULENBQUM7YUFDSDtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQzVCLEdBQVEsRUFDUixPQUErQztRQUUvQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztzSEFFa0g7SUFFbEg7Ozs7cUhBSWlIO0lBRWpILEtBQUssQ0FBQyxpQkFBaUIsQ0FDckIsT0FBZSxFQUNmLE9BQWUsRUFDZixVQUEwQixFQUMxQixTQUFtQixRQUFRLENBQUMsSUFBSTtRQUVoQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDdkI7UUFDRCxPQUFPLElBQUksQ0FBQyxpQkFBaUI7YUFDMUIsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7YUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQixJQUFJLE1BQU0sRUFBRTtnQkFDVixNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUVyQywwREFBMEQ7Z0JBQzFELHdDQUF3QztnQkFDeEMsd0NBQXdDO2dCQUN4QyxxRkFBcUY7Z0JBQ3JGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztvQkFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0UsQ0FBQyxDQUFDO2dCQUVILEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDckIsVUFBVSxRQUFRO29CQUNoQix3QkFBd0I7b0JBQ3hCLHNEQUFzRDtvQkFDdEQsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTt3QkFDNUMscUNBQXFDO3dCQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7NEJBQ25CLE9BQU87NEJBQ1AsT0FBTzs0QkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7NEJBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYzt5QkFDOUIsQ0FBQyxDQUFDO3dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO3FCQUM1QjtnQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNiLENBQUM7Z0JBQ0YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDMUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxlQUF5QjtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVELDJCQUEyQixDQUFDLFlBQXFCO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7OzBHQWxlVSxhQUFhOzhHQUFiLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge01hdHRlcnBvcnRTZXJ2aWNlfSBmcm9tICcuL21hdHRlcnBvcnQuc2VydmljZSc7XG5pbXBvcnQge0Jhc2VUYWdTZXJ2aWNlfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIERiT2JqZWN0VHlwZSxcbiAgUE9JLFxuICBWaWV3ZXJJbnRlcmFjdGlvbnMsXG4gIFBvaVR5cGUsXG4gIENvbW1lbnQsXG4gIEVxdWlwbWVudCxcbiAgVGlja2V0LFxuICBGZWF0dXJlLFxuICBTcE1vZHVsZSxcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQge1BvaVNlcnZpY2V9IGZyb20gJy4vbW9kZWxzL3BvaS5zZXJ2aWNlJztcbmltcG9ydCB7bWFrZVNlY3VyaXR5Q2FtZXJhLCBzZWN1cml0eUNhbWVyYVR5cGV9IGZyb20gXCIuLi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvc2VjdXJpdHktY2FtZXJhL1NlY3VyaXR5Q2FtZXJhXCI7XG5pbXBvcnQge1ZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2h9IGZyb20gXCIuLi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoXCI7XG5pbXBvcnQgeyBOYXZpZ2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi9uYXZpZ2F0b3Iuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWaWV3ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB2aWV3ZXJNb2RlOiBzdHJpbmcgPSAnTWF0dGVycG9ydCc7XG5cbiAgcHVibGljIGN1cnJlbnRNb2RlbDNEOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSB0b3VyVXJsOiBzdHJpbmc7XG5cbiAgcHVibGljIHZpZXdlcklzT246IFN1YmplY3Q8e1xuICAgIHNwYWNlSUQ6IHN0cmluZyB8IG51bGw7XG4gICAgbW9kZWwzRDogc3RyaW5nIHwgbnVsbDtcbiAgICBzd2VlcDogc3RyaW5nIHwgbnVsbDtcbiAgICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB8IG51bGw7XG4gIH0+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwdWJsaWMgZGF0YUlzTG9hZGVkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwdWJsaWMgaXNMb2FkZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgc2hvd2luZ1ZpZXdlciA9IGZhbHNlO1xuXG4gIHB1YmxpYyBzd2VlcFRvTW92ZTogc3RyaW5nIHwgbnVsbDtcblxuICBwdWJsaWMgcm90YXRpb25Ub01vdmU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0gfCBudWxsO1xuXG4gIHB1YmxpYyB0b29sYm94U3RhdGVzID0ge1xuICAgIGRvbGxob3VzZToge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgICBpY29uSWQ6ICd1aS1kb2xsaG91c2UnLFxuICAgICAgc2hvdygpIHtcbiAgICAgIH0sXG4gICAgICBoaWRlKCkge1xuICAgICAgfSxcbiAgICB9LFxuICAgIGZsb29ycGxhbjoge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgfSxcbiAgICBtZXN1cmU6IHtcbiAgICAgIHN0YXQ6IGZhbHNlLFxuICAgICAgaWNvbklkOiAndWktbWVzdXJlJyxcbiAgICAgIHNob3coKSB7XG4gICAgICB9LFxuICAgICAgaGlkZSgpIHtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBmaWx0ZXI6IHtcbiAgICAgIHN0YXQ6IGZhbHNlLFxuICAgIH0sXG4gIH07XG4gIHByaXZhdGUgaXNPYmplY3RMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBvaVNlcnZpY2U6IFBvaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXR0ZXJwb3J0U2VydmljZTogTWF0dGVycG9ydFNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuc2V0TW9kZSgnTWF0dGVycG9ydCcpO1xuICB9XG5cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgVXRpbHNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgY2hlY2tNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudmlld2VyTW9kZSA9PT0gaW5kZXhNb2RlO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIFNldHRlcnNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgc2V0TW9kZShpbmRleE1vZGU6IHN0cmluZykge1xuICAgIHRoaXMudmlld2VyTW9kZSA9IGluZGV4TW9kZTtcbiAgfVxuXG4gIHNldFRvdXJVcmwoXG4gICAgbW9kZWwzZDogc3RyaW5nLFxuICAgIHNob3dJY29uUGxhbjogYm9vbGVhbiA9IHRydWUsXG4gICAgc2hvd0ljb25Eb2xsaG91c2U6IGJvb2xlYW4gPSB0cnVlLFxuICAgIHNob3dJY29uRmxvb3JzOiBib29sZWFuID0gdHJ1ZSxcbiAgICBlbmFibGVRdWlja1N0YXJ0OiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICAvLyB0aGlzLnRvdXJVcmwgPSBgaHR0cHM6Ly9teS5tYXR0ZXJwb3J0LmNvbS9zaG93Lz9tPSR7bW9kZWwzZH0mcGxheT0xJmhyPTAmZ3Q9MCZ0aXRsZT0wJmxvZz0wJmJyYW5kPTAmc2VhcmNoPTAmYXBwbGljYXRpb25LZXk9cW45d3Nhc3V5NWgyZnpyYnJuMW56cjBpZCZtZHM9MCZuZXd0YWdzPTFgO1xuICAgIHRoaXMudG91clVybCA9IGAvYXNzZXRzL2J1bmRsZS9zaG93Y2FzZS5odG1sP209JHttb2RlbDNkfSZwbGF5PTEmaHI9MCZndD0wJnRpdGxlPTAmbG9nPTAmYnJhbmQ9MCZzZWFyY2g9MCZhcHBsaWNhdGlvbktleT1xbjl3c2FzdXk1aDJmenJicm4xbnpyMGlkJm1kcz0wJm5ld3RhZ3M9MWA7XG5cbiAgICBpZiAoIXNob3dJY29uUGxhbikge1xuICAgICAgdGhpcy50b3VyVXJsICs9ICcmZnA9MCc7XG4gICAgfVxuICAgIGlmICghc2hvd0ljb25Eb2xsaG91c2UpIHtcbiAgICAgIHRoaXMudG91clVybCArPSAnJmRoPTAnO1xuICAgIH1cbiAgICBpZiAoIXNob3dJY29uRmxvb3JzKSB7XG4gICAgICB0aGlzLnRvdXJVcmwgKz0gJyZmPTAnO1xuICAgIH1cbiAgICBpZiAoZW5hYmxlUXVpY2tTdGFydCkge1xuICAgICAgdGhpcy50b3VyVXJsICs9ICcmcXM9MSc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2xlYXJBbGwoKSB7XG4gICAgLy8gdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XG4gICAgLy8gdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMuc2hvd2luZ1ZpZXdlciA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jbGVhckFsbCgpO1xuICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xuICAgICAgICBzcGFjZUlEOiBudWxsLFxuICAgICAgICBtb2RlbDNEOiBudWxsLFxuICAgICAgICBzd2VlcDogbnVsbCxcbiAgICAgICAgcm90YXRpb246IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgR2V0dGVyc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBnZXRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdlck1vZGU7XG4gIH1cblxuICBnZXRWaWV3ZXJTZWxlY3RlZFNlcnZpY2UoKSB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIC8vIGlmICh0aGlzLmNoZWNrTW9kZShcIk1hdHRlcnBvcnRcIikpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2V0TWF0dGVycG9ydFNlcnZpY2UoKTtcbiAgICAvLyB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWF0dGVycG9ydFNlcnZpY2UoKTtcbiAgfVxuXG4gIGdldFRvdXJVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG91clVybDtcbiAgfVxuXG4gIGdldE1hdHRlcnBvcnRTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIEdlbmVyaWMgTWFpbiBhY3Rpb24gZnVuY3Rpb25zXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICBzZXRTd2VlcFRvTW92ZShzd2VlcDogc3RyaW5nKSB7XG4gICAgdGhpcy5zd2VlcFRvTW92ZSA9IHN3ZWVwO1xuICB9XG5cbiAgc2V0Um90YXRpb25Ub01vdmUocm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0pIHtcbiAgICB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gcm90YXRpb247XG4gIH1cblxuICBhc3luYyBhY3Rpb25fbW92ZV90b190YWcoZWxlbWVudElkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SWQpO1xuICAgICAgaWYgKHJlc3VsdC50YWcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nb1RvVGFnKHJlc3VsdC50YWcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuc3dlZXApIHtcbiAgICAgICAgdGhpcy5zd2VlcFRvTW92ZSA9IHJlc3VsdC5zd2VlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgTWF0dGVydGFncyB0byBWaWV3ZXJcbiAgICogQHBhcmFtIG9iamVjdHMgTGlzdCBvZiBvYmplY3RzICh0aWNrZXRzLCBlcXVpcG1lbnRzKSBldGMgdG8gYmUgYWRkZWQgYXMgTWF0dGVydGFnc1xuICAgKi9cbiAgYXN5bmMgYWRkT2JqZWN0VGFnc1RvVmlld2VyKG9iamVjdHM6IERiT2JqZWN0VHlwZVtdKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBvYmplY3RzLm1hcChhc3luYyAob2JqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5nZXRQb2lCeUVsZW1lbnRJZChvYmplY3QuaWQhKTtcbiAgICAgICAgaWYgKHBvaSAmJiBwb2kuY29vcmRpbmF0ZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShvYmplY3QsIHBvaSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGFjdGlvbkFkZE9iamVjdEZyb21QT0kob2JqZWN0OiBEYk9iamVjdFR5cGUsIHBvaTogUE9JKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXG4gICAgICAgIHBvaS50eXBlISxcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwb2lcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEN1cGl4XG4gICAgLy8gVE9ET1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50OiBEYk9iamVjdFR5cGUpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTWF0dGVydGFnRm9yT2JqZWN0KGVsZW1lbnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFnIHBsYWNlbWVudCBtZW51IHRvIGFkZCBhIG5ldyBlbGVtZW50IGRlcGVuZGluZyBvbiBpdHMgdHlwZSAoVElDS0VULCBEQVRBLCBFUVVJUE1FTlQgZXRjKVxuICAgKi9cbiAgYXN5bmMgYWN0aW9uQWRkTmV3RWxlbWVudFRvVmlld2VyKHBvaVR5cGU6IFBvaVR5cGUpIHtcbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XG5cbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSAmJlxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTWF0dGVydGFnV2hlbkFkZGluZyhwb2lUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgdGhlIHJlcG9zaXRpb25pbmcgb2YgYW4gZXhpc3RpbmcgTWF0dGVydGFnIHJlbGF0ZWQgdG8gcGFyYW1ldGVyIG9iamVjdFxuICAgKiBAcGFyYW0gZWxlbWVudCBvYmplY3QgKFRJQ0tFVCwgRVFVSVBNRU5ULCBGRUFUVVJFLCBldGMpXG4gICAqIEBwYXJhbSBwb2lUeXBlIHR5cGUgb2Ygb2JqZWN0XG4gICAqL1xuICBhc3luYyBhY3Rpb25SZXBvc2l0aW9uRWxlbWVudEluVmlld2VyKFxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZSxcbiAgICBwb2lUeXBlOiBQb2lUeXBlXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGUsIGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGlja2V0IHBsYWNlbWVudCBtZW51IHRvIGFkZCBhIG5ldyB0aWNrZXRcbiAgICovXG4gIGFjdGlvbl9jYW5jZWxlZCgpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY2FuY2VsRm9sbG93aW5nQ3Vyc29yKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKSB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycygpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxuICAgICkge1xuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2NhbmNlbF9tZXN1cmUoKTtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWN0aW9uX2Zsb29ycGxhbigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxuICAgICkge1xuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcbiAgICB9XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X2Zsb29ycGxhbigpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbl90b29sYm94X21lc3VyZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxuICAgICkge1xuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X21lc3VyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbl90b29sYm94X2NhbmNlbF9tZXN1cmUoKSB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X2NhbmNlbF9tZXN1cmUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3Rpb25fdXBkYXRlX3BvaShcbiAgICBwb2k6IFBPSSxcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZVxuICApOiBQcm9taXNlPFBPST4ge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICBjb25zdCBsYXN0VGFnID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvd1xuICAgICAgICAgID8gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvd1xuICAgICAgICAgIDogdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRMYXN0VGFnKCk7XG4gICAgICAgIGlmICghbGFzdFRhZykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRNYXR0ZXJUYWdEYXRhRm9yTWF0dGVydGFnKGxhc3RUYWcpO1xuICAgICAgICBpZiAoIXRhZ0RhdGEpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2lNZXRhZGF0YSA9ICghIXBvaSAmJiBwb2kubWV0YWRhdGEpID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge307XG4gICAgICAgIHBvaU1ldGFkYXRhLm5vcm1hbCA9IHRhZ0RhdGEuZ2V0Tm9ybWFsKCk7XG4gICAgICAgIGlmICghcG9pKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pSW5wdXQgPSB7XG4gICAgICAgICAgaWQ6IHBvaS5pZCxcbiAgICAgICAgICBjb29yZGluYXRlOiB0YWdEYXRhLmdldENvb3JkaW5hdGVTdHJpbmcoKSxcbiAgICAgICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogdGFnRGF0YS5nZXRTd2VlcElEKCksXG4gICAgICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHBvaU1ldGFkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdXBkYXRlZFBvaTogUE9JID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLnVwZGF0ZVBvaShwb2lJbnB1dCk7XG4gICAgICAgIHRhZ0RhdGEuc2V0UG9pKHVwZGF0ZWRQb2kpO1xuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldE9iamVjdEFuZFBvaUluVGFnKGxhc3RUYWcsIGVsZW1lbnQsIFBvaVR5cGUuREVTSywgdXBkYXRlZFBvaSk7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuaW5qZWN0SHRtbEluVGFnKFxuICAgICAgICAgIHBvaS50eXBlISxcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIGxhc3RUYWdcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRUYWdJY29uQW5kT3BhY2l0eShsYXN0VGFnLCB0YWdEYXRhKTtcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nb1RvVGFnKGxhc3RUYWcpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXBkYXRlZFBvaSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICB9XG5cbiAgZWRpdE9ubHlUYWdTdHlsZUZvclBvaShwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChwb2kuZWxlbWVudElEKTtcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xuICAgICAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRNYXR0ZXJUYWdEYXRhRm9yTWF0dGVydGFnKFxuICAgICAgICAgIHRhZ0RhdGEudGFnXG4gICAgICAgICk7XG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0T2JqZWN0KG9iamVjdCwgUG9pVHlwZS5ST09NKTtcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRUYWdJY29uQW5kT3BhY2l0eSh0YWdEYXRhLnRhZywgbWF0dGVydGFnRGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkSWNvbkFuZFNldEZvclBvaShwb2k6IFBPSSwgaWNvblBhdGg6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTmV3SWNvbkFuZFNldEZvclRhZyh0YWdEYXRhLnRhZywgaWNvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVRvUmVnaXN0cmVkSWNvbkZvclBvaShwb2k6IFBPSSwgaWNvbk5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0UmVnaXN0cmVkSWNvbkZvclRhZyh0YWdEYXRhLnRhZywgaWNvbk5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUh0bWxUYWdGb3JQb2lXaXRoT2JqZWN0KHBvaTogUE9JLCBvYmplY3Q6IERiT2JqZWN0VHlwZSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UudXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXG4gICAgICAgICAgdGFnRGF0YS50YWcsXG4gICAgICAgICAgb2JqZWN0LFxuICAgICAgICAgIHBvaS50eXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYW4gZXhpc3RpbmcgcG9pIGluIE1hdHRlcnBvcnRcbiAgICogQHBhcmFtIHBvaVxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKi9cbiAgYXN5bmMgYWN0aW9uX21vdmVfcG9pX3Zpc3VhbGx5KFxuICAgIHBvaTogUE9JLFxuICAgIGVsZW1lbnQ6IFRpY2tldCB8IEZlYXR1cmUgfCBFcXVpcG1lbnQgfCBDb21tZW50XG4gICkge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9lbGVtZW50KGVsZW1lbnQpO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShlbGVtZW50LCBwb2kpO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEN1cGl4XG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBNYXR0ZXJwb3J0XG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNhZGRcbiAgICBodHRwczovL21hdHRlcnBvcnQuZ2l0aHViLmlvL3Nob3djYXNlLXNkay9kb2NzL3Nkay9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzL21hdHRlcnRhZy5odG1sI3JlbW92ZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIGFzeW5jIGluaXRNYXR0ZXJwb3J0U2RrKFxuICAgIHNwYWNlSUQ6IHN0cmluZyxcbiAgICBtb2RlbDNEOiBzdHJpbmcsXG4gICAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UsXG4gICAgbW9kdWxlOiBTcE1vZHVsZSA9IFNwTW9kdWxlLklNTU9cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY3VycmVudFNwYWNlSUQgPSBzcGFjZUlEO1xuICAgIGlmICh0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNkaykge1xuICAgICAgYXdhaXQgdGhpcy5jbGVhckFsbCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZVxuICAgICAgLmluaXRTZGsodGFnU2VydmljZSwgbW9kdWxlKVxuICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qge3Nka30gPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlO1xuXG4gICAgICAgICAgLy8gVE9ETzogYWRkIGNvbmRpdGlvbiB3aGV0aGVyIHdlIHdhbnQgdG8gZW5hYmxlIGl0IG9yIG5vdFxuICAgICAgICAgIC8vIEFkZGl0aW9ubmFsIGV4dGVuc2lvbnMgZm9yIE1hdHRlcnBvcnRcbiAgICAgICAgICAvLyAxLiBTZWN1cml0eSBDYW1lcmEgd2l0aCBGcnVzdHVtIChGT1YpXG4gICAgICAgICAgLy8gMi4gVE9ETyByZWdpc3RlciBhbGwgbmV3IE1hdHRlcnBvcnQgZXh0ZW5zaW9ucyBoZXJlIChuZXN0U2Vuc29yLCBsb2RzLCBzbG90cywgLi4uKVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHNkay5TY2VuZS5yZWdpc3RlcihzZWN1cml0eUNhbWVyYVR5cGUsIG1ha2VTZWN1cml0eUNhbWVyYS5iaW5kKHNkay5TY2VuZSkpLFxuICAgICAgICAgICAgc2RrLlNjZW5lLnJlZ2lzdGVyKFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2guYmluZChzZGsuU2NlbmUpKVxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoXG4gICAgICAgICAgICBmdW5jdGlvbiAoYXBwU3RhdGUpIHtcbiAgICAgICAgICAgICAgLy8gYXBwIHN0YXRlIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgY3VycmVudCBwaGFzZTogJywgYXBwU3RhdGUucGhhc2UpO1xuICAgICAgICAgICAgICBpZiAoYXBwU3RhdGUucGhhc2UgPT09IHNkay5BcHAuUGhhc2UuUExBWUlORykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgYXBwIGlzIHBsYXlpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgICAgICAgICAgIHNwYWNlSUQsXG4gICAgICAgICAgICAgICAgICBtb2RlbDNELFxuICAgICAgICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXG4gICAgICAgICAgICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvblRvTW92ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5yZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzKTtcbiAgICB9XG4gIH1cblxuICBzZXRPYmplY3QzRExvYWRlZEluUG9zaXRpb24ob2JqZWN0TG9hZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc09iamVjdExvYWRlZCA9IG9iamVjdExvYWRlZDtcbiAgfVxuXG4gIGlzT2JqZWN0M0RMb2FkZWRJblBvc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0TG9hZGVkO1xuICB9XG59XG4iXX0=
1
+ /* eslint-disable no-await-in-loop */
2
+ /* eslint-disable camelcase */
3
+ /* eslint-disable no-underscore-dangle */
4
+ /* eslint-disable class-methods-use-this */
5
+ import { Injectable } from '@angular/core';
6
+ import { Subject } from 'rxjs';
7
+ import { ViewerInteractions, PoiType, SpModule, } from '../types.service';
8
+ import { makeSecurityCamera, securityCameraType } from "../matterport-extensions/security-camera/SecurityCamera";
9
+ import { ViewFrustumMeshType, makeViewFrustumMesh } from "../matterport-extensions/view-frustum-mesh/ViewFrustumMesh";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./models/poi.service";
12
+ import * as i2 from "./matterport.service";
13
+ export class ViewerService {
14
+ constructor(poiService, matterportService) {
15
+ this.poiService = poiService;
16
+ this.matterportService = matterportService;
17
+ this.viewerMode = 'Matterport';
18
+ this.viewerIsOn = new Subject();
19
+ this.dataIsLoaded = new Subject();
20
+ this.isLoaded = false;
21
+ this.showingViewer = false;
22
+ this.toolboxStates = {
23
+ dollhouse: {
24
+ stat: false,
25
+ iconId: 'ui-dollhouse',
26
+ show() {
27
+ },
28
+ hide() {
29
+ },
30
+ },
31
+ floorplan: {
32
+ stat: false,
33
+ },
34
+ mesure: {
35
+ stat: false,
36
+ iconId: 'ui-mesure',
37
+ show() {
38
+ },
39
+ hide() {
40
+ },
41
+ },
42
+ filter: {
43
+ stat: false,
44
+ },
45
+ };
46
+ this.isObjectLoaded = false;
47
+ this.setMode('Matterport');
48
+ }
49
+ /*-----------------------------------------------------------------------------------------------------------------
50
+ Utils
51
+ -----------------------------------------------------------------------------------------------------------------*/
52
+ checkMode(indexMode) {
53
+ return this.viewerMode === indexMode;
54
+ }
55
+ /*-----------------------------------------------------------------------------------------------------------------
56
+ Setters
57
+ -----------------------------------------------------------------------------------------------------------------*/
58
+ setMode(indexMode) {
59
+ this.viewerMode = indexMode;
60
+ }
61
+ setTourUrl(model3d, showIconPlan = true, showIconDollhouse = true, showIconFloors = true, enableQuickStart = true) {
62
+ // this.tourUrl = `https://my.matterport.com/show/?m=${model3d}&play=1&hr=0&gt=0&title=0&log=0&brand=0&search=0&applicationKey=qn9wsasuy5h2fzrbrn1nzr0id&mds=0&newtags=1`;
63
+ this.tourUrl = `/assets/bundle/showcase.html?m=${model3d}&play=1&hr=0&gt=0&title=0&log=0&brand=0&search=0&applicationKey=qn9wsasuy5h2fzrbrn1nzr0id&mds=0&newtags=1`;
64
+ if (!showIconPlan) {
65
+ this.tourUrl += '&fp=0';
66
+ }
67
+ if (!showIconDollhouse) {
68
+ this.tourUrl += '&dh=0';
69
+ }
70
+ if (!showIconFloors) {
71
+ this.tourUrl += '&f=0';
72
+ }
73
+ if (enableQuickStart) {
74
+ this.tourUrl += '&qs=1';
75
+ }
76
+ }
77
+ async clearAll() {
78
+ // this.sweepToMove = null;
79
+ // this.rotationToMove = null;
80
+ if (this.checkMode('Matterport')) {
81
+ this.showingViewer = false;
82
+ this.isLoaded = false;
83
+ await this.matterportService.clearAll();
84
+ this.viewerIsOn.next({
85
+ spaceID: null,
86
+ model3D: null,
87
+ sweep: null,
88
+ rotation: null,
89
+ });
90
+ }
91
+ }
92
+ /*-----------------------------------------------------------------------------------------------------------------
93
+ Getters
94
+ -----------------------------------------------------------------------------------------------------------------*/
95
+ getMode() {
96
+ return this.viewerMode;
97
+ }
98
+ getViewerSelectedService() {
99
+ // Matterport
100
+ // if (this.checkMode("Matterport")) {
101
+ // return this.getMatterportService();
102
+ // }
103
+ return this.getMatterportService();
104
+ }
105
+ getTourUrl() {
106
+ return this.tourUrl;
107
+ }
108
+ getMatterportService() {
109
+ return this.matterportService;
110
+ }
111
+ /*-----------------------------------------------------------------------------------------------------------------
112
+ Generic Main action functions
113
+ -----------------------------------------------------------------------------------------------------------------*/
114
+ setSweepToMove(sweep) {
115
+ this.sweepToMove = sweep;
116
+ }
117
+ setRotationToMove(rotation) {
118
+ this.rotationToMove = rotation;
119
+ }
120
+ async action_move_to_tag(elementId) {
121
+ // Matterport
122
+ if (this.checkMode('Matterport')) {
123
+ const result = this.matterportService.getTagFromElementId(elementId);
124
+ if (result.tag) {
125
+ await this.matterportService.goToTag(result.tag);
126
+ return true;
127
+ }
128
+ if (result.sweep) {
129
+ this.sweepToMove = result.sweep;
130
+ }
131
+ return false;
132
+ }
133
+ return false;
134
+ }
135
+ /**
136
+ * Adds Mattertags to Viewer
137
+ * @param objects List of objects (tickets, equipments) etc to be added as Mattertags
138
+ */
139
+ async addObjectTagsToViewer(objects) {
140
+ await Promise.all(objects.map(async (object) => {
141
+ const poi = await this.poiService.getPoiByElementId(object.id);
142
+ if (poi && poi.coordinate) {
143
+ await this.actionAddObjectFromPOI(object, poi);
144
+ }
145
+ }));
146
+ }
147
+ async actionAddObjectFromPOI(object, poi) {
148
+ if (this.checkMode('Matterport')) {
149
+ return this.matterportService.createMattertagFromPOI(poi.type, object, poi);
150
+ }
151
+ // Cupix
152
+ // TODO
153
+ return Promise.resolve();
154
+ }
155
+ async action_delete_element(element) {
156
+ // Matterport
157
+ if (this.checkMode('Matterport')) {
158
+ await this.matterportService.deleteMattertagForObject(element.id);
159
+ }
160
+ }
161
+ /**
162
+ * Enable tag placement menu to add a new element depending on its type (TICKET, DATA, EQUIPMENT etc)
163
+ */
164
+ async actionAddNewElementToViewer(poiType) {
165
+ this.action_toolbox_inside_view();
166
+ // Matterport
167
+ if (this.checkMode('Matterport') &&
168
+ this.matterportService.getInteractionMode() === ViewerInteractions.DEFAULT) {
169
+ await this.matterportService.addMattertagWhenAdding(poiType);
170
+ }
171
+ }
172
+ /**
173
+ * Launches the repositioning of an existing Mattertag related to parameter object
174
+ * @param element object (TICKET, EQUIPMENT, FEATURE, etc)
175
+ * @param poiType type of object
176
+ */
177
+ async actionRepositionElementInViewer(element, poiType) {
178
+ if (this.checkMode('Matterport') &&
179
+ this.matterportService.getInteractionMode() === ViewerInteractions.DEFAULT) {
180
+ await this.matterportService.addMattertagWhenRepositioning(poiType, element);
181
+ }
182
+ }
183
+ /**
184
+ * Enable ticket placement menu to add a new ticket
185
+ */
186
+ action_canceled() {
187
+ // Matterport
188
+ if (this.checkMode('Matterport')) {
189
+ this.matterportService.cancelFollowingCursor();
190
+ }
191
+ }
192
+ action_toolbox_inside_view() {
193
+ // Matterport
194
+ if (this.checkMode('Matterport')) {
195
+ this.matterportService.action_toolbox_inside_view();
196
+ }
197
+ }
198
+ actionShowAllFloors() {
199
+ // Matterport
200
+ if (this.checkMode('Matterport')) {
201
+ this.matterportService.actionShowAllFloors();
202
+ }
203
+ }
204
+ action_toolbox_dollhouse() {
205
+ if (this.matterportService.getInteractionMode() !== ViewerInteractions.DEFAULT) {
206
+ this.action_canceled();
207
+ }
208
+ this.action_toolbox_cancel_mesure();
209
+ // Matterport
210
+ if (this.checkMode('Matterport')) {
211
+ this.matterportService.action_toolbox_dollhouse();
212
+ }
213
+ }
214
+ async action_floorplan() {
215
+ if (this.matterportService.getInteractionMode() !== ViewerInteractions.DEFAULT) {
216
+ this.action_canceled();
217
+ }
218
+ // Matterport
219
+ if (this.checkMode('Matterport')) {
220
+ await this.matterportService.action_toolbox_floorplan();
221
+ }
222
+ }
223
+ action_toolbox_mesure() {
224
+ if (this.matterportService.getInteractionMode() !== ViewerInteractions.DEFAULT) {
225
+ this.action_canceled();
226
+ }
227
+ this.action_toolbox_inside_view();
228
+ // Matterport
229
+ if (this.checkMode('Matterport')) {
230
+ this.matterportService.action_toolbox_mesure();
231
+ }
232
+ }
233
+ action_toolbox_cancel_mesure() {
234
+ // Matterport
235
+ if (this.checkMode('Matterport')) {
236
+ this.matterportService.action_toolbox_cancel_mesure();
237
+ }
238
+ }
239
+ async action_update_poi(poi, isValid, element) {
240
+ if (this.checkMode('Matterport')) {
241
+ if (isValid) {
242
+ const lastTag = this.matterportService.mattertagToFollow
243
+ ? this.matterportService.mattertagToFollow
244
+ : this.matterportService.getLastTag();
245
+ if (!lastTag) {
246
+ return Promise.resolve(poi);
247
+ }
248
+ const tagData = this.matterportService.getMatterTagDataForMattertag(lastTag);
249
+ if (!tagData) {
250
+ return Promise.resolve(poi);
251
+ }
252
+ const poiMetadata = (!!poi && poi.metadata) ? JSON.parse(poi.metadata) : {};
253
+ poiMetadata.normal = tagData.getNormal();
254
+ if (!poi) {
255
+ return Promise.resolve({});
256
+ }
257
+ const poiInput = {
258
+ id: poi.id,
259
+ coordinate: tagData.getCoordinateString(),
260
+ matterportSweepID: tagData.getSweepID(),
261
+ metadata: JSON.stringify(poiMetadata),
262
+ };
263
+ const updatedPoi = await this.poiService.updatePoi(poiInput);
264
+ tagData.setPoi(updatedPoi);
265
+ await this.matterportService.setObjectAndPoiInTag(lastTag, element, PoiType.DESK, updatedPoi);
266
+ await this.matterportService.injectHtmlInTag(poi.type, element, lastTag);
267
+ await this.matterportService.setTagIconAndOpacity(lastTag, tagData);
268
+ this.matterportService.goToTag(lastTag);
269
+ return Promise.resolve(updatedPoi);
270
+ }
271
+ this.matterportService.deleteLastMattertag();
272
+ return Promise.resolve(poi);
273
+ }
274
+ return Promise.resolve(poi);
275
+ }
276
+ editOnlyTagStyleForPoi(poi, object) {
277
+ if (this.checkMode('Matterport')) {
278
+ const tagData = this.matterportService.getTagFromElementId(poi.elementID);
279
+ if (tagData.tag) {
280
+ const mattertagData = this.matterportService.getMatterTagDataForMattertag(tagData.tag);
281
+ mattertagData.setObject(object, PoiType.ROOM);
282
+ this.matterportService.setTagIconAndOpacity(tagData.tag, mattertagData);
283
+ }
284
+ }
285
+ }
286
+ addIconAndSetForPoi(poi, iconPath) {
287
+ if (this.checkMode('Matterport')) {
288
+ const tagData = this.matterportService.getTagFromElementId(poi.elementID);
289
+ if (tagData.tag) {
290
+ this.matterportService.addNewIconAndSetForTag(tagData.tag, iconPath);
291
+ }
292
+ }
293
+ }
294
+ changeToRegistredIconForPoi(poi, iconName) {
295
+ if (this.checkMode('Matterport')) {
296
+ const tagData = this.matterportService.getTagFromElementId(poi.elementID);
297
+ if (tagData.tag) {
298
+ this.matterportService.setRegistredIconForTag(tagData.tag, iconName);
299
+ }
300
+ }
301
+ }
302
+ async updateHtmlTagForPoiWithObject(poi, object) {
303
+ if (this.checkMode('Matterport')) {
304
+ const tagData = this.matterportService.getTagFromElementId(poi.elementID);
305
+ if (tagData.tag) {
306
+ await this.matterportService.updateInjectedHtmlForTagID(tagData.tag, object, poi.type);
307
+ }
308
+ }
309
+ }
310
+ /**
311
+ * Move an existing poi in Matterport
312
+ * @param poi
313
+ * @param element
314
+ */
315
+ async action_move_poi_visually(poi, element) {
316
+ await this.action_delete_element(element);
317
+ await this.actionAddObjectFromPOI(element, poi);
318
+ }
319
+ /*-----------------------------------------------------------------------------------------------------------------
320
+ Cupix
321
+ -----------------------------------------------------------------------------------------------------------------*/
322
+ /*-----------------------------------------------------------------------------------------------------------------
323
+ Matterport
324
+ https://matterport.github.io/showcase-sdk/docs/sdk/reference/current/modules/mattertag.html#add
325
+ https://matterport.github.io/showcase-sdk/docs/sdk/reference/current/modules/mattertag.html#remove
326
+ -----------------------------------------------------------------------------------------------------------------*/
327
+ async initMatterportSdk(spaceID, model3D, tagService, module = SpModule.IMMO) {
328
+ this.isLoaded = false;
329
+ this.matterportService.currentSpaceID = spaceID;
330
+ if (this.matterportService.sdk) {
331
+ await this.clearAll();
332
+ }
333
+ return this.matterportService
334
+ .initSdk(tagService, module)
335
+ .then(async (result) => {
336
+ if (result) {
337
+ const { sdk } = this.matterportService;
338
+ // TODO: add condition whether we want to enable it or not
339
+ // Additionnal extensions for Matterport
340
+ // 1. Security Camera with Frustum (FOV)
341
+ // 2. TODO register all new Matterport extensions here (nestSensor, lods, slots, ...)
342
+ await Promise.all([
343
+ sdk.Scene.register(securityCameraType, makeSecurityCamera.bind(sdk.Scene)),
344
+ sdk.Scene.register(ViewFrustumMeshType, makeViewFrustumMesh.bind(sdk.Scene))
345
+ ]);
346
+ sdk.App.state.subscribe(function (appState) {
347
+ // app state has changed
348
+ // console.log('The current phase: ', appState.phase);
349
+ if (appState.phase === sdk.App.Phase.PLAYING) {
350
+ // console.log('The app is playing');
351
+ this.showingViewer = true;
352
+ this.viewerIsOn.next({
353
+ spaceID,
354
+ model3D,
355
+ sweep: this.sweepToMove,
356
+ rotation: this.rotationToMove,
357
+ });
358
+ this.dataIsLoaded.next(true);
359
+ this.isLoaded = true;
360
+ this.sweepToMove = null;
361
+ this.rotationToMove = null;
362
+ }
363
+ }.bind(this));
364
+ return Promise.resolve();
365
+ }
366
+ return Promise.reject();
367
+ });
368
+ }
369
+ removeForbiddenSweeps(forbiddenSweeps) {
370
+ if (this.checkMode('Matterport')) {
371
+ this.matterportService.removeForbiddenSweeps(forbiddenSweeps);
372
+ }
373
+ }
374
+ setObject3DLoadedInPosition(objectLoaded) {
375
+ this.isObjectLoaded = objectLoaded;
376
+ }
377
+ isObject3DLoadedInPosition() {
378
+ return this.isObjectLoaded;
379
+ }
380
+ }
381
+ ViewerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ViewerService, deps: [{ token: i1.PoiService }, { token: i2.MatterportService }], target: i0.ɵɵFactoryTarget.Injectable });
382
+ ViewerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ViewerService, providedIn: 'root' });
383
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ViewerService, decorators: [{
384
+ type: Injectable,
385
+ args: [{
386
+ providedIn: 'root',
387
+ }]
388
+ }], ctorParameters: function () { return [{ type: i1.PoiService }, { type: i2.MatterportService }]; } });
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHN0IsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixPQUFPLEVBS1AsUUFBUSxHQUNULE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFDLE1BQU0seURBQXlELENBQUM7QUFDL0csT0FBTyxFQUFDLG1CQUFtQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sNERBQTRELENBQUM7Ozs7QUFNcEgsTUFBTSxPQUFPLGFBQWE7SUFrRHhCLFlBQ1UsVUFBc0IsRUFDdEIsaUJBQW9DO1FBRHBDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQW5EdEMsZUFBVSxHQUFXLFlBQVksQ0FBQztRQU1uQyxlQUFVLEdBS1osSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVaLGlCQUFZLEdBQXFCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFL0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQU10QixrQkFBYSxHQUFHO1lBQ3JCLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUUsY0FBYztnQkFDdEIsSUFBSTtnQkFDSixDQUFDO2dCQUNELElBQUk7Z0JBQ0osQ0FBQzthQUNGO1lBQ0QsU0FBUyxFQUFFO2dCQUNULElB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LENBQUM7d0JBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO3FCQUM1QjtnQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNiLENBQUM7Z0JBQ0YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDMUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxlQUF5QjtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVELDJCQUEyQixDQUFDLFlBQXFCO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7OzBHQWxlVSxhQUFhOzhHQUFiLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cclxuLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xyXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge01hdHRlcnBvcnRTZXJ2aWNlfSBmcm9tICcuL21hdHRlcnBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7QmFzZVRhZ1NlcnZpY2V9IGZyb20gJy4vdGFnLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIERiT2JqZWN0VHlwZSxcclxuICBQT0ksXHJcbiAgVmlld2VySW50ZXJhY3Rpb25zLFxyXG4gIFBvaVR5cGUsXHJcbiAgQ29tbWVudCxcclxuICBFcXVpcG1lbnQsXHJcbiAgVGlja2V0LFxyXG4gIEZlYXR1cmUsXHJcbiAgU3BNb2R1bGUsXHJcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7UG9pU2VydmljZX0gZnJvbSAnLi9tb2RlbHMvcG9pLnNlcnZpY2UnO1xyXG5pbXBvcnQge21ha2VTZWN1cml0eUNhbWVyYSwgc2VjdXJpdHlDYW1lcmFUeXBlfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3NlY3VyaXR5LWNhbWVyYS9TZWN1cml0eUNhbWVyYVwiO1xyXG5pbXBvcnQge1ZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2h9IGZyb20gXCIuLi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoXCI7XHJcbmltcG9ydCB7IE5hdmlnYXRvclNlcnZpY2UgfSBmcm9tICcuL25hdmlnYXRvci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaWV3ZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIHZpZXdlck1vZGU6IHN0cmluZyA9ICdNYXR0ZXJwb3J0JztcclxuXHJcbiAgcHVibGljIGN1cnJlbnRNb2RlbDNEOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgdG91clVybDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgdmlld2VySXNPbjogU3ViamVjdDx7XHJcbiAgICBzcGFjZUlEOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbW9kZWwzRDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHN3ZWVwOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0gfCBudWxsO1xyXG4gIH0+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGRhdGFJc0xvYWRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgc2hvd2luZ1ZpZXdlciA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgc3dlZXBUb01vdmU6IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIHB1YmxpYyByb3RhdGlvblRvTW92ZTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB8IG51bGw7XHJcblxyXG4gIHB1YmxpYyB0b29sYm94U3RhdGVzID0ge1xyXG4gICAgZG9sbGhvdXNlOiB7XHJcbiAgICAgIHN0YXQ6IGZhbHNlLFxyXG4gICAgICBpY29uSWQ6ICd1aS1kb2xsaG91c2UnLFxyXG4gICAgICBzaG93KCkge1xyXG4gICAgICB9LFxyXG4gICAgICBoaWRlKCkge1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIGZsb29ycGxhbjoge1xyXG4gICAgICBzdGF0OiBmYWxzZSxcclxuICAgIH0sXHJcbiAgICBtZXN1cmU6IHtcclxuICAgICAgc3RhdDogZmFsc2UsXHJcbiAgICAgIGljb25JZDogJ3VpLW1lc3VyZScsXHJcbiAgICAgIHNob3coKSB7XHJcbiAgICAgIH0sXHJcbiAgICAgIGhpZGUoKSB7XHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgZmlsdGVyOiB7XHJcbiAgICAgIHN0YXQ6IGZhbHNlLFxyXG4gICAgfSxcclxuICB9O1xyXG4gIHByaXZhdGUgaXNPYmplY3RMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHBvaVNlcnZpY2U6IFBvaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1hdHRlcnBvcnRTZXJ2aWNlOiBNYXR0ZXJwb3J0U2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuc2V0TW9kZSgnTWF0dGVycG9ydCcpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgIFV0aWxzXHJcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG4gIGNoZWNrTW9kZShpbmRleE1vZGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld2VyTW9kZSA9PT0gaW5kZXhNb2RlO1xyXG4gIH1cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgU2V0dGVyc1xyXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuICBzZXRNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnZpZXdlck1vZGUgPSBpbmRleE1vZGU7XHJcbiAgfVxyXG5cclxuICBzZXRUb3VyVXJsKFxyXG4gICAgbW9kZWwzZDogc3RyaW5nLFxyXG4gICAgc2hvd0ljb25QbGFuOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIHNob3dJY29uRG9sbGhvdXNlOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIHNob3dJY29uRmxvb3JzOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIGVuYWJsZVF1aWNrU3RhcnQ6IGJvb2xlYW4gPSB0cnVlXHJcbiAgKSB7XHJcbiAgICAvLyB0aGlzLnRvdXJVcmwgPSBgaHR0cHM6Ly9teS5tYXR0ZXJwb3J0LmNvbS9zaG93Lz9tPSR7bW9kZWwzZH0mcGxheT0xJmhyPTAmZ3Q9MCZ0aXRsZT0wJmxvZz0wJmJyYW5kPTAmc2VhcmNoPTAmYXBwbGljYXRpb25LZXk9cW45d3Nhc3V5NWgyZnpyYnJuMW56cjBpZCZtZHM9MCZuZXd0YWdzPTFgO1xyXG4gICAgdGhpcy50b3VyVXJsID0gYC9hc3NldHMvYnVuZGxlL3Nob3djYXNlLmh0bWw/bT0ke21vZGVsM2R9JnBsYXk9MSZocj0wJmd0PTAmdGl0bGU9MCZsb2c9MCZicmFuZD0wJnNlYXJjaD0wJmFwcGxpY2F0aW9uS2V5PXFuOXdzYXN1eTVoMmZ6cmJybjFuenIwaWQmbWRzPTAmbmV3dGFncz0xYDtcclxuXHJcbiAgICBpZiAoIXNob3dJY29uUGxhbikge1xyXG4gICAgICB0aGlzLnRvdXJVcmwgKz0gJyZmcD0wJztcclxuICAgIH1cclxuICAgIGlmICghc2hvd0ljb25Eb2xsaG91c2UpIHtcclxuICAgICAgdGhpcy50b3VyVXJsICs9ICcmZGg9MCc7XHJcbiAgICB9XHJcbiAgICBpZiAoIXNob3dJY29uRmxvb3JzKSB7XHJcbiAgICAgIHRoaXMudG91clVybCArPSAnJmY9MCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZW5hYmxlUXVpY2tTdGFydCkge1xyXG4gICAgICB0aGlzLnRvdXJVcmwgKz0gJyZxcz0xJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNsZWFyQWxsKCkge1xyXG4gICAgLy8gdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XHJcbiAgICAvLyB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMuc2hvd2luZ1ZpZXdlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY2xlYXJBbGwoKTtcclxuICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xyXG4gICAgICAgIHNwYWNlSUQ6IG51bGwsXHJcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcclxuICAgICAgICBzd2VlcDogbnVsbCxcclxuICAgICAgICByb3RhdGlvbjogbnVsbCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICBHZXR0ZXJzXHJcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG4gIGdldE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld2VyU2VsZWN0ZWRTZXJ2aWNlKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgLy8gaWYgKHRoaXMuY2hlY2tNb2RlKFwiTWF0dGVycG9ydFwiKSkge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XHJcbiAgICAvLyB9XHJcbiAgICByZXR1cm4gdGhpcy5nZXRNYXR0ZXJwb3J0U2VydmljZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG91clVybCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRvdXJVcmw7XHJcbiAgfVxyXG5cclxuICBnZXRNYXR0ZXJwb3J0U2VydmljZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgR2VuZXJpYyBNYWluIGFjdGlvbiBmdW5jdGlvbnNcclxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBzZXRTd2VlcFRvTW92ZShzd2VlcDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gc3dlZXA7XHJcbiAgfVxyXG5cclxuICBzZXRSb3RhdGlvblRvTW92ZShyb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSkge1xyXG4gICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IHJvdGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX21vdmVfdG9fdGFnKGVsZW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElkKTtcclxuICAgICAgaWYgKHJlc3VsdC50YWcpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdvVG9UYWcocmVzdWx0LnRhZyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdC5zd2VlcCkge1xyXG4gICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSByZXN1bHQuc3dlZXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBNYXR0ZXJ0YWdzIHRvIFZpZXdlclxyXG4gICAqIEBwYXJhbSBvYmplY3RzIExpc3Qgb2Ygb2JqZWN0cyAodGlja2V0cywgZXF1aXBtZW50cykgZXRjIHRvIGJlIGFkZGVkIGFzIE1hdHRlcnRhZ3NcclxuICAgKi9cclxuICBhc3luYyBhZGRPYmplY3RUYWdzVG9WaWV3ZXIob2JqZWN0czogRGJPYmplY3RUeXBlW10pIHtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBvYmplY3RzLm1hcChhc3luYyAob2JqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmdldFBvaUJ5RWxlbWVudElkKG9iamVjdC5pZCEpO1xyXG4gICAgICAgIGlmIChwb2kgJiYgcG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShvYmplY3QsIHBvaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbkFkZE9iamVjdEZyb21QT0kob2JqZWN0OiBEYk9iamVjdFR5cGUsIHBvaTogUE9JKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgICAgIHBvaS50eXBlISxcclxuICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgcG9pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvLyBDdXBpeFxyXG4gICAgLy8gVE9ET1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9lbGVtZW50KGVsZW1lbnQ6IERiT2JqZWN0VHlwZSkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGb3JPYmplY3QoZWxlbWVudC5pZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGUgdGFnIHBsYWNlbWVudCBtZW51IHRvIGFkZCBhIG5ldyBlbGVtZW50IGRlcGVuZGluZyBvbiBpdHMgdHlwZSAoVElDS0VULCBEQVRBLCBFUVVJUE1FTlQgZXRjKVxyXG4gICAqL1xyXG4gIGFzeW5jIGFjdGlvbkFkZE5ld0VsZW1lbnRUb1ZpZXdlcihwb2lUeXBlOiBQb2lUeXBlKSB7XHJcbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XHJcblxyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpICYmXHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXHJcbiAgICApIHtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hZGRNYXR0ZXJ0YWdXaGVuQWRkaW5nKHBvaVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGF1bmNoZXMgdGhlIHJlcG9zaXRpb25pbmcgb2YgYW4gZXhpc3RpbmcgTWF0dGVydGFnIHJlbGF0ZWQgdG8gcGFyYW1ldGVyIG9iamVjdFxyXG4gICAqIEBwYXJhbSBlbGVtZW50IG9iamVjdCAoVElDS0VULCBFUVVJUE1FTlQsIEZFQVRVUkUsIGV0YylcclxuICAgKiBAcGFyYW0gcG9pVHlwZSB0eXBlIG9mIG9iamVjdFxyXG4gICAqL1xyXG4gIGFzeW5jIGFjdGlvblJlcG9zaXRpb25FbGVtZW50SW5WaWV3ZXIoXHJcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGUsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlIHRpY2tldCBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgdGlja2V0XHJcbiAgICovXHJcbiAgYWN0aW9uX2NhbmNlbGVkKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jYW5jZWxGb2xsb3dpbmdDdXJzb3IoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uX2NhbmNlbGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2Zsb29ycGxhbigpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xyXG4gICAgfVxyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9mbG9vcnBsYW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X21lc3VyZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fdXBkYXRlX3BvaShcclxuICAgIHBvaTogUE9JLFxyXG4gICAgaXNWYWxpZDogYm9vbGVhbixcclxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZVxyXG4gICk6IFByb21pc2U8UE9JPiB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93XHJcbiAgICAgICAgICA/IHRoaXMubWF0dGVycG9ydFNlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3dcclxuICAgICAgICAgIDogdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRMYXN0VGFnKCk7XHJcbiAgICAgICAgaWYgKCFsYXN0VGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcobGFzdFRhZyk7XHJcbiAgICAgICAgaWYgKCF0YWdEYXRhKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwb2lNZXRhZGF0YSA9ICghIXBvaSAmJiBwb2kubWV0YWRhdGEpID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge307XHJcbiAgICAgICAgcG9pTWV0YWRhdGEubm9ybWFsID0gdGFnRGF0YS5nZXROb3JtYWwoKTtcclxuICAgICAgICBpZiAoIXBvaSkge1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBvaUlucHV0ID0ge1xyXG4gICAgICAgICAgaWQ6IHBvaS5pZCxcclxuICAgICAgICAgIGNvb3JkaW5hdGU6IHRhZ0RhdGEuZ2V0Q29vcmRpbmF0ZVN0cmluZygpLFxyXG4gICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxyXG4gICAgICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHBvaU1ldGFkYXRhKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQb2k6IFBPSSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2kocG9pSW5wdXQpO1xyXG4gICAgICAgIHRhZ0RhdGEuc2V0UG9pKHVwZGF0ZWRQb2kpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0T2JqZWN0QW5kUG9pSW5UYWcobGFzdFRhZywgZWxlbWVudCwgUG9pVHlwZS5ERVNLLCB1cGRhdGVkUG9pKTtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmluamVjdEh0bWxJblRhZyhcclxuICAgICAgICAgIHBvaS50eXBlISxcclxuICAgICAgICAgIGVsZW1lbnQsXHJcbiAgICAgICAgICBsYXN0VGFnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFRhZ0ljb25BbmRPcGFjaXR5KGxhc3RUYWcsIHRhZ0RhdGEpO1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ29Ub1RhZyhsYXN0VGFnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cGRhdGVkUG9pKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xyXG4gIH1cclxuXHJcbiAgZWRpdE9ubHlUYWdTdHlsZUZvclBvaShwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XHJcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xyXG4gICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcoXHJcbiAgICAgICAgICB0YWdEYXRhLnRhZ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBQb2lUeXBlLlJPT00pO1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkodGFnRGF0YS50YWcsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRJY29uQW5kU2V0Rm9yUG9pKHBvaTogUE9JLCBpY29uUGF0aDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcodGFnRGF0YS50YWcsIGljb25QYXRoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVG9SZWdpc3RyZWRJY29uRm9yUG9pKHBvaTogUE9JLCBpY29uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFJlZ2lzdHJlZEljb25Gb3JUYWcodGFnRGF0YS50YWcsIGljb25OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlSHRtbFRhZ0ZvclBvaVdpdGhPYmplY3QocG9pOiBQT0ksIG9iamVjdDogRGJPYmplY3RUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnVwZGF0ZUluamVjdGVkSHRtbEZvclRhZ0lEKFxyXG4gICAgICAgICAgdGFnRGF0YS50YWcsXHJcbiAgICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgICBwb2kudHlwZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgYW4gZXhpc3RpbmcgcG9pIGluIE1hdHRlcnBvcnRcclxuICAgKiBAcGFyYW0gcG9pXHJcbiAgICogQHBhcmFtIGVsZW1lbnRcclxuICAgKi9cclxuICBhc3luYyBhY3Rpb25fbW92ZV9wb2lfdmlzdWFsbHkoXHJcbiAgICBwb2k6IFBPSSxcclxuICAgIGVsZW1lbnQ6IFRpY2tldCB8IEZlYXR1cmUgfCBFcXVpcG1lbnQgfCBDb21tZW50XHJcbiAgKSB7XHJcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50KTtcclxuICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShlbGVtZW50LCBwb2kpO1xyXG4gIH1cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgQ3VwaXhcclxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgTWF0dGVycG9ydFxyXG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNhZGRcclxuICAgIGh0dHBzOi8vbWF0dGVycG9ydC5naXRodWIuaW8vc2hvd2Nhc2Utc2RrL2RvY3Mvc2RrL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMvbWF0dGVydGFnLmh0bWwjcmVtb3ZlXHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgYXN5bmMgaW5pdE1hdHRlcnBvcnRTZGsoXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBtb2RlbDNEOiBzdHJpbmcsXHJcbiAgICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSxcclxuICAgIG1vZHVsZTogU3BNb2R1bGUgPSBTcE1vZHVsZS5JTU1PXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEID0gc3BhY2VJRDtcclxuICAgIGlmICh0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNkaykge1xyXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyQWxsKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZVxyXG4gICAgICAuaW5pdFNkayh0YWdTZXJ2aWNlLCBtb2R1bGUpXHJcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICBjb25zdCB7c2RrfSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XHJcblxyXG4gICAgICAgICAgLy8gVE9ETzogYWRkIGNvbmRpdGlvbiB3aGV0aGVyIHdlIHdhbnQgdG8gZW5hYmxlIGl0IG9yIG5vdFxyXG4gICAgICAgICAgLy8gQWRkaXRpb25uYWwgZXh0ZW5zaW9ucyBmb3IgTWF0dGVycG9ydFxyXG4gICAgICAgICAgLy8gMS4gU2VjdXJpdHkgQ2FtZXJhIHdpdGggRnJ1c3R1bSAoRk9WKVxyXG4gICAgICAgICAgLy8gMi4gVE9ETyByZWdpc3RlciBhbGwgbmV3IE1hdHRlcnBvcnQgZXh0ZW5zaW9ucyBoZXJlIChuZXN0U2Vuc29yLCBsb2RzLCBzbG90cywgLi4uKVxyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICBzZGsuU2NlbmUucmVnaXN0ZXIoc2VjdXJpdHlDYW1lcmFUeXBlLCBtYWtlU2VjdXJpdHlDYW1lcmEuYmluZChzZGsuU2NlbmUpKSxcclxuICAgICAgICAgICAgc2RrLlNjZW5lLnJlZ2lzdGVyKFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2guYmluZChzZGsuU2NlbmUpKVxyXG4gICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChhcHBTdGF0ZSkge1xyXG4gICAgICAgICAgICAgIC8vIGFwcCBzdGF0ZSBoYXMgY2hhbmdlZFxyXG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgY3VycmVudCBwaGFzZTogJywgYXBwU3RhdGUucGhhc2UpO1xyXG4gICAgICAgICAgICAgIGlmIChhcHBTdGF0ZS5waGFzZSA9PT0gc2RrLkFwcC5QaGFzZS5QTEFZSU5HKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnVGhlIGFwcCBpcyBwbGF5aW5nJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xyXG4gICAgICAgICAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgICBtb2RlbDNELFxyXG4gICAgICAgICAgICAgICAgICBzd2VlcDogdGhpcy5zd2VlcFRvTW92ZSxcclxuICAgICAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25Ub01vdmUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUlzTG9hZGVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZvcmJpZGRlblN3ZWVwcyhmb3JiaWRkZW5Td2VlcHM6IHN0cmluZ1tdKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnJlbW92ZUZvcmJpZGRlblN3ZWVwcyhmb3JiaWRkZW5Td2VlcHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0T2JqZWN0M0RMb2FkZWRJblBvc2l0aW9uKG9iamVjdExvYWRlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pc09iamVjdExvYWRlZCA9IG9iamVjdExvYWRlZDtcclxuICB9XHJcblxyXG4gIGlzT2JqZWN0M0RMb2FkZWRJblBvc2l0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3RMb2FkZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==