@angular/language-service 11.1.0-next.4 → 11.1.1

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.
@@ -31,6 +31,8 @@
31
31
  this.compiler = compiler;
32
32
  }
33
33
  DefinitionBuilder.prototype.getDefinitionAndBoundSpan = function (fileName, position) {
34
+ var e_1, _a;
35
+ var _b;
34
36
  var templateInfo = utils_1.getTemplateInfoAtPosition(fileName, position, this.compiler);
35
37
  if (templateInfo === undefined) {
36
38
  // We were unable to get a template at the given position. If we are in a TS file, instead
@@ -41,16 +43,35 @@
41
43
  }
42
44
  return getDefinitionForExpressionAtPosition(fileName, position, this.compiler);
43
45
  }
44
- var definitionMeta = this.getDefinitionMetaAtPosition(templateInfo, position);
45
- // The `$event` of event handlers would point to the $event parameter in the shim file, as in
46
- // `_outputHelper(_t3["x"]).subscribe(function ($event): any { $event }) ;`
47
- // If we wanted to return something for this, it would be more appropriate for something like
48
- // `getTypeDefinition`.
49
- if (definitionMeta === undefined || utils_1.isDollarEvent(definitionMeta.node)) {
46
+ var definitionMetas = this.getDefinitionMetaAtPosition(templateInfo, position);
47
+ if (definitionMetas === undefined) {
50
48
  return undefined;
51
49
  }
52
- var definitions = this.getDefinitionsForSymbol(tslib_1.__assign(tslib_1.__assign({}, definitionMeta), templateInfo));
53
- return { definitions: definitions, textSpan: utils_1.getTextSpanOfNode(definitionMeta.node) };
50
+ var definitions = [];
51
+ try {
52
+ for (var definitionMetas_1 = tslib_1.__values(definitionMetas), definitionMetas_1_1 = definitionMetas_1.next(); !definitionMetas_1_1.done; definitionMetas_1_1 = definitionMetas_1.next()) {
53
+ var definitionMeta = definitionMetas_1_1.value;
54
+ // The `$event` of event handlers would point to the $event parameter in the shim file, as in
55
+ // `_outputHelper(_t3["x"]).subscribe(function ($event): any { $event }) ;`
56
+ // If we wanted to return something for this, it would be more appropriate for something like
57
+ // `getTypeDefinition`.
58
+ if (utils_1.isDollarEvent(definitionMeta.node)) {
59
+ continue;
60
+ }
61
+ definitions.push.apply(definitions, tslib_1.__spread(((_b = this.getDefinitionsForSymbol(tslib_1.__assign(tslib_1.__assign({}, definitionMeta), templateInfo))) !== null && _b !== void 0 ? _b : [])));
62
+ }
63
+ }
64
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
65
+ finally {
66
+ try {
67
+ if (definitionMetas_1_1 && !definitionMetas_1_1.done && (_a = definitionMetas_1.return)) _a.call(definitionMetas_1);
68
+ }
69
+ finally { if (e_1) throw e_1.error; }
70
+ }
71
+ if (definitions.length === 0) {
72
+ return undefined;
73
+ }
74
+ return { definitions: definitions, textSpan: utils_1.getTextSpanOfNode(definitionMetas[0].node) };
54
75
  };
55
76
  DefinitionBuilder.prototype.getDefinitionsForSymbol = function (_a) {
56
77
  var symbol = _a.symbol, node = _a.node, parent = _a.parent, component = _a.component;
@@ -87,15 +108,20 @@
87
108
  case api_1.SymbolKind.Reference: {
88
109
  var definitions = [];
89
110
  if (symbol.declaration !== node) {
90
- definitions.push({
91
- name: symbol.declaration.name,
92
- containerName: '',
93
- containerKind: ts.ScriptElementKind.unknown,
94
- kind: ts.ScriptElementKind.variableElement,
95
- textSpan: utils_1.getTextSpanOfNode(symbol.declaration),
96
- contextSpan: utils_1.toTextSpan(symbol.declaration.sourceSpan),
97
- fileName: symbol.declaration.sourceSpan.start.file.url,
98
- });
111
+ var shimLocation = symbol.kind === api_1.SymbolKind.Variable ? symbol.localVarLocation :
112
+ symbol.referenceVarLocation;
113
+ var mapping = utils_1.getTemplateLocationFromShimLocation(this.compiler.getTemplateTypeChecker(), shimLocation.shimPath, shimLocation.positionInShimFile);
114
+ if (mapping !== null) {
115
+ definitions.push({
116
+ name: symbol.declaration.name,
117
+ containerName: '',
118
+ containerKind: ts.ScriptElementKind.unknown,
119
+ kind: ts.ScriptElementKind.variableElement,
120
+ textSpan: utils_1.getTextSpanOfNode(symbol.declaration),
121
+ contextSpan: utils_1.toTextSpan(symbol.declaration.sourceSpan),
122
+ fileName: mapping.templateUrl,
123
+ });
124
+ }
99
125
  }
100
126
  if (symbol.kind === api_1.SymbolKind.Variable) {
101
127
  definitions.push.apply(definitions, tslib_1.__spread(this.getDefinitionsForSymbols({ shimLocation: symbol.initializerLocation })));
@@ -121,45 +147,67 @@
121
147
  });
122
148
  };
123
149
  DefinitionBuilder.prototype.getTypeDefinitionsAtPosition = function (fileName, position) {
150
+ var e_2, _a;
124
151
  var templateInfo = utils_1.getTemplateInfoAtPosition(fileName, position, this.compiler);
125
152
  if (templateInfo === undefined) {
126
153
  return;
127
154
  }
128
- var definitionMeta = this.getDefinitionMetaAtPosition(templateInfo, position);
129
- if (definitionMeta === undefined) {
155
+ var definitionMetas = this.getDefinitionMetaAtPosition(templateInfo, position);
156
+ if (definitionMetas === undefined) {
130
157
  return undefined;
131
158
  }
132
- var symbol = definitionMeta.symbol, node = definitionMeta.node;
133
- switch (symbol.kind) {
134
- case api_1.SymbolKind.Directive:
135
- case api_1.SymbolKind.DomBinding:
136
- case api_1.SymbolKind.Element:
137
- case api_1.SymbolKind.Template:
138
- return this.getTypeDefinitionsForTemplateInstance(symbol, node);
139
- case api_1.SymbolKind.Output:
140
- case api_1.SymbolKind.Input: {
141
- var bindingDefs = this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(symbol.bindings));
142
- // Also attempt to get directive matches for the input name. If there is a directive that
143
- // has the input name as part of the selector, we want to return that as well.
144
- var directiveDefs = this.getDirectiveTypeDefsForBindingNode(node, definitionMeta.parent, templateInfo.component);
145
- return tslib_1.__spread(bindingDefs, directiveDefs);
146
- }
147
- case api_1.SymbolKind.Pipe: {
148
- if (symbol.tsSymbol !== null) {
149
- return this.getTypeDefinitionsForSymbols(symbol);
150
- }
151
- else {
152
- // If there is no `ts.Symbol` for the pipe transform, we want to return the
153
- // type definition (the pipe class).
154
- return this.getTypeDefinitionsForSymbols(symbol.classSymbol);
159
+ var definitions = [];
160
+ try {
161
+ for (var definitionMetas_2 = tslib_1.__values(definitionMetas), definitionMetas_2_1 = definitionMetas_2.next(); !definitionMetas_2_1.done; definitionMetas_2_1 = definitionMetas_2.next()) {
162
+ var _b = definitionMetas_2_1.value, symbol = _b.symbol, node = _b.node, parent_1 = _b.parent;
163
+ switch (symbol.kind) {
164
+ case api_1.SymbolKind.Directive:
165
+ case api_1.SymbolKind.DomBinding:
166
+ case api_1.SymbolKind.Element:
167
+ case api_1.SymbolKind.Template:
168
+ definitions.push.apply(definitions, tslib_1.__spread(this.getTypeDefinitionsForTemplateInstance(symbol, node)));
169
+ break;
170
+ case api_1.SymbolKind.Output:
171
+ case api_1.SymbolKind.Input: {
172
+ var bindingDefs = this.getTypeDefinitionsForSymbols.apply(this, tslib_1.__spread(symbol.bindings));
173
+ definitions.push.apply(definitions, tslib_1.__spread(bindingDefs));
174
+ // Also attempt to get directive matches for the input name. If there is a directive that
175
+ // has the input name as part of the selector, we want to return that as well.
176
+ var directiveDefs = this.getDirectiveTypeDefsForBindingNode(node, parent_1, templateInfo.component);
177
+ definitions.push.apply(definitions, tslib_1.__spread(directiveDefs));
178
+ break;
179
+ }
180
+ case api_1.SymbolKind.Pipe: {
181
+ if (symbol.tsSymbol !== null) {
182
+ definitions.push.apply(definitions, tslib_1.__spread(this.getTypeDefinitionsForSymbols(symbol)));
183
+ }
184
+ else {
185
+ // If there is no `ts.Symbol` for the pipe transform, we want to return the
186
+ // type definition (the pipe class).
187
+ definitions.push.apply(definitions, tslib_1.__spread(this.getTypeDefinitionsForSymbols(symbol.classSymbol)));
188
+ }
189
+ break;
190
+ }
191
+ case api_1.SymbolKind.Reference:
192
+ definitions.push.apply(definitions, tslib_1.__spread(this.getTypeDefinitionsForSymbols({ shimLocation: symbol.targetLocation })));
193
+ break;
194
+ case api_1.SymbolKind.Expression:
195
+ definitions.push.apply(definitions, tslib_1.__spread(this.getTypeDefinitionsForSymbols(symbol)));
196
+ break;
197
+ case api_1.SymbolKind.Variable: {
198
+ definitions.push.apply(definitions, tslib_1.__spread(this.getTypeDefinitionsForSymbols({ shimLocation: symbol.initializerLocation })));
199
+ break;
200
+ }
155
201
  }
202
+ return definitions;
156
203
  }
157
- case api_1.SymbolKind.Reference:
158
- return this.getTypeDefinitionsForSymbols({ shimLocation: symbol.targetLocation });
159
- case api_1.SymbolKind.Expression:
160
- return this.getTypeDefinitionsForSymbols(symbol);
161
- case api_1.SymbolKind.Variable:
162
- return this.getTypeDefinitionsForSymbols({ shimLocation: symbol.initializerLocation });
204
+ }
205
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
206
+ finally {
207
+ try {
208
+ if (definitionMetas_2_1 && !definitionMetas_2_1.done && (_a = definitionMetas_2.return)) _a.call(definitionMetas_2);
209
+ }
210
+ finally { if (e_2) throw e_2.error; }
163
211
  }
164
212
  };
165
213
  DefinitionBuilder.prototype.getTypeDefinitionsForTemplateInstance = function (symbol, node) {
@@ -217,17 +265,33 @@
217
265
  });
218
266
  };
219
267
  DefinitionBuilder.prototype.getDefinitionMetaAtPosition = function (_a, position) {
268
+ var e_3, _b;
220
269
  var template = _a.template, component = _a.component;
221
270
  var target = template_target_1.getTargetAtPosition(template, position);
222
271
  if (target === null) {
223
272
  return undefined;
224
273
  }
225
- var nodeInContext = target.nodeInContext, parent = target.parent;
226
- var symbol = this.compiler.getTemplateTypeChecker().getSymbolOfNode(nodeInContext.node, component);
227
- if (symbol === null) {
228
- return undefined;
274
+ var context = target.context, parent = target.parent;
275
+ var nodes = context.kind === template_target_1.TargetNodeKind.TwoWayBindingContext ? context.nodes : [context.node];
276
+ var definitionMetas = [];
277
+ try {
278
+ for (var nodes_1 = tslib_1.__values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
279
+ var node = nodes_1_1.value;
280
+ var symbol = this.compiler.getTemplateTypeChecker().getSymbolOfNode(node, component);
281
+ if (symbol === null) {
282
+ continue;
283
+ }
284
+ definitionMetas.push({ node: node, parent: parent, symbol: symbol });
285
+ }
286
+ }
287
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
288
+ finally {
289
+ try {
290
+ if (nodes_1_1 && !nodes_1_1.done && (_b = nodes_1.return)) _b.call(nodes_1);
291
+ }
292
+ finally { if (e_3) throw e_3.error; }
229
293
  }
230
- return { node: nodeInContext.node, parent: parent, symbol: symbol };
294
+ return definitionMetas.length > 0 ? definitionMetas : undefined;
231
295
  };
232
296
  return DefinitionBuilder;
233
297
  }());
