@decaf-ts/injectable-decorators 1.6.0 → 1.6.2
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/LICENSE.md +21 -157
- package/README.md +272 -2
- package/dist/injectable-decorators.cjs +291 -136
- package/dist/injectable-decorators.esm.cjs +291 -136
- package/lib/Injectables.cjs +76 -18
- package/lib/Injectables.d.ts +75 -17
- package/lib/constants.cjs +8 -7
- package/lib/constants.d.ts +7 -6
- package/lib/decorators.cjs +158 -98
- package/lib/decorators.d.ts +80 -19
- package/lib/esm/Injectables.d.ts +75 -17
- package/lib/esm/Injectables.js +77 -19
- package/lib/esm/constants.d.ts +7 -6
- package/lib/esm/constants.js +8 -7
- package/lib/esm/decorators.d.ts +80 -19
- package/lib/esm/decorators.js +159 -98
- package/lib/esm/index.d.ts +6 -8
- package/lib/esm/index.js +12 -14
- package/lib/esm/registry.d.ts +68 -21
- package/lib/esm/registry.js +39 -2
- package/lib/esm/utils.d.ts +9 -9
- package/lib/esm/utils.js +10 -10
- package/lib/index.cjs +7 -9
- package/lib/index.d.ts +6 -8
- package/lib/registry.cjs +39 -2
- package/lib/registry.d.ts +68 -21
- package/lib/utils.cjs +10 -10
- package/lib/utils.d.ts +9 -9
- package/package.json +4 -4
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
})(this, (function (exports) { 'use strict';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* @
|
|
9
|
-
* @
|
|
8
|
+
* @description Constants used for reflection metadata keys in the dependency injection system.
|
|
9
|
+
* @summary Injectables Reflection keys used to store and retrieve metadata about injectable classes and properties.
|
|
10
10
|
*
|
|
11
|
-
* @property {string} REFLECT Reflection injectables base key
|
|
12
|
-
* @property {string} INJECTABLE Reflection injectable
|
|
13
|
-
* @property {string} INJECT Reflection
|
|
11
|
+
* @property {string} REFLECT Reflection injectables base key prefix for all metadata keys
|
|
12
|
+
* @property {string} INJECTABLE Reflection key suffix for marking a class as injectable
|
|
13
|
+
* @property {string} INJECT Reflection key suffix for marking a property for injection
|
|
14
14
|
*
|
|
15
|
-
* @
|
|
15
|
+
* @const InjectablesKeys
|
|
16
|
+
* @memberOf module:injectable-decorators
|
|
16
17
|
*/
|
|
17
18
|
const InjectablesKeys = {
|
|
18
19
|
REFLECT: "inject.db.",
|
|
@@ -21,9 +22,46 @@
|
|
|
21
22
|
};
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
|
-
* @
|
|
25
|
+
* @description Default implementation of the InjectablesRegistry interface.
|
|
26
|
+
* @summary Holds the various {@link Injectable}s in a cache and provides methods to register, retrieve, and build them.
|
|
27
|
+
* @template T Type parameter used in the class methods
|
|
28
|
+
*
|
|
25
29
|
* @class InjectableRegistryImp
|
|
26
30
|
* @implements InjectablesRegistry
|
|
31
|
+
*
|
|
32
|
+
* @memberOf module:injectable-decorators
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Create a new registry
|
|
36
|
+
* const registry = new InjectableRegistryImp();
|
|
37
|
+
*
|
|
38
|
+
* // Register a class
|
|
39
|
+
* class MyService {
|
|
40
|
+
* doSomething() {
|
|
41
|
+
* return 'Hello World';
|
|
42
|
+
* }
|
|
43
|
+
* }
|
|
44
|
+
* registry.register(MyService, 'MyService', true);
|
|
45
|
+
*
|
|
46
|
+
* // Get the instance
|
|
47
|
+
* const service = registry.get('MyService');
|
|
48
|
+
* service.doSomething(); // 'Hello World'
|
|
49
|
+
*
|
|
50
|
+
* @mermaid
|
|
51
|
+
* sequenceDiagram
|
|
52
|
+
* participant Client
|
|
53
|
+
* participant Registry
|
|
54
|
+
*
|
|
55
|
+
* Client->>Registry: register(MyService)
|
|
56
|
+
* Registry->>Registry: Store in cache
|
|
57
|
+
*
|
|
58
|
+
* Client->>Registry: get("MyService")
|
|
59
|
+
* alt Instance exists and is singleton
|
|
60
|
+
* Registry-->>Client: Return cached instance
|
|
61
|
+
* else No instance or not singleton
|
|
62
|
+
* Registry->>Registry: build(name)
|
|
63
|
+
* Registry-->>Client: Return new instance
|
|
64
|
+
* end
|
|
27
65
|
*/
|
|
28
66
|
class InjectableRegistryImp {
|
|
29
67
|
constructor() {
|
|
@@ -80,59 +118,117 @@
|
|
|
80
118
|
}
|
|
81
119
|
|
|
82
120
|
/**
|
|
83
|
-
* @
|
|
121
|
+
* @description Central registry for managing injectable dependencies.
|
|
122
|
+
* @summary Static class holding the access to the injectables functions. Provides methods for registering,
|
|
123
|
+
* retrieving, and building injectable objects.
|
|
124
|
+
* @template T Type of the injectable object
|
|
84
125
|
*
|
|
85
126
|
* @class Injectables
|
|
86
|
-
*
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* // Define an injectable class
|
|
130
|
+
* @injectable()
|
|
131
|
+
* class MyService {
|
|
132
|
+
* doSomething() {
|
|
133
|
+
* return 'Hello World';
|
|
134
|
+
* }
|
|
135
|
+
* }
|
|
136
|
+
*
|
|
137
|
+
* // Inject the service into another class
|
|
138
|
+
* class MyComponent {
|
|
139
|
+
* @inject()
|
|
140
|
+
* private service!: MyService;
|
|
141
|
+
*
|
|
142
|
+
* useService() {
|
|
143
|
+
* return this.service.doSomething();
|
|
144
|
+
* }
|
|
145
|
+
* }
|
|
146
|
+
*
|
|
147
|
+
* @mermaid
|
|
148
|
+
* sequenceDiagram
|
|
149
|
+
* participant Client
|
|
150
|
+
* participant Injectables
|
|
151
|
+
* participant Registry
|
|
152
|
+
*
|
|
153
|
+
* Client->>Injectables: register(MyService)
|
|
154
|
+
* Injectables->>Registry: register(MyService)
|
|
155
|
+
* Registry-->>Injectables: void
|
|
156
|
+
*
|
|
157
|
+
* Client->>Injectables: get("MyService")
|
|
158
|
+
* Injectables->>Registry: get("MyService")
|
|
159
|
+
* Registry-->>Injectables: MyService instance
|
|
160
|
+
* Injectables-->>Client: MyService instance
|
|
87
161
|
*/
|
|
88
162
|
class Injectables {
|
|
89
163
|
static { this.actingInjectablesRegistry = undefined; }
|
|
90
164
|
constructor() { }
|
|
91
165
|
/**
|
|
92
|
-
* @
|
|
93
|
-
* @
|
|
94
|
-
*
|
|
166
|
+
* @description Fetches an injectable instance by its registered name.
|
|
167
|
+
* @summary Retrieves the named {@link Injectable} from the registry. If the injectable is a singleton,
|
|
168
|
+
* returns the existing instance. Otherwise, creates a new instance.
|
|
169
|
+
* @template T Type of the injectable object to retrieve
|
|
170
|
+
* @param {string} name The registered name of the injectable to retrieve
|
|
171
|
+
* @param {any[]} args Constructor arguments to pass when instantiating the injectable
|
|
172
|
+
* @return {Injectable<T> | undefined} The injectable instance or undefined if not found
|
|
95
173
|
*/
|
|
96
174
|
static get(name, ...args) {
|
|
97
175
|
return Injectables.getRegistry().get(name, ...args);
|
|
98
176
|
}
|
|
99
177
|
/**
|
|
100
|
-
* @
|
|
101
|
-
* @
|
|
102
|
-
* @
|
|
103
|
-
*
|
|
178
|
+
* @description Adds a class or object to the injectable registry.
|
|
179
|
+
* @summary Registers an injectable constructor or instance with the registry, making it available for injection.
|
|
180
|
+
* @template T Type of the injectable object to register
|
|
181
|
+
* @param {Injectable<T>} constructor The class constructor or object instance to register
|
|
182
|
+
* @param {any[]} args Additional arguments for registration (category, singleton flag, etc.)
|
|
183
|
+
* @return {void}
|
|
104
184
|
*/
|
|
105
185
|
static register(constructor, ...args) {
|
|
106
186
|
return Injectables.getRegistry().register(constructor, ...args);
|
|
107
187
|
}
|
|
108
188
|
/**
|
|
109
|
-
* @
|
|
110
|
-
* @
|
|
111
|
-
* @
|
|
112
|
-
* @
|
|
113
|
-
*
|
|
189
|
+
* @description Creates a new instance of an injectable class.
|
|
190
|
+
* @summary Instantiates an injectable class using its constructor and the provided arguments.
|
|
191
|
+
* @template T Type of the object to build
|
|
192
|
+
* @param {Record<string, any>} obj Object containing the name of the injectable to build
|
|
193
|
+
* @param {any[]} args Constructor arguments to pass when instantiating the injectable
|
|
194
|
+
* @return {T} The newly created instance
|
|
114
195
|
*/
|
|
115
196
|
static build(obj, ...args) {
|
|
116
197
|
return Injectables.getRegistry().build(obj, ...args);
|
|
117
198
|
}
|
|
118
199
|
/**
|
|
119
|
-
* @
|
|
120
|
-
* @
|
|
200
|
+
* @description Replaces the current registry implementation.
|
|
201
|
+
* @summary Sets a new {@link InjectablesRegistry} implementation, allowing for custom registry behavior.
|
|
202
|
+
* @param {InjectablesRegistry} operationsRegistry The new implementation of Registry to use
|
|
203
|
+
* @return {void}
|
|
121
204
|
*/
|
|
122
205
|
static setRegistry(operationsRegistry) {
|
|
123
206
|
Injectables.actingInjectablesRegistry = operationsRegistry;
|
|
124
207
|
}
|
|
125
208
|
/**
|
|
126
|
-
* @
|
|
209
|
+
* @description Provides access to the current registry instance.
|
|
210
|
+
* @summary Returns the current {@link InjectablesRegistry} or creates a default one if none exists.
|
|
211
|
+
* @return {InjectablesRegistry} The current registry instance
|
|
127
212
|
*/
|
|
128
213
|
static getRegistry() {
|
|
129
214
|
if (!Injectables.actingInjectablesRegistry)
|
|
130
215
|
Injectables.actingInjectablesRegistry = new InjectableRegistryImp();
|
|
131
216
|
return Injectables.actingInjectablesRegistry;
|
|
132
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* @description Clears all registered injectables.
|
|
220
|
+
* @summary Resets the registry to a clean state by creating a new empty registry instance.
|
|
221
|
+
* @return {void}
|
|
222
|
+
*/
|
|
133
223
|
static reset() {
|
|
134
224
|
Injectables.setRegistry(new InjectableRegistryImp());
|
|
135
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* @description Removes specific injectables from the registry based on a pattern.
|
|
228
|
+
* @summary Selectively resets the registry by removing only the injectables whose names match the provided pattern.
|
|
229
|
+
* @param {string | RegExp} match A string or regular expression pattern to match against injectable names
|
|
230
|
+
* @return {void}
|
|
231
|
+
*/
|
|
136
232
|
static selectiveReset(match) {
|
|
137
233
|
const regexp = typeof match === "string" ? new RegExp(match) : match;
|
|
138
234
|
Injectables.actingInjectablesRegistry["cache"] = Object.entries(Injectables.actingInjectablesRegistry["cache"]).reduce((accum, [key, val]) => {
|
|
@@ -144,19 +240,19 @@
|
|
|
144
240
|
}
|
|
145
241
|
|
|
146
242
|
/**
|
|
147
|
-
* @
|
|
243
|
+
* @description Reflection metadata key for accessing TypeScript type information.
|
|
244
|
+
* @summary Holds the key for retrieving the design type from TypeScript's reflection metadata.
|
|
148
245
|
* @const TypeKey
|
|
149
|
-
* @memberOf
|
|
246
|
+
* @memberOf module:injectable-decorators
|
|
150
247
|
*/
|
|
151
248
|
const TypeKey = "design:type";
|
|
152
249
|
/**
|
|
153
|
-
* @
|
|
154
|
-
* @
|
|
155
|
-
* @param {
|
|
156
|
-
* @
|
|
157
|
-
*
|
|
158
|
-
* @function
|
|
159
|
-
*
|
|
250
|
+
* @description Extracts the type name from a decorated property using reflection.
|
|
251
|
+
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
252
|
+
* @param {any} model The target object containing the decorated property
|
|
253
|
+
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
254
|
+
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
255
|
+
* @function getTypeFromDecorator
|
|
160
256
|
* @memberOf module:injectable-decorators
|
|
161
257
|
*/
|
|
162
258
|
function getTypeFromDecorator(model, propKey) {
|
|
@@ -165,69 +261,97 @@
|
|
|
165
261
|
}
|
|
166
262
|
|
|
167
263
|
/**
|
|
168
|
-
* @
|
|
169
|
-
*
|
|
170
|
-
* @param {string} key
|
|
264
|
+
* @description Generates a fully qualified reflection metadata key.
|
|
265
|
+
* @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
|
|
266
|
+
* @param {string} key The key to be prefixed
|
|
267
|
+
* @return {string} The fully qualified reflection key
|
|
171
268
|
* @function getInjectKey
|
|
172
|
-
*
|
|
173
269
|
* @memberOf module:injectable-decorators
|
|
174
270
|
*/
|
|
175
271
|
const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
|
|
176
272
|
/**
|
|
177
|
-
* @
|
|
273
|
+
* @description Decorator that marks a class as available for dependency injection.
|
|
274
|
+
* @summary Defines a class as an injectable singleton that can be retrieved from the registry.
|
|
275
|
+
* When applied to a class, replaces its constructor with one that returns a singleton instance.
|
|
178
276
|
*
|
|
179
|
-
* @param {string} [category]
|
|
180
|
-
*
|
|
181
|
-
* @param
|
|
277
|
+
* @param {string} [category] Defaults to the class name. Useful when minification occurs and names are changed,
|
|
278
|
+
* or when you want to upcast the object to a different type.
|
|
279
|
+
* @param {boolean} [force] Defines if the injectable should override an already existing instance (if any).
|
|
280
|
+
* Only meant for extending decorators.
|
|
281
|
+
* @param {Function} [instanceCallback] Optional callback function that will be called with the instance after creation.
|
|
282
|
+
* @return {Function} A decorator function that transforms the class into an injectable.
|
|
182
283
|
*
|
|
183
284
|
* @function injectable
|
|
285
|
+
* @category Class Decorators
|
|
184
286
|
*
|
|
185
|
-
* @
|
|
287
|
+
* @mermaid
|
|
288
|
+
* sequenceDiagram
|
|
289
|
+
* participant Client
|
|
290
|
+
* participant Decorator
|
|
291
|
+
* participant Injectables
|
|
292
|
+
*
|
|
293
|
+
* Client->>Decorator: @injectable()
|
|
294
|
+
* Decorator->>Decorator: Create new constructor
|
|
295
|
+
*
|
|
296
|
+
* Note over Decorator: When new instance requested
|
|
297
|
+
* Decorator->>Injectables: get(name)
|
|
298
|
+
* alt Instance exists
|
|
299
|
+
* Injectables-->>Decorator: Return existing instance
|
|
300
|
+
* else No instance
|
|
301
|
+
* Decorator->>Injectables: register(original, name)
|
|
302
|
+
* Decorator->>Injectables: get(name)
|
|
303
|
+
* Injectables-->>Decorator: Return new instance
|
|
304
|
+
* opt Has callback
|
|
305
|
+
* Decorator->>Decorator: Call instanceCallback
|
|
306
|
+
* end
|
|
307
|
+
* end
|
|
308
|
+
* Decorator->>Decorator: Define metadata
|
|
309
|
+
* Decorator-->>Client: Return instance
|
|
186
310
|
*/
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
311
|
+
function injectable(category = undefined, force = false, instanceCallback) {
|
|
312
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
313
|
+
return (original, propertyKey) => {
|
|
314
|
+
const name = category || original.name;
|
|
315
|
+
// the new constructor behaviour
|
|
316
|
+
const newConstructor = function (...args) {
|
|
317
|
+
let inj = Injectables.get(name, ...args);
|
|
318
|
+
if (!inj) {
|
|
319
|
+
Injectables.register(original, name, true, force);
|
|
320
|
+
inj = Injectables.get(name, ...args);
|
|
321
|
+
if (!inj)
|
|
322
|
+
return undefined;
|
|
323
|
+
if (instanceCallback)
|
|
324
|
+
try {
|
|
325
|
+
instanceCallback(inj);
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
console.error(`Failed to call injectable callback for ${name}: ${e}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const metadata = Object.assign({}, {
|
|
332
|
+
class: name,
|
|
333
|
+
});
|
|
334
|
+
Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECTABLE), metadata, inj.constructor);
|
|
335
|
+
return inj;
|
|
336
|
+
};
|
|
337
|
+
// copy prototype so instanceof operator still works
|
|
338
|
+
newConstructor.prototype = original.prototype;
|
|
339
|
+
// newConstructor.__proto__ = original.__proto__;
|
|
340
|
+
// Sets the proper constructor name for type verification
|
|
341
|
+
Object.defineProperty(newConstructor, "name", {
|
|
342
|
+
writable: false,
|
|
343
|
+
enumerable: true,
|
|
344
|
+
configurable: false,
|
|
345
|
+
value: original.prototype.constructor.name,
|
|
209
346
|
});
|
|
210
|
-
|
|
211
|
-
return
|
|
347
|
+
// return new constructor (will override original)
|
|
348
|
+
return newConstructor;
|
|
212
349
|
};
|
|
213
|
-
|
|
214
|
-
newConstructor.prototype = original.prototype;
|
|
215
|
-
// newConstructor.__proto__ = original.__proto__;
|
|
216
|
-
// Sets the proper constructor name for type verification
|
|
217
|
-
Object.defineProperty(newConstructor, "name", {
|
|
218
|
-
writable: false,
|
|
219
|
-
enumerable: true,
|
|
220
|
-
configurable: false,
|
|
221
|
-
value: original.prototype.constructor.name,
|
|
222
|
-
});
|
|
223
|
-
// return new constructor (will override original)
|
|
224
|
-
return newConstructor;
|
|
225
|
-
};
|
|
350
|
+
}
|
|
226
351
|
/**
|
|
227
|
-
* @
|
|
228
|
-
* @
|
|
229
|
-
*
|
|
230
|
-
* Only concrete classes. No generics are supported
|
|
352
|
+
* @description Property decorator that injects a dependency into a class property.
|
|
353
|
+
* @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
|
|
354
|
+
* The property must be typed for the requested dependency. Only concrete classes are supported; generics are not.
|
|
231
355
|
*
|
|
232
356
|
* Injected properties should be described like so:
|
|
233
357
|
* <pre>
|
|
@@ -242,73 +366,104 @@
|
|
|
242
366
|
* </pre>
|
|
243
367
|
*
|
|
244
368
|
* where InjectableClass is the class you want to inject.
|
|
245
|
-
* Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined
|
|
246
|
-
* For
|
|
369
|
+
* Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined.
|
|
370
|
+
* For projects where minification occurs, you should use the category param to ensure the name is the same throughout.
|
|
247
371
|
*
|
|
248
|
-
* @param {string} [category]
|
|
249
|
-
*
|
|
372
|
+
* @param {string} [category] Defaults to the class name derived from the property type. Useful when minification occurs
|
|
373
|
+
* and names are changed, or when you want to upcast the object to a different type.
|
|
374
|
+
* @param {InstanceTransformer} [transformer] Optional function to transform the injectable instance before it's injected.
|
|
375
|
+
* @return {Function} A property decorator function that sets up the dependency injection.
|
|
250
376
|
*
|
|
251
377
|
* @function inject
|
|
378
|
+
* @category Property Decorators
|
|
379
|
+
*
|
|
380
|
+
* @mermaid
|
|
381
|
+
* sequenceDiagram
|
|
382
|
+
* participant Client
|
|
383
|
+
* participant Decorator
|
|
384
|
+
* participant Injectables
|
|
385
|
+
*
|
|
386
|
+
* Client->>Decorator: @inject()
|
|
387
|
+
* Decorator->>Decorator: Get type from property
|
|
388
|
+
* Decorator->>Decorator: Define metadata
|
|
389
|
+
* Decorator->>Decorator: Define property getter
|
|
252
390
|
*
|
|
253
|
-
*
|
|
391
|
+
* Note over Decorator: When property accessed
|
|
392
|
+
* Client->>Decorator: access property
|
|
393
|
+
* Decorator->>Decorator: Check if instance exists
|
|
394
|
+
* alt Instance exists in WeakMap
|
|
395
|
+
* Decorator-->>Client: Return cached instance
|
|
396
|
+
* else No instance
|
|
397
|
+
* Decorator->>Injectables: get(name)
|
|
398
|
+
* alt Injectable found
|
|
399
|
+
* Injectables-->>Decorator: Return injectable instance
|
|
400
|
+
* opt Has transformer
|
|
401
|
+
* Decorator->>Decorator: Call transformer
|
|
402
|
+
* end
|
|
403
|
+
* Decorator->>Decorator: Store in WeakMap
|
|
404
|
+
* Decorator-->>Client: Return instance
|
|
405
|
+
* else No injectable
|
|
406
|
+
* Decorator-->>Client: Throw error
|
|
407
|
+
* end
|
|
408
|
+
* end
|
|
254
409
|
*/
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
410
|
+
function inject(category, transformer) {
|
|
411
|
+
return (target, propertyKey) => {
|
|
412
|
+
const values = new WeakMap();
|
|
413
|
+
const name = category || getTypeFromDecorator(target, propertyKey);
|
|
414
|
+
if (!name)
|
|
415
|
+
throw new Error(`Could not get Type from decorator`);
|
|
416
|
+
Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECT), {
|
|
417
|
+
injectable: name,
|
|
418
|
+
}, target, propertyKey);
|
|
419
|
+
Object.defineProperty(target, propertyKey, {
|
|
420
|
+
configurable: true,
|
|
421
|
+
get() {
|
|
422
|
+
const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
|
|
423
|
+
if (descriptor.configurable) {
|
|
424
|
+
Object.defineProperty(this, propertyKey, {
|
|
425
|
+
enumerable: true,
|
|
426
|
+
configurable: false,
|
|
427
|
+
get() {
|
|
428
|
+
let obj = values.get(this);
|
|
429
|
+
if (!obj) {
|
|
430
|
+
obj = Injectables.get(name);
|
|
431
|
+
if (!obj)
|
|
432
|
+
throw new Error(`Could not get Injectable ${name} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
|
|
433
|
+
if (transformer)
|
|
434
|
+
try {
|
|
435
|
+
obj = transformer(obj, target);
|
|
436
|
+
}
|
|
437
|
+
catch (e) {
|
|
438
|
+
console.error(e);
|
|
439
|
+
}
|
|
440
|
+
values.set(this, obj);
|
|
441
|
+
}
|
|
442
|
+
return obj;
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
return this[propertyKey];
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
});
|
|
449
|
+
};
|
|
450
|
+
}
|
|
294
451
|
|
|
295
452
|
/**
|
|
453
|
+
* @description A lightweight dependency injection library for TypeScript applications.
|
|
296
454
|
* @summary Adds a simple Injectables implementation to create singleton instances of an object
|
|
297
|
-
* and easily inject it into other objects
|
|
455
|
+
* and easily inject it into other objects. Provides decorators for marking classes as injectable
|
|
456
|
+
* and for injecting dependencies into class properties.
|
|
298
457
|
*
|
|
299
458
|
* @module injectable-decorators
|
|
300
459
|
*/
|
|
301
460
|
/**
|
|
302
|
-
* @
|
|
303
|
-
* @
|
|
304
|
-
* @memberOf module:injectable-decorators
|
|
305
|
-
*/
|
|
306
|
-
/**
|
|
307
|
-
* @summary Defined on library build. holds the library current version
|
|
461
|
+
* @description Current version of the injectable-decorators library.
|
|
462
|
+
* @summary Defined on library build. Holds the library's current version string.
|
|
308
463
|
* @const VERSION
|
|
309
464
|
* @memberOf module:injectable-decorators
|
|
310
465
|
*/
|
|
311
|
-
const VERSION = "1.6.
|
|
466
|
+
const VERSION = "1.6.2";
|
|
312
467
|
|
|
313
468
|
exports.InjectableRegistryImp = InjectableRegistryImp;
|
|
314
469
|
exports.Injectables = Injectables;
|
|
@@ -320,4 +475,4 @@
|
|
|
320
475
|
exports.injectable = injectable;
|
|
321
476
|
|
|
322
477
|
}));
|
|
323
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9yZWdpc3RyeS50cyIsIi4uL3NyYy9JbmplY3RhYmxlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHN1bW1hcnkgSW5qZWN0YWJsZXMgUmVmbGVjdGlvbiBrZXlzXG4gKiBAY29uc3QgSW5qZWN0YWJsZXNLZXlzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgUmVmbGVjdGlvbiBpbmplY3RhYmxlcyBiYXNlIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOSkVDVEFCTEUgUmVmbGVjdGlvbiBpbmplY3RhYmxlIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOSkVDVCBSZWZsZWN0aW9uIGluamVjdCBrZXlcbiAqXG4gKiBAbWVtYmVyT2YgaW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBJbmplY3RhYmxlc0tleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiaW5qZWN0LmRiLlwiLFxuICBJTkpFQ1RBQkxFOiBcImluamVjdGFibGVcIixcbiAgSU5KRUNUOiBcImluamVjdFwiLFxufTtcbiIsIi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyBhbiBJbmplY3RhYmxlIHR5cGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdGFibGU8VD4gPSB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0gfCBUO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEludGVyZmFjZSBmb3IgYW4gaW5qZWN0YWJsZSByZWdpc3RyeVxuICogQGludGVyZmFjZSBJbmplY3RhYmxlUmVnaXN0cnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJldHJpZXZlcyBhbiB7QGxpbmsgSW5qZWN0YWJsZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBnZXQ8VD4obmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IEluamVjdGFibGU8VD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZX0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBJbnN0YW50aWF0ZXMgYW4gSW5qZWN0YWJsZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqIEByZXR1cm4gVFxuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBidWlsZDxUPihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFyZ3M6IGFueVtdKTogVDtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgdmFpcm91cyB7QGxpbmsgSW5qZWN0YWJsZX1zXG4gKiBAY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wXG4gKiBAaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAgaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBjYWNoZTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdldDxUPihuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlubmVyQ2FjaGUgPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgY29uc3QgYnVpbGREZWYgPSB7IG5hbWU6IG5hbWUgfTtcbiAgICAgIGlmICghaW5uZXJDYWNoZS5zaW5nbGV0b24gJiYgIWlubmVyQ2FjaGUuaW5zdGFuY2UpXG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkPFQ+KGJ1aWxkRGVmLCAuLi5hcmdzKTtcbiAgICAgIHJldHVybiBpbm5lckNhY2hlLmluc3RhbmNlIHx8IHRoaXMuYnVpbGQ8VD4oYnVpbGREZWYsIC4uLmFyZ3MpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oXG4gICAgb2JqOiBJbmplY3RhYmxlPFQ+LFxuICAgIGNhdGVnb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaXNTaW5nbGV0b246IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvcmNlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FzdE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgY29uc3QgY29uc3RydWN0b3IgPSAhY2FzdE9iai5uYW1lICYmIGNhc3RPYmouY29uc3RydWN0b3I7XG4gICAgaWYgKHR5cGVvZiBjYXN0T2JqICE9PSBcImZ1bmN0aW9uXCIgJiYgIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5qZWN0YWJsZSByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvcmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBuYW1lID1cbiAgICAgIGNhdGVnb3J5IHx8XG4gICAgICAoY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSAmJiBjb25zdHJ1Y3Rvci5uYW1lICE9PSBcIkZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY29uc3RydWN0b3IgYXMgeyBbaW5kZXhlcjogc3RyaW5nXTogYW55IH0pLm5hbWVcbiAgICAgICAgOiBjYXN0T2JqLm5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdIHx8IGZvcmNlKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXSA9IHtcbiAgICAgICAgaW5zdGFuY2U6IGNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJ1Y3RvcjogIWNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBzaW5nbGV0b246IGlzU2luZ2xldG9uLFxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGJ1aWxkPFQ+KGRlZnM6IHsgbmFtZTogc3RyaW5nIH0sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3Rvciwgc2luZ2xldG9uIH0gPSB0aGlzLmNhY2hlW2RlZnMubmFtZV07XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoLi4uYXJncyk7XG4gICAgdGhpcy5jYWNoZVtkZWZzLm5hbWVdID0ge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgY29uc3RydWN0b3I6IGNvbnN0cnVjdG9yLFxuICAgICAgc2luZ2xldG9uOiBzaW5nbGV0b24sXG4gICAgfTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXNSZWdpc3RyeSxcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBTdGF0aWMgY2xhc3MgSG9sZGluZyB0aGUgYWNjZXNzIHRvIHRoZSBpbmplY3RhYmxlcyBmdW5jdGlvbnNcbiAqXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeT86IEluamVjdGFibGVzUmVnaXN0cnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZWQge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICovXG4gIHN0YXRpYyBnZXQ8VD4obmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IEluamVjdGFibGU8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmdldChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZWdpc3RlcnMgYW4gaW5qZWN0YWJsZSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0luamVjdGFibGV9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICpcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIEluamVjdGFibGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJuIFRcbiAgICpcbiAgICovXG4gIHN0YXRpYyBidWlsZDxUPihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkuYnVpbGQob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXRzIGEgbmV3IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fVxuICAgKiBAcGFyYW0ge0luamVjdGFibGVzUmVnaXN0cnl9IG9wZXJhdGlvbnNSZWdpc3RyeSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkob3BlcmF0aW9uc1JlZ2lzdHJ5OiBJbmplY3RhYmxlc1JlZ2lzdHJ5KSB7XG4gICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG9wZXJhdGlvbnNSZWdpc3RyeTtcbiAgfVxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5KCkge1xuICAgIGlmICghSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSlcbiAgICAgIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCk7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnk7XG4gIH1cblxuICBzdGF0aWMgcmVzZXQoKSB7XG4gICAgSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpKTtcbiAgfVxuXG4gIHN0YXRpYyBzZWxlY3RpdmVSZXNldChtYXRjaDogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgY29uc3QgcmVnZXhwID0gdHlwZW9mIG1hdGNoID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXRjaCkgOiBtYXRjaDtcbiAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl0gPSBPYmplY3QuZW50cmllcyhcbiAgICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXVxuICAgICkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgaWYgKCFrZXkubWF0Y2gocmVnZXhwKSkgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH1cbn1cbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBob2xkcyB0aGUga2V5IGZvciB0aGUgZGVzaWduIHR5cGVcbiAqIEBjb25zdCBUeXBlS2V5XG4gKiBAbWVtYmVyT2YgIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVLZXkgPSBcImRlc2lnbjp0eXBlXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSB0eXBlIGZyb20gdGhlIGRlY29yYXRvcnNcbiAqIEBwYXJhbSB7YW55fSBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXlcbiAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqXG4gKiBAZnVuY3Rpb24gZ2VUeXBlRnJvbURlY29yYXRvcnNcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gIG1vZGVsOiBhbnksXG4gIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHR5cGVEZWYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFR5cGVLZXksIG1vZGVsLCBwcm9wS2V5KTtcbiAgcmV0dXJuIHR5cGVEZWYubmFtZSAhPT0gXCJGdW5jdGlvblwiID8gdHlwZURlZi5uYW1lIDogdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRUeXBlRnJvbURlY29yYXRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0dXJuIHRoZSByZWZsZWN0aW9uIGtleSBmb3IgaW5qZWN0YWJsZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0S2V5XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuY29uc3QgZ2V0SW5qZWN0S2V5ID0gKGtleTogc3RyaW5nKSA9PiBJbmplY3RhYmxlc0tleXMuUkVGTEVDVCArIGtleTtcblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIGRlZmF1bHRzIHRvIHRoZSBjbGFzcyBOYW1lLiAoVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY291cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkIHNvIHdlIGNhbiBubyBsb25nZXIgcmVseSBvbiB0aGUgY2xhc3MgbmFtZSwgb3Igd2hlbiB3ZSB3YW50IHRvIHVwY2FzdCB0aGUgT2JqZWN0KVxuICogQHBhcmFtIHtib29sZWFufSBbZm9yY2VdIGRlZmluZXMgaWYgdGhlIGluamVjdGFibGUgc2hvdWxkIG92ZXJyaWRlIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGluc3RhbmNlIChpZiBhbnkpLiAob25seSBtZWFudCBmb3IgZXh0ZW5kaW5nIGRlY29yYXRvcnNcbiAqIEBwYXJhbSBpbnN0YW5jZUNhbGxiYWNrXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9ycy5EZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlID1cbiAgKFxuICAgIGNhdGVnb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbnN0YW5jZUNhbGxiYWNrPzogKGluc3RhbmNlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG4gICkgPT5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBuYW1lID0gY2F0ZWdvcnkgfHwgb3JpZ2luYWwubmFtZTtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIGxldCBpbmo6IGFueSA9IEluamVjdGFibGVzLmdldDxhbnk+KG5hbWUsIC4uLmFyZ3MpO1xuICAgICAgaWYgKCFpbmopIHtcbiAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIob3JpZ2luYWwsIG5hbWUsIHRydWUsIGZvcmNlKTtcbiAgICAgICAgaW5qID0gSW5qZWN0YWJsZXMuZ2V0PGFueT4obmFtZSwgLi4uYXJncyk7XG4gICAgICAgIGlmICghaW5qKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZUNhbGxiYWNrKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNhbGxiYWNrKGluaik7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGNhbGwgaW5qZWN0YWJsZSBjYWxsYmFjayBmb3IgJHtuYW1lfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3M6IG5hbWUsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBpbmouY29uc3RydWN0b3JcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBpbmo7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuICAgIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gICAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xuICB9O1xuXG4vKipcbiAqIEBzdW1tYXJ5IGZ1bmN0aW9uIHdpdGNoIHRyYW5zZm9ybXMgYSBjYWNoZWQge0BsaW5rIGluamVjdGFibGV9XG4gKlxuICogQHBhcmFtIHthbnl9IGluamVjdGFibGVcbiAqIEBwYXJhbSB7YW55fSBvYmogdGhlIG9iaiB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeVxuICogQGRlc2NyaXB0aW9uIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuXG4gKlxuICogT25seSBjb25jcmV0ZSBjbGFzc2VzLiBObyBnZW5lcmljcyBhcmUgc3VwcG9ydGVkXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkXG4gKiBGb3IgcHJvamVjdCB3aGVyZSBtaW5pZmljYXRpb24gb2Njb3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gZGVmYXVsdHMgdG8gdGhlIGNsYXNzIE5hbWUuIChVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2Njb3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQgc28gd2UgY2FuIG5vIGxvbmdlciByZWx5IG9uIHRoZSBjbGFzcyBuYW1lLCBvciB3aGVuIHdlIHdhbnQgdG8gdXBjYXN0IHRoZSBPYmplY3QpXG4gKiBAcGFyYW0ge0luc3RhbmNlVHJhbnNmb3JtZXJ9IFt0cmFuc2Zvcm1lcl1cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnMuRGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgaW5qZWN0ID1cbiAgKGNhdGVnb3J5Pzogc3RyaW5nLCB0cmFuc2Zvcm1lcj86IEluc3RhbmNlVHJhbnNmb3JtZXIpID0+XG4gICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgY29uc3QgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGNhdGVnb3J5IHx8IGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVCksXG4gICAgICB7XG4gICAgICAgIGluamVjdGFibGU6IG5hbWUsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgKSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgICAgIG9iaiA9IEluamVjdGFibGVzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBnZXQgSW5qZWN0YWJsZSAke25hbWV9IHRvIGluamVjdCBpbiAke3RhcmdldC5jb25zdHJ1Y3RvciA/IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lIDogdGFyZ2V0Lm5hbWV9J3MgJHtwcm9wZXJ0eUtleX1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcilcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHRyYW5zZm9ybWVyKG9iaiwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIG9iaik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHlLZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuIiwiLyoqXG4gKiBAc3VtbWFyeSBBZGRzIGEgc2ltcGxlIEluamVjdGFibGVzIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGFuIG9iamVjdFxuICogYW5kIGVhc2lseSBpbmplY3QgaXQgaW50byBvdGhlciBvYmplY3RzXG4gKlxuICogQG1vZHVsZSBpbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IGZ1bmN0aW9ucyB0aGF0IGRlY29yYXRlIGNsYXNzZXMgb3IgY2xhc3MgcHJvcGVydGllc1xuICogQG5hbWVzcGFjZSBEZWNvcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZWQgb24gbGlicmFyeSBidWlsZC4gaG9sZHMgdGhlIGxpYnJhcnkgY3VycmVudCB2ZXJzaW9uXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7Ozs7OztJQVNHO0FBQ1UsVUFBQSxlQUFlLEdBQUc7SUFDN0IsSUFBQSxPQUFPLEVBQUUsWUFBWTtJQUNyQixJQUFBLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLElBQUEsTUFBTSxFQUFFLFFBQVE7OztJQzRCbEI7Ozs7SUFJRztVQUNVLHFCQUFxQixDQUFBO0lBQWxDLElBQUEsV0FBQSxHQUFBO1lBQ1UsSUFBSyxDQUFBLEtBQUEsR0FBK0IsRUFBRTs7SUFFOUM7O0lBRUc7SUFDSCxJQUFBLEdBQUcsQ0FBSSxJQUFZLEVBQUUsR0FBRyxJQUFXLEVBQUE7SUFDakMsUUFBQSxJQUFJO2dCQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ25DLFlBQUEsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO2dCQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO29CQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUksUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLFlB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
|
|
478
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9yZWdpc3RyeS50cyIsIi4uL3NyYy9JbmplY3RhYmxlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGtleXMgaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IEluamVjdGFibGVzIFJlZmxlY3Rpb24ga2V5cyB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBpbmplY3RhYmxlIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMuXG4gKiBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIFJlZmxlY3Rpb24gaW5qZWN0YWJsZXMgYmFzZSBrZXkgcHJlZml4IGZvciBhbGwgbWV0YWRhdGEga2V5c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IElOSkVDVEFCTEUgUmVmbGVjdGlvbiBrZXkgc3VmZml4IGZvciBtYXJraW5nIGEgY2xhc3MgYXMgaW5qZWN0YWJsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOSkVDVCBSZWZsZWN0aW9uIGtleSBzdWZmaXggZm9yIG1hcmtpbmcgYSBwcm9wZXJ0eSBmb3IgaW5qZWN0aW9uXG4gKiBcbiAqIEBjb25zdCBJbmplY3RhYmxlc0tleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBJbmplY3RhYmxlc0tleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiaW5qZWN0LmRiLlwiLFxuICBJTkpFQ1RBQkxFOiBcImluamVjdGFibGVcIixcbiAgSU5KRUNUOiBcImluamVjdFwiLFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgcmVwcmVzZW50aW5nIGVpdGhlciBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGFuIGluc3RhbmNlLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhbiBJbmplY3RhYmxlIHR5cGUgdGhhdCBjYW4gYmUgZWl0aGVyIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdFxuICogQHR5cGVkZWYge2Z1bmN0aW9uKGFueSk6IFQgfCBUfSBJbmplY3RhYmxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlPFQ+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9IHwgVDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udHJhY3QgZm9yIGEgcmVnaXN0cnkgdGhhdCBtYW5hZ2VzIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEBzdW1tYXJ5IEludGVyZmFjZSBmb3IgYW4gaW5qZWN0YWJsZSByZWdpc3RyeSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcsIHJlZ2lzdGVyaW5nLCBhbmQgYnVpbGRpbmcgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHRlbXBsYXRlIFQgVHlwZSBwYXJhbWV0ZXIgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIG1ldGhvZHNcbiAqIEBpbnRlcmZhY2UgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGFuIGluamVjdGFibGUgaW5zdGFuY2UgYnkgaXRzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuIHtAbGluayBJbmplY3RhYmxlfSBmcm9tIHRoZSByZWdpc3RyeSBieSBuYW1lLCBvcHRpb25hbGx5IHBhc3NpbmcgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge0luamVjdGFibGU8VD4gfCB1bmRlZmluZWR9IFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAgICovXG4gIGdldDxUPihuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogSW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjbGFzcyBvciBvYmplY3QgdG8gdGhlIGluamVjdGFibGUgcmVnaXN0cnkuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggdGhlIHJlZ2lzdHJ5LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBpbmplY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZTxUPn0gY29uc3RydWN0b3IgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIG9yIG9iamVjdCBpbnN0YW5jZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZWdpc3RyYXRpb24gKGNhdGVnb3J5LCBzaW5nbGV0b24gZmxhZywgZXRjLilcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAgICovXG4gIHJlZ2lzdGVyPFQ+KGNvbnN0cnVjdG9yOiBJbmplY3RhYmxlPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGFuIGluamVjdGFibGUgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlIGNsYXNzIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIE9iamVjdCBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICBidWlsZDxUPihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFyZ3M6IGFueVtdKTogVDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW5qZWN0YWJsZXNSZWdpc3RyeSBpbnRlcmZhY2UuXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgdmFyaW91cyB7QGxpbmsgSW5qZWN0YWJsZX1zIGluIGEgY2FjaGUgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVnaXN0ZXIsIHJldHJpZXZlLCBhbmQgYnVpbGQgdGhlbS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiBAY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wXG4gKiBAaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IHJlZ2lzdHJ5XG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhIGNsYXNzXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICogcmVnaXN0cnkucmVnaXN0ZXIoTXlTZXJ2aWNlLCAnTXlTZXJ2aWNlJywgdHJ1ZSk7XG4gKlxuICogLy8gR2V0IHRoZSBpbnN0YW5jZVxuICogY29uc3Qgc2VydmljZSA9IHJlZ2lzdHJ5LmdldCgnTXlTZXJ2aWNlJyk7XG4gKiBzZXJ2aWNlLmRvU29tZXRoaW5nKCk7IC8vICdIZWxsbyBXb3JsZCdcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZWdpc3RyeVxuICpcbiAqICAgQ2xpZW50LT4+UmVnaXN0cnk6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgUmVnaXN0cnktPj5SZWdpc3RyeTogU3RvcmUgaW4gY2FjaGVcbiAqXG4gKiAgIENsaWVudC0+PlJlZ2lzdHJ5OiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBhbmQgaXMgc2luZ2xldG9uXG4gKiAgICAgUmVnaXN0cnktLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2Ugb3Igbm90IHNpbmdsZXRvblxuICogICAgIFJlZ2lzdHJ5LT4+UmVnaXN0cnk6IGJ1aWxkKG5hbWUpXG4gKiAgICAgUmVnaXN0cnktLT4+Q2xpZW50OiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIGltcGxlbWVudHMgSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gIHByaXZhdGUgY2FjaGU6IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBnZXQ8VD4obmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFQgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbm5lckNhY2hlID0gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICAgIGNvbnN0IGJ1aWxkRGVmID0geyBuYW1lOiBuYW1lIH07XG4gICAgICBpZiAoIWlubmVyQ2FjaGUuc2luZ2xldG9uICYmICFpbm5lckNhY2hlLmluc3RhbmNlKVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZDxUPihidWlsZERlZiwgLi4uYXJncyk7XG4gICAgICByZXR1cm4gaW5uZXJDYWNoZS5pbnN0YW5jZSB8fCB0aGlzLmJ1aWxkPFQ+KGJ1aWxkRGVmLCAuLi5hcmdzKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHJlZ2lzdGVyPFQ+KFxuICAgIG9iajogSW5qZWN0YWJsZTxUPixcbiAgICBjYXRlZ29yeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGlzU2luZ2xldG9uOiBib29sZWFuID0gdHJ1ZSxcbiAgICBmb3JjZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhc3RPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gIWNhc3RPYmoubmFtZSAmJiBjYXN0T2JqLmNvbnN0cnVjdG9yO1xuICAgIGlmICh0eXBlb2YgY2FzdE9iaiAhPT0gXCJmdW5jdGlvblwiICYmICFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluamVjdGFibGUgcmVnaXN0ZXJpbmcgZmFpbGVkLiBNaXNzaW5nIENsYXNzIG5hbWUgb3IgY29uc3RydWN0b3JgXG4gICAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9XG4gICAgICBjYXRlZ29yeSB8fFxuICAgICAgKGNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLm5hbWUgJiYgY29uc3RydWN0b3IubmFtZSAhPT0gXCJGdW5jdGlvblwiXG4gICAgICAgID8gKGNvbnN0cnVjdG9yIGFzIHsgW2luZGV4ZXI6IHN0cmluZ106IGFueSB9KS5uYW1lXG4gICAgICAgIDogY2FzdE9iai5uYW1lKTtcblxuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXSB8fCBmb3JjZSlcbiAgICAgIHRoaXMuY2FjaGVbbmFtZV0gPSB7XG4gICAgICAgIGluc3RhbmNlOiBjb25zdHJ1Y3RvciA/IG9iaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29uc3RydWN0b3I6ICFjb25zdHJ1Y3RvciA/IG9iaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2luZ2xldG9uOiBpc1NpbmdsZXRvbixcbiAgICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBidWlsZDxUPihkZWZzOiB7IG5hbWU6IHN0cmluZyB9LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIGNvbnN0IHsgY29uc3RydWN0b3IsIHNpbmdsZXRvbiB9ID0gdGhpcy5jYWNoZVtkZWZzLm5hbWVdO1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnN0cnVjdG9yKC4uLmFyZ3MpO1xuICAgIHRoaXMuY2FjaGVbZGVmcy5uYW1lXSA9IHtcbiAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgIGNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvcixcbiAgICAgIHNpbmdsZXRvbjogc2luZ2xldG9uLFxuICAgIH07XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3RhYmxlUmVnaXN0cnlJbXAsXG4gIEluamVjdGFibGVzUmVnaXN0cnksXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWwgcmVnaXN0cnkgZm9yIG1hbmFnaW5nIGluamVjdGFibGUgZGVwZW5kZW5jaWVzLlxuICogQHN1bW1hcnkgU3RhdGljIGNsYXNzIGhvbGRpbmcgdGhlIGFjY2VzcyB0byB0aGUgaW5qZWN0YWJsZXMgZnVuY3Rpb25zLiBQcm92aWRlcyBtZXRob2RzIGZvciByZWdpc3RlcmluZyxcbiAqIHJldHJpZXZpbmcsIGFuZCBidWlsZGluZyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdFxuICogXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbiBpbmplY3RhYmxlIGNsYXNzXG4gKiBAaW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICogXG4gKiAvLyBJbmplY3QgdGhlIHNlcnZpY2UgaW50byBhbm90aGVyIGNsYXNzXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEBpbmplY3QoKVxuICogICBwcml2YXRlIHNlcnZpY2UhOiBNeVNlcnZpY2U7XG4gKiAgIFxuICogICB1c2VTZXJ2aWNlKCkge1xuICogICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZG9Tb21ldGhpbmcoKTtcbiAqICAgfVxuICogfVxuICogXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICogICBwYXJ0aWNpcGFudCBSZWdpc3RyeVxuICogICBcbiAqICAgQ2xpZW50LT4+SW5qZWN0YWJsZXM6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgSW5qZWN0YWJsZXMtPj5SZWdpc3RyeTogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBSZWdpc3RyeS0tPj5JbmplY3RhYmxlczogdm9pZFxuICogICBcbiAqICAgQ2xpZW50LT4+SW5qZWN0YWJsZXM6IGdldChcIk15U2VydmljZVwiKVxuICogICBJbmplY3RhYmxlcy0+PlJlZ2lzdHJ5OiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgUmVnaXN0cnktLT4+SW5qZWN0YWJsZXM6IE15U2VydmljZSBpbnN0YW5jZVxuICogICBJbmplY3RhYmxlcy0tPj5DbGllbnQ6IE15U2VydmljZSBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXMge1xuICBwcml2YXRlIHN0YXRpYyBhY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5PzogSW5qZWN0YWJsZXNSZWdpc3RyeSA9IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoZXMgYW4gaW5qZWN0YWJsZSBpbnN0YW5jZSBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWVkIHtAbGluayBJbmplY3RhYmxlfSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlIGluamVjdGFibGUgaXMgYSBzaW5nbGV0b24sXG4gICAqIHJldHVybnMgdGhlIGV4aXN0aW5nIGluc3RhbmNlLiBPdGhlcndpc2UsIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7SW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZH0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldDxUPihuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogSW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkuZ2V0KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2xhc3Mgb3Igb2JqZWN0IHRvIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gaW5qZWN0YWJsZSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIHRoZSByZWdpc3RyeSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgaW5qZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge0luamVjdGFibGU8VD59IGNvbnN0cnVjdG9yIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvciBvYmplY3QgaW5zdGFuY2UgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVnaXN0cmF0aW9uIChjYXRlZ29yeSwgc2luZ2xldG9uIGZsYWcsIGV0Yy4pXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VD4oY29uc3RydWN0b3I6IEluamVjdGFibGU8VD4sIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoY29uc3RydWN0b3IsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGFuIGluamVjdGFibGUgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlIGNsYXNzIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIE9iamVjdCBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VD4ob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmJ1aWxkKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHRoZSBjdXJyZW50IHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uLlxuICAgKiBAc3VtbWFyeSBTZXRzIGEgbmV3IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fSBpbXBsZW1lbnRhdGlvbiwgYWxsb3dpbmcgZm9yIGN1c3RvbSByZWdpc3RyeSBiZWhhdmlvci5cbiAgICogQHBhcmFtIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBvcGVyYXRpb25zUmVnaXN0cnkgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBSZWdpc3RyeSB0byB1c2VcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShvcGVyYXRpb25zUmVnaXN0cnk6IEluamVjdGFibGVzUmVnaXN0cnkpIHtcbiAgICBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gb3BlcmF0aW9uc1JlZ2lzdHJ5O1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjdXJyZW50IHJlZ2lzdHJ5IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fSBvciBjcmVhdGVzIGEgZGVmYXVsdCBvbmUgaWYgbm9uZSBleGlzdHMuXG4gICAqIEByZXR1cm4ge0luamVjdGFibGVzUmVnaXN0cnl9IFRoZSBjdXJyZW50IHJlZ2lzdHJ5IGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIUluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkpXG4gICAgICBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpO1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgYWxsIHJlZ2lzdGVyZWQgaW5qZWN0YWJsZXMuXG4gICAqIEBzdW1tYXJ5IFJlc2V0cyB0aGUgcmVnaXN0cnkgdG8gYSBjbGVhbiBzdGF0ZSBieSBjcmVhdGluZyBhIG5ldyBlbXB0eSByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldCgpIHtcbiAgICBJbmplY3RhYmxlcy5zZXRSZWdpc3RyeShuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHNwZWNpZmljIGluamVjdGFibGVzIGZyb20gdGhlIHJlZ2lzdHJ5IGJhc2VkIG9uIGEgcGF0dGVybi5cbiAgICogQHN1bW1hcnkgU2VsZWN0aXZlbHkgcmVzZXRzIHRoZSByZWdpc3RyeSBieSByZW1vdmluZyBvbmx5IHRoZSBpbmplY3RhYmxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcHJvdmlkZWQgcGF0dGVybi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IG1hdGNoIEEgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QgaW5qZWN0YWJsZSBuYW1lc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdGl2ZVJlc2V0KG1hdGNoOiBzdHJpbmcgfCBSZWdFeHApIHtcbiAgICBjb25zdCByZWdleHAgPSB0eXBlb2YgbWF0Y2ggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKG1hdGNoKSA6IG1hdGNoO1xuICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXSA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgKEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgYXMgYW55KVtcImNhY2hlXCJdXG4gICAgKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBpZiAoIWtleS5tYXRjaChyZWdleHApKSBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHt9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWZsZWN0aW9uIG1ldGFkYXRhIGtleSBmb3IgYWNjZXNzaW5nIFR5cGVTY3JpcHQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqIEBzdW1tYXJ5IEhvbGRzIHRoZSBrZXkgZm9yIHJldHJpZXZpbmcgdGhlIGRlc2lnbiB0eXBlIGZyb20gVHlwZVNjcmlwdCdzIHJlZmxlY3Rpb24gbWV0YWRhdGEuXG4gKiBAY29uc3QgVHlwZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVLZXkgPSBcImRlc2lnbjp0eXBlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSB0eXBlIG5hbWUgZnJvbSBhIGRlY29yYXRlZCBwcm9wZXJ0eSB1c2luZyByZWZsZWN0aW9uLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSB0eXBlIGZyb20gYSBwcm9wZXJ0eSBkZWNvcmF0b3IgYnkgYWNjZXNzaW5nIFR5cGVTY3JpcHQncyByZWZsZWN0aW9uIG1ldGFkYXRhLlxuICogQHBhcmFtIHthbnl9IG1vZGVsIFRoZSB0YXJnZXQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXkgVGhlIHByb3BlcnR5IGtleSAobmFtZSBvciBzeW1ib2wpIG9mIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHR5cGUsIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgRnVuY3Rpb24gdHlwZVxuICogQGZ1bmN0aW9uIGdldFR5cGVGcm9tRGVjb3JhdG9yXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gIG1vZGVsOiBhbnksXG4gIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHR5cGVEZWYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFR5cGVLZXksIG1vZGVsLCBwcm9wS2V5KTtcbiAgcmV0dXJuIHR5cGVEZWYubmFtZSAhPT0gXCJGdW5jdGlvblwiID8gdHlwZURlZi5uYW1lIDogdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRUeXBlRnJvbURlY29yYXRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIG1ldGFkYXRhIGtleS5cbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHJlZmxlY3Rpb24ga2V5IGZvciBpbmplY3RhYmxlcyBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBiYXNlIHJlZmxlY3Rpb24ga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBrZXlcbiAqIEBmdW5jdGlvbiBnZXRJbmplY3RLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmNvbnN0IGdldEluamVjdEtleSA9IChrZXk6IHN0cmluZykgPT4gSW5qZWN0YWJsZXNLZXlzLlJFRkxFQ1QgKyBrZXk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHNpbmdsZXRvbiB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZV0gRGVmaW5lcyBpZiB0aGUgaW5qZWN0YWJsZSBzaG91bGQgb3ZlcnJpZGUgYW4gYWxyZWFkeSBleGlzdGluZyBpbnN0YW5jZSAoaWYgYW55KS5cbiAqIE9ubHkgbWVhbnQgZm9yIGV4dGVuZGluZyBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2luc3RhbmNlQ2FsbGJhY2tdIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgaW5zdGFuY2UgYWZ0ZXIgY3JlYXRpb24uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gZXhpc3RpbmcgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiByZWdpc3RlcihvcmlnaW5hbCwgbmFtZSlcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgaW5zdGFuY2VDYWxsYmFjaz86IChpbnN0YW5jZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxuKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBjYXRlZ29yeSB8fCBvcmlnaW5hbC5uYW1lO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgbGV0IGluajogYW55ID0gSW5qZWN0YWJsZXMuZ2V0PGFueT4obmFtZSwgLi4uYXJncyk7XG4gICAgICBpZiAoIWluaikge1xuICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihvcmlnaW5hbCwgbmFtZSwgdHJ1ZSwgZm9yY2UpO1xuICAgICAgICBpbmogPSBJbmplY3RhYmxlcy5nZXQ8YW55PihuYW1lLCAuLi5hcmdzKTtcbiAgICAgICAgaWYgKCFpbmopIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlQ2FsbGJhY2spXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2FsbGJhY2soaW5qKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gY2FsbCBpbmplY3RhYmxlIGNhbGxiYWNrIGZvciAke25hbWV9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzczogbmFtZSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGluai5jb25zdHJ1Y3RvclxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGluajtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcbiAgICAvLyBuZXdDb25zdHJ1Y3Rvci5fX3Byb3RvX18gPSBvcmlnaW5hbC5fX3Byb3RvX187XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbnN0YW5jZVRyYW5zZm9ybWVyID0gKGluamVjdGFibGU6IGFueSwgb2JqOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuXG4gKiBGb3IgcHJvamVjdHMgd2hlcmUgbWluaWZpY2F0aW9uIG9jY3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge0luc3RhbmNlVHJhbnNmb3JtZXJ9IFt0cmFuc2Zvcm1lcl0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdCgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogR2V0IHR5cGUgZnJvbSBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBwcm9wZXJ0eSBnZXR0ZXJcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gcHJvcGVydHkgYWNjZXNzZWRcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBhY2Nlc3MgcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHNcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBpbiBXZWFrTWFwXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIGFsdCBJbmplY3RhYmxlIGZvdW5kXG4gKiAgICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBpbmplY3RhYmxlIGluc3RhbmNlXG4gKiAgICAgICBvcHQgSGFzIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCB0cmFuc2Zvcm1lclxuICogICAgICAgZW5kXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIGluIFdlYWtNYXBcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICogICAgIGVsc2UgTm8gaW5qZWN0YWJsZVxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogVGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoY2F0ZWdvcnk/OiBzdHJpbmcsIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgY2F0ZWdvcnkgfHwgZ2V0VHlwZUZyb21EZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUKSxcbiAgICAgIHtcbiAgICAgICAgaW5qZWN0YWJsZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHZhbHVlcy5nZXQodGhpcyk7XG4gICAgICAgICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghb2JqKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZX0gdG8gaW5qZWN0IGluICR7dGFyZ2V0LmNvbnN0cnVjdG9yID8gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgOiB0YXJnZXQubmFtZX0ncyAke3Byb3BlcnR5S2V5fWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gdHJhbnNmb3JtZXIob2JqLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBBIGxpZ2h0d2VpZ2h0IGRlcGVuZGVuY3kgaW5qZWN0aW9uIGxpYnJhcnkgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICogQHN1bW1hcnkgQWRkcyBhIHNpbXBsZSBJbmplY3RhYmxlcyBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgc2luZ2xldG9uIGluc3RhbmNlcyBvZiBhbiBvYmplY3RcbiAqIGFuZCBlYXNpbHkgaW5qZWN0IGl0IGludG8gb3RoZXIgb2JqZWN0cy4gUHJvdmlkZXMgZGVjb3JhdG9ycyBmb3IgbWFya2luZyBjbGFzc2VzIGFzIGluamVjdGFibGVcbiAqIGFuZCBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcyBpbnRvIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQG1vZHVsZSBpbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBpbmplY3RhYmxlLWRlY29yYXRvcnMgbGlicmFyeS5cbiAqIEBzdW1tYXJ5IERlZmluZWQgb24gbGlicmFyeSBidWlsZC4gSG9sZHMgdGhlIGxpYnJhcnkncyBjdXJyZW50IHZlcnNpb24gc3RyaW5nLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7O0lBVUc7QUFDVSxVQUFBLGVBQWUsR0FBRztJQUM3QixJQUFBLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLElBQUEsVUFBVSxFQUFF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
|