angular-three-soba 2.0.0-beta.7 → 2.0.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/billboard/billboard.d.ts +11 -7
- package/abstractions/detailed/detailed.d.ts +26 -0
- package/abstractions/edges/edges.d.ts +23 -11
- package/abstractions/grid/grid.d.ts +41 -50
- package/abstractions/index.d.ts +1 -7
- package/abstractions/text/text.d.ts +10 -4
- package/abstractions/text-3d/text-3d.d.ts +47 -40
- package/cameras/camera/camera-content.d.ts +1 -1
- package/cameras/camera/camera.d.ts +16 -13
- package/cameras/cube-camera/cube-camera.d.ts +50 -23
- package/cameras/index.d.ts +0 -1
- package/cameras/orthographic-camera/orthographic-camera.d.ts +29 -18
- package/cameras/perspective-camera/perspective-camera.d.ts +10 -1
- package/controls/orbit-controls/orbit-controls.d.ts +30 -13
- package/esm2022/abstractions/billboard/billboard.mjs +36 -33
- package/esm2022/abstractions/detailed/detailed.mjs +64 -0
- package/esm2022/abstractions/edges/edges.mjs +58 -63
- package/esm2022/abstractions/grid/grid.mjs +140 -110
- package/esm2022/abstractions/index.mjs +2 -8
- package/esm2022/abstractions/text/text.mjs +123 -122
- package/esm2022/abstractions/text-3d/text-3d.mjs +119 -121
- package/esm2022/cameras/camera/camera-content.mjs +5 -6
- package/esm2022/cameras/camera/camera.mjs +48 -42
- package/esm2022/cameras/cube-camera/cube-camera.mjs +129 -99
- package/esm2022/cameras/index.mjs +1 -2
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +78 -75
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +25 -26
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +94 -90
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +3 -6
- package/esm2022/loaders/loader/loader.mjs +92 -87
- package/esm2022/loaders/progress/progress.mjs +1 -1
- package/esm2022/loaders/texture-loader/texture-loader.mjs +4 -4
- package/esm2022/materials/index.mjs +2 -1
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +60 -51
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +239 -255
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +99 -97
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +167 -146
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +44 -42
- package/esm2022/materials/point-material/point-material.mjs +46 -0
- package/esm2022/misc/animations/animations.mjs +20 -16
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +13 -13
- package/esm2022/misc/caustics/caustics.mjs +387 -0
- package/esm2022/misc/decal/decal.mjs +187 -0
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +33 -35
- package/esm2022/misc/example/example.mjs +160 -0
- package/esm2022/misc/fbo/fbo.mjs +35 -35
- package/esm2022/misc/html/html-wrapper.mjs +478 -0
- package/esm2022/misc/html/html.mjs +304 -0
- package/esm2022/misc/index.mjs +10 -1
- package/esm2022/misc/sampler/sampler.mjs +142 -0
- package/esm2022/misc/shadow/shadow.mjs +111 -0
- package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
- package/esm2022/misc/trail/trail.mjs +209 -0
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
- package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
- package/esm2022/modifiers/index.mjs +2 -0
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
- package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
- package/esm2022/performances/index.mjs +6 -0
- package/esm2022/performances/points/points-input.mjs +64 -0
- package/esm2022/performances/points/points.mjs +329 -0
- package/esm2022/performances/points/position-point.mjs +54 -0
- package/esm2022/performances/segments/segment-object.mjs +9 -0
- package/esm2022/performances/segments/segments.mjs +182 -0
- package/esm2022/shaders/blur-pass/blur-pass.mjs +1 -1
- package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
- package/esm2022/shaders/convolution-material/convolution-material.mjs +1 -1
- package/esm2022/shaders/discard-material/discard-material.mjs +1 -1
- package/esm2022/shaders/grid-material/grid-material.mjs +29 -14
- package/esm2022/shaders/index.mjs +5 -3
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +42 -41
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +1 -1
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +2 -2
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +4 -4
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +1 -1
- package/esm2022/shaders/shader-material/shader-material.mjs +1 -1
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +17 -25
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +32 -46
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +7 -7
- package/esm2022/shaders/star-field-material/star-field-material.mjs +3 -2
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +160 -176
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +1 -1
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +126 -128
- package/esm2022/staging/backdrop/backdrop.mjs +77 -0
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +70 -0
- package/esm2022/staging/bounds/bounds.mjs +144 -143
- package/esm2022/staging/camera-shake/camera-shake.mjs +86 -80
- package/esm2022/staging/center/center.mjs +106 -91
- package/esm2022/staging/cloud/cloud.mjs +118 -124
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +131 -134
- package/esm2022/staging/environment/assets.mjs +12 -12
- package/esm2022/staging/environment/environment-cube.mjs +28 -30
- package/esm2022/staging/environment/environment-ground.mjs +18 -20
- package/esm2022/staging/environment/environment-input.mjs +97 -84
- package/esm2022/staging/environment/environment-map.mjs +33 -33
- package/esm2022/staging/environment/environment-portal.mjs +75 -97
- package/esm2022/staging/environment/environment.mjs +34 -51
- package/esm2022/staging/environment/utils.mjs +35 -14
- package/esm2022/staging/float/float.mjs +70 -58
- package/esm2022/staging/index.mjs +7 -3
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
- package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
- package/esm2022/staging/sky/sky.mjs +85 -80
- package/esm2022/staging/sparkles/sparkles.mjs +108 -105
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
- package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
- package/esm2022/staging/spot-light/spot-light-input.mjs +67 -58
- package/esm2022/staging/spot-light/spot-light.mjs +51 -64
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +61 -78
- package/esm2022/staging/stage/stage.mjs +304 -290
- package/esm2022/staging/stars/stars.mjs +101 -102
- package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
- package/esm2022/staging/wireframe/wireframe.mjs +224 -0
- package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
- package/esm2022/utils/content/content.mjs +15 -0
- package/esm2022/utils/index.mjs +2 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +505 -2087
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +302 -259
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +93 -88
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +94 -90
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +655 -590
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +2198 -89
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
- package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
- package/fesm2022/angular-three-soba-performances.mjs +697 -0
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
- package/fesm2022/angular-three-soba-shaders.mjs +501 -264
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +2870 -2555
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-utils.mjs +22 -0
- package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
- package/loaders/gltf-loader/gltf-loader.d.ts +4 -3
- package/loaders/loader/loader.d.ts +19 -17
- package/loaders/progress/progress.d.ts +1 -1
- package/loaders/texture-loader/texture-loader.d.ts +2 -2
- package/materials/index.d.ts +1 -0
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +25 -15
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +74 -56
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +33 -21
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +55 -39
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +19 -10
- package/materials/point-material/point-material.d.ts +24 -0
- package/metadata.json +1 -0
- package/misc/animations/animations.d.ts +6 -4
- package/misc/caustics/caustics.d.ts +87 -0
- package/misc/decal/decal.d.ts +49 -0
- package/misc/depth-buffer/depth-buffer.d.ts +2 -2
- package/misc/example/example.d.ts +81 -0
- package/misc/fbo/fbo.d.ts +2 -2
- package/misc/html/html-wrapper.d.ts +559 -0
- package/misc/html/html.d.ts +214 -0
- package/misc/index.d.ts +9 -0
- package/misc/sampler/sampler.d.ts +67 -0
- package/misc/shadow/shadow.d.ts +37 -0
- package/misc/stats-gl/stats-gl.d.ts +24 -0
- package/misc/trail/trail.d.ts +57 -0
- package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
- package/misc/trail-texture/trail-texture.d.ts +50 -0
- package/modifiers/README.md +3 -0
- package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
- package/modifiers/index.d.ts +1 -0
- package/package.json +30 -22
- package/performances/README.md +3 -0
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
- package/{performance/adaptive → performances/adaptive-events}/adaptive-events.d.ts +3 -0
- package/performances/index.d.ts +5 -0
- package/performances/points/points-input.d.ts +32 -0
- package/performances/points/points.d.ts +92 -0
- package/{performance/instances/position-mesh.d.ts → performances/points/position-point.d.ts} +4 -3
- package/performances/segments/segment-object.d.ts +7 -0
- package/performances/segments/segments.d.ts +124 -0
- package/shaders/grid-material/grid-material.d.ts +33 -0
- package/shaders/index.d.ts +4 -2
- package/shaders/mesh-distort-material/mesh-distort-material.d.ts +146 -1
- package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
- package/shaders/shader-material/shader-material.d.ts +2 -2
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +10 -1
- package/shaders/sparkles-material/sparkles-material.d.ts +15 -1
- package/shaders/spot-light-material/spot-light-material.d.ts +11 -2
- package/shaders/star-field-material/star-field-material.d.ts +11 -1
- package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +89 -39
- package/staging/accumulative-shadows/randomized-lights.d.ts +40 -27
- package/staging/backdrop/backdrop.d.ts +30 -0
- package/staging/bb-anchor/bb-anchor.d.ts +27 -0
- package/staging/bounds/bounds.d.ts +100 -24
- package/staging/camera-shake/camera-shake.d.ts +30 -19
- package/staging/center/center.d.ts +43 -35
- package/staging/cloud/cloud.d.ts +26 -23
- package/staging/contact-shadows/contact-shadows.d.ts +41 -28
- package/staging/environment/assets.d.ts +9 -9
- package/staging/environment/environment-cube.d.ts +9 -5
- package/staging/environment/environment-ground.d.ts +7 -7
- package/staging/environment/environment-input.d.ts +36 -36
- package/staging/environment/environment-map.d.ts +10 -5
- package/staging/environment/environment-portal.d.ts +10 -5
- package/staging/environment/environment.d.ts +0 -4
- package/staging/environment/utils.d.ts +2 -2
- package/staging/float/float.d.ts +14 -10
- package/staging/index.d.ts +6 -2
- package/staging/matcap-texture/matcap-texture.d.ts +13 -0
- package/staging/normal-texture/normal-texture.d.ts +16 -0
- package/staging/sky/sky.d.ts +28 -21
- package/staging/sparkles/sparkles.d.ts +35 -21
- package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
- package/staging/spot-light/shadow-mesh.d.ts +37 -0
- package/staging/spot-light/spot-light-input.d.ts +25 -25
- package/staging/spot-light/spot-light.d.ts +31 -15
- package/staging/spot-light/volumetric-mesh.d.ts +15 -9
- package/staging/stage/stage.d.ts +88 -63
- package/staging/stars/stars.d.ts +27 -16
- package/staging/wireframe/wireframe-input.d.ts +65 -0
- package/staging/wireframe/wireframe.d.ts +28 -0
- package/utils/README.md +3 -0
- package/utils/content/content.d.ts +8 -0
- package/utils/index.d.ts +1 -0
- package/web-types.json +1 -0
- package/abstractions/catmull-rom-line/catmull-rom-line.d.ts +0 -25
- package/abstractions/cubic-bezier-line/cubic-bezier-line.d.ts +0 -25
- package/abstractions/gizmo-helper/gizmo-helper.d.ts +0 -34
- package/abstractions/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -30
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -32
- package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -14
- package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -47
- package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -40
- package/abstractions/line/line-input.d.ts +0 -42
- package/abstractions/line/line.d.ts +0 -35
- package/abstractions/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -23
- package/esm2022/abstractions/catmull-rom-line/catmull-rom-line.mjs +0 -131
- package/esm2022/abstractions/cubic-bezier-line/cubic-bezier-line.mjs +0 -113
- package/esm2022/abstractions/gizmo-helper/gizmo-helper.mjs +0 -210
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -95
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -155
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -62
- package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -80
- package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -206
- package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -273
- package/esm2022/abstractions/line/line-input.mjs +0 -113
- package/esm2022/abstractions/line/line.mjs +0 -165
- package/esm2022/abstractions/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
- package/esm2022/performance/adaptive/adaptive-dpr.mjs +0 -46
- package/esm2022/performance/adaptive/adaptive-events.mjs +0 -31
- package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
- package/esm2022/performance/detailed/detailed.mjs +0 -61
- package/esm2022/performance/index.mjs +0 -7
- package/esm2022/performance/instances/instance.mjs +0 -48
- package/esm2022/performance/instances/instances.mjs +0 -189
- package/esm2022/performance/instances/position-mesh.mjs +0 -52
- package/esm2022/performance/stats/stats.mjs +0 -79
- package/esm2022/shaders/caustics-material/caustics-material.mjs +0 -128
- package/esm2022/shaders/caustics-material/caustics-projection-material.mjs +0 -33
- package/esm2022/staging/caustics/caustisc.mjs +0 -384
- package/esm2022/staging/spot-light/spot-light-shadow-mesh-input.mjs +0 -57
- package/esm2022/staging/spot-light/spot-light-shadow-mesh.mjs +0 -258
- package/fesm2022/angular-three-soba-performance.mjs +0 -487
- package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
- package/performance/README.md +0 -3
- package/performance/adaptive/adaptive-dpr.d.ts +0 -8
- package/performance/detailed/detailed.d.ts +0 -20
- package/performance/index.d.ts +0 -6
- package/performance/instances/instance.d.ts +0 -9
- package/performance/instances/instances.d.ts +0 -35
- package/performance/stats/stats.d.ts +0 -18
- package/plugin/generators.json +0 -19
- package/plugin/libs/plugin/README.md +0 -11
- package/plugin/package.json +0 -9
- package/plugin/src/generators/init/compat.d.ts +0 -2
- package/plugin/src/generators/init/compat.js +0 -6
- package/plugin/src/generators/init/compat.js.map +0 -1
- package/plugin/src/generators/init/init.d.ts +0 -7
- package/plugin/src/generators/init/init.js +0 -28
- package/plugin/src/generators/init/init.js.map +0 -1
- package/plugin/src/generators/init/schema.json +0 -6
- package/plugin/src/index.d.ts +0 -1
- package/plugin/src/index.js +0 -6
- package/plugin/src/index.js.map +0 -1
- package/staging/caustics/caustisc.d.ts +0 -70
- package/staging/spot-light/spot-light-shadow-mesh-input.d.ts +0 -29
- package/staging/spot-light/spot-light-shadow-mesh.d.ts +0 -38
- /package/shaders/{caustics-material → caustics}/caustics-material.d.ts +0 -0
- /package/shaders/{caustics-material → caustics}/caustics-projection-material.d.ts +0 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import { Component, ElementRef, TemplateRef, ViewChild, ViewContainerRef, computed, effect, inject, untracked, } from '@angular/core';
|
|
4
|
+
import { HTML, injectBeforeRender, injectNgtStore, is, safeDetectChanges } from 'angular-three';
|
|
5
|
+
import * as THREE from 'three';
|
|
6
|
+
import { injectNgtsHtmlInputs } from './html';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
const v1 = new THREE.Vector3();
|
|
9
|
+
const v2 = new THREE.Vector3();
|
|
10
|
+
const v3 = new THREE.Vector3();
|
|
11
|
+
export function defaultCalculatePosition(el, camera, size) {
|
|
12
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
13
|
+
objectPos.project(camera);
|
|
14
|
+
const widthHalf = size.width / 2;
|
|
15
|
+
const heightHalf = size.height / 2;
|
|
16
|
+
return [objectPos.x * widthHalf + widthHalf, -(objectPos.y * heightHalf) + heightHalf];
|
|
17
|
+
}
|
|
18
|
+
function isObjectBehindCamera(el, camera) {
|
|
19
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
20
|
+
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
21
|
+
const deltaCamObj = objectPos.sub(cameraPos);
|
|
22
|
+
const camDir = camera.getWorldDirection(v3);
|
|
23
|
+
return deltaCamObj.angleTo(camDir) > Math.PI / 2;
|
|
24
|
+
}
|
|
25
|
+
function isObjectVisible(el, camera, raycaster, occlude) {
|
|
26
|
+
const elPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
27
|
+
const screenPos = elPos.clone();
|
|
28
|
+
screenPos.project(camera);
|
|
29
|
+
raycaster.setFromCamera(screenPos, camera);
|
|
30
|
+
const intersects = raycaster.intersectObjects(occlude, true);
|
|
31
|
+
if (intersects.length) {
|
|
32
|
+
const intersectionDistance = intersects[0].distance;
|
|
33
|
+
const pointDistance = elPos.distanceTo(raycaster.ray.origin);
|
|
34
|
+
return pointDistance < intersectionDistance;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
function objectScale(el, camera) {
|
|
39
|
+
if (camera instanceof THREE.OrthographicCamera) {
|
|
40
|
+
return camera.zoom;
|
|
41
|
+
}
|
|
42
|
+
else if (camera instanceof THREE.PerspectiveCamera) {
|
|
43
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
44
|
+
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
45
|
+
const vFOV = (camera.fov * Math.PI) / 180;
|
|
46
|
+
const dist = objectPos.distanceTo(cameraPos);
|
|
47
|
+
const scaleFOV = 2 * Math.tan(vFOV / 2) * dist;
|
|
48
|
+
return 1 / scaleFOV;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function objectZIndex(el, camera, zIndexRange) {
|
|
55
|
+
if (camera instanceof THREE.PerspectiveCamera || camera instanceof THREE.OrthographicCamera) {
|
|
56
|
+
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
57
|
+
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
58
|
+
const dist = objectPos.distanceTo(cameraPos);
|
|
59
|
+
const A = (zIndexRange[1] - zIndexRange[0]) / (camera.far - camera.near);
|
|
60
|
+
const B = zIndexRange[1] - A * camera.far;
|
|
61
|
+
return Math.round(A * dist + B);
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const epsilon = (value) => (Math.abs(value) < 1e-10 ? 0 : value);
|
|
66
|
+
function getCSSMatrix(matrix, multipliers, prepend = '') {
|
|
67
|
+
let matrix3d = 'matrix3d(';
|
|
68
|
+
for (let i = 0; i !== 16; i++) {
|
|
69
|
+
matrix3d += epsilon(multipliers[i] * matrix.elements[i]) + (i !== 15 ? ',' : ')');
|
|
70
|
+
}
|
|
71
|
+
return prepend + matrix3d;
|
|
72
|
+
}
|
|
73
|
+
const getCameraCSSMatrix = ((multipliers) => {
|
|
74
|
+
return (matrix) => getCSSMatrix(matrix, multipliers);
|
|
75
|
+
})([1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1]);
|
|
76
|
+
const getObjectCSSMatrix = ((scaleMultipliers) => {
|
|
77
|
+
return (matrix, factor) => getCSSMatrix(matrix, scaleMultipliers(factor), 'translate(-50%,-50%)');
|
|
78
|
+
})((f) => [1 / f, 1 / f, 1 / f, 1, -1 / f, -1 / f, -1 / f, -1, 1 / f, 1 / f, 1 / f, 1, 1, 1, 1, 1]);
|
|
79
|
+
export class NgtsHtmlWrapper {
|
|
80
|
+
static { _a = HTML; }
|
|
81
|
+
static { this[_a] = true; }
|
|
82
|
+
constructor() {
|
|
83
|
+
this.htmlInputs = injectNgtsHtmlInputs();
|
|
84
|
+
this.store = injectNgtStore();
|
|
85
|
+
this.gl = this.store.select('gl');
|
|
86
|
+
this.connected = this.store.select('events', 'connected', { equal: Object.is });
|
|
87
|
+
this.viewport = this.store.select('viewport');
|
|
88
|
+
this.scene = this.store.select('scene');
|
|
89
|
+
this.camera = this.store.select('camera');
|
|
90
|
+
this.size = this.store.select('size');
|
|
91
|
+
this.raycaster = this.store.select('raycaster');
|
|
92
|
+
this.isMeshSizeSet = false;
|
|
93
|
+
this.document = inject(DOCUMENT);
|
|
94
|
+
this.vcr = inject(ViewContainerRef);
|
|
95
|
+
this.portalElement = computed(() => {
|
|
96
|
+
const portal = this.htmlInputs.portal();
|
|
97
|
+
if (!portal)
|
|
98
|
+
return null;
|
|
99
|
+
return is.ref(portal) ? portal.nativeElement : portal;
|
|
100
|
+
});
|
|
101
|
+
this.element = computed(() => this.document.createElement(this.htmlInputs.as()));
|
|
102
|
+
this.target = computed(() => {
|
|
103
|
+
const portalElement = this.portalElement();
|
|
104
|
+
if (portalElement)
|
|
105
|
+
return portalElement;
|
|
106
|
+
const connected = this.connected();
|
|
107
|
+
if (connected)
|
|
108
|
+
return connected;
|
|
109
|
+
return this.gl().domElement.parentElement;
|
|
110
|
+
});
|
|
111
|
+
this.styles = computed(() => {
|
|
112
|
+
const [style, center, transform, size, fullscreen] = [
|
|
113
|
+
this.htmlInputs.style(),
|
|
114
|
+
this.htmlInputs.center(),
|
|
115
|
+
this.htmlInputs.transform(),
|
|
116
|
+
this.size(),
|
|
117
|
+
this.htmlInputs.fullscreen(),
|
|
118
|
+
];
|
|
119
|
+
if (transform) {
|
|
120
|
+
return {
|
|
121
|
+
position: 'absolute',
|
|
122
|
+
top: 0,
|
|
123
|
+
left: 0,
|
|
124
|
+
width: size.width,
|
|
125
|
+
height: size.height,
|
|
126
|
+
transformStyle: 'preserve-3d',
|
|
127
|
+
pointerEvents: 'none',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
position: 'absolute',
|
|
132
|
+
transform: center ? 'translate3d(-50%,-50%,0)' : 'none',
|
|
133
|
+
...(fullscreen && {
|
|
134
|
+
top: -size.height / 2,
|
|
135
|
+
left: -size.width / 2,
|
|
136
|
+
width: size.width,
|
|
137
|
+
height: size.height,
|
|
138
|
+
}),
|
|
139
|
+
...(style || {}),
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
this.transformInnerStyles = computed(() => ({ position: 'absolute', pointerEvents: this.htmlInputs.pointerEvents() }));
|
|
143
|
+
this.setCanvasElementStyle();
|
|
144
|
+
this.appendElement();
|
|
145
|
+
this.setWrapperClass();
|
|
146
|
+
this.render();
|
|
147
|
+
this.beforeRender();
|
|
148
|
+
}
|
|
149
|
+
setCanvasElementStyle() {
|
|
150
|
+
effect(() => {
|
|
151
|
+
const el = untracked(this.gl).domElement;
|
|
152
|
+
const occlude = this.htmlInputs.occlude();
|
|
153
|
+
if (occlude && occlude === 'blending') {
|
|
154
|
+
el.style.zIndex = `${Math.floor(untracked(this.htmlInputs.zIndexRange)[0] / 2)}`;
|
|
155
|
+
el.style.position = 'absolute';
|
|
156
|
+
el.style.pointerEvents = 'none';
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
el.style.zIndex = null;
|
|
160
|
+
el.style.position = null;
|
|
161
|
+
el.style.pointerEvents = null;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
appendElement() {
|
|
166
|
+
effect((onCleanup) => {
|
|
167
|
+
const [group, element] = [this.htmlInputs.groupRef.nativeElement, this.element()];
|
|
168
|
+
if (group && element) {
|
|
169
|
+
const [target, transform, scene, camera, size, calculatePosition, prepend] = [
|
|
170
|
+
this.target(),
|
|
171
|
+
this.htmlInputs.transform(),
|
|
172
|
+
untracked(this.scene),
|
|
173
|
+
untracked(this.camera),
|
|
174
|
+
untracked(this.size),
|
|
175
|
+
untracked(this.htmlInputs.calculatePosition),
|
|
176
|
+
untracked(this.htmlInputs.prepend),
|
|
177
|
+
];
|
|
178
|
+
scene.updateMatrixWorld();
|
|
179
|
+
if (transform) {
|
|
180
|
+
element.style.cssText = `position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;`;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const vec = calculatePosition(group, camera, size);
|
|
184
|
+
element.style.cssText = `position:absolute;top:0;left:0;transform:translate3d(${vec[0]}px,${vec[1]}px,0);transform-origin:0 0;`;
|
|
185
|
+
}
|
|
186
|
+
if (target) {
|
|
187
|
+
if (prepend)
|
|
188
|
+
target.prepend(element);
|
|
189
|
+
else
|
|
190
|
+
target.appendChild(element);
|
|
191
|
+
}
|
|
192
|
+
onCleanup(() => {
|
|
193
|
+
if (target)
|
|
194
|
+
target.removeChild(element);
|
|
195
|
+
this.vcr.clear();
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
setWrapperClass() {
|
|
201
|
+
effect(() => {
|
|
202
|
+
const [element, wrapperClass] = [this.element(), this.htmlInputs.wrapperClass()];
|
|
203
|
+
if (element && wrapperClass) {
|
|
204
|
+
element.className = wrapperClass;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
render() {
|
|
209
|
+
effect((onCleanup) => {
|
|
210
|
+
const [{ transform }, element, content] = [
|
|
211
|
+
this.htmlInputs.state(),
|
|
212
|
+
this.element(),
|
|
213
|
+
this.htmlInputs.content(),
|
|
214
|
+
];
|
|
215
|
+
if (element) {
|
|
216
|
+
this.isMeshSizeSet = false;
|
|
217
|
+
const params = transform
|
|
218
|
+
? [this.transformTemplate, {}]
|
|
219
|
+
: [this.renderTemplate, { styles: this.styles }];
|
|
220
|
+
const ref = this.vcr.createEmbeddedView(...params);
|
|
221
|
+
if (ref.rootNodes?.[0]) {
|
|
222
|
+
if (element.hasChildNodes()) {
|
|
223
|
+
element.replaceChildren(...ref.rootNodes);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
element.append(...ref.rootNodes);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
safeDetectChanges(ref);
|
|
230
|
+
let contentRef;
|
|
231
|
+
let contentParent;
|
|
232
|
+
/**
|
|
233
|
+
* NOTE: utilizing rAF here so that renderAnchor (ViewContainerRef) has a chance to be resolved
|
|
234
|
+
* TODO: Another approach is to call render() in ngOnInit and pass in an injector to the effect
|
|
235
|
+
*/
|
|
236
|
+
const rAF = requestAnimationFrame(() => {
|
|
237
|
+
if (content && this.renderAnchor) {
|
|
238
|
+
contentRef = this.renderAnchor.createEmbeddedView(content);
|
|
239
|
+
contentParent = ref.rootNodes[0].lastElementChild || ref.rootNodes[0];
|
|
240
|
+
while (contentParent && contentParent.lastElementChild) {
|
|
241
|
+
contentParent = contentParent.lastElementChild;
|
|
242
|
+
}
|
|
243
|
+
if (contentRef.rootNodes?.[0]) {
|
|
244
|
+
if (contentParent.hasChildNodes()) {
|
|
245
|
+
contentParent.replaceChildren(...contentRef.rootNodes);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
contentParent.append(...contentRef.rootNodes);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
safeDetectChanges(contentRef);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
onCleanup(() => {
|
|
255
|
+
cancelAnimationFrame(rAF);
|
|
256
|
+
if (contentRef && contentParent) {
|
|
257
|
+
contentRef.rootNodes.forEach((node) => {
|
|
258
|
+
if (contentParent.hasChildNodes()) {
|
|
259
|
+
contentParent.removeChild(node);
|
|
260
|
+
}
|
|
261
|
+
node.remove();
|
|
262
|
+
});
|
|
263
|
+
contentRef.destroy();
|
|
264
|
+
}
|
|
265
|
+
ref.rootNodes.forEach((node) => {
|
|
266
|
+
if (element.hasChildNodes()) {
|
|
267
|
+
element.removeChild(node);
|
|
268
|
+
}
|
|
269
|
+
node.remove();
|
|
270
|
+
});
|
|
271
|
+
ref.destroy();
|
|
272
|
+
this.renderAnchor?.clear();
|
|
273
|
+
this.vcr.clear();
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
beforeRender() {
|
|
279
|
+
let oldPosition = [0, 0];
|
|
280
|
+
let oldZoom = 0;
|
|
281
|
+
let visible = true;
|
|
282
|
+
injectBeforeRender((gl) => {
|
|
283
|
+
const [group, camera, transform, calculatePosition, size, eps, isRayCastOcclusion, occlude, scene, raycaster, element, zIndexRange, sprite, distanceFactor, occlusionMeshRef, geometry, viewport, scale,] = [
|
|
284
|
+
this.htmlInputs.groupRef.nativeElement,
|
|
285
|
+
this.camera(),
|
|
286
|
+
this.htmlInputs.transform(),
|
|
287
|
+
this.htmlInputs.calculatePosition(),
|
|
288
|
+
this.size(),
|
|
289
|
+
this.htmlInputs.eps(),
|
|
290
|
+
this.htmlInputs.isRayCastOcclusion(),
|
|
291
|
+
this.htmlInputs.occlude(),
|
|
292
|
+
this.scene(),
|
|
293
|
+
this.raycaster(),
|
|
294
|
+
this.element(),
|
|
295
|
+
this.htmlInputs.zIndexRange(),
|
|
296
|
+
this.htmlInputs.sprite(),
|
|
297
|
+
this.htmlInputs.distanceFactor(),
|
|
298
|
+
this.htmlInputs.occlusionMeshRef.nativeElement,
|
|
299
|
+
this.htmlInputs.geometry(),
|
|
300
|
+
this.viewport(),
|
|
301
|
+
this.htmlInputs.scale(),
|
|
302
|
+
];
|
|
303
|
+
if (group && element) {
|
|
304
|
+
camera.updateMatrixWorld();
|
|
305
|
+
group.updateWorldMatrix(true, false);
|
|
306
|
+
const vec = transform ? oldPosition : calculatePosition(group, camera, size);
|
|
307
|
+
if (transform ||
|
|
308
|
+
Math.abs(oldZoom - camera.zoom) > eps ||
|
|
309
|
+
Math.abs(oldPosition[0] - vec[0]) > eps ||
|
|
310
|
+
Math.abs(oldPosition[1] - vec[1]) > eps) {
|
|
311
|
+
const isBehindCamera = isObjectBehindCamera(group, camera);
|
|
312
|
+
let raytraceTarget = false;
|
|
313
|
+
if (isRayCastOcclusion) {
|
|
314
|
+
if (occlude !== 'blending') {
|
|
315
|
+
raytraceTarget = [scene];
|
|
316
|
+
}
|
|
317
|
+
else if (Array.isArray(occlude)) {
|
|
318
|
+
raytraceTarget = occlude.map((item) => (is.ref(item) ? item.nativeElement : item));
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const previouslyVisible = visible;
|
|
322
|
+
if (raytraceTarget) {
|
|
323
|
+
const isVisible = isObjectVisible(group, camera, raycaster, raytraceTarget);
|
|
324
|
+
visible = isVisible && !isBehindCamera;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
visible = !isBehindCamera;
|
|
328
|
+
}
|
|
329
|
+
if (previouslyVisible !== visible) {
|
|
330
|
+
if (this.htmlInputs.occluded.observed) {
|
|
331
|
+
this.htmlInputs.occluded.emit(!visible);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
element.style.display = visible ? 'block' : 'none';
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const halfRange = Math.floor(zIndexRange[0] / 2);
|
|
338
|
+
const zRange = occlude
|
|
339
|
+
? isRayCastOcclusion //
|
|
340
|
+
? [zIndexRange[0], halfRange]
|
|
341
|
+
: [halfRange - 1, 0]
|
|
342
|
+
: zIndexRange;
|
|
343
|
+
element.style.zIndex = `${objectZIndex(group, camera, zRange)}`;
|
|
344
|
+
if (transform) {
|
|
345
|
+
const [widthHalf, heightHalf] = [size.width / 2, size.height / 2];
|
|
346
|
+
const fov = camera.projectionMatrix.elements[5] * heightHalf;
|
|
347
|
+
const { isOrthographicCamera, top, left, bottom, right } = camera;
|
|
348
|
+
const cameraMatrix = getCameraCSSMatrix(camera.matrixWorldInverse);
|
|
349
|
+
const cameraTransform = isOrthographicCamera
|
|
350
|
+
? `scale(${fov})translate(${epsilon(-(right + left) / 2)}px,${epsilon((top + bottom) / 2)}px)`
|
|
351
|
+
: `translateZ(${fov}px)`;
|
|
352
|
+
let matrix = group.matrixWorld;
|
|
353
|
+
if (sprite) {
|
|
354
|
+
matrix = camera.matrixWorldInverse
|
|
355
|
+
.clone()
|
|
356
|
+
.transpose()
|
|
357
|
+
.copyPosition(matrix)
|
|
358
|
+
.scale(group.scale);
|
|
359
|
+
matrix.elements[3] = matrix.elements[7] = matrix.elements[11] = 0;
|
|
360
|
+
matrix.elements[15] = 1;
|
|
361
|
+
}
|
|
362
|
+
element.style.width = size.width + 'px';
|
|
363
|
+
element.style.height = size.height + 'px';
|
|
364
|
+
element.style.perspective = isOrthographicCamera ? '' : `${fov}px`;
|
|
365
|
+
if (this.outerDiv?.nativeElement && this.innerDiv?.nativeElement) {
|
|
366
|
+
this.outerDiv.nativeElement.style.width = size.width + 'px';
|
|
367
|
+
this.outerDiv.nativeElement.style.height = size.height + 'px';
|
|
368
|
+
this.outerDiv.nativeElement.style.transform = `${cameraTransform}${cameraMatrix}translate(${widthHalf}px,${heightHalf}px)`;
|
|
369
|
+
this.innerDiv.nativeElement.style.transform = getObjectCSSMatrix(matrix, 1 / ((distanceFactor || 10) / 400));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
const scale = distanceFactor === undefined ? 1 : objectScale(group, camera) * distanceFactor;
|
|
374
|
+
element.style.transform = `translate3d(${vec[0]}px,${vec[1]}px,0) scale(${scale})`;
|
|
375
|
+
}
|
|
376
|
+
oldPosition = vec;
|
|
377
|
+
oldZoom = camera.zoom;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (!isRayCastOcclusion && occlusionMeshRef && !this.isMeshSizeSet) {
|
|
381
|
+
if (transform) {
|
|
382
|
+
if (this.outerDiv?.nativeElement) {
|
|
383
|
+
const el = this.outerDiv.nativeElement.children[0];
|
|
384
|
+
if (el?.clientWidth && el?.clientHeight) {
|
|
385
|
+
const { isOrthographicCamera } = camera;
|
|
386
|
+
if (isOrthographicCamera || geometry) {
|
|
387
|
+
if (scale !== 1) {
|
|
388
|
+
if (!Array.isArray(scale)) {
|
|
389
|
+
occlusionMeshRef.scale.setScalar(1 / scale);
|
|
390
|
+
}
|
|
391
|
+
else if (scale instanceof THREE.Vector3) {
|
|
392
|
+
occlusionMeshRef.scale.copy(scale.clone().divideScalar(1));
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
occlusionMeshRef.scale.set(1 / scale[0], 1 / scale[1], 1 / scale[2]);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
const ratio = (distanceFactor || 10) / 400;
|
|
401
|
+
const w = el.clientWidth * ratio;
|
|
402
|
+
const h = el.clientHeight * ratio;
|
|
403
|
+
occlusionMeshRef.scale.set(w, h, 1);
|
|
404
|
+
}
|
|
405
|
+
this.isMeshSizeSet = true;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const ele = element.children[0];
|
|
411
|
+
if (ele?.clientWidth && ele?.clientHeight) {
|
|
412
|
+
const ratio = 1 / viewport.factor;
|
|
413
|
+
const w = ele.clientWidth * ratio;
|
|
414
|
+
const h = ele.clientHeight * ratio;
|
|
415
|
+
occlusionMeshRef.scale.set(w, h, 1);
|
|
416
|
+
this.isMeshSizeSet = true;
|
|
417
|
+
}
|
|
418
|
+
occlusionMeshRef.lookAt(gl.camera.position);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsHtmlWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
424
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtsHtmlWrapper, isStandalone: true, selector: "ngts-html-wrapper", viewQueries: [{ propertyName: "transformTemplate", first: true, predicate: ["transformTemplate"], descendants: true, static: true }, { propertyName: "renderTemplate", first: true, predicate: ["renderTemplate"], descendants: true, static: true }, { propertyName: "outerDiv", first: true, predicate: ["transformedOuterDiv"], descendants: true }, { propertyName: "innerDiv", first: true, predicate: ["transformedInnerDiv"], descendants: true }, { propertyName: "renderAnchor", first: true, predicate: ["renderAnchor"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
|
|
425
|
+
<ng-template #transformTemplate>
|
|
426
|
+
<div #transformedOuterDiv [style]="styles()">
|
|
427
|
+
<div #transformedInnerDiv [style]="transformInnerStyles()">
|
|
428
|
+
<ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
|
|
429
|
+
</div>
|
|
430
|
+
</div>
|
|
431
|
+
</ng-template>
|
|
432
|
+
|
|
433
|
+
<ng-template #renderTemplate let-renderedStyles="styles">
|
|
434
|
+
<div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
|
|
435
|
+
<ng-container #renderAnchor />
|
|
436
|
+
</div>
|
|
437
|
+
</ng-template>
|
|
438
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
439
|
+
}
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsHtmlWrapper, decorators: [{
|
|
441
|
+
type: Component,
|
|
442
|
+
args: [{
|
|
443
|
+
selector: 'ngts-html-wrapper',
|
|
444
|
+
standalone: true,
|
|
445
|
+
template: `
|
|
446
|
+
<ng-template #transformTemplate>
|
|
447
|
+
<div #transformedOuterDiv [style]="styles()">
|
|
448
|
+
<div #transformedInnerDiv [style]="transformInnerStyles()">
|
|
449
|
+
<ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
</ng-template>
|
|
453
|
+
|
|
454
|
+
<ng-template #renderTemplate let-renderedStyles="styles">
|
|
455
|
+
<div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
|
|
456
|
+
<ng-container #renderAnchor />
|
|
457
|
+
</div>
|
|
458
|
+
</ng-template>
|
|
459
|
+
`,
|
|
460
|
+
imports: [NgTemplateOutlet],
|
|
461
|
+
}]
|
|
462
|
+
}], ctorParameters: function () { return []; }, propDecorators: { transformTemplate: [{
|
|
463
|
+
type: ViewChild,
|
|
464
|
+
args: ['transformTemplate', { static: true }]
|
|
465
|
+
}], renderTemplate: [{
|
|
466
|
+
type: ViewChild,
|
|
467
|
+
args: ['renderTemplate', { static: true }]
|
|
468
|
+
}], outerDiv: [{
|
|
469
|
+
type: ViewChild,
|
|
470
|
+
args: ['transformedOuterDiv']
|
|
471
|
+
}], innerDiv: [{
|
|
472
|
+
type: ViewChild,
|
|
473
|
+
args: ['transformedInnerDiv']
|
|
474
|
+
}], renderAnchor: [{
|
|
475
|
+
type: ViewChild,
|
|
476
|
+
args: ['renderAnchor', { read: ViewContainerRef }]
|
|
477
|
+
}] } });
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21pc2Mvc3JjL2h0bWwvaHRtbC13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBRVYsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7O0FBRTlDLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRS9CLE1BQU0sVUFBVSx3QkFBd0IsQ0FDdkMsRUFBa0IsRUFDbEIsTUFBb0IsRUFDcEIsSUFBdUM7SUFFdkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFN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LEVBQUUsSUFBSSxFQUFFO2dCQUVYLFFBQVE7c0JBQXpDLFNBQVM7dUJBQUMscUJBQXFCO2dCQUNFLFFBQVE7c0JBQXpDLFNBQVM7dUJBQUMscUJBQXFCO2dCQUN1QixZQUFZO3NCQUFsRSxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5ULCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0RW1iZWRkZWRWaWV3UmVmLFxuXHRUZW1wbGF0ZVJlZixcblx0Vmlld0NoaWxkLFxuXHRWaWV3Q29udGFpbmVyUmVmLFxuXHRjb21wdXRlZCxcblx0ZWZmZWN0LFxuXHRpbmplY3QsXG5cdHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIVE1MLCBpbmplY3RCZWZvcmVSZW5kZXIsIGluamVjdE5ndFN0b3JlLCBpcywgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGluamVjdE5ndHNIdG1sSW5wdXRzIH0gZnJvbSAnLi9odG1sJztcblxuY29uc3QgdjEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuY29uc3QgdjIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuY29uc3QgdjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uKFxuXHRlbDogVEhSRUUuT2JqZWN0M0QsXG5cdGNhbWVyYTogVEhSRUUuQ2FtZXJhLFxuXHRzaXplOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4pIHtcblx0Y29uc3Qgb2JqZWN0UG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0b2JqZWN0UG9zLnByb2plY3QoY2FtZXJhKTtcblx0Y29uc3Qgd2lkdGhIYWxmID0gc2l6ZS53aWR0aCAvIDI7XG5cdGNvbnN0IGhlaWdodEhhbGYgPSBzaXplLmhlaWdodCAvIDI7XG5cdHJldHVybiBbb2JqZWN0UG9zLnggKiB3aWR0aEhhbGYgKyB3aWR0aEhhbGYsIC0ob2JqZWN0UG9zLnkgKiBoZWlnaHRIYWxmKSArIGhlaWdodEhhbGZdO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdEJlaGluZENhbWVyYShlbDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSB7XG5cdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdGNvbnN0IGNhbWVyYVBvcyA9IHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRjb25zdCBkZWx0YUNhbU9iaiA9IG9iamVjdFBvcy5zdWIoY2FtZXJhUG9zKTtcblx0Y29uc3QgY2FtRGlyID0gY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHYzKTtcblx0cmV0dXJuIGRlbHRhQ2FtT2JqLmFuZ2xlVG8oY2FtRGlyKSA+IE1hdGguUEkgLyAyO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdFZpc2libGUoXG5cdGVsOiBUSFJFRS5PYmplY3QzRCxcblx0Y2FtZXJhOiBUSFJFRS5DYW1lcmEsXG5cdHJheWNhc3RlcjogVEhSRUUuUmF5Y2FzdGVyLFxuXHRvY2NsdWRlOiBUSFJFRS5PYmplY3QzRFtdLFxuKSB7XG5cdGNvbnN0IGVsUG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0Y29uc3Qgc2NyZWVuUG9zID0gZWxQb3MuY2xvbmUoKTtcblx0c2NyZWVuUG9zLnByb2plY3QoY2FtZXJhKTtcblx0cmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoc2NyZWVuUG9zIGFzIGFueSwgY2FtZXJhKTtcblx0Y29uc3QgaW50ZXJzZWN0cyA9IHJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKG9jY2x1ZGUsIHRydWUpO1xuXHRpZiAoaW50ZXJzZWN0cy5sZW5ndGgpIHtcblx0XHRjb25zdCBpbnRlcnNlY3Rpb25EaXN0YW5jZSA9IGludGVyc2VjdHNbMF0uZGlzdGFuY2U7XG5cdFx0Y29uc3QgcG9pbnREaXN0YW5jZSA9IGVsUG9zLmRpc3RhbmNlVG8ocmF5Y2FzdGVyLnJheS5vcmlnaW4pO1xuXHRcdHJldHVybiBwb2ludERpc3RhbmNlIDwgaW50ZXJzZWN0aW9uRGlzdGFuY2U7XG5cdH1cblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG9iamVjdFNjYWxlKGVsOiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhOiBUSFJFRS5DYW1lcmEpIHtcblx0aWYgKGNhbWVyYSBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuXHRcdHJldHVybiBjYW1lcmEuem9vbTtcblx0fSBlbHNlIGlmIChjYW1lcmEgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSkge1xuXHRcdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgdkZPViA9IChjYW1lcmEuZm92ICogTWF0aC5QSSkgLyAxODA7XG5cdFx0Y29uc3QgZGlzdCA9IG9iamVjdFBvcy5kaXN0YW5jZVRvKGNhbWVyYVBvcyk7XG5cdFx0Y29uc3Qgc2NhbGVGT1YgPSAyICogTWF0aC50YW4odkZPViAvIDIpICogZGlzdDtcblx0XHRyZXR1cm4gMSAvIHNjYWxlRk9WO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAxO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG9iamVjdFpJbmRleChlbDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYTogVEhSRUUuQ2FtZXJhLCB6SW5kZXhSYW5nZTogQXJyYXk8bnVtYmVyPikge1xuXHRpZiAoY2FtZXJhIGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEgfHwgY2FtZXJhIGluc3RhbmNlb2YgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKSB7XG5cdFx0Y29uc3Qgb2JqZWN0UG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0XHRjb25zdCBjYW1lcmFQb3MgPSB2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2FtZXJhLm1hdHJpeFdvcmxkKTtcblx0XHRjb25zdCBkaXN0ID0gb2JqZWN0UG9zLmRpc3RhbmNlVG8oY2FtZXJhUG9zKTtcblx0XHRjb25zdCBBID0gKHpJbmRleFJhbmdlWzFdIC0gekluZGV4UmFuZ2VbMF0pIC8gKGNhbWVyYS5mYXIgLSBjYW1lcmEubmVhcik7XG5cdFx0Y29uc3QgQiA9IHpJbmRleFJhbmdlWzFdIC0gQSAqIGNhbWVyYS5mYXI7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoQSAqIGRpc3QgKyBCKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBlcHNpbG9uID0gKHZhbHVlOiBudW1iZXIpID0+IChNYXRoLmFicyh2YWx1ZSkgPCAxZS0xMCA/IDAgOiB2YWx1ZSk7XG5cbmZ1bmN0aW9uIGdldENTU01hdHJpeChtYXRyaXg6IFRIUkVFLk1hdHJpeDQsIG11bHRpcGxpZXJzOiBudW1iZXJbXSwgcHJlcGVuZCA9ICcnKSB7XG5cdGxldCBtYXRyaXgzZCA9ICdtYXRyaXgzZCgnO1xuXHRmb3IgKGxldCBpID0gMDsgaSAhPT0gMTY7IGkrKykge1xuXHRcdG1hdHJpeDNkICs9IGVwc2lsb24obXVsdGlwbGllcnNbaV0gKiBtYXRyaXguZWxlbWVudHNbaV0pICsgKGkgIT09IDE1ID8gJywnIDogJyknKTtcblx0fVxuXHRyZXR1cm4gcHJlcGVuZCArIG1hdHJpeDNkO1xufVxuXG5jb25zdCBnZXRDYW1lcmFDU1NNYXRyaXggPSAoKG11bHRpcGxpZXJzOiBudW1iZXJbXSkgPT4ge1xuXHRyZXR1cm4gKG1hdHJpeDogVEhSRUUuTWF0cml4NCkgPT4gZ2V0Q1NTTWF0cml4KG1hdHJpeCwgbXVsdGlwbGllcnMpO1xufSkoWzEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAxLCAxXSk7XG5cbmNvbnN0IGdldE9iamVjdENTU01hdHJpeCA9ICgoc2NhbGVNdWx0aXBsaWVyczogKG46IG51bWJlcikgPT4gbnVtYmVyW10pID0+IHtcblx0cmV0dXJuIChtYXRyaXg6IFRIUkVFLk1hdHJpeDQsIGZhY3RvcjogbnVtYmVyKSA9PlxuXHRcdGdldENTU01hdHJpeChtYXRyaXgsIHNjYWxlTXVsdGlwbGllcnMoZmFjdG9yKSwgJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJyk7XG59KSgoZjogbnVtYmVyKSA9PiBbMSAvIGYsIDEgLyBmLCAxIC8gZiwgMSwgLTEgLyBmLCAtMSAvIGYsIC0xIC8gZiwgLTEsIDEgLyBmLCAxIC8gZiwgMSAvIGYsIDEsIDEsIDEsIDEsIDFdKTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1odG1sLXdyYXBwZXInLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZy10ZW1wbGF0ZSAjdHJhbnNmb3JtVGVtcGxhdGU+XG5cdFx0XHQ8ZGl2ICN0cmFuc2Zvcm1lZE91dGVyRGl2IFtzdHlsZV09XCJzdHlsZXMoKVwiPlxuXHRcdFx0XHQ8ZGl2ICN0cmFuc2Zvcm1lZElubmVyRGl2IFtzdHlsZV09XCJ0cmFuc2Zvcm1Jbm5lclN0eWxlcygpXCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbmRlclRlbXBsYXRlOyBjb250ZXh0OiB7IHN0eWxlczogaHRtbElucHV0cy5zdHlsZSB9XCIgLz5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXG5cdFx0PG5nLXRlbXBsYXRlICNyZW5kZXJUZW1wbGF0ZSBsZXQtcmVuZGVyZWRTdHlsZXM9XCJzdHlsZXNcIj5cblx0XHRcdDxkaXYgI3JlbmRlcmVkRGl2IFtjbGFzc109XCJodG1sSW5wdXRzLnJlbmRlcmVkRGl2Q2xhc3MoKVwiIFtzdHlsZV09XCJyZW5kZXJlZFN0eWxlcygpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgI3JlbmRlckFuY2hvciAvPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0YCxcblx0aW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzSHRtbFdyYXBwZXIge1xuXHRzdGF0aWMgW0hUTUxdID0gdHJ1ZTtcblxuXHRodG1sSW5wdXRzID0gaW5qZWN0Tmd0c0h0bWxJbnB1dHMoKTtcblxuXHRAVmlld0NoaWxkKCd0cmFuc2Zvcm1UZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHRyYW5zZm9ybVRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cdEBWaWV3Q2hpbGQoJ3JlbmRlclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcmVuZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuXHRAVmlld0NoaWxkKCd0cmFuc2Zvcm1lZE91dGVyRGl2Jykgb3V0ZXJEaXY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pjtcblx0QFZpZXdDaGlsZCgndHJhbnNmb3JtZWRJbm5lckRpdicpIGlubmVyRGl2PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cdEBWaWV3Q2hpbGQoJ3JlbmRlckFuY2hvcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSByZW5kZXJBbmNob3I/OiBWaWV3Q29udGFpbmVyUmVmO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3ROZ3RTdG9yZSgpO1xuXHRwcml2YXRlIGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2V2ZW50cycsICdjb25uZWN0ZWQnLCB7IGVxdWFsOiBPYmplY3QuaXMgfSk7XG5cdHByaXZhdGUgdmlld3BvcnQgPSB0aGlzLnN0b3JlLnNlbGVjdCgndmlld3BvcnQnKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRwcml2YXRlIGNhbWVyYSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjYW1lcmEnKTtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0cHJpdmF0ZSByYXljYXN0ZXIgPSB0aGlzLnN0b3JlLnNlbGVjdCgncmF5Y2FzdGVyJyk7XG5cblx0cHJpdmF0ZSBpc01lc2hTaXplU2V0ID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG5cdHByaXZhdGUgdmNyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXG5cdHByaXZhdGUgcG9ydGFsRWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBwb3J0YWwgPSB0aGlzLmh0bWxJbnB1dHMucG9ydGFsKCk7XG5cdFx0aWYgKCFwb3J0YWwpIHJldHVybiBudWxsO1xuXHRcdHJldHVybiBpcy5yZWYocG9ydGFsKSA/IHBvcnRhbC5uYXRpdmVFbGVtZW50IDogcG9ydGFsO1xuXHR9KTtcblxuXHRwcml2YXRlIGVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5odG1sSW5wdXRzLmFzKCkpIGFzIEhUTUxFbGVtZW50KTtcblx0cHJpdmF0ZSB0YXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcG9ydGFsRWxlbWVudCA9IHRoaXMucG9ydGFsRWxlbWVudCgpO1xuXHRcdGlmIChwb3J0YWxFbGVtZW50KSByZXR1cm4gcG9ydGFsRWxlbWVudDtcblx0XHRjb25zdCBjb25uZWN0ZWQgPSB0aGlzLmNvbm5lY3RlZCgpO1xuXHRcdGlmIChjb25uZWN0ZWQpIHJldHVybiBjb25uZWN0ZWQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0cmV0dXJuIHRoaXMuZ2woKS5kb21FbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuXHR9KTtcblxuXHRzdHlsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW3N0eWxlLCBjZW50ZXIsIHRyYW5zZm9ybSwgc2l6ZSwgZnVsbHNjcmVlbl0gPSBbXG5cdFx0XHR0aGlzLmh0bWxJbnB1dHMuc3R5bGUoKSxcblx0XHRcdHRoaXMuaHRtbElucHV0cy5jZW50ZXIoKSxcblx0XHRcdHRoaXMuaHRtbElucHV0cy50cmFuc2Zvcm0oKSxcblx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0dGhpcy5odG1sSW5wdXRzLmZ1bGxzY3JlZW4oKSxcblx0XHRdO1xuXG5cdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cG9zaXRpb246ICdhYnNvbHV0ZScsXG5cdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0d2lkdGg6IHNpemUud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogc2l6ZS5oZWlnaHQsXG5cdFx0XHRcdHRyYW5zZm9ybVN0eWxlOiAncHJlc2VydmUtM2QnLFxuXHRcdFx0XHRwb2ludGVyRXZlbnRzOiAnbm9uZScsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcblx0XHRcdHRyYW5zZm9ybTogY2VudGVyID8gJ3RyYW5zbGF0ZTNkKC01MCUsLTUwJSwwKScgOiAnbm9uZScsXG5cdFx0XHQuLi4oZnVsbHNjcmVlbiAmJiB7XG5cdFx0XHRcdHRvcDogLXNpemUuaGVpZ2h0IC8gMixcblx0XHRcdFx0bGVmdDogLXNpemUud2lkdGggLyAyLFxuXHRcdFx0XHR3aWR0aDogc2l6ZS53aWR0aCxcblx0XHRcdFx0aGVpZ2h0OiBzaXplLmhlaWdodCxcblx0XHRcdH0pLFxuXHRcdFx0Li4uKHN0eWxlIHx8IHt9KSxcblx0XHR9O1xuXHR9KTtcblx0dHJhbnNmb3JtSW5uZXJTdHlsZXMgPSBjb21wdXRlZCgoKSA9PiAoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgcG9pbnRlckV2ZW50czogdGhpcy5odG1sSW5wdXRzLnBvaW50ZXJFdmVudHMoKSB9KSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5zZXRDYW52YXNFbGVtZW50U3R5bGUoKTtcblx0XHR0aGlzLmFwcGVuZEVsZW1lbnQoKTtcblx0XHR0aGlzLnNldFdyYXBwZXJDbGFzcygpO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0Q2FudmFzRWxlbWVudFN0eWxlKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBlbCA9IHVudHJhY2tlZCh0aGlzLmdsKS5kb21FbGVtZW50ITtcblx0XHRcdGNvbnN0IG9jY2x1ZGUgPSB0aGlzLmh0bWxJbnB1dHMub2NjbHVkZSgpO1xuXHRcdFx0aWYgKG9jY2x1ZGUgJiYgb2NjbHVkZSA9PT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRlbC5zdHlsZS56SW5kZXggPSBgJHtNYXRoLmZsb29yKHVudHJhY2tlZCh0aGlzLmh0bWxJbnB1dHMuekluZGV4UmFuZ2UpWzBdIC8gMil9YDtcblx0XHRcdFx0ZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0XHRlbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWwuc3R5bGUuekluZGV4ID0gbnVsbCE7XG5cdFx0XHRcdGVsLnN0eWxlLnBvc2l0aW9uID0gbnVsbCE7XG5cdFx0XHRcdGVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBudWxsITtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYXBwZW5kRWxlbWVudCgpIHtcblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgW2dyb3VwLCBlbGVtZW50XSA9IFt0aGlzLmh0bWxJbnB1dHMuZ3JvdXBSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5lbGVtZW50KCldO1xuXHRcdFx0aWYgKGdyb3VwICYmIGVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3QgW3RhcmdldCwgdHJhbnNmb3JtLCBzY2VuZSwgY2FtZXJhLCBzaXplLCBjYWxjdWxhdGVQb3NpdGlvbiwgcHJlcGVuZF0gPSBbXG5cdFx0XHRcdFx0dGhpcy50YXJnZXQoKSxcblx0XHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMudHJhbnNmb3JtKCksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuc2NlbmUpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmNhbWVyYSksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuc2l6ZSksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuaHRtbElucHV0cy5jYWxjdWxhdGVQb3NpdGlvbiksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuaHRtbElucHV0cy5wcmVwZW5kKSxcblx0XHRcdFx0XTtcblx0XHRcdFx0c2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cG9pbnRlci1ldmVudHM6bm9uZTtvdmVyZmxvdzpoaWRkZW47YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB2ZWMgPSBjYWxjdWxhdGVQb3NpdGlvbihncm91cCwgY2FtZXJhLCBzaXplKTtcblx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgcG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgke3ZlY1swXX1weCwke3ZlY1sxXX1weCwwKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDtgO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhcmdldCkge1xuXHRcdFx0XHRcdGlmIChwcmVwZW5kKSB0YXJnZXQucHJlcGVuZChlbGVtZW50KTtcblx0XHRcdFx0XHRlbHNlIHRhcmdldC5hcHBlbmRDaGlsZChlbGVtZW50KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHRhcmdldCkgdGFyZ2V0LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuXHRcdFx0XHRcdHRoaXMudmNyLmNsZWFyKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRXcmFwcGVyQ2xhc3MoKSB7XG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IFtlbGVtZW50LCB3cmFwcGVyQ2xhc3NdID0gW3RoaXMuZWxlbWVudCgpLCB0aGlzLmh0bWxJbnB1dHMud3JhcHBlckNsYXNzKCldO1xuXHRcdFx0aWYgKGVsZW1lbnQgJiYgd3JhcHBlckNsYXNzKSB7XG5cdFx0XHRcdGVsZW1lbnQuY2xhc3NOYW1lID0gd3JhcHBlckNsYXNzO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXIoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IFt7IHRyYW5zZm9ybSB9LCBlbGVtZW50LCBjb250ZW50XSA9IFtcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnN0YXRlKCksXG5cdFx0XHRcdHRoaXMuZWxlbWVudCgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuY29udGVudCgpLFxuXHRcdFx0XTtcblxuXHRcdFx0aWYgKGVsZW1lbnQpIHtcblx0XHRcdFx0dGhpcy5pc01lc2hTaXplU2V0ID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IHBhcmFtczogUGFyYW1ldGVyczxWaWV3Q29udGFpbmVyUmVmWydjcmVhdGVFbWJlZGRlZFZpZXcnXT4gPSB0cmFuc2Zvcm1cblx0XHRcdFx0XHQ/IFt0aGlzLnRyYW5zZm9ybVRlbXBsYXRlLCB7fV1cblx0XHRcdFx0XHQ6IFt0aGlzLnJlbmRlclRlbXBsYXRlLCB7IHN0eWxlczogdGhpcy5zdHlsZXMgfV07XG5cblx0XHRcdFx0Y29uc3QgcmVmID0gdGhpcy52Y3IuY3JlYXRlRW1iZWRkZWRWaWV3KC4uLnBhcmFtcyk7XG5cdFx0XHRcdGlmIChyZWYucm9vdE5vZGVzPy5bMF0pIHtcblx0XHRcdFx0XHRpZiAoZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRcdGVsZW1lbnQucmVwbGFjZUNoaWxkcmVuKC4uLnJlZi5yb290Tm9kZXMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlbGVtZW50LmFwcGVuZCguLi5yZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c2FmZURldGVjdENoYW5nZXMocmVmKTtcblxuXHRcdFx0XHRsZXQgY29udGVudFJlZjogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXHRcdFx0XHRsZXQgY29udGVudFBhcmVudDogSFRNTEVsZW1lbnQ7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOT1RFOiB1dGlsaXppbmcgckFGIGhlcmUgc28gdGhhdCByZW5kZXJBbmNob3IgKFZpZXdDb250YWluZXJSZWYpIGhhcyBhIGNoYW5jZSB0byBiZSByZXNvbHZlZFxuXHRcdFx0XHQgKiBUT0RPOiBBbm90aGVyIGFwcHJvYWNoIGlzIHRvIGNhbGwgcmVuZGVyKCkgaW4gbmdPbkluaXQgYW5kIHBhc3MgaW4gYW4gaW5qZWN0b3IgdG8gdGhlIGVmZmVjdFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y29uc3QgckFGID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRpZiAoY29udGVudCAmJiB0aGlzLnJlbmRlckFuY2hvcikge1xuXHRcdFx0XHRcdFx0Y29udGVudFJlZiA9IHRoaXMucmVuZGVyQW5jaG9yLmNyZWF0ZUVtYmVkZGVkVmlldyhjb250ZW50KTtcblx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQgPSByZWYucm9vdE5vZGVzWzBdLmxhc3RFbGVtZW50Q2hpbGQgfHwgcmVmLnJvb3ROb2Rlc1swXTtcblx0XHRcdFx0XHRcdHdoaWxlIChjb250ZW50UGFyZW50ICYmIGNvbnRlbnRQYXJlbnQubGFzdEVsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdFx0XHRjb250ZW50UGFyZW50ID0gY29udGVudFBhcmVudC5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGNvbnRlbnRSZWYucm9vdE5vZGVzPy5bMF0pIHtcblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnRQYXJlbnQuaGFzQ2hpbGROb2RlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudFBhcmVudC5yZXBsYWNlQ2hpbGRyZW4oLi4uY29udGVudFJlZi5yb290Tm9kZXMpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQuYXBwZW5kKC4uLmNvbnRlbnRSZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0c2FmZURldGVjdENoYW5nZXMoY29udGVudFJlZik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJBRik7XG5cblx0XHRcdFx0XHRpZiAoY29udGVudFJlZiAmJiBjb250ZW50UGFyZW50KSB7XG5cdFx0XHRcdFx0XHRjb250ZW50UmVmLnJvb3ROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50UGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRjb250ZW50UmVmLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZWYucm9vdE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZWYuZGVzdHJveSgpO1xuXHRcdFx0XHRcdHRoaXMucmVuZGVyQW5jaG9yPy5jbGVhcigpO1xuXHRcdFx0XHRcdHRoaXMudmNyLmNsZWFyKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XG5cdFx0bGV0IG9sZFBvc2l0aW9uID0gWzAsIDBdO1xuXHRcdGxldCBvbGRab29tID0gMDtcblx0XHRsZXQgdmlzaWJsZSA9IHRydWU7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKChnbCkgPT4ge1xuXHRcdFx0Y29uc3QgW1xuXHRcdFx0XHRncm91cCxcblx0XHRcdFx0Y2FtZXJhLFxuXHRcdFx0XHR0cmFuc2Zvcm0sXG5cdFx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0XHRzaXplLFxuXHRcdFx0XHRlcHMsXG5cdFx0XHRcdGlzUmF5Q2FzdE9jY2x1c2lvbixcblx0XHRcdFx0b2NjbHVkZSxcblx0XHRcdFx0c2NlbmUsXG5cdFx0XHRcdHJheWNhc3Rlcixcblx0XHRcdFx0ZWxlbWVudCxcblx0XHRcdFx0ekluZGV4UmFuZ2UsXG5cdFx0XHRcdHNwcml0ZSxcblx0XHRcdFx0ZGlzdGFuY2VGYWN0b3IsXG5cdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYsXG5cdFx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0XHR2aWV3cG9ydCxcblx0XHRcdFx0c2NhbGUsXG5cdFx0XHRdID0gW1xuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuZ3JvdXBSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5jYW1lcmEoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnRyYW5zZm9ybSgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuY2FsY3VsYXRlUG9zaXRpb24oKSxcblx0XHRcdFx0dGhpcy5zaXplKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5lcHMoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmlzUmF5Q2FzdE9jY2x1c2lvbigpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMub2NjbHVkZSgpLFxuXHRcdFx0XHR0aGlzLnNjZW5lKCksXG5cdFx0XHRcdHRoaXMucmF5Y2FzdGVyKCksXG5cdFx0XHRcdHRoaXMuZWxlbWVudCgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuekluZGV4UmFuZ2UoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnNwcml0ZSgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuZGlzdGFuY2VGYWN0b3IoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLm9jY2x1c2lvbk1lc2hSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmdlb21ldHJ5KCksXG5cdFx0XHRcdHRoaXMudmlld3BvcnQoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnNjYWxlKCksXG5cdFx0XHRdO1xuXHRcdFx0aWYgKGdyb3VwICYmIGVsZW1lbnQpIHtcblx0XHRcdFx0Y2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdGdyb3VwLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0Y29uc3QgdmVjID0gdHJhbnNmb3JtID8gb2xkUG9zaXRpb24gOiBjYWxjdWxhdGVQb3NpdGlvbihncm91cCwgY2FtZXJhLCBzaXplKTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dHJhbnNmb3JtIHx8XG5cdFx0XHRcdFx0TWF0aC5hYnMob2xkWm9vbSAtIGNhbWVyYS56b29tKSA+IGVwcyB8fFxuXHRcdFx0XHRcdE1hdGguYWJzKG9sZFBvc2l0aW9uWzBdIC0gdmVjWzBdKSA+IGVwcyB8fFxuXHRcdFx0XHRcdE1hdGguYWJzKG9sZFBvc2l0aW9uWzFdIC0gdmVjWzFdKSA+IGVwc1xuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCBpc0JlaGluZENhbWVyYSA9IGlzT2JqZWN0QmVoaW5kQ2FtZXJhKGdyb3VwLCBjYW1lcmEpO1xuXHRcdFx0XHRcdGxldCByYXl0cmFjZVRhcmdldDogbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBUSFJFRS5PYmplY3QzRFtdID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoaXNSYXlDYXN0T2NjbHVzaW9uKSB7XG5cdFx0XHRcdFx0XHRpZiAob2NjbHVkZSAhPT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRcdFx0XHRyYXl0cmFjZVRhcmdldCA9IFtzY2VuZV07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2NjbHVkZSkpIHtcblx0XHRcdFx0XHRcdFx0cmF5dHJhY2VUYXJnZXQgPSBvY2NsdWRlLm1hcCgoaXRlbSkgPT4gKGlzLnJlZihpdGVtKSA/IGl0ZW0ubmF0aXZlRWxlbWVudCA6IGl0ZW0pKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBwcmV2aW91c2x5VmlzaWJsZSA9IHZpc2libGU7XG5cdFx0XHRcdFx0aWYgKHJheXRyYWNlVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpc1Zpc2libGUgPSBpc09iamVjdFZpc2libGUoZ3JvdXAsIGNhbWVyYSwgcmF5Y2FzdGVyLCByYXl0cmFjZVRhcmdldCk7XG5cdFx0XHRcdFx0XHR2aXNpYmxlID0gaXNWaXNpYmxlICYmICFpc0JlaGluZENhbWVyYTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmlzaWJsZSA9ICFpc0JlaGluZENhbWVyYTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocHJldmlvdXNseVZpc2libGUgIT09IHZpc2libGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmh0bWxJbnB1dHMub2NjbHVkZWQub2JzZXJ2ZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLm9jY2x1ZGVkLmVtaXQoIXZpc2libGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZSc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgaGFsZlJhbmdlID0gTWF0aC5mbG9vcih6SW5kZXhSYW5nZVswXSAvIDIpO1xuXHRcdFx0XHRcdGNvbnN0IHpSYW5nZSA9IG9jY2x1ZGVcblx0XHRcdFx0XHRcdD8gaXNSYXlDYXN0T2NjbHVzaW9uIC8vXG5cdFx0XHRcdFx0XHRcdD8gW3pJbmRleFJhbmdlWzBdLCBoYWxmUmFuZ2VdXG5cdFx0XHRcdFx0XHRcdDogW2hhbGZSYW5nZSAtIDEsIDBdXG5cdFx0XHRcdFx0XHQ6IHpJbmRleFJhbmdlO1xuXG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSBgJHtvYmplY3RaSW5kZXgoZ3JvdXAsIGNhbWVyYSwgelJhbmdlKX1gO1xuXG5cdFx0XHRcdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgW3dpZHRoSGFsZiwgaGVpZ2h0SGFsZl0gPSBbc2l6ZS53aWR0aCAvIDIsIHNpemUuaGVpZ2h0IC8gMl07XG5cdFx0XHRcdFx0XHRjb25zdCBmb3YgPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s1XSAqIGhlaWdodEhhbGY7XG5cdFx0XHRcdFx0XHRjb25zdCB7IGlzT3J0aG9ncmFwaGljQ2FtZXJhLCB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQgfSA9IGNhbWVyYSBhcyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmE7XG5cdFx0XHRcdFx0XHRjb25zdCBjYW1lcmFNYXRyaXggPSBnZXRDYW1lcmFDU1NNYXRyaXgoY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG5cdFx0XHRcdFx0XHRjb25zdCBjYW1lcmFUcmFuc2Zvcm0gPSBpc09ydGhvZ3JhcGhpY0NhbWVyYVxuXHRcdFx0XHRcdFx0XHQ/IGBzY2FsZSgke2Zvdn0pdHJhbnNsYXRlKCR7ZXBzaWxvbigtKHJpZ2h0ICsgbGVmdCkgLyAyKX1weCwke2Vwc2lsb24oXG5cdFx0XHRcdFx0XHRcdFx0XHQodG9wICsgYm90dG9tKSAvIDIsXG5cdFx0XHRcdFx0XHRcdCAgKX1weClgXG5cdFx0XHRcdFx0XHRcdDogYHRyYW5zbGF0ZVooJHtmb3Z9cHgpYDtcblx0XHRcdFx0XHRcdGxldCBtYXRyaXggPSBncm91cC5tYXRyaXhXb3JsZDtcblx0XHRcdFx0XHRcdGlmIChzcHJpdGUpIHtcblx0XHRcdFx0XHRcdFx0bWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZVxuXHRcdFx0XHRcdFx0XHRcdC5jbG9uZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnRyYW5zcG9zZSgpXG5cdFx0XHRcdFx0XHRcdFx0LmNvcHlQb3NpdGlvbihtYXRyaXgpXG5cdFx0XHRcdFx0XHRcdFx0LnNjYWxlKGdyb3VwLnNjYWxlKTtcblx0XHRcdFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWzNdID0gbWF0cml4LmVsZW1lbnRzWzddID0gbWF0cml4LmVsZW1lbnRzWzExXSA9IDA7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sxNV0gPSAxO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7XG5cdFx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLnBlcnNwZWN0aXZlID0gaXNPcnRob2dyYXBoaWNDYW1lcmEgPyAnJyA6IGAke2Zvdn1weGA7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5vdXRlckRpdj8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmlubmVyRGl2Py5uYXRpdmVFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMub3V0ZXJEaXYubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyAncHgnO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYCR7Y2FtZXJhVHJhbnNmb3JtfSR7Y2FtZXJhTWF0cml4fXRyYW5zbGF0ZSgke3dpZHRoSGFsZn1weCwke2hlaWdodEhhbGZ9cHgpYDtcblx0XHRcdFx0XHRcdFx0dGhpcy5pbm5lckRpdi5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGdldE9iamVjdENTU01hdHJpeChcblx0XHRcdFx0XHRcdFx0XHRtYXRyaXgsXG5cdFx0XHRcdFx0XHRcdFx0MSAvICgoZGlzdGFuY2VGYWN0b3IgfHwgMTApIC8gNDAwKSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBkaXN0YW5jZUZhY3RvciA9PT0gdW5kZWZpbmVkID8gMSA6IG9iamVjdFNjYWxlKGdyb3VwLCBjYW1lcmEpICogZGlzdGFuY2VGYWN0b3I7XG5cdFx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3ZlY1swXX1weCwke3ZlY1sxXX1weCwwKSBzY2FsZSgke3NjYWxlfSlgO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvbGRQb3NpdGlvbiA9IHZlYztcblx0XHRcdFx0XHRvbGRab29tID0gY2FtZXJhLnpvb207XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc1JheUNhc3RPY2NsdXNpb24gJiYgb2NjbHVzaW9uTWVzaFJlZiAmJiAhdGhpcy5pc01lc2hTaXplU2V0KSB7XG5cdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRpZiAodGhpcy5vdXRlckRpdj8ubmF0aXZlRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZWwgPSB0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF07XG5cblx0XHRcdFx0XHRcdGlmIChlbD8uY2xpZW50V2lkdGggJiYgZWw/LmNsaWVudEhlaWdodCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7IGlzT3J0aG9ncmFwaGljQ2FtZXJhIH0gPSBjYW1lcmEgYXMgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChpc09ydGhvZ3JhcGhpY0NhbWVyYSB8fCBnZW9tZXRyeSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzY2FsZSAhPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KHNjYWxlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLnNjYWxlLnNldFNjYWxhcigxIC8gKHNjYWxlIGFzIG51bWJlcikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzY2FsZSBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaFJlZi5zY2FsZS5jb3B5KHNjYWxlLmNsb25lKCkuZGl2aWRlU2NhbGFyKDEpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuc2V0KDEgLyBzY2FsZVswXSwgMSAvIHNjYWxlWzFdLCAxIC8gc2NhbGVbMl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByYXRpbyA9IChkaXN0YW5jZUZhY3RvciB8fCAxMCkgLyA0MDA7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdyA9IGVsLmNsaWVudFdpZHRoICogcmF0aW87XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaCA9IGVsLmNsaWVudEhlaWdodCAqIHJhdGlvO1xuXG5cdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaFJlZi5zY2FsZS5zZXQodywgaCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLmlzTWVzaFNpemVTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBlbGUgPSBlbGVtZW50LmNoaWxkcmVuWzBdO1xuXG5cdFx0XHRcdFx0aWYgKGVsZT8uY2xpZW50V2lkdGggJiYgZWxlPy5jbGllbnRIZWlnaHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJhdGlvID0gMSAvIHZpZXdwb3J0LmZhY3Rvcjtcblx0XHRcdFx0XHRcdGNvbnN0IHcgPSBlbGUuY2xpZW50V2lkdGggKiByYXRpbztcblx0XHRcdFx0XHRcdGNvbnN0IGggPSBlbGUuY2xpZW50SGVpZ2h0ICogcmF0aW87XG5cblx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuc2V0KHcsIGgsIDEpO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmlzTWVzaFNpemVTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYubG9va0F0KGdsLmNhbWVyYS5wb3NpdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuIl19
|