@decaf-ts/logging 0.1.0 → 0.2.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.
- package/dist/logging.cjs +458 -125
- package/dist/logging.esm.cjs +454 -119
- package/lib/constants.cjs +116 -17
- package/lib/constants.d.ts +72 -10
- package/lib/esm/constants.d.ts +72 -10
- package/lib/esm/constants.js +115 -16
- package/lib/esm/index.d.ts +2 -5
- package/lib/esm/index.js +3 -6
- package/lib/esm/logging.d.ts +172 -19
- package/lib/esm/logging.js +353 -37
- package/lib/esm/types.d.ts +122 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/winston/index.d.ts +0 -0
- package/lib/esm/winston/index.js +2 -0
- package/lib/esm/winston/winston.d.ts +12 -0
- package/lib/esm/winston/winston.js +44 -0
- package/lib/index.cjs +3 -6
- package/lib/index.d.ts +2 -5
- package/lib/logging.cjs +354 -37
- package/lib/logging.d.ts +172 -19
- package/lib/types.cjs +3 -0
- package/lib/types.d.ts +122 -0
- package/lib/winston/index.cjs +2 -0
- package/lib/winston/index.d.ts +0 -0
- package/lib/winston/winston.cjs +52 -0
- package/lib/winston/winston.d.ts +12 -0
- package/package.json +7 -4
- package/lib/Factory.cjs +0 -10
- package/lib/Factory.d.ts +0 -13
- package/lib/default.cjs +0 -76
- package/lib/default.d.ts +0 -9
- package/lib/esm/Factory.d.ts +0 -13
- package/lib/esm/Factory.js +0 -6
- package/lib/esm/default.d.ts +0 -9
- package/lib/esm/default.js +0 -72
- package/lib/esm/interfaces.d.ts +0 -21
- package/lib/esm/interfaces.js +0 -2
- package/lib/esm/utils.d.ts +0 -2
- package/lib/esm/utils.js +0 -8
- package/lib/esm/winston.d.ts +0 -15
- package/lib/esm/winston.js +0 -38
- package/lib/interfaces.cjs +0 -3
- package/lib/interfaces.d.ts +0 -21
- package/lib/utils.cjs +0 -11
- package/lib/utils.d.ts +0 -2
- package/lib/winston.cjs +0 -75
- package/lib/winston.d.ts +0 -15
package/dist/logging.cjs
CHANGED
|
@@ -1,151 +1,484 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.logging = {}));
|
|
5
|
-
})(this, (function (exports) { 'use strict';
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('styled-string-builder')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'styled-string-builder'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.logging = {}, global.styledStringBuilder));
|
|
5
|
+
})(this, (function (exports, styledStringBuilder) { 'use strict';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @description Enum for log levels.
|
|
9
|
+
* @summary Defines different levels of logging for the application.
|
|
10
|
+
* @enum {string}
|
|
11
|
+
* @memberOf @decaf-ts/utils
|
|
12
|
+
*/
|
|
7
13
|
exports.LogLevel = void 0;
|
|
8
14
|
(function (LogLevel) {
|
|
9
|
-
|
|
10
|
-
LogLevel["
|
|
11
|
-
|
|
12
|
-
LogLevel["
|
|
13
|
-
|
|
14
|
-
LogLevel["
|
|
15
|
-
|
|
16
|
-
LogLevel["
|
|
15
|
+
/** Error events that are likely to cause problems. */
|
|
16
|
+
LogLevel["error"] = "error";
|
|
17
|
+
/** Routine information, such as ongoing status or performance. */
|
|
18
|
+
LogLevel["info"] = "info";
|
|
19
|
+
/** Additional relevant information. */
|
|
20
|
+
LogLevel["verbose"] = "verbose";
|
|
21
|
+
/** Debug or trace information. */
|
|
22
|
+
LogLevel["debug"] = "debug";
|
|
23
|
+
/** way too verbose or silly information. */
|
|
24
|
+
LogLevel["silly"] = "silly";
|
|
17
25
|
})(exports.LogLevel || (exports.LogLevel = {}));
|
|
26
|
+
/**
|
|
27
|
+
* @description Numeric values associated with log levels.
|
|
28
|
+
* @summary Provides a numeric representation of log levels for comparison and filtering.
|
|
29
|
+
* @const {Object} NumericLogLevels
|
|
30
|
+
* @property {number} error - Numeric value for error level (0).
|
|
31
|
+
* @property {number} info - Numeric value for info level (2).
|
|
32
|
+
* @property {number} verbose - Numeric value for verbose level (4).
|
|
33
|
+
* @property {number} debug - Numeric value for debug level (5).
|
|
34
|
+
* @property {number} silly - Numeric value for silly level (8).
|
|
35
|
+
* @memberOf @decaf-ts/utils
|
|
36
|
+
*/
|
|
18
37
|
const NumericLogLevels = {
|
|
19
|
-
error:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
error: 2,
|
|
39
|
+
info: 4,
|
|
40
|
+
verbose: 6,
|
|
41
|
+
debug: 7,
|
|
42
|
+
silly: 9,
|
|
43
|
+
};
|
|
44
|
+
exports.LoggingMode = void 0;
|
|
45
|
+
(function (LoggingMode) {
|
|
46
|
+
LoggingMode["RAW"] = "raw";
|
|
47
|
+
LoggingMode["JSON"] = "json";
|
|
48
|
+
})(exports.LoggingMode || (exports.LoggingMode = {}));
|
|
49
|
+
/**
|
|
50
|
+
* @description Default theme for styling log output.
|
|
51
|
+
* @summary Defines the default color and style settings for various components of log messages.
|
|
52
|
+
* @const DefaultTheme
|
|
53
|
+
* @typedef {Theme} DefaultTheme
|
|
54
|
+
* @property {Object} class - Styling for class names.
|
|
55
|
+
* @property {number} class.fg - Foreground color code for class names (4).
|
|
56
|
+
* @property {Object} id - Styling for identifiers.
|
|
57
|
+
* @property {number} id.fg - Foreground color code for identifiers (36).
|
|
58
|
+
* @property {Object} stack - Styling for stack traces (empty object).
|
|
59
|
+
* @property {Object} timestamp - Styling for timestamps (empty object).
|
|
60
|
+
* @property {Object} message - Styling for different types of messages.
|
|
61
|
+
* @property {Object} message.error - Styling for error messages.
|
|
62
|
+
* @property {number} message.error.fg - Foreground color code for error messages (34).
|
|
63
|
+
* @property {Object} method - Styling for method names (empty object).
|
|
64
|
+
* @property {Object} logLevel - Styling for different log levels.
|
|
65
|
+
* @property {Object} logLevel.error - Styling for error level logs.
|
|
66
|
+
* @property {number} logLevel.error.fg - Foreground color code for error level logs (6).
|
|
67
|
+
* @property {Object} logLevel.info - Styling for info level logs (empty object).
|
|
68
|
+
* @property {Object} logLevel.verbose - Styling for verbose level logs (empty object).
|
|
69
|
+
* @property {Object} logLevel.debug - Styling for debug level logs.
|
|
70
|
+
* @property {number} logLevel.debug.fg - Foreground color code for debug level logs (7).
|
|
71
|
+
* @memberOf @decaf-ts/utils
|
|
72
|
+
*/
|
|
73
|
+
const DefaultTheme = {
|
|
74
|
+
class: {
|
|
75
|
+
fg: 34,
|
|
76
|
+
},
|
|
77
|
+
id: {
|
|
78
|
+
fg: 36,
|
|
79
|
+
},
|
|
80
|
+
stack: {},
|
|
81
|
+
timestamp: {},
|
|
82
|
+
message: {
|
|
83
|
+
error: {
|
|
84
|
+
fg: 31,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
method: {},
|
|
88
|
+
logLevel: {
|
|
89
|
+
error: {
|
|
90
|
+
fg: 31,
|
|
91
|
+
style: ["bold"],
|
|
92
|
+
},
|
|
93
|
+
info: {},
|
|
94
|
+
verbose: {},
|
|
95
|
+
debug: {
|
|
96
|
+
fg: 33,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* @description Default configuration for logging.
|
|
102
|
+
* @summary Defines the default settings for the logging system, including verbosity, log level, styling, and timestamp format.
|
|
103
|
+
* @const DefaultLoggingConfig
|
|
104
|
+
* @typedef {LoggingConfig} DefaultLoggingConfig
|
|
105
|
+
* @property {number} verbose - Verbosity level (0).
|
|
106
|
+
* @property {LogLevel} level - Default log level (LogLevel.info).
|
|
107
|
+
* @property {boolean} style - Whether to apply styling to log output (false).
|
|
108
|
+
* @property {boolean} timestamp - Whether to include timestamps in log messages (true).
|
|
109
|
+
* @property {string} timestampFormat - Format for timestamps ("HH:mm:ss.SSS").
|
|
110
|
+
* @property {boolean} context - Whether to include context information in log messages (true).
|
|
111
|
+
* @property {Theme} theme - The theme to use for styling log messages (DefaultTheme).
|
|
112
|
+
* @memberOf @decaf-ts/utils
|
|
113
|
+
*/
|
|
114
|
+
const DefaultLoggingConfig = {
|
|
115
|
+
verbose: 0,
|
|
116
|
+
level: exports.LogLevel.info,
|
|
117
|
+
logLevel: true,
|
|
118
|
+
mode: exports.LoggingMode.RAW,
|
|
119
|
+
style: false,
|
|
120
|
+
separator: " - ",
|
|
121
|
+
timestamp: true,
|
|
122
|
+
timestampFormat: "HH:mm:ss.SSS",
|
|
123
|
+
context: true,
|
|
124
|
+
theme: DefaultTheme,
|
|
26
125
|
};
|
|
27
126
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
127
|
+
/**
|
|
128
|
+
* @description A minimal logger implementation.
|
|
129
|
+
* @summary MiniLogger is a lightweight logging class that implements the VerbosityLogger interface.
|
|
130
|
+
* It provides basic logging functionality with support for different log levels and verbosity.
|
|
131
|
+
*
|
|
132
|
+
* @class
|
|
133
|
+
*/
|
|
134
|
+
class MiniLogger {
|
|
135
|
+
/**
|
|
136
|
+
* @description Creates a new MiniLogger instance.
|
|
137
|
+
* @summary Initializes a MiniLogger with the given class name, optional configuration, and method name.
|
|
138
|
+
*
|
|
139
|
+
* @param context - The name of the class using this logger.
|
|
140
|
+
* @param [conf] - Optional logging configuration. Defaults to Info level and verbosity 0.
|
|
141
|
+
* @param [id] - Optional unique identifier for the logger instance.
|
|
142
|
+
*/
|
|
143
|
+
constructor(context, conf, id) {
|
|
144
|
+
this.context = context;
|
|
145
|
+
this.conf = conf;
|
|
146
|
+
this.id = id;
|
|
31
147
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return NumericLogLevels[level.toString()];
|
|
148
|
+
config(key) {
|
|
149
|
+
if (this.conf && key in this.conf)
|
|
150
|
+
return this.conf[key];
|
|
151
|
+
return Logging.getConfig()[key];
|
|
37
152
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
153
|
+
for(method, config) {
|
|
154
|
+
method = method
|
|
155
|
+
? typeof method === "string"
|
|
156
|
+
? method
|
|
157
|
+
: method.name
|
|
158
|
+
: undefined;
|
|
159
|
+
return Logging.for([this.context, method].join("."), this.id, config);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* @description Creates a formatted log string.
|
|
163
|
+
* @summary Generates a log string with timestamp, colored log level, and message.
|
|
164
|
+
*
|
|
165
|
+
* @param level - The log level as a string.
|
|
166
|
+
* @param message
|
|
167
|
+
* @param stack
|
|
168
|
+
* @return A formatted log string.
|
|
169
|
+
*/
|
|
170
|
+
createLog(level, message, stack) {
|
|
171
|
+
const log = [];
|
|
172
|
+
const style = this.config("style");
|
|
173
|
+
if (this.config("timestamp")) {
|
|
174
|
+
const date = new Date().toISOString();
|
|
175
|
+
const timestamp = style ? Logging.theme(date, "timestamp", level) : date;
|
|
176
|
+
log.push(timestamp);
|
|
177
|
+
}
|
|
178
|
+
if (this.config("logLevel")) {
|
|
179
|
+
const lvl = style
|
|
180
|
+
? Logging.theme(level, "logLevel", level)
|
|
181
|
+
: level;
|
|
182
|
+
log.push(lvl);
|
|
183
|
+
}
|
|
184
|
+
if (this.config("context")) {
|
|
185
|
+
const context = style
|
|
186
|
+
? Logging.theme(this.context, "class", level)
|
|
187
|
+
: this.context;
|
|
188
|
+
log.push(context);
|
|
189
|
+
}
|
|
190
|
+
if (this.id) {
|
|
191
|
+
{
|
|
192
|
+
const id = style
|
|
193
|
+
? Logging.theme(this.id, "id", level)
|
|
194
|
+
: this.id;
|
|
195
|
+
log.push(id);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const msg = style
|
|
199
|
+
? Logging.theme(typeof message === "string" ? message : message.message, "message", level)
|
|
200
|
+
: typeof message === "string"
|
|
201
|
+
? message
|
|
202
|
+
: message.message;
|
|
203
|
+
log.push(msg);
|
|
204
|
+
if (stack || message instanceof Error) {
|
|
205
|
+
stack = style
|
|
206
|
+
? Logging.theme((stack || message.stack), "stack", level)
|
|
207
|
+
: stack;
|
|
208
|
+
log.push(`\nStack trace:\n${stack}`);
|
|
209
|
+
}
|
|
210
|
+
return log.join(this.config("separator"));
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @description Logs a message with the specified log level.
|
|
214
|
+
* @summary Checks if the message should be logged based on the current log level,
|
|
215
|
+
* then uses the appropriate console method to output the log.
|
|
216
|
+
*
|
|
217
|
+
* @param level - The log level of the message.
|
|
218
|
+
* @param msg - The message to be logged.
|
|
219
|
+
* @param stack
|
|
220
|
+
*/
|
|
221
|
+
log(level, msg, stack) {
|
|
222
|
+
if (NumericLogLevels[this.config("level")] <
|
|
223
|
+
NumericLogLevels[level])
|
|
49
224
|
return;
|
|
50
|
-
|
|
51
|
-
const msg = `${profile ? `[${profile}]` : ""}${app ? `[${app}]` : ""}${context ? `[${context}]` : ""}${this.clazz ? `[${this.clazz}]` : ""}${this.method ? `[${this.method}]` : ""} ${message}`;
|
|
225
|
+
let method;
|
|
52
226
|
switch (level) {
|
|
53
|
-
case exports.LogLevel.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
case exports.LogLevel.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
case exports.LogLevel.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
case exports.LogLevel.Silly:
|
|
64
|
-
return console.debug(msg);
|
|
227
|
+
case exports.LogLevel.info:
|
|
228
|
+
method = console.log;
|
|
229
|
+
break;
|
|
230
|
+
case exports.LogLevel.verbose:
|
|
231
|
+
case exports.LogLevel.debug:
|
|
232
|
+
method = console.debug;
|
|
233
|
+
break;
|
|
234
|
+
case exports.LogLevel.error:
|
|
235
|
+
method = console.error;
|
|
236
|
+
break;
|
|
65
237
|
default:
|
|
66
|
-
throw new Error(
|
|
238
|
+
throw new Error("Invalid log level");
|
|
67
239
|
}
|
|
240
|
+
method(this.createLog(level, msg, stack));
|
|
68
241
|
}
|
|
69
|
-
|
|
70
|
-
|
|
242
|
+
/**
|
|
243
|
+
* @description LLogs a `way too verbose` or a silly message.
|
|
244
|
+
* @summary Logs a message at the Silly level if the current verbosity allows it.
|
|
245
|
+
*
|
|
246
|
+
* @param msg - The message to be logged.
|
|
247
|
+
* @param verbosity - The verbosity level of the message (default: 0).
|
|
248
|
+
*/
|
|
249
|
+
silly(msg, verbosity = 0) {
|
|
250
|
+
if (this.config("verbose") >= verbosity)
|
|
251
|
+
this.log(exports.LogLevel.verbose, msg);
|
|
71
252
|
}
|
|
72
|
-
|
|
73
|
-
|
|
253
|
+
/**
|
|
254
|
+
* @description Logs a verbose message.
|
|
255
|
+
* @summary Logs a message at the Verbose level if the current verbosity allows it.
|
|
256
|
+
*
|
|
257
|
+
* @param msg - The message to be logged.
|
|
258
|
+
* @param verbosity - The verbosity level of the message (default: 0).
|
|
259
|
+
*/
|
|
260
|
+
verbose(msg, verbosity = 0) {
|
|
261
|
+
if (this.config("verbose") >= verbosity)
|
|
262
|
+
this.log(exports.LogLevel.verbose, msg);
|
|
74
263
|
}
|
|
75
|
-
|
|
76
|
-
|
|
264
|
+
/**
|
|
265
|
+
* @description Logs an info message.
|
|
266
|
+
* @summary Logs a message at the Info level.
|
|
267
|
+
*
|
|
268
|
+
* @param msg - The message to be logged.
|
|
269
|
+
*/
|
|
270
|
+
info(msg) {
|
|
271
|
+
this.log(exports.LogLevel.info, msg);
|
|
77
272
|
}
|
|
78
|
-
|
|
79
|
-
|
|
273
|
+
/**
|
|
274
|
+
* @description Logs a debug message.
|
|
275
|
+
* @summary Logs a message at the Debug level.
|
|
276
|
+
*
|
|
277
|
+
* @param msg - The message to be logged.
|
|
278
|
+
*/
|
|
279
|
+
debug(msg) {
|
|
280
|
+
this.log(exports.LogLevel.debug, msg);
|
|
80
281
|
}
|
|
81
|
-
|
|
82
|
-
|
|
282
|
+
/**
|
|
283
|
+
* @description Logs an error message.
|
|
284
|
+
* @summary Logs a message at the Error level.
|
|
285
|
+
*
|
|
286
|
+
* @param msg - The message to be logged.
|
|
287
|
+
*/
|
|
288
|
+
error(msg) {
|
|
289
|
+
this.log(exports.LogLevel.error, msg);
|
|
83
290
|
}
|
|
84
|
-
|
|
85
|
-
|
|
291
|
+
setConfig(config) {
|
|
292
|
+
this.conf = { ...(this.conf || {}), ...config };
|
|
86
293
|
}
|
|
87
|
-
|
|
88
|
-
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @description A static class for managing logging operations.
|
|
297
|
+
* @summary The Logging class provides a centralized logging mechanism with support for
|
|
298
|
+
* different log levels and verbosity. It uses a singleton pattern to maintain a global
|
|
299
|
+
* logger instance and allows creating specific loggers for different classes and methods.
|
|
300
|
+
*
|
|
301
|
+
* @class
|
|
302
|
+
*/
|
|
303
|
+
class Logging {
|
|
304
|
+
/**
|
|
305
|
+
* @description Factory function for creating logger instances.
|
|
306
|
+
* @summary A function that creates new VerbosityLogger instances. By default, it creates a MiniLogger.
|
|
307
|
+
*/
|
|
308
|
+
static { this._factory = (object, config, id) => {
|
|
309
|
+
return new MiniLogger(object, config, id);
|
|
310
|
+
}; }
|
|
311
|
+
/**
|
|
312
|
+
* @description Configuration for the logging system.
|
|
313
|
+
* @summary Stores the global verbosity level and log level settings.
|
|
314
|
+
*/
|
|
315
|
+
static { this._config = DefaultLoggingConfig; }
|
|
316
|
+
/**
|
|
317
|
+
* @description Private constructor to prevent instantiation.
|
|
318
|
+
* @summary Ensures that the Logging class cannot be instantiated as it's designed to be used statically.
|
|
319
|
+
*/
|
|
320
|
+
constructor() { }
|
|
321
|
+
setFactory(factory) {
|
|
322
|
+
Logging._factory = factory;
|
|
89
323
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
324
|
+
/**
|
|
325
|
+
* @description Setter for the logging configuration.
|
|
326
|
+
* @summary Allows updating the global logging configuration.
|
|
327
|
+
*
|
|
328
|
+
* @param config - An object containing verbosity and log level settings.
|
|
329
|
+
*/
|
|
330
|
+
static setConfig(config) {
|
|
331
|
+
Object.assign(this._config, config);
|
|
93
332
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
constructor(level) {
|
|
97
|
-
super(level);
|
|
333
|
+
static getConfig() {
|
|
334
|
+
return Object.assign({}, this._config);
|
|
98
335
|
}
|
|
99
|
-
|
|
100
|
-
|
|
336
|
+
/**
|
|
337
|
+
* @description Retrieves or creates the global logger instance.
|
|
338
|
+
* @summary Returns the existing global logger or creates a new one if it doesn't exist.
|
|
339
|
+
*
|
|
340
|
+
* @return The global VerbosityLogger instance.
|
|
341
|
+
*/
|
|
342
|
+
static get() {
|
|
343
|
+
this.global = this.global ? this.global : this._factory("Logging");
|
|
344
|
+
return this.global;
|
|
101
345
|
}
|
|
102
|
-
|
|
103
|
-
|
|
346
|
+
/**
|
|
347
|
+
* @description Logs a verbose message.
|
|
348
|
+
* @summary Delegates the verbose logging to the global logger instance.
|
|
349
|
+
*
|
|
350
|
+
* @param msg - The message to be logged.
|
|
351
|
+
* @param verbosity - The verbosity level of the message (default: 0).
|
|
352
|
+
*/
|
|
353
|
+
static verbose(msg, verbosity = 0) {
|
|
354
|
+
return this.get().verbose(msg, verbosity);
|
|
104
355
|
}
|
|
105
|
-
|
|
106
|
-
|
|
356
|
+
/**
|
|
357
|
+
* @description Logs an info message.
|
|
358
|
+
* @summary Delegates the info logging to the global logger instance.
|
|
359
|
+
*
|
|
360
|
+
* @param msg - The message to be logged.
|
|
361
|
+
*/
|
|
362
|
+
static info(msg) {
|
|
363
|
+
return this.get().info(msg);
|
|
107
364
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
static
|
|
115
|
-
|
|
116
|
-
static get level() {
|
|
117
|
-
return this._level;
|
|
118
|
-
}
|
|
119
|
-
static set level(level) {
|
|
120
|
-
this._level = level;
|
|
121
|
-
}
|
|
122
|
-
static get instance() {
|
|
123
|
-
if (!this._instance)
|
|
124
|
-
this._instance = new this._factory(Logging.level);
|
|
125
|
-
return this._instance;
|
|
126
|
-
}
|
|
127
|
-
static set factory(factory) {
|
|
128
|
-
this._factory = factory;
|
|
129
|
-
}
|
|
130
|
-
static forClass(clazz) {
|
|
131
|
-
const name = clazz.name;
|
|
132
|
-
if (!(name in this.cacheByClass))
|
|
133
|
-
this.cacheByClass[name] = Logging.instance.forClass(clazz);
|
|
134
|
-
return this.cacheByClass[name];
|
|
135
|
-
}
|
|
136
|
-
static forMethod(clazz, method) {
|
|
137
|
-
const name = clazz.name;
|
|
138
|
-
if (!(name in this.cacheByClassMethod))
|
|
139
|
-
this.cacheByClassMethod[name] = {};
|
|
140
|
-
const methodName = typeof method === "string" ? method : method.name;
|
|
141
|
-
if (!(methodName in this.cacheByClassMethod[name]))
|
|
142
|
-
this.cacheByClassMethod[name][methodName] = Logging.instance.forMethod(clazz, method);
|
|
143
|
-
return this.cacheByClassMethod[name][methodName];
|
|
365
|
+
/**
|
|
366
|
+
* @description Logs a debug message.
|
|
367
|
+
* @summary Delegates the debug logging to the global logger instance.
|
|
368
|
+
*
|
|
369
|
+
* @param msg - The message to be logged.
|
|
370
|
+
*/
|
|
371
|
+
static debug(msg) {
|
|
372
|
+
return this.get().debug(msg);
|
|
144
373
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
374
|
+
/**
|
|
375
|
+
* @description Logs a silly message.
|
|
376
|
+
* @summary Delegates the debug logging to the global logger instance.
|
|
377
|
+
*
|
|
378
|
+
* @param msg - The message to be logged.
|
|
379
|
+
*/
|
|
380
|
+
static silly(msg) {
|
|
381
|
+
return this.get().silly(msg);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* @description Logs an error message.
|
|
385
|
+
* @summary Delegates the error logging to the global logger instance.
|
|
386
|
+
*
|
|
387
|
+
* @param msg - The message to be logged.
|
|
388
|
+
*/
|
|
389
|
+
static error(msg) {
|
|
390
|
+
return this.get().error(msg);
|
|
391
|
+
}
|
|
392
|
+
static for(object, id, config) {
|
|
393
|
+
object = typeof object === "string" ? object : object.name;
|
|
394
|
+
id = typeof id === "string" ? id : undefined;
|
|
395
|
+
config = typeof id === "object" ? id : config;
|
|
396
|
+
return this._factory(object, config, id);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* @description Creates a logger for a specific reason or context.
|
|
400
|
+
*
|
|
401
|
+
* @summary This static method creates a new logger instance using the factory function,
|
|
402
|
+
* based on a given reason or context.
|
|
403
|
+
*
|
|
404
|
+
* @param reason - A string describing the reason or context for creating this logger.
|
|
405
|
+
* @param id
|
|
406
|
+
* @returns A new VerbosityLogger or ClassLogger instance.
|
|
407
|
+
*/
|
|
408
|
+
static because(reason, id) {
|
|
409
|
+
return this._factory(reason, this._config, id);
|
|
410
|
+
}
|
|
411
|
+
static theme(text, type, loggerLevel, template = DefaultTheme) {
|
|
412
|
+
if (!this._config.style)
|
|
413
|
+
return text;
|
|
414
|
+
const logger = Logging.get().for(this.theme);
|
|
415
|
+
function apply(txt, option, value) {
|
|
416
|
+
try {
|
|
417
|
+
const t = txt;
|
|
418
|
+
let c = styledStringBuilder.style(t);
|
|
419
|
+
function applyColor(val, isBg = false) {
|
|
420
|
+
let f = isBg ? c.background : c.foreground;
|
|
421
|
+
if (!Array.isArray(val)) {
|
|
422
|
+
return f.call(c, value);
|
|
423
|
+
}
|
|
424
|
+
switch (val.length) {
|
|
425
|
+
case 1:
|
|
426
|
+
f = isBg ? c.bgColor256 : c.color256;
|
|
427
|
+
return f(val[0]);
|
|
428
|
+
case 3:
|
|
429
|
+
f = isBg ? c.bgRgb : c.rgb;
|
|
430
|
+
return c.rgb(val[0], val[1], val[2]);
|
|
431
|
+
default:
|
|
432
|
+
logger.error(`Not a valid color option: ${option}`);
|
|
433
|
+
return styledStringBuilder.style(t);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function applyStyle(v) {
|
|
437
|
+
if (typeof v === "number") {
|
|
438
|
+
c = c.style(v);
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
c = c[v];
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
switch (option) {
|
|
445
|
+
case "bg":
|
|
446
|
+
case "fg":
|
|
447
|
+
return applyColor(value).text;
|
|
448
|
+
case "style":
|
|
449
|
+
if (Array.isArray(value)) {
|
|
450
|
+
value.forEach(applyStyle);
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
applyStyle(value);
|
|
454
|
+
}
|
|
455
|
+
return c.text;
|
|
456
|
+
default:
|
|
457
|
+
logger.error(`Not a valid theme option: ${option}`);
|
|
458
|
+
return t;
|
|
459
|
+
}
|
|
460
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
461
|
+
}
|
|
462
|
+
catch (e) {
|
|
463
|
+
logger.error(`Error applying style: ${option} with value ${value}`);
|
|
464
|
+
return txt;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
const individualTheme = template[type];
|
|
468
|
+
if (!individualTheme || !Object.keys(individualTheme).length) {
|
|
469
|
+
return text;
|
|
470
|
+
}
|
|
471
|
+
let actualTheme = individualTheme;
|
|
472
|
+
const logLevels = Object.assign({}, exports.LogLevel);
|
|
473
|
+
if (Object.keys(individualTheme)[0] in logLevels)
|
|
474
|
+
actualTheme =
|
|
475
|
+
individualTheme[loggerLevel] || {};
|
|
476
|
+
return Object.keys(actualTheme).reduce((acc, key) => {
|
|
477
|
+
const val = actualTheme[key];
|
|
478
|
+
if (val)
|
|
479
|
+
return apply(acc, key, val);
|
|
480
|
+
return acc;
|
|
481
|
+
}, text);
|
|
149
482
|
}
|
|
150
483
|
}
|
|
151
484
|
|
|
@@ -166,14 +499,14 @@
|
|
|
166
499
|
* @const VERSION
|
|
167
500
|
* @memberOf module:ts-workspace
|
|
168
501
|
*/
|
|
169
|
-
const VERSION = "0.1
|
|
502
|
+
const VERSION = "0.2.1";
|
|
170
503
|
|
|
171
|
-
exports.
|
|
172
|
-
exports.
|
|
504
|
+
exports.DefaultLoggingConfig = DefaultLoggingConfig;
|
|
505
|
+
exports.DefaultTheme = DefaultTheme;
|
|
173
506
|
exports.Logging = Logging;
|
|
507
|
+
exports.MiniLogger = MiniLogger;
|
|
174
508
|
exports.NumericLogLevels = NumericLogLevels;
|
|
175
509
|
exports.VERSION = VERSION;
|
|
176
|
-
exports.toLogLevel = toLogLevel;
|
|
177
510
|
|
|
178
511
|
}));
|
|
179
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvRmFjdG9yeS50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9kZWZhdWx0LnRzIiwiLi4vc3JjL2xvZ2dpbmcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBGYXRhbCA9IFwiZmF0YWxcIiwgLy8gQSBwZXJzb24gbXVzdCB0YWtlIGFuIGFjdGlvbiBpbW1lZGlhdGVseVxuICBFcnJvciA9IFwiZXJyb3JcIiwgLy8gRXJyb3IgZXZlbnRzIGFyZSBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXNcbiAgV2FybiA9IFwid2FyblwiLCAvLyBXYXJuaW5nIGV2ZW50cyBtaWdodCBjYXVzZSBwcm9ibGVtcyBpbiB0aGUgZnV0dXJlIGFuZCBkZXNlcnZlIGV5ZXNcbiAgSW5mbyA9IFwiaW5mb1wiLCAvLyBSb3V0aW5lIGluZm9ybWF0aW9uLCBzdWNoIGFzIG9uZ29pbmcgc3RhdHVzIG9yIHBlcmZvcm1hbmNlXG4gIEh0dHAgPSBcImh0dHBcIiwgLy8gSHR0cCBpbmZvcm1hdGlvblxuICBWZXJib3NlID0gXCJ2ZXJib3NlXCIsIC8vIERlYnVnIG9yIHRyYWNlIGluZm9ybWF0aW9uXG4gIERlYnVnID0gXCJkZWJ1Z1wiLCAvLyBEZWJ1ZyBvciB0cmFjZSBpbmZvcm1hdGlvblxuICBTaWxseSA9IFwic2lsbHlcIiwgLy8gRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb25cbn1cblxuZXhwb3J0IGNvbnN0IE51bWVyaWNMb2dMZXZlbHMgPSB7XG4gIGVycm9yOiAwLFxuICB3YXJuOiAxLFxuICBpbmZvOiAyLFxuICBodHRwOiAzLFxuICB2ZXJib3NlOiA0LFxuICBkZWJ1ZzogNSxcbiAgc2lsbHk6IDYsXG59O1xuIiwiaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ2dlckZhY3Rvcnkge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGxldmVsOiBMb2dMZXZlbCkge31cbiAgYWJzdHJhY3QgZm9yQ2xhc3MoY2xheno6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9KTogTG9nZ2VyO1xuICBhYnN0cmFjdCBmb3JNZXRob2QoXG4gICAgY2xheno6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9LFxuICAgIG1ldGhvZDogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHN0cmluZ1xuICApOiBMb2dnZXI7XG4gIGFic3RyYWN0IGdldCgpOiBMb2dnZXI7XG59XG4iLCJpbXBvcnQgeyBMb2dMZXZlbCwgTnVtZXJpY0xvZ0xldmVscyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2dMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiBudW1iZXIge1xuICBpZiAobGV2ZWwudG9TdHJpbmcoKSBpbiBOdW1lcmljTG9nTGV2ZWxzKSB7XG4gICAgcmV0dXJuIChOdW1lcmljTG9nTGV2ZWxzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2xldmVsLnRvU3RyaW5nKCldO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsZXZlbDogJHtsZXZlbC50b1N0cmluZygpfWApO1xufVxuIiwiaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gXCIuL0ZhY3RvcnlcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBMb2dEYXRhLCBMb2dnZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyB0b0xvZ0xldmVsIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY2xhc3MgRGVmYXVsdExvZ2dlciBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcHJvdGVjdGVkIGNsYXp6Pzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBtZXRob2Q/OiBzdHJpbmdcbiAgKSB7fVxuXG4gIGxvZyhcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICBpZiAodG9Mb2dMZXZlbChsZXZlbCkgPCB0b0xvZ0xldmVsKHRoaXMubGV2ZWwpKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGNvbnRleHQsIGFwcCB9ID0gZGF0YSB8fCB7fTtcblxuICAgICBcbiAgICBjb25zdCBtc2cgPSBgJHtwcm9maWxlID8gYFske3Byb2ZpbGV9XWAgOiBcIlwifSR7YXBwID8gYFske2FwcH1dYCA6IFwiXCJ9JHtjb250ZXh0ID8gYFske2NvbnRleHR9XWAgOiBcIlwifSR7dGhpcy5jbGF6eiA/IGBbJHt0aGlzLmNsYXp6fV1gIDogXCJcIn0ke3RoaXMubWV0aG9kID8gYFske3RoaXMubWV0aG9kfV1gIDogXCJcIn0gJHttZXNzYWdlfWA7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgTG9nTGV2ZWwuRmF0YWw6XG4gICAgY2FzZSBMb2dMZXZlbC5FcnJvcjpcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgY2FzZSBMb2dMZXZlbC5XYXJuOlxuICAgICAgcmV0dXJuIGNvbnNvbGUud2Fybihtc2cpO1xuICAgIGNhc2UgTG9nTGV2ZWwuSW5mbzpcbiAgICAgIHJldHVybiBjb25zb2xlLmluZm8obXNnKTtcbiAgICBjYXNlIExvZ0xldmVsLkh0dHA6XG4gICAgY2FzZSBMb2dMZXZlbC5WZXJib3NlOlxuICAgIGNhc2UgTG9nTGV2ZWwuRGVidWc6XG4gICAgY2FzZSBMb2dMZXZlbC5TaWxseTpcbiAgICAgIHJldHVybiBjb25zb2xlLmRlYnVnKG1zZyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2cgbGV2ZWw6ICR7bGV2ZWx9YCk7XG4gICAgfVxuICB9XG4gIHNpbGx5KFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogTG9nRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBwcm9maWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmxvZyhMb2dMZXZlbC5TaWxseSwgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cblxuICB2ZXJib3NlKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogTG9nRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBwcm9maWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmxvZyhMb2dMZXZlbC5WZXJib3NlLCBtZXNzYWdlLCBkYXRhLCBwcm9maWxlKTtcbiAgfVxuXG4gIGRlYnVnKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogTG9nRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBwcm9maWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmxvZyhMb2dMZXZlbC5EZWJ1ZywgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cbiAgaW5mbyhcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuSW5mbywgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cbiAgd2FybihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBkYXRhPzogTG9nRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBwcm9maWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmxvZyhMb2dMZXZlbC5XYXJuLCBtZXNzYWdlLCBkYXRhLCBwcm9maWxlKTtcbiAgfVxuICBlcnJvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBkYXRhPzogTG9nRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBwcm9maWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmxvZyhMb2dMZXZlbC5FcnJvciwgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cbiAgZW1lcmcoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuRmF0YWwsIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvZmlsZShpZDogc3RyaW5nIHwgbnVtYmVyLCBtZXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdExvZ2dlckZhY3RvcnkgZXh0ZW5kcyBMb2dnZXJGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IobGV2ZWw6IExvZ0xldmVsKSB7XG4gICAgc3VwZXIobGV2ZWwpO1xuICB9XG5cbiAgZm9yQ2xhc3MoY2xheno6IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSk6IExvZ2dlciB7XG4gICAgcmV0dXJuIG5ldyBEZWZhdWx0TG9nZ2VyKHRoaXMubGV2ZWwsIGNsYXp6Lm5hbWUpO1xuICB9XG4gIGZvck1ldGhvZChcbiAgICBjbGF6ejogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIG1ldGhvZDogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KVxuICApOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgRGVmYXVsdExvZ2dlcihcbiAgICAgIHRoaXMubGV2ZWwsXG4gICAgICBjbGF6ei5uYW1lLFxuICAgICAgdHlwZW9mIG1ldGhvZCA9PT0gXCJzdHJpbmdcIiA/IG1ldGhvZCA6IG1ldGhvZC5uYW1lXG4gICAgKTtcbiAgfVxuXG4gIGdldCgpOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgRGVmYXVsdExvZ2dlcih0aGlzLmxldmVsKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gXCIuL0ZhY3RvcnlcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0TG9nZ2VyRmFjdG9yeSB9IGZyb20gXCIuL2RlZmF1bHRcIjtcblxuZXhwb3J0IGNsYXNzIExvZ2dpbmcge1xuICBwcml2YXRlIHN0YXRpYyBfbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuSW5mbztcbiAgcHJpdmF0ZSBzdGF0aWMgX2ZhY3Rvcnk6IHsgbmV3IChsZXZlbDogTG9nTGV2ZWwpOiBMb2dnZXJGYWN0b3J5IH0gPVxuICAgIERlZmF1bHRMb2dnZXJGYWN0b3J5O1xuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IExvZ2dlckZhY3Rvcnk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGVCeUNsYXNzOiBSZWNvcmQ8c3RyaW5nLCBMb2dnZXI+ID0ge307XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlQnlDbGFzc01ldGhvZDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgTG9nZ2VyPj4gPVxuICAgIHt9O1xuICBwcml2YXRlIHN0YXRpYyBnbG9iYWw6IExvZ2dlcjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZ2V0IGxldmVsKCkge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxuXG4gIHN0YXRpYyBzZXQgbGV2ZWwobGV2ZWw6IExvZ0xldmVsKSB7XG4gICAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IExvZ2dlckZhY3Rvcnkge1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMuX2ZhY3RvcnkoTG9nZ2luZy5sZXZlbCk7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIHNldCBmYWN0b3J5KGZhY3Rvcnk6IHsgbmV3IChsZXZlbDogTG9nTGV2ZWwpOiBMb2dnZXJGYWN0b3J5IH0pIHtcbiAgICB0aGlzLl9mYWN0b3J5ID0gZmFjdG9yeTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JDbGFzcyhjbGF6ejogeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH0pIHtcbiAgICBjb25zdCBuYW1lID0gY2xhenoubmFtZTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGVCeUNsYXNzKSlcbiAgICAgIHRoaXMuY2FjaGVCeUNsYXNzW25hbWVdID0gTG9nZ2luZy5pbnN0YW5jZS5mb3JDbGFzcyhjbGF6eik7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVCeUNsYXNzW25hbWVdO1xuICB9XG5cbiAgc3RhdGljIGZvck1ldGhvZChcbiAgICBjbGF6ejogeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH0sXG4gICAgbWV0aG9kOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgc3RyaW5nXG4gICk6IExvZ2dlciB7XG4gICAgY29uc3QgbmFtZSA9IGNsYXp6Lm5hbWU7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZCkpIHRoaXMuY2FjaGVCeUNsYXNzTWV0aG9kW25hbWVdID0ge307XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCIgPyBtZXRob2QgOiBtZXRob2QubmFtZTtcbiAgICBpZiAoIShtZXRob2ROYW1lIGluIHRoaXMuY2FjaGVCeUNsYXNzTWV0aG9kW25hbWVdKSlcbiAgICAgIHRoaXMuY2FjaGVCeUNsYXNzTWV0aG9kW25hbWVdW21ldGhvZE5hbWVdID0gTG9nZ2luZy5pbnN0YW5jZS5mb3JNZXRob2QoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBtZXRob2RcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVCeUNsYXNzTWV0aG9kW25hbWVdW21ldGhvZE5hbWVdO1xuICB9XG5cbiAgc3RhdGljIGdldCgpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5nbG9iYWwpIHRoaXMuZ2xvYmFsID0gTG9nZ2luZy5pbnN0YW5jZS5nZXQoKTtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWw7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVmYXVsdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2luZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNb2R1bGUgc3VtbWFyeVxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSBkZXNjcmlwdGlvblxuICogQG1vZHVsZSBMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBMb2dnaW5nXG4gKiBAZGVzY3JpcHRpb24gTmFtZXNwYWNlIGRlc2NyaXB0aW9uXG4gKiBAbmFtZXNwYWNlIExvZ2dpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5cbi8qKlxuICogQHN1bW1hcnkgc3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQGRlc2NyaXB0aW9uIHRoaXMgaXMgaG93IHlvdSBzaG91bGQgZG9jdW1lbnQgYSBjb25zdGFudFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHMtd29ya3NwYWNlXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkxvZ0xldmVsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBWUE7SUFBWixDQUFBLFVBQVksUUFBUSxFQUFBO0lBQ2xCLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7SUFDZixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlO0lBQ2YsSUFBQSxRQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtJQUNiLElBQUEsUUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWE7SUFDYixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0lBQ2IsSUFBQSxRQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7SUFDbkIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtJQUNmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7SUFDakIsQ0FBQyxFQVRXQSxnQkFBUSxLQUFSQSxnQkFBUSxHQVNuQixFQUFBLENBQUEsQ0FBQTtBQUVZLFVBQUEsZ0JBQWdCLEdBQUc7SUFDOUIsSUFBQSxLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUEsSUFBSSxFQUFFLENBQUM7SUFDUCxJQUFBLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBQSxJQUFJLEVBQUUsQ0FBQztJQUNQLElBQUEsT0FBTyxFQUFFLENBQUM7SUFDVixJQUFBLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBQSxLQUFLLEVBQUUsQ0FBQzs7O1VDZlksYUFBYSxDQUFBO0lBQ2pDLElB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
|
|
512
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvbG9nZ2luZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBUaGVtZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAvKiogRXJyb3IgZXZlbnRzIHRoYXQgYXJlIGxpa2VseSB0byBjYXVzZSBwcm9ibGVtcy4gKi9cbiAgZXJyb3IgPSBcImVycm9yXCIsXG4gIC8qKiBSb3V0aW5lIGluZm9ybWF0aW9uLCBzdWNoIGFzIG9uZ29pbmcgc3RhdHVzIG9yIHBlcmZvcm1hbmNlLiAqL1xuICBpbmZvID0gXCJpbmZvXCIsXG4gIC8qKiBBZGRpdGlvbmFsIHJlbGV2YW50IGluZm9ybWF0aW9uLiAqL1xuICB2ZXJib3NlID0gXCJ2ZXJib3NlXCIsXG4gIC8qKiBEZWJ1ZyBvciB0cmFjZSBpbmZvcm1hdGlvbi4gKi9cbiAgZGVidWcgPSBcImRlYnVnXCIsXG4gIC8qKiB3YXkgdG9vIHZlcmJvc2Ugb3Igc2lsbHkgaW5mb3JtYXRpb24uICovXG4gIHNpbGx5ID0gXCJzaWxseVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBOdW1lcmljIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggbG9nIGxldmVscy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiBsb2cgbGV2ZWxzIGZvciBjb21wYXJpc29uIGFuZCBmaWx0ZXJpbmcuXG4gKiBAY29uc3Qge09iamVjdH0gTnVtZXJpY0xvZ0xldmVsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGVycm9yIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZXJyb3IgbGV2ZWwgKDApLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZm8gLSBOdW1lcmljIHZhbHVlIGZvciBpbmZvIGxldmVsICgyKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gTnVtZXJpYyB2YWx1ZSBmb3IgdmVyYm9zZSBsZXZlbCAoNCkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVidWcgLSBOdW1lcmljIHZhbHVlIGZvciBkZWJ1ZyBsZXZlbCAoNSkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2lsbHkgLSBOdW1lcmljIHZhbHVlIGZvciBzaWxseSBsZXZlbCAoOCkuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBlcnJvcjogMixcbiAgaW5mbzogNCxcbiAgdmVyYm9zZTogNixcbiAgZGVidWc6IDcsXG4gIHNpbGx5OiA5LFxufTtcblxuZXhwb3J0IGVudW0gTG9nZ2luZ01vZGUge1xuICBSQVcgPSBcInJhd1wiLFxuICBKU09OID0gXCJqc29uXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgdGhlbWUgZm9yIHN0eWxpbmcgbG9nIG91dHB1dC5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgY29sb3IgYW5kIHN0eWxlIHNldHRpbmdzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgb2YgbG9nIG1lc3NhZ2VzLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQHR5cGVkZWYge1RoZW1lfSBEZWZhdWx0VGhlbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjbGFzcyAtIFN0eWxpbmcgZm9yIGNsYXNzIG5hbWVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNsYXNzLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBjbGFzcyBuYW1lcyAoNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaWQgLSBTdHlsaW5nIGZvciBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZC5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgaWRlbnRpZmllcnMgKDM2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdGFjayAtIFN0eWxpbmcgZm9yIHN0YWNrIHRyYWNlcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBTdHlsaW5nIGZvciB0aW1lc3RhbXBzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZS5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1lc3NhZ2UuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIG1lc3NhZ2VzICgzNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWV0aG9kIC0gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBsZXZlbCBsb2dzICg2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5pbmZvIC0gU3R5bGluZyBmb3IgaW5mbyBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLnZlcmJvc2UgLSBTdHlsaW5nIGZvciB2ZXJib3NlIGxldmVsIGxvZ3MgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZGVidWcgLSBTdHlsaW5nIGZvciBkZWJ1ZyBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmRlYnVnLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBkZWJ1ZyBsZXZlbCBsb2dzICg3KS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRUaGVtZTogVGhlbWUgPSB7XG4gIGNsYXNzOiB7XG4gICAgZmc6IDM0LFxuICB9LFxuICBpZDoge1xuICAgIGZnOiAzNixcbiAgfSxcbiAgc3RhY2s6IHt9LFxuICB0aW1lc3RhbXA6IHt9LFxuICBtZXNzYWdlOiB7XG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICB9LFxuICB9LFxuICBtZXRob2Q6IHt9LFxuICBsb2dMZXZlbDoge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGluZm86IHt9LFxuICAgIHZlcmJvc2U6IHt9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgbG9nZ2luZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBsb2dnaW5nIHN5c3RlbSwgaW5jbHVkaW5nIHZlcmJvc2l0eSwgbG9nIGxldmVsLCBzdHlsaW5nLCBhbmQgdGltZXN0YW1wIGZvcm1hdC5cbiAqIEBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHR5cGVkZWYge0xvZ2dpbmdDb25maWd9IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCAoMCkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIERlZmF1bHQgbG9nIGxldmVsIChMb2dMZXZlbC5pbmZvKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3R5bGUgLSBXaGV0aGVyIHRvIGFwcGx5IHN0eWxpbmcgdG8gbG9nIG91dHB1dCAoZmFsc2UpLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0aW1lc3RhbXAgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZXN0YW1wcyBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVzdGFtcEZvcm1hdCAtIEZvcm1hdCBmb3IgdGltZXN0YW1wcyAoXCJISDptbTpzcy5TU1NcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbnRleHQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtUaGVtZX0gdGhlbWUgLSBUaGUgdGhlbWUgdG8gdXNlIGZvciBzdHlsaW5nIGxvZyBtZXNzYWdlcyAoRGVmYXVsdFRoZW1lKS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnOiBMb2dnaW5nQ29uZmlnID0ge1xuICB2ZXJib3NlOiAwLFxuICBsZXZlbDogTG9nTGV2ZWwuaW5mbyxcbiAgbG9nTGV2ZWw6IHRydWUsXG4gIG1vZGU6IExvZ2dpbmdNb2RlLlJBVyxcbiAgc3R5bGU6IGZhbHNlLFxuICBzZXBhcmF0b3I6IFwiIC0gXCIsXG4gIHRpbWVzdGFtcDogdHJ1ZSxcbiAgdGltZXN0YW1wRm9ybWF0OiBcIkhIOm1tOnNzLlNTU1wiLFxuICBjb250ZXh0OiB0cnVlLFxuICB0aGVtZTogRGVmYXVsdFRoZW1lLFxufTtcbiIsImltcG9ydCB7XG4gIExvZ2dlckZhY3RvcnksXG4gIExvZ2dpbmdDb25maWcsXG4gIExvZ2dpbmdDb250ZXh0LFxuICBTdHJpbmdMaWtlLFxuICBUaGVtZSxcbiAgVGhlbWVPcHRpb24sXG4gIFRoZW1lT3B0aW9uQnlMb2dMZXZlbCxcbiAgTG9nZ2VyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29sb3JpemVPcHRpb25zLCBzdHlsZSwgU3R5bGVkU3RyaW5nIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIERlZmF1bHRUaGVtZSxcbiAgTG9nTGV2ZWwsXG4gIE51bWVyaWNMb2dMZXZlbHMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIG1pbmltYWwgbG9nZ2VyIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgTWluaUxvZ2dlciBpcyBhIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBWZXJib3NpdHlMb2dnZXIgaW50ZXJmYWNlLlxuICogSXQgcHJvdmlkZXMgYmFzaWMgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IHdpdGggc3VwcG9ydCBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE1pbmlMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgTWluaUxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBNaW5pTG9nZ2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUsIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24sIGFuZCBtZXRob2QgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdXNpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBbY29uZl0gLSBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIEluZm8gbGV2ZWwgYW5kIHZlcmJvc2l0eSAwLlxuICAgKiBAcGFyYW0gW2lkXSAtIE9wdGlvbmFsIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbnRleHQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgY29uZj86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgcHJvdGVjdGVkIGlkPzogc3RyaW5nXG4gICkge31cblxuICBwcm90ZWN0ZWQgY29uZmlnKFxuICAgIGtleToga2V5b2YgTG9nZ2luZ0NvbmZpZ1xuICApOiBMb2dnaW5nQ29uZmlnW2tleW9mIExvZ2dpbmdDb25maWddIHtcbiAgICBpZiAodGhpcy5jb25mICYmIGtleSBpbiB0aGlzLmNvbmYpIHJldHVybiB0aGlzLmNvbmZba2V5XTtcbiAgICByZXR1cm4gTG9nZ2luZy5nZXRDb25maWcoKVtrZXldO1xuICB9XG5cbiAgZm9yKFxuICAgIG1ldGhvZD86IHN0cmluZyB8ICgoLi4uYXJnczogYW55W10pID0+IGFueSksXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApOiBMb2dnZXIge1xuICAgIG1ldGhvZCA9IG1ldGhvZFxuICAgICAgPyB0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWV0aG9kXG4gICAgICAgIDogbWV0aG9kLm5hbWVcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIExvZ2dpbmcuZm9yKFt0aGlzLmNvbnRleHQsIG1ldGhvZF0uam9pbihcIi5cIiksIHRoaXMuaWQsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBmb3JtYXR0ZWQgbG9nIHN0cmluZy5cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgbG9nIHN0cmluZyB3aXRoIHRpbWVzdGFtcCwgY29sb3JlZCBsb2cgbGV2ZWwsIGFuZCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIGFzIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcGFyYW0gc3RhY2tcbiAgICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2cgc3RyaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUxvZyhcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbWVzc2FnZTogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5jb25maWcoXCJzdHlsZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcoXCJ0aW1lc3RhbXBcIikpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBzdHlsZSA/IExvZ2dpbmcudGhlbWUoZGF0ZSwgXCJ0aW1lc3RhbXBcIiwgbGV2ZWwpIDogZGF0ZTtcbiAgICAgIGxvZy5wdXNoKHRpbWVzdGFtcCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwibG9nTGV2ZWxcIikpIHtcbiAgICAgIGNvbnN0IGx2bDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKGxldmVsLCBcImxvZ0xldmVsXCIsIGxldmVsKVxuICAgICAgICA6IGxldmVsO1xuICAgICAgbG9nLnB1c2gobHZsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJjb250ZXh0XCIpKSB7XG4gICAgICBjb25zdCBjb250ZXh0OiBzdHJpbmcgPSBzdHlsZVxuICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5jb250ZXh0LCBcImNsYXNzXCIsIGxldmVsKVxuICAgICAgICA6IHRoaXMuY29udGV4dDtcbiAgICAgIGxvZy5wdXNoKGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICB7XG4gICAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBzdHlsZVxuICAgICAgICAgID8gTG9nZ2luZy50aGVtZSh0aGlzLmlkLCBcImlkXCIsIGxldmVsKVxuICAgICAgICAgIDogdGhpcy5pZDtcbiAgICAgICAgbG9nLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1zZzogc3RyaW5nID0gc3R5bGVcbiAgICAgID8gTG9nZ2luZy50aGVtZShcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZSxcbiAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICBsZXZlbFxuICAgICAgICApXG4gICAgICA6IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWVzc2FnZVxuICAgICAgICA6IChtZXNzYWdlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgIGxvZy5wdXNoKG1zZyk7XG4gICAgaWYgKHN0YWNrIHx8IG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgc3RhY2sgPSBzdHlsZVxuICAgICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgICAoc3RhY2sgfHwgKG1lc3NhZ2UgYXMgRXJyb3IpLnN0YWNrKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBcInN0YWNrXCIsXG4gICAgICAgICAgICBsZXZlbFxuICAgICAgICAgIClcbiAgICAgICAgOiBzdGFjaztcbiAgICAgIGxvZy5wdXNoKGBcXG5TdGFjayB0cmFjZTpcXG4ke3N0YWNrfWApO1xuICAgIH1cblxuICAgIHJldHVybiBsb2cuam9pbih0aGlzLmNvbmZpZyhcInNlcGFyYXRvclwiKSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbG9nIGxldmVsLlxuICAgKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGxvZ2dlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2cgbGV2ZWwsXG4gICAqIHRoZW4gdXNlcyB0aGUgYXBwcm9wcmlhdGUgY29uc29sZSBtZXRob2QgdG8gb3V0cHV0IHRoZSBsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBzdGFja1xuICAgKi9cbiAgcHJvdGVjdGVkIGxvZyhcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IsXG4gICAgc3RhY2s/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1t0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsXSA8XG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW2xldmVsXVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgbWV0aG9kO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuaW5mbzpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5sb2c7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC52ZXJib3NlOlxuICAgICAgY2FzZSBMb2dMZXZlbC5kZWJ1ZzpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5kZWJ1ZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmVycm9yOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgIH1cbiAgICBtZXRob2QodGhpcy5jcmVhdGVMb2cobGV2ZWwsIG1zZywgc3RhY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTExvZ3MgYSBgd2F5IHRvbyB2ZXJib3NlYCBvciBhIHNpbGx5IG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBTaWxseSBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgYWxsb3dzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoZGVmYXVsdDogMCkuXG4gICAqL1xuICBzaWxseShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5jb25maWcoXCJ2ZXJib3NlXCIpIGFzIG51bWJlcikgPj0gdmVyYm9zaXR5KVxuICAgICAgdGhpcy5sb2coTG9nTGV2ZWwudmVyYm9zZSwgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIFZlcmJvc2UgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGFsbG93cyBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5jb25maWcoXCJ2ZXJib3NlXCIpIGFzIG51bWJlcikgPj0gdmVyYm9zaXR5KVxuICAgICAgdGhpcy5sb2coTG9nTGV2ZWwudmVyYm9zZSwgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBJbmZvIGxldmVsLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgaW5mbyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5pbmZvLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIERlYnVnIGxldmVsLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZGVidWcobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZGVidWcsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIEVycm9yIGxldmVsLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3IobXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5lcnJvciwgbXNnKTtcbiAgfVxuXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIHtcbiAgICB0aGlzLmNvbmYgPSB7IC4uLih0aGlzLmNvbmYgfHwge30pLCAuLi5jb25maWcgfTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YXRpYyBjbGFzcyBmb3IgbWFuYWdpbmcgbG9nZ2luZyBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIExvZ2dpbmcgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBsb2dnaW5nIG1lY2hhbmlzbSB3aXRoIHN1cHBvcnQgZm9yXG4gKiBkaWZmZXJlbnQgbG9nIGxldmVscyBhbmQgdmVyYm9zaXR5LiBJdCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFpbnRhaW4gYSBnbG9iYWxcbiAqIGxvZ2dlciBpbnN0YW5jZSBhbmQgYWxsb3dzIGNyZWF0aW5nIHNwZWNpZmljIGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBtZXRob2RzLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTG9nZ2luZyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEEgc2luZ2xldG9uIGluc3RhbmNlIG9mIFZlcmJvc2l0eUxvZ2dlciB1c2VkIGZvciBnbG9iYWwgbG9nZ2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdsb2JhbD86IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGxvZ2dlciBpbnN0YW5jZXMuXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIG5ldyBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2VzLiBCeSBkZWZhdWx0LCBpdCBjcmVhdGVzIGEgTWluaUxvZ2dlci5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9mYWN0b3J5OiBMb2dnZXJGYWN0b3J5ID0gKFxuICAgIG9iamVjdDogc3RyaW5nLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgaWQ/OiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBNaW5pTG9nZ2VyKG9iamVjdCwgY29uZmlnLCBpZCk7XG4gIH07XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGxvZ2dpbmcgc3lzdGVtLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGdsb2JhbCB2ZXJib3NpdHkgbGV2ZWwgYW5kIGxvZyBsZXZlbCBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9jb25maWc6IExvZ2dpbmdDb25maWcgPSBEZWZhdWx0TG9nZ2luZ0NvbmZpZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgdGhlIExvZ2dpbmcgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBhcyBpdCdzIGRlc2lnbmVkIHRvIGJlIHVzZWQgc3RhdGljYWxseS5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNldEZhY3RvcnkoZmFjdG9yeTogTG9nZ2VyRmFjdG9yeSkge1xuICAgIExvZ2dpbmcuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXR0ZXIgZm9yIHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFsbG93cyB1cGRhdGluZyB0aGUgZ2xvYmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFuIG9iamVjdCBjb250YWluaW5nIHZlcmJvc2l0eSBhbmQgbG9nIGxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgc3RhdGljIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NvbmZpZywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb25maWcoKTogTG9nZ2luZ0NvbmZpZyB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyBnbG9iYWwgbG9nZ2VyIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAqXG4gICAqIEByZXR1cm4gVGhlIGdsb2JhbCBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IExvZ2dlciB7XG4gICAgdGhpcy5nbG9iYWwgPSB0aGlzLmdsb2JhbCA/IHRoaXMuZ2xvYmFsIDogdGhpcy5fZmFjdG9yeShcIkxvZ2dpbmdcIik7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc3RhdGljIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS52ZXJib3NlKG1zZywgdmVyYm9zaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgaW5mbyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuaW5mbyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmRlYnVnKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgc2lsbHkobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuc2lsbHkobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGVycm9yIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgZXJyb3IobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuZXJyb3IobXNnKTtcbiAgfVxuXG4gIHN0YXRpYyBmb3IoXG4gICAgb2JqZWN0OiBMb2dnaW5nQ29udGV4dCxcbiAgICBpZD86IHN0cmluZyB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApOiBMb2dnZXIge1xuICAgIG9iamVjdCA9IHR5cGVvZiBvYmplY3QgPT09IFwic3RyaW5nXCIgPyBvYmplY3QgOiBvYmplY3QubmFtZTtcbiAgICBpZCA9IHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogdW5kZWZpbmVkO1xuICAgIGNvbmZpZyA9IHR5cGVvZiBpZCA9PT0gXCJvYmplY3RcIiA/IChpZCBhcyBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSA6IGNvbmZpZztcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShvYmplY3QsIGNvbmZpZywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAc3VtbWFyeSBUaGlzIHN0YXRpYyBtZXRob2QgY3JlYXRlcyBhIG5ldyBsb2dnZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGZhY3RvcnkgZnVuY3Rpb24sXG4gICAqIGJhc2VkIG9uIGEgZ2l2ZW4gcmVhc29uIG9yIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZWFzb24gb3IgY29udGV4dCBmb3IgY3JlYXRpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJucyBBIG5ldyBWZXJib3NpdHlMb2dnZXIgb3IgQ2xhc3NMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYmVjYXVzZShyZWFzb246IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBMb2dnZXIge1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KHJlYXNvbiwgdGhpcy5fY29uZmlnLCBpZCk7XG4gIH1cblxuICBzdGF0aWMgdGhlbWUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IGtleW9mIFRoZW1lIHwga2V5b2YgTG9nTGV2ZWwsXG4gICAgbG9nZ2VyTGV2ZWw6IExvZ0xldmVsLFxuICAgIHRlbXBsYXRlOiBUaGVtZSA9IERlZmF1bHRUaGVtZVxuICApIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zdHlsZSkgcmV0dXJuIHRleHQ7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IodGhpcy50aGVtZSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseShcbiAgICAgIHR4dDogc3RyaW5nLFxuICAgICAgb3B0aW9uOiBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bWJlcltdIHwgc3RyaW5nW11cbiAgICApOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdDogc3RyaW5nIHwgU3R5bGVkU3RyaW5nID0gdHh0O1xuICAgICAgICBsZXQgYyA9IHN0eWxlKHQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q29sb3IoXG4gICAgICAgICAgdmFsOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBpc0JnID0gZmFsc2VcbiAgICAgICAgKTogU3R5bGVkU3RyaW5nIHtcbiAgICAgICAgICBsZXQgZjpcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuYmFja2dyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5mb3JlZ3JvdW5kXG4gICAgICAgICAgICB8IHR5cGVvZiBjLnJnYlxuICAgICAgICAgICAgfCB0eXBlb2YgYy5jb2xvcjI1NiA9IGlzQmcgPyBjLmJhY2tncm91bmQgOiBjLmZvcmVncm91bmQ7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAoZiBhcyB0eXBlb2YgYy5iYWNrZ3JvdW5kIHwgdHlwZW9mIGMuZm9yZWdyb3VuZCkuY2FsbChcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICAgdmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnQ29sb3IyNTYgOiBjLmNvbG9yMjU2O1xuICAgICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmdDb2xvcjI1NiB8IHR5cGVvZiBjLmNvbG9yMjU2KSh2YWxbMF0pO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBmID0gaXNCZyA/IGMuYmdSZ2IgOiBjLnJnYjtcbiAgICAgICAgICAgICAgcmV0dXJuIGMucmdiKHZhbFswXSwgdmFsWzFdLCB2YWxbMl0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCBjb2xvciBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgICByZXR1cm4gc3R5bGUodCBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGUodjogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjID0gYy5zdHlsZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGNbdiBhcyBrZXlvZiBDb2xvcml6ZU9wdGlvbnNdIGFzIFN0eWxlZFN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJiZ1wiOlxuICAgICAgICAgIGNhc2UgXCJmZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q29sb3IodmFsdWUgYXMgbnVtYmVyKS50ZXh0O1xuICAgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goYXBwbHlTdHlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcHBseVN0eWxlKHZhbHVlIGFzIG51bWJlciB8IHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYy50ZXh0O1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdCBhIHZhbGlkIHRoZW1lIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgYXBwbHlpbmcgc3R5bGU6ICR7b3B0aW9ufSB3aXRoIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIHJldHVybiB0eHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaXZpZHVhbFRoZW1lID0gdGVtcGxhdGVbdHlwZSBhcyBrZXlvZiBUaGVtZV07XG4gICAgaWYgKCFpbmRpdmlkdWFsVGhlbWUgfHwgIU9iamVjdC5rZXlzKGluZGl2aWR1YWxUaGVtZSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsVGhlbWU6IFRoZW1lT3B0aW9uID0gaW5kaXZpZHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uO1xuXG4gICAgY29uc3QgbG9nTGV2ZWxzID0gT2JqZWN0LmFzc2lnbih7fSwgTG9nTGV2ZWwpO1xuICAgIGlmIChPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpWzBdIGluIGxvZ0xldmVscylcbiAgICAgIGFjdHVhbFRoZW1lID1cbiAgICAgICAgKGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwpW2xvZ2dlckxldmVsXSB8fCB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3R1YWxUaGVtZSkucmVkdWNlKChhY2M6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IChhY3R1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbilba2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uXTtcbiAgICAgIGlmICh2YWwpXG4gICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICBhY2MsXG4gICAgICAgICAga2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uLFxuICAgICAgICAgIHZhbCBhc1xuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgIHwgW251bWJlcl1cbiAgICAgICAgICAgIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICAgICAgICAgICB8IG51bWJlcltdXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRleHQpO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgTG9nZ2luZ1xuICovXG5cbi8qKlxuICogQHN1bW1hcnkgTG9nZ2luZ1xuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZSBkZXNjcmlwdGlvblxuICogQG5hbWVzcGFjZSBMb2dnaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJMb2dMZXZlbCIsIkxvZ2dpbmdNb2RlIiwic3R5bGUiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7OztJQUtHO0FBQ1NBO0lBQVosQ0FBQSxVQUFZLFFBQVEsRUFBQTs7SUFFbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7SUFFZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhOztJQUViLElBQUEsUUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztJQUVuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUVmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7SUFDakIsQ0FBQyxFQVhXQSxnQkFBUSxLQUFSQSxnQkFBUSxHQVduQixFQUFBLENBQUEsQ0FBQTtJQUVEOzs7Ozs7Ozs7O0lBVUc7QUFDVSxVQUFBLGdCQUFnQixHQUFHO0lBQzlCLElBQUEsS0FBSyxFQUFFLENBQUM7SUFDUixJQUFBLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBQSxPQUFPLEVBQUUsQ0FBQztJQUNWLElBQUEsS0FBSyxFQUFFLENBQUM7SUFDUixJQUFBLEtBQUssRUFBRSxDQUFDOztBQUdFQztJQUFaLENBQUEsVUFBWSxXQUFXLEVBQUE7SUFDckIsSUFB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
|