@@ -279,4 +343,4 @@
279
343
  };
280
344
  }
281
345
  });
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL2l2eS9kZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsOENBQW9KO0lBRXBKLHFFQUE0RTtJQUM1RSxxRUFBaUs7SUFDakssK0JBQWlDO0lBRWpDLGlGQUFzRDtJQUN0RCxtRUFBdUU7SUFDdkUsNkRBQTRNO0lBWTVNO1FBQ0UsMkJBQTZCLElBQXdCLEVBQW1CLFFBQW9CO1lBQS9ELFNBQUksR0FBSixJQUFJLENBQW9CO1lBQW1CLGFBQVEsR0FBUixRQUFRLENBQVk7UUFBRyxDQUFDO1FBRWhHLHFEQUF5QixHQUF6QixVQUEwQixRQUFnQixFQUFFLFFBQWdCO1lBRTFELElBQU0sWUFBWSxHQUFHLGlDQUF5QixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsMEZBQTBGO2dCQUMxRiwwRkFBMEY7Z0JBQzFGLCtDQUErQztnQkFDL0MsSUFBSSxDQUFDLHdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMvQixPQUFPO2lCQUNSO2dCQUNELE9BQU8sb0NBQW9DLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEY7WUFDRCxJQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hGLDZGQUE2RjtZQUM3RiwyRUFBMkU7WUFDM0UsNkZBQTZGO1lBQzdGLHVCQUF1QjtZQUN2QixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUkscUJBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RFLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBRUQsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1Qix1Q0FBSyxjQUFjLEdBQUssWUFBWSxFQUFFLENBQUM7WUFDdkYsT0FBTyxFQUFDLFdBQVcsYUFBQSxFQUFFLFFBQVEsRUFBRSx5QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRU8sbURBQXVCLEdBQS9CLFVBQWdDLEVBQ1k7Z0JBRFgsTUFBTSxZQUFBLEVBQUUsSUFBSSxVQUFBLEVBQUUsTUFBTSxZQUFBLEVBQUUsU0FBUyxlQUFBO1lBRTlELFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDbkIsS0FBSyxnQkFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsS0FBSyxnQkFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDeEIsS0FBSyxnQkFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDekIsS0FBSyxnQkFBVSxDQUFDLFVBQVU7b0JBQ3hCLGlGQUFpRjtvQkFDakYsK0VBQStFO29CQUMvRSwyRUFBMkU7b0JBQzNFLHdGQUF3RjtvQkFDeEYsd0NBQXdDO29CQUN4QyxPQUFPLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xFLEtBQUssZ0JBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTt3QkFDNUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzlDO3lCQUFNO3dCQUNMLDJFQUEyRTt3QkFDM0Usb0NBQW9DO3dCQUNwQyxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQzlEO2lCQUNGO2dCQUNELEtBQUssZ0JBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZCLEtBQUssZ0JBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixPQUE3QixJQUFJLG1CQUE2QixNQUFNLENBQUMsUUFBUSxFQUFDLENBQUM7b0JBQ3RFLHlGQUF5RjtvQkFDekYsOEVBQThFO29CQUM5RSxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDdkYsd0JBQVcsV0FBVyxFQUFLLGFBQWEsRUFBRTtpQkFDM0M7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDekIsS0FBSyxnQkFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN6QixJQUFNLFdBQVcsR0FBd0IsRUFBRSxDQUFDO29CQUM1QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO3dCQUMvQixXQUFXLENBQUMsSUFBSSxDQUFDOzRCQUNmLElBQUksRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUk7NEJBQzdCLGFBQWEsRUFBRSxFQUFFOzRCQUNqQixhQUFhLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU87NEJBQzNDLElBQUksRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsZUFBZTs0QkFDMUMsUUFBUSxFQUFFLHlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7NEJBQy9DLFdBQVcsRUFBRSxrQkFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDOzRCQUN0RCxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHO3lCQUN2RCxDQUFDLENBQUM7cUJBQ0o7b0JBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGdCQUFVLENBQUMsUUFBUSxFQUFFO3dCQUN2QyxXQUFXLENBQUMsSUFBSSxPQUFoQixXQUFXLG1CQUNKLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUMsQ0FBQyxHQUFFO3FCQUNuRjtvQkFDRCxPQUFPLFdBQVcsQ0FBQztpQkFDcEI7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUMxQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDOUM7YUFDRjtRQUNILENBQUM7UUFFTyxvREFBd0IsR0FBaEM7WUFBQSxpQkFLQztZQUxnQyxpQkFBNkI7aUJBQTdCLFVBQTZCLEVBQTdCLHFCQUE2QixFQUE3QixJQUE2QjtnQkFBN0IsNEJBQTZCOztZQUM1RCxPQUFPLGVBQU8sQ0FBQyxPQUFPLEVBQUUsVUFBQyxFQUFjOztvQkFBYixZQUFZLGtCQUFBO2dCQUM3QixJQUFBLFFBQVEsR0FBd0IsWUFBWSxTQUFwQyxFQUFFLGtCQUFrQixHQUFJLFlBQVksbUJBQWhCLENBQWlCO2dCQUNwRCxhQUFPLEtBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLG1DQUFJLEVBQUUsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCx3REFBNEIsR0FBNUIsVUFBNkIsUUFBZ0IsRUFBRSxRQUFnQjtZQUU3RCxJQUFNLFlBQVksR0FBRyxpQ0FBeUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRixJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQzlCLE9BQU87YUFDUjtZQUNELElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEYsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUNoQyxPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUVNLElBQUEsTUFBTSxHQUFVLGNBQWMsT0FBeEIsRUFBRSxJQUFJLEdBQUksY0FBYyxLQUFsQixDQUFtQjtZQUN0QyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ25CLEtBQUssZ0JBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQzFCLEtBQUssZ0JBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQzNCLEtBQUssZ0JBQVUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLEtBQUssZ0JBQVUsQ0FBQyxRQUFRO29CQUN0QixPQUFPLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xFLEtBQUssZ0JBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZCLEtBQUssZ0JBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixPQUFqQyxJQUFJLG1CQUFpQyxNQUFNLENBQUMsUUFBUSxFQUFDLENBQUM7b0JBQzFFLHlGQUF5RjtvQkFDekYsOEVBQThFO29CQUM5RSxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQ3pELElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekQsd0JBQVcsV0FBVyxFQUFLLGFBQWEsRUFBRTtpQkFDM0M7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQixJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO3dCQUM1QixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDbEQ7eUJBQU07d0JBQ0wsMkVBQTJFO3dCQUMzRSxvQ0FBb0M7d0JBQ3BDLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDOUQ7aUJBQ0Y7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFNBQVM7b0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDO2dCQUNsRixLQUFLLGdCQUFVLENBQUMsVUFBVTtvQkFDeEIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25ELEtBQUssZ0JBQVUsQ0FBQyxRQUFRO29CQUN0QixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxFQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUMsQ0FBQyxDQUFDO2FBQ3hGO1FBQ0gsQ0FBQztRQUVPLGlFQUFxQyxHQUE3QyxVQUNJLE1BQXFFLEVBQ3JFLElBQXFCO1lBQ3ZCLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDbkIsS0FBSyxnQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4QixJQUFNLE9BQU8sR0FBRyx3Q0FBZ0MsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDekYsT0FBTyxJQUFJLENBQUMsNEJBQTRCLE9BQWpDLElBQUksbUJBQWlDLE9BQU8sR0FBRTtpQkFDdEQ7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN2QixJQUFNLE9BQU8sR0FBRyx3Q0FBZ0MsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDekYsMkZBQTJGO29CQUMzRiwwREFBMEQ7b0JBQzFELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsV0FBVyxFQUFmLENBQWUsQ0FBQyxDQUFDLENBQUMsQ0FDckQsSUFBSSxDQUFDLDRCQUE0QixPQUFqQyxJQUFJLG1CQUFpQyxPQUFPLEdBQUUsQ0FBQyxDQUMvQyxJQUFJLENBQUMsNEJBQTRCLE9BQWpDLElBQUksbUJBQWlDLE9BQU8sR0FBRSxNQUFNLEdBQUMsQ0FBQztpQkFDM0Q7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksK0JBQW9CLENBQUMsRUFBRTt3QkFDM0MsT0FBTyxFQUFFLENBQUM7cUJBQ1g7b0JBQ0QsSUFBTSxJQUFJLEdBQUcsdUNBQStCLENBQ3hDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDakUsT0FBTyxJQUFJLENBQUMsNEJBQTRCLE9BQWpDLElBQUksbUJBQWlDLElBQUksR0FBRTtpQkFDbkQ7Z0JBQ0QsS0FBSyxnQkFBVSxDQUFDLFNBQVM7b0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3BEO1FBQ0gsQ0FBQztRQUVPLDhEQUFrQyxHQUExQyxVQUNJLElBQXFCLEVBQUUsTUFBNEIsRUFBRSxTQUE4QjtZQUNyRixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksZ0NBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLCtCQUFvQixDQUFDO2dCQUNuRixDQUFDLENBQUMsSUFBSSxZQUFZLDRCQUFpQixDQUFDLEVBQUU7Z0JBQ3hDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxJQUFJLE1BQU0sS0FBSyxJQUFJO2dCQUNmLENBQUMsQ0FBQyxNQUFNLFlBQVksMEJBQWUsSUFBSSxNQUFNLFlBQVkseUJBQWMsQ0FBQyxFQUFFO2dCQUM1RSxPQUFPLEVBQUUsQ0FBQzthQUNYO1lBQ0QsSUFBTSx1QkFBdUIsR0FDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUUsSUFBSSx1QkFBdUIsS0FBSyxJQUFJO2dCQUNoQyxDQUFDLHVCQUF1QixDQUFDLElBQUksS0FBSyxnQkFBVSxDQUFDLFFBQVE7b0JBQ3BELHVCQUF1QixDQUFDLElBQUksS0FBSyxnQkFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN6RCxPQUFPLEVBQUUsQ0FBQzthQUNYO1lBQ0QsSUFBTSxJQUFJLEdBQ04sdUNBQStCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFJLENBQUMsNEJBQTRCLE9BQWpDLElBQUksbUJBQWlDLElBQUksR0FBRTtRQUNwRCxDQUFDO1FBRU8sd0RBQTRCLEdBQXBDO1lBQUEsaUJBS0M7WUFMb0MsaUJBQTZCO2lCQUE3QixVQUE2QixFQUE3QixxQkFBNkIsRUFBN0IsSUFBNkI7Z0JBQTdCLDRCQUE2Qjs7WUFDaEUsT0FBTyxlQUFPLENBQUMsT0FBTyxFQUFFLFVBQUMsRUFBYzs7b0JBQWIsWUFBWSxrQkFBQTtnQkFDN0IsSUFBQSxRQUFRLEdBQXdCLFlBQVksU0FBcEMsRUFBRSxrQkFBa0IsR0FBSSxZQUFZLG1CQUFoQixDQUFpQjtnQkFDcEQsYUFBTyxLQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7WUFDbkYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRU8sdURBQTJCLEdBQW5DLFVBQW9DLEVBQW1DLEVBQUUsUUFBZ0I7Z0JBQXBELFFBQVEsY0FBQSxFQUFFLFNBQVMsZUFBQTtZQUV0RCxJQUFNLE1BQU0sR0FBRyxxQ0FBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUNuQixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUNNLElBQUEsYUFBYSxHQUFZLE1BQU0sY0FBbEIsRUFBRSxNQUFNLEdBQUksTUFBTSxPQUFWLENBQVc7WUFFdkMsSUFBTSxNQUFNLEdBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzFGLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDbkIsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFDRCxPQUFPLEVBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxRQUFBLEVBQUUsTUFBTSxRQUFBLEVBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0gsd0JBQUM7SUFBRCxDQUFDLEFBak5ELElBaU5DO0lBak5ZLDhDQUFpQjtJQW1OOUI7O09BRUc7SUFDSCxTQUFTLG9DQUFvQyxDQUN6QyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsUUFBb0I7UUFFMUQsSUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBRUQsSUFBTSxVQUFVLEdBQUcsMkJBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFNLGdCQUFnQixHQUFHLG9DQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU87U0FDUjtRQUNELElBQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUUsSUFBSSxrQkFBa0IsS0FBSyxJQUFJLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBRUQsSUFBTSxZQUFZLG9CQUFPLGtCQUFrQixDQUFDLE1BQU0sR0FBRSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUMsQ0FBQztRQUVqRixJQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxRQUFRLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBbEMsQ0FBa0MsQ0FBQyxDQUFDO1FBQ2hHLElBQUkscUJBQXFCLEtBQUssU0FBUyxJQUFJLENBQUMsNkJBQWtCLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUNyRixPQUFPO1NBQ1I7UUFFRCxJQUFNLG1CQUFtQixHQUF3QixDQUFDO2dCQUNoRCxJQUFJLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQjtnQkFDN0MsSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUk7Z0JBQ2hDLGFBQWEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsT0FBTztnQkFDM0MsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLGlFQUFpRTtnQkFDakUsc0RBQXNEO2dCQUN0RCwrQ0FBK0M7Z0JBQy9DLG1EQUFtRDtnQkFDbkQsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFDO2dCQUMvQixRQUFRLEVBQUUscUJBQXFCLENBQUMsSUFBSTthQUNyQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsV0FBVyxFQUFFLG1CQUFtQjtZQUNoQyxRQUFRLEVBQUU7Z0JBQ1Isc0RBQXNEO2dCQUN0RCxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7Z0JBQ2hDLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQzthQUNsQztTQUNGLENBQUM7SUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7QVNULCBUbXBsQXN0Qm91bmRBdHRyaWJ1dGUsIFRtcGxBc3RCb3VuZEV2ZW50LCBUbXBsQXN0RWxlbWVudCwgVG1wbEFzdE5vZGUsIFRtcGxBc3RUZW1wbGF0ZSwgVG1wbEFzdFRleHRBdHRyaWJ1dGV9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB7TmdDb21waWxlcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy9jb3JlJztcbmltcG9ydCB7aXNFeHRlcm5hbFJlc291cmNlfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL21ldGFkYXRhJztcbmltcG9ydCB7RGlyZWN0aXZlU3ltYm9sLCBEb21CaW5kaW5nU3ltYm9sLCBFbGVtZW50U3ltYm9sLCBTaGltTG9jYXRpb24sIFN5bWJvbCwgU3ltYm9sS2luZCwgVGVtcGxhdGVTeW1ib2x9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvdHlwZWNoZWNrL2FwaSc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtnZXRUYXJnZXRBdFBvc2l0aW9ufSBmcm9tICcuL3RlbXBsYXRlX3RhcmdldCc7XG5pbXBvcnQge2ZpbmRUaWdodGVzdE5vZGUsIGdldFBhcmVudENsYXNzRGVjbGFyYXRpb259IGZyb20gJy4vdHNfdXRpbHMnO1xuaW1wb3J0IHtmbGF0TWFwLCBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlLCBnZXREaXJlY3RpdmVNYXRjaGVzRm9yRWxlbWVudFRhZywgZ2V0VGVtcGxhdGVJbmZvQXRQb3NpdGlvbiwgZ2V0VGV4dFNwYW5PZk5vZGUsIGlzRG9sbGFyRXZlbnQsIGlzVHlwZVNjcmlwdEZpbGUsIFRlbXBsYXRlSW5mbywgdG9UZXh0U3Bhbn0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBEZWZpbml0aW9uTWV0YSB7XG4gIG5vZGU6IEFTVHxUbXBsQXN0Tm9kZTtcbiAgcGFyZW50OiBBU1R8VG1wbEFzdE5vZGV8bnVsbDtcbiAgc3ltYm9sOiBTeW1ib2w7XG59XG5cbmludGVyZmFjZSBIYXNTaGltTG9jYXRpb24ge1xuICBzaGltTG9jYXRpb246IFNoaW1Mb2NhdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmluaXRpb25CdWlsZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0c0xTOiB0cy5MYW5ndWFnZVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgY29tcGlsZXI6IE5nQ29tcGlsZXIpIHt9XG5cbiAgZ2V0RGVmaW5pdGlvbkFuZEJvdW5kU3BhbihmaWxlTmFtZTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogdHMuRGVmaW5pdGlvbkluZm9BbmRCb3VuZFNwYW5cbiAgICAgIHx1bmRlZmluZWQge1xuICAgIGNvbnN0IHRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mb0F0UG9zaXRpb24oZmlsZU5hbWUsIHBvc2l0aW9uLCB0aGlzLmNvbXBpbGVyKTtcbiAgICBpZiAodGVtcGxhdGVJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHRlbXBsYXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gSWYgd2UgYXJlIGluIGEgVFMgZmlsZSwgaW5zdGVhZFxuICAgICAgLy8gYXR0ZW1wdCB0byBnZXQgYW4gQW5ndWxhciBkZWZpbml0aW9uIGF0IHRoZSBsb2NhdGlvbiBpbnNpZGUgYSBUUyBmaWxlIChleGFtcGxlcyBvZiB0aGlzXG4gICAgICAvLyB3b3VsZCBiZSB0ZW1wbGF0ZVVybCBvciBhIHVybCBpbiBzdHlsZVVybHMpLlxuICAgICAgaWYgKCFpc1R5cGVTY3JpcHRGaWxlKGZpbGVOYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0RGVmaW5pdGlvbkZvckV4cHJlc3Npb25BdFBvc2l0aW9uKGZpbGVOYW1lLCBwb3NpdGlvbiwgdGhpcy5jb21waWxlcik7XG4gICAgfVxuICAgIGNvbnN0IGRlZmluaXRpb25NZXRhID0gdGhpcy5nZXREZWZpbml0aW9uTWV0YUF0UG9zaXRpb24odGVtcGxhdGVJbmZvLCBwb3NpdGlvbik7XG4gICAgLy8gVGhlIGAkZXZlbnRgIG9mIGV2ZW50IGhhbmRsZXJzIHdvdWxkIHBvaW50IHRvIHRoZSAkZXZlbnQgcGFyYW1ldGVyIGluIHRoZSBzaGltIGZpbGUsIGFzIGluXG4gICAgLy8gYF9vdXRwdXRIZWxwZXIoX3QzW1wieFwiXSkuc3Vic2NyaWJlKGZ1bmN0aW9uICgkZXZlbnQpOiBhbnkgeyAkZXZlbnQgfSkgO2BcbiAgICAvLyBJZiB3ZSB3YW50ZWQgdG8gcmV0dXJuIHNvbWV0aGluZyBmb3IgdGhpcywgaXQgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3Igc29tZXRoaW5nIGxpa2VcbiAgICAvLyBgZ2V0VHlwZURlZmluaXRpb25gLlxuICAgIGlmIChkZWZpbml0aW9uTWV0YSA9PT0gdW5kZWZpbmVkIHx8IGlzRG9sbGFyRXZlbnQoZGVmaW5pdGlvbk1ldGEubm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLmdldERlZmluaXRpb25zRm9yU3ltYm9sKHsuLi5kZWZpbml0aW9uTWV0YSwgLi4udGVtcGxhdGVJbmZvfSk7XG4gICAgcmV0dXJuIHtkZWZpbml0aW9ucywgdGV4dFNwYW46IGdldFRleHRTcGFuT2ZOb2RlKGRlZmluaXRpb25NZXRhLm5vZGUpfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2woe3N5bWJvbCwgbm9kZSwgcGFyZW50LCBjb21wb25lbnR9OiBEZWZpbml0aW9uTWV0YSZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUluZm8pOiByZWFkb25seSB0cy5EZWZpbml0aW9uSW5mb1tdfHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLkRpcmVjdGl2ZTpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5FbGVtZW50OlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlRlbXBsYXRlOlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkRvbUJpbmRpbmc6XG4gICAgICAgIC8vIFRob3VnaCBpdCBpcyBnZW5lcmFsbHkgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGFib3ZlIHN5bWJvbCBkZWZpbml0aW9ucyB0byBiZVxuICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggXCJ0eXBlIGRlZmluaXRpb25zXCIgc2luY2UgdGhlIGxvY2F0aW9uIGluIHRoZSB0ZW1wbGF0ZSBpcyB0aGVcbiAgICAgICAgLy8gYWN0dWFsIGRlZmluaXRpb24gbG9jYXRpb24sIHRoZSBiZXR0ZXIgdXNlciBleHBlcmllbmNlIHdvdWxkIGJlIHRvIGFsbG93XG4gICAgICAgIC8vIExTIHVzZXJzIHRvIFwiZ28gdG8gZGVmaW5pdGlvblwiIG9uIGFuIGl0ZW0gaW4gdGhlIHRlbXBsYXRlIHRoYXQgbWFwcyB0byBhIGNsYXNzIGFuZCBiZVxuICAgICAgICAvLyB0YWtlbiB0byB0aGUgZGlyZWN0aXZlIG9yIEhUTUwgY2xhc3MuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclRlbXBsYXRlSW5zdGFuY2Uoc3ltYm9sLCBub2RlKTtcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5QaXBlOiB7XG4gICAgICAgIGlmIChzeW1ib2wudHNTeW1ib2wgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZpbml0aW9uc0ZvclN5bWJvbHMoc3ltYm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBgdHMuU3ltYm9sYCBmb3IgdGhlIHBpcGUgdHJhbnNmb3JtLCB3ZSB3YW50IHRvIHJldHVybiB0aGVcbiAgICAgICAgICAvLyB0eXBlIGRlZmluaXRpb24gKHRoZSBwaXBlIGNsYXNzKS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKHN5bWJvbC5jbGFzc1N5bWJvbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgU3ltYm9sS2luZC5PdXRwdXQ6XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuSW5wdXQ6IHtcbiAgICAgICAgY29uc3QgYmluZGluZ0RlZnMgPSB0aGlzLmdldERlZmluaXRpb25zRm9yU3ltYm9scyguLi5zeW1ib2wuYmluZGluZ3MpO1xuICAgICAgICAvLyBBbHNvIGF0dGVtcHQgdG8gZ2V0IGRpcmVjdGl2ZSBtYXRjaGVzIGZvciB0aGUgaW5wdXQgbmFtZS4gSWYgdGhlcmUgaXMgYSBkaXJlY3RpdmUgdGhhdFxuICAgICAgICAvLyBoYXMgdGhlIGlucHV0IG5hbWUgYXMgcGFydCBvZiB0aGUgc2VsZWN0b3IsIHdlIHdhbnQgdG8gcmV0dXJuIHRoYXQgYXMgd2VsbC5cbiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmcyA9IHRoaXMuZ2V0RGlyZWN0aXZlVHlwZURlZnNGb3JCaW5kaW5nTm9kZShub2RlLCBwYXJlbnQsIGNvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBbLi4uYmluZGluZ0RlZnMsIC4uLmRpcmVjdGl2ZURlZnNdO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlZhcmlhYmxlOlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlJlZmVyZW5jZToge1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uczogdHMuRGVmaW5pdGlvbkluZm9bXSA9IFtdO1xuICAgICAgICBpZiAoc3ltYm9sLmRlY2xhcmF0aW9uICE9PSBub2RlKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBzeW1ib2wuZGVjbGFyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6ICcnLFxuICAgICAgICAgICAgY29udGFpbmVyS2luZDogdHMuU2NyaXB0RWxlbWVudEtpbmQudW5rbm93bixcbiAgICAgICAgICAgIGtpbmQ6IHRzLlNjcmlwdEVsZW1lbnRLaW5kLnZhcmlhYmxlRWxlbWVudCxcbiAgICAgICAgICAgIHRleHRTcGFuOiBnZXRUZXh0U3Bhbk9mTm9kZShzeW1ib2wuZGVjbGFyYXRpb24pLFxuICAgICAgICAgICAgY29udGV4dFNwYW46IHRvVGV4dFNwYW4oc3ltYm9sLmRlY2xhcmF0aW9uLnNvdXJjZVNwYW4pLFxuICAgICAgICAgICAgZmlsZU5hbWU6IHN5bWJvbC5kZWNsYXJhdGlvbi5zb3VyY2VTcGFuLnN0YXJ0LmZpbGUudXJsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW1ib2wua2luZCA9PT0gU3ltYm9sS2luZC5WYXJpYWJsZSkge1xuICAgICAgICAgIGRlZmluaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2xzKHtzaGltTG9jYXRpb246IHN5bWJvbC5pbml0aWFsaXplckxvY2F0aW9ufSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9ucztcbiAgICAgIH1cbiAgICAgIGNhc2UgU3ltYm9sS2luZC5FeHByZXNzaW9uOiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLnN5bWJvbHM6IEhhc1NoaW1Mb2NhdGlvbltdKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgcmV0dXJuIGZsYXRNYXAoc3ltYm9scywgKHtzaGltTG9jYXRpb259KSA9PiB7XG4gICAgICBjb25zdCB7c2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZX0gPSBzaGltTG9jYXRpb247XG4gICAgICByZXR1cm4gdGhpcy50c0xTLmdldERlZmluaXRpb25BdFBvc2l0aW9uKHNoaW1QYXRoLCBwb3NpdGlvbkluU2hpbUZpbGUpID8/IFtdO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VHlwZURlZmluaXRpb25zQXRQb3NpdGlvbihmaWxlTmFtZTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTpcbiAgICAgIHJlYWRvbmx5IHRzLkRlZmluaXRpb25JbmZvW118dW5kZWZpbmVkIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUluZm8gPSBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uKGZpbGVOYW1lLCBwb3NpdGlvbiwgdGhpcy5jb21waWxlcik7XG4gICAgaWYgKHRlbXBsYXRlSW5mbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlZmluaXRpb25NZXRhID0gdGhpcy5nZXREZWZpbml0aW9uTWV0YUF0UG9zaXRpb24odGVtcGxhdGVJbmZvLCBwb3NpdGlvbik7XG4gICAgaWYgKGRlZmluaXRpb25NZXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qge3N5bWJvbCwgbm9kZX0gPSBkZWZpbml0aW9uTWV0YTtcbiAgICBzd2l0Y2ggKHN5bWJvbC5raW5kKSB7XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRGlyZWN0aXZlOlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkRvbUJpbmRpbmc6XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5UZW1wbGF0ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yVGVtcGxhdGVJbnN0YW5jZShzeW1ib2wsIG5vZGUpO1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLk91dHB1dDpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5JbnB1dDoge1xuICAgICAgICBjb25zdCBiaW5kaW5nRGVmcyA9IHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyguLi5zeW1ib2wuYmluZGluZ3MpO1xuICAgICAgICAvLyBBbHNvIGF0dGVtcHQgdG8gZ2V0IGRpcmVjdGl2ZSBtYXRjaGVzIGZvciB0aGUgaW5wdXQgbmFtZS4gSWYgdGhlcmUgaXMgYSBkaXJlY3RpdmUgdGhhdFxuICAgICAgICAvLyBoYXMgdGhlIGlucHV0IG5hbWUgYXMgcGFydCBvZiB0aGUgc2VsZWN0b3IsIHdlIHdhbnQgdG8gcmV0dXJuIHRoYXQgYXMgd2VsbC5cbiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmcyA9IHRoaXMuZ2V0RGlyZWN0aXZlVHlwZURlZnNGb3JCaW5kaW5nTm9kZShcbiAgICAgICAgICAgIG5vZGUsIGRlZmluaXRpb25NZXRhLnBhcmVudCwgdGVtcGxhdGVJbmZvLmNvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBbLi4uYmluZGluZ0RlZnMsIC4uLmRpcmVjdGl2ZURlZnNdO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLlBpcGU6IHtcbiAgICAgICAgaWYgKHN5bWJvbC50c1N5bWJvbCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoc3ltYm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBgdHMuU3ltYm9sYCBmb3IgdGhlIHBpcGUgdHJhbnNmb3JtLCB3ZSB3YW50IHRvIHJldHVybiB0aGVcbiAgICAgICAgICAvLyB0eXBlIGRlZmluaXRpb24gKHRoZSBwaXBlIGNsYXNzKS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKHN5bWJvbC5jbGFzc1N5bWJvbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgU3ltYm9sS2luZC5SZWZlcmVuY2U6XG4gICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoe3NoaW1Mb2NhdGlvbjogc3ltYm9sLnRhcmdldExvY2F0aW9ufSk7XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRXhwcmVzc2lvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wpO1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLlZhcmlhYmxlOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKHtzaGltTG9jYXRpb246IHN5bWJvbC5pbml0aWFsaXplckxvY2F0aW9ufSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlRGVmaW5pdGlvbnNGb3JUZW1wbGF0ZUluc3RhbmNlKFxuICAgICAgc3ltYm9sOiBUZW1wbGF0ZVN5bWJvbHxFbGVtZW50U3ltYm9sfERvbUJpbmRpbmdTeW1ib2x8RGlyZWN0aXZlU3ltYm9sLFxuICAgICAgbm9kZTogQVNUfFRtcGxBc3ROb2RlKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLlRlbXBsYXRlOiB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yRWxlbWVudFRhZyhzeW1ib2wudGVtcGxhdGVOb2RlLCBzeW1ib2wuZGlyZWN0aXZlcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4ubWF0Y2hlcyk7XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDoge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gZ2V0RGlyZWN0aXZlTWF0Y2hlc0ZvckVsZW1lbnRUYWcoc3ltYm9sLnRlbXBsYXRlTm9kZSwgc3ltYm9sLmRpcmVjdGl2ZXMpO1xuICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGRpcmVjdGl2ZSBtYXRjaGVzIGlzIGEgY29tcG9uZW50LCB3ZSBzaG91bGQgbm90IGluY2x1ZGUgdGhlIG5hdGl2ZSBlbGVtZW50XG4gICAgICAgIC8vIGluIHRoZSByZXN1bHRzIGJlY2F1c2UgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuc29tZShkaXIgPT4gZGlyLmlzQ29tcG9uZW50KSA/XG4gICAgICAgICAgICB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4ubWF0Y2hlcykgOlxuICAgICAgICAgICAgdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLm1hdGNoZXMsIHN5bWJvbCk7XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRG9tQmluZGluZzoge1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlKFxuICAgICAgICAgICAgbm9kZS5uYW1lLCBzeW1ib2wuaG9zdC50ZW1wbGF0ZU5vZGUsIHN5bWJvbC5ob3N0LmRpcmVjdGl2ZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLmRpcnMpO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkRpcmVjdGl2ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlyZWN0aXZlVHlwZURlZnNGb3JCaW5kaW5nTm9kZShcbiAgICAgIG5vZGU6IFRtcGxBc3ROb2RlfEFTVCwgcGFyZW50OiBUbXBsQXN0Tm9kZXxBU1R8bnVsbCwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEF0dHJpYnV0ZSkgJiYgIShub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUpICYmXG4gICAgICAgICEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEV2ZW50KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAocGFyZW50ID09PSBudWxsIHx8XG4gICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgVG1wbEFzdFRlbXBsYXRlIHx8IHBhcmVudCBpbnN0YW5jZW9mIFRtcGxBc3RFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbCA9XG4gICAgICAgIHRoaXMuY29tcGlsZXIuZ2V0VGVtcGxhdGVUeXBlQ2hlY2tlcigpLmdldFN5bWJvbE9mTm9kZShwYXJlbnQsIGNvbXBvbmVudCk7XG4gICAgaWYgKHRlbXBsYXRlT3JFbGVtZW50U3ltYm9sID09PSBudWxsIHx8XG4gICAgICAgICh0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5raW5kICE9PSBTeW1ib2xLaW5kLlRlbXBsYXRlICYmXG4gICAgICAgICB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5raW5kICE9PSBTeW1ib2xLaW5kLkVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGRpcnMgPVxuICAgICAgICBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlKG5vZGUubmFtZSwgcGFyZW50LCB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5kaXJlY3RpdmVzKTtcbiAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLmRpcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLnN5bWJvbHM6IEhhc1NoaW1Mb2NhdGlvbltdKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgcmV0dXJuIGZsYXRNYXAoc3ltYm9scywgKHtzaGltTG9jYXRpb259KSA9PiB7XG4gICAgICBjb25zdCB7c2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZX0gPSBzaGltTG9jYXRpb247XG4gICAgICByZXR1cm4gdGhpcy50c0xTLmdldFR5cGVEZWZpbml0aW9uQXRQb3NpdGlvbihzaGltUGF0aCwgcG9zaXRpb25JblNoaW1GaWxlKSA/PyBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmaW5pdGlvbk1ldGFBdFBvc2l0aW9uKHt0ZW1wbGF0ZSwgY29tcG9uZW50fTogVGVtcGxhdGVJbmZvLCBwb3NpdGlvbjogbnVtYmVyKTpcbiAgICAgIERlZmluaXRpb25NZXRhfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0QXRQb3NpdGlvbih0ZW1wbGF0ZSwgcG9zaXRpb24pO1xuICAgIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHtub2RlSW5Db250ZXh0LCBwYXJlbnR9ID0gdGFyZ2V0O1xuXG4gICAgY29uc3Qgc3ltYm9sID1cbiAgICAgICAgdGhpcy5jb21waWxlci5nZXRUZW1wbGF0ZVR5cGVDaGVja2VyKCkuZ2V0U3ltYm9sT2ZOb2RlKG5vZGVJbkNvbnRleHQubm9kZSwgY29tcG9uZW50KTtcbiAgICBpZiAoc3ltYm9sID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge25vZGU6IG5vZGVJbkNvbnRleHQubm9kZSwgcGFyZW50LCBzeW1ib2x9O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhbiBBbmd1bGFyLXNwZWNpZmljIGRlZmluaXRpb24gaW4gYSBUeXBlU2NyaXB0IHNvdXJjZSBmaWxlLlxuICovXG5mdW5jdGlvbiBnZXREZWZpbml0aW9uRm9yRXhwcmVzc2lvbkF0UG9zaXRpb24oXG4gICAgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlciwgY29tcGlsZXI6IE5nQ29tcGlsZXIpOiB0cy5EZWZpbml0aW9uSW5mb0FuZEJvdW5kU3BhbnxcbiAgICB1bmRlZmluZWQge1xuICBjb25zdCBzZiA9IGNvbXBpbGVyLmdldE5leHRQcm9ncmFtKCkuZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGlmIChzZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZXhwcmVzc2lvbiA9IGZpbmRUaWdodGVzdE5vZGUoc2YsIHBvc2l0aW9uKTtcbiAgaWYgKGV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjbGFzc0RlY2xhcmF0aW9uID0gZ2V0UGFyZW50Q2xhc3NEZWNsYXJhdGlvbihleHByZXNzaW9uKTtcbiAgaWYgKGNsYXNzRGVjbGFyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb21wb25lbnRSZXNvdXJjZXMgPSBjb21waWxlci5nZXRDb21wb25lbnRSZXNvdXJjZXMoY2xhc3NEZWNsYXJhdGlvbik7XG4gIGlmIChjb21wb25lbnRSZXNvdXJjZXMgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbGxSZXNvdXJjZXMgPSBbLi4uY29tcG9uZW50UmVzb3VyY2VzLnN0eWxlcywgY29tcG9uZW50UmVzb3VyY2VzLnRlbXBsYXRlXTtcblxuICBjb25zdCByZXNvdXJjZUZvckV4cHJlc3Npb24gPSBhbGxSZXNvdXJjZXMuZmluZChyZXNvdXJjZSA9PiByZXNvdXJjZS5leHByZXNzaW9uID09PSBleHByZXNzaW9uKTtcbiAgaWYgKHJlc291cmNlRm9yRXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkIHx8ICFpc0V4dGVybmFsUmVzb3VyY2UocmVzb3VyY2VGb3JFeHByZXNzaW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlRGVmaW5pdGlvbnM6IHRzLkRlZmluaXRpb25JbmZvW10gPSBbe1xuICAgIGtpbmQ6IHRzLlNjcmlwdEVsZW1lbnRLaW5kLmV4dGVybmFsTW9kdWxlTmFtZSxcbiAgICBuYW1lOiByZXNvdXJjZUZvckV4cHJlc3Npb24ucGF0aCxcbiAgICBjb250YWluZXJLaW5kOiB0cy5TY3JpcHRFbGVtZW50S2luZC51bmtub3duLFxuICAgIGNvbnRhaW5lck5hbWU6ICcnLFxuICAgIC8vIFJlYWRpbmcgdGhlIHRlbXBsYXRlIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgcHJvdmlkZSBhIHByZXZpZXcuXG4gICAgLy8gVE9ETyhheWF6aGFmaXopOiBDb25zaWRlciBwcm92aWRpbmcgYW4gYWN0dWFsIHNwYW46XG4gICAgLy8gIDEuIFdlJ3JlIGxpa2VseSB0byByZWFkIHRoZSB0ZW1wbGF0ZSBhbnl3YXlcbiAgICAvLyAgMi4gV2UgY291bGQgc2hvdyBqdXN0IHRoZSBmaXJzdCAxMDAgY2hhcnMgb3Igc29cbiAgICB0ZXh0U3Bhbjoge3N0YXJ0OiAwLCBsZW5ndGg6IDB9LFxuICAgIGZpbGVOYW1lOiByZXNvdXJjZUZvckV4cHJlc3Npb24ucGF0aCxcbiAgfV07XG5cbiAgcmV0dXJuIHtcbiAgICBkZWZpbml0aW9uczogdGVtcGxhdGVEZWZpbml0aW9ucyxcbiAgICB0ZXh0U3Bhbjoge1xuICAgICAgLy8gRXhjbHVkZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHF1b3RlcyBpbiB0aGUgdXJsIHNwYW4uXG4gICAgICBzdGFydDogZXhwcmVzc2lvbi5nZXRTdGFydCgpICsgMSxcbiAgICAgIGxlbmd0aDogZXhwcmVzc2lvbi5nZXRXaWR0aCgpIC0gMixcbiAgICB9LFxuICB9O1xufVxuIl19
346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sYW5ndWFnZS1zZXJ2aWNlL2l2eS9kZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7O0lBRUgsOENBQW9KO0lBRXBKLHFFQUE0RTtJQUM1RSxxRUFBaUs7SUFDakssK0JBQWlDO0lBRWpDLGlGQUFzRTtJQUN0RSxtRUFBdUU7SUFDdkUsNkRBQWlQO0lBWWpQO1FBQ0UsMkJBQTZCLElBQXdCLEVBQW1CLFFBQW9CO1lBQS9ELFNBQUksR0FBSixJQUFJLENBQW9CO1lBQW1CLGFBQVEsR0FBUixRQUFRLENBQVk7UUFBRyxDQUFDO1FBRWhHLHFEQUF5QixHQUF6QixVQUEwQixRQUFnQixFQUFFLFFBQWdCOzs7WUFFMUQsSUFBTSxZQUFZLEdBQUcsaUNBQXlCLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEYsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO2dCQUM5QiwwRkFBMEY7Z0JBQzFGLDBGQUEwRjtnQkFDMUYsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsd0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQy9CLE9BQU87aUJBQ1I7Z0JBQ0QsT0FBTyxvQ0FBb0MsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoRjtZQUNELElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakYsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUNELElBQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7O2dCQUM1QyxLQUE2QixJQUFBLG9CQUFBLGlCQUFBLGVBQWUsQ0FBQSxn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LE9BQU87U0FDUjtRQUVELElBQU0sWUFBWSxvQkFBTyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUUsa0JBQWtCLENBQUMsUUFBUSxFQUFDLENBQUM7UUFFakYsSUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQUEsUUFBUSxJQUFJLE9BQUEsUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQWxDLENBQWtDLENBQUMsQ0FBQztRQUNoRyxJQUFJLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxDQUFDLDZCQUFrQixDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDckYsT0FBTztTQUNSO1FBRUQsSUFBTSxtQkFBbUIsR0FBd0IsQ0FBQztnQkFDaEQsSUFBSSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0I7Z0JBQzdDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO2dCQUNoQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU87Z0JBQzNDLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixpRUFBaUU7Z0JBQ2pFLHNEQUFzRDtnQkFDdEQsK0NBQStDO2dCQUMvQyxtREFBbUQ7Z0JBQ25ELFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQztnQkFDL0IsUUFBUSxFQUFFLHFCQUFxQixDQUFDLElBQUk7YUFDckMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLFdBQVcsRUFBRSxtQkFBbUI7WUFDaEMsUUFBUSxFQUFFO2dCQUNSLHNEQUFzRDtnQkFDdEQsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO2dCQUNoQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7YUFDbEM7U0FDRixDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0FTVCwgVG1wbEFzdEJvdW5kQXR0cmlidXRlLCBUbXBsQXN0Qm91bmRFdmVudCwgVG1wbEFzdEVsZW1lbnQsIFRtcGxBc3ROb2RlLCBUbXBsQXN0VGVtcGxhdGUsIFRtcGxBc3RUZXh0QXR0cmlidXRlfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQge05nQ29tcGlsZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvY29yZSc7XG5pbXBvcnQge2lzRXh0ZXJuYWxSZXNvdXJjZX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXItY2xpL3NyYy9uZ3RzYy9tZXRhZGF0YSc7XG5pbXBvcnQge0RpcmVjdGl2ZVN5bWJvbCwgRG9tQmluZGluZ1N5bWJvbCwgRWxlbWVudFN5bWJvbCwgU2hpbUxvY2F0aW9uLCBTeW1ib2wsIFN5bWJvbEtpbmQsIFRlbXBsYXRlU3ltYm9sfSBmcm9tICdAYW5ndWxhci9jb21waWxlci1jbGkvc3JjL25ndHNjL3R5cGVjaGVjay9hcGknO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7Z2V0VGFyZ2V0QXRQb3NpdGlvbiwgVGFyZ2V0Tm9kZUtpbmR9IGZyb20gJy4vdGVtcGxhdGVfdGFyZ2V0JztcbmltcG9ydCB7ZmluZFRpZ2h0ZXN0Tm9kZSwgZ2V0UGFyZW50Q2xhc3NEZWNsYXJhdGlvbn0gZnJvbSAnLi90c191dGlscyc7XG5pbXBvcnQge2ZsYXRNYXAsIGdldERpcmVjdGl2ZU1hdGNoZXNGb3JBdHRyaWJ1dGUsIGdldERpcmVjdGl2ZU1hdGNoZXNGb3JFbGVtZW50VGFnLCBnZXRUZW1wbGF0ZUluZm9BdFBvc2l0aW9uLCBnZXRUZW1wbGF0ZUxvY2F0aW9uRnJvbVNoaW1Mb2NhdGlvbiwgZ2V0VGV4dFNwYW5PZk5vZGUsIGlzRG9sbGFyRXZlbnQsIGlzVHlwZVNjcmlwdEZpbGUsIFRlbXBsYXRlSW5mbywgdG9UZXh0U3Bhbn0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBEZWZpbml0aW9uTWV0YSB7XG4gIG5vZGU6IEFTVHxUbXBsQXN0Tm9kZTtcbiAgcGFyZW50OiBBU1R8VG1wbEFzdE5vZGV8bnVsbDtcbiAgc3ltYm9sOiBTeW1ib2w7XG59XG5cbmludGVyZmFjZSBIYXNTaGltTG9jYXRpb24ge1xuICBzaGltTG9jYXRpb246IFNoaW1Mb2NhdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmluaXRpb25CdWlsZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0c0xTOiB0cy5MYW5ndWFnZVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgY29tcGlsZXI6IE5nQ29tcGlsZXIpIHt9XG5cbiAgZ2V0RGVmaW5pdGlvbkFuZEJvdW5kU3BhbihmaWxlTmFtZTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogdHMuRGVmaW5pdGlvbkluZm9BbmRCb3VuZFNwYW5cbiAgICAgIHx1bmRlZmluZWQge1xuICAgIGNvbnN0IHRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mb0F0UG9zaXRpb24oZmlsZU5hbWUsIHBvc2l0aW9uLCB0aGlzLmNvbXBpbGVyKTtcbiAgICBpZiAodGVtcGxhdGVJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHRlbXBsYXRlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gSWYgd2UgYXJlIGluIGEgVFMgZmlsZSwgaW5zdGVhZFxuICAgICAgLy8gYXR0ZW1wdCB0byBnZXQgYW4gQW5ndWxhciBkZWZpbml0aW9uIGF0IHRoZSBsb2NhdGlvbiBpbnNpZGUgYSBUUyBmaWxlIChleGFtcGxlcyBvZiB0aGlzXG4gICAgICAvLyB3b3VsZCBiZSB0ZW1wbGF0ZVVybCBvciBhIHVybCBpbiBzdHlsZVVybHMpLlxuICAgICAgaWYgKCFpc1R5cGVTY3JpcHRGaWxlKGZpbGVOYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0RGVmaW5pdGlvbkZvckV4cHJlc3Npb25BdFBvc2l0aW9uKGZpbGVOYW1lLCBwb3NpdGlvbiwgdGhpcy5jb21waWxlcik7XG4gICAgfVxuICAgIGNvbnN0IGRlZmluaXRpb25NZXRhcyA9IHRoaXMuZ2V0RGVmaW5pdGlvbk1ldGFBdFBvc2l0aW9uKHRlbXBsYXRlSW5mbywgcG9zaXRpb24pO1xuICAgIGlmIChkZWZpbml0aW9uTWV0YXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVmaW5pdGlvbnM6IHRzLkRlZmluaXRpb25JbmZvW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb25NZXRhIG9mIGRlZmluaXRpb25NZXRhcykge1xuICAgICAgLy8gVGhlIGAkZXZlbnRgIG9mIGV2ZW50IGhhbmRsZXJzIHdvdWxkIHBvaW50IHRvIHRoZSAkZXZlbnQgcGFyYW1ldGVyIGluIHRoZSBzaGltIGZpbGUsIGFzIGluXG4gICAgICAvLyBgX291dHB1dEhlbHBlcihfdDNbXCJ4XCJdKS5zdWJzY3JpYmUoZnVuY3Rpb24gKCRldmVudCk6IGFueSB7ICRldmVudCB9KSA7YFxuICAgICAgLy8gSWYgd2Ugd2FudGVkIHRvIHJldHVybiBzb21ldGhpbmcgZm9yIHRoaXMsIGl0IHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHNvbWV0aGluZyBsaWtlXG4gICAgICAvLyBgZ2V0VHlwZURlZmluaXRpb25gLlxuICAgICAgaWYgKGlzRG9sbGFyRXZlbnQoZGVmaW5pdGlvbk1ldGEubm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGRlZmluaXRpb25zLnB1c2goXG4gICAgICAgICAgLi4uKHRoaXMuZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2woey4uLmRlZmluaXRpb25NZXRhLCAuLi50ZW1wbGF0ZUluZm99KSA/PyBbXSkpO1xuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtkZWZpbml0aW9ucywgdGV4dFNwYW46IGdldFRleHRTcGFuT2ZOb2RlKGRlZmluaXRpb25NZXRhc1swXS5ub2RlKX07XG4gIH1cblxuICBwcml2YXRlIGdldERlZmluaXRpb25zRm9yU3ltYm9sKHtzeW1ib2wsIG5vZGUsIHBhcmVudCwgY29tcG9uZW50fTogRGVmaW5pdGlvbk1ldGEmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJbmZvKTogcmVhZG9ubHkgdHMuRGVmaW5pdGlvbkluZm9bXXx1bmRlZmluZWQge1xuICAgIHN3aXRjaCAoc3ltYm9sLmtpbmQpIHtcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5EaXJlY3RpdmU6XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5UZW1wbGF0ZTpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5Eb21CaW5kaW5nOlxuICAgICAgICAvLyBUaG91Z2ggaXQgaXMgZ2VuZXJhbGx5IG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBhYm92ZSBzeW1ib2wgZGVmaW5pdGlvbnMgdG8gYmVcbiAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIFwidHlwZSBkZWZpbml0aW9uc1wiIHNpbmNlIHRoZSBsb2NhdGlvbiBpbiB0aGUgdGVtcGxhdGUgaXMgdGhlXG4gICAgICAgIC8vIGFjdHVhbCBkZWZpbml0aW9uIGxvY2F0aW9uLCB0aGUgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZSB3b3VsZCBiZSB0byBhbGxvd1xuICAgICAgICAvLyBMUyB1c2VycyB0byBcImdvIHRvIGRlZmluaXRpb25cIiBvbiBhbiBpdGVtIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IG1hcHMgdG8gYSBjbGFzcyBhbmQgYmVcbiAgICAgICAgLy8gdGFrZW4gdG8gdGhlIGRpcmVjdGl2ZSBvciBIVE1MIGNsYXNzLlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JUZW1wbGF0ZUluc3RhbmNlKHN5bWJvbCwgbm9kZSk7XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuUGlwZToge1xuICAgICAgICBpZiAoc3ltYm9sLnRzU3ltYm9sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2xzKHN5bWJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYHRzLlN5bWJvbGAgZm9yIHRoZSBwaXBlIHRyYW5zZm9ybSwgd2Ugd2FudCB0byByZXR1cm4gdGhlXG4gICAgICAgICAgLy8gdHlwZSBkZWZpbml0aW9uICh0aGUgcGlwZSBjbGFzcykuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wuY2xhc3NTeW1ib2wpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuT3V0cHV0OlxuICAgICAgY2FzZSBTeW1ib2xLaW5kLklucHV0OiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdEZWZzID0gdGhpcy5nZXREZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4uc3ltYm9sLmJpbmRpbmdzKTtcbiAgICAgICAgLy8gQWxzbyBhdHRlbXB0IHRvIGdldCBkaXJlY3RpdmUgbWF0Y2hlcyBmb3IgdGhlIGlucHV0IG5hbWUuIElmIHRoZXJlIGlzIGEgZGlyZWN0aXZlIHRoYXRcbiAgICAgICAgLy8gaGFzIHRoZSBpbnB1dCBuYW1lIGFzIHBhcnQgb2YgdGhlIHNlbGVjdG9yLCB3ZSB3YW50IHRvIHJldHVybiB0aGF0IGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlZnMgPSB0aGlzLmdldERpcmVjdGl2ZVR5cGVEZWZzRm9yQmluZGluZ05vZGUobm9kZSwgcGFyZW50LCBjb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gWy4uLmJpbmRpbmdEZWZzLCAuLi5kaXJlY3RpdmVEZWZzXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgU3ltYm9sS2luZC5WYXJpYWJsZTpcbiAgICAgIGNhc2UgU3ltYm9sS2luZC5SZWZlcmVuY2U6IHtcbiAgICAgICAgY29uc3QgZGVmaW5pdGlvbnM6IHRzLkRlZmluaXRpb25JbmZvW10gPSBbXTtcbiAgICAgICAgaWYgKHN5bWJvbC5kZWNsYXJhdGlvbiAhPT0gbm9kZSkge1xuICAgICAgICAgIGNvbnN0IHNoaW1Mb2NhdGlvbiA9IHN5bWJvbC5raW5kID09PSBTeW1ib2xLaW5kLlZhcmlhYmxlID8gc3ltYm9sLmxvY2FsVmFyTG9jYXRpb24gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLnJlZmVyZW5jZVZhckxvY2F0aW9uO1xuICAgICAgICAgIGNvbnN0IG1hcHBpbmcgPSBnZXRUZW1wbGF0ZUxvY2F0aW9uRnJvbVNoaW1Mb2NhdGlvbihcbiAgICAgICAgICAgICAgdGhpcy5jb21waWxlci5nZXRUZW1wbGF0ZVR5cGVDaGVja2VyKCksIHNoaW1Mb2NhdGlvbi5zaGltUGF0aCxcbiAgICAgICAgICAgICAgc2hpbUxvY2F0aW9uLnBvc2l0aW9uSW5TaGltRmlsZSk7XG4gICAgICAgICAgaWYgKG1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlZmluaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBzeW1ib2wuZGVjbGFyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgY29udGFpbmVyTmFtZTogJycsXG4gICAgICAgICAgICAgIGNvbnRhaW5lcktpbmQ6IHRzLlNjcmlwdEVsZW1lbnRLaW5kLnVua25vd24sXG4gICAgICAgICAgICAgIGtpbmQ6IHRzLlNjcmlwdEVsZW1lbnRLaW5kLnZhcmlhYmxlRWxlbWVudCxcbiAgICAgICAgICAgICAgdGV4dFNwYW46IGdldFRleHRTcGFuT2ZOb2RlKHN5bWJvbC5kZWNsYXJhdGlvbiksXG4gICAgICAgICAgICAgIGNvbnRleHRTcGFuOiB0b1RleHRTcGFuKHN5bWJvbC5kZWNsYXJhdGlvbi5zb3VyY2VTcGFuKSxcbiAgICAgICAgICAgICAgZmlsZU5hbWU6IG1hcHBpbmcudGVtcGxhdGVVcmwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5bWJvbC5raW5kID09PSBTeW1ib2xLaW5kLlZhcmlhYmxlKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgLi4udGhpcy5nZXREZWZpbml0aW9uc0ZvclN5bWJvbHMoe3NoaW1Mb2NhdGlvbjogc3ltYm9sLmluaXRpYWxpemVyTG9jYXRpb259KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25zO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkV4cHJlc3Npb246IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmaW5pdGlvbnNGb3JTeW1ib2xzKHN5bWJvbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4uc3ltYm9sczogSGFzU2hpbUxvY2F0aW9uW10pOiB0cy5EZWZpbml0aW9uSW5mb1tdIHtcbiAgICByZXR1cm4gZmxhdE1hcChzeW1ib2xzLCAoe3NoaW1Mb2NhdGlvbn0pID0+IHtcbiAgICAgIGNvbnN0IHtzaGltUGF0aCwgcG9zaXRpb25JblNoaW1GaWxlfSA9IHNoaW1Mb2NhdGlvbjtcbiAgICAgIHJldHVybiB0aGlzLnRzTFMuZ2V0RGVmaW5pdGlvbkF0UG9zaXRpb24oc2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZSkgPz8gW107XG4gICAgfSk7XG4gIH1cblxuICBnZXRUeXBlRGVmaW5pdGlvbnNBdFBvc2l0aW9uKGZpbGVOYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOlxuICAgICAgcmVhZG9ubHkgdHMuRGVmaW5pdGlvbkluZm9bXXx1bmRlZmluZWQge1xuICAgIGNvbnN0IHRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mb0F0UG9zaXRpb24oZmlsZU5hbWUsIHBvc2l0aW9uLCB0aGlzLmNvbXBpbGVyKTtcbiAgICBpZiAodGVtcGxhdGVJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVmaW5pdGlvbk1ldGFzID0gdGhpcy5nZXREZWZpbml0aW9uTWV0YUF0UG9zaXRpb24odGVtcGxhdGVJbmZvLCBwb3NpdGlvbik7XG4gICAgaWYgKGRlZmluaXRpb25NZXRhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmluaXRpb25zOiB0cy5EZWZpbml0aW9uSW5mb1tdID0gW107XG4gICAgZm9yIChjb25zdCB7c3ltYm9sLCBub2RlLCBwYXJlbnR9IG9mIGRlZmluaXRpb25NZXRhcykge1xuICAgICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRGlyZWN0aXZlOlxuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRG9tQmluZGluZzpcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLkVsZW1lbnQ6XG4gICAgICAgIGNhc2UgU3ltYm9sS2luZC5UZW1wbGF0ZTpcbiAgICAgICAgICBkZWZpbml0aW9ucy5wdXNoKC4uLnRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yVGVtcGxhdGVJbnN0YW5jZShzeW1ib2wsIG5vZGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLk91dHB1dDpcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLklucHV0OiB7XG4gICAgICAgICAgY29uc3QgYmluZGluZ0RlZnMgPSB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4uc3ltYm9sLmJpbmRpbmdzKTtcbiAgICAgICAgICBkZWZpbml0aW9ucy5wdXNoKC4uLmJpbmRpbmdEZWZzKTtcbiAgICAgICAgICAvLyBBbHNvIGF0dGVtcHQgdG8gZ2V0IGRpcmVjdGl2ZSBtYXRjaGVzIGZvciB0aGUgaW5wdXQgbmFtZS4gSWYgdGhlcmUgaXMgYSBkaXJlY3RpdmUgdGhhdFxuICAgICAgICAgIC8vIGhhcyB0aGUgaW5wdXQgbmFtZSBhcyBwYXJ0IG9mIHRoZSBzZWxlY3Rvciwgd2Ugd2FudCB0byByZXR1cm4gdGhhdCBhcyB3ZWxsLlxuICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlZnMgPVxuICAgICAgICAgICAgICB0aGlzLmdldERpcmVjdGl2ZVR5cGVEZWZzRm9yQmluZGluZ05vZGUobm9kZSwgcGFyZW50LCB0ZW1wbGF0ZUluZm8uY29tcG9uZW50KTtcbiAgICAgICAgICBkZWZpbml0aW9ucy5wdXNoKC4uLmRpcmVjdGl2ZURlZnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgU3ltYm9sS2luZC5QaXBlOiB7XG4gICAgICAgICAgaWYgKHN5bWJvbC50c1N5bWJvbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZGVmaW5pdGlvbnMucHVzaCguLi50aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoc3ltYm9sKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGB0cy5TeW1ib2xgIGZvciB0aGUgcGlwZSB0cmFuc2Zvcm0sIHdlIHdhbnQgdG8gcmV0dXJuIHRoZVxuICAgICAgICAgICAgLy8gdHlwZSBkZWZpbml0aW9uICh0aGUgcGlwZSBjbGFzcykuXG4gICAgICAgICAgICBkZWZpbml0aW9ucy5wdXNoKC4uLnRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wuY2xhc3NTeW1ib2wpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLlJlZmVyZW5jZTpcbiAgICAgICAgICBkZWZpbml0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAuLi50aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoe3NoaW1Mb2NhdGlvbjogc3ltYm9sLnRhcmdldExvY2F0aW9ufSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bWJvbEtpbmQuRXhwcmVzc2lvbjpcbiAgICAgICAgICBkZWZpbml0aW9ucy5wdXNoKC4uLnRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW1ib2xLaW5kLlZhcmlhYmxlOiB7XG4gICAgICAgICAgZGVmaW5pdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgLi4udGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKHtzaGltTG9jYXRpb246IHN5bWJvbC5pbml0aWFsaXplckxvY2F0aW9ufSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlRGVmaW5pdGlvbnNGb3JUZW1wbGF0ZUluc3RhbmNlKFxuICAgICAgc3ltYm9sOiBUZW1wbGF0ZVN5bWJvbHxFbGVtZW50U3ltYm9sfERvbUJpbmRpbmdTeW1ib2x8RGlyZWN0aXZlU3ltYm9sLFxuICAgICAgbm9kZTogQVNUfFRtcGxBc3ROb2RlKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgc3dpdGNoIChzeW1ib2wua2luZCkge1xuICAgICAgY2FzZSBTeW1ib2xLaW5kLlRlbXBsYXRlOiB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yRWxlbWVudFRhZyhzeW1ib2wudGVtcGxhdGVOb2RlLCBzeW1ib2wuZGlyZWN0aXZlcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4ubWF0Y2hlcyk7XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRWxlbWVudDoge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gZ2V0RGlyZWN0aXZlTWF0Y2hlc0ZvckVsZW1lbnRUYWcoc3ltYm9sLnRlbXBsYXRlTm9kZSwgc3ltYm9sLmRpcmVjdGl2ZXMpO1xuICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGRpcmVjdGl2ZSBtYXRjaGVzIGlzIGEgY29tcG9uZW50LCB3ZSBzaG91bGQgbm90IGluY2x1ZGUgdGhlIG5hdGl2ZSBlbGVtZW50XG4gICAgICAgIC8vIGluIHRoZSByZXN1bHRzIGJlY2F1c2UgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuc29tZShkaXIgPT4gZGlyLmlzQ29tcG9uZW50KSA/XG4gICAgICAgICAgICB0aGlzLmdldFR5cGVEZWZpbml0aW9uc0ZvclN5bWJvbHMoLi4ubWF0Y2hlcykgOlxuICAgICAgICAgICAgdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLm1hdGNoZXMsIHN5bWJvbCk7XG4gICAgICB9XG4gICAgICBjYXNlIFN5bWJvbEtpbmQuRG9tQmluZGluZzoge1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlKFxuICAgICAgICAgICAgbm9kZS5uYW1lLCBzeW1ib2wuaG9zdC50ZW1wbGF0ZU5vZGUsIHN5bWJvbC5ob3N0LmRpcmVjdGl2ZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLmRpcnMpO1xuICAgICAgfVxuICAgICAgY2FzZSBTeW1ib2xLaW5kLkRpcmVjdGl2ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb25zRm9yU3ltYm9scyhzeW1ib2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlyZWN0aXZlVHlwZURlZnNGb3JCaW5kaW5nTm9kZShcbiAgICAgIG5vZGU6IFRtcGxBc3ROb2RlfEFTVCwgcGFyZW50OiBUbXBsQXN0Tm9kZXxBU1R8bnVsbCwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEF0dHJpYnV0ZSkgJiYgIShub2RlIGluc3RhbmNlb2YgVG1wbEFzdFRleHRBdHRyaWJ1dGUpICYmXG4gICAgICAgICEobm9kZSBpbnN0YW5jZW9mIFRtcGxBc3RCb3VuZEV2ZW50KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAocGFyZW50ID09PSBudWxsIHx8XG4gICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgVG1wbEFzdFRlbXBsYXRlIHx8IHBhcmVudCBpbnN0YW5jZW9mIFRtcGxBc3RFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbCA9XG4gICAgICAgIHRoaXMuY29tcGlsZXIuZ2V0VGVtcGxhdGVUeXBlQ2hlY2tlcigpLmdldFN5bWJvbE9mTm9kZShwYXJlbnQsIGNvbXBvbmVudCk7XG4gICAgaWYgKHRlbXBsYXRlT3JFbGVtZW50U3ltYm9sID09PSBudWxsIHx8XG4gICAgICAgICh0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5raW5kICE9PSBTeW1ib2xLaW5kLlRlbXBsYXRlICYmXG4gICAgICAgICB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5raW5kICE9PSBTeW1ib2xLaW5kLkVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGRpcnMgPVxuICAgICAgICBnZXREaXJlY3RpdmVNYXRjaGVzRm9yQXR0cmlidXRlKG5vZGUubmFtZSwgcGFyZW50LCB0ZW1wbGF0ZU9yRWxlbWVudFN5bWJvbC5kaXJlY3RpdmVzKTtcbiAgICByZXR1cm4gdGhpcy5nZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLmRpcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlRGVmaW5pdGlvbnNGb3JTeW1ib2xzKC4uLnN5bWJvbHM6IEhhc1NoaW1Mb2NhdGlvbltdKTogdHMuRGVmaW5pdGlvbkluZm9bXSB7XG4gICAgcmV0dXJuIGZsYXRNYXAoc3ltYm9scywgKHtzaGltTG9jYXRpb259KSA9PiB7XG4gICAgICBjb25zdCB7c2hpbVBhdGgsIHBvc2l0aW9uSW5TaGltRmlsZX0gPSBzaGltTG9jYXRpb247XG4gICAgICByZXR1cm4gdGhpcy50c0xTLmdldFR5cGVEZWZpbml0aW9uQXRQb3NpdGlvbihzaGltUGF0aCwgcG9zaXRpb25JblNoaW1GaWxlKSA/PyBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmaW5pdGlvbk1ldGFBdFBvc2l0aW9uKHt0ZW1wbGF0ZSwgY29tcG9uZW50fTogVGVtcGxhdGVJbmZvLCBwb3NpdGlvbjogbnVtYmVyKTpcbiAgICAgIERlZmluaXRpb25NZXRhW118dW5kZWZpbmVkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXRBdFBvc2l0aW9uKHRlbXBsYXRlLCBwb3NpdGlvbik7XG4gICAgaWYgKHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qge2NvbnRleHQsIHBhcmVudH0gPSB0YXJnZXQ7XG5cbiAgICBjb25zdCBub2RlcyA9XG4gICAgICAgIGNvbnRleHQua2luZCA9PT0gVGFyZ2V0Tm9kZUtpbmQuVHdvV2F5QmluZGluZ0NvbnRleHQgPyBjb250ZXh0Lm5vZGVzIDogW2NvbnRleHQubm9kZV07XG5cblxuICAgIGNvbnN0IGRlZmluaXRpb25NZXRhczogRGVmaW5pdGlvbk1ldGFbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5jb21waWxlci5nZXRUZW1wbGF0ZVR5cGVDaGVja2VyKCkuZ2V0U3ltYm9sT2ZOb2RlKG5vZGUsIGNvbXBvbmVudCk7XG4gICAgICBpZiAoc3ltYm9sID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVmaW5pdGlvbk1ldGFzLnB1c2goe25vZGUsIHBhcmVudCwgc3ltYm9sfSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uTWV0YXMubGVuZ3RoID4gMCA/IGRlZmluaXRpb25NZXRhcyA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYW4gQW5ndWxhci1zcGVjaWZpYyBkZWZpbml0aW9uIGluIGEgVHlwZVNjcmlwdCBzb3VyY2UgZmlsZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGVmaW5pdGlvbkZvckV4cHJlc3Npb25BdFBvc2l0aW9uKFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIsIGNvbXBpbGVyOiBOZ0NvbXBpbGVyKTogdHMuRGVmaW5pdGlvbkluZm9BbmRCb3VuZFNwYW58XG4gICAgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2YgPSBjb21waWxlci5nZXROZXh0UHJvZ3JhbSgpLmdldFNvdXJjZUZpbGUoZmlsZU5hbWUpO1xuICBpZiAoc2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4cHJlc3Npb24gPSBmaW5kVGlnaHRlc3ROb2RlKHNmLCBwb3NpdGlvbik7XG4gIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY2xhc3NEZWNsYXJhdGlvbiA9IGdldFBhcmVudENsYXNzRGVjbGFyYXRpb24oZXhwcmVzc2lvbik7XG4gIGlmIChjbGFzc0RlY2xhcmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY29tcG9uZW50UmVzb3VyY2VzID0gY29tcGlsZXIuZ2V0Q29tcG9uZW50UmVzb3VyY2VzKGNsYXNzRGVjbGFyYXRpb24pO1xuICBpZiAoY29tcG9uZW50UmVzb3VyY2VzID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWxsUmVzb3VyY2VzID0gWy4uLmNvbXBvbmVudFJlc291cmNlcy5zdHlsZXMsIGNvbXBvbmVudFJlc291cmNlcy50ZW1wbGF0ZV07XG5cbiAgY29uc3QgcmVzb3VyY2VGb3JFeHByZXNzaW9uID0gYWxsUmVzb3VyY2VzLmZpbmQocmVzb3VyY2UgPT4gcmVzb3VyY2UuZXhwcmVzc2lvbiA9PT0gZXhwcmVzc2lvbik7XG4gIGlmIChyZXNvdXJjZUZvckV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCB8fCAhaXNFeHRlcm5hbFJlc291cmNlKHJlc291cmNlRm9yRXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZW1wbGF0ZURlZmluaXRpb25zOiB0cy5EZWZpbml0aW9uSW5mb1tdID0gW3tcbiAgICBraW5kOiB0cy5TY3JpcHRFbGVtZW50S2luZC5leHRlcm5hbE1vZHVsZU5hbWUsXG4gICAgbmFtZTogcmVzb3VyY2VGb3JFeHByZXNzaW9uLnBhdGgsXG4gICAgY29udGFpbmVyS2luZDogdHMuU2NyaXB0RWxlbWVudEtpbmQudW5rbm93bixcbiAgICBjb250YWluZXJOYW1lOiAnJyxcbiAgICAvLyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZSBpcyBleHBlbnNpdmUsIHNvIGRvbid0IHByb3ZpZGUgYSBwcmV2aWV3LlxuICAgIC8vIFRPRE8oYXlhemhhZml6KTogQ29uc2lkZXIgcHJvdmlkaW5nIGFuIGFjdHVhbCBzcGFuOlxuICAgIC8vICAxLiBXZSdyZSBsaWtlbHkgdG8gcmVhZCB0aGUgdGVtcGxhdGUgYW55d2F5XG4gICAgLy8gIDIuIFdlIGNvdWxkIHNob3cganVzdCB0aGUgZmlyc3QgMTAwIGNoYXJzIG9yIHNvXG4gICAgdGV4dFNwYW46IHtzdGFydDogMCwgbGVuZ3RoOiAwfSxcbiAgICBmaWxlTmFtZTogcmVzb3VyY2VGb3JFeHByZXNzaW9uLnBhdGgsXG4gIH1dO1xuXG4gIHJldHVybiB7XG4gICAgZGVmaW5pdGlvbnM6IHRlbXBsYXRlRGVmaW5pdGlvbnMsXG4gICAgdGV4dFNwYW46IHtcbiAgICAgIC8vIEV4Y2x1ZGUgb3BlbmluZyBhbmQgY2xvc2luZyBxdW90ZXMgaW4gdGhlIHVybCBzcGFuLlxuICAgICAgc3RhcnQ6IGV4cHJlc3Npb24uZ2V0U3RhcnQoKSArIDEsXG4gICAgICBsZW5ndGg6IGV4cHJlc3Npb24uZ2V0V2lkdGgoKSAtIDIsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -10,6 +10,7 @@ import { CompilerOptions } from '@angular/compiler-cli';
10
10
  import * as ts from 'typescript/lib/tsserverlibrary';
11
11
  import { CompilerFactory } from './compiler_factory';
12
12
  export declare class LanguageService {
13
+ private readonly project;
13
14
  private readonly tsLS;
14
15
  private options;
15
16
  readonly compilerFactory: CompilerFactory;
@@ -27,5 +28,6 @@ export declare class LanguageService {
27
28
  getCompletionsAtPosition(fileName: string, position: number, options: ts.GetCompletionsAtPositionOptions | undefined): ts.WithMetadata<ts.CompletionInfo> | undefined;
28
29
  getCompletionEntryDetails(fileName: string, position: number, entryName: string, formatOptions: ts.FormatCodeOptions | ts.FormatCodeSettings | undefined, preferences: ts.UserPreferences | undefined): ts.CompletionEntryDetails | undefined;
29
30
  getCompletionEntrySymbol(fileName: string, position: number, entryName: string): ts.Symbol | undefined;
31
+ getCompilerOptionsDiagnostics(): ts.Diagnostic[];
30
32
  private watchConfigFile;
31
33
  }