angular-three 2.0.0-beta.17 → 2.0.0-beta.19
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/esm2022/index.mjs +2 -1
- package/esm2022/lib/before-render.mjs +2 -2
- package/esm2022/lib/canvas.mjs +7 -6
- package/esm2022/lib/directives/args.mjs +3 -3
- package/esm2022/lib/directives/common.mjs +3 -3
- package/esm2022/lib/directives/key.mjs +3 -3
- package/esm2022/lib/directives/parent.mjs +3 -3
- package/esm2022/lib/directives/repeat.mjs +3 -3
- package/esm2022/lib/instance.mjs +2 -2
- package/esm2022/lib/loader.mjs +2 -2
- package/esm2022/lib/portal.mjs +10 -10
- package/esm2022/lib/renderer/index.mjs +65 -65
- package/esm2022/lib/renderer/store.mjs +91 -91
- package/esm2022/lib/renderer/utils.mjs +36 -4
- package/esm2022/lib/routed-scene.mjs +9 -5
- package/esm2022/lib/three-types.mjs +2 -2
- package/esm2022/lib/utils/create-injection-token.mjs +2 -2
- package/fesm2022/angular-three.mjs +222 -186
- package/fesm2022/angular-three.mjs.map +1 -1
- package/lib/portal.d.ts +1 -1
- package/package.json +2 -2
- package/plugin/package.json +2 -1
- package/plugin/src/generators/init/compat.d.ts +3 -1
- package/plugin/src/generators/init/files/experience/experience.component.html.__tmpl__ +4 -0
- package/plugin/src/generators/init/files/experience/experience.component.ts.__tmpl__ +17 -0
- package/plugin/src/generators/init/generator.d.ts +5 -1
- package/plugin/src/generators/init/generator.js +106 -1
- package/plugin/src/generators/init/generator.js.map +1 -1
- package/plugin/src/generators/init/schema.json +12 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InjectionToken, getDebugNode, untracked } from '@angular/core';
|
|
1
|
+
import { InjectionToken, Injector, Type, getDebugNode, untracked } from '@angular/core';
|
|
2
2
|
import { NgtArgs } from '../directives/args';
|
|
3
3
|
import { NgtParent } from '../directives/parent';
|
|
4
4
|
import { getLocalState } from '../instance';
|
|
@@ -6,7 +6,7 @@ import { NGT_STORE } from '../store';
|
|
|
6
6
|
import { applyProps } from '../utils/apply-props';
|
|
7
7
|
import { is } from '../utils/is';
|
|
8
8
|
import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES } from './constants';
|
|
9
|
-
import { attachThreeChild, removeThreeChild } from './utils';
|
|
9
|
+
import { NgtCompoundClassId, NgtQueueOpClassId, NgtRendererClassId, attachThreeChild, removeThreeChild } from './utils';
|
|
10
10
|
export const NGT_COMPOUND_PREFIXES = new InjectionToken('NgtCompoundPrefixes');
|
|
11
11
|
export class NgtRendererStore {
|
|
12
12
|
constructor(root) {
|
|
@@ -37,15 +37,15 @@ export class NgtRendererStore {
|
|
|
37
37
|
rendererNode['ownerDocument'] = this.root.document;
|
|
38
38
|
// NOTE: assign injectorFactory on non-three type since
|
|
39
39
|
// rendererNode is an instance of DOM Node
|
|
40
|
-
if (state[
|
|
41
|
-
state[
|
|
40
|
+
if (state[NgtRendererClassId.type] !== 'three') {
|
|
41
|
+
state[NgtRendererClassId.injectorFactory] = () => getDebugNode(rendererNode).injector;
|
|
42
42
|
}
|
|
43
|
-
if (state[
|
|
43
|
+
if (state[NgtRendererClassId.type] === 'comment') {
|
|
44
44
|
// NOTE: we attach an arrow function to the Comment node
|
|
45
45
|
// In our directives, we can call this function to then start tracking the RendererNode
|
|
46
46
|
// this is done to limit the amount of Nodes we need to process for getCreationState
|
|
47
47
|
rendererNode[SPECIAL_INTERNAL_ADD_COMMENT] = (node) => {
|
|
48
|
-
if (node && node.__ngt_renderer__[
|
|
48
|
+
if (node && node.__ngt_renderer__[NgtRendererClassId.type] === 'portal') {
|
|
49
49
|
this.portals.push(node);
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
@@ -54,68 +54,68 @@ export class NgtRendererStore {
|
|
|
54
54
|
};
|
|
55
55
|
return rendererNode;
|
|
56
56
|
}
|
|
57
|
-
if (state[
|
|
58
|
-
state[
|
|
59
|
-
state[
|
|
60
|
-
state[
|
|
57
|
+
if (state[NgtRendererClassId.type] === 'compound') {
|
|
58
|
+
state[NgtRendererClassId.queueOps] = new Set();
|
|
59
|
+
state[NgtRendererClassId.attributes] = {};
|
|
60
|
+
state[NgtRendererClassId.properties] = {};
|
|
61
61
|
return rendererNode;
|
|
62
62
|
}
|
|
63
63
|
return rendererNode;
|
|
64
64
|
}
|
|
65
65
|
setParent(node, parent) {
|
|
66
|
-
if (!node.__ngt_renderer__[
|
|
67
|
-
node.__ngt_renderer__[
|
|
66
|
+
if (!node.__ngt_renderer__[NgtRendererClassId.parent]) {
|
|
67
|
+
node.__ngt_renderer__[NgtRendererClassId.parent] = parent;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
addChild(node, child) {
|
|
71
|
-
if (!node.__ngt_renderer__[
|
|
72
|
-
node.__ngt_renderer__[
|
|
71
|
+
if (!node.__ngt_renderer__[NgtRendererClassId.children].includes(child)) {
|
|
72
|
+
node.__ngt_renderer__[NgtRendererClassId.children].push(child);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
removeChild(node, child) {
|
|
76
|
-
const index = node.__ngt_renderer__?.[
|
|
76
|
+
const index = node.__ngt_renderer__?.[NgtRendererClassId.children].findIndex((c) => child === c);
|
|
77
77
|
if (index >= 0) {
|
|
78
|
-
node.__ngt_renderer__[
|
|
78
|
+
node.__ngt_renderer__[NgtRendererClassId.children].splice(index, 1);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
setCompound(compound, instance) {
|
|
82
82
|
const instanceRS = instance.__ngt_renderer__;
|
|
83
|
-
if (instanceRS && instanceRS[
|
|
84
|
-
const parentRS = instanceRS[
|
|
83
|
+
if (instanceRS && instanceRS[NgtRendererClassId.parent]) {
|
|
84
|
+
const parentRS = instanceRS[NgtRendererClassId.parent].__ngt_renderer__;
|
|
85
85
|
// NOTE: if instance is already compounded by its parent. skip
|
|
86
|
-
if (parentRS[
|
|
87
|
-
parentRS[
|
|
86
|
+
if (parentRS[NgtRendererClassId.type] === 'compound' &&
|
|
87
|
+
parentRS[NgtRendererClassId.compounded] === instance) {
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
const rS = compound.__ngt_renderer__;
|
|
92
|
-
rS[
|
|
93
|
-
const attributes = Object.keys(rS[
|
|
94
|
-
const properties = Object.keys(rS[
|
|
92
|
+
rS[NgtRendererClassId.compounded] = instance;
|
|
93
|
+
const attributes = Object.keys(rS[NgtRendererClassId.attributes]);
|
|
94
|
+
const properties = Object.keys(rS[NgtRendererClassId.properties]);
|
|
95
95
|
for (const key of attributes) {
|
|
96
|
-
this.applyAttribute(instance, key, rS[
|
|
96
|
+
this.applyAttribute(instance, key, rS[NgtRendererClassId.attributes][key]);
|
|
97
97
|
}
|
|
98
98
|
for (const key of properties) {
|
|
99
|
-
this.applyProperty(instance, key, rS[
|
|
99
|
+
this.applyProperty(instance, key, rS[NgtRendererClassId.properties][key]);
|
|
100
100
|
}
|
|
101
101
|
this.executeOperation(compound);
|
|
102
102
|
}
|
|
103
103
|
queueOperation(node, op) {
|
|
104
|
-
node.__ngt_renderer__[
|
|
104
|
+
node.__ngt_renderer__[NgtRendererClassId.queueOps].add(op);
|
|
105
105
|
}
|
|
106
106
|
executeOperation(node, type = 'op') {
|
|
107
107
|
const rS = node.__ngt_renderer__;
|
|
108
|
-
if (rS[
|
|
109
|
-
rS[
|
|
110
|
-
if (op[
|
|
111
|
-
op[
|
|
112
|
-
rS[
|
|
108
|
+
if (rS[NgtRendererClassId.queueOps]?.size) {
|
|
109
|
+
rS[NgtRendererClassId.queueOps].forEach((op) => {
|
|
110
|
+
if (op[NgtQueueOpClassId.type] === type) {
|
|
111
|
+
op[NgtQueueOpClassId.op]();
|
|
112
|
+
rS[NgtRendererClassId.queueOps].delete(op);
|
|
113
113
|
}
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
processPortalContainer(portal) {
|
|
118
|
-
const injectorFactory = portal.__ngt_renderer__[
|
|
118
|
+
const injectorFactory = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory];
|
|
119
119
|
const injector = injectorFactory?.();
|
|
120
120
|
if (!injector)
|
|
121
121
|
return;
|
|
@@ -125,11 +125,11 @@ export class NgtRendererStore {
|
|
|
125
125
|
const portalContainer = portalStore.get('scene');
|
|
126
126
|
if (!portalContainer)
|
|
127
127
|
return;
|
|
128
|
-
portal.__ngt_renderer__[
|
|
128
|
+
portal.__ngt_renderer__[NgtRendererClassId.portalContainer] = this.createNode('three', portalContainer);
|
|
129
129
|
}
|
|
130
130
|
applyAttribute(node, name, value) {
|
|
131
131
|
const rS = node.__ngt_renderer__;
|
|
132
|
-
if (rS[
|
|
132
|
+
if (rS[NgtRendererClassId.destroyed])
|
|
133
133
|
return;
|
|
134
134
|
if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
|
|
135
135
|
// NOTE: priority needs to be set as an attribute string so that they can be set as early as possible
|
|
@@ -143,7 +143,7 @@ export class NgtRendererStore {
|
|
|
143
143
|
}
|
|
144
144
|
if (name === SPECIAL_PROPERTIES.COMPOUND) {
|
|
145
145
|
// NOTE: we set the compound property on instance node now so we know that this instance is being compounded
|
|
146
|
-
rS[
|
|
146
|
+
rS[NgtRendererClassId.compound] = [value === '' || value === 'first', {}];
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
149
|
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
@@ -162,7 +162,7 @@ export class NgtRendererStore {
|
|
|
162
162
|
else if (!isNaN(Number(maybeCoerced))) {
|
|
163
163
|
maybeCoerced = Number(maybeCoerced);
|
|
164
164
|
}
|
|
165
|
-
rS[
|
|
165
|
+
rS[NgtRendererClassId.rawValue] = maybeCoerced;
|
|
166
166
|
return;
|
|
167
167
|
}
|
|
168
168
|
applyProps(node, { [name]: value });
|
|
@@ -170,18 +170,18 @@ export class NgtRendererStore {
|
|
|
170
170
|
}
|
|
171
171
|
applyProperty(node, name, value) {
|
|
172
172
|
const rS = node.__ngt_renderer__;
|
|
173
|
-
if (rS[
|
|
173
|
+
if (rS[NgtRendererClassId.destroyed])
|
|
174
174
|
return;
|
|
175
175
|
// [ref]
|
|
176
176
|
if (name === SPECIAL_PROPERTIES.REF && is.ref(value)) {
|
|
177
|
-
rS[
|
|
177
|
+
rS[NgtRendererClassId.ref] = value;
|
|
178
178
|
value.nativeElement = node;
|
|
179
179
|
return;
|
|
180
180
|
}
|
|
181
|
-
const parent = getLocalState(node).parent() || rS[
|
|
181
|
+
const parent = getLocalState(node).parent() || rS[NgtRendererClassId.parent];
|
|
182
182
|
// [rawValue]
|
|
183
183
|
if (getLocalState(node).isRaw && name === SPECIAL_PROPERTIES.VALUE) {
|
|
184
|
-
rS[
|
|
184
|
+
rS[NgtRendererClassId.rawValue] = value;
|
|
185
185
|
if (parent)
|
|
186
186
|
attachThreeChild(parent, node);
|
|
187
187
|
return;
|
|
@@ -193,11 +193,11 @@ export class NgtRendererStore {
|
|
|
193
193
|
attachThreeChild(parent, node);
|
|
194
194
|
return;
|
|
195
195
|
}
|
|
196
|
-
const compound = rS[
|
|
197
|
-
if (compound?.[
|
|
198
|
-
name in compound[
|
|
199
|
-
!compound[
|
|
200
|
-
value = compound[
|
|
196
|
+
const compound = rS[NgtRendererClassId.compound];
|
|
197
|
+
if (compound?.[NgtCompoundClassId.props] &&
|
|
198
|
+
name in compound[NgtCompoundClassId.props] &&
|
|
199
|
+
!compound[NgtCompoundClassId.applyFirst]) {
|
|
200
|
+
value = compound[NgtCompoundClassId.props][name];
|
|
201
201
|
}
|
|
202
202
|
applyProps(node, { [name]: value });
|
|
203
203
|
this.updateNativeProps(node, name, value);
|
|
@@ -208,7 +208,7 @@ export class NgtRendererStore {
|
|
|
208
208
|
isDOM(node) {
|
|
209
209
|
const rS = node['__ngt_renderer__'];
|
|
210
210
|
return (!rS ||
|
|
211
|
-
(rS[
|
|
211
|
+
(rS[NgtRendererClassId.type] !== 'compound' &&
|
|
212
212
|
(node instanceof Element || node instanceof Document || node instanceof Window)));
|
|
213
213
|
}
|
|
214
214
|
get rootScene() {
|
|
@@ -218,37 +218,37 @@ export class NgtRendererStore {
|
|
|
218
218
|
return this.root.portals;
|
|
219
219
|
}
|
|
220
220
|
getClosestParentWithInstance(node) {
|
|
221
|
-
let parent = node.__ngt_renderer__[
|
|
222
|
-
while (parent && parent.__ngt_renderer__[
|
|
223
|
-
parent = parent.__ngt_renderer__[
|
|
224
|
-
? parent.__ngt_renderer__[
|
|
225
|
-
: parent.__ngt_renderer__[
|
|
221
|
+
let parent = node.__ngt_renderer__[NgtRendererClassId.parent];
|
|
222
|
+
while (parent && parent.__ngt_renderer__[NgtRendererClassId.type] !== 'three') {
|
|
223
|
+
parent = parent.__ngt_renderer__[NgtRendererClassId.portalContainer]
|
|
224
|
+
? parent.__ngt_renderer__[NgtRendererClassId.portalContainer]
|
|
225
|
+
: parent.__ngt_renderer__[NgtRendererClassId.parent];
|
|
226
226
|
}
|
|
227
227
|
return parent;
|
|
228
228
|
}
|
|
229
229
|
getClosestParentWithCompound(node) {
|
|
230
|
-
if (node.__ngt_renderer__[
|
|
231
|
-
return node.__ngt_renderer__[
|
|
230
|
+
if (node.__ngt_renderer__[NgtRendererClassId.compoundParent]) {
|
|
231
|
+
return node.__ngt_renderer__[NgtRendererClassId.compoundParent];
|
|
232
232
|
}
|
|
233
|
-
let parent = node.__ngt_renderer__[
|
|
233
|
+
let parent = node.__ngt_renderer__[NgtRendererClassId.parent];
|
|
234
234
|
if (parent &&
|
|
235
|
-
parent.__ngt_renderer__[
|
|
236
|
-
!parent.__ngt_renderer__[
|
|
235
|
+
parent.__ngt_renderer__[NgtRendererClassId.type] === 'compound' &&
|
|
236
|
+
!parent.__ngt_renderer__[NgtRendererClassId.compounded]) {
|
|
237
237
|
return parent;
|
|
238
238
|
}
|
|
239
239
|
while (parent &&
|
|
240
|
-
(parent.__ngt_renderer__[
|
|
241
|
-
!parent.__ngt_renderer__[
|
|
242
|
-
parent.__ngt_renderer__[
|
|
243
|
-
parent = parent.__ngt_renderer__[
|
|
240
|
+
(parent.__ngt_renderer__[NgtRendererClassId.type] === 'three' ||
|
|
241
|
+
!parent.__ngt_renderer__[NgtRendererClassId.compoundParent] ||
|
|
242
|
+
parent.__ngt_renderer__[NgtRendererClassId.type] !== 'compound')) {
|
|
243
|
+
parent = parent.__ngt_renderer__[NgtRendererClassId.parent];
|
|
244
244
|
}
|
|
245
245
|
if (!parent)
|
|
246
246
|
return;
|
|
247
|
-
if (parent.__ngt_renderer__[
|
|
248
|
-
parent.__ngt_renderer__[
|
|
249
|
-
return parent.__ngt_renderer__[
|
|
247
|
+
if (parent.__ngt_renderer__[NgtRendererClassId.type] === 'three' &&
|
|
248
|
+
parent.__ngt_renderer__[NgtRendererClassId.compoundParent]) {
|
|
249
|
+
return parent.__ngt_renderer__[NgtRendererClassId.compoundParent];
|
|
250
250
|
}
|
|
251
|
-
if (!parent.__ngt_renderer__[
|
|
251
|
+
if (!parent.__ngt_renderer__[NgtRendererClassId.compounded]) {
|
|
252
252
|
return parent;
|
|
253
253
|
}
|
|
254
254
|
return null;
|
|
@@ -261,11 +261,11 @@ export class NgtRendererStore {
|
|
|
261
261
|
}
|
|
262
262
|
destroy(node, parent) {
|
|
263
263
|
const rS = node.__ngt_renderer__;
|
|
264
|
-
if (!rS || rS[
|
|
264
|
+
if (!rS || rS[NgtRendererClassId.destroyed])
|
|
265
265
|
return;
|
|
266
|
-
if (rS[
|
|
267
|
-
rS[
|
|
268
|
-
rS[
|
|
266
|
+
if (rS[NgtRendererClassId.type] === 'three') {
|
|
267
|
+
rS[NgtRendererClassId.compound] = undefined;
|
|
268
|
+
rS[NgtRendererClassId.compoundParent] = undefined;
|
|
269
269
|
const localState = getLocalState(node);
|
|
270
270
|
if (localState.objects) {
|
|
271
271
|
untracked(localState.objects).forEach((obj) => this.destroy(obj, parent));
|
|
@@ -290,42 +290,42 @@ export class NgtRendererStore {
|
|
|
290
290
|
delete node['__ngt__'];
|
|
291
291
|
}
|
|
292
292
|
}
|
|
293
|
-
if (rS[
|
|
294
|
-
rS[
|
|
293
|
+
if (rS[NgtRendererClassId.type] === 'comment') {
|
|
294
|
+
rS[NgtRendererClassId.injectorFactory] = null;
|
|
295
295
|
delete node[SPECIAL_INTERNAL_ADD_COMMENT];
|
|
296
296
|
const index = this.comments.findIndex((comment) => comment === node);
|
|
297
297
|
if (index > -1) {
|
|
298
298
|
this.comments.splice(index, 1);
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
|
-
if (rS[
|
|
302
|
-
rS[
|
|
301
|
+
if (rS[NgtRendererClassId.type] === 'portal') {
|
|
302
|
+
rS[NgtRendererClassId.injectorFactory] = null;
|
|
303
303
|
const index = this.portals.findIndex((portal) => portal === node);
|
|
304
304
|
if (index > -1) {
|
|
305
305
|
this.portals.splice(index, 1);
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
|
-
if (rS[
|
|
309
|
-
rS[
|
|
310
|
-
rS[
|
|
311
|
-
rS[
|
|
308
|
+
if (rS[NgtRendererClassId.type] === 'compound') {
|
|
309
|
+
rS[NgtRendererClassId.compounded] = undefined;
|
|
310
|
+
rS[NgtRendererClassId.attributes] = null;
|
|
311
|
+
rS[NgtRendererClassId.properties] = null;
|
|
312
312
|
this.executeOperation(node, 'cleanUp');
|
|
313
|
-
rS[
|
|
314
|
-
rS[
|
|
313
|
+
rS[NgtRendererClassId.queueOps].clear();
|
|
314
|
+
rS[NgtRendererClassId.queueOps] = null;
|
|
315
315
|
}
|
|
316
|
-
if (rS[
|
|
316
|
+
if (rS[NgtRendererClassId.ref]) {
|
|
317
317
|
// nullify ref
|
|
318
318
|
// but we do it later so that it doesn't hinder render
|
|
319
319
|
// TODO: will this cause memory leak?
|
|
320
320
|
requestAnimationFrame(() => {
|
|
321
|
-
rS[
|
|
322
|
-
rS[
|
|
321
|
+
rS[NgtRendererClassId.ref].nativeElement = null;
|
|
322
|
+
rS[NgtRendererClassId.ref] = undefined;
|
|
323
323
|
});
|
|
324
324
|
}
|
|
325
325
|
// nullify parent
|
|
326
|
-
rS[
|
|
327
|
-
for (const renderChild of rS[
|
|
328
|
-
if (renderChild.__ngt_renderer__?.[
|
|
326
|
+
rS[NgtRendererClassId.parent] = null;
|
|
327
|
+
for (const renderChild of rS[NgtRendererClassId.children] || []) {
|
|
328
|
+
if (renderChild.__ngt_renderer__?.[NgtRendererClassId.type] === 'three' && parent) {
|
|
329
329
|
const closestInstance = this.getClosestParentWithInstance(parent);
|
|
330
330
|
if (closestInstance) {
|
|
331
331
|
removeThreeChild(closestInstance, renderChild, true);
|
|
@@ -333,8 +333,8 @@ export class NgtRendererStore {
|
|
|
333
333
|
}
|
|
334
334
|
this.destroy(renderChild, parent);
|
|
335
335
|
}
|
|
336
|
-
rS[
|
|
337
|
-
rS[
|
|
336
|
+
rS[NgtRendererClassId.children] = [];
|
|
337
|
+
rS[NgtRendererClassId.destroyed] = true;
|
|
338
338
|
if (parent) {
|
|
339
339
|
this.removeChild(parent, node);
|
|
340
340
|
}
|
|
@@ -351,12 +351,12 @@ export class NgtRendererStore {
|
|
|
351
351
|
let i = this.comments.length - 1;
|
|
352
352
|
while (i >= 0) {
|
|
353
353
|
const comment = this.comments[i];
|
|
354
|
-
if (comment.__ngt_renderer__[
|
|
354
|
+
if (comment.__ngt_renderer__[NgtRendererClassId.destroyed]) {
|
|
355
355
|
destroyed.push(i);
|
|
356
356
|
i--;
|
|
357
357
|
continue;
|
|
358
358
|
}
|
|
359
|
-
const injector = comment.__ngt_renderer__[
|
|
359
|
+
const injector = comment.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
|
|
360
360
|
if (!injector) {
|
|
361
361
|
i--;
|
|
362
362
|
continue;
|
|
@@ -381,12 +381,12 @@ export class NgtRendererStore {
|
|
|
381
381
|
while (i >= 0) {
|
|
382
382
|
// loop through the portal state backwards to find the closest NgtStore
|
|
383
383
|
const portal = this.portals[i];
|
|
384
|
-
if (portal.__ngt_renderer__[
|
|
384
|
+
if (portal.__ngt_renderer__[NgtRendererClassId.destroyed]) {
|
|
385
385
|
destroyed.push(i);
|
|
386
386
|
i--;
|
|
387
387
|
continue;
|
|
388
388
|
}
|
|
389
|
-
const injector = portal.__ngt_renderer__[
|
|
389
|
+
const injector = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
|
|
390
390
|
if (!injector) {
|
|
391
391
|
i--;
|
|
392
392
|
continue;
|
|
@@ -405,4 +405,4 @@ export class NgtRendererStore {
|
|
|
405
405
|
return store || this.root.store;
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFrQixZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBd0IsTUFBTSxhQUFhLENBQUM7QUFFbEUsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSxVQUFVLENBQUM7QUFFcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBNkQsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQVcscUJBQXFCLENBQUMsQ0FBQztBQWdDekYsTUFBTSxPQUFPLGdCQUFnQjtJQUc1QixZQUFvQixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUZ0QyxhQUFRLEdBQUcsRUFBNEIsQ0FBQztJQUVDLENBQUM7SUFFbEQsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDN0UsTUFBTSxLQUFLLEdBQUc7WUFDYixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZ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USxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLGtEQUFrRDtZQUNsRCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUM3QyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUNqQixNQUFNO2FBQ047WUFDRCxDQUFDLEVBQUUsQ0FBQztTQUNKO1FBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFLLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuLCBJbmplY3RvciwgVHlwZSwgZ2V0RGVidWdOb2RlLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FyZ3MnO1xuaW1wb3J0IHR5cGUgeyBOZ3RDb21tb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NvbW1vbic7XG5pbXBvcnQgeyBOZ3RQYXJlbnQgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3BhcmVudCc7XG5pbXBvcnQgeyBnZXRMb2NhbFN0YXRlLCB0eXBlIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB0eXBlIHsgTmd0UmVmIH0gZnJvbSAnLi4vcmVmJztcbmltcG9ydCB7IE5HVF9TVE9SRSwgdHlwZSBOZ3RTdGF0ZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlQcm9wcyB9IGZyb20gJy4uL3V0aWxzL2FwcGx5LXByb3BzJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHR5cGUgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4uL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5ULCBTUEVDSUFMX1BST1BFUlRJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3RDb21wb3VuZENsYXNzSWQsIE5ndFF1ZXVlT3BDbGFzc0lkLCBOZ3RSZW5kZXJlckNsYXNzSWQsIGF0dGFjaFRocmVlQ2hpbGQsIHJlbW92ZVRocmVlQ2hpbGQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IE5HVF9DT01QT1VORF9QUkVGSVhFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmdbXT4oJ05ndENvbXBvdW5kUHJlZml4ZXMnKTtcblxudHlwZSBOZ3RSZW5kZXJlclJvb3RTdGF0ZSA9IHtcblx0c3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPjtcblx0Y29tcG91bmRQcmVmaXhlczogc3RyaW5nW107XG5cdGRvY3VtZW50OiBEb2N1bWVudDtcblx0cG9ydGFsczogQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPjtcbn07XG5cbnR5cGUgTmd0UXVldWVPcCA9IFt0eXBlOiAnb3AnIHwgJ2NsZWFuVXAnLCBvcDogKCkgPT4gdm9pZCwgZG9uZT86IHRydWVdO1xuXG5leHBvcnQgdHlwZSBOZ3RSZW5kZXJlclN0YXRlID0gW1xuXHR0eXBlOiAndGhyZWUnIHwgJ2NvbXBvdW5kJyB8ICdwb3J0YWwnIHwgJ2NvbW1lbnQnIHwgJ2RvbScsXG5cdHBhcmVudDogTmd0UmVuZGVyZXJOb2RlIHwgbnVsbCxcblx0aW5qZWN0ZWRQYXJlbnQ6IE5ndFJlZjxOZ3RSZW5kZXJlck5vZGU+IHwgbnVsbCxcblx0Y2hpbGRyZW46IE5ndFJlbmRlcmVyTm9kZVtdLFxuXHRkZXN0cm95ZWQ6IGJvb2xlYW4sXG5cdGNvbXBvdW5kOiBbYXBwbHlGaXJzdDogYm9vbGVhbiwgcHJvcHM6IE5ndEFueVJlY29yZF0sXG5cdGNvbXBvdW5kUGFyZW50OiBOZ3RSZW5kZXJlck5vZGUsXG5cdGNvbXBvdW5kZWQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0cXVldWVPcHM6IFNldDxOZ3RRdWV1ZU9wPixcblx0YXR0cmlidXRlczogTmd0QW55UmVjb3JkLFxuXHRwcm9wZXJ0aWVzOiBOZ3RBbnlSZWNvcmQsXG5cdHJhd1ZhbHVlOiBhbnksXG5cdHJlZjogYW55LFxuXHRwb3J0YWxDb250YWluZXI6IE5ndFJlbmRlcmVyTm9kZSxcblx0aW5qZWN0b3JGYWN0b3J5OiAoKSA9PiBJbmplY3Rvcixcbl07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyTm9kZSA9IHtcblx0X19uZ3RfcmVuZGVyZXJfXzogTmd0UmVuZGVyZXJTdGF0ZTtcbn07XG5leHBvcnQgY2xhc3MgTmd0UmVuZGVyZXJTdG9yZSB7XG5cdHByaXZhdGUgY29tbWVudHMgPSBbXSBhcyBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcm9vdDogTmd0UmVuZGVyZXJSb290U3RhdGUpIHt9XG5cblx0Y3JlYXRlTm9kZSh0eXBlOiBOZ3RSZW5kZXJlclN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSwgbm9kZTogTmd0QW55UmVjb3JkKSB7XG5cdFx0Y29uc3Qgc3RhdGUgPSBbXG5cdFx0XHR0eXBlLFxuXHRcdFx0bnVsbCxcblx0XHRcdG51bGwsXG5cdFx0XHRbXSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRdIGFzIE5ndFJlbmRlcmVyU3RhdGU7XG5cblx0XHRjb25zdCByZW5kZXJlck5vZGUgPSBPYmplY3QuYXNzaWduKG5vZGUsIHsgX19uZ3RfcmVuZGVyZXJfXzogc3RhdGUgfSk7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gb3duZXJEb2N1bWVudCB0byBub2RlIHNvIHdlIGNhbiB1c2UgSG9zdExpc3RlbmVyIGluIENvbXBvbmVudFxuXHRcdGlmICghcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10pIHJlbmRlcmVyTm9kZVsnb3duZXJEb2N1bWVudCddID0gdGhpcy5yb290LmRvY3VtZW50O1xuXG5cdFx0Ly8gTk9URTogYXNzaWduIGluamVjdG9yRmFjdG9yeSBvbiBub24tdGhyZWUgdHlwZSBzaW5jZVxuXHRcdC8vIHJlbmRlcmVyTm9kZSBpcyBhbiBpbnN0YW5jZSBvZiBET00gTm9kZVxuXHRcdGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gKCkgPT4gZ2V0RGVidWdOb2RlKHJlbmRlcmVyTm9kZSkhLmluamVjdG9yO1xuXHRcdH1cblxuXHRcdGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0Ly8gTk9URTogd2UgYXR0YWNoIGFuIGFycm93IGZ1bmN0aW9uIHRvIHRoZSBDb21tZW50IG5vZGVcblx0XHRcdC8vIEluIG91ciBkaXJlY3RpdmVzLCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHRoZW4gc3RhcnQgdHJhY2tpbmcgdGhlIFJlbmRlcmVyTm9kZVxuXHRcdFx0Ly8gdGhpcyBpcyBkb25lIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgTm9kZXMgd2UgbmVlZCB0byBwcm9jZXNzIGZvciBnZXRDcmVhdGlvblN0YXRlXG5cdFx0XHRyZW5kZXJlck5vZGVbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF0gPSAobm9kZT86IE5ndFJlbmRlcmVyTm9kZSkgPT4ge1xuXHRcdFx0XHRpZiAobm9kZSAmJiBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0XHRcdHRoaXMucG9ydGFscy5wdXNoKG5vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY29tbWVudHMucHVzaChyZW5kZXJlck5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0XHR9XG5cblx0XHRpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdID0gbmV3IFNldCgpO1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdID0ge307XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10gPSB7fTtcblx0XHRcdHJldHVybiByZW5kZXJlck5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0fVxuXG5cdHNldFBhcmVudChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHBhcmVudDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0aWYgKCFub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSA9IHBhcmVudDtcblx0XHR9XG5cdH1cblxuXHRhZGRDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmluY2x1ZGVzKGNoaWxkKSkge1xuXHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHR9XG5cblx0cmVtb3ZlQ2hpbGQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBjaGlsZDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBub2RlLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmZpbmRJbmRleCgoYykgPT4gY2hpbGQgPT09IGMpO1xuXHRcdGlmIChpbmRleCA+PSAwKSB7XG5cdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH1cblx0fVxuXG5cdHNldENvbXBvdW5kKGNvbXBvdW5kOiBOZ3RSZW5kZXJlck5vZGUsIGluc3RhbmNlOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbnN0YW5jZVJTID0gaW5zdGFuY2UuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdGlmIChpbnN0YW5jZVJTICYmIGluc3RhbmNlUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRcdGNvbnN0IHBhcmVudFJTID0gaW5zdGFuY2VSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdFx0Ly8gTk9URTogaWYgaW5zdGFuY2UgaXMgYWxyZWFkeSBjb21wb3VuZGVkIGJ5IGl0cyBwYXJlbnQuIHNraXBcblx0XHRcdGlmIChcblx0XHRcdFx0cGFyZW50UlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmXG5cdFx0XHRcdHBhcmVudFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9PT0gaW5zdGFuY2Vcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgclMgPSBjb21wb3VuZC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9IGluc3RhbmNlO1xuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10pO1xuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10pO1xuXG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgYXR0cmlidXRlcykge1xuXHRcdFx0dGhpcy5hcHBseUF0dHJpYnV0ZShpbnN0YW5jZSwga2V5LCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11ba2V5XSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgcHJvcGVydGllcykge1xuXHRcdFx0dGhpcy5hcHBseVByb3BlcnR5KGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXVtrZXldKTtcblx0XHR9XG5cblx0XHR0aGlzLmV4ZWN1dGVPcGVyYXRpb24oY29tcG91bmQpO1xuXHR9XG5cblx0cXVldWVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCBvcDogTmd0UXVldWVPcCkge1xuXHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmFkZChvcCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCB0eXBlOiBOZ3RRdWV1ZU9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID0gJ29wJykge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdPy5zaXplKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmZvckVhY2goKG9wKSA9PiB7XG5cdFx0XHRcdGlmIChvcFtOZ3RRdWV1ZU9wQ2xhc3NJZC50eXBlXSA9PT0gdHlwZSkge1xuXHRcdFx0XHRcdG9wW05ndFF1ZXVlT3BDbGFzc0lkLm9wXSgpO1xuXHRcdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZGVsZXRlKG9wKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cHJvY2Vzc1BvcnRhbENvbnRhaW5lcihwb3J0YWw6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IGluamVjdG9yRmFjdG9yeSA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldO1xuXHRcdGNvbnN0IGluamVjdG9yID0gaW5qZWN0b3JGYWN0b3J5Py4oKTtcblx0XHRpZiAoIWluamVjdG9yKSByZXR1cm47XG5cblx0XHRjb25zdCBwb3J0YWxTdG9yZSA9IGluamVjdG9yLmdldChOR1RfU1RPUkUsIG51bGwpO1xuXHRcdGlmICghcG9ydGFsU3RvcmUpIHJldHVybjtcblxuXHRcdGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IHBvcnRhbFN0b3JlLmdldCgnc2NlbmUnKTtcblx0XHRpZiAoIXBvcnRhbENvbnRhaW5lcikgcmV0dXJuO1xuXG5cdFx0cG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0gPSB0aGlzLmNyZWF0ZU5vZGUoJ3RocmVlJywgcG9ydGFsQ29udGFpbmVyKTtcblx0fVxuXG5cdGFwcGx5QXR0cmlidXRlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRU5ERVJfUFJJT1JJVFkpIHtcblx0XHRcdC8vIE5PVEU6IHByaW9yaXR5IG5lZWRzIHRvIGJlIHNldCBhcyBhbiBhdHRyaWJ1dGUgc3RyaW5nIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IGFzIGVhcmx5IGFzIHBvc3NpYmxlXG5cdFx0XHQvLyB3ZSBjb252ZXJ0IHRoYXQgc3RyaW5nIHRvIGEgbnVtYmVyLiBpZiBpdCdzIGludmFsaWQsIGRlZmF1bHQgMFxuXHRcdFx0bGV0IHByaW9yaXR5ID0gTnVtYmVyKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihwcmlvcml0eSkpIHtcblx0XHRcdFx0cHJpb3JpdHkgPSAwO1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYFtOR1RdIFwicHJpb3JpdHlcIiBpcyBhbiBpbnZhbGlkIG51bWJlciwgZGVmYXVsdCB0byAwYCk7XG5cdFx0XHR9XG5cdFx0XHRnZXRMb2NhbFN0YXRlKG5vZGUpLnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5DT01QT1VORCkge1xuXHRcdFx0Ly8gTk9URTogd2Ugc2V0IHRoZSBjb21wb3VuZCBwcm9wZXJ0eSBvbiBpbnN0YW5jZSBub2RlIG5vdyBzbyB3ZSBrbm93IHRoYXQgdGhpcyBpbnN0YW5jZSBpcyBiZWluZyBjb21wb3VuZGVkXG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdID0gW3ZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ2ZpcnN0Jywge31dO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuQVRUQUNIKSB7XG5cdFx0XHQvLyBOT1RFOiBoYW5kbGUgYXR0YWNoIGFzIHRyaW5nXG5cdFx0XHRjb25zdCBwYXRocyA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cdFx0XHRpZiAocGF0aHMubGVuZ3RoKSBnZXRMb2NhbFN0YXRlKG5vZGUpLmF0dGFjaCA9IHBhdGhzO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuVkFMVUUpIHtcblx0XHRcdC8vIE5PVEU6IGNvZXJjaW9uXG5cdFx0XHRsZXQgbWF5YmVDb2VyY2VkOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuID0gdmFsdWU7XG5cdFx0XHRpZiAobWF5YmVDb2VyY2VkID09PSAnJyB8fCBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICdmYWxzZScpIHtcblx0XHRcdFx0bWF5YmVDb2VyY2VkID0gbWF5YmVDb2VyY2VkID09PSAndHJ1ZScgfHwgbWF5YmVDb2VyY2VkID09PSAnJztcblx0XHRcdH0gZWxzZSBpZiAoIWlzTmFOKE51bWJlcihtYXliZUNvZXJjZWQpKSkge1xuXHRcdFx0XHRtYXliZUNvZXJjZWQgPSBOdW1iZXIobWF5YmVDb2VyY2VkKTtcblx0XHRcdH1cblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPSBtYXliZUNvZXJjZWQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG5cdFx0dGhpcy51cGRhdGVOYXRpdmVQcm9wcyhub2RlLCBuYW1lLCB2YWx1ZSk7XG5cdH1cblxuXHRhcHBseVByb3BlcnR5KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cblx0XHQvLyBbcmVmXVxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuUkVGICYmIGlzLnJlZih2YWx1ZSkpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdmFsdWU7XG5cdFx0XHR2YWx1ZS5uYXRpdmVFbGVtZW50ID0gbm9kZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSBnZXRMb2NhbFN0YXRlKG5vZGUpLnBhcmVudCgpIHx8IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXG5cdFx0Ly8gW3Jhd1ZhbHVlXVxuXHRcdGlmIChnZXRMb2NhbFN0YXRlKG5vZGUpLmlzUmF3ICYmIG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IHZhbHVlO1xuXHRcdFx0aWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFthdHRhY2hdXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IHYudG9TdHJpbmcoKSkgOiB2YWx1ZTtcblx0XHRcdGlmIChwYXJlbnQpIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjb21wb3VuZCA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF07XG5cdFx0aWYgKFxuXHRcdFx0Y29tcG91bmQ/LltOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdICYmXG5cdFx0XHRuYW1lIGluIGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcblx0XHRcdCFjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQuYXBwbHlGaXJzdF1cblx0XHQpIHtcblx0XHRcdHZhbHVlID0gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXVtuYW1lXTtcblx0XHR9XG5cblx0XHRhcHBseVByb3BzKG5vZGUsIHsgW25hbWVdOiB2YWx1ZSB9KTtcblx0XHR0aGlzLnVwZGF0ZU5hdGl2ZVByb3BzKG5vZGUsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGlzQ29tcG91bmQobmFtZTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMucm9vdC5jb21wb3VuZFByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpO1xuXHR9XG5cblx0aXNET00obm9kZTogTmd0QW55UmVjb3JkKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlWydfX25ndF9yZW5kZXJlcl9fJ107XG5cdFx0cmV0dXJuIChcblx0XHRcdCFyUyB8fFxuXHRcdFx0KHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJyAmJlxuXHRcdFx0XHQobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBXaW5kb3cpKVxuXHRcdCk7XG5cdH1cblxuXHRnZXQgcm9vdFNjZW5lKCkge1xuXHRcdHJldHVybiB0aGlzLnJvb3Quc3RvcmUuZ2V0KCdzY2VuZScpO1xuXHR9XG5cblx0Z2V0IHBvcnRhbHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMucm9vdC5wb3J0YWxzO1xuXHR9XG5cblx0Z2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShub2RlOiBOZ3RSZW5kZXJlck5vZGUpOiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsIHtcblx0XHRsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAndGhyZWUnKSB7XG5cdFx0XHRwYXJlbnQgPSBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXVxuXHRcdFx0XHQ/IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG5cdFx0XHRcdDogcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcmVudDtcblx0fVxuXG5cdGdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQobm9kZTogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0aWYgKG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdKSB7XG5cdFx0XHRyZXR1cm4gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF07XG5cdFx0fVxuXG5cdFx0bGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHRpZiAoXG5cdFx0XHRwYXJlbnQgJiZcblx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJlxuXHRcdFx0IXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHBhcmVudDtcblx0XHR9XG5cblx0XHR3aGlsZSAoXG5cdFx0XHRwYXJlbnQgJiZcblx0XHRcdChwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgfHxcblx0XHRcdFx0IXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gfHxcblx0XHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAnY29tcG91bmQnKVxuXHRcdCkge1xuXHRcdFx0cGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0fVxuXG5cdFx0aWYgKCFwYXJlbnQpIHJldHVybjtcblxuXHRcdGlmIChcblx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF07XG5cdFx0fVxuXG5cdFx0aWYgKCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pIHtcblx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRDcmVhdGlvblN0YXRlKCkge1xuXHRcdGNvbnN0IGluamVjdGVkQXJncyA9IHRoaXMuZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZShOZ3RBcmdzKT8uYXJncyB8fCBbXTtcblx0XHRjb25zdCBpbmplY3RlZFBhcmVudCA9IHRoaXMuZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZShOZ3RQYXJlbnQpPy5wYXJlbnQgfHwgbnVsbDtcblx0XHRjb25zdCBzdG9yZSA9IHRoaXMudHJ5R2V0UG9ydGFsU3RvcmUoKTtcblx0XHRyZXR1cm4geyBpbmplY3RlZEFyZ3MsIGluamVjdGVkUGFyZW50LCBzdG9yZSB9O1xuXHR9XG5cblx0ZGVzdHJveShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHBhcmVudD86IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmICghclMgfHwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdID0gdW5kZWZpbmVkITtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gPSB1bmRlZmluZWQhO1xuXG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcblx0XHRcdGlmIChsb2NhbFN0YXRlLm9iamVjdHMpIHtcblx0XHRcdFx0dW50cmFja2VkKGxvY2FsU3RhdGUub2JqZWN0cykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3kob2JqLCBwYXJlbnQpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxvY2FsU3RhdGUubm9uT2JqZWN0cykge1xuXHRcdFx0XHR1bnRyYWNrZWQobG9jYWxTdGF0ZS5ub25PYmplY3RzKS5mb3JFYWNoKChvYmopID0+IHRoaXMuZGVzdHJveShvYmosIHBhcmVudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobG9jYWxTdGF0ZS5hZnRlclVwZGF0ZSkgbG9jYWxTdGF0ZS5hZnRlclVwZGF0ZS5jb21wbGV0ZSgpO1xuXHRcdFx0aWYgKGxvY2FsU3RhdGUuYWZ0ZXJBdHRhY2gpIGxvY2FsU3RhdGUuYWZ0ZXJBdHRhY2guY29tcGxldGUoKTtcblxuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ29iamVjdHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydub25PYmplY3RzJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnbmF0aXZlUHJvcHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydhZGQnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydyZW1vdmUnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydhZnRlclVwZGF0ZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyQXR0YWNoJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnc3RvcmUnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydoYW5kbGVycyddO1xuXG5cdFx0XHRpZiAoIWxvY2FsU3RhdGUucHJpbWl0aXZlKSB7XG5cdFx0XHRcdGRlbGV0ZSAobm9kZSBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuXHRcdFx0ZGVsZXRlIChub2RlIGFzIE5ndEFueVJlY29yZClbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF07XG5cdFx0XHRjb25zdCBpbmRleCA9IHRoaXMuY29tbWVudHMuZmluZEluZGV4KChjb21tZW50KSA9PiBjb21tZW50ID09PSBub2RlKTtcblx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdHRoaXMuY29tbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5wb3J0YWxzLmZpbmRJbmRleCgocG9ydGFsKSA9PiBwb3J0YWwgPT09IG5vZGUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0dGhpcy5wb3J0YWxzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gdW5kZWZpbmVkITtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSA9IG51bGwhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdID0gbnVsbCE7XG5cdFx0XHR0aGlzLmV4ZWN1dGVPcGVyYXRpb24obm9kZSwgJ2NsZWFuVXAnKTtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uY2xlYXIoKTtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10gPSBudWxsITtcblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0pIHtcblx0XHRcdC8vIG51bGxpZnkgcmVmXG5cdFx0XHQvLyBidXQgd2UgZG8gaXQgbGF0ZXIgc28gdGhhdCBpdCBkb2Vzbid0IGhpbmRlciByZW5kZXJcblx0XHRcdC8vIFRPRE86IHdpbGwgdGhpcyBjYXVzZSBtZW1vcnkgbGVhaz9cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdLm5hdGl2ZUVsZW1lbnQgPSBudWxsO1xuXHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSA9IHVuZGVmaW5lZCE7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBudWxsaWZ5IHBhcmVudFxuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gbnVsbDtcblx0XHRmb3IgKGNvbnN0IHJlbmRlckNoaWxkIG9mIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gfHwgW10pIHtcblx0XHRcdGlmIChyZW5kZXJDaGlsZC5fX25ndF9yZW5kZXJlcl9fPy5bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIHBhcmVudCkge1xuXHRcdFx0XHRjb25zdCBjbG9zZXN0SW5zdGFuY2UgPSB0aGlzLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdFx0aWYgKGNsb3Nlc3RJbnN0YW5jZSkge1xuXHRcdFx0XHRcdHJlbW92ZVRocmVlQ2hpbGQoY2xvc2VzdEluc3RhbmNlLCByZW5kZXJDaGlsZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZGVzdHJveShyZW5kZXJDaGlsZCwgcGFyZW50KTtcblx0XHR9XG5cblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dID0gW107XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuXHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZU5hdGl2ZVByb3BzKG5vZGU6IE5ndEluc3RhbmNlTm9kZSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcblx0XHRpZiAoIWxvY2FsU3RhdGUgfHwgIWxvY2FsU3RhdGUubmF0aXZlUHJvcHMpIHJldHVybjtcblx0XHRsb2NhbFN0YXRlLm5hdGl2ZVByb3BzLnNldCh7IFtrZXldOiB2YWx1ZSB9KTtcblx0fVxuXG5cdHByaXZhdGUgZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZTxUIGV4dGVuZHMgTmd0Q29tbW9uRGlyZWN0aXZlPihkaXI6IFR5cGU8VD4pIHtcblx0XHRsZXQgZGlyZWN0aXZlOiBUIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cblx0XHRsZXQgaSA9IHRoaXMuY29tbWVudHMubGVuZ3RoIC0gMTtcblx0XHR3aGlsZSAoaSA+PSAwKSB7XG5cdFx0XHRjb25zdCBjb21tZW50ID0gdGhpcy5jb21tZW50c1tpXTtcblx0XHRcdGlmIChjb21tZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcblx0XHRcdFx0ZGVzdHJveWVkLnB1c2goaSk7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbmplY3RvciA9IGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuXHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoZGlyLCBudWxsKTtcblx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS52YWxpZGF0ZSgpKSB7XG5cdFx0XHRcdGRpcmVjdGl2ZSA9IGluc3RhbmNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aS0tO1xuXHRcdH1cblxuXHRcdGRlc3Ryb3llZC5mb3JFYWNoKChpbmRleCkgPT4ge1xuXHRcdFx0dGhpcy5jb21tZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGRpcmVjdGl2ZTtcblx0fVxuXG5cdHByaXZhdGUgdHJ5R2V0UG9ydGFsU3RvcmUoKSB7XG5cdFx0bGV0IHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cdFx0Ly8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBwb3J0YWwgc3RhdGVzIGJlY2F1c2UgTmd0U3RvcmUgb25seSBkaWZmZXJzIHBlciBQb3J0YWxcblx0XHRsZXQgaSA9IHRoaXMucG9ydGFscy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdC8vIGxvb3AgdGhyb3VnaCB0aGUgcG9ydGFsIHN0YXRlIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBjbG9zZXN0IE5ndFN0b3JlXG5cdFx0XHRjb25zdCBwb3J0YWwgPSB0aGlzLnBvcnRhbHNbaV07XG5cdFx0XHRpZiAocG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcblx0XHRcdFx0ZGVzdHJveWVkLnB1c2goaSk7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGluamVjdG9yID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0oKTtcblx0XHRcdGlmICghaW5qZWN0b3IpIHtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KE5HVF9TVE9SRSwgbnVsbCk7XG5cdFx0XHQvLyBvbmx5IHRoZSBpbnN0YW5jZSB3aXRoIHByZXZpb3VzUm9vdCBzaG91bGQgcGFzc1xuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmdldCgncHJldmlvdXNSb290JykpIHtcblx0XHRcdFx0c3RvcmUgPSBpbnN0YW5jZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpLS07XG5cdFx0fVxuXG5cdFx0ZGVzdHJveWVkLmZvckVhY2goKGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLnBvcnRhbHMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBzdG9yZSB8fCB0aGlzLnJvb3QhLnN0b3JlO1xuXHR9XG59XG4iXX0=
|
|
408
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQXdCLE1BQU0sYUFBYSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxTQUFTLEVBQWlCLE1BQU0sVUFBVSxDQUFDO0FBRXBELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQVcscUJBQXFCLENBQUMsQ0FBQztBQWdDekYsTUFBTSxPQUFPLGdCQUFnQjtJQUc1QixZQUFvQixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUZ0QyxhQUFRLEdBQUcsRUFBNEIsQ0FBQztJQUVDLENBQUM7SUFFbEQsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDN0UsTUFBTSxLQUFLLEdBQUc7WUFDYixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNB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O1lBQ0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0Msa0RBQWtEO1lBQ2xELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQzdDLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ2pCLE1BQU07YUFDTjtZQUNELENBQUMsRUFBRSxDQUFDO1NBQ0o7UUFFRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yLCBUeXBlLCBnZXREZWJ1Z05vZGUsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncyB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYXJncyc7XG5pbXBvcnQgdHlwZSB7IE5ndENvbW1vbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY29tbW9uJztcbmltcG9ydCB7IE5ndFBhcmVudCB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcGFyZW50JztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUsIHR5cGUgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi4vaW5zdGFuY2UnO1xuaW1wb3J0IHR5cGUgeyBOZ3RSZWYgfSBmcm9tICcuLi9yZWYnO1xuaW1wb3J0IHsgTkdUX1NUT1JFLCB0eXBlIE5ndFN0YXRlIH0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgdHlwZSB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi4vdXRpbHMvc2lnbmFsLXN0b3JlJztcbmltcG9ydCB7IFNQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlQsIFNQRUNJQUxfUFJPUEVSVElFUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5ndENvbXBvdW5kQ2xhc3NJZCwgTmd0UXVldWVPcENsYXNzSWQsIE5ndFJlbmRlcmVyQ2xhc3NJZCwgYXR0YWNoVGhyZWVDaGlsZCwgcmVtb3ZlVGhyZWVDaGlsZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgTkdUX0NPTVBPVU5EX1BSRUZJWEVTID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZ1tdPignTmd0Q29tcG91bmRQcmVmaXhlcycpO1xuXG50eXBlIE5ndFJlbmRlcmVyUm9vdFN0YXRlID0ge1xuXHRzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+O1xuXHRjb21wb3VuZFByZWZpeGVzOiBzdHJpbmdbXTtcblx0ZG9jdW1lbnQ6IERvY3VtZW50O1xuXHRwb3J0YWxzOiBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xufTtcblxudHlwZSBOZ3RRdWV1ZU9wID0gW3R5cGU6ICdvcCcgfCAnY2xlYW5VcCcsIG9wOiAoKSA9PiB2b2lkLCBkb25lPzogdHJ1ZV07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyU3RhdGUgPSBbXG5cdHR5cGU6ICd0aHJlZScgfCAnY29tcG91bmQnIHwgJ3BvcnRhbCcgfCAnY29tbWVudCcgfCAnZG9tJyxcblx0cGFyZW50OiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsLFxuXHRpbmplY3RlZFBhcmVudDogTmd0UmVmPE5ndFJlbmRlcmVyTm9kZT4gfCBudWxsLFxuXHRjaGlsZHJlbjogTmd0UmVuZGVyZXJOb2RlW10sXG5cdGRlc3Ryb3llZDogYm9vbGVhbixcblx0Y29tcG91bmQ6IFthcHBseUZpcnN0OiBib29sZWFuLCBwcm9wczogTmd0QW55UmVjb3JkXSxcblx0Y29tcG91bmRQYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0Y29tcG91bmRlZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRxdWV1ZU9wczogU2V0PE5ndFF1ZXVlT3A+LFxuXHRhdHRyaWJ1dGVzOiBOZ3RBbnlSZWNvcmQsXG5cdHByb3BlcnRpZXM6IE5ndEFueVJlY29yZCxcblx0cmF3VmFsdWU6IGFueSxcblx0cmVmOiBhbnksXG5cdHBvcnRhbENvbnRhaW5lcjogTmd0UmVuZGVyZXJOb2RlLFxuXHRpbmplY3RvckZhY3Rvcnk6ICgpID0+IEluamVjdG9yLFxuXTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJOb2RlID0ge1xuXHRfX25ndF9yZW5kZXJlcl9fOiBOZ3RSZW5kZXJlclN0YXRlO1xufTtcbmV4cG9ydCBjbGFzcyBOZ3RSZW5kZXJlclN0b3JlIHtcblx0cHJpdmF0ZSBjb21tZW50cyA9IFtdIGFzIEFycmF5PE5ndFJlbmRlcmVyTm9kZT47XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSByb290OiBOZ3RSZW5kZXJlclJvb3RTdGF0ZSkge31cblxuXHRjcmVhdGVOb2RlKHR5cGU6IE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdLCBub2RlOiBOZ3RBbnlSZWNvcmQpIHtcblx0XHRjb25zdCBzdGF0ZSA9IFtcblx0XHRcdHR5cGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0bnVsbCxcblx0XHRcdFtdLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdF0gYXMgTmd0UmVuZGVyZXJTdGF0ZTtcblxuXHRcdGNvbnN0IHJlbmRlcmVyTm9kZSA9IE9iamVjdC5hc3NpZ24obm9kZSwgeyBfX25ndF9yZW5kZXJlcl9fOiBzdGF0ZSB9KTtcblxuXHRcdC8vIE5PVEU6IGFzc2lnbiBvd25lckRvY3VtZW50IHRvIG5vZGUgc28gd2UgY2FuIHVzZSBIb3N0TGlzdGVuZXIgaW4gQ29tcG9uZW50XG5cdFx0aWYgKCFyZW5kZXJlck5vZGVbJ293bmVyRG9jdW1lbnQnXSkgcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10gPSB0aGlzLnJvb3QuZG9jdW1lbnQ7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gaW5qZWN0b3JGYWN0b3J5IG9uIG5vbi10aHJlZSB0eXBlIHNpbmNlXG5cdFx0Ly8gcmVuZGVyZXJOb2RlIGlzIGFuIGluc3RhbmNlIG9mIERPTSBOb2RlXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSAoKSA9PiBnZXREZWJ1Z05vZGUocmVuZGVyZXJOb2RlKSEuaW5qZWN0b3I7XG5cdFx0fVxuXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHQvLyBOT1RFOiB3ZSBhdHRhY2ggYW4gYXJyb3cgZnVuY3Rpb24gdG8gdGhlIENvbW1lbnQgbm9kZVxuXHRcdFx0Ly8gSW4gb3VyIGRpcmVjdGl2ZXMsIHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdGhlbiBzdGFydCB0cmFja2luZyB0aGUgUmVuZGVyZXJOb2RlXG5cdFx0XHQvLyB0aGlzIGlzIGRvbmUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBOb2RlcyB3ZSBuZWVkIHRvIHByb2Nlc3MgZm9yIGdldENyZWF0aW9uU3RhdGVcblx0XHRcdHJlbmRlcmVyTm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXSA9IChub2RlPzogTmd0UmVuZGVyZXJOb2RlKSA9PiB7XG5cdFx0XHRcdGlmIChub2RlICYmIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG5cdFx0XHRcdFx0dGhpcy5wb3J0YWxzLnB1c2gobm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jb21tZW50cy5wdXNoKHJlbmRlcmVyTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gcmVuZGVyZXJOb2RlO1xuXHRcdH1cblxuXHRcdGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10gPSBuZXcgU2V0KCk7XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10gPSB7fTtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IHt9O1xuXHRcdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVuZGVyZXJOb2RlO1xuXHR9XG5cblx0c2V0UGFyZW50KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50OiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuXHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gcGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdGFkZENoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGlmICghbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uaW5jbHVkZXMoY2hpbGQpKSB7XG5cdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH1cblxuXHRyZW1vdmVDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbmRleCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uZmluZEluZGV4KChjKSA9PiBjaGlsZCA9PT0gYyk7XG5cdFx0aWYgKGluZGV4ID49IDApIHtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fVxuXHR9XG5cblx0c2V0Q29tcG91bmQoY29tcG91bmQ6IE5ndFJlbmRlcmVyTm9kZSwgaW5zdGFuY2U6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IGluc3RhbmNlUlMgPSBpbnN0YW5jZS5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0aWYgKGluc3RhbmNlUlMgJiYgaW5zdGFuY2VSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuXHRcdFx0Y29uc3QgcGFyZW50UlMgPSBpbnN0YW5jZVJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0XHQvLyBOT1RFOiBpZiBpbnN0YW5jZSBpcyBhbHJlYWR5IGNvbXBvdW5kZWQgYnkgaXRzIHBhcmVudC4gc2tpcFxuXHRcdFx0aWYgKFxuXHRcdFx0XHRwYXJlbnRSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiZcblx0XHRcdFx0cGFyZW50UlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID09PSBpbnN0YW5jZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByUyA9IGNvbXBvdW5kLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gaW5zdGFuY2U7XG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSk7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSk7XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHR0aGlzLmFwcGx5QXR0cmlidXRlKGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXVtrZXldKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0aWVzKSB7XG5cdFx0XHR0aGlzLmFwcGx5UHJvcGVydHkoaW5zdGFuY2UsIGtleSwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdW2tleV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjb21wb3VuZCk7XG5cdH1cblxuXHRxdWV1ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG9wOiBOZ3RRdWV1ZU9wKSB7XG5cdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uYWRkKG9wKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHR5cGU6IE5ndFF1ZXVlT3BbTmd0UXVldWVPcENsYXNzSWQudHlwZV0gPSAnb3AnKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10/LnNpemUpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZm9yRWFjaCgob3ApID0+IHtcblx0XHRcdFx0aWYgKG9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID09PSB0eXBlKSB7XG5cdFx0XHRcdFx0b3BbTmd0UXVldWVPcENsYXNzSWQub3BdKCk7XG5cdFx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5kZWxldGUob3ApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBvcnRhbDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgaW5qZWN0b3JGYWN0b3J5ID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV07XG5cdFx0Y29uc3QgaW5qZWN0b3IgPSBpbmplY3RvckZhY3Rvcnk/LigpO1xuXHRcdGlmICghaW5qZWN0b3IpIHJldHVybjtcblxuXHRcdGNvbnN0IHBvcnRhbFN0b3JlID0gaW5qZWN0b3IuZ2V0KE5HVF9TVE9SRSwgbnVsbCk7XG5cdFx0aWYgKCFwb3J0YWxTdG9yZSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcG9ydGFsQ29udGFpbmVyID0gcG9ydGFsU3RvcmUuZ2V0KCdzY2VuZScpO1xuXHRcdGlmICghcG9ydGFsQ29udGFpbmVyKSByZXR1cm47XG5cblx0XHRwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSA9IHRoaXMuY3JlYXRlTm9kZSgndGhyZWUnLCBwb3J0YWxDb250YWluZXIpO1xuXHR9XG5cblx0YXBwbHlBdHRyaWJ1dGUobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFTkRFUl9QUklPUklUWSkge1xuXHRcdFx0Ly8gTk9URTogcHJpb3JpdHkgbmVlZHMgdG8gYmUgc2V0IGFzIGFuIGF0dHJpYnV0ZSBzdHJpbmcgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgYXMgZWFybHkgYXMgcG9zc2libGVcblx0XHRcdC8vIHdlIGNvbnZlcnQgdGhhdCBzdHJpbmcgdG8gYSBudW1iZXIuIGlmIGl0J3MgaW52YWxpZCwgZGVmYXVsdCAwXG5cdFx0XHRsZXQgcHJpb3JpdHkgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0aWYgKGlzTmFOKHByaW9yaXR5KSkge1xuXHRcdFx0XHRwcmlvcml0eSA9IDA7XG5cdFx0XHRcdGNvbnNvbGUud2FybihgW05HVF0gXCJwcmlvcml0eVwiIGlzIGFuIGludmFsaWQgbnVtYmVyLCBkZWZhdWx0IHRvIDBgKTtcblx0XHRcdH1cblx0XHRcdGdldExvY2FsU3RhdGUobm9kZSkucHJpb3JpdHkgPSBwcmlvcml0eTtcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkNPTVBPVU5EKSB7XG5cdFx0XHQvLyBOT1RFOiB3ZSBzZXQgdGhlIGNvbXBvdW5kIHByb3BlcnR5IG9uIGluc3RhbmNlIG5vZGUgbm93IHNvIHdlIGtub3cgdGhhdCB0aGlzIGluc3RhbmNlIGlzIGJlaW5nIGNvbXBvdW5kZWRcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSBbdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnZmlyc3QnLCB7fV07XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdC8vIE5PVEU6IGhhbmRsZSBhdHRhY2ggYXMgdHJpbmdcblx0XHRcdGNvbnN0IHBhdGhzID0gdmFsdWUuc3BsaXQoJy4nKTtcblx0XHRcdGlmIChwYXRocy5sZW5ndGgpIGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gcGF0aHM7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuXHRcdFx0Ly8gTk9URTogY29lcmNpb25cblx0XHRcdGxldCBtYXliZUNvZXJjZWQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gPSB2YWx1ZTtcblx0XHRcdGlmIChtYXliZUNvZXJjZWQgPT09ICcnIHx8IG1heWJlQ29lcmNlZCA9PT0gJ3RydWUnIHx8IG1heWJlQ29lcmNlZCA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0XHRtYXliZUNvZXJjZWQgPSBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICcnO1xuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oTnVtYmVyKG1heWJlQ29lcmNlZCkpKSB7XG5cdFx0XHRcdG1heWJlQ29lcmNlZCA9IE51bWJlcihtYXliZUNvZXJjZWQpO1xuXHRcdFx0fVxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IG1heWJlQ29lcmNlZDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRhcHBseVByb3BzKG5vZGUsIHsgW25hbWVdOiB2YWx1ZSB9KTtcblx0XHR0aGlzLnVwZGF0ZU5hdGl2ZVByb3BzKG5vZGUsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGFwcGx5UHJvcGVydHkobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblxuXHRcdC8vIFtyZWZdXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRUYgJiYgaXMucmVmKHZhbHVlKSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB2YWx1ZTtcblx0XHRcdHZhbHVlLm5hdGl2ZUVsZW1lbnQgPSBub2RlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcmVudCA9IGdldExvY2FsU3RhdGUobm9kZSkucGFyZW50KCkgfHwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cblx0XHQvLyBbcmF3VmFsdWVdXG5cdFx0aWYgKGdldExvY2FsU3RhdGUobm9kZSkuaXNSYXcgJiYgbmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlZBTFVFKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gdmFsdWU7XG5cdFx0XHRpZiAocGFyZW50KSBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbm9kZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gW2F0dGFjaF1cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkFUVEFDSCkge1xuXHRcdFx0Z2V0TG9jYWxTdGF0ZShub2RlKS5hdHRhY2ggPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcCgodikgPT4gdi50b1N0cmluZygpKSA6IHZhbHVlO1xuXHRcdFx0aWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbXBvdW5kID0gclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXTtcblx0XHRpZiAoXG5cdFx0XHRjb21wb3VuZD8uW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcblx0XHRcdG5hbWUgaW4gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXSAmJlxuXHRcdFx0IWNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5hcHBseUZpcnN0XVxuXHRcdCkge1xuXHRcdFx0dmFsdWUgPSBjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdW25hbWVdO1xuXHRcdH1cblxuXHRcdGFwcGx5UHJvcHMobm9kZSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuXHRcdHRoaXMudXBkYXRlTmF0aXZlUHJvcHMobm9kZSwgbmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0aXNDb21wb3VuZChuYW1lOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290LmNvbXBvdW5kUHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSk7XG5cdH1cblxuXHRpc0RPTShub2RlOiBOZ3RBbnlSZWNvcmQpIHtcblx0XHRjb25zdCByUyA9IG5vZGVbJ19fbmd0X3JlbmRlcmVyX18nXTtcblx0XHRyZXR1cm4gKFxuXHRcdFx0IXJTIHx8XG5cdFx0XHQoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAnY29tcG91bmQnICYmXG5cdFx0XHRcdChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFdpbmRvdykpXG5cdFx0KTtcblx0fVxuXG5cdGdldCByb290U2NlbmUoKSB7XG5cdFx0cmV0dXJuIHRoaXMucm9vdC5zdG9yZS5nZXQoJ3NjZW5lJyk7XG5cdH1cblxuXHRnZXQgcG9ydGFscygpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290LnBvcnRhbHM7XG5cdH1cblxuXHRnZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSk6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwge1xuXHRcdGxldCBwYXJlbnQgPSBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0d2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcblx0XHRcdHBhcmVudCA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG5cdFx0XHRcdD8gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cblx0XHRcdFx0OiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyZW50O1xuXHR9XG5cblx0Z2V0Q2xvc2VzdFBhcmVudFdpdGhDb21wb3VuZChub2RlOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAobm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0pIHtcblx0XHRcdHJldHVybiBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XTtcblx0XHR9XG5cblx0XHRsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdGlmIChcblx0XHRcdHBhcmVudCAmJlxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmXG5cdFx0XHQhcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50O1xuXHRcdH1cblxuXHRcdHdoaWxlIChcblx0XHRcdHBhcmVudCAmJlxuXHRcdFx0KHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyB8fFxuXHRcdFx0XHQhcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSB8fFxuXHRcdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcpXG5cdFx0KSB7XG5cdFx0XHRwYXJlbnQgPSBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHR9XG5cblx0XHRpZiAoIXBhcmVudCkgcmV0dXJuO1xuXG5cdFx0aWYgKFxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XTtcblx0XHR9XG5cblx0XHRpZiAoIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuXHRcdFx0cmV0dXJuIHBhcmVudDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldENyZWF0aW9uU3RhdGUoKSB7XG5cdFx0Y29uc3QgaW5qZWN0ZWRBcmdzID0gdGhpcy5maXJzdE5vbkluamVjdGVkRGlyZWN0aXZlKE5ndEFyZ3MpPy5hcmdzIHx8IFtdO1xuXHRcdGNvbnN0IGluamVjdGVkUGFyZW50ID0gdGhpcy5maXJzdE5vbkluamVjdGVkRGlyZWN0aXZlKE5ndFBhcmVudCk/LnBhcmVudCB8fCBudWxsO1xuXHRcdGNvbnN0IHN0b3JlID0gdGhpcy50cnlHZXRQb3J0YWxTdG9yZSgpO1xuXHRcdHJldHVybiB7IGluamVjdGVkQXJncywgaW5qZWN0ZWRQYXJlbnQsIHN0b3JlIH07XG5cdH1cblxuXHRkZXN0cm95KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50PzogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKCFyUyB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSB1bmRlZmluZWQhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSA9IHVuZGVmaW5lZCE7XG5cblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdFx0aWYgKGxvY2FsU3RhdGUub2JqZWN0cykge1xuXHRcdFx0XHR1bnRyYWNrZWQobG9jYWxTdGF0ZS5vYmplY3RzKS5mb3JFYWNoKChvYmopID0+IHRoaXMuZGVzdHJveShvYmosIHBhcmVudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobG9jYWxTdGF0ZS5ub25PYmplY3RzKSB7XG5cdFx0XHRcdHVudHJhY2tlZChsb2NhbFN0YXRlLm5vbk9iamVjdHMpLmZvckVhY2goKG9iaikgPT4gdGhpcy5kZXN0cm95KG9iaiwgcGFyZW50KSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsb2NhbFN0YXRlLmFmdGVyVXBkYXRlKSBsb2NhbFN0YXRlLmFmdGVyVXBkYXRlLmNvbXBsZXRlKCk7XG5cdFx0XHRpZiAobG9jYWxTdGF0ZS5hZnRlckF0dGFjaCkgbG9jYWxTdGF0ZS5hZnRlckF0dGFjaC5jb21wbGV0ZSgpO1xuXG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnb2JqZWN0cyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ25vbk9iamVjdHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWyduYXRpdmVQcm9wcyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FkZCddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3JlbW92ZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyVXBkYXRlJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJBdHRhY2gnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydzdG9yZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2hhbmRsZXJzJ107XG5cblx0XHRcdGlmICghbG9jYWxTdGF0ZS5wcmltaXRpdmUpIHtcblx0XHRcdFx0ZGVsZXRlIChub2RlIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X18nXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tbWVudCcpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gbnVsbCE7XG5cdFx0XHRkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXTtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jb21tZW50cy5maW5kSW5kZXgoKGNvbW1lbnQpID0+IGNvbW1lbnQgPT09IG5vZGUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0dGhpcy5jb21tZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLnBvcnRhbHMuZmluZEluZGV4KChwb3J0YWwpID0+IHBvcnRhbCA9PT0gbm9kZSk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHR0aGlzLnBvcnRhbHMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gPSB1bmRlZmluZWQhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdID0gbnVsbCE7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10gPSBudWxsITtcblx0XHRcdHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihub2RlLCAnY2xlYW5VcCcpO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5jbGVhcigpO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXSA9IG51bGwhO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSkge1xuXHRcdFx0Ly8gbnVsbGlmeSByZWZcblx0XHRcdC8vIGJ1dCB3ZSBkbyBpdCBsYXRlciBzbyB0aGF0IGl0IGRvZXNuJ3QgaGluZGVyIHJlbmRlclxuXHRcdFx0Ly8gVE9ETzogd2lsbCB0aGlzIGNhdXNlIG1lbW9yeSBsZWFrP1xuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0ubmF0aXZlRWxlbWVudCA9IG51bGw7XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdW5kZWZpbmVkITtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIG51bGxpZnkgcGFyZW50XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0gPSBudWxsO1xuXHRcdGZvciAoY29uc3QgcmVuZGVyQ2hpbGQgb2YgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXSB8fCBbXSkge1xuXHRcdFx0aWYgKHJlbmRlckNoaWxkLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgcGFyZW50KSB7XG5cdFx0XHRcdGNvbnN0IGNsb3Nlc3RJbnN0YW5jZSA9IHRoaXMuZ2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShwYXJlbnQpO1xuXHRcdFx0XHRpZiAoY2xvc2VzdEluc3RhbmNlKSB7XG5cdFx0XHRcdFx0cmVtb3ZlVGhyZWVDaGlsZChjbG9zZXN0SW5zdGFuY2UsIHJlbmRlckNoaWxkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kZXN0cm95KHJlbmRlckNoaWxkLCBwYXJlbnQpO1xuXHRcdH1cblxuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gPSBbXTtcblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSA9IHRydWU7XG5cdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0dGhpcy5yZW1vdmVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlTmF0aXZlUHJvcHMobm9kZTogTmd0SW5zdGFuY2VOb2RlLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdGlmICghbG9jYWxTdGF0ZSB8fCAhbG9jYWxTdGF0ZS5uYXRpdmVQcm9wcykgcmV0dXJuO1xuXHRcdGxvY2FsU3RhdGUubmF0aXZlUHJvcHMuc2V0KHsgW2tleV06IHZhbHVlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmaXJzdE5vbkluamVjdGVkRGlyZWN0aXZlPFQgZXh0ZW5kcyBOZ3RDb21tb25EaXJlY3RpdmU+KGRpcjogVHlwZTxUPikge1xuXHRcdGxldCBkaXJlY3RpdmU6IFQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBkZXN0cm95ZWQgPSBbXTtcblxuXHRcdGxldCBpID0gdGhpcy5jb21tZW50cy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRzW2ldO1xuXHRcdFx0aWYgKGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuXHRcdFx0XHRkZXN0cm95ZWQucHVzaChpKTtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluamVjdG9yID0gY29tbWVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCk7XG5cdFx0XHRpZiAoIWluamVjdG9yKSB7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IGluamVjdG9yLmdldChkaXIsIG51bGwpO1xuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLnZhbGlkYXRlKCkpIHtcblx0XHRcdFx0ZGlyZWN0aXZlID0gaW5zdGFuY2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRpLS07XG5cdFx0fVxuXG5cdFx0ZGVzdHJveWVkLmZvckVhY2goKGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLmNvbW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZGlyZWN0aXZlO1xuXHR9XG5cblx0cHJpdmF0ZSB0cnlHZXRQb3J0YWxTdG9yZSgpIHtcblx0XHRsZXQgc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBkZXN0cm95ZWQgPSBbXTtcblx0XHQvLyB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHBvcnRhbCBzdGF0ZXMgYmVjYXVzZSBOZ3RTdG9yZSBvbmx5IGRpZmZlcnMgcGVyIFBvcnRhbFxuXHRcdGxldCBpID0gdGhpcy5wb3J0YWxzLmxlbmd0aCAtIDE7XG5cdFx0d2hpbGUgKGkgPj0gMCkge1xuXHRcdFx0Ly8gbG9vcCB0aHJvdWdoIHRoZSBwb3J0YWwgc3RhdGUgYmFja3dhcmRzIHRvIGZpbmQgdGhlIGNsb3Nlc3QgTmd0U3RvcmVcblx0XHRcdGNvbnN0IHBvcnRhbCA9IHRoaXMucG9ydGFsc1tpXTtcblx0XHRcdGlmIChwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuXHRcdFx0XHRkZXN0cm95ZWQucHVzaChpKTtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaW5qZWN0b3IgPSBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuXHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoTkdUX1NUT1JFLCBudWxsKTtcblx0XHRcdC8vIG9ubHkgdGhlIGluc3RhbmNlIHdpdGggcHJldmlvdXNSb290IHNob3VsZCBwYXNzXG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZ2V0KCdwcmV2aW91c1Jvb3QnKSkge1xuXHRcdFx0XHRzdG9yZSA9IGluc3RhbmNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGktLTtcblx0XHR9XG5cblx0XHRkZXN0cm95ZWQuZm9yRWFjaCgoaW5kZXgpID0+IHtcblx0XHRcdHRoaXMucG9ydGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHN0b3JlIHx8IHRoaXMucm9vdCEuc3RvcmU7XG5cdH1cbn1cbiJdfQ==
|