angular-three 2.0.0-beta.31 → 2.0.0-beta.310
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/README.md +221 -4
- package/esm2022/index.mjs +13 -13
- package/esm2022/lib/canvas.mjs +128 -200
- package/esm2022/lib/directives/args.mjs +46 -20
- package/esm2022/lib/directives/selection.mjs +65 -0
- package/esm2022/lib/dom/events.mjs +2 -2
- package/esm2022/lib/events.mjs +33 -31
- package/esm2022/lib/html.mjs +40 -0
- package/esm2022/lib/instance.mjs +43 -36
- package/esm2022/lib/loader.mjs +62 -31
- package/esm2022/lib/loop.mjs +28 -25
- package/esm2022/lib/pipes/hexify.mjs +67 -0
- package/esm2022/lib/portal.mjs +173 -193
- package/esm2022/lib/renderer/catalogue.mjs +2 -2
- package/esm2022/lib/renderer/constants.mjs +5 -6
- package/esm2022/lib/renderer/index.mjs +387 -234
- package/esm2022/lib/renderer/state.mjs +49 -0
- package/esm2022/lib/renderer/utils.mjs +107 -95
- package/esm2022/lib/roots.mjs +85 -61
- package/esm2022/lib/routed-scene.mjs +6 -7
- package/esm2022/lib/store.mjs +170 -194
- package/esm2022/lib/three-types.mjs +2 -2
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/apply-props.mjs +24 -28
- package/esm2022/lib/utils/attach.mjs +12 -9
- package/esm2022/lib/utils/before-render.mjs +12 -0
- package/esm2022/lib/utils/is.mjs +6 -5
- package/esm2022/lib/utils/make.mjs +19 -17
- package/esm2022/lib/utils/non-nullish.mjs +7 -0
- package/esm2022/lib/utils/object-events.mjs +92 -0
- package/esm2022/lib/utils/parameters.mjs +70 -0
- package/esm2022/lib/utils/resolve-ref.mjs +8 -0
- package/esm2022/lib/utils/signal-store.mjs +52 -58
- package/esm2022/lib/utils/update.mjs +8 -4
- package/esm2022/testing/angular-three-testing.mjs +5 -0
- package/esm2022/testing/index.mjs +3 -0
- package/esm2022/testing/lib/test-bed.mjs +130 -0
- package/esm2022/testing/lib/test-canvas.mjs +45 -0
- package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
- package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
- package/fesm2022/angular-three-testing.mjs +966 -0
- package/fesm2022/angular-three-testing.mjs.map +1 -0
- package/fesm2022/angular-three.mjs +2506 -2539
- package/fesm2022/angular-three.mjs.map +1 -1
- package/index.d.ts +14 -12
- package/lib/canvas.d.ts +366 -96
- package/lib/directives/args.d.ts +14 -7
- package/lib/directives/selection.d.ts +17 -0
- package/lib/dom/events.d.ts +2 -3
- package/lib/events.d.ts +4 -80
- package/lib/html.d.ts +17 -0
- package/lib/instance.d.ts +3 -35
- package/lib/loader.d.ts +18 -6
- package/lib/loop.d.ts +11 -59
- package/lib/pipes/hexify.d.ts +20 -0
- package/lib/portal.d.ts +54 -48
- package/lib/renderer/catalogue.d.ts +7 -3
- package/lib/renderer/constants.d.ts +4 -5
- package/lib/renderer/index.d.ts +64 -4
- package/lib/renderer/state.d.ts +24 -0
- package/lib/renderer/utils.d.ts +9 -27
- package/lib/roots.d.ts +9 -7
- package/lib/store.d.ts +13 -141
- package/lib/three-types.d.ts +500 -147
- package/lib/types.d.ts +291 -0
- package/lib/utils/apply-props.d.ts +1 -3
- package/lib/utils/attach.d.ts +3 -5
- package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
- package/lib/utils/is.d.ts +13 -14
- package/lib/utils/make.d.ts +7 -13
- package/lib/utils/non-nullish.d.ts +4 -0
- package/lib/utils/object-events.d.ts +34 -0
- package/lib/utils/parameters.d.ts +20 -0
- package/lib/utils/resolve-ref.d.ts +2 -0
- package/lib/utils/signal-store.d.ts +13 -4
- package/lib/utils/update.d.ts +1 -1
- package/metadata.json +1 -1
- package/package.json +40 -24
- package/plugin/generators.json +8 -30
- package/plugin/package.json +3 -22
- package/plugin/src/generators/add-soba/compat.js.map +1 -0
- package/plugin/src/generators/add-soba/generator.d.ts +3 -0
- package/plugin/src/generators/add-soba/generator.js +78 -0
- package/plugin/src/generators/add-soba/generator.js.map +1 -0
- package/plugin/src/generators/add-soba/schema.json +4 -0
- package/plugin/src/generators/init/compat.d.ts +1 -3
- package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -7
- package/plugin/src/generators/init/generator.d.ts +5 -5
- package/plugin/src/generators/init/generator.js +100 -106
- package/plugin/src/generators/init/generator.js.map +1 -1
- package/plugin/src/generators/init/schema.json +8 -12
- package/plugin/src/generators/utils.js +4 -3
- package/plugin/src/generators/utils.js.map +1 -1
- package/plugin/src/generators/version.d.ts +17 -0
- package/plugin/src/generators/version.js +21 -0
- package/plugin/src/generators/version.js.map +1 -0
- package/plugin/src/index.d.ts +0 -3
- package/plugin/src/index.js +0 -9
- package/plugin/src/index.js.map +1 -1
- package/testing/README.md +3 -0
- package/testing/index.d.ts +2 -0
- package/testing/lib/test-bed.d.ts +38 -0
- package/testing/lib/test-canvas.d.ts +11 -0
- package/testing/lib/utils/mock-canvas.d.ts +5 -0
- package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
- package/testing/package.json +3 -0
- package/web-types.json +1 -1
- package/esm2022/lib/before-render.mjs +0 -13
- package/esm2022/lib/directives/common.mjs +0 -41
- package/esm2022/lib/directives/key.mjs +0 -29
- package/esm2022/lib/directives/parent.mjs +0 -35
- package/esm2022/lib/ref.mjs +0 -48
- package/esm2022/lib/renderer/store.mjs +0 -408
- package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
- package/lib/directives/common.d.ts +0 -15
- package/lib/directives/key.d.ts +0 -10
- package/lib/directives/parent.d.ts +0 -11
- package/lib/ref.d.ts +0 -8
- package/lib/renderer/store.d.ts +0 -67
- package/lib/utils/safe-detect-changes.d.ts +0 -2
- package/plugin/migrations.json +0 -16
- package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +0 -4
- package/plugin/src/generators/init-cannon/compat.js.map +0 -1
- package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
- package/plugin/src/generators/init-cannon/generator.js +0 -23
- package/plugin/src/generators/init-cannon/generator.js.map +0 -1
- package/plugin/src/generators/init-cannon/schema.json +0 -6
- package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
- package/plugin/src/generators/init-postprocessing/compat.js +0 -6
- package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
- package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
- package/plugin/src/generators/init-postprocessing/generator.js +0 -21
- package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
- package/plugin/src/generators/init-postprocessing/schema.json +0 -6
- package/plugin/src/generators/init-soba/compat.d.ts +0 -2
- package/plugin/src/generators/init-soba/compat.js +0 -6
- package/plugin/src/generators/init-soba/compat.js.map +0 -1
- package/plugin/src/generators/init-soba/generator.d.ts +0 -2
- package/plugin/src/generators/init-soba/generator.js +0 -27
- package/plugin/src/generators/init-soba/generator.js.map +0 -1
- package/plugin/src/generators/init-soba/schema.json +0 -6
- package/plugin/src/generators/versions.d.ts +0 -13
- package/plugin/src/generators/versions.js +0 -17
- package/plugin/src/generators/versions.js.map +0 -1
- package/plugin/src/migrations/migrate-to-ngxtension/compat.d.ts +0 -2
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js +0 -6
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js.map +0 -1
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.d.ts +0 -2
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js +0 -41
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js.map +0 -1
- /package/plugin/src/generators/{init-cannon → add-soba}/compat.d.ts +0 -0
- /package/plugin/src/generators/{init-cannon → add-soba}/compat.js +0 -0
|
@@ -1,73 +1,66 @@
|
|
|
1
1
|
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import {
|
|
2
|
+
import { Injectable, RendererFactory2, getDebugNode, inject, makeEnvironmentProviders, untracked, } from '@angular/core';
|
|
3
|
+
import { NgtArgs } from '../directives/args';
|
|
3
4
|
import { getLocalState, prepare } from '../instance';
|
|
4
|
-
import {
|
|
5
|
+
import { NGT_STORE, injectStore, provideStore } from '../store';
|
|
6
|
+
import { applyProps } from '../utils/apply-props';
|
|
5
7
|
import { is } from '../utils/is';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { signalStore } from '../utils/signal-store';
|
|
9
|
+
import { injectCatalogue } from './catalogue';
|
|
10
|
+
import { HTML, ROUTED_SCENE, SPECIAL_DOM_TAG, SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES } from './constants';
|
|
11
|
+
import { addChild, createNode, getClosestParentWithInstance, isDOM, removeChild, setParent, } from './state';
|
|
12
|
+
import { attachThreeChild, kebabToPascal, processThreeEvent, removeThreeChild } from './utils';
|
|
10
13
|
import * as i0 from "@angular/core";
|
|
11
|
-
class NgtRendererFactory {
|
|
14
|
+
export class NgtRendererFactory {
|
|
12
15
|
constructor() {
|
|
13
16
|
this.delegateRendererFactory = inject(RendererFactory2, { skipSelf: true });
|
|
14
|
-
this.
|
|
15
|
-
this.catalogue =
|
|
16
|
-
this.
|
|
17
|
+
this.document = inject(DOCUMENT);
|
|
18
|
+
this.catalogue = injectCatalogue();
|
|
19
|
+
this.rootStore = injectStore();
|
|
20
|
+
this.portalCommentsNodes = [];
|
|
17
21
|
this.rendererMap = new Map();
|
|
18
22
|
this.routedSet = new Set();
|
|
19
|
-
// all Renderer instances share the same Store
|
|
20
|
-
this.rendererStore = new NgtRendererStore({
|
|
21
|
-
portals: [],
|
|
22
|
-
store: injectNgtStore(),
|
|
23
|
-
compoundPrefixes: inject(NGT_COMPOUND_PREFIXES),
|
|
24
|
-
document: inject(DOCUMENT),
|
|
25
|
-
});
|
|
26
23
|
}
|
|
27
24
|
createRenderer(hostElement, type) {
|
|
28
|
-
const
|
|
25
|
+
const delegateRenderer = this.delegateRendererFactory.createRenderer(hostElement, type);
|
|
29
26
|
if (!type)
|
|
30
|
-
return
|
|
31
|
-
//
|
|
27
|
+
return delegateRenderer;
|
|
28
|
+
// NOTE: might need to revisit this
|
|
32
29
|
if (type['type'][HTML]) {
|
|
33
|
-
this.rendererMap.set(type.id,
|
|
34
|
-
return
|
|
30
|
+
this.rendererMap.set(type.id, delegateRenderer);
|
|
31
|
+
return delegateRenderer;
|
|
35
32
|
}
|
|
36
33
|
if (type['type'][ROUTED_SCENE]) {
|
|
37
34
|
this.routedSet.add(type.id);
|
|
38
35
|
}
|
|
39
36
|
let renderer = this.rendererMap.get(type.id);
|
|
40
37
|
if (!renderer) {
|
|
41
|
-
renderer = new NgtRenderer(
|
|
38
|
+
this.rendererMap.set(type.id, (renderer = new NgtRenderer(delegateRenderer, this.rootStore, this.document, this.portalCommentsNodes, this.catalogue,
|
|
42
39
|
// setting root scene if there's no routed scene OR this component is the routed Scene
|
|
43
|
-
!hostElement && (this.routedSet.size === 0 || this.routedSet.has(type.id)));
|
|
44
|
-
this.rendererMap.set(type.id, renderer);
|
|
40
|
+
!hostElement && (this.routedSet.size === 0 || this.routedSet.has(type.id)))));
|
|
45
41
|
}
|
|
46
42
|
return renderer;
|
|
47
43
|
}
|
|
48
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
49
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
44
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
45
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtRendererFactory }); }
|
|
50
46
|
}
|
|
51
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtRendererFactory, decorators: [{
|
|
52
48
|
type: Injectable
|
|
53
49
|
}] });
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
*/
|
|
57
|
-
class NgtRenderer {
|
|
58
|
-
constructor(delegate, store, catalogue, zone, cdr, root = true) {
|
|
50
|
+
export class NgtRenderer {
|
|
51
|
+
constructor(delegate, rootStore, document, portalCommentsNodes, catalogue, isRoot = true) {
|
|
59
52
|
this.delegate = delegate;
|
|
60
|
-
this.
|
|
53
|
+
this.rootStore = rootStore;
|
|
54
|
+
this.document = document;
|
|
55
|
+
this.portalCommentsNodes = portalCommentsNodes;
|
|
61
56
|
this.catalogue = catalogue;
|
|
62
|
-
this.
|
|
63
|
-
this.
|
|
64
|
-
this.root = root;
|
|
57
|
+
this.isRoot = isRoot;
|
|
58
|
+
this.argsCommentNodes = [];
|
|
65
59
|
this.createText = this.delegate.createText.bind(this.delegate);
|
|
66
60
|
this.destroy = this.delegate.destroy.bind(this.delegate);
|
|
67
61
|
this.destroyNode = null;
|
|
68
62
|
this.selectRootElement = this.delegate.selectRootElement.bind(this.delegate);
|
|
69
63
|
this.nextSibling = this.delegate.nextSibling.bind(this.delegate);
|
|
70
|
-
this.removeAttribute = this.delegate.removeAttribute.bind(this.delegate);
|
|
71
64
|
this.addClass = this.delegate.addClass.bind(this.delegate);
|
|
72
65
|
this.removeClass = this.delegate.removeClass.bind(this.delegate);
|
|
73
66
|
this.setStyle = this.delegate.setStyle.bind(this.delegate);
|
|
@@ -76,60 +69,53 @@ class NgtRenderer {
|
|
|
76
69
|
}
|
|
77
70
|
createElement(name, namespace) {
|
|
78
71
|
const element = this.delegate.createElement(name, namespace);
|
|
72
|
+
// if there's namespace, we don't do anything
|
|
73
|
+
if (namespace) {
|
|
74
|
+
return createNode('dom', element, this.document);
|
|
75
|
+
}
|
|
79
76
|
// on first pass, we return the Root Scene as the root node
|
|
80
|
-
if (this.
|
|
81
|
-
this.
|
|
82
|
-
const node =
|
|
83
|
-
node.__ngt_renderer__[NgtRendererClassId.injectorFactory] = () => getDebugNode(element)
|
|
77
|
+
if (this.isRoot) {
|
|
78
|
+
this.isRoot = false;
|
|
79
|
+
const node = createNode('three', this.rootStore.snapshot.scene, this.document);
|
|
80
|
+
node.__ngt_renderer__[6 /* NgtRendererClassId.injectorFactory */] = () => getDebugNode(element)?.injector;
|
|
84
81
|
return node;
|
|
85
82
|
}
|
|
86
|
-
// handle compound
|
|
87
|
-
if (this.store.isCompound(name)) {
|
|
88
|
-
return this.store.createNode('compound', element);
|
|
89
|
-
}
|
|
90
|
-
// handle portal
|
|
91
83
|
if (name === SPECIAL_DOM_TAG.NGT_PORTAL) {
|
|
92
|
-
return
|
|
84
|
+
return createNode('portal', element, this.document);
|
|
93
85
|
}
|
|
94
|
-
// handle raw value
|
|
95
86
|
if (name === SPECIAL_DOM_TAG.NGT_VALUE) {
|
|
96
|
-
|
|
87
|
+
const instanceStore = signalStore({ parent: null, objects: [], nonObjects: [] });
|
|
88
|
+
return createNode('three', Object.assign({ __ngt_renderer__: { rawValue: undefined } },
|
|
97
89
|
// NOTE: we assign this manually to a raw value node
|
|
98
90
|
// because we say it is a 'three' node but we're not using prepare()
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
91
|
+
{
|
|
92
|
+
__ngt__: {
|
|
93
|
+
isRaw: true,
|
|
94
|
+
instanceStore,
|
|
95
|
+
setParent(parent) {
|
|
96
|
+
instanceStore.update({ parent });
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
}), this.document);
|
|
100
|
+
}
|
|
101
|
+
const [injectedArgs] = [this.getNgtArgs()?.value || []];
|
|
109
102
|
if (name === SPECIAL_DOM_TAG.NGT_PRIMITIVE) {
|
|
110
103
|
if (!injectedArgs[0])
|
|
111
104
|
throw new Error(`[NGT] ngt-primitive without args is invalid`);
|
|
112
105
|
const object = injectedArgs[0];
|
|
113
|
-
|
|
114
|
-
if (!
|
|
106
|
+
const localState = getLocalState(object);
|
|
107
|
+
if (!localState) {
|
|
115
108
|
// NOTE: if an object isn't already "prepared", we prepare it
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
if (!localState.store)
|
|
119
|
-
localState.store = store;
|
|
120
|
-
const node = this.store.createNode('three', object);
|
|
121
|
-
if (parent) {
|
|
122
|
-
node.__ngt_renderer__[NgtRendererClassId.injectedParent] = parent;
|
|
109
|
+
prepare(object, { store: this.rootStore, primitive: true });
|
|
123
110
|
}
|
|
124
|
-
return
|
|
111
|
+
return createNode('three', object, this.document);
|
|
125
112
|
}
|
|
126
|
-
const
|
|
127
|
-
const threeName = kebabToPascal(threeTag);
|
|
113
|
+
const threeName = kebabToPascal(name.startsWith('ngt-') ? name.slice(4) : name);
|
|
128
114
|
const threeTarget = this.catalogue[threeName];
|
|
129
115
|
// we have the THREE constructor here, handle it
|
|
130
116
|
if (threeTarget) {
|
|
131
|
-
const instance = prepare(new threeTarget(...injectedArgs), { store
|
|
132
|
-
const node =
|
|
117
|
+
const instance = prepare(new threeTarget(...injectedArgs), { store: this.rootStore });
|
|
118
|
+
const node = createNode('three', instance, this.document);
|
|
133
119
|
const localState = getLocalState(instance);
|
|
134
120
|
// auto-attach for geometry and material
|
|
135
121
|
if (is.geometry(instance)) {
|
|
@@ -138,208 +124,258 @@ class NgtRenderer {
|
|
|
138
124
|
else if (is.material(instance)) {
|
|
139
125
|
localState.attach = ['material'];
|
|
140
126
|
}
|
|
141
|
-
if (parent) {
|
|
142
|
-
node.__ngt_renderer__[NgtRendererClassId.injectedParent] = parent;
|
|
143
|
-
}
|
|
144
127
|
return node;
|
|
145
128
|
}
|
|
146
|
-
return
|
|
129
|
+
return createNode('dom', element, this.document);
|
|
147
130
|
}
|
|
148
131
|
createComment(value) {
|
|
149
|
-
|
|
132
|
+
const comment = this.delegate.createComment(value);
|
|
133
|
+
// NOTE: we attach an arrow function to the Comment node
|
|
134
|
+
// In our directives, we can call this function to then start tracking the RendererNode
|
|
135
|
+
// this is done to limit the amount of Nodes we need to process for getCreationState
|
|
136
|
+
comment[SPECIAL_INTERNAL_ADD_COMMENT] = (node) => {
|
|
137
|
+
if (node === 'args') {
|
|
138
|
+
this.argsCommentNodes.push(comment);
|
|
139
|
+
}
|
|
140
|
+
else if (typeof node === 'object') {
|
|
141
|
+
this.portalCommentsNodes.push(node);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
return createNode('comment', comment, this.document);
|
|
150
145
|
}
|
|
151
146
|
appendChild(parent, newChild) {
|
|
152
147
|
const pRS = parent.__ngt_renderer__;
|
|
153
148
|
const cRS = newChild.__ngt_renderer__;
|
|
154
|
-
if (pRS[NgtRendererClassId.type] === 'dom' &&
|
|
155
|
-
(newChild instanceof Text || cRS[NgtRendererClassId.type] === 'dom')) {
|
|
156
|
-
|
|
149
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'dom' &&
|
|
150
|
+
(newChild instanceof Text || cRS[0 /* NgtRendererClassId.type */] === 'dom')) {
|
|
151
|
+
addChild(parent, newChild);
|
|
152
|
+
if (newChild['__ngt_dom_parent__'] && newChild['__ngt_dom_parent__'] instanceof HTMLElement) {
|
|
153
|
+
this.delegate.appendChild(newChild['__ngt_dom_parent__'], newChild);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
157
156
|
this.delegate.appendChild(parent, newChild);
|
|
158
157
|
if (cRS) {
|
|
159
|
-
|
|
158
|
+
setParent(newChild, parent);
|
|
160
159
|
if (this.shouldFindGrandparentInstance(pRS, cRS, newChild)) {
|
|
161
160
|
// we'll try to get the grandparent instance here so that we can run appendChild with both instances
|
|
162
|
-
const closestGrandparentInstance =
|
|
161
|
+
const closestGrandparentInstance = getClosestParentWithInstance(parent);
|
|
163
162
|
if (closestGrandparentInstance)
|
|
164
163
|
this.appendChild(closestGrandparentInstance, newChild);
|
|
165
164
|
}
|
|
166
165
|
}
|
|
167
166
|
return;
|
|
168
167
|
}
|
|
169
|
-
if (cRS?.[NgtRendererClassId.type] === 'comment') {
|
|
170
|
-
|
|
168
|
+
if (cRS?.[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
169
|
+
setParent(newChild, parent);
|
|
171
170
|
return;
|
|
172
171
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const injector = cRS[NgtRendererClassId.injectorFactory]().get(Injector, null);
|
|
176
|
-
if (!injector) {
|
|
177
|
-
console.warn(`[NGT] NgtRenderer is attempting to start an effect for injectedParent but no Injector is found.`);
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const watcher = effect(() => {
|
|
181
|
-
const injectedParent = cRS[NgtRendererClassId.injectedParent].nativeElement;
|
|
182
|
-
if (injectedParent && injectedParent !== parent) {
|
|
183
|
-
this.appendChild(injectedParent, newChild);
|
|
184
|
-
// only run this effect once
|
|
185
|
-
// as soon as we re-run appendChild with the injectedParent, we stop the effect
|
|
186
|
-
watcher.destroy();
|
|
187
|
-
}
|
|
188
|
-
}, { injector, manualCleanup: true });
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
else if (parent !== cRS[NgtRendererClassId.injectedParent]) {
|
|
192
|
-
this.appendChild(cRS[NgtRendererClassId.injectedParent], newChild);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
this.store.setParent(newChild, parent);
|
|
197
|
-
this.store.addChild(parent, newChild);
|
|
172
|
+
setParent(newChild, parent);
|
|
173
|
+
addChild(parent, newChild);
|
|
198
174
|
// if new child is a portal
|
|
199
|
-
if (cRS?.[NgtRendererClassId.type] === 'portal') {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
175
|
+
if (cRS?.[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
176
|
+
if (!cRS[5 /* NgtRendererClassId.portalContainer */])
|
|
177
|
+
this.processPortalContainer(newChild);
|
|
178
|
+
if (cRS[5 /* NgtRendererClassId.portalContainer */]) {
|
|
179
|
+
this.appendChild(parent, cRS[5 /* NgtRendererClassId.portalContainer */]);
|
|
203
180
|
}
|
|
204
181
|
return;
|
|
205
182
|
}
|
|
206
183
|
// if parent is a portal
|
|
207
|
-
if (pRS[NgtRendererClassId.type] === 'portal') {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
184
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
185
|
+
if (!pRS[5 /* NgtRendererClassId.portalContainer */])
|
|
186
|
+
this.processPortalContainer(parent);
|
|
187
|
+
if (pRS[5 /* NgtRendererClassId.portalContainer */]) {
|
|
188
|
+
this.appendChild(pRS[5 /* NgtRendererClassId.portalContainer */], newChild);
|
|
211
189
|
}
|
|
212
190
|
return;
|
|
213
191
|
}
|
|
214
192
|
// if both are three instances, straightforward case
|
|
215
|
-
if (pRS[NgtRendererClassId.type] === 'three' && cRS?.[NgtRendererClassId.type] === 'three') {
|
|
193
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three' && cRS?.[0 /* NgtRendererClassId.type */] === 'three') {
|
|
194
|
+
const cLS = getLocalState(newChild);
|
|
216
195
|
// if child already attached to a parent, skip
|
|
217
|
-
if (
|
|
196
|
+
if (cLS?.instanceStore?.get('parent'))
|
|
197
|
+
return;
|
|
198
|
+
if (parent === newChild)
|
|
218
199
|
return;
|
|
219
200
|
// attach THREE child
|
|
220
201
|
attachThreeChild(parent, newChild);
|
|
221
|
-
// here, we handle the special case of if the parent has a compoundParent, which means this child is part of a compound parent template
|
|
222
|
-
if (!cRS[NgtRendererClassId.compound])
|
|
223
|
-
return;
|
|
224
|
-
const closestGrandparentWithCompound = this.store.getClosestParentWithCompound(parent);
|
|
225
|
-
if (!closestGrandparentWithCompound)
|
|
226
|
-
return;
|
|
227
|
-
this.appendChild(closestGrandparentWithCompound, newChild);
|
|
228
202
|
return;
|
|
229
203
|
}
|
|
230
204
|
// if only the parent is the THREE instance
|
|
231
|
-
if (pRS[NgtRendererClassId.type] === 'three') {
|
|
232
|
-
for (const renderChild of cRS?.[NgtRendererClassId.children]) {
|
|
205
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
206
|
+
for (const renderChild of cRS?.[2 /* NgtRendererClassId.children */] || []) {
|
|
233
207
|
this.appendChild(parent, renderChild);
|
|
234
208
|
}
|
|
235
209
|
}
|
|
236
|
-
// if parent is a compound
|
|
237
|
-
if (pRS[NgtRendererClassId.type] === 'compound') {
|
|
238
|
-
// if compound doesn't have a THREE instance set yet
|
|
239
|
-
if (!pRS[NgtRendererClassId.compounded] && cRS[NgtRendererClassId.type] === 'three') {
|
|
240
|
-
// if child is indeed an ngtCompound
|
|
241
|
-
if (cRS[NgtRendererClassId.compound])
|
|
242
|
-
this.store.setCompound(parent, newChild);
|
|
243
|
-
// if not, we track the parent (that is supposedly the compound component) on this three instance
|
|
244
|
-
else if (!cRS[NgtRendererClassId.compoundParent])
|
|
245
|
-
cRS[NgtRendererClassId.compoundParent] = parent;
|
|
246
|
-
}
|
|
247
|
-
// reset the compound if it's changed
|
|
248
|
-
if (pRS[NgtRendererClassId.compounded] &&
|
|
249
|
-
cRS[NgtRendererClassId.type] === 'three' &&
|
|
250
|
-
cRS[NgtRendererClassId.compound] &&
|
|
251
|
-
pRS[NgtRendererClassId.compounded] !== newChild) {
|
|
252
|
-
this.store.setCompound(parent, newChild);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
210
|
if (this.shouldFindGrandparentInstance(pRS, cRS, newChild)) {
|
|
256
211
|
// we'll try to get the grandparent instance here so that we can run appendChild with both instances
|
|
257
|
-
const closestGrandparentInstance =
|
|
212
|
+
const closestGrandparentInstance = getClosestParentWithInstance(parent);
|
|
258
213
|
if (closestGrandparentInstance)
|
|
259
214
|
this.appendChild(closestGrandparentInstance, newChild);
|
|
260
215
|
return;
|
|
261
216
|
}
|
|
262
217
|
}
|
|
263
218
|
insertBefore(parent, newChild) {
|
|
219
|
+
// NOTE: not sure why this is here. investigate when we have time
|
|
220
|
+
// if (parent instanceof HTMLElement && (newChild instanceof HTMLElement || newChild instanceof Text)) {
|
|
221
|
+
// return this.delegate.appendChild(parent, newChild);
|
|
222
|
+
// }
|
|
264
223
|
if (parent == null || !parent.__ngt_renderer__ || parent === newChild)
|
|
265
224
|
return;
|
|
266
225
|
this.appendChild(parent, newChild);
|
|
267
226
|
}
|
|
268
227
|
removeChild(parent, oldChild, isHostElement) {
|
|
269
|
-
|
|
228
|
+
if (parent == null) {
|
|
229
|
+
parent = (untracked(() => getLocalState(oldChild)?.parent()) ||
|
|
230
|
+
oldChild.__ngt_renderer__[1 /* NgtRendererClassId.parent */]);
|
|
231
|
+
}
|
|
270
232
|
const cRS = oldChild.__ngt_renderer__;
|
|
233
|
+
// if parent is still falsy, we don't know what to do with the parent.
|
|
234
|
+
// we'll just remove the child and destroy it
|
|
235
|
+
if (parent == null) {
|
|
236
|
+
if (cRS) {
|
|
237
|
+
if (cRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
238
|
+
removeThreeChild(oldChild, undefined, true);
|
|
239
|
+
}
|
|
240
|
+
this.destroyInternal(oldChild, undefined);
|
|
241
|
+
}
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const pRS = parent.__ngt_renderer__;
|
|
271
245
|
if ((!cRS || !pRS) &&
|
|
272
246
|
parent instanceof Element &&
|
|
273
247
|
(oldChild instanceof Element || oldChild instanceof Text || oldChild instanceof Comment)) {
|
|
274
248
|
this.delegate.removeChild(parent, oldChild);
|
|
275
|
-
this.
|
|
249
|
+
this.destroyInternal(oldChild, parent);
|
|
276
250
|
return;
|
|
277
251
|
}
|
|
278
|
-
if (cRS[NgtRendererClassId.type] === 'dom' && (!pRS || pRS[NgtRendererClassId.type] === 'dom')) {
|
|
252
|
+
if (cRS[0 /* NgtRendererClassId.type */] === 'dom' && (!pRS || pRS[0 /* NgtRendererClassId.type */] === 'dom')) {
|
|
279
253
|
this.delegate.removeChild(parent, oldChild);
|
|
280
|
-
this.
|
|
254
|
+
this.destroyInternal(oldChild, parent);
|
|
281
255
|
return;
|
|
282
256
|
}
|
|
283
|
-
if (pRS[NgtRendererClassId.type] === 'three' && cRS[NgtRendererClassId.type] === 'three') {
|
|
284
|
-
removeThreeChild(
|
|
285
|
-
this.
|
|
257
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three' && cRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
258
|
+
removeThreeChild(oldChild, parent, true);
|
|
259
|
+
this.destroyInternal(oldChild, parent);
|
|
286
260
|
return;
|
|
287
261
|
}
|
|
288
|
-
if (pRS[NgtRendererClassId.type] === '
|
|
289
|
-
|
|
262
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'portal' &&
|
|
263
|
+
pRS[5 /* NgtRendererClassId.portalContainer */]?.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three') {
|
|
264
|
+
this.removeChild(pRS[5 /* NgtRendererClassId.portalContainer */], oldChild, isHostElement);
|
|
290
265
|
return;
|
|
291
266
|
}
|
|
292
|
-
if (pRS[NgtRendererClassId.type] === 'three') {
|
|
293
|
-
this.
|
|
267
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
268
|
+
this.destroyInternal(oldChild, parent);
|
|
294
269
|
return;
|
|
295
270
|
}
|
|
296
|
-
const closestGrandparentInstance =
|
|
271
|
+
const closestGrandparentInstance = getClosestParentWithInstance(parent);
|
|
297
272
|
if (closestGrandparentInstance)
|
|
298
273
|
this.removeChild(closestGrandparentInstance, oldChild, isHostElement);
|
|
299
|
-
this.
|
|
274
|
+
this.destroyInternal(oldChild, closestGrandparentInstance);
|
|
300
275
|
}
|
|
301
276
|
parentNode(node) {
|
|
302
277
|
const rS = node.__ngt_renderer__;
|
|
303
|
-
if (rS?.[NgtRendererClassId.parent])
|
|
304
|
-
return rS[NgtRendererClassId.parent];
|
|
278
|
+
if (rS?.[1 /* NgtRendererClassId.parent */])
|
|
279
|
+
return rS[1 /* NgtRendererClassId.parent */];
|
|
305
280
|
return this.delegate.parentNode(node);
|
|
306
281
|
}
|
|
307
|
-
|
|
282
|
+
setAttributeInternal(el, name, value, _namespace) {
|
|
308
283
|
const rS = el.__ngt_renderer__;
|
|
309
|
-
if (rS[NgtRendererClassId.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
if (
|
|
313
|
-
|
|
314
|
-
|
|
284
|
+
if (rS[3 /* NgtRendererClassId.destroyed */])
|
|
285
|
+
return false;
|
|
286
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
287
|
+
if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
|
|
288
|
+
// NOTE: priority needs to be set as an attribute string so that they can be set as early as possible
|
|
289
|
+
// we convert that string to a number. if it's invalid, default 0
|
|
290
|
+
let priority = Number(value);
|
|
291
|
+
if (isNaN(priority)) {
|
|
292
|
+
priority = 0;
|
|
293
|
+
console.warn(`[NGT] "priority" is an invalid number, default to 0`);
|
|
294
|
+
}
|
|
295
|
+
const localState = getLocalState(el);
|
|
296
|
+
if (localState)
|
|
297
|
+
localState.priority = priority;
|
|
315
298
|
}
|
|
316
|
-
|
|
317
|
-
|
|
299
|
+
else if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
300
|
+
// NOTE: handle attach as string
|
|
301
|
+
const paths = value.split('.');
|
|
302
|
+
if (paths.length) {
|
|
303
|
+
const localState = getLocalState(el);
|
|
304
|
+
if (localState)
|
|
305
|
+
localState.attach = paths;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else if (name === SPECIAL_PROPERTIES.RAW_VALUE) {
|
|
309
|
+
// NOTE: coercion
|
|
310
|
+
let maybeCoerced = value;
|
|
311
|
+
if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
|
|
312
|
+
maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
|
|
313
|
+
}
|
|
314
|
+
else if (!isNaN(Number(maybeCoerced))) {
|
|
315
|
+
maybeCoerced = Number(maybeCoerced);
|
|
316
|
+
}
|
|
317
|
+
rS[4 /* NgtRendererClassId.rawValue */] = maybeCoerced;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
applyProps(el, { [name]: value });
|
|
321
|
+
}
|
|
322
|
+
return false;
|
|
318
323
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
setAttribute(el, name, value, namespace) {
|
|
327
|
+
const useDelegate = this.setAttributeInternal(el, name, value, namespace);
|
|
328
|
+
if (useDelegate) {
|
|
329
|
+
this.delegate.setAttribute(el, name, value);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
removeAttribute(el, name, namespace) {
|
|
333
|
+
const useDelegate = this.setAttributeInternal(el, name, undefined, namespace);
|
|
334
|
+
if (useDelegate) {
|
|
335
|
+
this.delegate.removeAttribute(el, name, namespace);
|
|
322
336
|
}
|
|
323
|
-
return this.delegate.setAttribute(el, name, value);
|
|
324
337
|
}
|
|
325
338
|
setProperty(el, name, value) {
|
|
326
|
-
// TODO: should we support ref value
|
|
327
339
|
const rS = el.__ngt_renderer__;
|
|
328
|
-
if (rS[NgtRendererClassId.
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
if (
|
|
332
|
-
|
|
340
|
+
if (!rS || rS[3 /* NgtRendererClassId.destroyed */])
|
|
341
|
+
return;
|
|
342
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
343
|
+
if (name === SPECIAL_PROPERTIES.PARAMETERS) {
|
|
344
|
+
// NOTE: short-cut for null raycast to prevent upstream from creating a nullRaycast property
|
|
345
|
+
if ('raycast' in value && value['raycast'] === null) {
|
|
346
|
+
value['raycast'] = () => null;
|
|
347
|
+
}
|
|
348
|
+
applyProps(el, value);
|
|
333
349
|
return;
|
|
334
350
|
}
|
|
335
|
-
|
|
336
|
-
|
|
351
|
+
const localState = getLocalState(el);
|
|
352
|
+
const parent = localState?.instanceStore.get('parent') || rS[1 /* NgtRendererClassId.parent */];
|
|
353
|
+
// [rawValue]
|
|
354
|
+
if (localState?.isRaw && name === SPECIAL_PROPERTIES.RAW_VALUE) {
|
|
355
|
+
rS[4 /* NgtRendererClassId.rawValue */] = value;
|
|
356
|
+
if (parent)
|
|
357
|
+
attachThreeChild(parent, el);
|
|
358
|
+
return;
|
|
337
359
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
360
|
+
// [attach]
|
|
361
|
+
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
362
|
+
if (localState)
|
|
363
|
+
localState.attach = Array.isArray(value)
|
|
364
|
+
? value.map((v) => v.toString())
|
|
365
|
+
: typeof value === 'function'
|
|
366
|
+
? value
|
|
367
|
+
: typeof value === 'string'
|
|
368
|
+
? value.split('.')
|
|
369
|
+
: [value];
|
|
370
|
+
if (parent)
|
|
371
|
+
attachThreeChild(parent, el);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
// NOTE: short-cut for null raycast to prevent upstream from creating a nullRaycast property
|
|
375
|
+
if (name === 'raycast' && value === null) {
|
|
376
|
+
value = () => null;
|
|
377
|
+
}
|
|
378
|
+
applyProps(el, { [name]: value });
|
|
343
379
|
return;
|
|
344
380
|
}
|
|
345
381
|
return this.delegate.setProperty(el, name, value);
|
|
@@ -347,27 +383,18 @@ class NgtRenderer {
|
|
|
347
383
|
listen(target, eventName, callback) {
|
|
348
384
|
const rS = target.__ngt_renderer__;
|
|
349
385
|
// if the target doesn't have __ngt_renderer__, we delegate
|
|
350
|
-
// if target is DOM node,
|
|
351
|
-
if (!rS ||
|
|
386
|
+
// if target is DOM node, we delegate
|
|
387
|
+
if (!rS || isDOM(target)) {
|
|
352
388
|
return this.delegate.listen(target, eventName, callback);
|
|
353
389
|
}
|
|
354
|
-
if (rS[NgtRendererClassId.type] === 'three'
|
|
355
|
-
|
|
356
|
-
const
|
|
357
|
-
const priority =
|
|
358
|
-
|
|
359
|
-
rS[NgtRendererClassId.parent]?.__ngt_renderer__?.[NgtRendererClassId.injectorFactory]?.().get(ChangeDetectorRef, null);
|
|
360
|
-
return processThreeEvent(instance, priority || 0, eventName, callback, this.zone, this.cdr, targetCdr);
|
|
361
|
-
}
|
|
362
|
-
if (rS[NgtRendererClassId.type] === 'compound' && !rS[NgtRendererClassId.compounded]) {
|
|
363
|
-
this.store.queueOperation(target, [
|
|
364
|
-
'op',
|
|
365
|
-
() => this.store.queueOperation(target, ['cleanUp', this.listen(target, eventName, callback)]),
|
|
366
|
-
]);
|
|
367
|
-
return () => { };
|
|
390
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
391
|
+
const instance = target;
|
|
392
|
+
const localState = getLocalState(instance);
|
|
393
|
+
const priority = localState?.priority ?? 0;
|
|
394
|
+
return processThreeEvent(instance, priority, eventName, callback);
|
|
368
395
|
}
|
|
369
396
|
// @ts-expect-error - we know that target is not DOM node
|
|
370
|
-
if (target === this.
|
|
397
|
+
if (target === this.rootStore.snapshot.scene) {
|
|
371
398
|
let [domTarget, event] = eventName.split(':');
|
|
372
399
|
if (event == null) {
|
|
373
400
|
event = domTarget;
|
|
@@ -380,40 +407,166 @@ class NgtRenderer {
|
|
|
380
407
|
}
|
|
381
408
|
return () => { };
|
|
382
409
|
}
|
|
410
|
+
destroyInternal(node, parent) {
|
|
411
|
+
const rS = node.__ngt_renderer__;
|
|
412
|
+
if (!rS || rS[3 /* NgtRendererClassId.destroyed */])
|
|
413
|
+
return;
|
|
414
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
415
|
+
const localState = getLocalState(node);
|
|
416
|
+
if (localState?.instanceStore) {
|
|
417
|
+
localState.instanceStore.get('objects').forEach((obj) => this.destroyInternal(obj, parent));
|
|
418
|
+
localState.instanceStore.get('nonObjects').forEach((obj) => this.destroyInternal(obj, parent));
|
|
419
|
+
}
|
|
420
|
+
if (localState?.onUpdate)
|
|
421
|
+
delete localState.onUpdate;
|
|
422
|
+
if (localState?.onAttach)
|
|
423
|
+
delete localState.onAttach;
|
|
424
|
+
delete localState['objects'];
|
|
425
|
+
delete localState['nonObjects'];
|
|
426
|
+
delete localState['parent'];
|
|
427
|
+
delete localState['add'];
|
|
428
|
+
delete localState['remove'];
|
|
429
|
+
delete localState['store'];
|
|
430
|
+
delete localState['handlers'];
|
|
431
|
+
if (!localState?.primitive) {
|
|
432
|
+
delete node['__ngt__'];
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
436
|
+
rS[6 /* NgtRendererClassId.injectorFactory */] = null;
|
|
437
|
+
delete node[SPECIAL_INTERNAL_ADD_COMMENT];
|
|
438
|
+
this.removeCommentNode(node, this.argsCommentNodes);
|
|
439
|
+
}
|
|
440
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
441
|
+
rS[6 /* NgtRendererClassId.injectorFactory */] = null;
|
|
442
|
+
this.removeCommentNode(node, this.portalCommentsNodes);
|
|
443
|
+
}
|
|
444
|
+
// nullify parent
|
|
445
|
+
rS[1 /* NgtRendererClassId.parent */] = null;
|
|
446
|
+
for (const renderChild of rS[2 /* NgtRendererClassId.children */] || []) {
|
|
447
|
+
if (renderChild.__ngt_renderer__?.[0 /* NgtRendererClassId.type */] === 'three' && parent) {
|
|
448
|
+
if (parent.__ngt_renderer__?.[0 /* NgtRendererClassId.type */] === 'three') {
|
|
449
|
+
removeThreeChild(renderChild, parent, true);
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
const closestInstance = getClosestParentWithInstance(parent);
|
|
453
|
+
if (closestInstance) {
|
|
454
|
+
removeThreeChild(renderChild, closestInstance, true);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
this.destroyInternal(renderChild, parent);
|
|
458
|
+
}
|
|
459
|
+
rS[2 /* NgtRendererClassId.children */] = [];
|
|
460
|
+
rS[3 /* NgtRendererClassId.destroyed */] = true;
|
|
461
|
+
if (parent) {
|
|
462
|
+
removeChild(parent, node);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
removeCommentNode(node, nodes) {
|
|
466
|
+
const index = nodes.findIndex((comment) => comment === node);
|
|
467
|
+
if (index > -1) {
|
|
468
|
+
nodes.splice(index, 1);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
processPortalContainer(portal) {
|
|
472
|
+
const injector = portal.__ngt_renderer__[6 /* NgtRendererClassId.injectorFactory */]?.();
|
|
473
|
+
if (!injector)
|
|
474
|
+
return;
|
|
475
|
+
const portalStore = injector.get(NGT_STORE, null);
|
|
476
|
+
if (!portalStore)
|
|
477
|
+
return;
|
|
478
|
+
const portalContainer = portalStore.get('scene');
|
|
479
|
+
if (!portalContainer)
|
|
480
|
+
return;
|
|
481
|
+
const localState = getLocalState(portalContainer);
|
|
482
|
+
if (localState) {
|
|
483
|
+
localState.store = portalStore;
|
|
484
|
+
}
|
|
485
|
+
portal.__ngt_renderer__[5 /* NgtRendererClassId.portalContainer */] = createNode('three', portalContainer, this.document);
|
|
486
|
+
}
|
|
383
487
|
shouldFindGrandparentInstance(pRS, cRS, child) {
|
|
384
|
-
const pType = pRS[NgtRendererClassId.type];
|
|
385
|
-
const cType = cRS[NgtRendererClassId.type];
|
|
386
|
-
const
|
|
387
|
-
const isChildCompounded = cRS[NgtRendererClassId.compounded];
|
|
488
|
+
const pType = pRS[0 /* NgtRendererClassId.type */];
|
|
489
|
+
const cType = cRS[0 /* NgtRendererClassId.type */];
|
|
490
|
+
const cLS = getLocalState(child);
|
|
388
491
|
// if child is three but haven't been attached to a parent yet
|
|
389
|
-
const isDanglingThreeChild = cType === 'three' && !
|
|
492
|
+
const isDanglingThreeChild = cType === 'three' && !cLS?.instanceStore?.get('parent');
|
|
390
493
|
// or both parent and child are DOM elements
|
|
391
494
|
// or they are compound AND haven't had a THREE instance yet
|
|
392
|
-
const isParentStillDOM = pType === 'dom'
|
|
393
|
-
const isChildStillDOM = cType === 'dom'
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
495
|
+
const isParentStillDOM = pType === 'dom';
|
|
496
|
+
const isChildStillDOM = cType === 'dom';
|
|
497
|
+
return isDanglingThreeChild || (isParentStillDOM && isChildStillDOM) || isParentStillDOM;
|
|
498
|
+
}
|
|
499
|
+
getNgtArgs() {
|
|
500
|
+
let directive;
|
|
501
|
+
const destroyed = [];
|
|
502
|
+
let i = this.argsCommentNodes.length - 1;
|
|
503
|
+
while (i >= 0) {
|
|
504
|
+
const comment = this.argsCommentNodes[i];
|
|
505
|
+
if (comment.__ngt_renderer__[3 /* NgtRendererClassId.destroyed */]) {
|
|
506
|
+
destroyed.push(i);
|
|
507
|
+
i--;
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
const injector = comment.__ngt_renderer__[6 /* NgtRendererClassId.injectorFactory */]();
|
|
511
|
+
if (!injector) {
|
|
512
|
+
i--;
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
const instance = injector.get(NgtArgs, null);
|
|
516
|
+
if (instance && instance.validate()) {
|
|
517
|
+
directive = instance;
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
i--;
|
|
521
|
+
}
|
|
522
|
+
destroyed.forEach((index) => {
|
|
523
|
+
this.argsCommentNodes.splice(index, 1);
|
|
524
|
+
});
|
|
525
|
+
return directive;
|
|
526
|
+
}
|
|
527
|
+
tryGetPortalStore() {
|
|
528
|
+
let store;
|
|
529
|
+
const destroyed = [];
|
|
530
|
+
// we only care about the portal states because NgtStore only differs per Portal
|
|
531
|
+
let i = this.portalCommentsNodes.length - 1;
|
|
532
|
+
while (i >= 0) {
|
|
533
|
+
// loop through the portal state backwards to find the closest NgtStore
|
|
534
|
+
const portal = this.portalCommentsNodes[i];
|
|
535
|
+
if (portal.__ngt_renderer__[3 /* NgtRendererClassId.destroyed */]) {
|
|
536
|
+
destroyed.push(i);
|
|
537
|
+
i--;
|
|
538
|
+
continue;
|
|
539
|
+
}
|
|
540
|
+
const injector = portal.__ngt_renderer__[6 /* NgtRendererClassId.injectorFactory */]();
|
|
541
|
+
if (!injector) {
|
|
542
|
+
i--;
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
const instance = injector.get(NGT_STORE, null);
|
|
546
|
+
// only the instance with previousRoot should pass
|
|
547
|
+
if (instance && instance.get('previousRoot')) {
|
|
548
|
+
store = instance;
|
|
549
|
+
break;
|
|
550
|
+
}
|
|
551
|
+
i--;
|
|
552
|
+
}
|
|
553
|
+
destroyed.forEach((index) => {
|
|
554
|
+
this.portalCommentsNodes.splice(index, 1);
|
|
555
|
+
});
|
|
556
|
+
return store || this.rootStore;
|
|
399
557
|
}
|
|
400
558
|
get data() {
|
|
401
559
|
return this.delegate.data;
|
|
402
560
|
}
|
|
403
561
|
}
|
|
404
|
-
export function provideNgtRenderer(store
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
{ provide: NGT_COMPOUND_PREFIXES, useValue: compoundPrefixes },
|
|
412
|
-
{ provide: ChangeDetectorRef, useValue: cdr },
|
|
413
|
-
provideNgtStore(store),
|
|
414
|
-
provideZoneChangeDetection({ runCoalescing: true, eventCoalescing: true }),
|
|
415
|
-
]);
|
|
562
|
+
export function provideNgtRenderer(store) {
|
|
563
|
+
const providers = [
|
|
564
|
+
NgtRendererFactory,
|
|
565
|
+
{ provide: RendererFactory2, useExisting: NgtRendererFactory },
|
|
566
|
+
provideStore(() => store),
|
|
567
|
+
];
|
|
568
|
+
return makeEnvironmentProviders(providers);
|
|
416
569
|
}
|
|
417
570
|
export { extend } from './catalogue';
|
|
418
|
-
export { HTML } from './constants';
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixNQUFNLEVBQ04sU0FBUyxHQUdULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFpQixNQUFNLFVBQVUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBMEIsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBK0MsTUFBTSxTQUFTLENBQUM7QUFDL0csT0FBTyxFQUNOLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2hCLE1BQU0sU0FBUyxDQUFDOztBQUVqQixNQUNNLGtCQUFrQjtJQUR4QjtRQUVTLDRCQUF1QixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIs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QUFDO0tBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0SW5qZWN0YWJsZSxcblx0SW5qZWN0b3IsXG5cdE5nWm9uZSxcblx0UmVuZGVyZXJGYWN0b3J5Mixcblx0ZWZmZWN0LFxuXHRnZXREZWJ1Z05vZGUsXG5cdGluamVjdCxcblx0bWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuXHRwcm92aWRlWm9uZUNoYW5nZURldGVjdGlvbixcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG5cdHR5cGUgUmVuZGVyZXIyLFxuXHR0eXBlIFJlbmRlcmVyVHlwZTIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB0eXBlIHsgTmd0SW5qZWN0ZWRSZWYgfSBmcm9tICcuLi9yZWYnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0U3RvcmUsIHByb3ZpZGVOZ3RTdG9yZSwgdHlwZSBOZ3RTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgeyBpbmplY3ROZ3RDYXRhbG9ndWUsIHR5cGUgTmd0QW55Q29uc3RydWN0b3IgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5pbXBvcnQgeyBIVE1MLCBST1VURURfU0NFTkUsIFNQRUNJQUxfRE9NX1RBRyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5HVF9DT01QT1VORF9QUkVGSVhFUywgTmd0UmVuZGVyZXJTdG9yZSwgdHlwZSBOZ3RSZW5kZXJlck5vZGUsIHR5cGUgTmd0UmVuZGVyZXJTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHtcblx0Tmd0Q29tcG91bmRDbGFzc0lkLFxuXHROZ3RSZW5kZXJlckNsYXNzSWQsXG5cdGF0dGFjaFRocmVlQ2hpbGQsXG5cdGtlYmFiVG9QYXNjYWwsXG5cdHByb2Nlc3NUaHJlZUV2ZW50LFxuXHRyZW1vdmVUaHJlZUNoaWxkLFxufSBmcm9tICcuL3V0aWxzJztcblxuQEluamVjdGFibGUoKVxuY2xhc3MgTmd0UmVuZGVyZXJGYWN0b3J5IGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5MiB7XG5cdHByaXZhdGUgZGVsZWdhdGVSZW5kZXJlckZhY3RvcnkgPSBpbmplY3QoUmVuZGVyZXJGYWN0b3J5MiwgeyBza2lwU2VsZjogdHJ1ZSB9KTtcblx0cHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cdHByaXZhdGUgY2F0YWxvZ3VlID0gaW5qZWN0Tmd0Q2F0YWxvZ3VlKCk7XG5cdHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuXHRwcml2YXRlIHJlbmRlcmVyTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlbmRlcmVyMj4oKTtcblx0cHJpdmF0ZSByb3V0ZWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuXHQvLyBhbGwgUmVuZGVyZXIgaW5zdGFuY2VzIHNoYXJlIHRoZSBzYW1lIFN0b3JlXG5cdHByaXZhdGUgcmVuZGVyZXJTdG9yZSA9IG5ldyBOZ3RSZW5kZXJlclN0b3JlKHtcblx0XHRwb3J0YWxzOiBbXSxcblx0XHRzdG9yZTogaW5qZWN0Tmd0U3RvcmUoKSxcblx0XHRjb21wb3VuZFByZWZpeGVzOiBpbmplY3QoTkdUX0NPTVBPVU5EX1BSRUZJWEVTKSxcblx0XHRkb2N1bWVudDogaW5qZWN0KERPQ1VNRU5UKSxcblx0fSk7XG5cblx0Y3JlYXRlUmVuZGVyZXIoaG9zdEVsZW1lbnQ6IGFueSwgdHlwZTogUmVuZGVyZXJUeXBlMiB8IG51bGwpOiBSZW5kZXJlcjIge1xuXHRcdGNvbnN0IGRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZVJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihob3N0RWxlbWVudCwgdHlwZSk7XG5cdFx0aWYgKCF0eXBlKSByZXR1cm4gZGVsZWdhdGU7XG5cdFx0Ly8gVE9ETzogaGFuZGxlIGh0bWwgaW4gY2FudmFzXG5cdFx0aWYgKCh0eXBlIGFzIE5ndEFueVJlY29yZClbJ3R5cGUnXVtIVE1MXSkge1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQodHlwZS5pZCwgZGVsZWdhdGUpO1xuXHRcdFx0cmV0dXJuIGRlbGVnYXRlO1xuXHRcdH1cblx0XHRpZiAoKHR5cGUgYXMgTmd0QW55UmVjb3JkKVsndHlwZSddW1JPVVRFRF9TQ0VORV0pIHtcblx0XHRcdHRoaXMucm91dGVkU2V0LmFkZCh0eXBlLmlkKTtcblx0XHR9XG5cblx0XHRsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyTWFwLmdldCh0eXBlLmlkKTtcblxuXHRcdGlmICghcmVuZGVyZXIpIHtcblx0XHRcdHJlbmRlcmVyID0gbmV3IE5ndFJlbmRlcmVyKFxuXHRcdFx0XHRkZWxlZ2F0ZSxcblx0XHRcdFx0dGhpcy5yZW5kZXJlclN0b3JlLFxuXHRcdFx0XHR0aGlzLmNhdGFsb2d1ZSxcblx0XHRcdFx0dGhpcy56b25lLFxuXHRcdFx0XHR0aGlzLmNkcixcblx0XHRcdFx0Ly8gc2V0dGluZyByb290IHNjZW5lIGlmIHRoZXJlJ3Mgbm8gcm91dGVkIHNjZW5lIE9SIHRoaXMgY29tcG9uZW50IGlzIHRoZSByb3V0ZWQgU2NlbmVcblx0XHRcdFx0IWhvc3RFbGVtZW50ICYmICh0aGlzLnJvdXRlZFNldC5zaXplID09PSAwIHx8IHRoaXMucm91dGVkU2V0Lmhhcyh0eXBlLmlkKSksXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5yZW5kZXJlck1hcC5zZXQodHlwZS5pZCwgcmVuZGVyZXIpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVuZGVyZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBBbnl0aGluZyBhYmJyZXZpYXRlZCB3aXRoIHJTL1JTIHN0YW5kcyBmb3IgUmVuZGVyZXJTdGF0ZVxuICovXG5jbGFzcyBOZ3RSZW5kZXJlciBpbXBsZW1lbnRzIFJlbmRlcmVyMiB7XG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgZGVsZWdhdGU6IFJlbmRlcmVyMixcblx0XHRwcml2YXRlIHN0b3JlOiBOZ3RSZW5kZXJlclN0b3JlLFxuXHRcdHByaXZhdGUgY2F0YWxvZ3VlOiBSZWNvcmQ8c3RyaW5nLCBOZ3RBbnlDb25zdHJ1Y3Rvcj4sXG5cdFx0cHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG5cdFx0cHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuXHRcdHByaXZhdGUgcm9vdCA9IHRydWUsXG5cdCkge31cblxuXHRjcmVhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKTtcblxuXHRcdC8vIG9uIGZpcnN0IHBhc3MsIHdlIHJldHVybiB0aGUgUm9vdCBTY2VuZSBhcyB0aGUgcm9vdCBub2RlXG5cdFx0aWYgKHRoaXMucm9vdCkge1xuXHRcdFx0dGhpcy5yb290ID0gZmFsc2U7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIHRoaXMuc3RvcmUucm9vdFNjZW5lKTtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShlbGVtZW50KSEuaW5qZWN0b3I7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgY29tcG91bmRcblx0XHRpZiAodGhpcy5zdG9yZS5pc0NvbXBvdW5kKG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdjb21wb3VuZCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSBwb3J0YWxcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QT1JUQUwpIHtcblx0XHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3BvcnRhbCcsIGVsZW1lbnQpO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByYXcgdmFsdWVcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9WQUxVRSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZShcblx0XHRcdFx0J3RocmVlJyxcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7IF9fbmd0X3JlbmRlcmVyX186IHsgcmF3VmFsdWU6IHVuZGVmaW5lZCB9IH0sXG5cdFx0XHRcdFx0Ly8gTk9URTogd2UgYXNzaWduIHRoaXMgbWFudWFsbHkgdG8gYSByYXcgdmFsdWUgbm9kZVxuXHRcdFx0XHRcdC8vIGJlY2F1c2Ugd2Ugc2F5IGl0IGlzIGEgJ3RocmVlJyBub2RlIGJ1dCB3ZSdyZSBub3QgdXNpbmcgcHJlcGFyZSgpXG5cdFx0XHRcdFx0eyBfX25ndF9fOiB7IGlzUmF3OiB0cnVlLCBwYXJlbnQ6IHNpZ25hbChudWxsKSB9IH0sXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfSA9IHRoaXMuc3RvcmUuZ2V0Q3JlYXRpb25TdGF0ZSgpO1xuXG5cdFx0bGV0IHBhcmVudCA9IGluamVjdGVkUGFyZW50IGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHRpZiAodHlwZW9mIGluamVjdGVkUGFyZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cGFyZW50ID0gc3RvcmVcblx0XHRcdFx0LmdldCgnc2NlbmUnKVxuXHRcdFx0XHQuZ2V0T2JqZWN0QnlOYW1lKGluamVjdGVkUGFyZW50KSBhcyB1bmtub3duIGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgcHJpbWl0aXZlXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfRE9NX1RBRy5OR1RfUFJJTUlUSVZFKSB7XG5cdFx0XHRpZiAoIWluamVjdGVkQXJnc1swXSkgdGhyb3cgbmV3IEVycm9yKGBbTkdUXSBuZ3QtcHJpbWl0aXZlIHdpdGhvdXQgYXJncyBpcyBpbnZhbGlkYCk7XG5cdFx0XHRjb25zdCBvYmplY3QgPSBpbmplY3RlZEFyZ3NbMF07XG5cdFx0XHRsZXQgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUob2JqZWN0KTtcblx0XHRcdGlmICghT2JqZWN0LmtleXMobG9jYWxTdGF0ZSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIE5PVEU6IGlmIGFuIG9iamVjdCBpc24ndCBhbHJlYWR5IFwicHJlcGFyZWRcIiwgd2UgcHJlcGFyZSBpdFxuXHRcdFx0XHRsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShwcmVwYXJlKG9iamVjdCwgeyBzdG9yZSwgYXJnczogaW5qZWN0ZWRBcmdzLCBwcmltaXRpdmU6IHRydWUgfSkpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFsb2NhbFN0YXRlLnN0b3JlKSBsb2NhbFN0YXRlLnN0b3JlID0gc3RvcmU7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIG9iamVjdCk7XG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGhyZWVUYWcgPSBuYW1lLnN0YXJ0c1dpdGgoJ25ndCcpID8gbmFtZS5zbGljZSg0KSA6IG5hbWU7XG5cdFx0Y29uc3QgdGhyZWVOYW1lID0ga2ViYWJUb1Bhc2NhbCh0aHJlZVRhZyk7XG5cdFx0Y29uc3QgdGhyZWVUYXJnZXQgPSB0aGlzLmNhdGFsb2d1ZVt0aHJlZU5hbWVdO1xuXHRcdC8vIHdlIGhhdmUgdGhlIFRIUkVFIGNvbnN0cnVjdG9yIGhlcmUsIGhhbmRsZSBpdFxuXHRcdGlmICh0aHJlZVRhcmdldCkge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBwcmVwYXJlKG5ldyB0aHJlZVRhcmdldCguLi5pbmplY3RlZEFyZ3MpLCB7IHN0b3JlLCBhcmdzOiBpbmplY3RlZEFyZ3MgfSk7XG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIGluc3RhbmNlKTtcblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKTtcblxuXHRcdFx0Ly8gYXV0by1hdHRhY2ggZm9yIGdlb21ldHJ5IGFuZCBtYXRlcmlhbFxuXHRcdFx0aWYgKGlzLmdlb21ldHJ5KGluc3RhbmNlKSkge1xuXHRcdFx0XHRsb2NhbFN0YXRlLmF0dGFjaCA9IFsnZ2VvbWV0cnknXTtcblx0XHRcdH0gZWxzZSBpZiAoaXMubWF0ZXJpYWwoaW5zdGFuY2UpKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUuYXR0YWNoID0gWydtYXRlcmlhbCddO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdkb20nLCBlbGVtZW50KTtcblx0fVxuXG5cdGNyZWF0ZUNvbW1lbnQodmFsdWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ2NvbW1lbnQnLCB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodmFsdWUpKTtcblx0fVxuXG5cdGFwcGVuZENoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlKTogdm9pZCB7XG5cdFx0Y29uc3QgcFJTID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX187XG5cdFx0Y29uc3QgY1JTID0gbmV3Q2hpbGQuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdGlmIChcblx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nICYmXG5cdFx0XHQobmV3Q2hpbGQgaW5zdGFuY2VvZiBUZXh0IHx8IGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nKVxuXHRcdCkge1xuXHRcdFx0dGhpcy5zdG9yZS5hZGRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdHRoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUuc2V0UGFyZW50KG5ld0NoaWxkLCBwYXJlbnQpO1xuXHRcdFx0XHRpZiAodGhpcy5zaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZShwUlMsIGNSUywgbmV3Q2hpbGQpKSB7XG5cdFx0XHRcdFx0Ly8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuXHRcdFx0XHRcdGNvbnN0IGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlID0gdGhpcy5zdG9yZS5nZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKHBhcmVudCk7XG5cdFx0XHRcdFx0aWYgKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlKSB0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlLCBuZXdDaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0dGhpcy5zdG9yZS5zZXRQYXJlbnQobmV3Q2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pIHtcblx0XHRcdGlmIChpcy5yZWYoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pKSB7XG5cdFx0XHRcdGNvbnN0IGluamVjdG9yID0gY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCkuZ2V0KEluamVjdG9yLCBudWxsKTtcblx0XHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHRcdGBbTkdUXSBOZ3RSZW5kZXJlciBpcyBhdHRlbXB0aW5nIHRvIHN0YXJ0IGFuIGVmZmVjdCBmb3IgaW5qZWN0ZWRQYXJlbnQgYnV0IG5vIEluamVjdG9yIGlzIGZvdW5kLmAsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGVmZmVjdChcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbmplY3RlZFBhcmVudCA9IChcblx0XHRcdFx0XHRcdFx0Y1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0gYXMgTmd0SW5qZWN0ZWRSZWY8Tmd0UmVuZGVyZXJOb2RlPlxuXHRcdFx0XHRcdFx0KS5uYXRpdmVFbGVtZW50O1xuXHRcdFx0XHRcdFx0aWYgKGluamVjdGVkUGFyZW50ICYmIGluamVjdGVkUGFyZW50ICE9PSBwYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZChpbmplY3RlZFBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0XHQvLyBvbmx5IHJ1biB0aGlzIGVmZmVjdCBvbmNlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHNvb24gYXMgd2UgcmUtcnVuIGFwcGVuZENoaWxkIHdpdGggdGhlIGluamVjdGVkUGFyZW50LCB3ZSBzdG9wIHRoZSBlZmZlY3Rcblx0XHRcdFx0XHRcdFx0d2F0Y2hlci5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7IGluamVjdG9yLCBtYW51YWxDbGVhbnVwOiB0cnVlIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSBpZiAocGFyZW50ICE9PSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSkge1xuXHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0ZWRQYXJlbnRdLCBuZXdDaGlsZCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnN0b3JlLnNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcblx0XHR0aGlzLnN0b3JlLmFkZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXG5cdFx0Ly8gaWYgbmV3IGNoaWxkIGlzIGEgcG9ydGFsXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdHRoaXMuc3RvcmUucHJvY2Vzc1BvcnRhbENvbnRhaW5lcihuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIHBhcmVudCBpcyBhIHBvcnRhbFxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0dGhpcy5zdG9yZS5wcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBhcmVudCk7XG5cdFx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdLCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gaWYgYm90aCBhcmUgdGhyZWUgaW5zdGFuY2VzLCBzdHJhaWdodGZvcndhcmQgY2FzZVxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Ly8gaWYgY2hpbGQgYWxyZWFkeSBhdHRhY2hlZCB0byBhIHBhcmVudCwgc2tpcFxuXHRcdFx0aWYgKGdldExvY2FsU3RhdGUobmV3Q2hpbGQpLnBhcmVudCAmJiB1bnRyYWNrZWQoZ2V0TG9jYWxTdGF0ZShuZXdDaGlsZCkucGFyZW50KSkgcmV0dXJuO1xuXHRcdFx0Ly8gYXR0YWNoIFRIUkVFIGNoaWxkXG5cdFx0XHRhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdFx0Ly8gaGVyZSwgd2UgaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgaWYgdGhlIHBhcmVudCBoYXMgYSBjb21wb3VuZFBhcmVudCwgd2hpY2ggbWVhbnMgdGhpcyBjaGlsZCBpcyBwYXJ0IG9mIGEgY29tcG91bmQgcGFyZW50IHRlbXBsYXRlXG5cdFx0XHRpZiAoIWNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdKSByZXR1cm47XG5cdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRXaXRoQ29tcG91bmQgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQocGFyZW50KTtcblx0XHRcdGlmICghY2xvc2VzdEdyYW5kcGFyZW50V2l0aENvbXBvdW5kKSByZXR1cm47XG5cdFx0XHR0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudFdpdGhDb21wb3VuZCwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIG9ubHkgdGhlIHBhcmVudCBpcyB0aGUgVEhSRUUgaW5zdGFuY2Vcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Zm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiBjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCByZW5kZXJDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gaWYgcGFyZW50IGlzIGEgY29tcG91bmRcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gaWYgY29tcG91bmQgZG9lc24ndCBoYXZlIGEgVEhSRUUgaW5zdGFuY2Ugc2V0IHlldFxuXHRcdFx0aWYgKCFwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdFx0Ly8gaWYgY2hpbGQgaXMgaW5kZWVkIGFuIG5ndENvbXBvdW5kXG5cdFx0XHRcdGlmIChjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSkgdGhpcy5zdG9yZS5zZXRDb21wb3VuZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0XHRcdFx0Ly8gaWYgbm90LCB3ZSB0cmFjayB0aGUgcGFyZW50ICh0aGF0IGlzIHN1cHBvc2VkbHkgdGhlIGNvbXBvdW5kIGNvbXBvbmVudCkgb24gdGhpcyB0aHJlZSBpbnN0YW5jZVxuXHRcdFx0XHRlbHNlIGlmICghY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0pIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdID0gcGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZXNldCB0aGUgY29tcG91bmQgaWYgaXQncyBjaGFuZ2VkXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gJiZcblx0XHRcdFx0Y1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuXHRcdFx0XHRjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSAmJlxuXHRcdFx0XHRwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICE9PSBuZXdDaGlsZFxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUuc2V0Q29tcG91bmQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTLCBjUlMsIG5ld0NoaWxkKSkge1xuXHRcdFx0Ly8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuXHRcdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5hcHBlbmRDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGluc2VydEJlZm9yZShcblx0XHRwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0XHRuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRcdC8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdGhlc2U/XG5cdFx0Ly8gcmVmQ2hpbGQ6IE5ndFJlbmRlcmVyTm9kZVxuXHRcdC8vIGlzTW92ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0aWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXyB8fCBwYXJlbnQgPT09IG5ld0NoaWxkKSByZXR1cm47XG5cdFx0dGhpcy5hcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblx0fVxuXG5cdHJlbW92ZUNoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBvbGRDaGlsZDogTmd0UmVuZGVyZXJOb2RlLCBpc0hvc3RFbGVtZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGNvbnN0IGNSUyA9IG9sZENoaWxkLl9fbmd0X3JlbmRlcmVyX187XG5cblx0XHRpZiAoXG5cdFx0XHQoIWNSUyB8fCAhcFJTKSAmJlxuXHRcdFx0cGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuXHRcdFx0KG9sZENoaWxkIGluc3RhbmNlb2YgRWxlbWVudCB8fCBvbGRDaGlsZCBpbnN0YW5jZW9mIFRleHQgfHwgb2xkQ2hpbGQgaW5zdGFuY2VvZiBDb21tZW50KVxuXHRcdCkge1xuXHRcdFx0dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKTtcblx0XHRcdHRoaXMuc3RvcmUuZGVzdHJveShvbGRDaGlsZCwgcGFyZW50KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgJiYgKCFwUlMgfHwgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScpKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnJlbW92ZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQpO1xuXHRcdFx0dGhpcy5zdG9yZS5kZXN0cm95KG9sZENoaWxkLCBwYXJlbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJlbW92ZVRocmVlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSB7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRpZiAoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UpIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkLCBpc0hvc3RFbGVtZW50KTtcblx0XHR0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlIGFzIE5ndFJlbmRlcmVyTm9kZSk7XG5cdH1cblxuXHRwYXJlbnROb2RlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSByZXR1cm4gclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUucGFyZW50Tm9kZShub2RlKTtcblx0fVxuXG5cdHNldEF0dHJpYnV0ZShlbDogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0Ly8gd2UgZG9uJ3QgaGF2ZSB0aGUgY29tcG91bmQgaW5zdGFuY2UgeWV0XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11bbmFtZV0gPSB2YWx1ZTtcblx0XHRcdGlmICghclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHRcdHRoaXMuc3RvcmUucXVldWVPcGVyYXRpb24oZWwsIFsnb3AnLCAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSldKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZShyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0sIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHRoaXMuc3RvcmUuYXBwbHlBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdHNldFByb3BlcnR5KGVsOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdC8vIFRPRE86IHNob3VsZCB3ZSBzdXBwb3J0IHJlZiB2YWx1ZVxuXG5cdFx0Y29uc3QgclMgPSBlbC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcblx0XHRcdC8vIHdlIGRvbid0IGhhdmUgdGhlIGNvbXBvdW5kIGluc3RhbmNlIHlldFxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdW25hbWVdID0gdmFsdWU7XG5cdFx0XHRpZiAoIXJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuXHRcdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKGVsLCBbJ29wJywgKCkgPT4gdGhpcy5zZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpXSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0pIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdW1xuXHRcdFx0XHRcdFx0Tmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR7IFtuYW1lXTogdmFsdWUgfSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2V0UHJvcGVydHkoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdLCBuYW1lLCB2YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0dGhpcy5zdG9yZS5hcHBseVByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGxpc3Rlbih0YXJnZXQ6IE5ndFJlbmRlcmVyTm9kZSwgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gYm9vbGVhbiB8IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHRjb25zdCByUyA9IHRhcmdldC5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0Ly8gaWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgX19uZ3RfcmVuZGVyZXJfXywgd2UgZGVsZWdhdGVcblx0XHQvLyBpZiB0YXJnZXQgaXMgRE9NIG5vZGUsIHRoZW4gd2UgcGFzcyB0aGF0IHRvIGRlbGVnYXRlIFJlbmRlcmVyXG5cdFx0aWYgKCFyUyB8fCB0aGlzLnN0b3JlLmlzRE9NKHRhcmdldCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyB8fFxuXHRcdFx0KHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSB8fCB0YXJnZXQ7XG5cdFx0XHRjb25zdCBwcmlvcml0eSA9IGdldExvY2FsU3RhdGUodGFyZ2V0KS5wcmlvcml0eTtcblx0XHRcdGNvbnN0IHRhcmdldENkciA9XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldPy4oKS5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpIHx8XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdPy5fX25ndF9yZW5kZXJlcl9fPy5bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0/LigpLmdldChcblx0XHRcdFx0XHRDaGFuZ2VEZXRlY3RvclJlZixcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gcHJvY2Vzc1RocmVlRXZlbnQoaW5zdGFuY2UsIHByaW9yaXR5IHx8IDAsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIHRoaXMuem9uZSwgdGhpcy5jZHIsIHRhcmdldENkcik7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiAhclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG5cdFx0XHR0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgW1xuXHRcdFx0XHQnb3AnLFxuXHRcdFx0XHQoKSA9PiB0aGlzLnN0b3JlLnF1ZXVlT3BlcmF0aW9uKHRhcmdldCwgWydjbGVhblVwJywgdGhpcy5saXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKV0pLFxuXHRcdFx0XSk7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge307XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGtub3cgdGhhdCB0YXJnZXQgaXMgbm90IERPTSBub2RlXG5cdFx0aWYgKHRhcmdldCA9PT0gdGhpcy5zdG9yZS5yb290U2NlbmUpIHtcblx0XHRcdGxldCBbZG9tVGFyZ2V0LCBldmVudF0gPSBldmVudE5hbWUuc3BsaXQoJzonKTtcblx0XHRcdGlmIChldmVudCA9PSBudWxsKSB7XG5cdFx0XHRcdGV2ZW50ID0gZG9tVGFyZ2V0O1xuXHRcdFx0XHRkb21UYXJnZXQgPSAnJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV2ZW50VGFyZ2V0ID1cblx0XHRcdFx0ZG9tVGFyZ2V0ID09PSAnd2luZG93J1xuXHRcdFx0XHRcdD8gKHRhcmdldCBhcyBOZ3RBbnlSZWNvcmQpWydvd25lckRvY3VtZW50J11bJ2RlZmF1bHRWaWV3J11cblx0XHRcdFx0XHQ6ICh0YXJnZXQgYXMgTmd0QW55UmVjb3JkKVsnb3duZXJEb2N1bWVudCddO1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKGV2ZW50VGFyZ2V0LCBldmVudCwgY2FsbGJhY2spO1xuXHRcdH1cblxuXHRcdHJldHVybiAoKSA9PiB7fTtcblx0fVxuXG5cdHByaXZhdGUgc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTOiBOZ3RSZW5kZXJlclN0YXRlLCBjUlM6IE5ndFJlbmRlcmVyU3RhdGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBwVHlwZSA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV07XG5cdFx0Y29uc3QgY1R5cGUgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdO1xuXHRcdGNvbnN0IGlzUGFyZW50Q29tcG91bmRlZCA9IHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF07XG5cdFx0Y29uc3QgaXNDaGlsZENvbXBvdW5kZWQgPSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdO1xuXG5cdFx0Ly8gaWYgY2hpbGQgaXMgdGhyZWUgYnV0IGhhdmVuJ3QgYmVlbiBhdHRhY2hlZCB0byBhIHBhcmVudCB5ZXRcblx0XHRjb25zdCBpc0RhbmdsaW5nVGhyZWVDaGlsZCA9IGNUeXBlID09PSAndGhyZWUnICYmICF1bnRyYWNrZWQoZ2V0TG9jYWxTdGF0ZShjaGlsZCkucGFyZW50KTtcblx0XHQvLyBvciBib3RoIHBhcmVudCBhbmQgY2hpbGQgYXJlIERPTSBlbGVtZW50c1xuXHRcdC8vIG9yIHRoZXkgYXJlIGNvbXBvdW5kIEFORCBoYXZlbid0IGhhZCBhIFRIUkVFIGluc3RhbmNlIHlldFxuXHRcdGNvbnN0IGlzUGFyZW50U3RpbGxET00gPSBwVHlwZSA9PT0gJ2RvbScgfHwgKHBUeXBlID09PSAnY29tcG91bmQnICYmICFpc1BhcmVudENvbXBvdW5kZWQpO1xuXHRcdGNvbnN0IGlzQ2hpbGRTdGlsbERPTSA9IGNUeXBlID09PSAnZG9tJyB8fCAoY1R5cGUgPT09ICdjb21wb3VuZCcgJiYgIWlzQ2hpbGRDb21wb3VuZGVkKTtcblx0XHQvLyBhbmQgdGhlIGNoaWxkIGlzIGEgY29tcG91bmRlZCBjb21wb3VuZFxuXHRcdGNvbnN0IGlzQ29tcG91bmRDaGlsZENvbXBvdW5kZWQgPSBjVHlwZSA9PT0gJ2NvbXBvdW5kJyAmJiAhIWlzQ2hpbGRDb21wb3VuZGVkO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGlzRGFuZ2xpbmdUaHJlZUNoaWxkIHx8XG5cdFx0XHQoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NoaWxkU3RpbGxET00pIHx8XG5cdFx0XHQoaXNQYXJlbnRTdGlsbERPTSAmJiBpc0NvbXBvdW5kQ2hpbGRDb21wb3VuZGVkKVxuXHRcdCk7XG5cdH1cblxuXHRjcmVhdGVUZXh0ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVUZXh0LmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGRlc3Ryb3kgPSB0aGlzLmRlbGVnYXRlLmRlc3Ryb3kuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0ZGVzdHJveU5vZGU6ICgobm9kZTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXHRzZWxlY3RSb290RWxlbWVudCA9IHRoaXMuZGVsZWdhdGUuc2VsZWN0Um9vdEVsZW1lbnQuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0bmV4dFNpYmxpbmcgPSB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZUF0dHJpYnV0ZSA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGFkZENsYXNzID0gdGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcy5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRyZW1vdmVDbGFzcyA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0c2V0U3R5bGUgPSB0aGlzLmRlbGVnYXRlLnNldFN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZVN0eWxlID0gdGhpcy5kZWxlZ2F0ZS5yZW1vdmVTdHlsZS5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRzZXRWYWx1ZSA9IHRoaXMuZGVsZWdhdGUuc2V0VmFsdWUuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0Z2V0IGRhdGEoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuZGF0YTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZU5ndFJlbmRlcmVyKHN0b3JlOiBOZ3RTdG9yZSwgY29tcG91bmRQcmVmaXhlczogc3RyaW5nW10sIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0aWYgKCFjb21wb3VuZFByZWZpeGVzLmluY2x1ZGVzKCduZ3RzJykpIGNvbXBvdW5kUHJlZml4ZXMucHVzaCgnbmd0cycpO1xuXHRpZiAoIWNvbXBvdW5kUHJlZml4ZXMuaW5jbHVkZXMoJ25ndHAnKSkgY29tcG91bmRQcmVmaXhlcy5wdXNoKCduZ3RwJyk7XG5cblx0cmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG5cdFx0eyBwcm92aWRlOiBSZW5kZXJlckZhY3RvcnkyLCB1c2VDbGFzczogTmd0UmVuZGVyZXJGYWN0b3J5IH0sXG5cdFx0eyBwcm92aWRlOiBOR1RfQ09NUE9VTkRfUFJFRklYRVMsIHVzZVZhbHVlOiBjb21wb3VuZFByZWZpeGVzIH0sXG5cdFx0eyBwcm92aWRlOiBDaGFuZ2VEZXRlY3RvclJlZiwgdXNlVmFsdWU6IGNkciB9LFxuXHRcdHByb3ZpZGVOZ3RTdG9yZShzdG9yZSksXG5cdFx0cHJvdmlkZVpvbmVDaGFuZ2VEZXRlY3Rpb24oeyBydW5Db2FsZXNjaW5nOiB0cnVlLCBldmVudENvYWxlc2Npbmc6IHRydWUgfSksXG5cdF0pO1xufVxuXG5leHBvcnQgeyBleHRlbmQgfSBmcm9tICcuL2NhdGFsb2d1ZSc7XG5leHBvcnQgeyBIVE1MIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
|
|
571
|
+
export { HTML, ROUTED_SCENE } from './constants';
|
|
572
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLFVBQVUsRUFFVixnQkFBZ0IsRUFFaEIsWUFBWSxFQUNaLE1BQU0sRUFDTix3QkFBd0IsRUFDeEIsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRSxPQUFPLEVBQXFCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsNEJBQTRCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEgsT0FBTyxFQUdOLFFBQVEsRUFDUixVQUFVLEVBQ1YsNEJBQTRCLEVBQzVCLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxHQUNULE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBc0IsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUduSCxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBRVMsNEJBQXVC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QixNQUFNO1lBQ1AsQ0FBQztZQUNELENBQUMsRUFBRSxDQUFDO1FBQ0wsQ0FBQztRQUVELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQVlELElBQUksSUFBSTtRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztDQUNEO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQStCO0lBQ2pFLE1BQU0sU0FBUyxHQUFHO1FBQ2pCLGtCQUFrQjtRQUNsQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUU7UUFDOUQsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztLQUN6QixDQUFDO0lBRUYsT0FBTyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdEluamVjdGFibGUsXG5cdFJlbmRlcmVyMixcblx0UmVuZGVyZXJGYWN0b3J5Mixcblx0UmVuZGVyZXJUeXBlMixcblx0Z2V0RGVidWdOb2RlLFxuXHRpbmplY3QsXG5cdG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcblx0dW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FyZ3MnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB7IE5HVF9TVE9SRSwgaW5qZWN0U3RvcmUsIHByb3ZpZGVTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB7IE5ndEFueVJlY29yZCwgTmd0SW5zdGFuY2VOb2RlLCBOZ3RMb2NhbFN0YXRlLCBOZ3RTdGF0ZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGFwcGx5UHJvcHMgfSBmcm9tICcuLi91dGlscy9hcHBseS1wcm9wcyc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB7IE5ndFNpZ25hbFN0b3JlLCBzaWduYWxTdG9yZSB9IGZyb20gJy4uL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBOZ3RBbnlDb25zdHJ1Y3RvciwgaW5qZWN0Q2F0YWxvZ3VlIH0gZnJvbSAnLi9jYXRhbG9ndWUnO1xuaW1wb3J0IHsgSFRNTCwgUk9VVEVEX1NDRU5FLCBTUEVDSUFMX0RPTV9UQUcsIFNQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlQsIFNQRUNJQUxfUFJPUEVSVElFUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG5cdE5ndFJlbmRlcmVyTm9kZSxcblx0Tmd0UmVuZGVyZXJTdGF0ZSxcblx0YWRkQ2hpbGQsXG5cdGNyZWF0ZU5vZGUsXG5cdGdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UsXG5cdGlzRE9NLFxuXHRyZW1vdmVDaGlsZCxcblx0c2V0UGFyZW50LFxufSBmcm9tICcuL3N0YXRlJztcbmltcG9ydCB7IE5ndFJlbmRlcmVyQ2xhc3NJZCwgYXR0YWNoVGhyZWVDaGlsZCwga2ViYWJUb1Bhc2NhbCwgcHJvY2Vzc1RocmVlRXZlbnQsIHJlbW92ZVRocmVlQ2hpbGQgfSBmcm9tICcuL3V0aWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5ndFJlbmRlcmVyRmFjdG9yeSBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeTIge1xuXHRwcml2YXRlIGRlbGVnYXRlUmVuZGVyZXJGYWN0b3J5ID0gaW5qZWN0KFJlbmRlcmVyRmFjdG9yeTIsIHsgc2tpcFNlbGY6IHRydWUgfSk7XG5cdHByaXZhdGUgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXHRwcml2YXRlIGNhdGFsb2d1ZSA9IGluamVjdENhdGFsb2d1ZSgpO1xuXHRwcml2YXRlIHJvb3RTdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cblx0cHJpdmF0ZSBwb3J0YWxDb21tZW50c05vZGVzOiBBcnJheTxOZ3RSZW5kZXJlck5vZGU+ID0gW107XG5cdHByaXZhdGUgcmVuZGVyZXJNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVuZGVyZXIyPigpO1xuXHRwcml2YXRlIHJvdXRlZFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cdGNyZWF0ZVJlbmRlcmVyKGhvc3RFbGVtZW50OiBhbnksIHR5cGU6IFJlbmRlcmVyVHlwZTIgfCBudWxsKTogUmVuZGVyZXIyIHtcblx0XHRjb25zdCBkZWxlZ2F0ZVJlbmRlcmVyID0gdGhpcy5kZWxlZ2F0ZVJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihob3N0RWxlbWVudCwgdHlwZSk7XG5cblx0XHRpZiAoIXR5cGUpIHJldHVybiBkZWxlZ2F0ZVJlbmRlcmVyO1xuXG5cdFx0Ly8gTk9URTogbWlnaHQgbmVlZCB0byByZXZpc2l0IHRoaXNcblx0XHRpZiAoKHR5cGUgYXMgTmd0QW55UmVjb3JkKVsndHlwZSddW0hUTUxdKSB7XG5cdFx0XHR0aGlzLnJlbmRlcmVyTWFwLnNldCh0eXBlLmlkLCBkZWxlZ2F0ZVJlbmRlcmVyKTtcblx0XHRcdHJldHVybiBkZWxlZ2F0ZVJlbmRlcmVyO1xuXHRcdH1cblxuXHRcdGlmICgodHlwZSBhcyBOZ3RBbnlSZWNvcmQpWyd0eXBlJ11bUk9VVEVEX1NDRU5FXSkge1xuXHRcdFx0dGhpcy5yb3V0ZWRTZXQuYWRkKHR5cGUuaWQpO1xuXHRcdH1cblxuXHRcdGxldCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXJNYXAuZ2V0KHR5cGUuaWQpO1xuXHRcdGlmICghcmVuZGVyZXIpIHtcblx0XHRcdHRoaXMucmVuZGVyZXJNYXAuc2V0KFxuXHRcdFx0XHR0eXBlLmlkLFxuXHRcdFx0XHQocmVuZGVyZXIgPSBuZXcgTmd0UmVuZGVyZXIoXG5cdFx0XHRcdFx0ZGVsZWdhdGVSZW5kZXJlcixcblx0XHRcdFx0XHR0aGlzLnJvb3RTdG9yZSxcblx0XHRcdFx0XHR0aGlzLmRvY3VtZW50LFxuXHRcdFx0XHRcdHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlcyxcblx0XHRcdFx0XHR0aGlzLmNhdGFsb2d1ZSxcblx0XHRcdFx0XHQvLyBzZXR0aW5nIHJvb3Qgc2NlbmUgaWYgdGhlcmUncyBubyByb3V0ZWQgc2NlbmUgT1IgdGhpcyBjb21wb25lbnQgaXMgdGhlIHJvdXRlZCBTY2VuZVxuXHRcdFx0XHRcdCFob3N0RWxlbWVudCAmJiAodGhpcy5yb3V0ZWRTZXQuc2l6ZSA9PT0gMCB8fCB0aGlzLnJvdXRlZFNldC5oYXModHlwZS5pZCkpLFxuXHRcdFx0XHQpKSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiByZW5kZXJlcjtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgTmd0UmVuZGVyZXIgaW1wbGVtZW50cyBSZW5kZXJlcjIge1xuXHRwcml2YXRlIGFyZ3NDb21tZW50Tm9kZXM6IEFycmF5PE5ndFJlbmRlcmVyTm9kZT4gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGRlbGVnYXRlOiBSZW5kZXJlcjIsXG5cdFx0cHJpdmF0ZSByb290U3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPixcblx0XHRwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcblx0XHRwcml2YXRlIHBvcnRhbENvbW1lbnRzTm9kZXM6IEFycmF5PE5ndFJlbmRlcmVyTm9kZT4sXG5cdFx0cHJpdmF0ZSBjYXRhbG9ndWU6IFJlY29yZDxzdHJpbmcsIE5ndEFueUNvbnN0cnVjdG9yPixcblx0XHRwcml2YXRlIGlzUm9vdCA9IHRydWUsXG5cdCkge31cblxuXHRjcmVhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKTtcblxuXHRcdC8vIGlmIHRoZXJlJ3MgbmFtZXNwYWNlLCB3ZSBkb24ndCBkbyBhbnl0aGluZ1xuXHRcdGlmIChuYW1lc3BhY2UpIHtcblx0XHRcdHJldHVybiBjcmVhdGVOb2RlKCdkb20nLCBlbGVtZW50LCB0aGlzLmRvY3VtZW50KTtcblx0XHR9XG5cblx0XHQvLyBvbiBmaXJzdCBwYXNzLCB3ZSByZXR1cm4gdGhlIFJvb3QgU2NlbmUgYXMgdGhlIHJvb3Qgbm9kZVxuXHRcdGlmICh0aGlzLmlzUm9vdCkge1xuXHRcdFx0dGhpcy5pc1Jvb3QgPSBmYWxzZTtcblx0XHRcdGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKCd0aHJlZScsIHRoaXMucm9vdFN0b3JlLnNuYXBzaG90LnNjZW5lLCB0aGlzLmRvY3VtZW50KTtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShlbGVtZW50KT8uaW5qZWN0b3I7XG5cdFx0XHRyZXR1cm4gbm9kZTtcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QT1JUQUwpIHtcblx0XHRcdHJldHVybiBjcmVhdGVOb2RlKCdwb3J0YWwnLCBlbGVtZW50LCB0aGlzLmRvY3VtZW50KTtcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9WQUxVRSkge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2VTdG9yZSA9IHNpZ25hbFN0b3JlKHsgcGFyZW50OiBudWxsLCBvYmplY3RzOiBbXSwgbm9uT2JqZWN0czogW10gfSk7XG5cdFx0XHRyZXR1cm4gY3JlYXRlTm9kZShcblx0XHRcdFx0J3RocmVlJyxcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHR7IF9fbmd0X3JlbmRlcmVyX186IHsgcmF3VmFsdWU6IHVuZGVmaW5lZCB9IH0sXG5cdFx0XHRcdFx0Ly8gTk9URTogd2UgYXNzaWduIHRoaXMgbWFudWFsbHkgdG8gYSByYXcgdmFsdWUgbm9kZVxuXHRcdFx0XHRcdC8vIGJlY2F1c2Ugd2Ugc2F5IGl0IGlzIGEgJ3RocmVlJyBub2RlIGJ1dCB3ZSdyZSBub3QgdXNpbmcgcHJlcGFyZSgpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0X19uZ3RfXzoge1xuXHRcdFx0XHRcdFx0XHRpc1JhdzogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zdGFuY2VTdG9yZSxcblx0XHRcdFx0XHRcdFx0c2V0UGFyZW50KHBhcmVudDogTmd0SW5zdGFuY2VOb2RlKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFuY2VTdG9yZS51cGRhdGUoeyBwYXJlbnQgfSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdCksXG5cdFx0XHRcdHRoaXMuZG9jdW1lbnQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IFtpbmplY3RlZEFyZ3NdID0gW3RoaXMuZ2V0Tmd0QXJncygpPy52YWx1ZSB8fCBbXV07XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QUklNSVRJVkUpIHtcblx0XHRcdGlmICghaW5qZWN0ZWRBcmdzWzBdKSB0aHJvdyBuZXcgRXJyb3IoYFtOR1RdIG5ndC1wcmltaXRpdmUgd2l0aG91dCBhcmdzIGlzIGludmFsaWRgKTtcblx0XHRcdGNvbnN0IG9iamVjdCA9IGluamVjdGVkQXJnc1swXTtcblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG9iamVjdCk7XG5cdFx0XHRpZiAoIWxvY2FsU3RhdGUpIHtcblx0XHRcdFx0Ly8gTk9URTogaWYgYW4gb2JqZWN0IGlzbid0IGFscmVhZHkgXCJwcmVwYXJlZFwiLCB3ZSBwcmVwYXJlIGl0XG5cdFx0XHRcdHByZXBhcmUob2JqZWN0LCB7IHN0b3JlOiB0aGlzLnJvb3RTdG9yZSwgcHJpbWl0aXZlOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNyZWF0ZU5vZGUoJ3RocmVlJywgb2JqZWN0LCB0aGlzLmRvY3VtZW50KTtcblx0XHR9XG5cblx0XHRjb25zdCB0aHJlZU5hbWUgPSBrZWJhYlRvUGFzY2FsKG5hbWUuc3RhcnRzV2l0aCgnbmd0LScpID8gbmFtZS5zbGljZSg0KSA6IG5hbWUpO1xuXHRcdGNvbnN0IHRocmVlVGFyZ2V0ID0gdGhpcy5jYXRhbG9ndWVbdGhyZWVOYW1lXTtcblxuXHRcdC8vIHdlIGhhdmUgdGhlIFRIUkVFIGNvbnN0cnVjdG9yIGhlcmUsIGhhbmRsZSBpdFxuXHRcdGlmICh0aHJlZVRhcmdldCkge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBwcmVwYXJlKG5ldyB0aHJlZVRhcmdldCguLi5pbmplY3RlZEFyZ3MpLCB7IHN0b3JlOiB0aGlzLnJvb3RTdG9yZSB9KTtcblx0XHRcdGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKCd0aHJlZScsIGluc3RhbmNlLCB0aGlzLmRvY3VtZW50KTtcblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKSBhcyBOZ3RMb2NhbFN0YXRlO1xuXG5cdFx0XHQvLyBhdXRvLWF0dGFjaCBmb3IgZ2VvbWV0cnkgYW5kIG1hdGVyaWFsXG5cdFx0XHRpZiAoaXMuZ2VvbWV0cnkoaW5zdGFuY2UpKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUuYXR0YWNoID0gWydnZW9tZXRyeSddO1xuXHRcdFx0fSBlbHNlIGlmIChpcy5tYXRlcmlhbChpbnN0YW5jZSkpIHtcblx0XHRcdFx0bG9jYWxTdGF0ZS5hdHRhY2ggPSBbJ21hdGVyaWFsJ107XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVOb2RlKCdkb20nLCBlbGVtZW50LCB0aGlzLmRvY3VtZW50KTtcblx0fVxuXG5cdGNyZWF0ZUNvbW1lbnQodmFsdWU6IHN0cmluZykge1xuXHRcdGNvbnN0IGNvbW1lbnQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodmFsdWUpO1xuXG5cdFx0Ly8gTk9URTogd2UgYXR0YWNoIGFuIGFycm93IGZ1bmN0aW9uIHRvIHRoZSBDb21tZW50IG5vZGVcblx0XHQvLyBJbiBvdXIgZGlyZWN0aXZlcywgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0aGVuIHN0YXJ0IHRyYWNraW5nIHRoZSBSZW5kZXJlck5vZGVcblx0XHQvLyB0aGlzIGlzIGRvbmUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBOb2RlcyB3ZSBuZWVkIHRvIHByb2Nlc3MgZm9yIGdldENyZWF0aW9uU3RhdGVcblx0XHRjb21tZW50W1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdID0gKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSB8ICdhcmdzJykgPT4ge1xuXHRcdFx0aWYgKG5vZGUgPT09ICdhcmdzJykge1xuXHRcdFx0XHR0aGlzLmFyZ3NDb21tZW50Tm9kZXMucHVzaChjb21tZW50KTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY3JlYXRlTm9kZSgnY29tbWVudCcsIGNvbW1lbnQsIHRoaXMuZG9jdW1lbnQpO1xuXHR9XG5cblx0YXBwZW5kQ2hpbGQocGFyZW50OiBOZ3RSZW5kZXJlck5vZGUsIG5ld0NoaWxkOiBOZ3RSZW5kZXJlck5vZGUpOiB2b2lkIHtcblx0XHRjb25zdCBwUlMgPSBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRjb25zdCBjUlMgPSBuZXdDaGlsZC5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0aWYgKFxuXHRcdFx0cFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgJiZcblx0XHRcdChuZXdDaGlsZCBpbnN0YW5jZW9mIFRleHQgfHwgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScpXG5cdFx0KSB7XG5cdFx0XHRhZGRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblxuXHRcdFx0aWYgKG5ld0NoaWxkWydfX25ndF9kb21fcGFyZW50X18nXSAmJiBuZXdDaGlsZFsnX19uZ3RfZG9tX3BhcmVudF9fJ10gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHRcdFx0XHR0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKG5ld0NoaWxkWydfX25ndF9kb21fcGFyZW50X18nXSwgbmV3Q2hpbGQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHRpZiAoY1JTKSB7XG5cdFx0XHRcdHNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcblx0XHRcdFx0aWYgKHRoaXMuc2hvdWxkRmluZEdyYW5kcGFyZW50SW5zdGFuY2UocFJTLCBjUlMsIG5ld0NoaWxkKSkge1xuXHRcdFx0XHRcdC8vIHdlJ2xsIHRyeSB0byBnZXQgdGhlIGdyYW5kcGFyZW50IGluc3RhbmNlIGhlcmUgc28gdGhhdCB3ZSBjYW4gcnVuIGFwcGVuZENoaWxkIHdpdGggYm90aCBpbnN0YW5jZXNcblx0XHRcdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSA9IGdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdFx0XHRpZiAoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UpIHRoaXMuYXBwZW5kQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UsIG5ld0NoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHRzZXRQYXJlbnQobmV3Q2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c2V0UGFyZW50KG5ld0NoaWxkLCBwYXJlbnQpO1xuXHRcdGFkZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXG5cdFx0Ly8gaWYgbmV3IGNoaWxkIGlzIGEgcG9ydGFsXG5cdFx0aWYgKGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdGlmICghY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB0aGlzLnByb2Nlc3NQb3J0YWxDb250YWluZXIobmV3Q2hpbGQpO1xuXHRcdFx0aWYgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSkge1xuXHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKHBhcmVudCwgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBpZiBwYXJlbnQgaXMgYSBwb3J0YWxcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdGlmICghcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB0aGlzLnByb2Nlc3NQb3J0YWxDb250YWluZXIocGFyZW50KTtcblxuXHRcdFx0aWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSkge1xuXHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSwgbmV3Q2hpbGQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGlmIGJvdGggYXJlIHRocmVlIGluc3RhbmNlcywgc3RyYWlnaHRmb3J3YXJkIGNhc2Vcblx0XHRpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJiBjUlM/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdGNvbnN0IGNMUyA9IGdldExvY2FsU3RhdGUobmV3Q2hpbGQpO1xuXG5cdFx0XHQvLyBpZiBjaGlsZCBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgcGFyZW50LCBza2lwXG5cdFx0XHRpZiAoY0xTPy5pbnN0YW5jZVN0b3JlPy5nZXQoJ3BhcmVudCcpKSByZXR1cm47XG5cdFx0XHRpZiAocGFyZW50ID09PSBuZXdDaGlsZCkgcmV0dXJuO1xuXG5cdFx0XHQvLyBhdHRhY2ggVEhSRUUgY2hpbGRcblx0XHRcdGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gaWYgb25seSB0aGUgcGFyZW50IGlzIHRoZSBUSFJFRSBpbnN0YW5jZVxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHJlbmRlckNoaWxkIG9mIGNSUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gfHwgW10pIHtcblx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZChwYXJlbnQsIHJlbmRlckNoaWxkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZShwUlMsIGNSUywgbmV3Q2hpbGQpKSB7XG5cdFx0XHQvLyB3ZSdsbCB0cnkgdG8gZ2V0IHRoZSBncmFuZHBhcmVudCBpbnN0YW5jZSBoZXJlIHNvIHRoYXQgd2UgY2FuIHJ1biBhcHBlbmRDaGlsZCB3aXRoIGJvdGggaW5zdGFuY2VzXG5cdFx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSA9IGdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5hcHBlbmRDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgbmV3Q2hpbGQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGluc2VydEJlZm9yZShcblx0XHRwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0XHRuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRcdC8vIFRPRE86IHdlIG1pZ2h0IG5lZWQgdGhlc2U/XG5cdFx0Ly8gX3JlZkNoaWxkOiBOZ3RSZW5kZXJlck5vZGUsXG5cdFx0Ly8gX2lzTW92ZT86IGJvb2xlYW4gfCB1bmRlZmluZWQsXG5cdCk6IHZvaWQge1xuXHRcdC8vIE5PVEU6IG5vdCBzdXJlIHdoeSB0aGlzIGlzIGhlcmUuIGludmVzdGlnYXRlIHdoZW4gd2UgaGF2ZSB0aW1lXG5cdFx0Ly8gaWYgKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIChuZXdDaGlsZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IG5ld0NoaWxkIGluc3RhbmNlb2YgVGV4dCkpIHtcblx0XHQvLyBcdHJldHVybiB0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuXHRcdC8vIH1cblxuXHRcdGlmIChwYXJlbnQgPT0gbnVsbCB8fCAhcGFyZW50Ll9fbmd0X3JlbmRlcmVyX18gfHwgcGFyZW50ID09PSBuZXdDaGlsZCkgcmV0dXJuO1xuXHRcdHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG5cdH1cblxuXHRyZW1vdmVDaGlsZChwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwsIG9sZENoaWxkOiBOZ3RSZW5kZXJlck5vZGUsIGlzSG9zdEVsZW1lbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKHBhcmVudCA9PSBudWxsKSB7XG5cdFx0XHRwYXJlbnQgPSAodW50cmFja2VkKCgpID0+IGdldExvY2FsU3RhdGUob2xkQ2hpbGQpPy5wYXJlbnQoKSkgfHxcblx0XHRcdFx0b2xkQ2hpbGQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkgYXMgTmd0UmVuZGVyZXJOb2RlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNSUyA9IG9sZENoaWxkLl9fbmd0X3JlbmRlcmVyX187XG5cblx0XHQvLyBpZiBwYXJlbnQgaXMgc3RpbGwgZmFsc3ksIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoZSBwYXJlbnQuXG5cdFx0Ly8gd2UnbGwganVzdCByZW1vdmUgdGhlIGNoaWxkIGFuZCBkZXN0cm95IGl0XG5cdFx0aWYgKHBhcmVudCA9PSBudWxsKSB7XG5cdFx0XHRpZiAoY1JTKSB7XG5cdFx0XHRcdGlmIChjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHRcdFx0cmVtb3ZlVGhyZWVDaGlsZChvbGRDaGlsZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmRlc3Ryb3lJbnRlcm5hbChvbGRDaGlsZCwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0aWYgKFxuXHRcdFx0KCFjUlMgfHwgIXBSUykgJiZcblx0XHRcdHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcblx0XHRcdChvbGRDaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgb2xkQ2hpbGQgaW5zdGFuY2VvZiBUZXh0IHx8IG9sZENoaWxkIGluc3RhbmNlb2YgQ29tbWVudClcblx0XHQpIHtcblx0XHRcdHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCk7XG5cdFx0XHR0aGlzLmRlc3Ryb3lJbnRlcm5hbChvbGRDaGlsZCwgcGFyZW50KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgJiYgKCFwUlMgfHwgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScpKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnJlbW92ZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQpO1xuXHRcdFx0dGhpcy5kZXN0cm95SW50ZXJuYWwob2xkQ2hpbGQsIHBhcmVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0cmVtb3ZlVGhyZWVDaGlsZChvbGRDaGlsZCwgcGFyZW50LCB0cnVlKTtcblx0XHRcdHRoaXMuZGVzdHJveUludGVybmFsKG9sZENoaWxkLCBwYXJlbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnICYmXG5cdFx0XHRwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0/Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnXG5cdFx0KSB7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHR0aGlzLmRlc3Ryb3lJbnRlcm5hbChvbGRDaGlsZCwgcGFyZW50KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSA9IGdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRpZiAoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UpIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UsIG9sZENoaWxkLCBpc0hvc3RFbGVtZW50KTtcblx0XHR0aGlzLmRlc3Ryb3lJbnRlcm5hbChvbGRDaGlsZCwgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgYXMgTmd0UmVuZGVyZXJOb2RlKTtcblx0fVxuXG5cdHBhcmVudE5vZGUobm9kZTogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTPy5bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHJldHVybiByU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5wYXJlbnROb2RlKG5vZGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRBdHRyaWJ1dGVJbnRlcm5hbChcblx0XHRlbDogTmd0UmVuZGVyZXJOb2RlLFxuXHRcdG5hbWU6IHN0cmluZyxcblx0XHR2YWx1ZTogc3RyaW5nLFxuXHRcdF9uYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm4gZmFsc2U7XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFTkRFUl9QUklPUklUWSkge1xuXHRcdFx0XHQvLyBOT1RFOiBwcmlvcml0eSBuZWVkcyB0byBiZSBzZXQgYXMgYW4gYXR0cmlidXRlIHN0cmluZyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNldCBhcyBlYXJseSBhcyBwb3NzaWJsZVxuXHRcdFx0XHQvLyB3ZSBjb252ZXJ0IHRoYXQgc3RyaW5nIHRvIGEgbnVtYmVyLiBpZiBpdCdzIGludmFsaWQsIGRlZmF1bHQgMFxuXHRcdFx0XHRsZXQgcHJpb3JpdHkgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0XHRpZiAoaXNOYU4ocHJpb3JpdHkpKSB7XG5cdFx0XHRcdFx0cHJpb3JpdHkgPSAwO1xuXHRcdFx0XHRcdGNvbnNvbGUud2FybihgW05HVF0gXCJwcmlvcml0eVwiIGlzIGFuIGludmFsaWQgbnVtYmVyLCBkZWZhdWx0IHRvIDBgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShlbCk7XG5cdFx0XHRcdGlmIChsb2NhbFN0YXRlKSBsb2NhbFN0YXRlLnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cdFx0XHR9IGVsc2UgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdFx0Ly8gTk9URTogaGFuZGxlIGF0dGFjaCBhcyBzdHJpbmdcblx0XHRcdFx0Y29uc3QgcGF0aHMgPSB2YWx1ZS5zcGxpdCgnLicpO1xuXHRcdFx0XHRpZiAocGF0aHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoZWwpO1xuXHRcdFx0XHRcdGlmIChsb2NhbFN0YXRlKSBsb2NhbFN0YXRlLmF0dGFjaCA9IHBhdGhzO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SQVdfVkFMVUUpIHtcblx0XHRcdFx0Ly8gTk9URTogY29lcmNpb25cblx0XHRcdFx0bGV0IG1heWJlQ29lcmNlZDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiA9IHZhbHVlO1xuXHRcdFx0XHRpZiAobWF5YmVDb2VyY2VkID09PSAnJyB8fCBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICdmYWxzZScpIHtcblx0XHRcdFx0XHRtYXliZUNvZXJjZWQgPSBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICcnO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFpc05hTihOdW1iZXIobWF5YmVDb2VyY2VkKSkpIHtcblx0XHRcdFx0XHRtYXliZUNvZXJjZWQgPSBOdW1iZXIobWF5YmVDb2VyY2VkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gbWF5YmVDb2VyY2VkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXBwbHlQcm9wcyhlbCwgeyBbbmFtZV06IHZhbHVlIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRzZXRBdHRyaWJ1dGUoZWw6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Y29uc3QgdXNlRGVsZWdhdGUgPSB0aGlzLnNldEF0dHJpYnV0ZUludGVybmFsKGVsLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKTtcblxuXHRcdGlmICh1c2VEZWxlZ2F0ZSkge1xuXHRcdFx0dGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHRyZW1vdmVBdHRyaWJ1dGUoZWw6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Y29uc3QgdXNlRGVsZWdhdGUgPSB0aGlzLnNldEF0dHJpYnV0ZUludGVybmFsKGVsLCBuYW1lLCB1bmRlZmluZWQhLCBuYW1lc3BhY2UpO1xuXG5cdFx0aWYgKHVzZURlbGVnYXRlKSB7XG5cdFx0XHR0aGlzLmRlbGVnYXRlLnJlbW92ZUF0dHJpYnV0ZShlbCwgbmFtZSwgbmFtZXNwYWNlKTtcblx0XHR9XG5cdH1cblxuXHRzZXRQcm9wZXJ0eShlbDogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHRjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKCFyUyB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5QQVJBTUVURVJTKSB7XG5cdFx0XHRcdC8vIE5PVEU6IHNob3J0LWN1dCBmb3IgbnVsbCByYXljYXN0IHRvIHByZXZlbnQgdXBzdHJlYW0gZnJvbSBjcmVhdGluZyBhIG51bGxSYXljYXN0IHByb3BlcnR5XG5cdFx0XHRcdGlmICgncmF5Y2FzdCcgaW4gdmFsdWUgJiYgdmFsdWVbJ3JheWNhc3QnXSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHZhbHVlWydyYXljYXN0J10gPSAoKSA9PiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFwcGx5UHJvcHMoZWwsIHZhbHVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShlbCk7XG5cdFx0XHRjb25zdCBwYXJlbnQgPSBsb2NhbFN0YXRlPy5pbnN0YW5jZVN0b3JlLmdldCgncGFyZW50JykgfHwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cblx0XHRcdC8vIFtyYXdWYWx1ZV1cblx0XHRcdGlmIChsb2NhbFN0YXRlPy5pc1JhdyAmJiBuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuUkFXX1ZBTFVFKSB7XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPSB2YWx1ZTtcblx0XHRcdFx0aWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIGVsKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBbYXR0YWNoXVxuXHRcdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdFx0aWYgKGxvY2FsU3RhdGUpXG5cdFx0XHRcdFx0bG9jYWxTdGF0ZS5hdHRhY2ggPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdFx0PyB2YWx1ZS5tYXAoKHYpID0+IHYudG9TdHJpbmcoKSlcblx0XHRcdFx0XHRcdDogdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG5cdFx0XHRcdFx0XHRcdD8gdmFsdWVcblx0XHRcdFx0XHRcdFx0OiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG5cdFx0XHRcdFx0XHRcdFx0PyB2YWx1ZS5zcGxpdCgnLicpXG5cdFx0XHRcdFx0XHRcdFx0OiBbdmFsdWVdO1xuXHRcdFx0XHRpZiAocGFyZW50KSBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgZWwpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5PVEU6IHNob3J0LWN1dCBmb3IgbnVsbCByYXljYXN0IHRvIHByZXZlbnQgdXBzdHJlYW0gZnJvbSBjcmVhdGluZyBhIG51bGxSYXljYXN0IHByb3BlcnR5XG5cdFx0XHRpZiAobmFtZSA9PT0gJ3JheWNhc3QnICYmIHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdHZhbHVlID0gKCkgPT4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0YXBwbHlQcm9wcyhlbCwgeyBbbmFtZV06IHZhbHVlIH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7XG5cdH1cblxuXHRsaXN0ZW4odGFyZ2V0OiBOZ3RSZW5kZXJlck5vZGUsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IGJvb2xlYW4gfCB2b2lkKTogKCkgPT4gdm9pZCB7XG5cdFx0Y29uc3QgclMgPSB0YXJnZXQuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdC8vIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBoYXZlIF9fbmd0X3JlbmRlcmVyX18sIHdlIGRlbGVnYXRlXG5cdFx0Ly8gaWYgdGFyZ2V0IGlzIERPTSBub2RlLCB3ZSBkZWxlZ2F0ZVxuXHRcdGlmICghclMgfHwgaXNET00odGFyZ2V0KSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjayk7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cdFx0XHRjb25zdCBwcmlvcml0eSA9IGxvY2FsU3RhdGU/LnByaW9yaXR5ID8/IDA7XG5cdFx0XHRyZXR1cm4gcHJvY2Vzc1RocmVlRXZlbnQoaW5zdGFuY2UsIHByaW9yaXR5LCBldmVudE5hbWUsIGNhbGxiYWNrKTtcblx0XHR9XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gd2Uga25vdyB0aGF0IHRhcmdldCBpcyBub3QgRE9NIG5vZGVcblx0XHRpZiAodGFyZ2V0ID09PSB0aGlzLnJvb3RTdG9yZS5zbmFwc2hvdC5zY2VuZSkge1xuXHRcdFx0bGV0IFtkb21UYXJnZXQsIGV2ZW50XSA9IGV2ZW50TmFtZS5zcGxpdCgnOicpO1xuXHRcdFx0aWYgKGV2ZW50ID09IG51bGwpIHtcblx0XHRcdFx0ZXZlbnQgPSBkb21UYXJnZXQ7XG5cdFx0XHRcdGRvbVRhcmdldCA9ICcnO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXZlbnRUYXJnZXQgPVxuXHRcdFx0XHRkb21UYXJnZXQgPT09ICd3aW5kb3cnXG5cdFx0XHRcdFx0PyAodGFyZ2V0IGFzIE5ndEFueVJlY29yZClbJ293bmVyRG9jdW1lbnQnXVsnZGVmYXVsdFZpZXcnXVxuXHRcdFx0XHRcdDogKHRhcmdldCBhcyBOZ3RBbnlSZWNvcmQpWydvd25lckRvY3VtZW50J107XG5cdFx0XHRyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5saXN0ZW4oZXZlbnRUYXJnZXQsIGV2ZW50LCBjYWxsYmFjayk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICgpID0+IHt9O1xuXHR9XG5cblx0cHJpdmF0ZSBkZXN0cm95SW50ZXJuYWwobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBwYXJlbnQ/OiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoIXJTIHx8IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG5cdFx0XHRpZiAobG9jYWxTdGF0ZT8uaW5zdGFuY2VTdG9yZSkge1xuXHRcdFx0XHRsb2NhbFN0YXRlLmluc3RhbmNlU3RvcmUuZ2V0KCdvYmplY3RzJykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3lJbnRlcm5hbChvYmosIHBhcmVudCkpO1xuXHRcdFx0XHRsb2NhbFN0YXRlLmluc3RhbmNlU3RvcmUuZ2V0KCdub25PYmplY3RzJykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3lJbnRlcm5hbChvYmosIHBhcmVudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobG9jYWxTdGF0ZT8ub25VcGRhdGUpIGRlbGV0ZSBsb2NhbFN0YXRlLm9uVXBkYXRlO1xuXHRcdFx0aWYgKGxvY2FsU3RhdGU/Lm9uQXR0YWNoKSBkZWxldGUgbG9jYWxTdGF0ZS5vbkF0dGFjaDtcblxuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ29iamVjdHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydub25PYmplY3RzJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsncGFyZW50J107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWRkJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsncmVtb3ZlJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnc3RvcmUnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydoYW5kbGVycyddO1xuXG5cdFx0XHRpZiAoIWxvY2FsU3RhdGU/LnByaW1pdGl2ZSkge1xuXHRcdFx0XHRkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcblx0XHRcdGRlbGV0ZSAobm9kZSBhcyBOZ3RBbnlSZWNvcmQpW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdO1xuXHRcdFx0dGhpcy5yZW1vdmVDb21tZW50Tm9kZShub2RlLCB0aGlzLmFyZ3NDb21tZW50Tm9kZXMpO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuXHRcdFx0dGhpcy5yZW1vdmVDb21tZW50Tm9kZShub2RlLCB0aGlzLnBvcnRhbENvbW1lbnRzTm9kZXMpO1xuXHRcdH1cblxuXHRcdC8vIG51bGxpZnkgcGFyZW50XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0gPSBudWxsO1xuXHRcdGZvciAoY29uc3QgcmVuZGVyQ2hpbGQgb2YgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXSB8fCBbXSkge1xuXHRcdFx0aWYgKHJlbmRlckNoaWxkLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgcGFyZW50KSB7XG5cdFx0XHRcdGlmIChwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0XHRcdHJlbW92ZVRocmVlQ2hpbGQocmVuZGVyQ2hpbGQsIHBhcmVudCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjbG9zZXN0SW5zdGFuY2UgPSBnZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKHBhcmVudCk7XG5cdFx0XHRcdGlmIChjbG9zZXN0SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRyZW1vdmVUaHJlZUNoaWxkKHJlbmRlckNoaWxkLCBjbG9zZXN0SW5zdGFuY2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRlc3Ryb3lJbnRlcm5hbChyZW5kZXJDaGlsZCwgcGFyZW50KTtcblx0XHR9XG5cblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dID0gW107XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuXHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdHJlbW92ZUNoaWxkKHBhcmVudCwgbm9kZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZW1vdmVDb21tZW50Tm9kZShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG5vZGVzOiBOZ3RSZW5kZXJlck5vZGVbXSkge1xuXHRcdGNvbnN0IGluZGV4ID0gbm9kZXMuZmluZEluZGV4KChjb21tZW50KSA9PiBjb21tZW50ID09PSBub2RlKTtcblx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0bm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NQb3J0YWxDb250YWluZXIocG9ydGFsOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbmplY3RvciA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldPy4oKTtcblx0XHRpZiAoIWluamVjdG9yKSByZXR1cm47XG5cblx0XHRjb25zdCBwb3J0YWxTdG9yZSA9IGluamVjdG9yLmdldChOR1RfU1RPUkUsIG51bGwpO1xuXHRcdGlmICghcG9ydGFsU3RvcmUpIHJldHVybjtcblxuXHRcdGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IHBvcnRhbFN0b3JlLmdldCgnc2NlbmUnKTtcblx0XHRpZiAoIXBvcnRhbENvbnRhaW5lcikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUocG9ydGFsQ29udGFpbmVyKTtcblx0XHRpZiAobG9jYWxTdGF0ZSkge1xuXHRcdFx0bG9jYWxTdGF0ZS5zdG9yZSA9IHBvcnRhbFN0b3JlO1xuXHRcdH1cblxuXHRcdHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdID0gY3JlYXRlTm9kZSgndGhyZWUnLCBwb3J0YWxDb250YWluZXIsIHRoaXMuZG9jdW1lbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBzaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZShwUlM6IE5ndFJlbmRlcmVyU3RhdGUsIGNSUzogTmd0UmVuZGVyZXJTdGF0ZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHBUeXBlID0gcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXTtcblx0XHRjb25zdCBjVHlwZSA9IGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV07XG5cblx0XHRjb25zdCBjTFMgPSBnZXRMb2NhbFN0YXRlKGNoaWxkKTtcblx0XHQvLyBpZiBjaGlsZCBpcyB0aHJlZSBidXQgaGF2ZW4ndCBiZWVuIGF0dGFjaGVkIHRvIGEgcGFyZW50IHlldFxuXHRcdGNvbnN0IGlzRGFuZ2xpbmdUaHJlZUNoaWxkID0gY1R5cGUgPT09ICd0aHJlZScgJiYgIWNMUz8uaW5zdGFuY2VTdG9yZT8uZ2V0KCdwYXJlbnQnKTtcblx0XHQvLyBvciBib3RoIHBhcmVudCBhbmQgY2hpbGQgYXJlIERPTSBlbGVtZW50c1xuXHRcdC8vIG9yIHRoZXkgYXJlIGNvbXBvdW5kIEFORCBoYXZlbid0IGhhZCBhIFRIUkVFIGluc3RhbmNlIHlldFxuXHRcdGNvbnN0IGlzUGFyZW50U3RpbGxET00gPSBwVHlwZSA9PT0gJ2RvbSc7XG5cdFx0Y29uc3QgaXNDaGlsZFN0aWxsRE9NID0gY1R5cGUgPT09ICdkb20nO1xuXG5cdFx0cmV0dXJuIGlzRGFuZ2xpbmdUaHJlZUNoaWxkIHx8IChpc1BhcmVudFN0aWxsRE9NICYmIGlzQ2hpbGRTdGlsbERPTSkgfHwgaXNQYXJlbnRTdGlsbERPTTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Tmd0QXJncygpIHtcblx0XHRsZXQgZGlyZWN0aXZlOiBOZ3RBcmdzIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cblx0XHRsZXQgaSA9IHRoaXMuYXJnc0NvbW1lbnROb2Rlcy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdGNvbnN0IGNvbW1lbnQgPSB0aGlzLmFyZ3NDb21tZW50Tm9kZXNbaV07XG5cdFx0XHRpZiAoY29tbWVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSB7XG5cdFx0XHRcdGRlc3Ryb3llZC5wdXNoKGkpO1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5qZWN0b3IgPSBjb21tZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0oKTtcblx0XHRcdGlmICghaW5qZWN0b3IpIHtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KE5ndEFyZ3MsIG51bGwpO1xuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLnZhbGlkYXRlKCkpIHtcblx0XHRcdFx0ZGlyZWN0aXZlID0gaW5zdGFuY2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRpLS07XG5cdFx0fVxuXG5cdFx0ZGVzdHJveWVkLmZvckVhY2goKGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLmFyZ3NDb21tZW50Tm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBkaXJlY3RpdmU7XG5cdH1cblxuXHRwcml2YXRlIHRyeUdldFBvcnRhbFN0b3JlKCkge1xuXHRcdGxldCBzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGRlc3Ryb3llZCA9IFtdO1xuXHRcdC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgcG9ydGFsIHN0YXRlcyBiZWNhdXNlIE5ndFN0b3JlIG9ubHkgZGlmZmVycyBwZXIgUG9ydGFsXG5cdFx0bGV0IGkgPSB0aGlzLnBvcnRhbENvbW1lbnRzTm9kZXMubGVuZ3RoIC0gMTtcblx0XHR3aGlsZSAoaSA+PSAwKSB7XG5cdFx0XHQvLyBsb29wIHRocm91Z2ggdGhlIHBvcnRhbCBzdGF0ZSBiYWNrd2FyZHMgdG8gZmluZCB0aGUgY2xvc2VzdCBOZ3RTdG9yZVxuXHRcdFx0Y29uc3QgcG9ydGFsID0gdGhpcy5wb3J0YWxDb21tZW50c05vZGVzW2ldO1xuXHRcdFx0aWYgKHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSB7XG5cdFx0XHRcdGRlc3Ryb3llZC5wdXNoKGkpO1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBpbmplY3RvciA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCk7XG5cdFx0XHRpZiAoIWluamVjdG9yKSB7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IGluamVjdG9yLmdldChOR1RfU1RPUkUsIG51bGwpO1xuXHRcdFx0Ly8gb25seSB0aGUgaW5zdGFuY2Ugd2l0aCBwcmV2aW91c1Jvb3Qgc2hvdWxkIHBhc3Ncblx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5nZXQoJ3ByZXZpb3VzUm9vdCcpKSB7XG5cdFx0XHRcdHN0b3JlID0gaW5zdGFuY2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aS0tO1xuXHRcdH1cblxuXHRcdGRlc3Ryb3llZC5mb3JFYWNoKChpbmRleCkgPT4ge1xuXHRcdFx0dGhpcy5wb3J0YWxDb21tZW50c05vZGVzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gc3RvcmUgfHwgdGhpcy5yb290U3RvcmU7XG5cdH1cblxuXHRjcmVhdGVUZXh0ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVUZXh0LmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGRlc3Ryb3kgPSB0aGlzLmRlbGVnYXRlLmRlc3Ryb3kuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0ZGVzdHJveU5vZGU6ICgobm9kZTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXHRzZWxlY3RSb290RWxlbWVudCA9IHRoaXMuZGVsZWdhdGUuc2VsZWN0Um9vdEVsZW1lbnQuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0bmV4dFNpYmxpbmcgPSB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdGFkZENsYXNzID0gdGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcy5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRyZW1vdmVDbGFzcyA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0c2V0U3R5bGUgPSB0aGlzLmRlbGVnYXRlLnNldFN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG5cdHJlbW92ZVN0eWxlID0gdGhpcy5kZWxlZ2F0ZS5yZW1vdmVTdHlsZS5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuXHRzZXRWYWx1ZSA9IHRoaXMuZGVsZWdhdGUuc2V0VmFsdWUuYmluZCh0aGlzLmRlbGVnYXRlKTtcblx0Z2V0IGRhdGEoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG5cdFx0cmV0dXJuIHRoaXMuZGVsZWdhdGUuZGF0YTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZU5ndFJlbmRlcmVyKHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4pIHtcblx0Y29uc3QgcHJvdmlkZXJzID0gW1xuXHRcdE5ndFJlbmRlcmVyRmFjdG9yeSxcblx0XHR7IHByb3ZpZGU6IFJlbmRlcmVyRmFjdG9yeTIsIHVzZUV4aXN0aW5nOiBOZ3RSZW5kZXJlckZhY3RvcnkgfSxcblx0XHRwcm92aWRlU3RvcmUoKCkgPT4gc3RvcmUpLFxuXHRdO1xuXG5cdHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMocHJvdmlkZXJzKTtcbn1cblxuZXhwb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi9jYXRhbG9ndWUnO1xuZXhwb3J0IHsgSFRNTCwgUk9VVEVEX1NDRU5FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuIl19
|