@smarterplan/ngx-smarterplan-core 1.2.39 → 1.2.45

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 -364
  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 -310
  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 +13009 -12992
  85. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  86. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12258 -12241
  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 -74
  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 -840
  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 +1 -1
  169. package/public-api.d.ts +64 -64
  170. package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
@@ -1,221 +1,221 @@
1
- import { Object3D, Mesh, PerspectiveCamera, ShaderMaterial, MeshBasicMaterial, BoxGeometry, EdgesGeometry, Color, Matrix4, Vector3, Euler, CylinderBufferGeometry, BackSide, NormalBlending, AdditiveBlending, } from 'three';
2
- import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
3
- import { SceneComponent } from '../scene-component/SceneComponent';
4
- /**
5
- * This class is the extracted View Frustum Mesh from
6
- * SecurityCamera example
7
- */
8
- export class ViewFrustumMesh extends SceneComponent {
9
- constructor() {
10
- super(...arguments);
11
- this.root = null;
12
- this.pivot = null;
13
- this.box = null;
14
- this.edges = null;
15
- this.inputs = {
16
- "nearPlane": 0.1,
17
- "farPlane": 10,
18
- "horizontalFOV": 52,
19
- "aspect": 1.7777777777777777,
20
- "localPosition": {
21
- "x": 0,
22
- "y": 0.18,
23
- "z": -0.3
24
- },
25
- "localRotation": {
26
- "x": -15,
27
- "y": 0,
28
- "z": 0
29
- },
30
- "color": 65280,
31
- "panPeriod": 5,
32
- "panAngle": -45
33
- };
34
- this.highlight = null;
35
- this.highlightUniforms = {
36
- color: { value: new Color() },
37
- projPosition: { value: new Vector3() },
38
- lightMatrix: { value: new Matrix4() },
39
- };
40
- this.outputs = {};
41
- }
42
- onInit() {
43
- this.root = new Object3D();
44
- this.pivot = new Object3D();
45
- this.root.add(this.pivot);
46
- this.outputs.objectRoot = this.root;
47
- const euler = new Euler(this.inputs.localRotation.x * Math.PI / 180, this.inputs.localRotation.y * Math.PI / 180, this.inputs.localRotation.z * Math.PI / 180, 'YXZ');
48
- this.pivot.quaternion.setFromEuler(euler);
49
- this.makeFrustumVisuals();
50
- this.pivot.add(this.box);
51
- this.pivot.add(this.edges);
52
- const aspect = this.inputs.aspect;
53
- const DEG2RAD = Math.PI / 180;
54
- const RAD2DEG = 1 / DEG2RAD;
55
- const verticalFOV = 2 * Math.atan(1 / aspect * Math.tan(0.5 * this.inputs.horizontalFOV * DEG2RAD)) * RAD2DEG;
56
- this.projector = new PerspectiveCamera(verticalFOV, aspect, this.inputs.nearPlane, this.inputs.farPlane);
57
- this.pivot.add(this.projector);
58
- this.makeHighlight();
59
- this.context.scene.add(this.highlight);
60
- }
61
- onTickModified(delta, quaternion) {
62
- this.pivot.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
63
- updateHighlightUniforms(this.projector, this.highlightUniforms);
64
- }
65
- makeFrustumVisuals() {
66
- if (this.box) {
67
- this.root.remove(this.box);
68
- this.box.material.dispose();
69
- this.box.geometry.dispose();
70
- this.box = null;
71
- }
72
- if (this.edges) {
73
- this.root.remove(this.edges);
74
- this.edges.material.dispose();
75
- this.edges.geometry.dispose();
76
- this.edges = null;
77
- }
78
- function edgesToCylinders(edgesGeometry, thickness) {
79
- const { position } = edgesGeometry.attributes;
80
- const { array, count } = position;
81
- const r = thickness / 2;
82
- const geoms = [];
83
- for (let i = 0; i < count * 3 - 1; i += 6) {
84
- const a = new Vector3(array[i], array[i + 1], array[i + 2]);
85
- const b = new Vector3(array[i + 3], array[i + 4], array[i + 5]);
86
- const vec = new Vector3().subVectors(b, a);
87
- const len = vec.length();
88
- const geom = new CylinderBufferGeometry(r, r, len, 8);
89
- geom.translate(0, len / 2, 0);
90
- geom.rotateX(Math.PI / 2);
91
- geom.lookAt(vec);
92
- geom.translate(a.x, a.y, a.z);
93
- geoms.push(geom);
94
- }
95
- // API to be updated in bundle - JSSDK-1222
96
- return BufferGeometryUtils.mergeBufferGeometries(geoms);
97
- }
98
- const frustumLength = this.inputs.farPlane - this.inputs.nearPlane;
99
- const boxGeometry = new BoxGeometry(2, 2, frustumLength);
100
- const halfHAngle = this.inputs.horizontalFOV * 0.5 * Math.PI / 180;
101
- const nearHalfWidth = Math.tan(halfHAngle) * this.inputs.nearPlane;
102
- const farHalfWidth = Math.tan(halfHAngle) * this.inputs.farPlane;
103
- const nearHalfHeight = nearHalfWidth / this.inputs.aspect;
104
- const farHalfHeight = farHalfWidth / this.inputs.aspect;
105
- const positions = boxGeometry.getAttribute('position');
106
- for (let i = 0; i < positions.count; i++) {
107
- const vertexZ = positions.getZ(i);
108
- const vertexX = positions.getX(i);
109
- const vertexY = positions.getY(i);
110
- if (vertexZ > 0) {
111
- // back of the camera
112
- positions.setX(i, vertexX * nearHalfWidth);
113
- positions.setY(i, vertexY * nearHalfHeight);
114
- }
115
- else {
116
- // front of the camera
117
- positions.setX(i, vertexX * farHalfWidth);
118
- positions.setY(i, vertexY * farHalfHeight);
119
- }
120
- positions.setZ(i, vertexZ - 0.5 * frustumLength - this.inputs.nearPlane);
121
- }
122
- const boxMaterial = new MeshBasicMaterial({
123
- color: this.inputs.color,
124
- opacity: 0.35,
125
- transparent: true,
126
- side: BackSide,
127
- blending: NormalBlending,
128
- depthWrite: false,
129
- });
130
- this.box = new Mesh(boxGeometry, boxMaterial);
131
- const edgesGeometry = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.015);
132
- this.edges = new Mesh(edgesGeometry, new MeshBasicMaterial({
133
- color: 0xffffff,
134
- opacity: 0.25,
135
- transparent: true,
136
- blending: AdditiveBlending,
137
- depthWrite: false,
138
- }));
139
- const edgesGeometry2 = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.06);
140
- const edges2 = new Mesh(edgesGeometry2, new MeshBasicMaterial({
141
- color: this.inputs.color,
142
- opacity: 0.35,
143
- transparent: true,
144
- blending: AdditiveBlending,
145
- depthWrite: false,
146
- }));
147
- this.pivot.add(edges2);
148
- }
149
- makeHighlight() {
150
- let floorMesh = null;
151
- floorMesh = this.context.scene.getObjectByName('FloorMesh:0');
152
- const roomMesh = floorMesh.children[5];
153
- updateHighlightUniforms(this.projector, this.highlightUniforms);
154
- this.highlightUniforms.color.value.setHex(this.inputs.color);
155
- const shader = new ShaderMaterial({
156
- polygonOffset: true,
157
- polygonOffsetUnits: -0.1,
158
- transparent: true,
159
- uniforms: this.highlightUniforms,
160
- vertexShader: vertexShader(),
161
- fragmentShader: fragmentShader(),
162
- });
163
- // a mesh to represent the "highlight"
164
- this.highlight = new Mesh(roomMesh.geometry, shader);
165
- }
166
- onDestroy() {
167
- if (this.highlight && this.highlight.parent) {
168
- this.highlight.parent.remove(this.highlight);
169
- this.highlight.material.dispose();
170
- }
171
- if (this.edges) {
172
- this.edges.geometry.dispose();
173
- this.edges.material.dispose();
174
- }
175
- if (this.box) {
176
- this.box.geometry.dispose();
177
- this.box.material.dispose();
178
- }
179
- }
180
- }
181
- function vertexShader() {
182
- return `
183
- uniform mat4 lightMatrix;
184
-
185
- varying vec4 vLightCoords;
186
-
187
- void main() {
188
- // create a UV region [0,1] x [0,1] to represent what the lightMatrix "sees"
189
- vLightCoords = lightMatrix * modelMatrix * vec4(position, 1.0);
190
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
191
- }
192
- `;
193
- }
194
- function fragmentShader() {
195
- return `
196
- uniform vec3 color;
197
-
198
- varying vec4 vLightCoords;
199
-
200
- void main() {
201
- vec2 lightUV = vLightCoords.xy / vLightCoords.w;
202
- float inView = float(max(lightUV.x, lightUV.y) <= 1.0 && min(lightUV.x, lightUV.y) >= 0.0 && vLightCoords.z > 0.0);
203
-
204
- gl_FragColor = vec4(color, min(inView, 0.2));
205
- }
206
- `;
207
- }
208
- function updateHighlightUniforms(projector, uniforms) {
209
- projector.getWorldPosition(uniforms.projPosition.value);
210
- // similar to a shadow matrix, but we're using it as a "rectangular" spotlight
211
- // [lightBias] * [projection] * [viewMatrix]
212
- uniforms.lightMatrix.value.makeScale(0.5, 0.5, 0.5);
213
- uniforms.lightMatrix.value.setPosition(new Vector3(0.5, 0.5, 0.5));
214
- uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.projectionMatrix);
215
- uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.matrixWorldInverse);
216
- }
217
- export const ViewFrustumMeshType = 'mp.ViewFrustumMesh';
218
- export const makeViewFrustumMesh = function () {
219
- return new ViewFrustumMesh();
220
- };
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld0ZydXN0dW1NZXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsRUFFWCxhQUFhLEVBQ2IsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBQ1IsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxpREFBaUQsQ0FBQTtBQUN0RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFvQmpFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGNBQWM7SUFBbkQ7O1FBRVUsU0FBSSxHQUFvQixJQUFJLENBQUM7UUFDN0IsVUFBSyxHQUFvQixJQUFJLENBQUM7UUFDOUIsUUFBRyxHQUFnQixJQUFJLENBQUM7UUFDeEIsVUFBSyxHQUFnQixJQUFJLENBQUM7UUFJekIsV0FBTSxHQUFXO1lBQ3hCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZUFBZSxFQUFFLEVBQUU7WUFDbkIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixlQUFlLEVBQUU7Z0JBQ2YsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLENBQUMsR0FBRzthQUNWO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04s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QUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIE9iamVjdDNELFxyXG4gIE1lc2gsXHJcbiAgUGVyc3BlY3RpdmVDYW1lcmEsXHJcbiAgU2hhZGVyTWF0ZXJpYWwsXHJcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXHJcbiAgQm94R2VvbWV0cnksXHJcbiAgTGluZUJhc2ljTWF0ZXJpYWwsXHJcbiAgRWRnZXNHZW9tZXRyeSxcclxuICBDb2xvcixcclxuICBNYXRyaXg0LFxyXG4gIFZlY3RvcjMsXHJcbiAgRXVsZXIsXHJcbiAgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSxcclxuICBCYWNrU2lkZSxcclxuICBOb3JtYWxCbGVuZGluZyxcclxuICBBZGRpdGl2ZUJsZW5kaW5nLFxyXG59IGZyb20gJ3RocmVlJztcclxuaW1wb3J0ICogYXMgQnVmZmVyR2VvbWV0cnlVdGlscyBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vdXRpbHMvQnVmZmVyR2VvbWV0cnlVdGlscy5qcydcclxuaW1wb3J0IHtTY2VuZUNvbXBvbmVudH0gZnJvbSAnLi4vc2NlbmUtY29tcG9uZW50L1NjZW5lQ29tcG9uZW50JztcclxuXHJcbmludGVyZmFjZSBJbnB1dHMge1xyXG4gIG5lYXJQbGFuZTogbnVtYmVyO1xyXG4gIGZhclBsYW5lOiBudW1iZXIsXHJcbiAgaG9yaXpvbnRhbEZPVjogbnVtYmVyLFxyXG4gIGFzcGVjdDogbnVtYmVyLFxyXG4gIGxvY2FsUG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcjsgfTtcclxuICBsb2NhbFJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH07XHJcbiAgY29sb3I6IG51bWJlcjtcclxuICBwYW5QZXJpb2Q6IG51bWJlcjtcclxuICBwYW5BbmdsZTogbnVtYmVyO1xyXG59XHJcblxyXG50eXBlIEhpZ2hsaWdodFVuaWZvcm1zID0ge1xyXG4gIGNvbG9yOiB7IHZhbHVlOiBDb2xvciB9LFxyXG4gIHByb2pQb3NpdGlvbjogeyB2YWx1ZTogVmVjdG9yMyB9O1xyXG4gIGxpZ2h0TWF0cml4OiB7IHZhbHVlOiBNYXRyaXg0IH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIHRoZSBleHRyYWN0ZWQgVmlldyBGcnVzdHVtIE1lc2ggZnJvbVxyXG4gKiBTZWN1cml0eUNhbWVyYSBleGFtcGxlXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVmlld0ZydXN0dW1NZXNoIGV4dGVuZHMgU2NlbmVDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJvb3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwaXZvdDogT2JqZWN0M0QgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGJveDogTWVzaCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZWRnZXM6IE1lc2ggfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBvdmVycmlkZSBpbnB1dHM6IElucHV0cyA9IHtcclxuICAgIFwibmVhclBsYW5lXCI6IDAuMSxcclxuICAgIFwiZmFyUGxhbmVcIjogMTAsXHJcbiAgICBcImhvcml6b250YWxGT1ZcIjogNTIsXHJcbiAgICBcImFzcGVjdFwiOiAxLjc3Nzc3Nzc3Nzc3Nzc3NzcsXHJcbiAgICBcImxvY2FsUG9zaXRpb25cIjoge1xyXG4gICAgICBcInhcIjogMCxcclxuICAgICAgXCJ5XCI6IDAuMTgsXHJcbiAgICAgIFwielwiOiAtMC4zXHJcbiAgICB9LFxyXG4gICAgXCJsb2NhbFJvdGF0aW9uXCI6IHtcclxuICAgICAgXCJ4XCI6IC0xNSxcclxuICAgICAgXCJ5XCI6IDAsXHJcbiAgICAgIFwielwiOiAwXHJcbiAgICB9LFxyXG4gICAgXCJjb2xvclwiOiA2NTI4MCxcclxuICAgIFwicGFuUGVyaW9kXCI6IDUsXHJcbiAgICBcInBhbkFuZ2xlXCI6IC00NVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgaGlnaGxpZ2h0OiBNZXNoIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaGlnaGxpZ2h0VW5pZm9ybXM6IEhpZ2hsaWdodFVuaWZvcm1zID0ge1xyXG4gICAgY29sb3I6IHt2YWx1ZTogbmV3IENvbG9yKCl9LFxyXG4gICAgcHJvalBvc2l0aW9uOiB7dmFsdWU6IG5ldyBWZWN0b3IzKCl9LFxyXG4gICAgbGlnaHRNYXRyaXg6IHt2YWx1ZTogbmV3IE1hdHJpeDQoKX0sXHJcbiAgfVxyXG4gIG92ZXJyaWRlIG91dHB1dHM6IGFueSA9IHt9O1xyXG5cclxuICBvdmVycmlkZSBvbkluaXQoKSB7XHJcblxyXG4gICAgdGhpcy5yb290ID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnBpdm90ID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnJvb3QuYWRkKHRoaXMucGl2b3QpO1xyXG4gICAgdGhpcy5vdXRwdXRzLm9iamVjdFJvb3QgPSB0aGlzLnJvb3Q7XHJcblxyXG4gICAgY29uc3QgZXVsZXIgPSBuZXcgRXVsZXIodGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi54ICogTWF0aC5QSSAvIDE4MCwgdGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi55ICogTWF0aC5QSSAvIDE4MCwgdGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi56ICogTWF0aC5QSSAvIDE4MCwgJ1lYWicpO1xyXG4gICAgdGhpcy5waXZvdC5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihldWxlcik7XHJcblxyXG4gICAgdGhpcy5tYWtlRnJ1c3R1bVZpc3VhbHMoKTtcclxuXHJcbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmJveCk7XHJcbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmVkZ2VzKTtcclxuXHJcbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLmlucHV0cy5hc3BlY3Q7XHJcbiAgICBjb25zdCBERUcyUkFEID0gTWF0aC5QSSAvIDE4MDtcclxuICAgIGNvbnN0IFJBRDJERUcgPSAxIC8gREVHMlJBRDtcclxuICAgIGNvbnN0IHZlcnRpY2FsRk9WID0gMiAqIE1hdGguYXRhbigxIC8gYXNwZWN0ICogTWF0aC50YW4oMC41ICogdGhpcy5pbnB1dHMuaG9yaXpvbnRhbEZPViAqIERFRzJSQUQpKSAqIFJBRDJERUc7XHJcbiAgICB0aGlzLnByb2plY3RvciA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh2ZXJ0aWNhbEZPViwgYXNwZWN0LCB0aGlzLmlucHV0cy5uZWFyUGxhbmUsIHRoaXMuaW5wdXRzLmZhclBsYW5lKTtcclxuICAgIHRoaXMucGl2b3QuYWRkKHRoaXMucHJvamVjdG9yKTtcclxuXHJcbiAgICB0aGlzLm1ha2VIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuY29udGV4dC5zY2VuZS5hZGQodGhpcy5oaWdobGlnaHQpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBvblRpY2tNb2RpZmllZChkZWx0YTogbnVtYmVyLCBxdWF0ZXJuaW9uOiBhbnkpIHtcclxuICAgIHRoaXMucGl2b3QucXVhdGVybmlvbi5zZXQocXVhdGVybmlvbi54LHF1YXRlcm5pb24ueSxxdWF0ZXJuaW9uLnoscXVhdGVybmlvbi53KTtcclxuICAgIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHRoaXMucHJvamVjdG9yLCB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFrZUZydXN0dW1WaXN1YWxzKCkge1xyXG4gICAgaWYgKHRoaXMuYm94KSB7XHJcbiAgICAgIHRoaXMucm9vdC5yZW1vdmUodGhpcy5ib3gpO1xyXG4gICAgICAodGhpcy5ib3gubWF0ZXJpYWwgYXMgTWVzaEJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcclxuICAgICAgKHRoaXMuYm94Lmdlb21ldHJ5IGFzIEJveEdlb21ldHJ5KS5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuYm94ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XHJcbiAgICAgIHRoaXMucm9vdC5yZW1vdmUodGhpcy5lZGdlcyk7XHJcbiAgICAgICh0aGlzLmVkZ2VzLm1hdGVyaWFsIGFzIExpbmVCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XHJcbiAgICAgICh0aGlzLmVkZ2VzLmdlb21ldHJ5IGFzIEVkZ2VzR2VvbWV0cnkpLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5lZGdlcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZWRnZXNUb0N5bGluZGVycyhlZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LCB0aGlja25lc3M6IG51bWJlcikge1xyXG4gICAgICBjb25zdCB7cG9zaXRpb259ID0gZWRnZXNHZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG4gICAgICBjb25zdCB7YXJyYXksIGNvdW50fSA9IHBvc2l0aW9uO1xyXG4gICAgICBjb25zdCByID0gdGhpY2tuZXNzIC8gMjtcclxuICAgICAgY29uc3QgZ2VvbXMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudCAqIDMgLSAxOyBpICs9IDYpIHtcclxuICAgICAgICBjb25zdCBhID0gbmV3IFZlY3RvcjMoYXJyYXlbaV0sIGFycmF5W2kgKyAxXSwgYXJyYXlbaSArIDJdKTtcclxuICAgICAgICBjb25zdCBiID0gbmV3IFZlY3RvcjMoYXJyYXlbaSArIDNdLCBhcnJheVtpICsgNF0sIGFycmF5W2kgKyA1XSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZlYyA9IG5ldyBWZWN0b3IzKCkuc3ViVmVjdG9ycyhiLCBhKTtcclxuICAgICAgICBjb25zdCBsZW4gPSB2ZWMubGVuZ3RoKCk7XHJcbiAgICAgICAgY29uc3QgZ2VvbSA9IG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KHIsIHIsIGxlbiwgOCk7XHJcbiAgICAgICAgZ2VvbS50cmFuc2xhdGUoMCwgbGVuIC8gMiwgMCk7XHJcbiAgICAgICAgZ2VvbS5yb3RhdGVYKE1hdGguUEkgLyAyKTtcclxuICAgICAgICBnZW9tLmxvb2tBdCh2ZWMpO1xyXG4gICAgICAgIGdlb20udHJhbnNsYXRlKGEueCwgYS55LCBhLnopO1xyXG4gICAgICAgIGdlb21zLnB1c2goZ2VvbSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQVBJIHRvIGJlIHVwZGF0ZWQgaW4gYnVuZGxlIC0gSlNTREstMTIyMlxyXG4gICAgICByZXR1cm4gQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoZ2VvbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZydXN0dW1MZW5ndGggPSB0aGlzLmlucHV0cy5mYXJQbGFuZSAtIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcclxuICAgIGNvbnN0IGJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSA9IG5ldyBCb3hHZW9tZXRyeSgyLCAyLCBmcnVzdHVtTGVuZ3RoKTtcclxuICAgIGNvbnN0IGhhbGZIQW5nbGUgPSB0aGlzLmlucHV0cy5ob3Jpem9udGFsRk9WICogMC41ICogTWF0aC5QSSAvIDE4MDtcclxuICAgIGNvbnN0IG5lYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcclxuICAgIGNvbnN0IGZhckhhbGZXaWR0aCA9IE1hdGgudGFuKGhhbGZIQW5nbGUpICogdGhpcy5pbnB1dHMuZmFyUGxhbmU7XHJcbiAgICBjb25zdCBuZWFySGFsZkhlaWdodCA9IG5lYXJIYWxmV2lkdGggLyB0aGlzLmlucHV0cy5hc3BlY3Q7XHJcbiAgICBjb25zdCBmYXJIYWxmSGVpZ2h0ID0gZmFySGFsZldpZHRoIC8gdGhpcy5pbnB1dHMuYXNwZWN0O1xyXG5cclxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IGJveEdlb21ldHJ5LmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5jb3VudDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHZlcnRleFogPSBwb3NpdGlvbnMuZ2V0WihpKTtcclxuICAgICAgY29uc3QgdmVydGV4WCA9IHBvc2l0aW9ucy5nZXRYKGkpO1xyXG4gICAgICBjb25zdCB2ZXJ0ZXhZID0gcG9zaXRpb25zLmdldFkoaSk7XHJcbiAgICAgIGlmICh2ZXJ0ZXhaID4gMCkge1xyXG4gICAgICAgIC8vIGJhY2sgb2YgdGhlIGNhbWVyYVxyXG4gICAgICAgIHBvc2l0aW9ucy5zZXRYKGksIHZlcnRleFggKiBuZWFySGFsZldpZHRoKVxyXG4gICAgICAgIHBvc2l0aW9ucy5zZXRZKGksIHZlcnRleFkgKiBuZWFySGFsZkhlaWdodCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZnJvbnQgb2YgdGhlIGNhbWVyYVxyXG4gICAgICAgIHBvc2l0aW9ucy5zZXRYKGksIHZlcnRleFggKiBmYXJIYWxmV2lkdGgpXHJcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIGZhckhhbGZIZWlnaHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHBvc2l0aW9ucy5zZXRaKGksIHZlcnRleFogLSAwLjUgKiBmcnVzdHVtTGVuZ3RoIC0gdGhpcy5pbnB1dHMubmVhclBsYW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBib3hNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe1xyXG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXHJcbiAgICAgIG9wYWNpdHk6IDAuMzUsXHJcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICBzaWRlOiBCYWNrU2lkZSxcclxuICAgICAgYmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxyXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ib3ggPSBuZXcgTWVzaChib3hHZW9tZXRyeSwgYm94TWF0ZXJpYWwpO1xyXG4gICAgY29uc3QgZWRnZXNHZW9tZXRyeSA9IGVkZ2VzVG9DeWxpbmRlcnMobmV3IEVkZ2VzR2VvbWV0cnkoYm94R2VvbWV0cnkpLCAwLjAxNSk7XHJcbiAgICB0aGlzLmVkZ2VzID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcclxuICAgICAgY29sb3I6IDB4ZmZmZmZmLFxyXG4gICAgICBvcGFjaXR5OiAwLjI1LFxyXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgYmxlbmRpbmc6IEFkZGl0aXZlQmxlbmRpbmcsXHJcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IGVkZ2VzR2VvbWV0cnkyID0gZWRnZXNUb0N5bGluZGVycyhuZXcgRWRnZXNHZW9tZXRyeShib3hHZW9tZXRyeSksIDAuMDYpO1xyXG4gICAgY29uc3QgZWRnZXMyID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XHJcbiAgICAgIGNvbG9yOiB0aGlzLmlucHV0cy5jb2xvcixcclxuICAgICAgb3BhY2l0eTogMC4zNSxcclxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgIGJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxyXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcclxuICAgIH0pKTtcclxuICAgIHRoaXMucGl2b3QuYWRkKGVkZ2VzMik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1ha2VIaWdobGlnaHQoKSB7XHJcblxyXG4gICAgbGV0IGZsb29yTWVzaCA9IG51bGw7XHJcbiAgICBmbG9vck1lc2ggPSB0aGlzLmNvbnRleHQuc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKCdGbG9vck1lc2g6MCcpO1xyXG4gICAgY29uc3Qgcm9vbU1lc2ggPSBmbG9vck1lc2guY2hpbGRyZW5bNV0gYXMgTWVzaDtcclxuXHJcbiAgICB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyh0aGlzLnByb2plY3RvciwgdGhpcy5oaWdobGlnaHRVbmlmb3Jtcyk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zLmNvbG9yLnZhbHVlLnNldEhleCh0aGlzLmlucHV0cy5jb2xvcik7XHJcblxyXG4gICAgY29uc3Qgc2hhZGVyID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcclxuICAgICAgcG9seWdvbk9mZnNldDogdHJ1ZSxcclxuICAgICAgcG9seWdvbk9mZnNldFVuaXRzOiAtMC4xLFxyXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgdW5pZm9ybXM6IHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMsXHJcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4U2hhZGVyKCksXHJcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudFNoYWRlcigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gYSBtZXNoIHRvIHJlcHJlc2VudCB0aGUgXCJoaWdobGlnaHRcIlxyXG4gICAgdGhpcy5oaWdobGlnaHQgPSBuZXcgTWVzaChyb29tTWVzaC5nZW9tZXRyeSwgc2hhZGVyKTtcclxuXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBvbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5oaWdobGlnaHQgJiYgdGhpcy5oaWdobGlnaHQucGFyZW50KSB7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0LnBhcmVudC5yZW1vdmUodGhpcy5oaWdobGlnaHQpO1xyXG4gICAgICAodGhpcy5oaWdobGlnaHQubWF0ZXJpYWwgYXMgU2hhZGVyTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XHJcbiAgICAgIHRoaXMuZWRnZXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gICAgICAodGhpcy5lZGdlcy5tYXRlcmlhbCBhcyBMaW5lQmFzaWNNYXRlcmlhbCkuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYm94KSB7XHJcbiAgICAgIHRoaXMuYm94Lmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgKHRoaXMuYm94Lm1hdGVyaWFsIGFzIE1lc2hCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2ZXJ0ZXhTaGFkZXIoKTogc3RyaW5nIHtcclxuICByZXR1cm4gYFxyXG4gICAgdW5pZm9ybSBtYXQ0IGxpZ2h0TWF0cml4O1xyXG5cclxuICAgIHZhcnlpbmcgdmVjNCB2TGlnaHRDb29yZHM7XHJcblxyXG4gICAgdm9pZCBtYWluKCkge1xyXG4gICAgICAvLyBjcmVhdGUgYSBVViByZWdpb24gWzAsMV0geCBbMCwxXSB0byByZXByZXNlbnQgd2hhdCB0aGUgbGlnaHRNYXRyaXggXCJzZWVzXCJcclxuICAgICAgdkxpZ2h0Q29vcmRzID0gbGlnaHRNYXRyaXggKiAgbW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xyXG4gICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xyXG4gICAgfVxyXG4gIGA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZyYWdtZW50U2hhZGVyKCkge1xyXG4gIHJldHVybiBgXHJcbiAgICB1bmlmb3JtIHZlYzMgY29sb3I7XHJcblxyXG4gICAgdmFyeWluZyB2ZWM0IHZMaWdodENvb3JkcztcclxuXHJcbiAgICB2b2lkIG1haW4oKSB7XHJcbiAgICAgIHZlYzIgbGlnaHRVViA9IHZMaWdodENvb3Jkcy54eSAvIHZMaWdodENvb3Jkcy53O1xyXG4gICAgICBmbG9hdCBpblZpZXcgPSBmbG9hdChtYXgobGlnaHRVVi54LCBsaWdodFVWLnkpIDw9IDEuMCAmJiBtaW4obGlnaHRVVi54LCBsaWdodFVWLnkpID49IDAuMCAmJiB2TGlnaHRDb29yZHMueiA+IDAuMCk7XHJcblxyXG4gICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBtaW4oaW5WaWV3LCAwLjIpKTtcclxuICAgIH1cclxuICBgO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyhwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLCB1bmlmb3JtczogSGlnaGxpZ2h0VW5pZm9ybXMpIHtcclxuICBwcm9qZWN0b3IuZ2V0V29ybGRQb3NpdGlvbih1bmlmb3Jtcy5wcm9qUG9zaXRpb24udmFsdWUpO1xyXG5cclxuICAvLyBzaW1pbGFyIHRvIGEgc2hhZG93IG1hdHJpeCwgYnV0IHdlJ3JlIHVzaW5nIGl0IGFzIGEgXCJyZWN0YW5ndWxhclwiIHNwb3RsaWdodFxyXG4gIC8vIFtsaWdodEJpYXNdICogW3Byb2plY3Rpb25dICogW3ZpZXdNYXRyaXhdXHJcbiAgdW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUubWFrZVNjYWxlKDAuNSwgMC41LCAwLjUpO1xyXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLnNldFBvc2l0aW9uKG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwLjUpKVxyXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm11bHRpcGx5TWF0cmljZXModW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUsIHByb2plY3Rvci5wcm9qZWN0aW9uTWF0cml4KTtcclxuICB1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZS5tdWx0aXBseU1hdHJpY2VzKHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLCBwcm9qZWN0b3IubWF0cml4V29ybGRJbnZlcnNlKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFZpZXdGcnVzdHVtTWVzaFR5cGUgPSAnbXAuVmlld0ZydXN0dW1NZXNoJztcclxuZXhwb3J0IGNvbnN0IG1ha2VWaWV3RnJ1c3R1bU1lc2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgcmV0dXJuIG5ldyBWaWV3RnJ1c3R1bU1lc2goKTtcclxufVxyXG4iXX0=
1
+ import { Object3D, Mesh, PerspectiveCamera, ShaderMaterial, MeshBasicMaterial, BoxGeometry, EdgesGeometry, Color, Matrix4, Vector3, Euler, CylinderBufferGeometry, BackSide, NormalBlending, AdditiveBlending, } from 'three';
2
+ import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
3
+ import { SceneComponent } from '../scene-component/SceneComponent';
4
+ /**
5
+ * This class is the extracted View Frustum Mesh from
6
+ * SecurityCamera example
7
+ */
8
+ export class ViewFrustumMesh extends SceneComponent {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.root = null;
12
+ this.pivot = null;
13
+ this.box = null;
14
+ this.edges = null;
15
+ this.inputs = {
16
+ "nearPlane": 0.1,
17
+ "farPlane": 10,
18
+ "horizontalFOV": 52,
19
+ "aspect": 1.7777777777777777,
20
+ "localPosition": {
21
+ "x": 0,
22
+ "y": 0.18,
23
+ "z": -0.3
24
+ },
25
+ "localRotation": {
26
+ "x": -15,
27
+ "y": 0,
28
+ "z": 0
29
+ },
30
+ "color": 65280,
31
+ "panPeriod": 5,
32
+ "panAngle": -45
33
+ };
34
+ this.highlight = null;
35
+ this.highlightUniforms = {
36
+ color: { value: new Color() },
37
+ projPosition: { value: new Vector3() },
38
+ lightMatrix: { value: new Matrix4() },
39
+ };
40
+ this.outputs = {};
41
+ }
42
+ onInit() {
43
+ this.root = new Object3D();
44
+ this.pivot = new Object3D();
45
+ this.root.add(this.pivot);
46
+ this.outputs.objectRoot = this.root;
47
+ const euler = new Euler(this.inputs.localRotation.x * Math.PI / 180, this.inputs.localRotation.y * Math.PI / 180, this.inputs.localRotation.z * Math.PI / 180, 'YXZ');
48
+ this.pivot.quaternion.setFromEuler(euler);
49
+ this.makeFrustumVisuals();
50
+ this.pivot.add(this.box);
51
+ this.pivot.add(this.edges);
52
+ const aspect = this.inputs.aspect;
53
+ const DEG2RAD = Math.PI / 180;
54
+ const RAD2DEG = 1 / DEG2RAD;
55
+ const verticalFOV = 2 * Math.atan(1 / aspect * Math.tan(0.5 * this.inputs.horizontalFOV * DEG2RAD)) * RAD2DEG;
56
+ this.projector = new PerspectiveCamera(verticalFOV, aspect, this.inputs.nearPlane, this.inputs.farPlane);
57
+ this.pivot.add(this.projector);
58
+ this.makeHighlight();
59
+ this.context.scene.add(this.highlight);
60
+ }
61
+ onTickModified(delta, quaternion) {
62
+ this.pivot.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
63
+ updateHighlightUniforms(this.projector, this.highlightUniforms);
64
+ }
65
+ makeFrustumVisuals() {
66
+ if (this.box) {
67
+ this.root.remove(this.box);
68
+ this.box.material.dispose();
69
+ this.box.geometry.dispose();
70
+ this.box = null;
71
+ }
72
+ if (this.edges) {
73
+ this.root.remove(this.edges);
74
+ this.edges.material.dispose();
75
+ this.edges.geometry.dispose();
76
+ this.edges = null;
77
+ }
78
+ function edgesToCylinders(edgesGeometry, thickness) {
79
+ const { position } = edgesGeometry.attributes;
80
+ const { array, count } = position;
81
+ const r = thickness / 2;
82
+ const geoms = [];
83
+ for (let i = 0; i < count * 3 - 1; i += 6) {
84
+ const a = new Vector3(array[i], array[i + 1], array[i + 2]);
85
+ const b = new Vector3(array[i + 3], array[i + 4], array[i + 5]);
86
+ const vec = new Vector3().subVectors(b, a);
87
+ const len = vec.length();
88
+ const geom = new CylinderBufferGeometry(r, r, len, 8);
89
+ geom.translate(0, len / 2, 0);
90
+ geom.rotateX(Math.PI / 2);
91
+ geom.lookAt(vec);
92
+ geom.translate(a.x, a.y, a.z);
93
+ geoms.push(geom);
94
+ }
95
+ // API to be updated in bundle - JSSDK-1222
96
+ return BufferGeometryUtils.mergeBufferGeometries(geoms);
97
+ }
98
+ const frustumLength = this.inputs.farPlane - this.inputs.nearPlane;
99
+ const boxGeometry = new BoxGeometry(2, 2, frustumLength);
100
+ const halfHAngle = this.inputs.horizontalFOV * 0.5 * Math.PI / 180;
101
+ const nearHalfWidth = Math.tan(halfHAngle) * this.inputs.nearPlane;
102
+ const farHalfWidth = Math.tan(halfHAngle) * this.inputs.farPlane;
103
+ const nearHalfHeight = nearHalfWidth / this.inputs.aspect;
104
+ const farHalfHeight = farHalfWidth / this.inputs.aspect;
105
+ const positions = boxGeometry.getAttribute('position');
106
+ for (let i = 0; i < positions.count; i++) {
107
+ const vertexZ = positions.getZ(i);
108
+ const vertexX = positions.getX(i);
109
+ const vertexY = positions.getY(i);
110
+ if (vertexZ > 0) {
111
+ // back of the camera
112
+ positions.setX(i, vertexX * nearHalfWidth);
113
+ positions.setY(i, vertexY * nearHalfHeight);
114
+ }
115
+ else {
116
+ // front of the camera
117
+ positions.setX(i, vertexX * farHalfWidth);
118
+ positions.setY(i, vertexY * farHalfHeight);
119
+ }
120
+ positions.setZ(i, vertexZ - 0.5 * frustumLength - this.inputs.nearPlane);
121
+ }
122
+ const boxMaterial = new MeshBasicMaterial({
123
+ color: this.inputs.color,
124
+ opacity: 0.35,
125
+ transparent: true,
126
+ side: BackSide,
127
+ blending: NormalBlending,
128
+ depthWrite: false,
129
+ });
130
+ this.box = new Mesh(boxGeometry, boxMaterial);
131
+ const edgesGeometry = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.015);
132
+ this.edges = new Mesh(edgesGeometry, new MeshBasicMaterial({
133
+ color: 0xffffff,
134
+ opacity: 0.25,
135
+ transparent: true,
136
+ blending: AdditiveBlending,
137
+ depthWrite: false,
138
+ }));
139
+ const edgesGeometry2 = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.06);
140
+ const edges2 = new Mesh(edgesGeometry2, new MeshBasicMaterial({
141
+ color: this.inputs.color,
142
+ opacity: 0.35,
143
+ transparent: true,
144
+ blending: AdditiveBlending,
145
+ depthWrite: false,
146
+ }));
147
+ this.pivot.add(edges2);
148
+ }
149
+ makeHighlight() {
150
+ let floorMesh = null;
151
+ floorMesh = this.context.scene.getObjectByName('FloorMesh:0');
152
+ const roomMesh = floorMesh.children[5];
153
+ updateHighlightUniforms(this.projector, this.highlightUniforms);
154
+ this.highlightUniforms.color.value.setHex(this.inputs.color);
155
+ const shader = new ShaderMaterial({
156
+ polygonOffset: true,
157
+ polygonOffsetUnits: -0.1,
158
+ transparent: true,
159
+ uniforms: this.highlightUniforms,
160
+ vertexShader: vertexShader(),
161
+ fragmentShader: fragmentShader(),
162
+ });
163
+ // a mesh to represent the "highlight"
164
+ this.highlight = new Mesh(roomMesh.geometry, shader);
165
+ }
166
+ onDestroy() {
167
+ if (this.highlight && this.highlight.parent) {
168
+ this.highlight.parent.remove(this.highlight);
169
+ this.highlight.material.dispose();
170
+ }
171
+ if (this.edges) {
172
+ this.edges.geometry.dispose();
173
+ this.edges.material.dispose();
174
+ }
175
+ if (this.box) {
176
+ this.box.geometry.dispose();
177
+ this.box.material.dispose();
178
+ }
179
+ }
180
+ }
181
+ function vertexShader() {
182
+ return `
183
+ uniform mat4 lightMatrix;
184
+
185
+ varying vec4 vLightCoords;
186
+
187
+ void main() {
188
+ // create a UV region [0,1] x [0,1] to represent what the lightMatrix "sees"
189
+ vLightCoords = lightMatrix * modelMatrix * vec4(position, 1.0);
190
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
191
+ }
192
+ `;
193
+ }
194
+ function fragmentShader() {
195
+ return `
196
+ uniform vec3 color;
197
+
198
+ varying vec4 vLightCoords;
199
+
200
+ void main() {
201
+ vec2 lightUV = vLightCoords.xy / vLightCoords.w;
202
+ float inView = float(max(lightUV.x, lightUV.y) <= 1.0 && min(lightUV.x, lightUV.y) >= 0.0 && vLightCoords.z > 0.0);
203
+
204
+ gl_FragColor = vec4(color, min(inView, 0.2));
205
+ }
206
+ `;
207
+ }
208
+ function updateHighlightUniforms(projector, uniforms) {
209
+ projector.getWorldPosition(uniforms.projPosition.value);
210
+ // similar to a shadow matrix, but we're using it as a "rectangular" spotlight
211
+ // [lightBias] * [projection] * [viewMatrix]
212
+ uniforms.lightMatrix.value.makeScale(0.5, 0.5, 0.5);
213
+ uniforms.lightMatrix.value.setPosition(new Vector3(0.5, 0.5, 0.5));
214
+ uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.projectionMatrix);
215
+ uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.matrixWorldInverse);
216
+ }
217
+ export const ViewFrustumMeshType = 'mp.ViewFrustumMesh';
218
+ export const makeViewFrustumMesh = function () {
219
+ return new ViewFrustumMesh();
220
+ };
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld0ZydXN0dW1NZXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsRUFFWCxhQUFhLEVBQ2IsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBQ1IsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxpREFBaUQsQ0FBQTtBQUN0RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFvQmpFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGNBQWM7SUFBbkQ7O1FBRVUsU0FBSSxHQUFvQixJQUFJLENBQUM7UUFDN0IsVUFBSyxHQUFvQixJQUFJLENBQUM7UUFDOUIsUUFBRyxHQUFnQixJQUFJLENBQUM7UUFDeEIsVUFBSyxHQUFnQixJQUFJLENBQUM7UUFJekIsV0FBTSxHQUFXO1lBQ3hCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZUFBZSxFQUFFLEVBQUU7WUFDbkIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixlQUFlLEVBQUU7Z0JBQ2YsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLENBQUMsR0FBRzthQUNWO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04s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QUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBPYmplY3QzRCxcbiAgTWVzaCxcbiAgUGVyc3BlY3RpdmVDYW1lcmEsXG4gIFNoYWRlck1hdGVyaWFsLFxuICBNZXNoQmFzaWNNYXRlcmlhbCxcbiAgQm94R2VvbWV0cnksXG4gIExpbmVCYXNpY01hdGVyaWFsLFxuICBFZGdlc0dlb21ldHJ5LFxuICBDb2xvcixcbiAgTWF0cml4NCxcbiAgVmVjdG9yMyxcbiAgRXVsZXIsXG4gIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG4gIEJhY2tTaWRlLFxuICBOb3JtYWxCbGVuZGluZyxcbiAgQWRkaXRpdmVCbGVuZGluZyxcbn0gZnJvbSAndGhyZWUnO1xuaW1wb3J0ICogYXMgQnVmZmVyR2VvbWV0cnlVdGlscyBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vdXRpbHMvQnVmZmVyR2VvbWV0cnlVdGlscy5qcydcbmltcG9ydCB7U2NlbmVDb21wb25lbnR9IGZyb20gJy4uL3NjZW5lLWNvbXBvbmVudC9TY2VuZUNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBJbnB1dHMge1xuICBuZWFyUGxhbmU6IG51bWJlcjtcbiAgZmFyUGxhbmU6IG51bWJlcixcbiAgaG9yaXpvbnRhbEZPVjogbnVtYmVyLFxuICBhc3BlY3Q6IG51bWJlcixcbiAgbG9jYWxQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyOyB9O1xuICBsb2NhbFJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH07XG4gIGNvbG9yOiBudW1iZXI7XG4gIHBhblBlcmlvZDogbnVtYmVyO1xuICBwYW5BbmdsZTogbnVtYmVyO1xufVxuXG50eXBlIEhpZ2hsaWdodFVuaWZvcm1zID0ge1xuICBjb2xvcjogeyB2YWx1ZTogQ29sb3IgfSxcbiAgcHJvalBvc2l0aW9uOiB7IHZhbHVlOiBWZWN0b3IzIH07XG4gIGxpZ2h0TWF0cml4OiB7IHZhbHVlOiBNYXRyaXg0IH07XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB0aGUgZXh0cmFjdGVkIFZpZXcgRnJ1c3R1bSBNZXNoIGZyb21cbiAqIFNlY3VyaXR5Q2FtZXJhIGV4YW1wbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpZXdGcnVzdHVtTWVzaCBleHRlbmRzIFNjZW5lQ29tcG9uZW50IHtcblxuICBwcml2YXRlIHJvb3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGl2b3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm94OiBNZXNoIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRnZXM6IE1lc2ggfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHByb2plY3RvcjogUGVyc3BlY3RpdmVDYW1lcmE7XG5cbiAgb3ZlcnJpZGUgaW5wdXRzOiBJbnB1dHMgPSB7XG4gICAgXCJuZWFyUGxhbmVcIjogMC4xLFxuICAgIFwiZmFyUGxhbmVcIjogMTAsXG4gICAgXCJob3Jpem9udGFsRk9WXCI6IDUyLFxuICAgIFwiYXNwZWN0XCI6IDEuNzc3Nzc3Nzc3Nzc3Nzc3NyxcbiAgICBcImxvY2FsUG9zaXRpb25cIjoge1xuICAgICAgXCJ4XCI6IDAsXG4gICAgICBcInlcIjogMC4xOCxcbiAgICAgIFwielwiOiAtMC4zXG4gICAgfSxcbiAgICBcImxvY2FsUm90YXRpb25cIjoge1xuICAgICAgXCJ4XCI6IC0xNSxcbiAgICAgIFwieVwiOiAwLFxuICAgICAgXCJ6XCI6IDBcbiAgICB9LFxuICAgIFwiY29sb3JcIjogNjUyODAsXG4gICAgXCJwYW5QZXJpb2RcIjogNSxcbiAgICBcInBhbkFuZ2xlXCI6IC00NVxuICB9O1xuXG4gIHByaXZhdGUgaGlnaGxpZ2h0OiBNZXNoIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBoaWdobGlnaHRVbmlmb3JtczogSGlnaGxpZ2h0VW5pZm9ybXMgPSB7XG4gICAgY29sb3I6IHt2YWx1ZTogbmV3IENvbG9yKCl9LFxuICAgIHByb2pQb3NpdGlvbjoge3ZhbHVlOiBuZXcgVmVjdG9yMygpfSxcbiAgICBsaWdodE1hdHJpeDoge3ZhbHVlOiBuZXcgTWF0cml4NCgpfSxcbiAgfVxuICBvdmVycmlkZSBvdXRwdXRzOiBhbnkgPSB7fTtcblxuICBvdmVycmlkZSBvbkluaXQoKSB7XG5cbiAgICB0aGlzLnJvb3QgPSBuZXcgT2JqZWN0M0QoKTtcbiAgICB0aGlzLnBpdm90ID0gbmV3IE9iamVjdDNEKCk7XG4gICAgdGhpcy5yb290LmFkZCh0aGlzLnBpdm90KTtcbiAgICB0aGlzLm91dHB1dHMub2JqZWN0Um9vdCA9IHRoaXMucm9vdDtcblxuICAgIGNvbnN0IGV1bGVyID0gbmV3IEV1bGVyKHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueCAqIE1hdGguUEkgLyAxODAsIHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueSAqIE1hdGguUEkgLyAxODAsIHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueiAqIE1hdGguUEkgLyAxODAsICdZWFonKTtcbiAgICB0aGlzLnBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKGV1bGVyKTtcblxuICAgIHRoaXMubWFrZUZydXN0dW1WaXN1YWxzKCk7XG5cbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmJveCk7XG4gICAgdGhpcy5waXZvdC5hZGQodGhpcy5lZGdlcyk7XG5cbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLmlucHV0cy5hc3BlY3Q7XG4gICAgY29uc3QgREVHMlJBRCA9IE1hdGguUEkgLyAxODA7XG4gICAgY29uc3QgUkFEMkRFRyA9IDEgLyBERUcyUkFEO1xuICAgIGNvbnN0IHZlcnRpY2FsRk9WID0gMiAqIE1hdGguYXRhbigxIC8gYXNwZWN0ICogTWF0aC50YW4oMC41ICogdGhpcy5pbnB1dHMuaG9yaXpvbnRhbEZPViAqIERFRzJSQUQpKSAqIFJBRDJERUc7XG4gICAgdGhpcy5wcm9qZWN0b3IgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEodmVydGljYWxGT1YsIGFzcGVjdCwgdGhpcy5pbnB1dHMubmVhclBsYW5lLCB0aGlzLmlucHV0cy5mYXJQbGFuZSk7XG4gICAgdGhpcy5waXZvdC5hZGQodGhpcy5wcm9qZWN0b3IpO1xuXG4gICAgdGhpcy5tYWtlSGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5jb250ZXh0LnNjZW5lLmFkZCh0aGlzLmhpZ2hsaWdodCk7XG5cbiAgfVxuXG5cbiAgb25UaWNrTW9kaWZpZWQoZGVsdGE6IG51bWJlciwgcXVhdGVybmlvbjogYW55KSB7XG4gICAgdGhpcy5waXZvdC5xdWF0ZXJuaW9uLnNldChxdWF0ZXJuaW9uLngscXVhdGVybmlvbi55LHF1YXRlcm5pb24ueixxdWF0ZXJuaW9uLncpO1xuICAgIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHRoaXMucHJvamVjdG9yLCB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUZydXN0dW1WaXN1YWxzKCkge1xuICAgIGlmICh0aGlzLmJveCkge1xuICAgICAgdGhpcy5yb290LnJlbW92ZSh0aGlzLmJveCk7XG4gICAgICAodGhpcy5ib3gubWF0ZXJpYWwgYXMgTWVzaEJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICAgICh0aGlzLmJveC5nZW9tZXRyeSBhcyBCb3hHZW9tZXRyeSkuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5ib3ggPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5lZGdlcykge1xuICAgICAgdGhpcy5yb290LnJlbW92ZSh0aGlzLmVkZ2VzKTtcbiAgICAgICh0aGlzLmVkZ2VzLm1hdGVyaWFsIGFzIExpbmVCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XG4gICAgICAodGhpcy5lZGdlcy5nZW9tZXRyeSBhcyBFZGdlc0dlb21ldHJ5KS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmVkZ2VzID0gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlZGdlc1RvQ3lsaW5kZXJzKGVkZ2VzR2VvbWV0cnk6IEVkZ2VzR2VvbWV0cnksIHRoaWNrbmVzczogbnVtYmVyKSB7XG4gICAgICBjb25zdCB7cG9zaXRpb259ID0gZWRnZXNHZW9tZXRyeS5hdHRyaWJ1dGVzO1xuICAgICAgY29uc3Qge2FycmF5LCBjb3VudH0gPSBwb3NpdGlvbjtcbiAgICAgIGNvbnN0IHIgPSB0aGlja25lc3MgLyAyO1xuICAgICAgY29uc3QgZ2VvbXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQgKiAzIC0gMTsgaSArPSA2KSB7XG4gICAgICAgIGNvbnN0IGEgPSBuZXcgVmVjdG9yMyhhcnJheVtpXSwgYXJyYXlbaSArIDFdLCBhcnJheVtpICsgMl0pO1xuICAgICAgICBjb25zdCBiID0gbmV3IFZlY3RvcjMoYXJyYXlbaSArIDNdLCBhcnJheVtpICsgNF0sIGFycmF5W2kgKyA1XSk7XG5cbiAgICAgICAgY29uc3QgdmVjID0gbmV3IFZlY3RvcjMoKS5zdWJWZWN0b3JzKGIsIGEpO1xuICAgICAgICBjb25zdCBsZW4gPSB2ZWMubGVuZ3RoKCk7XG4gICAgICAgIGNvbnN0IGdlb20gPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeShyLCByLCBsZW4sIDgpO1xuICAgICAgICBnZW9tLnRyYW5zbGF0ZSgwLCBsZW4gLyAyLCAwKTtcbiAgICAgICAgZ2VvbS5yb3RhdGVYKE1hdGguUEkgLyAyKTtcbiAgICAgICAgZ2VvbS5sb29rQXQodmVjKTtcbiAgICAgICAgZ2VvbS50cmFuc2xhdGUoYS54LCBhLnksIGEueik7XG4gICAgICAgIGdlb21zLnB1c2goZ2VvbSk7XG4gICAgICB9XG4gICAgICAvLyBBUEkgdG8gYmUgdXBkYXRlZCBpbiBidW5kbGUgLSBKU1NESy0xMjIyXG4gICAgICByZXR1cm4gQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoZ2VvbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZydXN0dW1MZW5ndGggPSB0aGlzLmlucHV0cy5mYXJQbGFuZSAtIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcbiAgICBjb25zdCBib3hHZW9tZXRyeTogQm94R2VvbWV0cnkgPSBuZXcgQm94R2VvbWV0cnkoMiwgMiwgZnJ1c3R1bUxlbmd0aCk7XG4gICAgY29uc3QgaGFsZkhBbmdsZSA9IHRoaXMuaW5wdXRzLmhvcml6b250YWxGT1YgKiAwLjUgKiBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IG5lYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcbiAgICBjb25zdCBmYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLmZhclBsYW5lO1xuICAgIGNvbnN0IG5lYXJIYWxmSGVpZ2h0ID0gbmVhckhhbGZXaWR0aCAvIHRoaXMuaW5wdXRzLmFzcGVjdDtcbiAgICBjb25zdCBmYXJIYWxmSGVpZ2h0ID0gZmFySGFsZldpZHRoIC8gdGhpcy5pbnB1dHMuYXNwZWN0O1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gYm94R2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdmVydGV4WiA9IHBvc2l0aW9ucy5nZXRaKGkpO1xuICAgICAgY29uc3QgdmVydGV4WCA9IHBvc2l0aW9ucy5nZXRYKGkpO1xuICAgICAgY29uc3QgdmVydGV4WSA9IHBvc2l0aW9ucy5nZXRZKGkpO1xuICAgICAgaWYgKHZlcnRleFogPiAwKSB7XG4gICAgICAgIC8vIGJhY2sgb2YgdGhlIGNhbWVyYVxuICAgICAgICBwb3NpdGlvbnMuc2V0WChpLCB2ZXJ0ZXhYICogbmVhckhhbGZXaWR0aClcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIG5lYXJIYWxmSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZyb250IG9mIHRoZSBjYW1lcmFcbiAgICAgICAgcG9zaXRpb25zLnNldFgoaSwgdmVydGV4WCAqIGZhckhhbGZXaWR0aClcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIGZhckhhbGZIZWlnaHQpO1xuICAgICAgfVxuICAgICAgcG9zaXRpb25zLnNldFooaSwgdmVydGV4WiAtIDAuNSAqIGZydXN0dW1MZW5ndGggLSB0aGlzLmlucHV0cy5uZWFyUGxhbmUpO1xuICAgIH1cblxuICAgIGNvbnN0IGJveE1hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXG4gICAgICBvcGFjaXR5OiAwLjM1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBzaWRlOiBCYWNrU2lkZSxcbiAgICAgIGJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuYm94ID0gbmV3IE1lc2goYm94R2VvbWV0cnksIGJveE1hdGVyaWFsKTtcbiAgICBjb25zdCBlZGdlc0dlb21ldHJ5ID0gZWRnZXNUb0N5bGluZGVycyhuZXcgRWRnZXNHZW9tZXRyeShib3hHZW9tZXRyeSksIDAuMDE1KTtcbiAgICB0aGlzLmVkZ2VzID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICAgIG9wYWNpdHk6IDAuMjUsXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIGJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZWRnZXNHZW9tZXRyeTIgPSBlZGdlc1RvQ3lsaW5kZXJzKG5ldyBFZGdlc0dlb21ldHJ5KGJveEdlb21ldHJ5KSwgMC4wNik7XG4gICAgY29uc3QgZWRnZXMyID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXG4gICAgICBvcGFjaXR5OiAwLjM1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBibGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pKTtcbiAgICB0aGlzLnBpdm90LmFkZChlZGdlczIpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlSGlnaGxpZ2h0KCkge1xuXG4gICAgbGV0IGZsb29yTWVzaCA9IG51bGw7XG4gICAgZmxvb3JNZXNoID0gdGhpcy5jb250ZXh0LnNjZW5lLmdldE9iamVjdEJ5TmFtZSgnRmxvb3JNZXNoOjAnKTtcbiAgICBjb25zdCByb29tTWVzaCA9IGZsb29yTWVzaC5jaGlsZHJlbls1XSBhcyBNZXNoO1xuXG4gICAgdXBkYXRlSGlnaGxpZ2h0VW5pZm9ybXModGhpcy5wcm9qZWN0b3IsIHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMpO1xuICAgIHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMuY29sb3IudmFsdWUuc2V0SGV4KHRoaXMuaW5wdXRzLmNvbG9yKTtcblxuICAgIGNvbnN0IHNoYWRlciA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7XG4gICAgICBwb2x5Z29uT2Zmc2V0OiB0cnVlLFxuICAgICAgcG9seWdvbk9mZnNldFVuaXRzOiAtMC4xLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICB1bmlmb3JtczogdGhpcy5oaWdobGlnaHRVbmlmb3JtcyxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4U2hhZGVyKCksXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnRTaGFkZXIoKSxcbiAgICB9KTtcblxuICAgIC8vIGEgbWVzaCB0byByZXByZXNlbnQgdGhlIFwiaGlnaGxpZ2h0XCJcbiAgICB0aGlzLmhpZ2hsaWdodCA9IG5ldyBNZXNoKHJvb21NZXNoLmdlb21ldHJ5LCBzaGFkZXIpO1xuXG4gIH1cblxuICBvdmVycmlkZSBvbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ICYmIHRoaXMuaGlnaGxpZ2h0LnBhcmVudCkge1xuICAgICAgdGhpcy5oaWdobGlnaHQucGFyZW50LnJlbW92ZSh0aGlzLmhpZ2hsaWdodCk7XG4gICAgICAodGhpcy5oaWdobGlnaHQubWF0ZXJpYWwgYXMgU2hhZGVyTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZWRnZXMpIHtcbiAgICAgIHRoaXMuZWRnZXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuICAgICAgKHRoaXMuZWRnZXMubWF0ZXJpYWwgYXMgTGluZUJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm94KSB7XG4gICAgICB0aGlzLmJveC5nZW9tZXRyeS5kaXNwb3NlKCk7XG4gICAgICAodGhpcy5ib3gubWF0ZXJpYWwgYXMgTWVzaEJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmVydGV4U2hhZGVyKCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4gICAgdW5pZm9ybSBtYXQ0IGxpZ2h0TWF0cml4O1xuXG4gICAgdmFyeWluZyB2ZWM0IHZMaWdodENvb3JkcztcblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIFVWIHJlZ2lvbiBbMCwxXSB4IFswLDFdIHRvIHJlcHJlc2VudCB3aGF0IHRoZSBsaWdodE1hdHJpeCBcInNlZXNcIlxuICAgICAgdkxpZ2h0Q29vcmRzID0gbGlnaHRNYXRyaXggKiAgbW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGZyYWdtZW50U2hhZGVyKCkge1xuICByZXR1cm4gYFxuICAgIHVuaWZvcm0gdmVjMyBjb2xvcjtcblxuICAgIHZhcnlpbmcgdmVjNCB2TGlnaHRDb29yZHM7XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICB2ZWMyIGxpZ2h0VVYgPSB2TGlnaHRDb29yZHMueHkgLyB2TGlnaHRDb29yZHMudztcbiAgICAgIGZsb2F0IGluVmlldyA9IGZsb2F0KG1heChsaWdodFVWLngsIGxpZ2h0VVYueSkgPD0gMS4wICYmIG1pbihsaWdodFVWLngsIGxpZ2h0VVYueSkgPj0gMC4wICYmIHZMaWdodENvb3Jkcy56ID4gMC4wKTtcblxuICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgbWluKGluVmlldywgMC4yKSk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyhwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLCB1bmlmb3JtczogSGlnaGxpZ2h0VW5pZm9ybXMpIHtcbiAgcHJvamVjdG9yLmdldFdvcmxkUG9zaXRpb24odW5pZm9ybXMucHJvalBvc2l0aW9uLnZhbHVlKTtcblxuICAvLyBzaW1pbGFyIHRvIGEgc2hhZG93IG1hdHJpeCwgYnV0IHdlJ3JlIHVzaW5nIGl0IGFzIGEgXCJyZWN0YW5ndWxhclwiIHNwb3RsaWdodFxuICAvLyBbbGlnaHRCaWFzXSAqIFtwcm9qZWN0aW9uXSAqIFt2aWV3TWF0cml4XVxuICB1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZS5tYWtlU2NhbGUoMC41LCAwLjUsIDAuNSk7XG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLnNldFBvc2l0aW9uKG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwLjUpKVxuICB1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZS5tdWx0aXBseU1hdHJpY2VzKHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLCBwcm9qZWN0b3IucHJvamVjdGlvbk1hdHJpeCk7XG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm11bHRpcGx5TWF0cmljZXModW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUsIHByb2plY3Rvci5tYXRyaXhXb3JsZEludmVyc2UpO1xufVxuXG5leHBvcnQgY29uc3QgVmlld0ZydXN0dW1NZXNoVHlwZSA9ICdtcC5WaWV3RnJ1c3R1bU1lc2gnO1xuZXhwb3J0IGNvbnN0IG1ha2VWaWV3RnJ1c3R1bU1lc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgVmlld0ZydXN0dW1NZXNoKCk7XG59XG4iXX0=