angular-three-soba 2.0.0 → 2.2.0
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/lib/catmull-rom-line.d.ts +148 -148
- package/abstractions/lib/edges.d.ts +166 -166
- package/abstractions/lib/grid.d.ts +30 -30
- package/abstractions/lib/line.d.ts +2 -2
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +1 -1
- package/abstractions/lib/text-3d.d.ts +37 -37
- package/abstractions/lib/text.d.ts +2 -2
- package/cameras/lib/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera.d.ts +1 -1
- package/cameras/lib/perspective-camera.d.ts +1 -1
- package/controls/index.d.ts +9 -1
- package/controls/lib/camera-controls.d.ts +1 -1
- package/controls/lib/orbit-controls.d.ts +1 -1
- package/esm2022/controls/index.mjs +6 -2
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
- package/esm2022/gizmos/index.mjs +6 -0
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +187 -0
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +304 -0
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +332 -0
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +263 -0
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +264 -0
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +340 -0
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +266 -0
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +232 -0
- package/esm2022/gizmos/lib/transform-controls.mjs +177 -0
- package/esm2022/staging/index.mjs +2 -1
- package/esm2022/staging/lib/mask.mjs +78 -0
- package/fesm2022/angular-three-soba-controls.mjs +14 -1337
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +2319 -0
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
- package/fesm2022/angular-three-soba-staging.mjs +92 -21
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/gizmos/README.md +3 -0
- package/gizmos/index.d.ts +5 -0
- package/gizmos/lib/gizmo-helper/gizmo-helper.d.ts +45 -0
- package/gizmos/lib/gizmo-helper/gizmo-viewcube.d.ts +74 -0
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +64 -0
- package/{controls → gizmos}/lib/pivot-controls/pivot-controls.d.ts +1 -1
- package/gizmos/lib/transform-controls.d.ts +50 -0
- package/materials/lib/custom-shader-material.d.ts +3 -3
- package/materials/lib/mesh-refraction-material.d.ts +3 -3
- package/materials/lib/mesh-transmission-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +5 -5
- package/misc/lib/decal.d.ts +1 -1
- package/misc/lib/html/html.d.ts +1 -1
- package/misc/lib/sampler.d.ts +1 -1
- package/package.json +18 -12
- package/performances/lib/instances/instances.d.ts +9 -9
- package/performances/lib/points/points.d.ts +20 -20
- package/performances/lib/segments/segments.d.ts +4 -4
- package/shaders/lib/mesh-refraction-material.d.ts +2 -2
- package/staging/index.d.ts +1 -0
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +30 -0
- package/staging/lib/render-texture.d.ts +1 -1
- package/staging/lib/sky.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +2 -2
- package/staging/lib/stage.d.ts +6 -6
- package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +0 -263
- package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +0 -264
- package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +0 -340
- package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +0 -266
- package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +0 -232
- /package/{controls → gizmos}/lib/pivot-controls/axis-arrow.d.ts +0 -0
- /package/{controls → gizmos}/lib/pivot-controls/axis-rotator.d.ts +0 -0
- /package/{controls → gizmos}/lib/pivot-controls/plane-slider.d.ts +0 -0
- /package/{controls → gizmos}/lib/pivot-controls/scaling-sphere.d.ts +0 -0
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, input, signal, viewChild, } from '@angular/core';
|
|
2
|
-
import { extend, injectStore, NgtArgs } from 'angular-three';
|
|
3
|
-
import { NgtsLine } from 'angular-three-soba/abstractions';
|
|
4
|
-
import { NgtsHTML, NgtsHTMLContent } from 'angular-three-soba/misc';
|
|
5
|
-
import { ConeGeometry, CylinderGeometry, DoubleSide, Group, Matrix4, Mesh, MeshBasicMaterial, Quaternion, Vector3, } from 'three';
|
|
6
|
-
import { NgtsPivotControls } from './pivot-controls';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
const vec1 = new Vector3();
|
|
9
|
-
const vec2 = new Vector3();
|
|
10
|
-
export function calculateOffset(clickPoint, normal, rayStart, rayDir) {
|
|
11
|
-
const e1 = normal.dot(normal);
|
|
12
|
-
const e2 = normal.dot(clickPoint) - normal.dot(rayStart);
|
|
13
|
-
const e3 = normal.dot(rayDir);
|
|
14
|
-
if (e3 === 0) {
|
|
15
|
-
return -e2 / e1;
|
|
16
|
-
}
|
|
17
|
-
vec1
|
|
18
|
-
.copy(rayDir)
|
|
19
|
-
.multiplyScalar(e1 / e3)
|
|
20
|
-
.sub(normal);
|
|
21
|
-
vec2
|
|
22
|
-
.copy(rayDir)
|
|
23
|
-
.multiplyScalar(e2 / e3)
|
|
24
|
-
.add(rayStart)
|
|
25
|
-
.sub(clickPoint);
|
|
26
|
-
return -vec1.dot(vec2) / vec1.dot(vec1);
|
|
27
|
-
}
|
|
28
|
-
const upV = new Vector3(0, 1, 0);
|
|
29
|
-
const offsetMatrix = new Matrix4();
|
|
30
|
-
export class NgtsAxisArrow {
|
|
31
|
-
constructor() {
|
|
32
|
-
this.DoubleSide = DoubleSide;
|
|
33
|
-
this.direction = input.required();
|
|
34
|
-
this.axis = input.required();
|
|
35
|
-
this.groupRef = viewChild.required('group');
|
|
36
|
-
this.annotationRef = viewChild('annotation', { read: ElementRef });
|
|
37
|
-
this.pivotControls = inject(NgtsPivotControls);
|
|
38
|
-
this.store = injectStore();
|
|
39
|
-
this.controls = this.store.select('controls');
|
|
40
|
-
this.hovered = signal(false);
|
|
41
|
-
this.clickInfo = null;
|
|
42
|
-
this.offset0 = 0;
|
|
43
|
-
this.color = computed(() => this.hovered() ? this.pivotControls.hoveredColor() : this.pivotControls.axisColors()[this.axis()]);
|
|
44
|
-
this.coneWidth = computed(() => this.pivotControls.fixed()
|
|
45
|
-
? (this.pivotControls.lineWidth() / this.pivotControls.scale()) * 1.6
|
|
46
|
-
: this.pivotControls.scale() / 20);
|
|
47
|
-
this.coneLength = computed(() => (this.pivotControls.fixed() ? 0.2 : this.pivotControls.scale() / 5));
|
|
48
|
-
this.cylinderLength = computed(() => this.pivotControls.fixed() ? 1 - this.coneLength() : this.pivotControls.scale() - this.coneLength());
|
|
49
|
-
this.matrixL = computed(() => {
|
|
50
|
-
const quaternion = new Quaternion().setFromUnitVectors(upV, this.direction().clone().normalize());
|
|
51
|
-
return new Matrix4().makeRotationFromQuaternion(quaternion);
|
|
52
|
-
});
|
|
53
|
-
extend({ Group, Mesh, ConeGeometry, CylinderGeometry, MeshBasicMaterial });
|
|
54
|
-
}
|
|
55
|
-
onPointerDown(event) {
|
|
56
|
-
const [group, direction, axis, controls, annotation] = [
|
|
57
|
-
this.groupRef().nativeElement,
|
|
58
|
-
this.direction(),
|
|
59
|
-
this.axis(),
|
|
60
|
-
this.controls(),
|
|
61
|
-
this.annotationRef()?.nativeElement,
|
|
62
|
-
];
|
|
63
|
-
if (annotation) {
|
|
64
|
-
annotation.innerText = `${this.pivotControls.translation[axis].toFixed(2)}`;
|
|
65
|
-
annotation.style.display = 'block';
|
|
66
|
-
}
|
|
67
|
-
event.stopPropagation();
|
|
68
|
-
const rotation = new Matrix4().extractRotation(group.matrixWorld);
|
|
69
|
-
const origin = new Vector3().setFromMatrixPosition(group.matrixWorld);
|
|
70
|
-
const clickPoint = event.point.clone();
|
|
71
|
-
const dir = direction.clone().applyMatrix4(rotation).normalize();
|
|
72
|
-
this.clickInfo = { clickPoint, dir };
|
|
73
|
-
this.offset0 = this.pivotControls.translation[axis];
|
|
74
|
-
this.pivotControls.onDragStart({ component: 'Arrow', axis, origin, directions: [dir] });
|
|
75
|
-
if (controls) {
|
|
76
|
-
controls.enabled = false;
|
|
77
|
-
}
|
|
78
|
-
// @ts-expect-error - setPointerCapture is not in the type definition
|
|
79
|
-
event.target.setPointerCapture(event.pointerId);
|
|
80
|
-
}
|
|
81
|
-
onPointerUp(event) {
|
|
82
|
-
const [annotation, controls] = [this.annotationRef()?.nativeElement, this.controls()];
|
|
83
|
-
if (annotation) {
|
|
84
|
-
annotation.style.display = 'none';
|
|
85
|
-
}
|
|
86
|
-
event.stopPropagation();
|
|
87
|
-
this.clickInfo = null;
|
|
88
|
-
this.pivotControls.onDragEnd();
|
|
89
|
-
if (controls) {
|
|
90
|
-
controls.enabled = true;
|
|
91
|
-
}
|
|
92
|
-
// @ts-expect-error - setPointerCapture is not in the type definition
|
|
93
|
-
event.target.releasePointerCapture(event.pointerId);
|
|
94
|
-
}
|
|
95
|
-
onPointerMove(event) {
|
|
96
|
-
event.stopPropagation();
|
|
97
|
-
if (!this.hovered()) {
|
|
98
|
-
this.hovered.set(true);
|
|
99
|
-
}
|
|
100
|
-
if (this.clickInfo) {
|
|
101
|
-
const { clickPoint, dir } = this.clickInfo;
|
|
102
|
-
const [translationLimits, annotation, axis] = [
|
|
103
|
-
this.pivotControls.translationLimits(),
|
|
104
|
-
this.annotationRef()?.nativeElement,
|
|
105
|
-
this.axis(),
|
|
106
|
-
];
|
|
107
|
-
const [min, max] = translationLimits?.[axis] || [undefined, undefined];
|
|
108
|
-
let offset = calculateOffset(clickPoint, dir, event.ray.origin, event.ray.direction);
|
|
109
|
-
if (min !== undefined) {
|
|
110
|
-
offset = Math.max(offset, min - this.offset0);
|
|
111
|
-
}
|
|
112
|
-
if (max !== undefined) {
|
|
113
|
-
offset = Math.min(offset, max - this.offset0);
|
|
114
|
-
}
|
|
115
|
-
this.pivotControls.translation[axis] = this.offset0 + offset;
|
|
116
|
-
if (annotation) {
|
|
117
|
-
annotation.innerText = `${this.pivotControls.translation[axis].toFixed(2)}`;
|
|
118
|
-
}
|
|
119
|
-
offsetMatrix.makeTranslation(dir.x * offset, dir.y * offset, dir.z * offset);
|
|
120
|
-
this.pivotControls.onDrag(offsetMatrix);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
onPointerOut(event) {
|
|
124
|
-
event.stopPropagation();
|
|
125
|
-
this.hovered.set(false);
|
|
126
|
-
}
|
|
127
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisArrow, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
128
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsAxisArrow, isStandalone: true, selector: "ngts-axis-arrow", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: true, transformFunction: null }, axis: { classPropertyName: "axis", publicName: "axis", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "annotationRef", first: true, predicate: ["annotation"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
|
|
129
|
-
<ngt-group #group>
|
|
130
|
-
<ngt-group
|
|
131
|
-
[matrix]="matrixL()"
|
|
132
|
-
[matrixAutoUpdate]="false"
|
|
133
|
-
(pointerdown)="onPointerDown($any($event))"
|
|
134
|
-
(pointerup)="onPointerUp($any($event))"
|
|
135
|
-
(pointermove)="onPointerMove($any($event))"
|
|
136
|
-
(pointerout)="onPointerOut($any($event))"
|
|
137
|
-
>
|
|
138
|
-
@if (pivotControls.annotations()) {
|
|
139
|
-
<ngts-html [options]="{ position: [0, -coneLength(), 0] }">
|
|
140
|
-
<div
|
|
141
|
-
#annotation
|
|
142
|
-
ngtsHTMLContent
|
|
143
|
-
style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap;"
|
|
144
|
-
[class]="pivotControls.annotationsClass()"
|
|
145
|
-
></div>
|
|
146
|
-
</ngts-html>
|
|
147
|
-
}
|
|
148
|
-
<ngt-mesh
|
|
149
|
-
[visible]="false"
|
|
150
|
-
[position]="[0, (cylinderLength() + coneLength()) / 2.0, 0]"
|
|
151
|
-
[userData]="pivotControls.userData()"
|
|
152
|
-
>
|
|
153
|
-
<ngt-cylinder-geometry
|
|
154
|
-
*args="[coneWidth() * 1.4, coneWidth() * 1.4, cylinderLength() + coneLength(), 8, 1]"
|
|
155
|
-
/>
|
|
156
|
-
</ngt-mesh>
|
|
157
|
-
|
|
158
|
-
<ngts-line
|
|
159
|
-
[points]="[0, 0, 0, 0, cylinderLength(), 0]"
|
|
160
|
-
[options]="{
|
|
161
|
-
raycast: null,
|
|
162
|
-
side: DoubleSide,
|
|
163
|
-
polygonOffset: true,
|
|
164
|
-
polygonOffsetFactor: -10,
|
|
165
|
-
renderOrder: 1,
|
|
166
|
-
fog: false,
|
|
167
|
-
transparent: true,
|
|
168
|
-
lineWidth: pivotControls.lineWidth(),
|
|
169
|
-
color: color(),
|
|
170
|
-
opacity: pivotControls.opacity(),
|
|
171
|
-
depthTest: pivotControls.depthTest(),
|
|
172
|
-
}"
|
|
173
|
-
/>
|
|
174
|
-
|
|
175
|
-
<ngt-mesh [raycast]="null" [position]="[0, cylinderLength() + coneLength() / 2.0, 0]" [renderOrder]="500">
|
|
176
|
-
<ngt-cone-geometry *args="[coneWidth(), coneLength(), 24, 1]" />
|
|
177
|
-
<ngt-mesh-basic-material
|
|
178
|
-
[transparent]="true"
|
|
179
|
-
[depthTest]="pivotControls.depthTest()"
|
|
180
|
-
[color]="color()"
|
|
181
|
-
[opacity]="pivotControls.opacity()"
|
|
182
|
-
[polygonOffset]="true"
|
|
183
|
-
[polygonOffsetFactor]="-10"
|
|
184
|
-
[fog]="false"
|
|
185
|
-
/>
|
|
186
|
-
</ngt-mesh>
|
|
187
|
-
</ngt-group>
|
|
188
|
-
</ngt-group>
|
|
189
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtsLine, selector: "ngts-line", inputs: ["points", "options"] }, { kind: "component", type: NgtsHTML, selector: "ngts-html", inputs: ["options"] }, { kind: "component", type: NgtsHTMLContent, selector: "[ngtsHTMLContent]", inputs: ["ngtsHTMLContent"], outputs: ["occluded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
190
|
-
}
|
|
191
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisArrow, decorators: [{
|
|
192
|
-
type: Component,
|
|
193
|
-
args: [{
|
|
194
|
-
selector: 'ngts-axis-arrow',
|
|
195
|
-
standalone: true,
|
|
196
|
-
template: `
|
|
197
|
-
<ngt-group #group>
|
|
198
|
-
<ngt-group
|
|
199
|
-
[matrix]="matrixL()"
|
|
200
|
-
[matrixAutoUpdate]="false"
|
|
201
|
-
(pointerdown)="onPointerDown($any($event))"
|
|
202
|
-
(pointerup)="onPointerUp($any($event))"
|
|
203
|
-
(pointermove)="onPointerMove($any($event))"
|
|
204
|
-
(pointerout)="onPointerOut($any($event))"
|
|
205
|
-
>
|
|
206
|
-
@if (pivotControls.annotations()) {
|
|
207
|
-
<ngts-html [options]="{ position: [0, -coneLength(), 0] }">
|
|
208
|
-
<div
|
|
209
|
-
#annotation
|
|
210
|
-
ngtsHTMLContent
|
|
211
|
-
style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap;"
|
|
212
|
-
[class]="pivotControls.annotationsClass()"
|
|
213
|
-
></div>
|
|
214
|
-
</ngts-html>
|
|
215
|
-
}
|
|
216
|
-
<ngt-mesh
|
|
217
|
-
[visible]="false"
|
|
218
|
-
[position]="[0, (cylinderLength() + coneLength()) / 2.0, 0]"
|
|
219
|
-
[userData]="pivotControls.userData()"
|
|
220
|
-
>
|
|
221
|
-
<ngt-cylinder-geometry
|
|
222
|
-
*args="[coneWidth() * 1.4, coneWidth() * 1.4, cylinderLength() + coneLength(), 8, 1]"
|
|
223
|
-
/>
|
|
224
|
-
</ngt-mesh>
|
|
225
|
-
|
|
226
|
-
<ngts-line
|
|
227
|
-
[points]="[0, 0, 0, 0, cylinderLength(), 0]"
|
|
228
|
-
[options]="{
|
|
229
|
-
raycast: null,
|
|
230
|
-
side: DoubleSide,
|
|
231
|
-
polygonOffset: true,
|
|
232
|
-
polygonOffsetFactor: -10,
|
|
233
|
-
renderOrder: 1,
|
|
234
|
-
fog: false,
|
|
235
|
-
transparent: true,
|
|
236
|
-
lineWidth: pivotControls.lineWidth(),
|
|
237
|
-
color: color(),
|
|
238
|
-
opacity: pivotControls.opacity(),
|
|
239
|
-
depthTest: pivotControls.depthTest(),
|
|
240
|
-
}"
|
|
241
|
-
/>
|
|
242
|
-
|
|
243
|
-
<ngt-mesh [raycast]="null" [position]="[0, cylinderLength() + coneLength() / 2.0, 0]" [renderOrder]="500">
|
|
244
|
-
<ngt-cone-geometry *args="[coneWidth(), coneLength(), 24, 1]" />
|
|
245
|
-
<ngt-mesh-basic-material
|
|
246
|
-
[transparent]="true"
|
|
247
|
-
[depthTest]="pivotControls.depthTest()"
|
|
248
|
-
[color]="color()"
|
|
249
|
-
[opacity]="pivotControls.opacity()"
|
|
250
|
-
[polygonOffset]="true"
|
|
251
|
-
[polygonOffsetFactor]="-10"
|
|
252
|
-
[fog]="false"
|
|
253
|
-
/>
|
|
254
|
-
</ngt-mesh>
|
|
255
|
-
</ngt-group>
|
|
256
|
-
</ngt-group>
|
|
257
|
-
`,
|
|
258
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
259
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
260
|
-
imports: [NgtArgs, NgtsLine, NgtsHTML, NgtsHTMLContent],
|
|
261
|
-
}]
|
|
262
|
-
}], ctorParameters: () => [] });
|
|
263
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy1hcnJvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9jb250cm9scy9zcmMvbGliL3Bpdm90LWNvbnRyb2xzL2F4aXMtYXJyb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUNOLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLEtBQUssRUFDTCxPQUFPLEVBQ1AsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsT0FBTyxHQUNQLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRXJELE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUUzQixNQUFNLFVBQVUsZUFBZSxDQUFDLFVBQW1CLEVBQUUsTUFBZSxFQUFFLFFBQWlCLEVBQUUsTUFBZTtJQUN2RyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxR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R1MsT0FBTyxnRkFBRSxRQUFRLHFGQUFFLFFBQVEsMkVBQUUsZUFBZTs7MkZBRTFDLGFBQWE7a0JBckV6QixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE2RFQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUM7aUJBQ3ZEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdHNpZ25hbCxcblx0U2lnbmFsLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpbmplY3RTdG9yZSwgTmd0QXJncywgTmd0VGhyZWVFdmVudCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTmd0c0xpbmUgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvYWJzdHJhY3Rpb25zJztcbmltcG9ydCB7IE5ndHNIVE1MLCBOZ3RzSFRNTENvbnRlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvbWlzYyc7XG5pbXBvcnQge1xuXHRDb25lR2VvbWV0cnksXG5cdEN5bGluZGVyR2VvbWV0cnksXG5cdERvdWJsZVNpZGUsXG5cdEdyb3VwLFxuXHRNYXRyaXg0LFxuXHRNZXNoLFxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcblx0UXVhdGVybmlvbixcblx0VmVjdG9yMyxcbn0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0c1Bpdm90Q29udHJvbHMgfSBmcm9tICcuL3Bpdm90LWNvbnRyb2xzJztcblxuY29uc3QgdmVjMSA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCB2ZWMyID0gbmV3IFZlY3RvcjMoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChjbGlja1BvaW50OiBWZWN0b3IzLCBub3JtYWw6IFZlY3RvcjMsIHJheVN0YXJ0OiBWZWN0b3IzLCByYXlEaXI6IFZlY3RvcjMpIHtcblx0Y29uc3QgZTEgPSBub3JtYWwuZG90KG5vcm1hbCk7XG5cdGNvbnN0IGUyID0gbm9ybWFsLmRvdChjbGlja1BvaW50KSAtIG5vcm1hbC5kb3QocmF5U3RhcnQpO1xuXHRjb25zdCBlMyA9IG5vcm1hbC5kb3QocmF5RGlyKTtcblxuXHRpZiAoZTMgPT09IDApIHtcblx0XHRyZXR1cm4gLWUyIC8gZTE7XG5cdH1cblxuXHR2ZWMxXG5cdFx0LmNvcHkocmF5RGlyKVxuXHRcdC5tdWx0aXBseVNjYWxhcihlMSAvIGUzKVxuXHRcdC5zdWIobm9ybWFsKTtcblx0dmVjMlxuXHRcdC5jb3B5KHJheURpcilcblx0XHQubXVsdGlwbHlTY2FsYXIoZTIgLyBlMylcblx0XHQuYWRkKHJheVN0YXJ0KVxuXHRcdC5zdWIoY2xpY2tQb2ludCk7XG5cblx0cmV0dXJuIC12ZWMxLmRvdCh2ZWMyKSAvIHZlYzEuZG90KHZlYzEpO1xufVxuXG5jb25zdCB1cFYgPSBuZXcgVmVjdG9yMygwLCAxLCAwKTtcbmNvbnN0IG9mZnNldE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYXhpcy1hcnJvdycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjZ3JvdXA+XG5cdFx0XHQ8bmd0LWdyb3VwXG5cdFx0XHRcdFttYXRyaXhdPVwibWF0cml4TCgpXCJcblx0XHRcdFx0W21hdHJpeEF1dG9VcGRhdGVdPVwiZmFsc2VcIlxuXHRcdFx0XHQocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkYW55KCRldmVudCkpXCJcblx0XHRcdFx0KHBvaW50ZXJ1cCk9XCJvblBvaW50ZXJVcCgkYW55KCRldmVudCkpXCJcblx0XHRcdFx0KHBvaW50ZXJtb3ZlKT1cIm9uUG9pbnRlck1vdmUoJGFueSgkZXZlbnQpKVwiXG5cdFx0XHRcdChwb2ludGVyb3V0KT1cIm9uUG9pbnRlck91dCgkYW55KCRldmVudCkpXCJcblx0XHRcdD5cblx0XHRcdFx0QGlmIChwaXZvdENvbnRyb2xzLmFubm90YXRpb25zKCkpIHtcblx0XHRcdFx0XHQ8bmd0cy1odG1sIFtvcHRpb25zXT1cInsgcG9zaXRpb246IFswLCAtY29uZUxlbmd0aCgpLCAwXSB9XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdCNhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdG5ndHNIVE1MQ29udGVudFxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGJhY2tncm91bmQ6ICMxNTE1MjA7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNnB4IDhweDsgYm9yZGVyLXJhZGl1czogN3B4OyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiXG5cdFx0XHRcdFx0XHRcdFtjbGFzc109XCJwaXZvdENvbnRyb2xzLmFubm90YXRpb25zQ2xhc3MoKVwiXG5cdFx0XHRcdFx0XHQ+PC9kaXY+XG5cdFx0XHRcdFx0PC9uZ3RzLWh0bWw+XG5cdFx0XHRcdH1cblx0XHRcdFx0PG5ndC1tZXNoXG5cdFx0XHRcdFx0W3Zpc2libGVdPVwiZmFsc2VcIlxuXHRcdFx0XHRcdFtwb3NpdGlvbl09XCJbMCwgKGN5bGluZGVyTGVuZ3RoKCkgKyBjb25lTGVuZ3RoKCkpIC8gMi4wLCAwXVwiXG5cdFx0XHRcdFx0W3VzZXJEYXRhXT1cInBpdm90Q29udHJvbHMudXNlckRhdGEoKVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8bmd0LWN5bGluZGVyLWdlb21ldHJ5XG5cdFx0XHRcdFx0XHQqYXJncz1cIltjb25lV2lkdGgoKSAqIDEuNCwgY29uZVdpZHRoKCkgKiAxLjQsIGN5bGluZGVyTGVuZ3RoKCkgKyBjb25lTGVuZ3RoKCksIDgsIDFdXCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L25ndC1tZXNoPlxuXG5cdFx0XHRcdDxuZ3RzLWxpbmVcblx0XHRcdFx0XHRbcG9pbnRzXT1cIlswLCAwLCAwLCAwLCBjeWxpbmRlckxlbmd0aCgpLCAwXVwiXG5cdFx0XHRcdFx0W29wdGlvbnNdPVwie1xuXHRcdFx0XHRcdFx0cmF5Y2FzdDogbnVsbCxcblx0XHRcdFx0XHRcdHNpZGU6IERvdWJsZVNpZGUsXG5cdFx0XHRcdFx0XHRwb2x5Z29uT2Zmc2V0OiB0cnVlLFxuXHRcdFx0XHRcdFx0cG9seWdvbk9mZnNldEZhY3RvcjogLTEwLFxuXHRcdFx0XHRcdFx0cmVuZGVyT3JkZXI6IDEsXG5cdFx0XHRcdFx0XHRmb2c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dHJhbnNwYXJlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHRsaW5lV2lkdGg6IHBpdm90Q29udHJvbHMubGluZVdpZHRoKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3IoKSxcblx0XHRcdFx0XHRcdG9wYWNpdHk6IHBpdm90Q29udHJvbHMub3BhY2l0eSgpLFxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiBwaXZvdENvbnRyb2xzLmRlcHRoVGVzdCgpLFxuXHRcdFx0XHRcdH1cIlxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdDxuZ3QtbWVzaCBbcmF5Y2FzdF09XCJudWxsXCIgW3Bvc2l0aW9uXT1cIlswLCBjeWxpbmRlckxlbmd0aCgpICsgY29uZUxlbmd0aCgpIC8gMi4wLCAwXVwiIFtyZW5kZXJPcmRlcl09XCI1MDBcIj5cblx0XHRcdFx0XHQ8bmd0LWNvbmUtZ2VvbWV0cnkgKmFyZ3M9XCJbY29uZVdpZHRoKCksIGNvbmVMZW5ndGgoKSwgMjQsIDFdXCIgLz5cblx0XHRcdFx0XHQ8bmd0LW1lc2gtYmFzaWMtbWF0ZXJpYWxcblx0XHRcdFx0XHRcdFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcblx0XHRcdFx0XHRcdFtkZXB0aFRlc3RdPVwicGl2b3RDb250cm9scy5kZXB0aFRlc3QoKVwiXG5cdFx0XHRcdFx0XHRbY29sb3JdPVwiY29sb3IoKVwiXG5cdFx0XHRcdFx0XHRbb3BhY2l0eV09XCJwaXZvdENvbnRyb2xzLm9wYWNpdHkoKVwiXG5cdFx0XHRcdFx0XHRbcG9seWdvbk9mZnNldF09XCJ0cnVlXCJcblx0XHRcdFx0XHRcdFtwb2x5Z29uT2Zmc2V0RmFjdG9yXT1cIi0xMFwiXG5cdFx0XHRcdFx0XHRbZm9nXT1cImZhbHNlXCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQ8L25ndC1tZXNoPlxuXHRcdFx0PC9uZ3QtZ3JvdXA+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzLCBOZ3RzTGluZSwgTmd0c0hUTUwsIE5ndHNIVE1MQ29udGVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNBeGlzQXJyb3cge1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgRG91YmxlU2lkZSA9IERvdWJsZVNpZGU7XG5cblx0ZGlyZWN0aW9uID0gaW5wdXQucmVxdWlyZWQ8VmVjdG9yMz4oKTtcblx0YXhpcyA9IGlucHV0LnJlcXVpcmVkPDAgfCAxIHwgMj4oKTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cdGFubm90YXRpb25SZWYgPSB2aWV3Q2hpbGQ8dW5rbm93biwgRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdhbm5vdGF0aW9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG5cdHBpdm90Q29udHJvbHMgPSBpbmplY3QoTmd0c1Bpdm90Q29udHJvbHMpO1xuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBjb250cm9scyA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjb250cm9scycpIGFzIHVua25vd24gYXMgU2lnbmFsPHsgZW5hYmxlZDogYm9vbGVhbiB9PjtcblxuXHRwcml2YXRlIGhvdmVyZWQgPSBzaWduYWwoZmFsc2UpO1xuXHRwcml2YXRlIGNsaWNrSW5mbzogeyBjbGlja1BvaW50OiBWZWN0b3IzOyBkaXI6IFZlY3RvcjMgfSB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIG9mZnNldDAgPSAwO1xuXG5cdGNvbG9yID0gY29tcHV0ZWQoKCkgPT5cblx0XHR0aGlzLmhvdmVyZWQoKSA/IHRoaXMucGl2b3RDb250cm9scy5ob3ZlcmVkQ29sb3IoKSA6IHRoaXMucGl2b3RDb250cm9scy5heGlzQ29sb3JzKClbdGhpcy5heGlzKCldLFxuXHQpO1xuXG5cdGNvbmVXaWR0aCA9IGNvbXB1dGVkKCgpID0+XG5cdFx0dGhpcy5waXZvdENvbnRyb2xzLmZpeGVkKClcblx0XHRcdD8gKHRoaXMucGl2b3RDb250cm9scy5saW5lV2lkdGgoKSAvIHRoaXMucGl2b3RDb250cm9scy5zY2FsZSgpKSAqIDEuNlxuXHRcdFx0OiB0aGlzLnBpdm90Q29udHJvbHMuc2NhbGUoKSAvIDIwLFxuXHQpO1xuXHRjb25lTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMucGl2b3RDb250cm9scy5maXhlZCgpID8gMC4yIDogdGhpcy5waXZvdENvbnRyb2xzLnNjYWxlKCkgLyA1KSk7XG5cdGN5bGluZGVyTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT5cblx0XHR0aGlzLnBpdm90Q29udHJvbHMuZml4ZWQoKSA/IDEgLSB0aGlzLmNvbmVMZW5ndGgoKSA6IHRoaXMucGl2b3RDb250cm9scy5zY2FsZSgpIC0gdGhpcy5jb25lTGVuZ3RoKCksXG5cdCk7XG5cdG1hdHJpeEwgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3JzKHVwViwgdGhpcy5kaXJlY3Rpb24oKS5jbG9uZSgpLm5vcm1hbGl6ZSgpKTtcblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihxdWF0ZXJuaW9uKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAsIE1lc2gsIENvbmVHZW9tZXRyeSwgQ3lsaW5kZXJHZW9tZXRyeSwgTWVzaEJhc2ljTWF0ZXJpYWwgfSk7XG5cdH1cblxuXHRvblBvaW50ZXJEb3duKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRjb25zdCBbZ3JvdXAsIGRpcmVjdGlvbiwgYXhpcywgY29udHJvbHMsIGFubm90YXRpb25dID0gW1xuXHRcdFx0dGhpcy5ncm91cFJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHR0aGlzLmRpcmVjdGlvbigpLFxuXHRcdFx0dGhpcy5heGlzKCksXG5cdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XHR0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRdO1xuXG5cdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdGFubm90YXRpb24uaW5uZXJUZXh0ID0gYCR7dGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uW2F4aXNdLnRvRml4ZWQoMil9YDtcblx0XHRcdGFubm90YXRpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0fVxuXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCByb3RhdGlvbiA9IG5ldyBNYXRyaXg0KCkuZXh0cmFjdFJvdGF0aW9uKGdyb3VwLm1hdHJpeFdvcmxkKTtcblx0XHRjb25zdCBvcmlnaW4gPSBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhQb3NpdGlvbihncm91cC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2xpY2tQb2ludCA9IGV2ZW50LnBvaW50LmNsb25lKCk7XG5cdFx0Y29uc3QgZGlyID0gZGlyZWN0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHJvdGF0aW9uKS5ub3JtYWxpemUoKTtcblx0XHR0aGlzLmNsaWNrSW5mbyA9IHsgY2xpY2tQb2ludCwgZGlyIH07XG5cdFx0dGhpcy5vZmZzZXQwID0gdGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uW2F4aXNdO1xuXHRcdHRoaXMucGl2b3RDb250cm9scy5vbkRyYWdTdGFydCh7IGNvbXBvbmVudDogJ0Fycm93JywgYXhpcywgb3JpZ2luLCBkaXJlY3Rpb25zOiBbZGlyXSB9KTtcblx0XHRpZiAoY29udHJvbHMpIHtcblx0XHRcdGNvbnRyb2xzLmVuYWJsZWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gc2V0UG9pbnRlckNhcHR1cmUgaXMgbm90IGluIHRoZSB0eXBlIGRlZmluaXRpb25cblx0XHRldmVudC50YXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcblx0fVxuXG5cdG9uUG9pbnRlclVwKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRjb25zdCBbYW5ub3RhdGlvbiwgY29udHJvbHNdID0gW3RoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbnRyb2xzKCldO1xuXG5cdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdGFubm90YXRpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHR9XG5cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmNsaWNrSW5mbyA9IG51bGw7XG5cdFx0dGhpcy5waXZvdENvbnRyb2xzLm9uRHJhZ0VuZCgpO1xuXHRcdGlmIChjb250cm9scykge1xuXHRcdFx0Y29udHJvbHMuZW5hYmxlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHNldFBvaW50ZXJDYXB0dXJlIGlzIG5vdCBpbiB0aGUgdHlwZSBkZWZpbml0aW9uXG5cdFx0ZXZlbnQudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuXHR9XG5cblx0b25Qb2ludGVyTW92ZShldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMuaG92ZXJlZCgpKSB7XG5cdFx0XHR0aGlzLmhvdmVyZWQuc2V0KHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNsaWNrSW5mbykge1xuXHRcdFx0Y29uc3QgeyBjbGlja1BvaW50LCBkaXIgfSA9IHRoaXMuY2xpY2tJbmZvO1xuXHRcdFx0Y29uc3QgW3RyYW5zbGF0aW9uTGltaXRzLCBhbm5vdGF0aW9uLCBheGlzXSA9IFtcblx0XHRcdFx0dGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uTGltaXRzKCksXG5cdFx0XHRcdHRoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmF4aXMoKSxcblx0XHRcdF07XG5cblx0XHRcdGNvbnN0IFttaW4sIG1heF0gPSB0cmFuc2xhdGlvbkxpbWl0cz8uW2F4aXNdIHx8IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG5cblx0XHRcdGxldCBvZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQoY2xpY2tQb2ludCwgZGlyLCBldmVudC5yYXkub3JpZ2luLCBldmVudC5yYXkuZGlyZWN0aW9uKTtcblx0XHRcdGlmIChtaW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvZmZzZXQgPSBNYXRoLm1heChvZmZzZXQsIG1pbiAtIHRoaXMub2Zmc2V0MCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtYXggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heCAtIHRoaXMub2Zmc2V0MCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucGl2b3RDb250cm9scy50cmFuc2xhdGlvbltheGlzXSA9IHRoaXMub2Zmc2V0MCArIG9mZnNldDtcblxuXHRcdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdFx0YW5ub3RhdGlvbi5pbm5lclRleHQgPSBgJHt0aGlzLnBpdm90Q29udHJvbHMudHJhbnNsYXRpb25bYXhpc10udG9GaXhlZCgyKX1gO1xuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXRNYXRyaXgubWFrZVRyYW5zbGF0aW9uKGRpci54ICogb2Zmc2V0LCBkaXIueSAqIG9mZnNldCwgZGlyLnogKiBvZmZzZXQpO1xuXHRcdFx0dGhpcy5waXZvdENvbnRyb2xzLm9uRHJhZyhvZmZzZXRNYXRyaXgpO1xuXHRcdH1cblx0fVxuXG5cdG9uUG9pbnRlck91dChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5ob3ZlcmVkLnNldChmYWxzZSk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, input, signal, viewChild, } from '@angular/core';
|
|
2
|
-
import { extend, injectStore } from 'angular-three';
|
|
3
|
-
import { NgtsLine } from 'angular-three-soba/abstractions';
|
|
4
|
-
import { NgtsHTML, NgtsHTMLContent } from 'angular-three-soba/misc';
|
|
5
|
-
import { DoubleSide, Group, Matrix4, Plane, Ray, Vector3 } from 'three';
|
|
6
|
-
import { NgtsPivotControls } from './pivot-controls';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
const clickDir = new Vector3();
|
|
9
|
-
const intersectionDir = new Vector3();
|
|
10
|
-
function toDegrees(radians) {
|
|
11
|
-
return (radians * 180) / Math.PI;
|
|
12
|
-
}
|
|
13
|
-
function toRadians(degrees) {
|
|
14
|
-
return (degrees * Math.PI) / 180;
|
|
15
|
-
}
|
|
16
|
-
function calculateAngle(clickPoint, intersectionPoint, origin, e1, e2) {
|
|
17
|
-
clickDir.copy(clickPoint).sub(origin);
|
|
18
|
-
intersectionDir.copy(intersectionPoint).sub(origin);
|
|
19
|
-
const dote1e1 = e1.dot(e1);
|
|
20
|
-
const dote2e2 = e2.dot(e2);
|
|
21
|
-
const uClick = clickDir.dot(e1) / dote1e1;
|
|
22
|
-
const vClick = clickDir.dot(e2) / dote2e2;
|
|
23
|
-
const uIntersection = intersectionDir.dot(e1) / dote1e1;
|
|
24
|
-
const vIntersection = intersectionDir.dot(e2) / dote2e2;
|
|
25
|
-
const angleClick = Math.atan2(vClick, uClick);
|
|
26
|
-
const angleIntersection = Math.atan2(vIntersection, uIntersection);
|
|
27
|
-
return angleIntersection - angleClick;
|
|
28
|
-
}
|
|
29
|
-
function fmod(num, denom) {
|
|
30
|
-
let k = Math.floor(num / denom);
|
|
31
|
-
k = k < 0 ? k + 1 : k;
|
|
32
|
-
return num - k * denom;
|
|
33
|
-
}
|
|
34
|
-
function minimizeAngle(angle) {
|
|
35
|
-
let result = fmod(angle, 2 * Math.PI);
|
|
36
|
-
if (Math.abs(result) < 1e-6) {
|
|
37
|
-
return 0.0;
|
|
38
|
-
}
|
|
39
|
-
if (result < 0.0) {
|
|
40
|
-
result += 2 * Math.PI;
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
const rotMatrix = new Matrix4();
|
|
45
|
-
const posNew = new Vector3();
|
|
46
|
-
const ray = new Ray();
|
|
47
|
-
const intersection = new Vector3();
|
|
48
|
-
export class NgtsAxisRotator {
|
|
49
|
-
constructor() {
|
|
50
|
-
this.DoubleSide = DoubleSide;
|
|
51
|
-
this.dir1 = input.required();
|
|
52
|
-
this.dir2 = input.required();
|
|
53
|
-
this.axis = input.required();
|
|
54
|
-
this.groupRef = viewChild.required('group');
|
|
55
|
-
this.annotationRef = viewChild('annotation', { read: ElementRef });
|
|
56
|
-
this.pivotControls = inject(NgtsPivotControls);
|
|
57
|
-
this.store = injectStore();
|
|
58
|
-
this.controls = this.store.select('controls');
|
|
59
|
-
this.hovered = signal(false);
|
|
60
|
-
this.angle = 0;
|
|
61
|
-
this.angle0 = 0;
|
|
62
|
-
this.clickInfo = null;
|
|
63
|
-
this.matrixL = computed(() => {
|
|
64
|
-
const dir1N = this.dir1().clone().normalize();
|
|
65
|
-
const dir2N = this.dir2().clone().normalize();
|
|
66
|
-
return new Matrix4().makeBasis(dir1N, dir2N, dir1N.clone().cross(dir2N));
|
|
67
|
-
});
|
|
68
|
-
this.r = computed(() => (this.pivotControls.fixed() ? 0.65 : this.pivotControls.scale() * 0.65));
|
|
69
|
-
this.arc = computed(() => {
|
|
70
|
-
const segments = 32;
|
|
71
|
-
const points = [];
|
|
72
|
-
for (let j = 0; j <= segments; j++) {
|
|
73
|
-
const angle = (j * (Math.PI / 2)) / segments;
|
|
74
|
-
points.push(new Vector3(Math.cos(angle) * this.r(), Math.sin(angle) * this.r(), 0));
|
|
75
|
-
}
|
|
76
|
-
return points;
|
|
77
|
-
});
|
|
78
|
-
extend({ Group });
|
|
79
|
-
}
|
|
80
|
-
onPointerDown(event) {
|
|
81
|
-
const [annotation, group, axis, controls] = [
|
|
82
|
-
this.annotationRef()?.nativeElement,
|
|
83
|
-
this.groupRef().nativeElement,
|
|
84
|
-
this.axis(),
|
|
85
|
-
this.controls(),
|
|
86
|
-
];
|
|
87
|
-
if (annotation) {
|
|
88
|
-
annotation.innerText = `${toDegrees(this.angle).toFixed(0)}º`;
|
|
89
|
-
annotation.style.display = 'block';
|
|
90
|
-
}
|
|
91
|
-
event.stopPropagation();
|
|
92
|
-
const clickPoint = event.point.clone();
|
|
93
|
-
const origin = new Vector3().setFromMatrixPosition(group.matrixWorld);
|
|
94
|
-
const e1 = new Vector3().setFromMatrixColumn(group.matrixWorld, 0).normalize();
|
|
95
|
-
const e2 = new Vector3().setFromMatrixColumn(group.matrixWorld, 1).normalize();
|
|
96
|
-
const normal = new Vector3().setFromMatrixColumn(group.matrixWorld, 2).normalize();
|
|
97
|
-
const plane = new Plane().setFromNormalAndCoplanarPoint(normal, origin);
|
|
98
|
-
this.clickInfo = { clickPoint, origin, e1, e2, normal, plane };
|
|
99
|
-
this.pivotControls.onDragStart({ component: 'Rotator', axis, origin, directions: [e1, e2, normal] });
|
|
100
|
-
if (controls) {
|
|
101
|
-
controls.enabled = false;
|
|
102
|
-
}
|
|
103
|
-
// @ts-expect-error - setPointerCapture is not a function on PointerEvent
|
|
104
|
-
event.target.setPointerCapture(event.pointerId);
|
|
105
|
-
}
|
|
106
|
-
onPointerMove(event) {
|
|
107
|
-
event.stopPropagation();
|
|
108
|
-
if (!this.hovered())
|
|
109
|
-
this.hovered.set(true);
|
|
110
|
-
if (this.clickInfo) {
|
|
111
|
-
const { clickPoint, origin, e1, e2, normal, plane } = this.clickInfo;
|
|
112
|
-
const [rotationLimits, axis, annotation] = [
|
|
113
|
-
this.pivotControls.rotationLimits(),
|
|
114
|
-
this.axis(),
|
|
115
|
-
this.annotationRef()?.nativeElement,
|
|
116
|
-
];
|
|
117
|
-
const [min, max] = rotationLimits?.[axis] || [undefined, undefined];
|
|
118
|
-
ray.copy(event.ray);
|
|
119
|
-
ray.intersectPlane(plane, intersection);
|
|
120
|
-
ray.direction.negate();
|
|
121
|
-
ray.intersectPlane(plane, intersection);
|
|
122
|
-
let deltaAngle = calculateAngle(clickPoint, intersection, origin, e1, e2);
|
|
123
|
-
let degrees = toDegrees(deltaAngle);
|
|
124
|
-
if (event.shiftKey) {
|
|
125
|
-
degrees = Math.round(degrees / 10) * 10;
|
|
126
|
-
deltaAngle = toRadians(degrees);
|
|
127
|
-
}
|
|
128
|
-
if (min !== undefined && max !== undefined && max - min < 2 * Math.PI) {
|
|
129
|
-
deltaAngle = minimizeAngle(deltaAngle);
|
|
130
|
-
deltaAngle = deltaAngle > Math.PI ? deltaAngle - 2 * Math.PI : deltaAngle;
|
|
131
|
-
deltaAngle = Math.round(deltaAngle / 10) * 10;
|
|
132
|
-
this.angle = this.angle0 + deltaAngle;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
this.angle = minimizeAngle(this.angle0 + deltaAngle);
|
|
136
|
-
this.angle = this.angle > Math.PI ? this.angle - 2 * Math.PI : this.angle;
|
|
137
|
-
}
|
|
138
|
-
if (annotation) {
|
|
139
|
-
degrees = toDegrees(this.angle);
|
|
140
|
-
annotation.innerText = `${degrees.toFixed(0)}º`;
|
|
141
|
-
}
|
|
142
|
-
rotMatrix.makeRotationAxis(normal, deltaAngle);
|
|
143
|
-
posNew.copy(origin).applyMatrix4(rotMatrix).sub(origin).negate();
|
|
144
|
-
rotMatrix.setPosition(posNew);
|
|
145
|
-
this.pivotControls.onDrag(rotMatrix);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
onPointerUp(event) {
|
|
149
|
-
const [annotation, controls] = [this.annotationRef()?.nativeElement, this.controls()];
|
|
150
|
-
if (annotation) {
|
|
151
|
-
annotation.style.display = 'none';
|
|
152
|
-
}
|
|
153
|
-
event.stopPropagation();
|
|
154
|
-
this.clickInfo = null;
|
|
155
|
-
this.pivotControls.onDragEnd();
|
|
156
|
-
if (controls) {
|
|
157
|
-
controls.enabled = true;
|
|
158
|
-
}
|
|
159
|
-
// @ts-expect-error - releasePointerCapture is not a function on PointerEvent
|
|
160
|
-
event.target.releasePointerCapture(event.pointerId);
|
|
161
|
-
}
|
|
162
|
-
onPointerOut(event) {
|
|
163
|
-
event.stopPropagation();
|
|
164
|
-
this.hovered.set(false);
|
|
165
|
-
}
|
|
166
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisRotator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
167
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsAxisRotator, isStandalone: true, selector: "ngts-axis-rotator", inputs: { dir1: { classPropertyName: "dir1", publicName: "dir1", isSignal: true, isRequired: true, transformFunction: null }, dir2: { classPropertyName: "dir2", publicName: "dir2", isSignal: true, isRequired: true, transformFunction: null }, axis: { classPropertyName: "axis", publicName: "axis", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "annotationRef", first: true, predicate: ["annotation"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
|
|
168
|
-
<ngt-group
|
|
169
|
-
#group
|
|
170
|
-
[matrix]="matrixL()"
|
|
171
|
-
[matrixAutoUpdate]="false"
|
|
172
|
-
(pointerdown)="onPointerDown($any($event))"
|
|
173
|
-
(pointermove)="onPointerMove($any($event))"
|
|
174
|
-
(pointerup)="onPointerUp($any($event))"
|
|
175
|
-
(pointerout)="onPointerOut($any($event))"
|
|
176
|
-
>
|
|
177
|
-
@if (pivotControls.annotations()) {
|
|
178
|
-
<ngts-html [options]="{ position: [r(), r(), 0] }">
|
|
179
|
-
<div
|
|
180
|
-
#annotation
|
|
181
|
-
ngtsHTMLContent
|
|
182
|
-
style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap"
|
|
183
|
-
[class]="pivotControls.annotationsClass()"
|
|
184
|
-
></div>
|
|
185
|
-
</ngts-html>
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
<ngts-line
|
|
189
|
-
[points]="arc()"
|
|
190
|
-
[options]="{ lineWidth: pivotControls.lineWidth() * 4, visible: false, userData: pivotControls.userData() }"
|
|
191
|
-
/>
|
|
192
|
-
|
|
193
|
-
<ngts-line
|
|
194
|
-
[points]="arc()"
|
|
195
|
-
[options]="{
|
|
196
|
-
transparent: true,
|
|
197
|
-
raycast: null,
|
|
198
|
-
depthTest: pivotControls.depthTest(),
|
|
199
|
-
lineWidth: pivotControls.lineWidth(),
|
|
200
|
-
side: DoubleSide,
|
|
201
|
-
color: hovered() ? pivotControls.hoveredColor() : pivotControls.axisColors()[axis()],
|
|
202
|
-
opacity: pivotControls.opacity(),
|
|
203
|
-
polygonOffset: true,
|
|
204
|
-
polygonOffsetFactor: -10,
|
|
205
|
-
fog: false,
|
|
206
|
-
}"
|
|
207
|
-
/>
|
|
208
|
-
</ngt-group>
|
|
209
|
-
`, isInline: true, dependencies: [{ kind: "component", type: NgtsLine, selector: "ngts-line", inputs: ["points", "options"] }, { kind: "component", type: NgtsHTML, selector: "ngts-html", inputs: ["options"] }, { kind: "component", type: NgtsHTMLContent, selector: "[ngtsHTMLContent]", inputs: ["ngtsHTMLContent"], outputs: ["occluded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
210
|
-
}
|
|
211
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisRotator, decorators: [{
|
|
212
|
-
type: Component,
|
|
213
|
-
args: [{
|
|
214
|
-
selector: 'ngts-axis-rotator',
|
|
215
|
-
standalone: true,
|
|
216
|
-
template: `
|
|
217
|
-
<ngt-group
|
|
218
|
-
#group
|
|
219
|
-
[matrix]="matrixL()"
|
|
220
|
-
[matrixAutoUpdate]="false"
|
|
221
|
-
(pointerdown)="onPointerDown($any($event))"
|
|
222
|
-
(pointermove)="onPointerMove($any($event))"
|
|
223
|
-
(pointerup)="onPointerUp($any($event))"
|
|
224
|
-
(pointerout)="onPointerOut($any($event))"
|
|
225
|
-
>
|
|
226
|
-
@if (pivotControls.annotations()) {
|
|
227
|
-
<ngts-html [options]="{ position: [r(), r(), 0] }">
|
|
228
|
-
<div
|
|
229
|
-
#annotation
|
|
230
|
-
ngtsHTMLContent
|
|
231
|
-
style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap"
|
|
232
|
-
[class]="pivotControls.annotationsClass()"
|
|
233
|
-
></div>
|
|
234
|
-
</ngts-html>
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
<ngts-line
|
|
238
|
-
[points]="arc()"
|
|
239
|
-
[options]="{ lineWidth: pivotControls.lineWidth() * 4, visible: false, userData: pivotControls.userData() }"
|
|
240
|
-
/>
|
|
241
|
-
|
|
242
|
-
<ngts-line
|
|
243
|
-
[points]="arc()"
|
|
244
|
-
[options]="{
|
|
245
|
-
transparent: true,
|
|
246
|
-
raycast: null,
|
|
247
|
-
depthTest: pivotControls.depthTest(),
|
|
248
|
-
lineWidth: pivotControls.lineWidth(),
|
|
249
|
-
side: DoubleSide,
|
|
250
|
-
color: hovered() ? pivotControls.hoveredColor() : pivotControls.axisColors()[axis()],
|
|
251
|
-
opacity: pivotControls.opacity(),
|
|
252
|
-
polygonOffset: true,
|
|
253
|
-
polygonOffsetFactor: -10,
|
|
254
|
-
fog: false,
|
|
255
|
-
}"
|
|
256
|
-
/>
|
|
257
|
-
</ngt-group>
|
|
258
|
-
`,
|
|
259
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
260
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
261
|
-
imports: [NgtsLine, NgtsHTML, NgtsHTMLContent],
|
|
262
|
-
}]
|
|
263
|
-
}], ctorParameters: () => [] });
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy1yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL2NvbnRyb2xzL3NyYy9saWIvcGl2b3QtY29udHJvbHMvYXhpcy1yb3RhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUVyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQy9CLE1BQU0sZUFBZSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFFdEMsU0FBUyxTQUFTLENBQUMsT0FBZTtJQUNqQyxPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLE9BQWU7SUFDakMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxVQUFtQixFQUFFLGlCQUEwQixFQUFF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akMsZUFBZTtrQkFsRDNCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMENUO29CQUNELE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUM7aUJBQzlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdFNpZ25hbCxcblx0c2lnbmFsLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpbmplY3RTdG9yZSwgTmd0VGhyZWVFdmVudCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTmd0c0xpbmUgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvYWJzdHJhY3Rpb25zJztcbmltcG9ydCB7IE5ndHNIVE1MLCBOZ3RzSFRNTENvbnRlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvbWlzYyc7XG5pbXBvcnQgeyBEb3VibGVTaWRlLCBHcm91cCwgTWF0cml4NCwgUGxhbmUsIFJheSwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IE5ndHNQaXZvdENvbnRyb2xzIH0gZnJvbSAnLi9waXZvdC1jb250cm9scyc7XG5cbmNvbnN0IGNsaWNrRGlyID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IGludGVyc2VjdGlvbkRpciA9IG5ldyBWZWN0b3IzKCk7XG5cbmZ1bmN0aW9uIHRvRGVncmVlcyhyYWRpYW5zOiBudW1iZXIpIHtcblx0cmV0dXJuIChyYWRpYW5zICogMTgwKSAvIE1hdGguUEk7XG59XG5cbmZ1bmN0aW9uIHRvUmFkaWFucyhkZWdyZWVzOiBudW1iZXIpIHtcblx0cmV0dXJuIChkZWdyZWVzICogTWF0aC5QSSkgLyAxODA7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUFuZ2xlKGNsaWNrUG9pbnQ6IFZlY3RvcjMsIGludGVyc2VjdGlvblBvaW50OiBWZWN0b3IzLCBvcmlnaW46IFZlY3RvcjMsIGUxOiBWZWN0b3IzLCBlMjogVmVjdG9yMykge1xuXHRjbGlja0Rpci5jb3B5KGNsaWNrUG9pbnQpLnN1YihvcmlnaW4pO1xuXHRpbnRlcnNlY3Rpb25EaXIuY29weShpbnRlcnNlY3Rpb25Qb2ludCkuc3ViKG9yaWdpbik7XG5cdGNvbnN0IGRvdGUxZTEgPSBlMS5kb3QoZTEpO1xuXHRjb25zdCBkb3RlMmUyID0gZTIuZG90KGUyKTtcblx0Y29uc3QgdUNsaWNrID0gY2xpY2tEaXIuZG90KGUxKSAvIGRvdGUxZTE7XG5cdGNvbnN0IHZDbGljayA9IGNsaWNrRGlyLmRvdChlMikgLyBkb3RlMmUyO1xuXHRjb25zdCB1SW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uRGlyLmRvdChlMSkgLyBkb3RlMWUxO1xuXHRjb25zdCB2SW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uRGlyLmRvdChlMikgLyBkb3RlMmUyO1xuXHRjb25zdCBhbmdsZUNsaWNrID0gTWF0aC5hdGFuMih2Q2xpY2ssIHVDbGljayk7XG5cdGNvbnN0IGFuZ2xlSW50ZXJzZWN0aW9uID0gTWF0aC5hdGFuMih2SW50ZXJzZWN0aW9uLCB1SW50ZXJzZWN0aW9uKTtcblx0cmV0dXJuIGFuZ2xlSW50ZXJzZWN0aW9uIC0gYW5nbGVDbGljaztcbn1cblxuZnVuY3Rpb24gZm1vZChudW06IG51bWJlciwgZGVub206IG51bWJlcikge1xuXHRsZXQgayA9IE1hdGguZmxvb3IobnVtIC8gZGVub20pO1xuXHRrID0gayA8IDAgPyBrICsgMSA6IGs7XG5cblx0cmV0dXJuIG51bSAtIGsgKiBkZW5vbTtcbn1cblxuZnVuY3Rpb24gbWluaW1pemVBbmdsZShhbmdsZTogbnVtYmVyKSB7XG5cdGxldCByZXN1bHQgPSBmbW9kKGFuZ2xlLCAyICogTWF0aC5QSSk7XG5cblx0aWYgKE1hdGguYWJzKHJlc3VsdCkgPCAxZS02KSB7XG5cdFx0cmV0dXJuIDAuMDtcblx0fVxuXG5cdGlmIChyZXN1bHQgPCAwLjApIHtcblx0XHRyZXN1bHQgKz0gMiAqIE1hdGguUEk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCByb3RNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgcG9zTmV3ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IHJheSA9IG5ldyBSYXkoKTtcbmNvbnN0IGludGVyc2VjdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYXhpcy1yb3RhdG9yJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwXG5cdFx0XHQjZ3JvdXBcblx0XHRcdFttYXRyaXhdPVwibWF0cml4TCgpXCJcblx0XHRcdFttYXRyaXhBdXRvVXBkYXRlXT1cImZhbHNlXCJcblx0XHRcdChwb2ludGVyZG93bik9XCJvblBvaW50ZXJEb3duKCRhbnkoJGV2ZW50KSlcIlxuXHRcdFx0KHBvaW50ZXJtb3ZlKT1cIm9uUG9pbnRlck1vdmUoJGFueSgkZXZlbnQpKVwiXG5cdFx0XHQocG9pbnRlcnVwKT1cIm9uUG9pbnRlclVwKCRhbnkoJGV2ZW50KSlcIlxuXHRcdFx0KHBvaW50ZXJvdXQpPVwib25Qb2ludGVyT3V0KCRhbnkoJGV2ZW50KSlcIlxuXHRcdD5cblx0XHRcdEBpZiAocGl2b3RDb250cm9scy5hbm5vdGF0aW9ucygpKSB7XG5cdFx0XHRcdDxuZ3RzLWh0bWwgW29wdGlvbnNdPVwieyBwb3NpdGlvbjogW3IoKSwgcigpLCAwXSB9XCI+XG5cdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0I2Fubm90YXRpb25cblx0XHRcdFx0XHRcdG5ndHNIVE1MQ29udGVudFxuXHRcdFx0XHRcdFx0c3R5bGU9XCJkaXNwbGF5OiBub25lOyBiYWNrZ3JvdW5kOiAjMTUxNTIwOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDZweCA4cHg7IGJvcmRlci1yYWRpdXM6IDdweDsgd2hpdGUtc3BhY2U6IG5vd3JhcFwiXG5cdFx0XHRcdFx0XHRbY2xhc3NdPVwicGl2b3RDb250cm9scy5hbm5vdGF0aW9uc0NsYXNzKClcIlxuXHRcdFx0XHRcdD48L2Rpdj5cblx0XHRcdFx0PC9uZ3RzLWh0bWw+XG5cdFx0XHR9XG5cblx0XHRcdDxuZ3RzLWxpbmVcblx0XHRcdFx0W3BvaW50c109XCJhcmMoKVwiXG5cdFx0XHRcdFtvcHRpb25zXT1cInsgbGluZVdpZHRoOiBwaXZvdENvbnRyb2xzLmxpbmVXaWR0aCgpICogNCwgdmlzaWJsZTogZmFsc2UsIHVzZXJEYXRhOiBwaXZvdENvbnRyb2xzLnVzZXJEYXRhKCkgfVwiXG5cdFx0XHQvPlxuXG5cdFx0XHQ8bmd0cy1saW5lXG5cdFx0XHRcdFtwb2ludHNdPVwiYXJjKClcIlxuXHRcdFx0XHRbb3B0aW9uc109XCJ7XG5cdFx0XHRcdFx0dHJhbnNwYXJlbnQ6IHRydWUsXG5cdFx0XHRcdFx0cmF5Y2FzdDogbnVsbCxcblx0XHRcdFx0XHRkZXB0aFRlc3Q6IHBpdm90Q29udHJvbHMuZGVwdGhUZXN0KCksXG5cdFx0XHRcdFx0bGluZVdpZHRoOiBwaXZvdENvbnRyb2xzLmxpbmVXaWR0aCgpLFxuXHRcdFx0XHRcdHNpZGU6IERvdWJsZVNpZGUsXG5cdFx0XHRcdFx0Y29sb3I6IGhvdmVyZWQoKSA/IHBpdm90Q29udHJvbHMuaG92ZXJlZENvbG9yKCkgOiBwaXZvdENvbnRyb2xzLmF4aXNDb2xvcnMoKVtheGlzKCldLFxuXHRcdFx0XHRcdG9wYWNpdHk6IHBpdm90Q29udHJvbHMub3BhY2l0eSgpLFxuXHRcdFx0XHRcdHBvbHlnb25PZmZzZXQ6IHRydWUsXG5cdFx0XHRcdFx0cG9seWdvbk9mZnNldEZhY3RvcjogLTEwLFxuXHRcdFx0XHRcdGZvZzogZmFsc2UsXG5cdFx0XHRcdH1cIlxuXHRcdFx0Lz5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndHNMaW5lLCBOZ3RzSFRNTCwgTmd0c0hUTUxDb250ZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0F4aXNSb3RhdG9yIHtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IERvdWJsZVNpZGUgPSBEb3VibGVTaWRlO1xuXG5cdGRpcjEgPSBpbnB1dC5yZXF1aXJlZDxWZWN0b3IzPigpO1xuXHRkaXIyID0gaW5wdXQucmVxdWlyZWQ8VmVjdG9yMz4oKTtcblx0YXhpcyA9IGlucHV0LnJlcXVpcmVkPDAgfCAxIHwgMj4oKTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cdGFubm90YXRpb25SZWYgPSB2aWV3Q2hpbGQ8dW5rbm93biwgRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdhbm5vdGF0aW9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG5cdHBpdm90Q29udHJvbHMgPSBpbmplY3QoTmd0c1Bpdm90Q29udHJvbHMpO1xuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBjb250cm9scyA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjb250cm9scycpIGFzIHVua25vd24gYXMgU2lnbmFsPHsgZW5hYmxlZDogYm9vbGVhbiB9PjtcblxuXHRob3ZlcmVkID0gc2lnbmFsKGZhbHNlKTtcblx0cHJpdmF0ZSBhbmdsZSA9IDA7XG5cdHByaXZhdGUgYW5nbGUwID0gMDtcblx0cHJpdmF0ZSBjbGlja0luZm86IHtcblx0XHRjbGlja1BvaW50OiBWZWN0b3IzO1xuXHRcdG9yaWdpbjogVmVjdG9yMztcblx0XHRlMTogVmVjdG9yMztcblx0XHRlMjogVmVjdG9yMztcblx0XHRub3JtYWw6IFZlY3RvcjM7XG5cdFx0cGxhbmU6IFBsYW5lO1xuXHR9IHwgbnVsbCA9IG51bGw7XG5cblx0bWF0cml4TCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBkaXIxTiA9IHRoaXMuZGlyMSgpLmNsb25lKCkubm9ybWFsaXplKCk7XG5cdFx0Y29uc3QgZGlyMk4gPSB0aGlzLmRpcjIoKS5jbG9uZSgpLm5vcm1hbGl6ZSgpO1xuXHRcdHJldHVybiBuZXcgTWF0cml4NCgpLm1ha2VCYXNpcyhkaXIxTiwgZGlyMk4sIGRpcjFOLmNsb25lKCkuY3Jvc3MoZGlyMk4pKTtcblx0fSk7XG5cdHIgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5waXZvdENvbnRyb2xzLmZpeGVkKCkgPyAwLjY1IDogdGhpcy5waXZvdENvbnRyb2xzLnNjYWxlKCkgKiAwLjY1KSk7XG5cdGFyYyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBzZWdtZW50cyA9IDMyO1xuXHRcdGNvbnN0IHBvaW50czogVmVjdG9yM1tdID0gW107XG5cdFx0Zm9yIChsZXQgaiA9IDA7IGogPD0gc2VnbWVudHM7IGorKykge1xuXHRcdFx0Y29uc3QgYW5nbGUgPSAoaiAqIChNYXRoLlBJIC8gMikpIC8gc2VnbWVudHM7XG5cdFx0XHRwb2ludHMucHVzaChuZXcgVmVjdG9yMyhNYXRoLmNvcyhhbmdsZSkgKiB0aGlzLnIoKSwgTWF0aC5zaW4oYW5nbGUpICogdGhpcy5yKCksIDApKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBvaW50cztcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAgfSk7XG5cdH1cblxuXHRvblBvaW50ZXJEb3duKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRjb25zdCBbYW5ub3RhdGlvbiwgZ3JvdXAsIGF4aXMsIGNvbnRyb2xzXSA9IFtcblx0XHRcdHRoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0dGhpcy5ncm91cFJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHR0aGlzLmF4aXMoKSxcblx0XHRcdHRoaXMuY29udHJvbHMoKSxcblx0XHRdO1xuXG5cdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdGFubm90YXRpb24uaW5uZXJUZXh0ID0gYCR7dG9EZWdyZWVzKHRoaXMuYW5nbGUpLnRvRml4ZWQoMCl9wrpgO1xuXHRcdFx0YW5ub3RhdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHR9XG5cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRjb25zdCBjbGlja1BvaW50ID0gZXZlbnQucG9pbnQuY2xvbmUoKTtcblx0XHRjb25zdCBvcmlnaW4gPSBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhQb3NpdGlvbihncm91cC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgZTEgPSBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhDb2x1bW4oZ3JvdXAubWF0cml4V29ybGQsIDApLm5vcm1hbGl6ZSgpO1xuXHRcdGNvbnN0IGUyID0gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4Q29sdW1uKGdyb3VwLm1hdHJpeFdvcmxkLCAxKS5ub3JtYWxpemUoKTtcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhDb2x1bW4oZ3JvdXAubWF0cml4V29ybGQsIDIpLm5vcm1hbGl6ZSgpO1xuXHRcdGNvbnN0IHBsYW5lID0gbmV3IFBsYW5lKCkuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobm9ybWFsLCBvcmlnaW4pO1xuXHRcdHRoaXMuY2xpY2tJbmZvID0geyBjbGlja1BvaW50LCBvcmlnaW4sIGUxLCBlMiwgbm9ybWFsLCBwbGFuZSB9O1xuXHRcdHRoaXMucGl2b3RDb250cm9scy5vbkRyYWdTdGFydCh7IGNvbXBvbmVudDogJ1JvdGF0b3InLCBheGlzLCBvcmlnaW4sIGRpcmVjdGlvbnM6IFtlMSwgZTIsIG5vcm1hbF0gfSk7XG5cblx0XHRpZiAoY29udHJvbHMpIHtcblx0XHRcdGNvbnRyb2xzLmVuYWJsZWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gc2V0UG9pbnRlckNhcHR1cmUgaXMgbm90IGEgZnVuY3Rpb24gb24gUG9pbnRlckV2ZW50XG5cdFx0ZXZlbnQudGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG5cdH1cblxuXHRvblBvaW50ZXJNb3ZlKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRpZiAoIXRoaXMuaG92ZXJlZCgpKSB0aGlzLmhvdmVyZWQuc2V0KHRydWUpO1xuXHRcdGlmICh0aGlzLmNsaWNrSW5mbykge1xuXHRcdFx0Y29uc3QgeyBjbGlja1BvaW50LCBvcmlnaW4sIGUxLCBlMiwgbm9ybWFsLCBwbGFuZSB9ID0gdGhpcy5jbGlja0luZm87XG5cdFx0XHRjb25zdCBbcm90YXRpb25MaW1pdHMsIGF4aXMsIGFubm90YXRpb25dID0gW1xuXHRcdFx0XHR0aGlzLnBpdm90Q29udHJvbHMucm90YXRpb25MaW1pdHMoKSxcblx0XHRcdFx0dGhpcy5heGlzKCksXG5cdFx0XHRcdHRoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XTtcblxuXHRcdFx0Y29uc3QgW21pbiwgbWF4XSA9IHJvdGF0aW9uTGltaXRzPy5bYXhpc10gfHwgW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcblxuXHRcdFx0cmF5LmNvcHkoZXZlbnQucmF5KTtcblx0XHRcdHJheS5pbnRlcnNlY3RQbGFuZShwbGFuZSwgaW50ZXJzZWN0aW9uKTtcblx0XHRcdHJheS5kaXJlY3Rpb24ubmVnYXRlKCk7XG5cdFx0XHRyYXkuaW50ZXJzZWN0UGxhbmUocGxhbmUsIGludGVyc2VjdGlvbik7XG5cdFx0XHRsZXQgZGVsdGFBbmdsZSA9IGNhbGN1bGF0ZUFuZ2xlKGNsaWNrUG9pbnQsIGludGVyc2VjdGlvbiwgb3JpZ2luLCBlMSwgZTIpO1xuXHRcdFx0bGV0IGRlZ3JlZXMgPSB0b0RlZ3JlZXMoZGVsdGFBbmdsZSk7XG5cblx0XHRcdGlmIChldmVudC5zaGlmdEtleSkge1xuXHRcdFx0XHRkZWdyZWVzID0gTWF0aC5yb3VuZChkZWdyZWVzIC8gMTApICogMTA7XG5cdFx0XHRcdGRlbHRhQW5nbGUgPSB0b1JhZGlhbnMoZGVncmVlcyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiBtYXggIT09IHVuZGVmaW5lZCAmJiBtYXggLSBtaW4gPCAyICogTWF0aC5QSSkge1xuXHRcdFx0XHRkZWx0YUFuZ2xlID0gbWluaW1pemVBbmdsZShkZWx0YUFuZ2xlKTtcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IGRlbHRhQW5nbGUgPiBNYXRoLlBJID8gZGVsdGFBbmdsZSAtIDIgKiBNYXRoLlBJIDogZGVsdGFBbmdsZTtcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IE1hdGgucm91bmQoZGVsdGFBbmdsZSAvIDEwKSAqIDEwO1xuXHRcdFx0XHR0aGlzLmFuZ2xlID0gdGhpcy5hbmdsZTAgKyBkZWx0YUFuZ2xlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hbmdsZSA9IG1pbmltaXplQW5nbGUodGhpcy5hbmdsZTAgKyBkZWx0YUFuZ2xlKTtcblx0XHRcdFx0dGhpcy5hbmdsZSA9IHRoaXMuYW5nbGUgPiBNYXRoLlBJID8gdGhpcy5hbmdsZSAtIDIgKiBNYXRoLlBJIDogdGhpcy5hbmdsZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdFx0ZGVncmVlcyA9IHRvRGVncmVlcyh0aGlzLmFuZ2xlKTtcblx0XHRcdFx0YW5ub3RhdGlvbi5pbm5lclRleHQgPSBgJHtkZWdyZWVzLnRvRml4ZWQoMCl9wrpgO1xuXHRcdFx0fVxuXG5cdFx0XHRyb3RNYXRyaXgubWFrZVJvdGF0aW9uQXhpcyhub3JtYWwsIGRlbHRhQW5nbGUpO1xuXHRcdFx0cG9zTmV3LmNvcHkob3JpZ2luKS5hcHBseU1hdHJpeDQocm90TWF0cml4KS5zdWIob3JpZ2luKS5uZWdhdGUoKTtcblx0XHRcdHJvdE1hdHJpeC5zZXRQb3NpdGlvbihwb3NOZXcpO1xuXHRcdFx0dGhpcy5waXZvdENvbnRyb2xzLm9uRHJhZyhyb3RNYXRyaXgpO1xuXHRcdH1cblx0fVxuXG5cdG9uUG9pbnRlclVwKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRjb25zdCBbYW5ub3RhdGlvbiwgY29udHJvbHNdID0gW3RoaXMuYW5ub3RhdGlvblJlZigpPy5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbnRyb2xzKCldO1xuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRhbm5vdGF0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0fVxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMuY2xpY2tJbmZvID0gbnVsbDtcblx0XHR0aGlzLnBpdm90Q29udHJvbHMub25EcmFnRW5kKCk7XG5cdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRjb250cm9scy5lbmFibGVkID0gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpcyBub3QgYSBmdW5jdGlvbiBvbiBQb2ludGVyRXZlbnRcblx0XHRldmVudC50YXJnZXQucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG5cdH1cblxuXHRvblBvaW50ZXJPdXQoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pikge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMuaG92ZXJlZC5zZXQoZmFsc2UpO1xuXHR9XG59XG4iXX0=
|