discord-player 7.0.0-dev.5 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +2204 -2159
- package/dist/index.js +651 -604
- package/package.json +7 -12
package/dist/index.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __typeError = (msg) => {
|
|
9
7
|
throw TypeError(msg);
|
|
10
8
|
};
|
|
11
9
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
-
var __name = (
|
|
13
|
-
var __export = (
|
|
10
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
11
|
+
var __export = (target, all) => {
|
|
14
12
|
for (var name in all)
|
|
15
|
-
__defProp(
|
|
13
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
16
14
|
};
|
|
17
15
|
var __copyProps = (to, from, except, desc) => {
|
|
18
16
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
@@ -22,15 +20,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
22
20
|
}
|
|
23
21
|
return to;
|
|
24
22
|
};
|
|
25
|
-
var __reExport = (
|
|
26
|
-
var __toESM = (mod, isNodeMode, target2) => (target2 = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
27
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
28
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
29
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
30
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
31
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target2, "default", { value: mod, enumerable: true }) : target2,
|
|
32
|
-
mod
|
|
33
|
-
));
|
|
23
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
34
24
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
35
25
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
36
26
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
@@ -127,6 +117,189 @@ var import_promises = require("timers/promises");
|
|
|
127
117
|
// src/fabric/Track.ts
|
|
128
118
|
var import_discord = require("discord.js");
|
|
129
119
|
|
|
120
|
+
// src/errors/index.ts
|
|
121
|
+
var _DiscordPlayerError = class _DiscordPlayerError extends Error {
|
|
122
|
+
constructor(code, message) {
|
|
123
|
+
super(message);
|
|
124
|
+
__publicField(this, "code");
|
|
125
|
+
__publicField(this, "timestamp", Date.now());
|
|
126
|
+
this.name = this.constructor.name;
|
|
127
|
+
this.code = code;
|
|
128
|
+
if (Error.captureStackTrace) {
|
|
129
|
+
Error.captureStackTrace(this, this.constructor);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
toJSON() {
|
|
133
|
+
return {
|
|
134
|
+
name: this.constructor.name,
|
|
135
|
+
code: this.code,
|
|
136
|
+
message: this.message,
|
|
137
|
+
timestamp: this.timestamp
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
__name(_DiscordPlayerError, "DiscordPlayerError");
|
|
142
|
+
var DiscordPlayerError = _DiscordPlayerError;
|
|
143
|
+
var _OutOfSpaceError = class _OutOfSpaceError extends DiscordPlayerError {
|
|
144
|
+
constructor(target, capacity, total) {
|
|
145
|
+
super(ErrorCodes.ERR_OUT_OF_SPACE, `Max capacity reached for ${target} (Capacity ${capacity}/Total ${total})`);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
__name(_OutOfSpaceError, "OutOfSpaceError");
|
|
149
|
+
var OutOfSpaceError = _OutOfSpaceError;
|
|
150
|
+
var _InvalidArgTypeError = class _InvalidArgTypeError extends DiscordPlayerError {
|
|
151
|
+
constructor(target, expectation, found) {
|
|
152
|
+
super(ErrorCodes.ERR_INVALID_ARG_TYPE, `Expected ${target} to be "${expectation}", received "${found}"`);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
__name(_InvalidArgTypeError, "InvalidArgTypeError");
|
|
156
|
+
var InvalidArgTypeError = _InvalidArgTypeError;
|
|
157
|
+
var _NoResultError = class _NoResultError extends DiscordPlayerError {
|
|
158
|
+
constructor(message) {
|
|
159
|
+
super(ErrorCodes.ERR_NO_RESULT, message);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
__name(_NoResultError, "NoResultError");
|
|
163
|
+
var NoResultError = _NoResultError;
|
|
164
|
+
var _NotImplementedError = class _NotImplementedError extends DiscordPlayerError {
|
|
165
|
+
constructor(target) {
|
|
166
|
+
super(ErrorCodes.ERR_NOT_IMPLEMENTED, `${target} is not yet implemented`);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
__name(_NotImplementedError, "NotImplementedError");
|
|
170
|
+
var NotImplementedError = _NotImplementedError;
|
|
171
|
+
var _NotExistingError = class _NotExistingError extends DiscordPlayerError {
|
|
172
|
+
constructor(target) {
|
|
173
|
+
super(ErrorCodes.ERR_NOT_EXISTING, `${target} does not exist`);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
__name(_NotExistingError, "NotExistingError");
|
|
177
|
+
var NotExistingError = _NotExistingError;
|
|
178
|
+
var _OutOfRangeError = class _OutOfRangeError extends DiscordPlayerError {
|
|
179
|
+
constructor(target, value, minimum, maximum) {
|
|
180
|
+
super(
|
|
181
|
+
ErrorCodes.ERR_OUT_OF_RANGE,
|
|
182
|
+
`${target} is out of range (Expected minimum ${minimum} and maximum ${maximum}, got ${value})`
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
__name(_OutOfRangeError, "OutOfRangeError");
|
|
187
|
+
var OutOfRangeError = _OutOfRangeError;
|
|
188
|
+
var _NoVoiceConnectionError = class _NoVoiceConnectionError extends DiscordPlayerError {
|
|
189
|
+
constructor(message) {
|
|
190
|
+
super(
|
|
191
|
+
ErrorCodes.ERR_NO_VOICE_CONNECTION,
|
|
192
|
+
message || "No voice connection available, maybe connect to a voice channel first?"
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
__name(_NoVoiceConnectionError, "NoVoiceConnectionError");
|
|
197
|
+
var NoVoiceConnectionError = _NoVoiceConnectionError;
|
|
198
|
+
var _VoiceConnectionDestroyedError = class _VoiceConnectionDestroyedError extends DiscordPlayerError {
|
|
199
|
+
constructor() {
|
|
200
|
+
super(ErrorCodes.ERR_VOICE_CONNECTION_DESTROYED, "Cannot use destroyed voice connection");
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
__name(_VoiceConnectionDestroyedError, "VoiceConnectionDestroyedError");
|
|
204
|
+
var VoiceConnectionDestroyedError = _VoiceConnectionDestroyedError;
|
|
205
|
+
var _NoVoiceChannelError = class _NoVoiceChannelError extends DiscordPlayerError {
|
|
206
|
+
constructor() {
|
|
207
|
+
super(ErrorCodes.ERR_NO_VOICE_CHANNEL, "Could not get the voice channel");
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
__name(_NoVoiceChannelError, "NoVoiceChannelError");
|
|
211
|
+
var NoVoiceChannelError = _NoVoiceChannelError;
|
|
212
|
+
var _NoAudioResourceError = class _NoAudioResourceError extends DiscordPlayerError {
|
|
213
|
+
constructor(message) {
|
|
214
|
+
super(ErrorCodes.ERR_NO_AUDIO_RESOURCE, message || "Expected an audio resource");
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
__name(_NoAudioResourceError, "NoAudioResourceError");
|
|
218
|
+
var NoAudioResourceError = _NoAudioResourceError;
|
|
219
|
+
var _NoGuildQueueError = class _NoGuildQueueError extends DiscordPlayerError {
|
|
220
|
+
constructor(message) {
|
|
221
|
+
super(ErrorCodes.ERR_NO_GUILD_QUEUE, message || "Expected a guild queue");
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
__name(_NoGuildQueueError, "NoGuildQueueError");
|
|
225
|
+
var NoGuildQueueError = _NoGuildQueueError;
|
|
226
|
+
var _NoGuildError = class _NoGuildError extends DiscordPlayerError {
|
|
227
|
+
constructor(message) {
|
|
228
|
+
super(ErrorCodes.ERR_NO_GUILD, message || "Expected a guild");
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
__name(_NoGuildError, "NoGuildError");
|
|
232
|
+
var NoGuildError = _NoGuildError;
|
|
233
|
+
var _InfoRequiredError = class _InfoRequiredError extends DiscordPlayerError {
|
|
234
|
+
constructor(target, actual) {
|
|
235
|
+
super(ErrorCodes.ERR_INFO_REQUIRED, `Expected ${target}, found "${actual}"`);
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
__name(_InfoRequiredError, "InfoRequiredError");
|
|
239
|
+
var InfoRequiredError = _InfoRequiredError;
|
|
240
|
+
var _SerializationError = class _SerializationError extends DiscordPlayerError {
|
|
241
|
+
constructor() {
|
|
242
|
+
super(ErrorCodes.ERR_SERIALIZATION_FAILED, "Don't know how to serialize this data");
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
__name(_SerializationError, "SerializationError");
|
|
246
|
+
var SerializationError = _SerializationError;
|
|
247
|
+
var _DeserializationError = class _DeserializationError extends DiscordPlayerError {
|
|
248
|
+
constructor() {
|
|
249
|
+
super(ErrorCodes.ERR_DESERIALIZATION_FAILED, "Don't know how to deserialize this data");
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
__name(_DeserializationError, "DeserializationError");
|
|
253
|
+
var DeserializationError = _DeserializationError;
|
|
254
|
+
var _IllegalHookInvocationError = class _IllegalHookInvocationError extends DiscordPlayerError {
|
|
255
|
+
constructor(target, message) {
|
|
256
|
+
super(
|
|
257
|
+
ErrorCodes.ERR_ILLEGAL_HOOK_INVOCATION,
|
|
258
|
+
`Illegal invocation of ${target} hook.${message ? ` ${message}` : ""}`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
__name(_IllegalHookInvocationError, "IllegalHookInvocationError");
|
|
263
|
+
var IllegalHookInvocationError = _IllegalHookInvocationError;
|
|
264
|
+
var _BridgeFailedError = class _BridgeFailedError extends DiscordPlayerError {
|
|
265
|
+
constructor(id, error) {
|
|
266
|
+
super(
|
|
267
|
+
ErrorCodes.ERR_BRIDGE_FAILED,
|
|
268
|
+
`${id ? `(Extractor Execution Context ID is ${id})` : ""}Failed to bridge this query:
|
|
269
|
+
${error}`
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
__name(_BridgeFailedError, "BridgeFailedError");
|
|
274
|
+
var BridgeFailedError = _BridgeFailedError;
|
|
275
|
+
var ErrorCodes = {
|
|
276
|
+
ERR_OUT_OF_SPACE: "ERR_OUT_OF_SPACE",
|
|
277
|
+
ERR_INVALID_ARG_TYPE: "ERR_INVALID_ARG_TYPE",
|
|
278
|
+
ERR_NO_RESULT: "ERR_NO_RESULT",
|
|
279
|
+
ERR_NOT_IMPLEMENTED: "ERR_NOT_IMPLEMENTED",
|
|
280
|
+
ERR_NOT_EXISTING: "ERR_NOT_EXISTING",
|
|
281
|
+
ERR_OUT_OF_RANGE: "ERR_OUT_OF_RANGE",
|
|
282
|
+
ERR_NO_VOICE_CONNECTION: "ERR_NO_VOICE_CONNECTION",
|
|
283
|
+
ERR_VOICE_CONNECTION_DESTROYED: "ERR_VOICE_CONNECTION_DESTROYED",
|
|
284
|
+
ERR_NO_VOICE_CHANNEL: "ERR_NO_VOICE_CHANNEL",
|
|
285
|
+
ERR_INVALID_VOICE_CHANNEL: "ERR_INVALID_VOICE_CHANNEL",
|
|
286
|
+
ERR_NO_RECEIVER: "ERR_NO_RECEIVER",
|
|
287
|
+
ERR_FFMPEG_LOCATOR: "ERR_FFMPEG_LOCATOR",
|
|
288
|
+
ERR_NO_AUDIO_RESOURCE: "ERR_NO_AUDIO_RESOURCE",
|
|
289
|
+
ERR_NO_GUILD_QUEUE: "ERR_NO_GUILD_QUEUE",
|
|
290
|
+
ERR_NO_GUILD: "ERR_NO_GUILD",
|
|
291
|
+
ERR_INFO_REQUIRED: "ERR_INFO_REQUIRED",
|
|
292
|
+
ERR_SERIALIZATION_FAILED: "ERR_SERIALIZATION_FAILED",
|
|
293
|
+
ERR_DESERIALIZATION_FAILED: "ERR_DESERIALIZATION_FAILED",
|
|
294
|
+
ERR_ILLEGAL_HOOK_INVOCATION: "ERR_ILLEGAL_HOOK_INVOCATION",
|
|
295
|
+
ERR_NOT_EXISTING_MODULE: "ERR_NOT_EXISTING_MODULE",
|
|
296
|
+
ERR_BRIDGE_FAILED: "ERR_BRIDGE_FAILED"
|
|
297
|
+
};
|
|
298
|
+
function isDiscordPlayerError(error) {
|
|
299
|
+
return error != null && error instanceof DiscordPlayerError;
|
|
300
|
+
}
|
|
301
|
+
__name(isDiscordPlayerError, "isDiscordPlayerError");
|
|
302
|
+
|
|
130
303
|
// src/utils/TypeUtil.ts
|
|
131
304
|
var _TypeUtil = class _TypeUtil {
|
|
132
305
|
constructor() {
|
|
@@ -154,182 +327,13 @@ var _TypeUtil = class _TypeUtil {
|
|
|
154
327
|
static isError(t) {
|
|
155
328
|
return t instanceof Error;
|
|
156
329
|
}
|
|
330
|
+
static isDiscordPlayerError(t) {
|
|
331
|
+
return isDiscordPlayerError(t);
|
|
332
|
+
}
|
|
157
333
|
};
|
|
158
334
|
__name(_TypeUtil, "TypeUtil");
|
|
159
335
|
var TypeUtil = _TypeUtil;
|
|
160
336
|
|
|
161
|
-
// src/errors/index.ts
|
|
162
|
-
var DiscordPlayerErrors = {
|
|
163
|
-
ERR_OUT_OF_SPACE: {
|
|
164
|
-
name: "ERR_OUT_OF_SPACE",
|
|
165
|
-
type: RangeError,
|
|
166
|
-
createError(target2, capacity, total) {
|
|
167
|
-
return `[${this.constructor.name}] Max capacity reached for ${target2} (Capacity ${capacity}/Total ${total})`;
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
ERR_INVALID_ARG_TYPE: {
|
|
171
|
-
name: "ERR_INVALID_ARG_TYPE",
|
|
172
|
-
type: TypeError,
|
|
173
|
-
createError(target2, expectation, found) {
|
|
174
|
-
return `[${this.constructor.name}] Expected ${target2} to be "${expectation}", received "${found}"`;
|
|
175
|
-
}
|
|
176
|
-
},
|
|
177
|
-
ERR_NO_RESULT: {
|
|
178
|
-
name: "ERR_NO_RESULT",
|
|
179
|
-
type: Error,
|
|
180
|
-
createError(message) {
|
|
181
|
-
return `[${this.constructor.name}] ${message}`;
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
ERR_NOT_IMPLEMENTED: {
|
|
185
|
-
name: "ERR_NOT_IMPLEMENTED",
|
|
186
|
-
type: Error,
|
|
187
|
-
createError(target2) {
|
|
188
|
-
return `[${this.constructor.name}] ${target2} is not yet implemented`;
|
|
189
|
-
}
|
|
190
|
-
},
|
|
191
|
-
ERR_NOT_EXISTING: {
|
|
192
|
-
name: "ERR_NOT_EXISTING",
|
|
193
|
-
type: Error,
|
|
194
|
-
createError(target2) {
|
|
195
|
-
return `[${this.constructor.name}] ${target2} does not exist`;
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
|
-
ERR_OUT_OF_RANGE: {
|
|
199
|
-
name: "ERR_OUT_OF_RANGE",
|
|
200
|
-
type: RangeError,
|
|
201
|
-
createError(target2, value, minimum, maximum) {
|
|
202
|
-
return `[${this.constructor.name}] ${target2} is out of range (Expected minimum ${maximum} and maximum ${maximum}, got ${value})`;
|
|
203
|
-
}
|
|
204
|
-
},
|
|
205
|
-
ERR_NO_VOICE_CONNECTION: {
|
|
206
|
-
name: "ERR_NO_VOICE_CONNECTION",
|
|
207
|
-
type: Error,
|
|
208
|
-
createError(message) {
|
|
209
|
-
return `[${this.constructor.name}] ` + (message || "No voice connection available, maybe connect to a voice channel first?");
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
ERR_VOICE_CONNECTION_DESTROYED: {
|
|
213
|
-
name: "ERR_VOICE_CONNECTION_DESTROYED",
|
|
214
|
-
type: Error,
|
|
215
|
-
createError() {
|
|
216
|
-
return `[${this.constructor.name}] Cannot use destroyed voice connection`;
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
ERR_NO_VOICE_CHANNEL: {
|
|
220
|
-
name: "ERR_NO_VOICE_CHANNEL",
|
|
221
|
-
type: Error,
|
|
222
|
-
createError() {
|
|
223
|
-
return `[${this.constructor.name}] Could not get the voice channel`;
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
ERR_INVALID_VOICE_CHANNEL: {
|
|
227
|
-
name: "ERR_INVALID_VOICE_CHANNEL",
|
|
228
|
-
type: Error,
|
|
229
|
-
createError() {
|
|
230
|
-
return `[${this.constructor.name}] Expected a voice channel`;
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
ERR_NO_RECEIVER: {
|
|
234
|
-
name: "ERR_NO_RECEIVER",
|
|
235
|
-
type: Error,
|
|
236
|
-
createError(message) {
|
|
237
|
-
return `[${this.constructor.name}] ` + (message || "No voice receiver is available, maybe connect to a voice channel first?");
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
ERR_FFMPEG_LOCATOR: {
|
|
241
|
-
name: "ERR_FFMPEG_LOCATOR",
|
|
242
|
-
type: Error,
|
|
243
|
-
createError(message) {
|
|
244
|
-
return `[${this.constructor.name}] ` + message;
|
|
245
|
-
}
|
|
246
|
-
},
|
|
247
|
-
ERR_NO_AUDIO_RESOURCE: {
|
|
248
|
-
name: "ERR_NO_AUDIO_RESOURCE",
|
|
249
|
-
type: Error,
|
|
250
|
-
createError(message) {
|
|
251
|
-
return `[${this.constructor.name}] ` + (message || "Expected an audio resource");
|
|
252
|
-
}
|
|
253
|
-
},
|
|
254
|
-
ERR_NO_GUILD_QUEUE: {
|
|
255
|
-
name: "ERR_NO_GUILD_QUEUE",
|
|
256
|
-
type: Error,
|
|
257
|
-
createError(message) {
|
|
258
|
-
return `[${this.constructor.name}] ` + (message || "Expected a guild queue");
|
|
259
|
-
}
|
|
260
|
-
},
|
|
261
|
-
ERR_NO_GUILD: {
|
|
262
|
-
name: "ERR_NO_GUILD",
|
|
263
|
-
type: Error,
|
|
264
|
-
createError(message) {
|
|
265
|
-
return `[${this.constructor.name}] ` + (message || "Expected a guild");
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
ERR_INFO_REQUIRED: {
|
|
269
|
-
name: "ERR_INFO_REQUIRED",
|
|
270
|
-
type: Error,
|
|
271
|
-
createError(target2, actual) {
|
|
272
|
-
return `[${this.constructor.name}] Expected ${target2}, found "${actual}"`;
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
ERR_SERIALIZATION_FAILED: {
|
|
276
|
-
name: "ERR_SERIALIZATION_FAILED",
|
|
277
|
-
type: Error,
|
|
278
|
-
createError() {
|
|
279
|
-
return `[${this.type.name}]Don't know how to serialize this data`;
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
ERR_DESERIALIZATION_FAILED: {
|
|
283
|
-
name: "ERR_DESERIALIZATION_FAILED",
|
|
284
|
-
type: Error,
|
|
285
|
-
createError() {
|
|
286
|
-
return `[${this.type.name}]Don't know how to deserialize this data`;
|
|
287
|
-
}
|
|
288
|
-
},
|
|
289
|
-
ERR_ILLEGAL_HOOK_INVOCATION: {
|
|
290
|
-
name: "ERR_ILLEGAL_HOOK_INVOCATION",
|
|
291
|
-
type: Error,
|
|
292
|
-
createError(target2, message) {
|
|
293
|
-
return `[${this.type.name}]Illegal invocation of ${target2} hook.${message ? ` ${message}` : ""}`;
|
|
294
|
-
}
|
|
295
|
-
},
|
|
296
|
-
ERR_NOT_EXISTING_MODULE: {
|
|
297
|
-
name: "ERR_NOT_EXISTING_MODULE",
|
|
298
|
-
type: Error,
|
|
299
|
-
createError(target2, description = "") {
|
|
300
|
-
return `[${this.type.name}]${target2} module does not exist. Install it with \`npm install ${target2}\`.${description ? " " + description : ""}`;
|
|
301
|
-
}
|
|
302
|
-
},
|
|
303
|
-
ERR_BRIDGE_FAILED: {
|
|
304
|
-
name: "ERR_BRIDGE_FAILED",
|
|
305
|
-
type: Error,
|
|
306
|
-
createError(id, error) {
|
|
307
|
-
return `[${this.type.name}]${id ? `(Extractor Execution Context ID is ${id})` : ""}Failed to bridge this query:
|
|
308
|
-
${error}`;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
};
|
|
312
|
-
var target = {};
|
|
313
|
-
var handler = {
|
|
314
|
-
get(target2, p, receiver) {
|
|
315
|
-
const err = DiscordPlayerErrors[p];
|
|
316
|
-
if (!err) return Reflect.get(target2, p, receiver);
|
|
317
|
-
return (...args) => {
|
|
318
|
-
const exception = new err.type(err.createError(...args));
|
|
319
|
-
exception.name = err.name;
|
|
320
|
-
return exception;
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
};
|
|
324
|
-
var ErrorCodes = (() => {
|
|
325
|
-
const dict = {};
|
|
326
|
-
for (const prop in DiscordPlayerErrors) {
|
|
327
|
-
dict[prop] = prop;
|
|
328
|
-
}
|
|
329
|
-
return Object.freeze(dict);
|
|
330
|
-
})();
|
|
331
|
-
var Exceptions = new Proxy(target, handler);
|
|
332
|
-
|
|
333
337
|
// src/utils/serde.ts
|
|
334
338
|
var import_buffer = require("buffer");
|
|
335
339
|
var SerializedType = /* @__PURE__ */ ((SerializedType2) => {
|
|
@@ -345,14 +349,14 @@ function serialize(data) {
|
|
|
345
349
|
try {
|
|
346
350
|
return data.toJSON();
|
|
347
351
|
} catch {
|
|
348
|
-
throw
|
|
352
|
+
throw new SerializationError();
|
|
349
353
|
}
|
|
350
354
|
}
|
|
351
355
|
__name(serialize, "serialize");
|
|
352
356
|
function deserialize(player, data) {
|
|
353
357
|
if (isTrack(data)) return Track.fromSerialized(player, data);
|
|
354
358
|
if (isPlaylist(data)) return Playlist.fromSerialized(player, data);
|
|
355
|
-
throw
|
|
359
|
+
throw new DeserializationError();
|
|
356
360
|
}
|
|
357
361
|
__name(deserialize, "deserialize");
|
|
358
362
|
function encode(data) {
|
|
@@ -377,6 +381,7 @@ function tryIntoThumbnailString(data) {
|
|
|
377
381
|
__name(tryIntoThumbnailString, "tryIntoThumbnailString");
|
|
378
382
|
|
|
379
383
|
// src/fabric/Track.ts
|
|
384
|
+
var _resource;
|
|
380
385
|
var _Track = class _Track {
|
|
381
386
|
/**
|
|
382
387
|
* Track constructor
|
|
@@ -405,6 +410,7 @@ var _Track = class _Track {
|
|
|
405
410
|
__publicField(this, "live", false);
|
|
406
411
|
__publicField(this, "bridgedExtractor", null);
|
|
407
412
|
__publicField(this, "bridgedTrack", null);
|
|
413
|
+
__privateAdd(this, _resource, null);
|
|
408
414
|
this.title = (0, import_discord.escapeMarkdown)(data.title ?? "");
|
|
409
415
|
this.author = data.author ?? "";
|
|
410
416
|
this.url = data.url ?? "";
|
|
@@ -421,6 +427,25 @@ var _Track = class _Track {
|
|
|
421
427
|
this.cleanTitle = data.cleanTitle ?? Util.cleanTitle(this.title, this.source);
|
|
422
428
|
this.live = data.live ?? false;
|
|
423
429
|
}
|
|
430
|
+
/**
|
|
431
|
+
* Sets audio resource for this track. This is not useful outside of the library.
|
|
432
|
+
* @param resource Audio resource
|
|
433
|
+
*/
|
|
434
|
+
setResource(resource) {
|
|
435
|
+
__privateSet(this, _resource, resource);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Gets audio resource for this track
|
|
439
|
+
*/
|
|
440
|
+
get resource() {
|
|
441
|
+
return __privateGet(this, _resource);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Whether this track has an audio resource
|
|
445
|
+
*/
|
|
446
|
+
get hasResource() {
|
|
447
|
+
return __privateGet(this, _resource) != null;
|
|
448
|
+
}
|
|
424
449
|
/**
|
|
425
450
|
* Request metadata for this track
|
|
426
451
|
*/
|
|
@@ -519,7 +544,7 @@ var _Track = class _Track {
|
|
|
519
544
|
extractor: this.extractor?.identifier ?? null,
|
|
520
545
|
metadata: this.metadata,
|
|
521
546
|
$type: "track" /* Track */,
|
|
522
|
-
$encoder_version:
|
|
547
|
+
$encoder_version: this.player.version
|
|
523
548
|
};
|
|
524
549
|
}
|
|
525
550
|
/**
|
|
@@ -528,8 +553,7 @@ var _Track = class _Track {
|
|
|
528
553
|
* @param data Serialized data
|
|
529
554
|
*/
|
|
530
555
|
static fromSerialized(player, data) {
|
|
531
|
-
if (data.$type !== "track" /* Track */)
|
|
532
|
-
throw Exceptions.ERR_INVALID_ARG_TYPE("data", "SerializedTrack", "malformed data");
|
|
556
|
+
if (data.$type !== "track" /* Track */) throw new InvalidArgTypeError("data", "SerializedTrack", "malformed data");
|
|
533
557
|
const track = new _Track(player, {
|
|
534
558
|
...data,
|
|
535
559
|
requestedBy: data.requested_by ? (() => {
|
|
@@ -566,6 +590,7 @@ var _Track = class _Track {
|
|
|
566
590
|
return await fn(channel, this, options);
|
|
567
591
|
}
|
|
568
592
|
};
|
|
593
|
+
_resource = new WeakMap();
|
|
569
594
|
__name(_Track, "Track");
|
|
570
595
|
var Track = _Track;
|
|
571
596
|
|
|
@@ -650,7 +675,7 @@ var _Playlist = class _Playlist {
|
|
|
650
675
|
id: this.id,
|
|
651
676
|
url: this.url,
|
|
652
677
|
$type: "playlist" /* Playlist */,
|
|
653
|
-
$encoder_version:
|
|
678
|
+
$encoder_version: this.player.version
|
|
654
679
|
};
|
|
655
680
|
}
|
|
656
681
|
/**
|
|
@@ -660,7 +685,7 @@ var _Playlist = class _Playlist {
|
|
|
660
685
|
*/
|
|
661
686
|
static fromSerialized(player, data) {
|
|
662
687
|
if (data.$type !== "playlist" /* Playlist */)
|
|
663
|
-
throw
|
|
688
|
+
throw new InvalidArgTypeError("data", "SerializedPlaylist", "malformed data");
|
|
664
689
|
return new _Playlist(player, {
|
|
665
690
|
...data,
|
|
666
691
|
tracks: data.tracks.map((m) => Track.fromSerialized(player, m))
|
|
@@ -679,7 +704,38 @@ var _Playlist = class _Playlist {
|
|
|
679
704
|
__name(_Playlist, "Playlist");
|
|
680
705
|
var Playlist = _Playlist;
|
|
681
706
|
|
|
682
|
-
// src/
|
|
707
|
+
// src/utils/QueryResolver.ts
|
|
708
|
+
var import_undici = require("undici");
|
|
709
|
+
var spotifySongRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:track\/|\?uri=spotify:track:)((\w|-){22})(\?si=.+)?$/;
|
|
710
|
+
var spotifyPlaylistRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})(\?si=.+)?$/;
|
|
711
|
+
var spotifyAlbumRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:album\/|\?uri=spotify:album:)((\w|-){22})(\?si=.+)?$/;
|
|
712
|
+
var vimeoRegex = /^(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)$/;
|
|
713
|
+
var reverbnationRegex = /^https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)$/;
|
|
714
|
+
var attachmentRegex = /^https?:\/\/.+$/;
|
|
715
|
+
var appleMusicSongRegex = /^https?:\/\/music\.apple\.com\/.+?\/(song|album)\/.+?(\/.+?\?i=|\/)([0-9]+)$/;
|
|
716
|
+
var appleMusicPlaylistRegex = /^https?:\/\/music\.apple\.com\/.+?\/playlist\/.+\/pl\.(u-|pm-)?[a-zA-Z0-9]+$/;
|
|
717
|
+
var appleMusicAlbumRegex = /^https?:\/\/music\.apple\.com\/.+?\/album\/.+\/([0-9]+)$/;
|
|
718
|
+
var soundcloudTrackRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/(\w|-)+(.+)?$/;
|
|
719
|
+
var soundcloudPlaylistRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/sets\/(\w|-)+(.+)?$/;
|
|
720
|
+
var youtubePlaylistRegex = /^https?:\/\/(www.)?youtube.com\/playlist\?list=((PL|FL|UU|LL|RD|OL)[a-zA-Z0-9-_]{16,41})$/;
|
|
721
|
+
var youtubeVideoURLRegex = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/;
|
|
722
|
+
var youtubeVideoIdRegex = /^[a-zA-Z0-9-_]{11}$/;
|
|
723
|
+
var discordPlayerBlobRegex = /^discord-player:\/\/blob\/\d+$/;
|
|
724
|
+
var DomainsMap = {
|
|
725
|
+
DiscordPlayer: ["discord-player"],
|
|
726
|
+
YouTube: ["youtube.com", "youtu.be", "music.youtube.com", "gaming.youtube.com", "www.youtube.com", "m.youtube.com"],
|
|
727
|
+
Spotify: ["open.spotify.com", "embed.spotify.com"],
|
|
728
|
+
Vimeo: ["vimeo.com", "player.vimeo.com"],
|
|
729
|
+
ReverbNation: ["reverbnation.com"],
|
|
730
|
+
SoundCloud: ["soundcloud.com"],
|
|
731
|
+
AppleMusic: ["music.apple.com"]
|
|
732
|
+
};
|
|
733
|
+
var redirectDomains = /* @__PURE__ */ new Set(
|
|
734
|
+
[
|
|
735
|
+
/^https?:\/\/spotify.link\/[A-Za-z0-9]+$/,
|
|
736
|
+
/^https:\/\/on\.soundcloud\.com\/[a-zA-Z1-9]{0,17}$/
|
|
737
|
+
]
|
|
738
|
+
);
|
|
683
739
|
var QueryType = {
|
|
684
740
|
AUTO: "auto",
|
|
685
741
|
YOUTUBE: "youtube",
|
|
@@ -703,23 +759,131 @@ var QueryType = {
|
|
|
703
759
|
APPLE_MUSIC_PLAYLIST: "appleMusicPlaylist",
|
|
704
760
|
APPLE_MUSIC_SEARCH: "appleMusicSearch",
|
|
705
761
|
FILE: "file",
|
|
706
|
-
AUTO_SEARCH: "autoSearch"
|
|
762
|
+
AUTO_SEARCH: "autoSearch",
|
|
763
|
+
DISCORD_PLAYER_BLOB: "discordPlayerBlob"
|
|
707
764
|
};
|
|
708
|
-
var
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
765
|
+
var _QueryResolver = class _QueryResolver {
|
|
766
|
+
/**
|
|
767
|
+
* Query resolver
|
|
768
|
+
*/
|
|
769
|
+
constructor() {
|
|
770
|
+
}
|
|
771
|
+
// eslint-disable-line @typescript-eslint/no-empty-function
|
|
772
|
+
static get regex() {
|
|
773
|
+
return {
|
|
774
|
+
spotifyAlbumRegex,
|
|
775
|
+
spotifyPlaylistRegex,
|
|
776
|
+
spotifySongRegex,
|
|
777
|
+
vimeoRegex,
|
|
778
|
+
reverbnationRegex,
|
|
779
|
+
attachmentRegex,
|
|
780
|
+
appleMusicAlbumRegex,
|
|
781
|
+
appleMusicPlaylistRegex,
|
|
782
|
+
appleMusicSongRegex,
|
|
783
|
+
soundcloudTrackRegex,
|
|
784
|
+
soundcloudPlaylistRegex,
|
|
785
|
+
youtubePlaylistRegex,
|
|
786
|
+
discordPlayerBlobRegex
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Pre-resolve redirect urls
|
|
791
|
+
*/
|
|
792
|
+
static async preResolve(query, maxDepth = 5) {
|
|
793
|
+
if (!TypeUtil.isString(query)) throw new InvalidArgTypeError(query, "string", typeof query);
|
|
794
|
+
for (const domain of redirectDomains) {
|
|
795
|
+
if (domain.test(query)) {
|
|
796
|
+
try {
|
|
797
|
+
const res = await (0, import_undici.fetch)(query, {
|
|
798
|
+
method: "GET",
|
|
799
|
+
redirect: "follow"
|
|
800
|
+
});
|
|
801
|
+
if (!res.ok) break;
|
|
802
|
+
if (/^https?:\/\/spotify.app.link\/(.+)$/.test(res.url)) {
|
|
803
|
+
const body = await res.text();
|
|
804
|
+
const target = body.split("https://open.spotify.com/track/")[1].split("?si=")[0];
|
|
805
|
+
if (!target) break;
|
|
806
|
+
return `https://open.spotify.com/track/${target}`;
|
|
807
|
+
}
|
|
808
|
+
return maxDepth < 1 ? res.url : this.preResolve(res.url, maxDepth - 1);
|
|
809
|
+
} catch {
|
|
810
|
+
break;
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
return query;
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* Resolves the given search query
|
|
818
|
+
* @param {string} query The query
|
|
819
|
+
*/
|
|
820
|
+
static resolve(query, fallbackSearchEngine = QueryType.AUTO_SEARCH) {
|
|
821
|
+
if (!TypeUtil.isString(query)) throw new InvalidArgTypeError(query, "string", typeof query);
|
|
822
|
+
if (!query.length) throw new InfoRequiredError("query", String(query));
|
|
823
|
+
const resolver = /* @__PURE__ */ __name((type, query2) => ({ type, query: query2 }), "resolver");
|
|
824
|
+
if (discordPlayerBlobRegex.test(query)) return resolver(QueryType.DISCORD_PLAYER_BLOB, query);
|
|
825
|
+
try {
|
|
826
|
+
const url = new URL(query);
|
|
827
|
+
if (DomainsMap.YouTube.includes(url.host)) {
|
|
828
|
+
query = query.replace(/(m(usic)?|gaming)\./, "").trim();
|
|
829
|
+
const playlistId = url.searchParams.get("list");
|
|
830
|
+
const videoId = url.searchParams.get("v");
|
|
831
|
+
if (playlistId) {
|
|
832
|
+
if (videoId && playlistId.startsWith("RD"))
|
|
833
|
+
return resolver(
|
|
834
|
+
QueryType.YOUTUBE_PLAYLIST,
|
|
835
|
+
`https://www.youtube.com/watch?v=${videoId}&list=${playlistId}`
|
|
836
|
+
);
|
|
837
|
+
return resolver(QueryType.YOUTUBE_PLAYLIST, `https://www.youtube.com/playlist?list=${playlistId}`);
|
|
838
|
+
}
|
|
839
|
+
if (_QueryResolver.validateId(query) || _QueryResolver.validateURL(query))
|
|
840
|
+
return resolver(QueryType.YOUTUBE_VIDEO, query);
|
|
841
|
+
return resolver(fallbackSearchEngine, query);
|
|
842
|
+
} else if (DomainsMap.Spotify.includes(url.host)) {
|
|
843
|
+
query = query.replace(/intl-([a-zA-Z]+)\//, "");
|
|
844
|
+
if (spotifyPlaylistRegex.test(query)) return resolver(QueryType.SPOTIFY_PLAYLIST, query);
|
|
845
|
+
if (spotifyAlbumRegex.test(query)) return resolver(QueryType.SPOTIFY_ALBUM, query);
|
|
846
|
+
if (spotifySongRegex.test(query)) return resolver(QueryType.SPOTIFY_SONG, query);
|
|
847
|
+
return resolver(fallbackSearchEngine, query);
|
|
848
|
+
} else if (DomainsMap.Vimeo.includes(url.host)) {
|
|
849
|
+
if (vimeoRegex.test(query)) return resolver(QueryType.VIMEO, query);
|
|
850
|
+
return resolver(fallbackSearchEngine, query);
|
|
851
|
+
} else if (DomainsMap.ReverbNation.includes(url.host)) {
|
|
852
|
+
if (reverbnationRegex.test(query)) return resolver(QueryType.REVERBNATION, query);
|
|
853
|
+
return resolver(fallbackSearchEngine, query);
|
|
854
|
+
} else if (DomainsMap.SoundCloud.includes(url.host)) {
|
|
855
|
+
if (soundcloudPlaylistRegex.test(query)) return resolver(QueryType.SOUNDCLOUD_PLAYLIST, query);
|
|
856
|
+
if (soundcloudTrackRegex.test(query)) return resolver(QueryType.SOUNDCLOUD_TRACK, query);
|
|
857
|
+
return resolver(fallbackSearchEngine, query);
|
|
858
|
+
} else if (DomainsMap.AppleMusic.includes(url.host)) {
|
|
859
|
+
if (appleMusicAlbumRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_ALBUM, query);
|
|
860
|
+
if (appleMusicPlaylistRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_PLAYLIST, query);
|
|
861
|
+
if (appleMusicSongRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_SONG, query);
|
|
862
|
+
return resolver(fallbackSearchEngine, query);
|
|
863
|
+
} else {
|
|
864
|
+
return resolver(QueryType.ARBITRARY, query);
|
|
865
|
+
}
|
|
866
|
+
} catch {
|
|
867
|
+
return resolver(fallbackSearchEngine, query);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* Parses vimeo id from url
|
|
872
|
+
* @param {string} query The query
|
|
873
|
+
* @returns {string}
|
|
874
|
+
*/
|
|
875
|
+
static getVimeoID(query) {
|
|
876
|
+
return _QueryResolver.resolve(query).type === QueryType.VIMEO ? query.split("/").filter(Boolean).pop() : null;
|
|
877
|
+
}
|
|
878
|
+
static validateId(q) {
|
|
879
|
+
return youtubeVideoIdRegex.test(q);
|
|
880
|
+
}
|
|
881
|
+
static validateURL(q) {
|
|
882
|
+
return youtubeVideoURLRegex.test(q);
|
|
883
|
+
}
|
|
715
884
|
};
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
QueueRepeatMode2[QueueRepeatMode2["TRACK"] = 1] = "TRACK";
|
|
719
|
-
QueueRepeatMode2[QueueRepeatMode2["QUEUE"] = 2] = "QUEUE";
|
|
720
|
-
QueueRepeatMode2[QueueRepeatMode2["AUTOPLAY"] = 3] = "AUTOPLAY";
|
|
721
|
-
return QueueRepeatMode2;
|
|
722
|
-
})(QueueRepeatMode || {});
|
|
885
|
+
__name(_QueryResolver, "QueryResolver");
|
|
886
|
+
var QueryResolver = _QueryResolver;
|
|
723
887
|
|
|
724
888
|
// src/fabric/SearchResult.ts
|
|
725
889
|
var _SearchResult = class _SearchResult {
|
|
@@ -1119,7 +1283,7 @@ var VALIDATE_QUEUE_CAP = /* @__PURE__ */ __name((queue, items) => {
|
|
|
1119
1283
|
if (queue.maxSize < 1 || queue.maxSize === Infinity) return;
|
|
1120
1284
|
const maxCap = queue.getCapacity();
|
|
1121
1285
|
if (maxCap < tracks.length) {
|
|
1122
|
-
throw
|
|
1286
|
+
throw new OutOfSpaceError("tracks queue", maxCap, tracks.length);
|
|
1123
1287
|
}
|
|
1124
1288
|
}, "VALIDATE_QUEUE_CAP");
|
|
1125
1289
|
|
|
@@ -1137,12 +1301,12 @@ function isErisProxy(client) {
|
|
|
1137
1301
|
return Reflect.get(client, DiscordPlayerClientSymbol) === "Eris";
|
|
1138
1302
|
}
|
|
1139
1303
|
__name(isErisProxy, "isErisProxy");
|
|
1140
|
-
function declareProperty(
|
|
1141
|
-
Reflect.set(
|
|
1304
|
+
function declareProperty(target, key, value) {
|
|
1305
|
+
Reflect.set(target, key, value);
|
|
1142
1306
|
}
|
|
1143
1307
|
__name(declareProperty, "declareProperty");
|
|
1144
|
-
function getProperty(
|
|
1145
|
-
return Reflect.get(
|
|
1308
|
+
function getProperty(target, key) {
|
|
1309
|
+
return Reflect.get(target, key);
|
|
1146
1310
|
}
|
|
1147
1311
|
__name(getProperty, "getProperty");
|
|
1148
1312
|
function createErisCompat(client) {
|
|
@@ -1151,16 +1315,16 @@ function createErisCompat(client) {
|
|
|
1151
1315
|
const eris = module2;
|
|
1152
1316
|
erisVoiceEventsHandler(client);
|
|
1153
1317
|
const erisProxy = new Proxy(client, {
|
|
1154
|
-
get(
|
|
1318
|
+
get(target, p) {
|
|
1155
1319
|
switch (p) {
|
|
1156
1320
|
case "users":
|
|
1157
|
-
return erisUsersProxy(
|
|
1321
|
+
return erisUsersProxy(target, eris);
|
|
1158
1322
|
case "guilds":
|
|
1159
|
-
return erisGuildsProxy(
|
|
1323
|
+
return erisGuildsProxy(target, eris);
|
|
1160
1324
|
case "channels":
|
|
1161
|
-
return erisChannelsProxy(
|
|
1325
|
+
return erisChannelsProxy(target, eris);
|
|
1162
1326
|
case "__dp_voiceStateUpdate_proxy":
|
|
1163
|
-
return (
|
|
1327
|
+
return (handler) => erisVoiceStateUpdateProxy(target, erisProxy, handler);
|
|
1164
1328
|
case "incrementMaxListeners":
|
|
1165
1329
|
return () => {
|
|
1166
1330
|
client.setMaxListeners(client.getMaxListeners() + 1);
|
|
@@ -1171,7 +1335,7 @@ function createErisCompat(client) {
|
|
|
1171
1335
|
client.setMaxListeners(listeners < 0 ? 1 : listeners);
|
|
1172
1336
|
};
|
|
1173
1337
|
default:
|
|
1174
|
-
return
|
|
1338
|
+
return target[p];
|
|
1175
1339
|
}
|
|
1176
1340
|
}
|
|
1177
1341
|
});
|
|
@@ -1179,7 +1343,7 @@ function createErisCompat(client) {
|
|
|
1179
1343
|
return erisProxy;
|
|
1180
1344
|
}
|
|
1181
1345
|
__name(createErisCompat, "createErisCompat");
|
|
1182
|
-
function erisVoiceStateUpdateProxy(client, proxy,
|
|
1346
|
+
function erisVoiceStateUpdateProxy(client, proxy, handler) {
|
|
1183
1347
|
client.on("voiceStateUpdate", (member, oldState) => {
|
|
1184
1348
|
try {
|
|
1185
1349
|
const proxiedOldState = {
|
|
@@ -1217,7 +1381,7 @@ function erisVoiceStateUpdateProxy(client, proxy, handler2) {
|
|
|
1217
1381
|
}
|
|
1218
1382
|
}
|
|
1219
1383
|
};
|
|
1220
|
-
return
|
|
1384
|
+
return handler(proxiedNewState, proxiedOldState);
|
|
1221
1385
|
} catch {
|
|
1222
1386
|
}
|
|
1223
1387
|
});
|
|
@@ -1258,7 +1422,7 @@ function erisVoiceEventsHandler(client) {
|
|
|
1258
1422
|
}
|
|
1259
1423
|
__name(erisVoiceEventsHandler, "erisVoiceEventsHandler");
|
|
1260
1424
|
function erisChannelsProxy(client, eris) {
|
|
1261
|
-
const
|
|
1425
|
+
const handler = {
|
|
1262
1426
|
client,
|
|
1263
1427
|
get cache() {
|
|
1264
1428
|
return {
|
|
@@ -1283,26 +1447,26 @@ function erisChannelsProxy(client, eris) {
|
|
|
1283
1447
|
return channel?.id;
|
|
1284
1448
|
}
|
|
1285
1449
|
};
|
|
1286
|
-
return
|
|
1450
|
+
return handler;
|
|
1287
1451
|
}
|
|
1288
1452
|
__name(erisChannelsProxy, "erisChannelsProxy");
|
|
1289
1453
|
function erisResolvedChannelProxy(channel, client) {
|
|
1290
1454
|
if (!channel) return;
|
|
1291
1455
|
return new Proxy(channel, {
|
|
1292
|
-
get(
|
|
1456
|
+
get(target, p) {
|
|
1293
1457
|
switch (p) {
|
|
1294
1458
|
case "guild":
|
|
1295
|
-
return erisVoiceAdapterProxy(
|
|
1459
|
+
return erisVoiceAdapterProxy(target.guild, client);
|
|
1296
1460
|
case "members":
|
|
1297
|
-
return
|
|
1461
|
+
return target.voiceMembers;
|
|
1298
1462
|
case "isVoiceBased":
|
|
1299
|
-
return () =>
|
|
1463
|
+
return () => target.type === import_v10.ChannelType.GuildVoice || target.type === import_v10.ChannelType.GuildStageVoice;
|
|
1300
1464
|
case "isVoice":
|
|
1301
|
-
return () =>
|
|
1465
|
+
return () => target.type === import_v10.ChannelType.GuildVoice;
|
|
1302
1466
|
case "isStage":
|
|
1303
|
-
return () =>
|
|
1467
|
+
return () => target.type === import_v10.ChannelType.GuildStageVoice;
|
|
1304
1468
|
default:
|
|
1305
|
-
return
|
|
1469
|
+
return target[p];
|
|
1306
1470
|
}
|
|
1307
1471
|
}
|
|
1308
1472
|
});
|
|
@@ -1311,11 +1475,11 @@ __name(erisResolvedChannelProxy, "erisResolvedChannelProxy");
|
|
|
1311
1475
|
function erisVoiceAdapterProxy(guild, client) {
|
|
1312
1476
|
if (!guild) return;
|
|
1313
1477
|
return new Proxy(guild, {
|
|
1314
|
-
get(
|
|
1478
|
+
get(target, p) {
|
|
1315
1479
|
if (p === "voiceAdapterCreator") {
|
|
1316
|
-
return erisVoiceAdapterCreator(
|
|
1480
|
+
return erisVoiceAdapterCreator(target, client);
|
|
1317
1481
|
}
|
|
1318
|
-
return
|
|
1482
|
+
return target[p];
|
|
1319
1483
|
}
|
|
1320
1484
|
});
|
|
1321
1485
|
}
|
|
@@ -1344,14 +1508,14 @@ function erisVoiceAdapterCreator(guild, client) {
|
|
|
1344
1508
|
__name(erisVoiceAdapterCreator, "erisVoiceAdapterCreator");
|
|
1345
1509
|
function erisGuildsProxy(client, eris) {
|
|
1346
1510
|
return new Proxy(client.guilds, {
|
|
1347
|
-
get(
|
|
1511
|
+
get(target, p) {
|
|
1348
1512
|
if (p === "cache") {
|
|
1349
|
-
return
|
|
1513
|
+
return target;
|
|
1350
1514
|
}
|
|
1351
1515
|
if (p === "resolve" || p === "resolveId") {
|
|
1352
1516
|
const resolver = /* @__PURE__ */ __name(function(resolvable) {
|
|
1353
1517
|
if (typeof resolvable === "string") {
|
|
1354
|
-
return
|
|
1518
|
+
return target.get(resolvable);
|
|
1355
1519
|
}
|
|
1356
1520
|
if (resolvable instanceof eris.Guild) {
|
|
1357
1521
|
return resolvable;
|
|
@@ -1368,21 +1532,21 @@ function erisGuildsProxy(client, eris) {
|
|
|
1368
1532
|
return guild?.id;
|
|
1369
1533
|
};
|
|
1370
1534
|
}
|
|
1371
|
-
return
|
|
1535
|
+
return target[p];
|
|
1372
1536
|
}
|
|
1373
1537
|
});
|
|
1374
1538
|
}
|
|
1375
1539
|
__name(erisGuildsProxy, "erisGuildsProxy");
|
|
1376
1540
|
function erisUsersProxy(client, eris) {
|
|
1377
1541
|
return new Proxy(client.users, {
|
|
1378
|
-
get(
|
|
1542
|
+
get(target, p) {
|
|
1379
1543
|
if (p === "cache") {
|
|
1380
|
-
return
|
|
1544
|
+
return target;
|
|
1381
1545
|
}
|
|
1382
1546
|
if (p === "resolve" || p === "resolveId") {
|
|
1383
1547
|
const resolver = /* @__PURE__ */ __name(function(resolvable) {
|
|
1384
1548
|
if (typeof resolvable === "string") {
|
|
1385
|
-
return
|
|
1549
|
+
return target.get(resolvable);
|
|
1386
1550
|
}
|
|
1387
1551
|
if (resolvable instanceof eris.User) {
|
|
1388
1552
|
return resolvable;
|
|
@@ -1399,7 +1563,7 @@ function erisUsersProxy(client, eris) {
|
|
|
1399
1563
|
return user?.id;
|
|
1400
1564
|
};
|
|
1401
1565
|
}
|
|
1402
|
-
return
|
|
1566
|
+
return target[p];
|
|
1403
1567
|
}
|
|
1404
1568
|
});
|
|
1405
1569
|
}
|
|
@@ -1526,21 +1690,21 @@ var _BaseExtractor = class _BaseExtractor {
|
|
|
1526
1690
|
* @param info The track to stream
|
|
1527
1691
|
*/
|
|
1528
1692
|
async stream(info) {
|
|
1529
|
-
throw
|
|
1693
|
+
throw new NotImplementedError(`${this.constructor.name}.stream()`);
|
|
1530
1694
|
}
|
|
1531
1695
|
/**
|
|
1532
1696
|
* Handle the given query
|
|
1533
1697
|
* @param query The query to handle
|
|
1534
1698
|
*/
|
|
1535
1699
|
async handle(query, context) {
|
|
1536
|
-
throw
|
|
1700
|
+
throw new NotImplementedError(`${this.constructor.name}.handle()`);
|
|
1537
1701
|
}
|
|
1538
1702
|
/**
|
|
1539
1703
|
* Get related tracks for the given track
|
|
1540
1704
|
* @param track The track source
|
|
1541
1705
|
*/
|
|
1542
1706
|
async getRelatedTracks(track, history) {
|
|
1543
|
-
throw
|
|
1707
|
+
throw new NotImplementedError(`${this.constructor.name}.getRelatedTracks()`);
|
|
1544
1708
|
}
|
|
1545
1709
|
/**
|
|
1546
1710
|
* A stream middleware to handle streams before passing it to the player
|
|
@@ -1672,7 +1836,7 @@ function useHooksContext(hookName, mainOnly = false) {
|
|
|
1672
1836
|
isFallback = true;
|
|
1673
1837
|
}
|
|
1674
1838
|
if (!player)
|
|
1675
|
-
throw
|
|
1839
|
+
throw new IllegalHookInvocationError(
|
|
1676
1840
|
"discord-player",
|
|
1677
1841
|
`Player context is not available, ${isFallback ? "did you forget to initialize the player with `new Player(client)`?" : "is it being called inside <Player>.context.provide()?"}`
|
|
1678
1842
|
);
|
|
@@ -1681,14 +1845,14 @@ function useHooksContext(hookName, mainOnly = false) {
|
|
|
1681
1845
|
if (!isFallback) {
|
|
1682
1846
|
context = useContext(player.context);
|
|
1683
1847
|
if (!context)
|
|
1684
|
-
throw
|
|
1848
|
+
throw new IllegalHookInvocationError(
|
|
1685
1849
|
hookName,
|
|
1686
1850
|
`${hookName} must be called inside a player context created by <Player>.context.provide()`
|
|
1687
1851
|
);
|
|
1688
1852
|
} else {
|
|
1689
1853
|
context = {
|
|
1690
1854
|
get guild() {
|
|
1691
|
-
throw
|
|
1855
|
+
throw new IllegalHookInvocationError(
|
|
1692
1856
|
hookName,
|
|
1693
1857
|
`${hookName} must be called with an explicit guild argument when not inside a player context`
|
|
1694
1858
|
);
|
|
@@ -1786,14 +1950,14 @@ function useTimeline(options) {
|
|
|
1786
1950
|
__name(useTimeline, "useTimeline");
|
|
1787
1951
|
|
|
1788
1952
|
// src/hooks/stream/onAfterCreateStream.ts
|
|
1789
|
-
function onAfterCreateStream(
|
|
1790
|
-
getGlobalRegistry().set("@[onAfterCreateStream]",
|
|
1953
|
+
function onAfterCreateStream(handler) {
|
|
1954
|
+
getGlobalRegistry().set("@[onAfterCreateStream]", handler);
|
|
1791
1955
|
}
|
|
1792
1956
|
__name(onAfterCreateStream, "onAfterCreateStream");
|
|
1793
1957
|
|
|
1794
1958
|
// src/hooks/stream/onBeforeCreateStream.ts
|
|
1795
|
-
function onBeforeCreateStream(
|
|
1796
|
-
getGlobalRegistry().set("@[onBeforeCreateStream]",
|
|
1959
|
+
function onBeforeCreateStream(handler) {
|
|
1960
|
+
getGlobalRegistry().set("@[onBeforeCreateStream]", handler);
|
|
1797
1961
|
}
|
|
1798
1962
|
__name(onBeforeCreateStream, "onBeforeCreateStream");
|
|
1799
1963
|
|
|
@@ -1886,7 +2050,6 @@ ${sample}
|
|
|
1886
2050
|
async register(_extractor, options) {
|
|
1887
2051
|
if (typeof _extractor.identifier !== "string" || this.store.has(_extractor.identifier)) return null;
|
|
1888
2052
|
const extractor = new _extractor(this, options);
|
|
1889
|
-
if (this.player.options.bridgeProvider) options.bridgeProvider ?? (options.bridgeProvider = this.player.options.bridgeProvider);
|
|
1890
2053
|
try {
|
|
1891
2054
|
this.store.set(_extractor.identifier, extractor);
|
|
1892
2055
|
if (this.player.hasDebugger) this.player.debug(`${_extractor.identifier} extractor loaded!`);
|
|
@@ -1992,7 +2155,7 @@ ${sample}
|
|
|
1992
2155
|
return result2;
|
|
1993
2156
|
});
|
|
1994
2157
|
if (!result?.result)
|
|
1995
|
-
throw
|
|
2158
|
+
throw new BridgeFailedError(
|
|
1996
2159
|
this.getExecutionId(),
|
|
1997
2160
|
result?.error?.stack || result?.error?.message || "No extractors available to bridge"
|
|
1998
2161
|
);
|
|
@@ -2006,9 +2169,9 @@ ${sample}
|
|
|
2006
2169
|
* @param targetExtractor The target extractor to bridge to
|
|
2007
2170
|
*/
|
|
2008
2171
|
async requestBridgeFrom(track, sourceExtractor, targetExtractor) {
|
|
2009
|
-
const
|
|
2010
|
-
if (!
|
|
2011
|
-
return
|
|
2172
|
+
const target = this.resolve(targetExtractor);
|
|
2173
|
+
if (!target) return null;
|
|
2174
|
+
return target.bridge(track, sourceExtractor);
|
|
2012
2175
|
}
|
|
2013
2176
|
/**
|
|
2014
2177
|
* Check if extractor is disabled
|
|
@@ -2045,7 +2208,7 @@ var import_utils7 = require("@discord-player/utils");
|
|
|
2045
2208
|
var import_discord3 = require("discord.js");
|
|
2046
2209
|
var import_utils6 = require("@discord-player/utils");
|
|
2047
2210
|
|
|
2048
|
-
// src/
|
|
2211
|
+
// src/stream/StreamDispatcher.ts
|
|
2049
2212
|
var import_discord_voip = require("discord-voip");
|
|
2050
2213
|
var import_utils4 = require("@discord-player/utils");
|
|
2051
2214
|
var import_equalizer = require("@discord-player/equalizer");
|
|
@@ -2317,7 +2480,7 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
|
|
|
2317
2480
|
*/
|
|
2318
2481
|
async playStream(resource = this.audioResource) {
|
|
2319
2482
|
if (!resource) {
|
|
2320
|
-
throw
|
|
2483
|
+
throw new NoAudioResourceError();
|
|
2321
2484
|
}
|
|
2322
2485
|
if (resource.ended) {
|
|
2323
2486
|
return void this.emit("finish", resource);
|
|
@@ -2437,7 +2600,7 @@ var _GuildQueueHistory = class _GuildQueueHistory {
|
|
|
2437
2600
|
async next() {
|
|
2438
2601
|
const track = this.nextTrack;
|
|
2439
2602
|
if (!track) {
|
|
2440
|
-
throw
|
|
2603
|
+
throw new NoResultError("No next track in the queue");
|
|
2441
2604
|
}
|
|
2442
2605
|
this.queue.node.skip({
|
|
2443
2606
|
reason: "HISTORY_NEXT_TRACK" /* HistoryNext */,
|
|
@@ -2450,7 +2613,7 @@ var _GuildQueueHistory = class _GuildQueueHistory {
|
|
|
2450
2613
|
async previous(preserveCurrent = true) {
|
|
2451
2614
|
const track = this.tracks.dispatch();
|
|
2452
2615
|
if (!track) {
|
|
2453
|
-
throw
|
|
2616
|
+
throw new NoResultError("No previous track in the queue");
|
|
2454
2617
|
}
|
|
2455
2618
|
const current = this.currentTrack;
|
|
2456
2619
|
await this.queue.node.play(track, { queue: false });
|
|
@@ -2477,157 +2640,6 @@ var GuildQueueHistory = _GuildQueueHistory;
|
|
|
2477
2640
|
// src/queue/GuildQueuePlayerNode.ts
|
|
2478
2641
|
var import_discord_voip2 = require("discord-voip");
|
|
2479
2642
|
var import_stream = require("stream");
|
|
2480
|
-
|
|
2481
|
-
// src/utils/QueryResolver.ts
|
|
2482
|
-
var import_undici = require("undici");
|
|
2483
|
-
var spotifySongRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:track\/|\?uri=spotify:track:)((\w|-){22})(\?si=.+)?$/;
|
|
2484
|
-
var spotifyPlaylistRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})(\?si=.+)?$/;
|
|
2485
|
-
var spotifyAlbumRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(intl-([a-z]|[A-Z])+\/)?(?:album\/|\?uri=spotify:album:)((\w|-){22})(\?si=.+)?$/;
|
|
2486
|
-
var vimeoRegex = /^(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)$/;
|
|
2487
|
-
var reverbnationRegex = /^https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)$/;
|
|
2488
|
-
var attachmentRegex = /^https?:\/\/.+$/;
|
|
2489
|
-
var appleMusicSongRegex = /^https?:\/\/music\.apple\.com\/.+?\/(song|album)\/.+?(\/.+?\?i=|\/)([0-9]+)$/;
|
|
2490
|
-
var appleMusicPlaylistRegex = /^https?:\/\/music\.apple\.com\/.+?\/playlist\/.+\/pl\.(u-|pm-)?[a-zA-Z0-9]+$/;
|
|
2491
|
-
var appleMusicAlbumRegex = /^https?:\/\/music\.apple\.com\/.+?\/album\/.+\/([0-9]+)$/;
|
|
2492
|
-
var soundcloudTrackRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/(\w|-)+(.+)?$/;
|
|
2493
|
-
var soundcloudPlaylistRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/sets\/(\w|-)+(.+)?$/;
|
|
2494
|
-
var youtubePlaylistRegex = /^https?:\/\/(www.)?youtube.com\/playlist\?list=((PL|FL|UU|LL|RD|OL)[a-zA-Z0-9-_]{16,41})$/;
|
|
2495
|
-
var youtubeVideoURLRegex = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/;
|
|
2496
|
-
var youtubeVideoIdRegex = /^[a-zA-Z0-9-_]{11}$/;
|
|
2497
|
-
var DomainsMap = {
|
|
2498
|
-
YouTube: ["youtube.com", "youtu.be", "music.youtube.com", "gaming.youtube.com", "www.youtube.com", "m.youtube.com"],
|
|
2499
|
-
Spotify: ["open.spotify.com", "embed.spotify.com"],
|
|
2500
|
-
Vimeo: ["vimeo.com", "player.vimeo.com"],
|
|
2501
|
-
ReverbNation: ["reverbnation.com"],
|
|
2502
|
-
SoundCloud: ["soundcloud.com"],
|
|
2503
|
-
AppleMusic: ["music.apple.com"]
|
|
2504
|
-
};
|
|
2505
|
-
var redirectDomains = /* @__PURE__ */ new Set([
|
|
2506
|
-
/^https?:\/\/spotify.link\/[A-Za-z0-9]+$/,
|
|
2507
|
-
/^https:\/\/on\.soundcloud\.com\/[a-zA-Z1-9]{0,17}$/
|
|
2508
|
-
]);
|
|
2509
|
-
var _QueryResolver = class _QueryResolver {
|
|
2510
|
-
/**
|
|
2511
|
-
* Query resolver
|
|
2512
|
-
*/
|
|
2513
|
-
constructor() {
|
|
2514
|
-
}
|
|
2515
|
-
// eslint-disable-line @typescript-eslint/no-empty-function
|
|
2516
|
-
static get regex() {
|
|
2517
|
-
return {
|
|
2518
|
-
spotifyAlbumRegex,
|
|
2519
|
-
spotifyPlaylistRegex,
|
|
2520
|
-
spotifySongRegex,
|
|
2521
|
-
vimeoRegex,
|
|
2522
|
-
reverbnationRegex,
|
|
2523
|
-
attachmentRegex,
|
|
2524
|
-
appleMusicAlbumRegex,
|
|
2525
|
-
appleMusicPlaylistRegex,
|
|
2526
|
-
appleMusicSongRegex,
|
|
2527
|
-
soundcloudTrackRegex,
|
|
2528
|
-
soundcloudPlaylistRegex,
|
|
2529
|
-
youtubePlaylistRegex
|
|
2530
|
-
};
|
|
2531
|
-
}
|
|
2532
|
-
/**
|
|
2533
|
-
* Pre-resolve redirect urls
|
|
2534
|
-
*/
|
|
2535
|
-
static async preResolve(query, maxDepth = 5) {
|
|
2536
|
-
if (!TypeUtil.isString(query)) throw Exceptions.ERR_INVALID_ARG_TYPE(query, "string", typeof query);
|
|
2537
|
-
for (const domain of redirectDomains) {
|
|
2538
|
-
if (domain.test(query)) {
|
|
2539
|
-
try {
|
|
2540
|
-
const res = await (0, import_undici.fetch)(query, {
|
|
2541
|
-
method: "GET",
|
|
2542
|
-
redirect: "follow"
|
|
2543
|
-
});
|
|
2544
|
-
if (!res.ok) break;
|
|
2545
|
-
if (/^https?:\/\/spotify.app.link\/(.+)$/.test(res.url)) {
|
|
2546
|
-
const body = await res.text();
|
|
2547
|
-
const target2 = body.split("https://open.spotify.com/track/")[1].split("?si=")[0];
|
|
2548
|
-
if (!target2) break;
|
|
2549
|
-
return `https://open.spotify.com/track/${target2}`;
|
|
2550
|
-
}
|
|
2551
|
-
return maxDepth < 1 ? res.url : this.preResolve(res.url, maxDepth - 1);
|
|
2552
|
-
} catch {
|
|
2553
|
-
break;
|
|
2554
|
-
}
|
|
2555
|
-
}
|
|
2556
|
-
}
|
|
2557
|
-
return query;
|
|
2558
|
-
}
|
|
2559
|
-
/**
|
|
2560
|
-
* Resolves the given search query
|
|
2561
|
-
* @param {string} query The query
|
|
2562
|
-
*/
|
|
2563
|
-
static resolve(query, fallbackSearchEngine = QueryType.AUTO_SEARCH) {
|
|
2564
|
-
if (!TypeUtil.isString(query)) throw Exceptions.ERR_INVALID_ARG_TYPE(query, "string", typeof query);
|
|
2565
|
-
if (!query.length) throw Exceptions.ERR_INFO_REQUIRED("query", String(query));
|
|
2566
|
-
const resolver = /* @__PURE__ */ __name((type, query2) => ({ type, query: query2 }), "resolver");
|
|
2567
|
-
try {
|
|
2568
|
-
const url = new URL(query);
|
|
2569
|
-
if (DomainsMap.YouTube.includes(url.host)) {
|
|
2570
|
-
query = query.replace(/(m(usic)?|gaming)\./, "").trim();
|
|
2571
|
-
const playlistId = url.searchParams.get("list");
|
|
2572
|
-
const videoId = url.searchParams.get("v");
|
|
2573
|
-
if (playlistId) {
|
|
2574
|
-
if (videoId && playlistId.startsWith("RD"))
|
|
2575
|
-
return resolver(
|
|
2576
|
-
QueryType.YOUTUBE_PLAYLIST,
|
|
2577
|
-
`https://www.youtube.com/watch?v=${videoId}&list=${playlistId}`
|
|
2578
|
-
);
|
|
2579
|
-
return resolver(QueryType.YOUTUBE_PLAYLIST, `https://www.youtube.com/playlist?list=${playlistId}`);
|
|
2580
|
-
}
|
|
2581
|
-
if (_QueryResolver.validateId(query) || _QueryResolver.validateURL(query))
|
|
2582
|
-
return resolver(QueryType.YOUTUBE_VIDEO, query);
|
|
2583
|
-
return resolver(fallbackSearchEngine, query);
|
|
2584
|
-
} else if (DomainsMap.Spotify.includes(url.host)) {
|
|
2585
|
-
query = query.replace(/intl-([a-zA-Z]+)\//, "");
|
|
2586
|
-
if (spotifyPlaylistRegex.test(query)) return resolver(QueryType.SPOTIFY_PLAYLIST, query);
|
|
2587
|
-
if (spotifyAlbumRegex.test(query)) return resolver(QueryType.SPOTIFY_ALBUM, query);
|
|
2588
|
-
if (spotifySongRegex.test(query)) return resolver(QueryType.SPOTIFY_SONG, query);
|
|
2589
|
-
return resolver(fallbackSearchEngine, query);
|
|
2590
|
-
} else if (DomainsMap.Vimeo.includes(url.host)) {
|
|
2591
|
-
if (vimeoRegex.test(query)) return resolver(QueryType.VIMEO, query);
|
|
2592
|
-
return resolver(fallbackSearchEngine, query);
|
|
2593
|
-
} else if (DomainsMap.ReverbNation.includes(url.host)) {
|
|
2594
|
-
if (reverbnationRegex.test(query)) return resolver(QueryType.REVERBNATION, query);
|
|
2595
|
-
return resolver(fallbackSearchEngine, query);
|
|
2596
|
-
} else if (DomainsMap.SoundCloud.includes(url.host)) {
|
|
2597
|
-
if (soundcloudPlaylistRegex.test(query)) return resolver(QueryType.SOUNDCLOUD_PLAYLIST, query);
|
|
2598
|
-
if (soundcloudTrackRegex.test(query)) return resolver(QueryType.SOUNDCLOUD_TRACK, query);
|
|
2599
|
-
return resolver(fallbackSearchEngine, query);
|
|
2600
|
-
} else if (DomainsMap.AppleMusic.includes(url.host)) {
|
|
2601
|
-
if (appleMusicAlbumRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_ALBUM, query);
|
|
2602
|
-
if (appleMusicPlaylistRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_PLAYLIST, query);
|
|
2603
|
-
if (appleMusicSongRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_SONG, query);
|
|
2604
|
-
return resolver(fallbackSearchEngine, query);
|
|
2605
|
-
} else {
|
|
2606
|
-
return resolver(QueryType.ARBITRARY, query);
|
|
2607
|
-
}
|
|
2608
|
-
} catch {
|
|
2609
|
-
return resolver(fallbackSearchEngine, query);
|
|
2610
|
-
}
|
|
2611
|
-
}
|
|
2612
|
-
/**
|
|
2613
|
-
* Parses vimeo id from url
|
|
2614
|
-
* @param {string} query The query
|
|
2615
|
-
* @returns {string}
|
|
2616
|
-
*/
|
|
2617
|
-
static getVimeoID(query) {
|
|
2618
|
-
return _QueryResolver.resolve(query).type === QueryType.VIMEO ? query.split("/").filter(Boolean).pop() : null;
|
|
2619
|
-
}
|
|
2620
|
-
static validateId(q) {
|
|
2621
|
-
return youtubeVideoIdRegex.test(q);
|
|
2622
|
-
}
|
|
2623
|
-
static validateURL(q) {
|
|
2624
|
-
return youtubeVideoURLRegex.test(q);
|
|
2625
|
-
}
|
|
2626
|
-
};
|
|
2627
|
-
__name(_QueryResolver, "QueryResolver");
|
|
2628
|
-
var QueryResolver = _QueryResolver;
|
|
2629
|
-
|
|
2630
|
-
// src/queue/GuildQueuePlayerNode.ts
|
|
2631
2643
|
var import_promises2 = require("timers/promises");
|
|
2632
2644
|
|
|
2633
2645
|
// src/utils/AsyncQueue.ts
|
|
@@ -2898,7 +2910,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
2898
2910
|
separator = "\u2503"
|
|
2899
2911
|
} = options || {};
|
|
2900
2912
|
if (isNaN(length) || length < 0 || !Number.isFinite(length)) {
|
|
2901
|
-
throw
|
|
2913
|
+
throw new OutOfRangeError("[PlayerProgressBarOptions.length]", String(length), "0", "Finite Number");
|
|
2902
2914
|
}
|
|
2903
2915
|
const index = Math.round(timestamp.current.value / timestamp.total.value * length);
|
|
2904
2916
|
if (index >= 1 && index <= length) {
|
|
@@ -2928,7 +2940,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
2928
2940
|
if (duration > this.totalDuration) {
|
|
2929
2941
|
return this.skip({
|
|
2930
2942
|
reason: "SEEK_OVER_THRESHOLD" /* SEEK_OVER_THRESHOLD */,
|
|
2931
|
-
description:
|
|
2943
|
+
description: new OutOfRangeError("[duration]", String(duration), "0", String(this.totalDuration)).message
|
|
2932
2944
|
});
|
|
2933
2945
|
}
|
|
2934
2946
|
if (duration < 0) duration = 0;
|
|
@@ -3062,8 +3074,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3062
3074
|
* @param index The position to insert to, defaults to 0.
|
|
3063
3075
|
*/
|
|
3064
3076
|
insert(track, index = 0) {
|
|
3065
|
-
if (!(track instanceof Track))
|
|
3066
|
-
throw Exceptions.ERR_INVALID_ARG_TYPE("track value", "instance of Track", String(track));
|
|
3077
|
+
if (!(track instanceof Track)) throw new InvalidArgTypeError("track value", "instance of Track", String(track));
|
|
3067
3078
|
VALIDATE_QUEUE_CAP(this.queue, track);
|
|
3068
3079
|
this.queue.tracks.store.splice(index, 0, track);
|
|
3069
3080
|
if (!this.queue.options.noEmitInsert) this.queue.emit(GuildQueueEvent.AudioTrackAdd, this.queue, track);
|
|
@@ -3076,7 +3087,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3076
3087
|
move(from, to) {
|
|
3077
3088
|
const removed = this.remove(from);
|
|
3078
3089
|
if (!removed) {
|
|
3079
|
-
throw
|
|
3090
|
+
throw new NoResultError("invalid track to move");
|
|
3080
3091
|
}
|
|
3081
3092
|
this.insert(removed, to);
|
|
3082
3093
|
}
|
|
@@ -3088,7 +3099,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3088
3099
|
copy(from, to) {
|
|
3089
3100
|
const src = this.queue.tracks.at(this.getTrackPosition(from));
|
|
3090
3101
|
if (!src) {
|
|
3091
|
-
throw
|
|
3102
|
+
throw new NoResultError("invalid track to copy");
|
|
3092
3103
|
}
|
|
3093
3104
|
this.insert(src, to);
|
|
3094
3105
|
}
|
|
@@ -3099,9 +3110,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3099
3110
|
*/
|
|
3100
3111
|
swap(first, second) {
|
|
3101
3112
|
const src = this.getTrackPosition(first);
|
|
3102
|
-
if (src < 0) throw
|
|
3113
|
+
if (src < 0) throw new NoResultError("invalid src track to swap");
|
|
3103
3114
|
const dest = this.getTrackPosition(second);
|
|
3104
|
-
if (dest < 0) throw
|
|
3115
|
+
if (dest < 0) throw new NoResultError("invalid dest track to swap");
|
|
3105
3116
|
const srcT = this.queue.tracks.store[src];
|
|
3106
3117
|
const destT = this.queue.tracks.store[dest];
|
|
3107
3118
|
this.queue.tracks.store[src] = destT;
|
|
@@ -3128,13 +3139,6 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3128
3139
|
}
|
|
3129
3140
|
return true;
|
|
3130
3141
|
}
|
|
3131
|
-
/**
|
|
3132
|
-
* Play raw audio resource
|
|
3133
|
-
* @param resource The audio resource to play
|
|
3134
|
-
*/
|
|
3135
|
-
async playRaw(resource) {
|
|
3136
|
-
await this.queue.dispatcher?.playStream(resource);
|
|
3137
|
-
}
|
|
3138
3142
|
/**
|
|
3139
3143
|
* Play the given track
|
|
3140
3144
|
* @param res The track to play
|
|
@@ -3142,7 +3146,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3142
3146
|
*/
|
|
3143
3147
|
async play(res, options) {
|
|
3144
3148
|
if (!this.queue.dispatcher?.voiceConnection) {
|
|
3145
|
-
throw
|
|
3149
|
+
throw new NoVoiceConnectionError();
|
|
3146
3150
|
}
|
|
3147
3151
|
if (this.queue.hasDebugger)
|
|
3148
3152
|
this.queue.debug(`Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`);
|
|
@@ -3162,12 +3166,19 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3162
3166
|
}
|
|
3163
3167
|
const track = res || this.queue.tracks.dispatch();
|
|
3164
3168
|
if (!track) {
|
|
3165
|
-
const error =
|
|
3169
|
+
const error = new NoResultError("Play request received but track was not provided");
|
|
3166
3170
|
this.queue.emit(GuildQueueEvent.Error, this.queue, error);
|
|
3167
3171
|
return;
|
|
3168
3172
|
}
|
|
3169
3173
|
if (this.queue.hasDebugger) this.queue.debug("Requested option requires to play the track, initializing...");
|
|
3170
3174
|
try {
|
|
3175
|
+
const assignedResource = track.resource;
|
|
3176
|
+
if (assignedResource) {
|
|
3177
|
+
if (this.queue.hasDebugger)
|
|
3178
|
+
this.queue.debug("Track has an audio resource assigned, player will now play the resource directly...");
|
|
3179
|
+
this.queue.setTransitioning(!!options.transitionMode);
|
|
3180
|
+
return __privateMethod(this, _GuildQueuePlayerNode_instances, performPlay_fn).call(this, assignedResource);
|
|
3181
|
+
}
|
|
3171
3182
|
if (this.queue.hasDebugger) this.queue.debug(`Initiating stream extraction process...`);
|
|
3172
3183
|
const src = track.raw?.source || track.source;
|
|
3173
3184
|
const qt = track.queryType || (src === "spotify" ? "spotifySong" : src === "apple_music" ? "appleMusicSong" : src);
|
|
@@ -3314,7 +3325,7 @@ _progress = new WeakMap();
|
|
|
3314
3325
|
_hasFFmpegOptimization = new WeakMap();
|
|
3315
3326
|
_GuildQueuePlayerNode_instances = new WeakSet();
|
|
3316
3327
|
throw_fn = /* @__PURE__ */ __name(function(track, error) {
|
|
3317
|
-
const streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault =
|
|
3328
|
+
const streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault = new NoResultError(`Could not extract stream for this track${error ? `
|
|
3318
3329
|
|
|
3319
3330
|
${error.stack || error}` : ""}`);
|
|
3320
3331
|
this.queue.emit(
|
|
@@ -3413,8 +3424,7 @@ createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0,
|
|
|
3413
3424
|
const ffmpegStream = this.queue.filters.ffmpeg.createStream(stream, {
|
|
3414
3425
|
encoderArgs: this.queue.filters.ffmpeg.args,
|
|
3415
3426
|
seek: seek / 1e3,
|
|
3416
|
-
fmt: opus ? "opus" : "s16le"
|
|
3417
|
-
useLegacyFFmpeg: !!this.queue.player.options.useLegacyFFmpeg
|
|
3427
|
+
fmt: opus ? "opus" : "s16le"
|
|
3418
3428
|
}).on("error", (err) => {
|
|
3419
3429
|
const m = `${err}`.toLowerCase();
|
|
3420
3430
|
if (this.queue.hasDebugger)
|
|
@@ -3432,8 +3442,6 @@ var import_equalizer2 = require("@discord-player/equalizer");
|
|
|
3432
3442
|
|
|
3433
3443
|
// src/utils/FFmpegStream.ts
|
|
3434
3444
|
var import_ffmpeg = require("@discord-player/ffmpeg");
|
|
3435
|
-
var prism = __toESM(require("prism-media"));
|
|
3436
|
-
var getFFmpegProvider = /* @__PURE__ */ __name((legacy = false) => legacy ? prism.default?.FFmpeg || prism.FFmpeg : import_ffmpeg.FFmpeg, "getFFmpegProvider");
|
|
3437
3445
|
var resolveArgs = /* @__PURE__ */ __name((config) => {
|
|
3438
3446
|
return Object.entries(config).reduce((acc, [key, value]) => {
|
|
3439
3447
|
if (value == null) return acc;
|
|
@@ -3476,8 +3484,7 @@ function createFFmpegStream(stream, options) {
|
|
|
3476
3484
|
const args = typeof stream === "string" ? FFMPEG_ARGS_STRING(stream, options.fmt, options.cookies) : FFMPEG_ARGS_PIPED(options.fmt);
|
|
3477
3485
|
if (!Number.isNaN(options.seek)) args.unshift("-ss", String(options.seek));
|
|
3478
3486
|
if (Array.isArray(options.encoderArgs)) args.push(...options.encoderArgs);
|
|
3479
|
-
const
|
|
3480
|
-
const transcoder = new FFMPEG({ shell: false, args });
|
|
3487
|
+
const transcoder = new import_ffmpeg.FFmpeg({ shell: false, args });
|
|
3481
3488
|
transcoder.on("close", () => transcoder.destroy());
|
|
3482
3489
|
if (typeof stream !== "string") {
|
|
3483
3490
|
stream.on("error", () => transcoder.destroy());
|
|
@@ -3501,18 +3508,20 @@ var makeBands = /* @__PURE__ */ __name((arr) => {
|
|
|
3501
3508
|
}, "makeBands");
|
|
3502
3509
|
var EqualizerConfigurationPreset = Object.freeze({
|
|
3503
3510
|
Flat: makeBands([]),
|
|
3504
|
-
Classical: makeBands(
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3511
|
+
Classical: makeBands(
|
|
3512
|
+
[
|
|
3513
|
+
-111022e-20,
|
|
3514
|
+
-111022e-20,
|
|
3515
|
+
-111022e-20,
|
|
3516
|
+
-111022e-20,
|
|
3517
|
+
-111022e-20,
|
|
3518
|
+
-111022e-20,
|
|
3519
|
+
-7.2,
|
|
3520
|
+
-7.2,
|
|
3521
|
+
-7.2,
|
|
3522
|
+
-9.6
|
|
3523
|
+
]
|
|
3524
|
+
),
|
|
3516
3525
|
Club: makeBands([-111022e-20, -111022e-20, 8, 5.6, 5.6, 5.6, 3.2, -111022e-20, -111022e-20, -111022e-20]),
|
|
3517
3526
|
Dance: makeBands([9.6, 7.2, 2.4, -111022e-20, -111022e-20, -5.6, -7.2, -7.2, -111022e-20, -111022e-20]),
|
|
3518
3527
|
FullBass: makeBands([-8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2]),
|
|
@@ -3521,31 +3530,35 @@ var EqualizerConfigurationPreset = Object.freeze({
|
|
|
3521
3530
|
Headphones: makeBands([4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 12.8, 14.4]),
|
|
3522
3531
|
LargeHall: makeBands([10.4, 10.4, 5.6, 5.6, -111022e-20, -4.8, -4.8, -4.8, -111022e-20, -111022e-20]),
|
|
3523
3532
|
Live: makeBands([-4.8, -111022e-20, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4]),
|
|
3524
|
-
Party: makeBands(
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3533
|
+
Party: makeBands(
|
|
3534
|
+
[
|
|
3535
|
+
7.2,
|
|
3536
|
+
7.2,
|
|
3537
|
+
-111022e-20,
|
|
3538
|
+
-111022e-20,
|
|
3539
|
+
-111022e-20,
|
|
3540
|
+
-111022e-20,
|
|
3541
|
+
-111022e-20,
|
|
3542
|
+
-111022e-20,
|
|
3543
|
+
7.2,
|
|
3544
|
+
7.2
|
|
3545
|
+
]
|
|
3546
|
+
),
|
|
3536
3547
|
Pop: makeBands([-1.6, 4.8, 7.2, 8, 5.6, -111022e-20, -2.4, -2.4, -1.6, -1.6]),
|
|
3537
|
-
Reggae: makeBands(
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3548
|
+
Reggae: makeBands(
|
|
3549
|
+
[
|
|
3550
|
+
-111022e-20,
|
|
3551
|
+
-111022e-20,
|
|
3552
|
+
-111022e-20,
|
|
3553
|
+
-5.6,
|
|
3554
|
+
-111022e-20,
|
|
3555
|
+
6.4,
|
|
3556
|
+
6.4,
|
|
3557
|
+
-111022e-20,
|
|
3558
|
+
-111022e-20,
|
|
3559
|
+
-111022e-20
|
|
3560
|
+
]
|
|
3561
|
+
),
|
|
3549
3562
|
Rock: makeBands([8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2]),
|
|
3550
3563
|
Ska: makeBands([-2.4, -4.8, -4, -111022e-20, 4, 5.6, 8.8, 9.6, 11.2, 9.6]),
|
|
3551
3564
|
Soft: makeBands([4.8, 1.6, -111022e-20, -2.4, -111022e-20, 4, 8, 9.6, 11.2, 12]),
|
|
@@ -3571,7 +3584,7 @@ var _FFmpegFilterer = class _FFmpegFilterer {
|
|
|
3571
3584
|
*/
|
|
3572
3585
|
setInputArgs(args) {
|
|
3573
3586
|
if (!args.every((arg) => typeof arg === "string"))
|
|
3574
|
-
throw
|
|
3587
|
+
throw new InvalidArgTypeError("args", "Array<string>", "invalid item(s)");
|
|
3575
3588
|
__privateSet(this, _inputArgs, args);
|
|
3576
3589
|
}
|
|
3577
3590
|
/**
|
|
@@ -3869,7 +3882,7 @@ var _GuildQueueStatistics = class _GuildQueueStatistics {
|
|
|
3869
3882
|
memoryUsage: process.memoryUsage(),
|
|
3870
3883
|
versions: {
|
|
3871
3884
|
node: process.version,
|
|
3872
|
-
player:
|
|
3885
|
+
player: this.queue.player.version
|
|
3873
3886
|
}
|
|
3874
3887
|
};
|
|
3875
3888
|
}
|
|
@@ -3896,7 +3909,7 @@ var _SyncedLyricsProvider = class _SyncedLyricsProvider {
|
|
|
3896
3909
|
return __privateGet(this, _callback) !== null;
|
|
3897
3910
|
}
|
|
3898
3911
|
load(lyrics) {
|
|
3899
|
-
if (!lyrics) throw
|
|
3912
|
+
if (!lyrics) throw new NotExistingError("syncedLyrics");
|
|
3900
3913
|
this.lyrics.clear();
|
|
3901
3914
|
this.unsubscribe();
|
|
3902
3915
|
const lines = lyrics.split("\n");
|
|
@@ -4129,6 +4142,24 @@ var TrackSkipReason = /* @__PURE__ */ ((TrackSkipReason2) => {
|
|
|
4129
4142
|
TrackSkipReason2["HistoryNext"] = "HISTORY_NEXT_TRACK";
|
|
4130
4143
|
return TrackSkipReason2;
|
|
4131
4144
|
})(TrackSkipReason || {});
|
|
4145
|
+
var QueueRepeatMode = {
|
|
4146
|
+
/**
|
|
4147
|
+
* Disable repeat mode.
|
|
4148
|
+
*/
|
|
4149
|
+
OFF: 0,
|
|
4150
|
+
/**
|
|
4151
|
+
* Repeat the current track.
|
|
4152
|
+
*/
|
|
4153
|
+
TRACK: 1,
|
|
4154
|
+
/**
|
|
4155
|
+
* Repeat the entire queue.
|
|
4156
|
+
*/
|
|
4157
|
+
QUEUE: 2,
|
|
4158
|
+
/**
|
|
4159
|
+
* When last track ends, play similar tracks in the future if queue is empty.
|
|
4160
|
+
*/
|
|
4161
|
+
AUTOPLAY: 3
|
|
4162
|
+
};
|
|
4132
4163
|
var _transitioning, _deleted, _shuffle, _GuildQueue_instances, attachListeners_fn, removeListeners_fn, performStart_fn, getNextTrack_fn, performFinish_fn, emitEnd_fn, handleAutoplay_fn;
|
|
4133
4164
|
var _GuildQueue = class _GuildQueue {
|
|
4134
4165
|
constructor(player, options) {
|
|
@@ -4149,7 +4180,7 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4149
4180
|
stream,
|
|
4150
4181
|
type: import_discord_voip3.StreamType.Raw
|
|
4151
4182
|
}), "onAfterCreateStream"));
|
|
4152
|
-
__publicField(this, "repeatMode",
|
|
4183
|
+
__publicField(this, "repeatMode", QueueRepeatMode.OFF);
|
|
4153
4184
|
__publicField(this, "timeouts", new import_utils6.Collection());
|
|
4154
4185
|
__publicField(this, "stats", new GuildQueueStatistics(this));
|
|
4155
4186
|
__publicField(this, "tasksQueue", new AsyncQueue());
|
|
@@ -4178,10 +4209,10 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4178
4209
|
this.filters.ffmpeg.setDefaults(this.options.ffmpegFilters);
|
|
4179
4210
|
}
|
|
4180
4211
|
if (!TypeUtil.isNumber(options.maxSize)) {
|
|
4181
|
-
throw
|
|
4212
|
+
throw new InvalidArgTypeError("[GuildNodeInit.maxSize]", "number", typeof options.maxSize);
|
|
4182
4213
|
}
|
|
4183
4214
|
if (!TypeUtil.isNumber(options.maxHistorySize)) {
|
|
4184
|
-
throw
|
|
4215
|
+
throw new InvalidArgTypeError("[GuildNodeInit.maxHistorySize]", "number", typeof options.maxHistorySize);
|
|
4185
4216
|
}
|
|
4186
4217
|
if (options.maxSize < 1) options.maxSize = Infinity;
|
|
4187
4218
|
if (options.maxHistorySize < 1) options.maxHistorySize = Infinity;
|
|
@@ -4348,7 +4379,7 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4348
4379
|
*/
|
|
4349
4380
|
setMaxHistorySize(size) {
|
|
4350
4381
|
if (!TypeUtil.isNumber(size)) {
|
|
4351
|
-
throw
|
|
4382
|
+
throw new InvalidArgTypeError("size", "number", typeof size);
|
|
4352
4383
|
}
|
|
4353
4384
|
if (size < 1) size = Infinity;
|
|
4354
4385
|
this.options.maxHistorySize = size;
|
|
@@ -4359,7 +4390,7 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4359
4390
|
*/
|
|
4360
4391
|
setMaxSize(size) {
|
|
4361
4392
|
if (!TypeUtil.isNumber(size)) {
|
|
4362
|
-
throw
|
|
4393
|
+
throw new InvalidArgTypeError("size", "number", typeof size);
|
|
4363
4394
|
}
|
|
4364
4395
|
if (size < 1) size = Infinity;
|
|
4365
4396
|
this.options.maxSize = size;
|
|
@@ -4457,12 +4488,12 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4457
4488
|
*/
|
|
4458
4489
|
createDispatcher(connection, options = {}) {
|
|
4459
4490
|
if (connection.state.status === import_discord_voip3.VoiceConnectionStatus.Destroyed) {
|
|
4460
|
-
throw
|
|
4491
|
+
throw new VoiceConnectionDestroyedError();
|
|
4461
4492
|
}
|
|
4462
4493
|
const channel = this.player.client.channels.cache.get(connection.joinConfig.channelId);
|
|
4463
|
-
if (!channel) throw
|
|
4494
|
+
if (!channel) throw new NoVoiceChannelError();
|
|
4464
4495
|
if (!channel.isVoiceBased())
|
|
4465
|
-
throw
|
|
4496
|
+
throw new InvalidArgTypeError(
|
|
4466
4497
|
"channel",
|
|
4467
4498
|
`VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`,
|
|
4468
4499
|
String(channel?.type)
|
|
@@ -4488,7 +4519,7 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4488
4519
|
async connect(channelResolvable, options = {}) {
|
|
4489
4520
|
const channel = this.player.client.channels.resolve(channelResolvable);
|
|
4490
4521
|
if (!channel || !channel.isVoiceBased()) {
|
|
4491
|
-
throw
|
|
4522
|
+
throw new InvalidArgTypeError(
|
|
4492
4523
|
"channel",
|
|
4493
4524
|
`VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`,
|
|
4494
4525
|
String(channel?.type)
|
|
@@ -4611,7 +4642,7 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4611
4642
|
* @param options Player node initialization options
|
|
4612
4643
|
*/
|
|
4613
4644
|
async play(track, options) {
|
|
4614
|
-
if (!this.channel) throw
|
|
4645
|
+
if (!this.channel) throw new NoVoiceConnectionError();
|
|
4615
4646
|
return this.player.play(this.channel, track, options);
|
|
4616
4647
|
}
|
|
4617
4648
|
/**
|
|
@@ -4664,8 +4695,8 @@ attachListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
|
|
|
4664
4695
|
this.filters._lastFiltersCache.volume = f;
|
|
4665
4696
|
});
|
|
4666
4697
|
}, "#attachListeners");
|
|
4667
|
-
removeListeners_fn = /* @__PURE__ */ __name(function(
|
|
4668
|
-
|
|
4698
|
+
removeListeners_fn = /* @__PURE__ */ __name(function(target) {
|
|
4699
|
+
target.removeAllListeners();
|
|
4669
4700
|
}, "#removeListeners");
|
|
4670
4701
|
performStart_fn = /* @__PURE__ */ __name(function(resource) {
|
|
4671
4702
|
const track = resource?.metadata || this.currentTrack;
|
|
@@ -4713,24 +4744,24 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
|
|
|
4713
4744
|
this.emit(GuildQueueEvent.PlayerFinish, this, track);
|
|
4714
4745
|
}
|
|
4715
4746
|
if (__privateGet(this, _deleted)) return __privateMethod(this, _GuildQueue_instances, emitEnd_fn).call(this);
|
|
4716
|
-
if (this.tracks.size < 1 && this.repeatMode ===
|
|
4747
|
+
if (this.tracks.size < 1 && this.repeatMode === QueueRepeatMode.OFF) {
|
|
4717
4748
|
if (this.hasDebugger)
|
|
4718
4749
|
this.debug("No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()");
|
|
4719
4750
|
__privateMethod(this, _GuildQueue_instances, emitEnd_fn).call(this);
|
|
4720
4751
|
} else {
|
|
4721
|
-
if (this.repeatMode ===
|
|
4752
|
+
if (this.repeatMode === QueueRepeatMode.TRACK) {
|
|
4722
4753
|
if (this.hasDebugger) this.debug("Repeat mode is set to track, repeating last track from the history...");
|
|
4723
4754
|
this.__current = this.history.tracks.dispatch() || track;
|
|
4724
4755
|
return this.node.play(this.__current, { queue: false });
|
|
4725
4756
|
}
|
|
4726
|
-
if (this.repeatMode ===
|
|
4757
|
+
if (this.repeatMode === QueueRepeatMode.QUEUE) {
|
|
4727
4758
|
if (this.hasDebugger)
|
|
4728
4759
|
this.debug("Repeat mode is set to queue, moving last track from the history to current queue...");
|
|
4729
4760
|
const next = this.history.tracks.dispatch() || track;
|
|
4730
4761
|
if (next) this.tracks.add(next);
|
|
4731
4762
|
}
|
|
4732
4763
|
if (!this.tracks.size && track) {
|
|
4733
|
-
if (this.repeatMode ===
|
|
4764
|
+
if (this.repeatMode === QueueRepeatMode.AUTOPLAY) {
|
|
4734
4765
|
if (this.hasDebugger) this.debug("Repeat mode is set to autoplay, initiating autoplay handler...");
|
|
4735
4766
|
__privateMethod(this, _GuildQueue_instances, handleAutoplay_fn).call(this, track);
|
|
4736
4767
|
return;
|
|
@@ -4813,7 +4844,7 @@ var _GuildNodeManager = class _GuildNodeManager {
|
|
|
4813
4844
|
create(guild, options = {}) {
|
|
4814
4845
|
const server = this.player.client.guilds.resolve(guild);
|
|
4815
4846
|
if (!server) {
|
|
4816
|
-
throw
|
|
4847
|
+
throw new NoGuildError("Invalid or unknown guild");
|
|
4817
4848
|
}
|
|
4818
4849
|
if (this.cache.has(server.id)) {
|
|
4819
4850
|
return this.cache.get(server.id);
|
|
@@ -4911,7 +4942,7 @@ var _GuildNodeManager = class _GuildNodeManager {
|
|
|
4911
4942
|
delete(node) {
|
|
4912
4943
|
const queue = this.resolve(node);
|
|
4913
4944
|
if (!queue) {
|
|
4914
|
-
throw
|
|
4945
|
+
throw new NoGuildQueueError("Cannot delete non-existing queue");
|
|
4915
4946
|
}
|
|
4916
4947
|
queue.setTransitioning(true);
|
|
4917
4948
|
queue.node.stop(true);
|
|
@@ -5098,7 +5129,7 @@ var _LrcLib = class _LrcLib {
|
|
|
5098
5129
|
*/
|
|
5099
5130
|
search(params) {
|
|
5100
5131
|
if (!params.q && !params.trackName) {
|
|
5101
|
-
throw
|
|
5132
|
+
throw new InvalidArgTypeError(
|
|
5102
5133
|
"one of q or trackName",
|
|
5103
5134
|
"string",
|
|
5104
5135
|
[String(params.q), String(params.trackName)].join(", ")
|
|
@@ -5113,18 +5144,13 @@ var _LrcLib = class _LrcLib {
|
|
|
5113
5144
|
* @param options The request options
|
|
5114
5145
|
*/
|
|
5115
5146
|
async request(path, options) {
|
|
5116
|
-
let timeout = null;
|
|
5117
5147
|
const dispatcher = /* @__PURE__ */ __name(() => {
|
|
5118
|
-
const controller = new AbortController();
|
|
5119
|
-
timeout = setTimeout(() => {
|
|
5120
|
-
controller.abort();
|
|
5121
|
-
}, this.timeout).unref();
|
|
5122
5148
|
const { name, version: version2 } = Util.getRuntime();
|
|
5123
5149
|
const runtimeVersion = name === "unknown" ? version2 : `${name}/${version2}`;
|
|
5124
5150
|
const init = {
|
|
5125
5151
|
method: "GET",
|
|
5126
5152
|
redirect: "follow",
|
|
5127
|
-
signal:
|
|
5153
|
+
signal: AbortSignal.timeout(this.timeout),
|
|
5128
5154
|
...options,
|
|
5129
5155
|
headers: {
|
|
5130
5156
|
"User-Agent": `Discord-Player/${this.player.version} ${runtimeVersion ?? ""}`.trimEnd(),
|
|
@@ -5136,14 +5162,13 @@ var _LrcLib = class _LrcLib {
|
|
|
5136
5162
|
return fetch(`${this.api}${path.startsWith("/") ? path : "/" + path}`, init);
|
|
5137
5163
|
}, "dispatcher");
|
|
5138
5164
|
const res = await this.bucket.enqueue(dispatcher);
|
|
5139
|
-
if (timeout) clearTimeout(timeout);
|
|
5140
5165
|
return res.json();
|
|
5141
5166
|
}
|
|
5142
5167
|
};
|
|
5143
5168
|
__name(_LrcLib, "LrcLib");
|
|
5144
5169
|
var LrcLib = _LrcLib;
|
|
5145
5170
|
|
|
5146
|
-
// src/
|
|
5171
|
+
// src/stream/VoiceUtils.ts
|
|
5147
5172
|
var import_discord_voip4 = require("discord-voip");
|
|
5148
5173
|
var import_utils8 = require("@discord-player/utils");
|
|
5149
5174
|
var _VoiceUtils = class _VoiceUtils {
|
|
@@ -5167,7 +5192,7 @@ var _VoiceUtils = class _VoiceUtils {
|
|
|
5167
5192
|
* @returns {Promise<StreamDispatcher>}
|
|
5168
5193
|
*/
|
|
5169
5194
|
async connect(channel, options) {
|
|
5170
|
-
if (!options?.queue) throw
|
|
5195
|
+
if (!options?.queue) throw new NoGuildQueueError();
|
|
5171
5196
|
const conn = await this.join(channel, options);
|
|
5172
5197
|
const sub = new StreamDispatcher(conn, channel, options.queue, options.maxTime, options.audioPlayer);
|
|
5173
5198
|
return sub;
|
|
@@ -5298,9 +5323,60 @@ var import_discord_voip5 = require("discord-voip");
|
|
|
5298
5323
|
|
|
5299
5324
|
// src/DefaultVoiceStateHandler.ts
|
|
5300
5325
|
var import_discord4 = require("discord.js");
|
|
5326
|
+
function handleEmptyChannel(player, queue, guildId) {
|
|
5327
|
+
const timeout = setTimeout(() => {
|
|
5328
|
+
if (!Util.isVoiceEmpty(queue.channel) || !player.nodes.has(queue.guild.id)) return;
|
|
5329
|
+
if (queue.options.leaveOnEmpty) queue.delete();
|
|
5330
|
+
player.events.emit(GuildQueueEvent.EmptyChannel, queue);
|
|
5331
|
+
}, queue.options.leaveOnEmptyCooldown || 0).unref();
|
|
5332
|
+
queue.timeouts.set(`empty_${guildId}`, timeout);
|
|
5333
|
+
}
|
|
5334
|
+
__name(handleEmptyChannel, "handleEmptyChannel");
|
|
5335
|
+
function handleChannelPopulate(player, queue, guildId) {
|
|
5336
|
+
const emptyTimeout = queue.timeouts.get(`empty_${guildId}`);
|
|
5337
|
+
if (!Util.isVoiceEmpty(queue.channel) && emptyTimeout) {
|
|
5338
|
+
clearTimeout(emptyTimeout);
|
|
5339
|
+
queue.timeouts.delete(`empty_${guildId}`);
|
|
5340
|
+
player.events.emit(GuildQueueEvent.ChannelPopulate, queue);
|
|
5341
|
+
}
|
|
5342
|
+
}
|
|
5343
|
+
__name(handleChannelPopulate, "handleChannelPopulate");
|
|
5344
|
+
function handlePauseOnEmpty(queue) {
|
|
5345
|
+
const isEmpty = Util.isVoiceEmpty(queue.channel);
|
|
5346
|
+
const wasPausedOnEmpty = Reflect.get(queue, "__pausedOnEmpty");
|
|
5347
|
+
if (isEmpty && !wasPausedOnEmpty) {
|
|
5348
|
+
queue.node.setPaused(true);
|
|
5349
|
+
Reflect.set(queue, "__pausedOnEmpty", true);
|
|
5350
|
+
if (queue.hasDebugger) {
|
|
5351
|
+
queue.debug("Voice channel is empty and options#pauseOnEmpty is true, pausing...");
|
|
5352
|
+
}
|
|
5353
|
+
} else if (!isEmpty && wasPausedOnEmpty) {
|
|
5354
|
+
queue.node.setPaused(false);
|
|
5355
|
+
Reflect.set(queue, "__pausedOnEmpty", false);
|
|
5356
|
+
if (queue.hasDebugger) {
|
|
5357
|
+
queue.debug("Voice channel is not empty and options#pauseOnEmpty is true, resuming...");
|
|
5358
|
+
}
|
|
5359
|
+
}
|
|
5360
|
+
}
|
|
5361
|
+
__name(handlePauseOnEmpty, "handlePauseOnEmpty");
|
|
5362
|
+
function handleBotVoiceStateUpdate(queue, oldState, newState) {
|
|
5363
|
+
if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {
|
|
5364
|
+
queue.node.setPaused(newState.serverMute);
|
|
5365
|
+
return;
|
|
5366
|
+
}
|
|
5367
|
+
if (newState.channel?.type === import_discord4.ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {
|
|
5368
|
+
queue.node.setPaused(newState.suppress);
|
|
5369
|
+
if (newState.suppress) {
|
|
5370
|
+
newState.guild.members.me?.voice.setRequestToSpeak(true).catch(Util.noop);
|
|
5371
|
+
}
|
|
5372
|
+
}
|
|
5373
|
+
}
|
|
5374
|
+
__name(handleBotVoiceStateUpdate, "handleBotVoiceStateUpdate");
|
|
5301
5375
|
async function defaultVoiceStateHandler(player, queue, oldState, newState) {
|
|
5302
|
-
if (!queue
|
|
5303
|
-
|
|
5376
|
+
if (!queue?.connection || !queue.channel) return;
|
|
5377
|
+
const isBotState = newState.member?.id === newState.guild.members.me?.id;
|
|
5378
|
+
const guildId = oldState.guild.id;
|
|
5379
|
+
if (isBotState && oldState.channelId && !newState.channelId) {
|
|
5304
5380
|
try {
|
|
5305
5381
|
queue.delete();
|
|
5306
5382
|
} catch {
|
|
@@ -5308,91 +5384,21 @@ async function defaultVoiceStateHandler(player, queue, oldState, newState) {
|
|
|
5308
5384
|
return void player.events.emit(GuildQueueEvent.Disconnect, queue);
|
|
5309
5385
|
}
|
|
5310
5386
|
if (queue.options.pauseOnEmpty) {
|
|
5311
|
-
|
|
5312
|
-
if (isEmpty) {
|
|
5313
|
-
queue.node.setPaused(true);
|
|
5314
|
-
Reflect.set(queue, "__pausedOnEmpty", true);
|
|
5315
|
-
if (queue.hasDebugger) {
|
|
5316
|
-
queue.debug("Voice channel is empty and options#pauseOnEmpty is true, pausing...");
|
|
5317
|
-
}
|
|
5318
|
-
} else {
|
|
5319
|
-
if (Reflect.get(queue, "__pausedOnEmpty")) {
|
|
5320
|
-
queue.node.setPaused(false);
|
|
5321
|
-
Reflect.set(queue, "__pausedOnEmpty", false);
|
|
5322
|
-
if (queue.hasDebugger) {
|
|
5323
|
-
queue.debug("Voice channel is not empty and options#pauseOnEmpty is true, resuming...");
|
|
5324
|
-
}
|
|
5325
|
-
}
|
|
5326
|
-
}
|
|
5387
|
+
handlePauseOnEmpty(queue);
|
|
5327
5388
|
}
|
|
5328
|
-
if (
|
|
5329
|
-
if (
|
|
5330
|
-
|
|
5331
|
-
} else if (newState.channel?.type === import_discord4.ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {
|
|
5332
|
-
queue.node.setPaused(newState.suppress);
|
|
5333
|
-
if (newState.suppress) {
|
|
5334
|
-
newState.guild.members.me?.voice.setRequestToSpeak(true).catch(Util.noop);
|
|
5335
|
-
}
|
|
5336
|
-
}
|
|
5389
|
+
if (isBotState && newState.channelId && (!oldState.channelId || oldState.channelId !== newState.channelId)) {
|
|
5390
|
+
if (queue.connection) queue.channel = newState.channel;
|
|
5391
|
+
handleBotVoiceStateUpdate(queue, oldState, newState);
|
|
5337
5392
|
}
|
|
5338
5393
|
if (!newState.channelId && oldState.channelId === queue.channel.id) {
|
|
5339
5394
|
if (!Util.isVoiceEmpty(queue.channel)) return;
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
}
|
|
5348
|
-
if (newState.channelId && newState.channelId === queue.channel.id) {
|
|
5349
|
-
const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
|
|
5350
|
-
const channelEmpty = Util.isVoiceEmpty(queue.channel);
|
|
5351
|
-
if (!channelEmpty && emptyTimeout) {
|
|
5352
|
-
clearTimeout(emptyTimeout);
|
|
5353
|
-
queue.timeouts.delete(`empty_${oldState.guild.id}`);
|
|
5354
|
-
player.events.emit(GuildQueueEvent.ChannelPopulate, queue);
|
|
5355
|
-
}
|
|
5356
|
-
}
|
|
5357
|
-
if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {
|
|
5358
|
-
if (newState.member?.id === newState.guild.members.me?.id) {
|
|
5359
|
-
if (queue.connection && newState.member?.id === newState.guild.members.me?.id) queue.channel = newState.channel;
|
|
5360
|
-
const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
|
|
5361
|
-
const channelEmpty = Util.isVoiceEmpty(queue.channel);
|
|
5362
|
-
if (!channelEmpty && emptyTimeout) {
|
|
5363
|
-
clearTimeout(emptyTimeout);
|
|
5364
|
-
queue.timeouts.delete(`empty_${oldState.guild.id}`);
|
|
5365
|
-
player.events.emit(GuildQueueEvent.ChannelPopulate, queue);
|
|
5366
|
-
} else {
|
|
5367
|
-
const timeout = setTimeout(() => {
|
|
5368
|
-
if (queue.connection && !Util.isVoiceEmpty(queue.channel)) return;
|
|
5369
|
-
if (!player.nodes.has(queue.guild.id)) return;
|
|
5370
|
-
if (queue.options.leaveOnEmpty) queue.delete();
|
|
5371
|
-
player.events.emit(GuildQueueEvent.EmptyChannel, queue);
|
|
5372
|
-
}, queue.options.leaveOnEmptyCooldown || 0).unref();
|
|
5373
|
-
queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
|
|
5374
|
-
}
|
|
5375
|
-
} else {
|
|
5376
|
-
if (newState.channelId !== queue.channel.id) {
|
|
5377
|
-
const channelEmpty = Util.isVoiceEmpty(queue.channel);
|
|
5378
|
-
if (!channelEmpty) return;
|
|
5379
|
-
if (queue.timeouts.has(`empty_${oldState.guild.id}`)) return;
|
|
5380
|
-
const timeout = setTimeout(() => {
|
|
5381
|
-
if (!Util.isVoiceEmpty(queue.channel)) return;
|
|
5382
|
-
if (!player.nodes.has(queue.guild.id)) return;
|
|
5383
|
-
if (queue.options.leaveOnEmpty) queue.delete();
|
|
5384
|
-
player.events.emit(GuildQueueEvent.EmptyChannel, queue);
|
|
5385
|
-
}, queue.options.leaveOnEmptyCooldown || 0).unref();
|
|
5386
|
-
queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);
|
|
5387
|
-
} else {
|
|
5388
|
-
const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
|
|
5389
|
-
const channelEmpty = Util.isVoiceEmpty(queue.channel);
|
|
5390
|
-
if (!channelEmpty && emptyTimeout) {
|
|
5391
|
-
clearTimeout(emptyTimeout);
|
|
5392
|
-
queue.timeouts.delete(`empty_${oldState.guild.id}`);
|
|
5393
|
-
player.events.emit(GuildQueueEvent.ChannelPopulate, queue);
|
|
5394
|
-
}
|
|
5395
|
-
}
|
|
5395
|
+
handleEmptyChannel(player, queue, guildId);
|
|
5396
|
+
} else if (newState.channelId === queue.channel.id) {
|
|
5397
|
+
handleChannelPopulate(player, queue, guildId);
|
|
5398
|
+
} else if (oldState.channelId !== newState.channelId) {
|
|
5399
|
+
if (newState.channelId !== queue.channel.id && !Util.isVoiceEmpty(queue.channel)) return;
|
|
5400
|
+
if (!queue.timeouts.has(`empty_${guildId}`)) {
|
|
5401
|
+
handleEmptyChannel(player, queue, guildId);
|
|
5396
5402
|
}
|
|
5397
5403
|
}
|
|
5398
5404
|
}
|
|
@@ -5401,6 +5407,14 @@ __name(defaultVoiceStateHandler, "defaultVoiceStateHandler");
|
|
|
5401
5407
|
// src/utils/DependencyReportGenerator.ts
|
|
5402
5408
|
var import_node_path = require("path");
|
|
5403
5409
|
var import_ffmpeg2 = require("@discord-player/ffmpeg");
|
|
5410
|
+
|
|
5411
|
+
// src/version.ts
|
|
5412
|
+
var version = (
|
|
5413
|
+
/* @__MACRO__ getVersion */
|
|
5414
|
+
"7.0.0"
|
|
5415
|
+
);
|
|
5416
|
+
|
|
5417
|
+
// src/utils/DependencyReportGenerator.ts
|
|
5404
5418
|
var DependencyReportGenerator = {
|
|
5405
5419
|
/**
|
|
5406
5420
|
* Finds the package.json file of a package.
|
|
@@ -5411,10 +5425,10 @@ var DependencyReportGenerator = {
|
|
|
5411
5425
|
*/
|
|
5412
5426
|
findPackageJSON(dir, packageName, depth) {
|
|
5413
5427
|
if (depth === 0) return null;
|
|
5414
|
-
const
|
|
5428
|
+
const target = (0, import_node_path.resolve)(dir, "package.json");
|
|
5415
5429
|
const next = /* @__PURE__ */ __name(() => DependencyReportGenerator.findPackageJSON((0, import_node_path.resolve)(dir, ".."), packageName, depth - 1), "next");
|
|
5416
5430
|
try {
|
|
5417
|
-
const pkgJSON = require(
|
|
5431
|
+
const pkgJSON = require(target);
|
|
5418
5432
|
if (pkgJSON.name !== packageName) {
|
|
5419
5433
|
return next();
|
|
5420
5434
|
}
|
|
@@ -5432,7 +5446,7 @@ var DependencyReportGenerator = {
|
|
|
5432
5446
|
version(name, maxLookupDepth = 3) {
|
|
5433
5447
|
try {
|
|
5434
5448
|
if (name === "discord-player") {
|
|
5435
|
-
return
|
|
5449
|
+
return version;
|
|
5436
5450
|
}
|
|
5437
5451
|
const pkg = DependencyReportGenerator.findPackageJSON((0, import_node_path.dirname)(require.resolve(name)), name, maxLookupDepth);
|
|
5438
5452
|
return pkg?.version ?? null;
|
|
@@ -5507,6 +5521,14 @@ var DependencyReportGenerator = {
|
|
|
5507
5521
|
};
|
|
5508
5522
|
|
|
5509
5523
|
// src/Player.ts
|
|
5524
|
+
var PlayerEvent = {
|
|
5525
|
+
debug: "debug",
|
|
5526
|
+
Debug: "debug",
|
|
5527
|
+
error: "error",
|
|
5528
|
+
Error: "error",
|
|
5529
|
+
voiceStateUpdate: "voiceStateUpdate",
|
|
5530
|
+
VoiceStateUpdate: "voiceStateUpdate"
|
|
5531
|
+
};
|
|
5510
5532
|
var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval, _onVoiceStateUpdate, _hooksCtx;
|
|
5511
5533
|
var _Player = class _Player extends PlayerEventsEmitter {
|
|
5512
5534
|
/**
|
|
@@ -5587,7 +5609,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
5587
5609
|
connectionTimeout: 2e4,
|
|
5588
5610
|
lagMonitor: 3e4,
|
|
5589
5611
|
queryCache: options.queryCache === null ? null : options.queryCache || new QueryCache(this),
|
|
5590
|
-
useLegacyFFmpeg: false,
|
|
5591
5612
|
skipFFmpeg: true,
|
|
5592
5613
|
probeTimeout: 5e3,
|
|
5593
5614
|
overrideFallbackContext: true,
|
|
@@ -5640,8 +5661,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
5640
5661
|
* Override default voice state update handler
|
|
5641
5662
|
* @param handler The handler callback
|
|
5642
5663
|
*/
|
|
5643
|
-
onVoiceStateUpdate(
|
|
5644
|
-
__privateSet(this, _onVoiceStateUpdate,
|
|
5664
|
+
onVoiceStateUpdate(handler) {
|
|
5665
|
+
__privateSet(this, _onVoiceStateUpdate, handler);
|
|
5645
5666
|
}
|
|
5646
5667
|
debug(m) {
|
|
5647
5668
|
return this.emit("debug", m);
|
|
@@ -5788,17 +5809,11 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
5788
5809
|
async play(channel, query, options = {}) {
|
|
5789
5810
|
const vc = this.client.channels.resolve(channel);
|
|
5790
5811
|
if (!vc?.isVoiceBased())
|
|
5791
|
-
throw
|
|
5792
|
-
"channel",
|
|
5793
|
-
"VoiceBasedChannel",
|
|
5794
|
-
!vc ? "undefined" : `channel type ${vc.type}`
|
|
5795
|
-
);
|
|
5812
|
+
throw new InvalidArgTypeError("channel", "VoiceBasedChannel", !vc ? "undefined" : `channel type ${vc.type}`);
|
|
5796
5813
|
const originalResult = query instanceof SearchResult ? query : await this.search(query, options);
|
|
5797
5814
|
const result = await options.afterSearch?.(originalResult) || originalResult;
|
|
5798
5815
|
if (result.isEmpty()) {
|
|
5799
|
-
throw
|
|
5800
|
-
`No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`
|
|
5801
|
-
);
|
|
5816
|
+
throw new NoResultError(`No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`);
|
|
5802
5817
|
}
|
|
5803
5818
|
const queue = this.nodes.create(vc.guild, options.nodeOptions);
|
|
5804
5819
|
if (this.hasDebugger) this.debug(`[AsyncQueue] Acquiring an entry...`);
|
|
@@ -5840,6 +5855,9 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
5840
5855
|
*/
|
|
5841
5856
|
async search(searchQuery, options = {}) {
|
|
5842
5857
|
if (searchQuery instanceof SearchResult) return searchQuery;
|
|
5858
|
+
if (searchQuery instanceof import_discord_voip5.AudioResource) {
|
|
5859
|
+
searchQuery = this.createTrackFromAudioResource(searchQuery);
|
|
5860
|
+
}
|
|
5843
5861
|
if (options.requestedBy != null) options.requestedBy = this.client.users.resolve(options.requestedBy);
|
|
5844
5862
|
options.blockExtractors ?? (options.blockExtractors = this.options.blockExtractors);
|
|
5845
5863
|
options.fallbackSearchEngine ?? (options.fallbackSearchEngine = QueryType.AUTO_SEARCH);
|
|
@@ -6022,7 +6040,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
6022
6040
|
`- discord.js: ${import_discord5.version}`,
|
|
6023
6041
|
`- Node version: ${process.version} (Detected Runtime: ${runtime}, Platform: ${process.platform} [${process.arch}])`,
|
|
6024
6042
|
(() => {
|
|
6025
|
-
if (this.options.useLegacyFFmpeg) return "- ffmpeg: N/A (using legacy ffmpeg)";
|
|
6026
6043
|
const info = import_ffmpeg3.FFmpeg.resolveSafe();
|
|
6027
6044
|
if (!info) return "FFmpeg/Avconv not found";
|
|
6028
6045
|
return [
|
|
@@ -6053,6 +6070,37 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
6053
6070
|
createPlaylist(data) {
|
|
6054
6071
|
return new Playlist(this, data);
|
|
6055
6072
|
}
|
|
6073
|
+
/**
|
|
6074
|
+
* Creates a track from an audio resource.
|
|
6075
|
+
* @param resource The audio resource
|
|
6076
|
+
*/
|
|
6077
|
+
createTrackFromAudioResource(resource) {
|
|
6078
|
+
const metadata = resource.metadata;
|
|
6079
|
+
const ref = import_discord5.SnowflakeUtil.generate().toString();
|
|
6080
|
+
const maybeTitle = "title" in metadata ? `${metadata.title}` : `Track ${ref}`;
|
|
6081
|
+
const maybeAuthor = "author" in metadata ? `${metadata.author}` : "Unknown author";
|
|
6082
|
+
const maybeDuration = "duration" in metadata ? `${metadata.duration}` : "00:00";
|
|
6083
|
+
const maybeThumbnail = "thumbnail" in metadata ? `${metadata.thumbnail}` : void 0;
|
|
6084
|
+
const maybeURL = "url" in metadata ? `${metadata.url}` : `discord-player://blob/${ref}`;
|
|
6085
|
+
const maybeDescription = "description" in metadata ? `${metadata.description}` : "No description available.";
|
|
6086
|
+
const maybeViews = "views" in metadata ? Number(metadata.views) || 0 : 0;
|
|
6087
|
+
const track = new Track(this, {
|
|
6088
|
+
title: maybeTitle,
|
|
6089
|
+
author: maybeAuthor,
|
|
6090
|
+
duration: maybeDuration,
|
|
6091
|
+
thumbnail: maybeThumbnail,
|
|
6092
|
+
url: maybeURL,
|
|
6093
|
+
description: maybeDescription,
|
|
6094
|
+
queryType: QueryType.DISCORD_PLAYER_BLOB,
|
|
6095
|
+
source: "arbitrary",
|
|
6096
|
+
metadata,
|
|
6097
|
+
live: false,
|
|
6098
|
+
views: maybeViews
|
|
6099
|
+
});
|
|
6100
|
+
resource.metadata = track;
|
|
6101
|
+
track.setResource(resource);
|
|
6102
|
+
return track;
|
|
6103
|
+
}
|
|
6056
6104
|
};
|
|
6057
6105
|
_lastLatency = new WeakMap();
|
|
6058
6106
|
_voiceStateUpdateListener = new WeakMap();
|
|
@@ -6064,13 +6112,12 @@ __name(_Player, "Player");
|
|
|
6064
6112
|
/**
|
|
6065
6113
|
* The version of discord-player
|
|
6066
6114
|
*/
|
|
6067
|
-
__publicField(_Player, "version",
|
|
6115
|
+
__publicField(_Player, "version", version);
|
|
6068
6116
|
var Player = _Player;
|
|
6069
6117
|
|
|
6070
6118
|
// src/index.ts
|
|
6071
6119
|
var import_equalizer3 = require("@discord-player/equalizer");
|
|
6072
6120
|
var import_discord_voip6 = require("discord-voip");
|
|
6073
|
-
var version = "7.0.0-dev.5";
|
|
6074
6121
|
// Annotate the CommonJS export names for ESM import in node:
|
|
6075
6122
|
0 && (module.exports = {
|
|
6076
6123
|
AF_NIGHTCORE_RATE,
|
|
@@ -6148,4 +6195,4 @@ var version = "7.0.0-dev.5";
|
|
|
6148
6195
|
version,
|
|
6149
6196
|
...require("@discord-player/ffmpeg")
|
|
6150
6197
|
});
|
|
6151
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy91dGlscy9UeXBlVXRpbC50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy90eXBlcy90eXBlcy50cyIsICIuLi9zcmMvZmFicmljL1NlYXJjaFJlc3VsdC50cyIsICIuLi9zcmMvdXRpbHMvQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5UmVzb2x2ZXIudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHsgY3JlYXRlRXJpc0NvbXBhdCwgaXNFcmlzUHJveHkgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2ZhYnJpYyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NlcmRlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvcic7XG5leHBvcnQge1xuICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgdHlwZSBQQ01GaWx0ZXJzLFxuICBRX0JVVFRFUldPUlRILFxuICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgQkFTU19FUV9CQU5EUyxcbiAgQUZfTklHSFRDT1JFX1JBVEUsXG4gIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICBGaWx0ZXJzQ2hhaW4sXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMsXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuZXhwb3J0IGNvbnN0IHZlcnNpb246IHN0cmluZyA9ICc3LjAuMC1kZXYuNSc7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gQHRzLW5vY2hlY2tcblxuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEdhdGV3YXlEaXNwYXRjaEV2ZW50cyB9IGZyb20gJ2Rpc2NvcmQtYXBpLXR5cGVzL3YxMCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUsXG59IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgRXJpcyBmcm9tICdlcmlzJztcblxudHlwZSBFcmlzVXNlclJlc29sdmFibGUgPSBFcmlzLlVzZXIgfCBzdHJpbmcgfCBFcmlzLk1lbWJlcjtcbnR5cGUgRXJpc0d1aWxkUmVzb2x2YWJsZSA9IEVyaXMuR3VpbGQgfCBzdHJpbmcgfCBFcmlzLk1lbWJlciB8IEVyaXMuR3VpbGRDaGFubmVsIHwgRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGllbnRQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGF0TmFtZShjbGllbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID8/IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNQcm94eShjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBFcmlzLkNsaWVudCB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID09PSAnRXJpcyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNDbGllbnQoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnZXJpcycpO1xuXG4gIGlmIChlcnJvcikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gIHJldHVybiBjbGllbnQgaW5zdGFuY2VvZiBlcmlzLkNsaWVudDtcbn1cblxuZnVuY3Rpb24gZGVjbGFyZVByb3BlcnR5KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eTxUPih0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiBUIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbn1cblxuLyoqXG4gKiBBbGxvd3MgRXJpcyBjbGllbnRzIHRvIGJlIHVzZWQgd2l0aCBkaXNjb3JkLXBsYXllci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIGNyZWF0ZXMgYSBwcm94eSBvYmplY3QgdGhhdCBpbnRlcmNlcHRzIGNlcnRhaW4gbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBkaXNjb3JkLXBsYXllci5cbiAqIEBwYXJhbSBjbGllbnQgVGhlIEVyaXMgY2xpZW50IHRvIGJlIHVzZWQuXG4gKiBAcmV0dXJucyBUaGUgRXJpcyBjbGllbnQgd2l0aCBkaXNjb3JkLXBsYXllciBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXJpc0NvbXBhdChjbGllbnQ6IEVyaXMuQ2xpZW50KTogQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuXG4gIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50KTtcblxuICBjb25zdCBlcmlzUHJveHkgPSBuZXcgUHJveHkoY2xpZW50LCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ3VzZXJzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1VzZXJzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnZ3VpbGRzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc0d1aWxkc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2NoYW5uZWxzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc0NoYW5uZWxzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5JzpcbiAgICAgICAgICByZXR1cm4gKGhhbmRsZXI6IChhLCBiKSA9PiB2b2lkKSA9PiBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIFJlZmxlY3Quc2V0KGVyaXNQcm94eSwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgJ0VyaXMnKTtcblxuICByZXR1cm4gZXJpc1Byb3h5IGFzIHVua25vd24gYXMgQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIHByb3h5OiBFcmlzLkNsaWVudCwgaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpIHtcbiAgY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG1lbWJlciwgb2xkU3RhdGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJveGllZE9sZFN0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG9sZFN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogb2xkU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG9sZFN0YXRlLnN1cHByZXNzLFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS5ndWlsZC5pZCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWQsXG4gICAgICAgIH0sXG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIGNvbnN0IG1lID0gbWVtYmVyLmd1aWxkLm1lbWJlcnMuZ2V0KGNsaWVudC51c2VyLmlkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2hhbm5lbCA9IG1lbWJlci5ndWlsZC5jaGFubmVscy5nZXQobWVtYmVyLnZvaWNlU3RhdGUuY2hhbm5lbElEKTtcblxuICAgICAgY29uc3QgcHJveGllZE5ld1N0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogbWVtYmVyLnZvaWNlU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG1lbWJlci52b2ljZVN0YXRlLnN1cHByZXNzLFxuICAgICAgICBjaGFubmVsOiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2ZWRDaGFubmVsLCBjbGllbnQpLFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmlkLFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyKHByb3hpZWROZXdTdGF0ZSwgcHJveGllZE9sZFN0YXRlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIG5vb3AgKi9cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncmF3V1MnLCAocGFja2V0KSA9PiB7XG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTZXJ2ZXJVcGRhdGU6IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YTtcbiAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlOiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICBpZiAocGF5bG9hZC5ndWlsZF9pZCAmJiBwYXlsb2FkLnNlc3Npb25faWQgJiYgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZCkge1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVN0YXRlVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc0NoYW5uZWxzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgY2xpZW50LFxuICAgIGdldCBjYWNoZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdldChpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRDaGFubmVsKGlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gaWQgaW4gY2xpZW50LmNoYW5uZWxHdWlsZE1hcDtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IEVyaXNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgRXJpcy5HdWlsZENoYW5uZWwsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEVyaXNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG4gIGNoYW5uZWw6IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuICBjbGllbnQ6IEVyaXMuQ2xpZW50LFxuKTogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBFcmlzLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fCB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VBZGFwdGVyUHJveHkoZ3VpbGQ6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQsIGNsaWVudDogRXJpcy5DbGllbnQpOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFndWlsZCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoZ3VpbGQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ3ZvaWNlQWRhcHRlckNyZWF0b3InKSB7XG4gICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcih0YXJnZXQsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKGd1aWxkOiBFcmlzLkd1aWxkLCBjbGllbnQ6IEVyaXMuQ2xpZW50KTogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gIHJldHVybiAobWV0aG9kcykgPT4ge1xuICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgIGlmICghYWRhcHRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+KCk7XG4gICAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRQYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBndWlsZC5zaGFyZC5zZW5kV1MocGF5bG9hZC5vcCwgcGF5bG9hZC5kKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgYWRhcHRlcnMuZGVsZXRlKGd1aWxkLmlkKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlciB8fFxuICAgICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQgfHxcbiAgICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuUm9sZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNVc2Vyc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC51c2Vycywge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBmdW5jdGlvbiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLnVzZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNVc2VyUmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gdXNlcj8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFRpbWVEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQsXG59IGZyb20gJ0B3ZWItc2Nyb2JibGVyL21ldGFkYXRhLWZpbHRlcic7XG5pbXBvcnQgeyBUcmFja1NvdXJjZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lIHtcbiAgbmFtZTogUnVudGltZVR5cGU7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuY2xhc3MgVXRpbCB7XG4gIC8qKlxuICAgKiBVdGlsc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJ1bnRpbWUgaW5mb3JtYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRSdW50aW1lKCk6IFJ1bnRpbWUge1xuICAgIGNvbnN0IHZlcnNpb24gPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgRGVuby52ZXJzaW9uKSByZXR1cm4geyBuYW1lOiAnZGVubycsIHZlcnNpb246IERlbm8udmVyc2lvbi5kZW5vIH07XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBCdW4gIT09ICd1bmRlZmluZWQnICYmIEJ1bi52ZXJzaW9uKSByZXR1cm4geyBuYW1lOiAnYnVuJywgdmVyc2lvbjogQnVuLnZlcnNpb24gfTtcblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9uKSByZXR1cm4geyBuYW1lOiAnbm9kZScsIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbiB9O1xuXG4gICAgcmV0dXJuIHsgbmFtZTogJ3Vua25vd24nLCB2ZXJzaW9uOiB2ZXJzaW9uID8/ICd1bmtub3duJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZHVyYXRpb24gc3RyaW5nXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkdXJPYmogVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGR1cmF0aW9uU3RyaW5nKGR1ck9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGR1ck9iailcbiAgICAgIC5tYXAoKG0pID0+IChpc05hTihtKSA/IDAgOiBtKSlcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG1pbGxpc2Vjb25kcyB0byBjb25zdW1hYmxlIHRpbWUgb2JqZWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgVGhlIHRpbWUgaW4gbXNcbiAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlTVMobWlsbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICBpZiAoaXNOYU4obWlsbGlzZWNvbmRzKSkgbWlsbGlzZWNvbmRzID0gMDtcbiAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRheXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDg2NDAwMDAwKSxcbiAgICAgIGhvdXJzOiByb3VuZChtaWxsaXNlY29uZHMgLyAzNjAwMDAwKSAlIDI0LFxuICAgICAgbWludXRlczogcm91bmQobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICBzZWNvbmRzOiByb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKSAlIDYwLFxuICAgIH0gYXMgVGltZURhdGE7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRpbWUgY29kZVxuICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICBjb25zdCBpdGVtcyA9IE9iamVjdC5rZXlzKGR1cmF0aW9uKTtcbiAgICBjb25zdCByZXF1aXJlZCA9IFsnZGF5cycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgIGNvbnN0IGZpbmFsID0gcGFyc2VkXG4gICAgICAuc2xpY2UocGFyc2VkLmZpbmRJbmRleCgoeCkgPT4geCAhPT0gMCkpXG4gICAgICAubWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSlcbiAgICAgIC5qb2luKCc6Jyk7XG5cbiAgICByZXR1cm4gZmluYWwubGVuZ3RoIDw9IDMgPyBgMDoke2ZpbmFsLnBhZFN0YXJ0KDIsICcwJykgfHwgMH1gIDogZmluYWw7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBkdXJhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkVGltZUNvZGUodGhpcy5wYXJzZU1TKGR1cmF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogUGlja3MgbGFzdCBpdGVtIG9mIHRoZSBnaXZlbiBhcnJheVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgVGhlIGFycmF5XG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xuICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWb2ljZUVtcHR5KGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCkge1xuICAgIHJldHVybiBjaGFubmVsICYmIGNoYW5uZWwubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4gIW1lbWJlci51c2VyLmJvdCkuc2l6ZSA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdGhlIHRyYWNrIHRpdGxlXG4gICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGVcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlXG4gICAqIEByZXR1cm5zIENsZWFuZWQgdGl0bGVcbiAgICovXG4gIHN0YXRpYyBjbGVhblRpdGxlKHRpdGxlOiBzdHJpbmcsIHNvdXJjZTogVHJhY2tTb3VyY2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsdGVyT3B0cyA9IHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRyYWNrOiBbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbWFzdGVyZWQsXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpdmUsXG4gICAgICAgICAgICAgICAgICAgIGZpeFRyYWNrU3VmZml4LFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVaZXJvV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VOYnNwLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlU21hcnRRdW90ZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsZWFuRXhwbGljaXRcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNwb3RpZnlGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG4gICAgICBzcG90aWZ5RmlsdGVyLmV4dGVuZChjcmVhdGVTcG90aWZ5RmlsdGVyKCkpO1xuICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcblxuICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSAneW91dHViZSc6XG4gICAgICAgICAgcmV0dXJuIHlvdXR1YmUodGl0bGUpO1xuICAgICAgICBjYXNlICdzcG90aWZ5JzpcbiAgICAgICAgICByZXR1cm4gc3BvdGlmeUZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlciByZXF1aXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBOb2RlIHJlcXVpcmUgaWRcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHN0YXRpYyByZXF1aXJlKGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiByZXF1aXJlKGlkKSwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBpbXBvcnQoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgaW4gbXMgdG8gd2FpdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIHN0YXRpYyB3YWl0KHRpbWU6IG51bWJlcikge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KHRpbWUsIHVuZGVmaW5lZCwgeyByZWY6IGZhbHNlIH0pO1xuICB9XG5cbiAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBhc3luYyBnZXRGZXRjaCgpIHtcbiAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBbJ25vZGUtZmV0Y2gnLCAndW5kaWNpJ10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgY29uc3QgcmVzID0gcmVxdWlyZShsaWIpO1xuICAgICAgICAgIGlmIChyZXMpIHJldHVybiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBubz9cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHtcbiAgICAgIGNvZGUsXG4gICAgICBkZXRhaWwsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmFuZG9tQ2hvaWNlPFQ+KHNyYzogVFtdKTogVCB7XG4gICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICB9XG5cbiAgc3RhdGljIGFycmF5Q2xvbmVTaHVmZmxlPFQ+KHNyYzogVFtdKTogVFtdIHtcbiAgICBjb25zdCBhcnIgPSBzcmMuc2xpY2UoKTtcblxuICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChtKSB7XG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbS0tKTtcbiAgICAgIFthcnJbbV0sIGFycltpXV0gPSBbYXJyW2ldLCBhcnJbbV1dO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1FVRVVFX0NBUCA9IChxdWV1ZTogR3VpbGRRdWV1ZSwgaXRlbXM6IFBsYXlsaXN0IHwgVHJhY2sgfCBUcmFja1tdKSA9PiB7XG4gIGNvbnN0IHRyYWNrcyA9IGl0ZW1zIGluc3RhbmNlb2YgUGxheWxpc3QgPyBpdGVtcy50cmFja3MgOiBBcnJheS5pc0FycmF5KGl0ZW1zKSA/IGl0ZW1zIDogW2l0ZW1zXTtcblxuICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICBjb25zdCBtYXhDYXAgPSBxdWV1ZS5nZXRDYXBhY2l0eSgpO1xuXG4gIGlmIChtYXhDYXAgPCB0cmFja3MubGVuZ3RoKSB7XG4gICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1NQQUNFKCd0cmFja3MgcXVldWUnLCBtYXhDYXAsIHRyYWNrcy5sZW5ndGgpO1xuICB9XG59O1xuXG5leHBvcnQgeyBVdGlsIH07XG4iLCAiaW1wb3J0IHsgVXNlciwgZXNjYXBlTWFya2Rvd24sIFNub3dmbGFrZVV0aWwsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgQVBJVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhLCBTZWFyY2hRdWVyeVR5cGUsIFRyYWNrSlNPTiB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgbWV0YWRhdGE6IE07XG4gIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYWNrID0gUmV0dXJuVHlwZTxUcmFja1snc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgY2xhc3MgVHJhY2s8VCA9IHVua25vd24+IHtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgYXV0aG9yOiBzdHJpbmc7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICBwdWJsaWMgZHVyYXRpb246IHN0cmluZztcbiAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gIHB1YmxpYyByZXF1ZXN0ZWRCeTogVXNlciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyByYXc6IGFueTtcbiAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgcHJpdmF0ZSBfX21ldGFkYXRhOiBUIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcbiAgcHVibGljIGNsZWFuVGl0bGU6IHN0cmluZztcbiAgcHVibGljIGxpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGJyaWRnZWRFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGJyaWRnZWRUcmFjazogVHJhY2sgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVHJhY2sgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICogQHBhcmFtIGRhdGEgVHJhY2sgZGF0YVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oe30sIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sIGRhdGEucmF3ID8/IGRhdGEpO1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICB0aGlzLl9fcmVxTWV0YWRhdGFGbiA9IGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPSBkYXRhLmNsZWFuVGl0bGUgPz8gVXRpbC5jbGVhblRpdGxlKHRoaXMudGl0bGUsIHRoaXMuc291cmNlKTtcbiAgICB0aGlzLmxpdmUgPSBkYXRhLmxpdmUgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgKi9cbiAgcHVibGljIGdldCBkdXJhdGlvbk1TKCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZXMgPSAobjogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgIGxldCB0biA9IDE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykgdG4gKj0gbjtcbiAgICAgIHJldHVybiB0IDw9IDAgPyAxMDAwIDogdG4gKiAxMDAwO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5kdXJhdGlvblxuICAgICAgLnNwbGl0KCc6JylcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5tYXAoKG0sIGkpID0+IHBhcnNlSW50KG0pICogdGltZXMoNjAsIGkpKVxuICAgICAgLnJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbCxcbiAgICB9IGFzIFRyYWNrSlNPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIHRyYWNrIGRhdGEgdGhhdCBjYW4gYmUgcmVjb25zdHJ1Y3RlZFxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiBUeXBlVXRpbC5pc1N0cmluZyh0aGlzLnRodW1ibmFpbCkgPyB0aGlzLnRodW1ibmFpbCA6IHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICB2aWV3czogdGhpcy52aWV3cyA/PyAwLFxuICAgICAgcmVxdWVzdGVkX2J5OiB0aGlzLnJlcXVlc3RlZEJ5Py50b0pTT04oKSA/PyBudWxsLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgcXVlcnlfdHlwZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyID8/IG51bGwsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICR0eXBlOiBTZXJpYWxpemVkVHlwZS5UcmFjayxcbiAgICAgICRlbmNvZGVyX3ZlcnNpb246ICc3LjAuMC1kZXYuNScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFjayBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPikge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5UcmFjaylcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2RhdGEnLCAnU2VyaWFsaXplZFRyYWNrJywgJ21hbGZvcm1lZCBkYXRhJyk7XG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2socGxheWVyLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkX2J5XG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGRhdGEucmVxdWVzdGVkX2J5IGFzIEFQSVVzZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZShyZXMuaWQpO1xuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICA6IG51bGwsXG4gICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0cmFjay5zZXRNZXRhZGF0YShkYXRhLm1ldGFkYXRhKTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYmVsb25naW5nIHF1ZXVlcyBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmlsdGVyKChub2RlKSA9PiBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKSk7XG5cbiAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gICAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4sXG4gICk6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gVHlwZVV0aWw7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdCA9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gIH1cbn1cbiIsICJjb25zdCBEaXNjb3JkUGxheWVyRXJyb3JzID0ge1xuICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgbmFtZTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGNhcGFjaXR5OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYDtcbiAgICB9LFxuICB9LFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRToge1xuICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gICAgdHlwZTogVHlwZUVycm9yLFxuICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBleHBlY3RhdGlvbjogc3RyaW5nLCBmb3VuZDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSB0byBiZSBcIiR7ZXhwZWN0YXRpb259XCIsIHJlY2VpdmVkIFwiJHtmb3VuZH1cImA7XG4gICAgfSxcbiAgfSxcbiAgRVJSX05PX1JFU1VMVDoge1xuICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gJHttZXNzYWdlfWA7XG4gICAgfSxcbiAgfSxcbiAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgIG5hbWU6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgfSxcbiAgfSxcbiAgRVJSX05PVF9FWElTVElORzoge1xuICAgIG5hbWU6ICdFUlJfTk9UX0VYSVNUSU5HJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9PVVRfT0ZfUkFOR0U6IHtcbiAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWluaW11bTogc3RyaW5nLCBtYXhpbXVtOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gJHt0YXJnZXR9IGlzIG91dCBvZiByYW5nZSAoRXhwZWN0ZWQgbWluaW11bSAke21heGltdW19IGFuZCBtYXhpbXVtICR7bWF4aW11bX0sIGdvdCAke3ZhbHVlfSlgO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArXG4gICAgICAgIChtZXNzYWdlIHx8ICdObyB2b2ljZSBjb25uZWN0aW9uIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/JylcbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiB7XG4gICAgbmFtZTogJ0VSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCcsXG4gICAgdHlwZTogRXJyb3IsXG4gICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAnQ2Fubm90IHVzZSBkZXN0cm95ZWQgdm9pY2UgY29ubmVjdGlvbic7XG4gICAgfSxcbiAgfSxcbiAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICBuYW1lOiAnRVJSX05PX1ZPSUNFX0NIQU5ORUwnLFxuICAgIHR5cGU6IEVycm9yLFxuICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICBuYW1lOiAnRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTCcsXG4gICAgdHlwZTogRXJyb3IsXG4gICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJztcbiAgICB9LFxuICB9LFxuICBFUlJfTk9fUkVDRUlWRVI6IHtcbiAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArXG4gICAgICAgIChtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9GRk1QRUdfTE9DQVRPUjoge1xuICAgIG5hbWU6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICAgIHR5cGU6IEVycm9yLFxuICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBgICsgbWVzc2FnZTtcbiAgICB9LFxuICB9LFxuICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6IHtcbiAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnKTtcbiAgICB9LFxuICB9LFxuICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICBuYW1lOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9OT19HVUlMRDoge1xuICAgIG5hbWU6ICdFUlJfTk9fR1VJTEQnLFxuICAgIHR5cGU6IEVycm9yLFxuICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gICAgfSxcbiAgfSxcbiAgRVJSX0lORk9fUkVRVUlSRUQ6IHtcbiAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgIHR5cGU6IEVycm9yLFxuICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBhY3R1YWw6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0sIGZvdW5kIFwiJHthY3R1YWx9XCJgO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgIG5hbWU6ICdFUlJfU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICAgIHR5cGU6IEVycm9yLFxuICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgcmV0dXJuIGBbJHt0aGlzLnR5cGUubmFtZX1dYCArIFwiRG9uJ3Qga25vdyBob3cgdG8gc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEOiB7XG4gICAgbmFtZTogJ0VSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgIHJldHVybiBgWyR7dGhpcy50eXBlLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIGRlc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjoge1xuICAgIG5hbWU6ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICAgIHR5cGU6IEVycm9yLFxuICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMudHlwZS5uYW1lfV1gICsgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YDtcbiAgICB9LFxuICB9LFxuICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRToge1xuICAgIG5hbWU6ICdFUlJfTk9UX0VYSVNUSU5HX01PRFVMRScsXG4gICAgdHlwZTogRXJyb3IsXG4gICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGBbJHt0aGlzLnR5cGUubmFtZX1dYCArXG4gICAgICAgIGAke3RhcmdldH0gbW9kdWxlIGRvZXMgbm90IGV4aXN0LiBJbnN0YWxsIGl0IHdpdGggXFxgbnBtIGluc3RhbGwgJHt0YXJnZXR9XFxgLiR7XG4gICAgICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIEVSUl9CUklER0VfRkFJTEVEOiB7XG4gICAgbmFtZTogJ0VSUl9CUklER0VfRkFJTEVEJyxcbiAgICB0eXBlOiBFcnJvcixcbiAgICBjcmVhdGVFcnJvcihpZDogc3RyaW5nIHwgbnVsbCwgZXJyb3I6IHN0cmluZykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYFske3RoaXMudHlwZS5uYW1lfV1gICtcbiAgICAgICAgYCR7aWQgPyBgKEV4dHJhY3RvciBFeGVjdXRpb24gQ29udGV4dCBJRCBpcyAke2lkfSlgIDogJyd9RmFpbGVkIHRvIGJyaWRnZSB0aGlzIHF1ZXJ5OlxcbiR7ZXJyb3J9YFxuICAgICAgKTtcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBGaW5hbEV4Y2VwdGlvbjxPIGV4dGVuZHMgKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc10+ID0ge1xuICBuYW1lOiBPWyduYW1lJ107XG59ICYgSW5zdGFuY2VUeXBlPE9bJ3R5cGUnXT47XG5cbnR5cGUgRGlzY29yZFBsYXllckV4Y2VwdGlvbiA9IHtcbiAgW0sgaW4ga2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdOiAoXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdWydjcmVhdGVFcnJvciddPlxuICApID0+IEZpbmFsRXhjZXB0aW9uPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS10+O1xufTtcblxuY29uc3QgdGFyZ2V0ID0ge30gYXMgRGlzY29yZFBsYXllckV4Y2VwdGlvbjtcblxuY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPHR5cGVvZiB0YXJnZXQ+ID0ge1xuICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICBjb25zdCBlcnIgPSBEaXNjb3JkUGxheWVyRXJyb3JzW3BdO1xuXG4gICAgaWYgKCFlcnIpIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcblxuICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0gKCgpID0+IHtcbiAgdHlwZSBFcnJDb2RlcyA9IHtcbiAgICAtcmVhZG9ubHkgW0sgaW4ga2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdOiAodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdWyduYW1lJ107XG4gIH07XG5cbiAgY29uc3QgZGljdCA9IHt9IGFzIEVyckNvZGVzO1xuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBEaXNjb3JkUGxheWVyRXJyb3JzKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGRpY3RbcHJvcF0gPSBwcm9wO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoZGljdCk7XG59KSgpO1xuZXhwb3J0IGNvbnN0IEV4Y2VwdGlvbnMgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIHR5cGUgU2VyaWFsaXplZFRyYWNrLCBUcmFjaywgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuZXhwb3J0IGVudW0gU2VyaWFsaXplZFR5cGUge1xuICBUcmFjayA9ICd0cmFjaycsXG4gIFBsYXlsaXN0ID0gJ3BsYXlsaXN0Jyxcbn1cblxuZXhwb3J0IHR5cGUgRW5jb2RhYmxlID0gU2VyaWFsaXplZFRyYWNrIHwgU2VyaWFsaXplZFBsYXlsaXN0O1xuXG5jb25zdCBpc1RyYWNrID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFRyYWNrID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrO1xuY29uc3QgaXNQbGF5bGlzdCA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRQbGF5bGlzdCA9PiBkYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBUcmFjayB8IFBsYXlsaXN0IHwgYW55KSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZShwbGF5ZXI6IFBsYXllciwgZGF0YTogRW5jb2RhYmxlKSB7XG4gIGlmIChpc1RyYWNrKGRhdGEpKSByZXR1cm4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcbiAgaWYgKGlzUGxheWxpc3QoZGF0YSkpIHJldHVybiBQbGF5bGlzdC5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuXG4gIHRocm93IEV4Y2VwdGlvbnMuRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiBFbmNvZGFibGUpIHtcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICBjb25zdCBzdHIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgcHVibGljIGF1dGhvcjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAvKipcbiAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyXG4gICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAqL1xuICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgKiAtIGBhbGJ1bWBcbiAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICogLSBgeW91dHViZWBcbiAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAqL1xuICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW10sXG4gICAgfTtcblxuICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICR0eXBlOiBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdCxcbiAgICAgICRlbmNvZGVyX3ZlcnNpb246ICc3LjAuMC1kZXYuNScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnZGF0YScsICdTZXJpYWxpemVkUGxheWxpc3QnLCAnbWFsZm9ybWVkIGRhdGEnKTtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHRyYWNrczogZGF0YS50cmFja3MubWFwKChtKSA9PiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIG0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gICAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICAgIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+LFxuICApOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgdHlwZSB7IEJyaWRnZVByb3ZpZGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclNlYXJjaFJlc3VsdCB7XG4gIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gIHRyYWNrczogVHJhY2tbXTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIEZGbXBlZyBmaWx0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVGaWx0ZXJzIHtcbiAgYmFzc2Jvb3N0X2xvdz86IGJvb2xlYW47XG4gIGJhc3Nib29zdD86IGJvb2xlYW47XG4gIGJhc3Nib29zdF9oaWdoPzogYm9vbGVhbjtcbiAgJzhEJz86IGJvb2xlYW47XG4gIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gIG5pZ2h0Y29yZT86IGJvb2xlYW47XG4gIHBoYXNlcj86IGJvb2xlYW47XG4gIHRyZW1vbG8/OiBib29sZWFuO1xuICB2aWJyYXRvPzogYm9vbGVhbjtcbiAgcmV2ZXJzZT86IGJvb2xlYW47XG4gIHRyZWJsZT86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXI/OiBib29sZWFuO1xuICBub3JtYWxpemVyMj86IGJvb2xlYW47XG4gIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgcHVsc2F0b3I/OiBib29sZWFuO1xuICBzdWJib29zdD86IGJvb2xlYW47XG4gIGthcmFva2U/OiBib29sZWFuO1xuICBmbGFuZ2VyPzogYm9vbGVhbjtcbiAgZ2F0ZT86IGJvb2xlYW47XG4gIGhhYXM/OiBib29sZWFuO1xuICBtY29tcGFuZD86IGJvb2xlYW47XG4gIG1vbm8/OiBib29sZWFuO1xuICBtc3Rscj86IGJvb2xlYW47XG4gIG1zdHJyPzogYm9vbGVhbjtcbiAgY29tcHJlc3Nvcj86IGJvb2xlYW47XG4gIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgc29mdGxpbWl0ZXI/OiBib29sZWFuO1xuICBjaG9ydXM/OiBib29sZWFuO1xuICBjaG9ydXMyZD86IGJvb2xlYW47XG4gIGNob3J1czNkPzogYm9vbGVhbjtcbiAgZmFkZWluPzogYm9vbGVhbjtcbiAgZGltPzogYm9vbGVhbjtcbiAgZWFycmFwZT86IGJvb2xlYW47XG4gIGxvZmk/OiBib29sZWFuO1xuICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgLyoqXG4gICAqIFRoZSB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhdXRob3JcbiAgICovXG4gIGF1dGhvcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvblxuICAgKi9cbiAgZHVyYXRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdFxuICAgKi9cbiAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2VcbiAgICovXG4gIHNvdXJjZT86IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIGVuZ2luZVxuICAgKi9cbiAgZW5naW5lPzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaXMgbGl2ZVxuICAgKi9cbiAgbGl2ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcmF3IGRhdGFcbiAgICovXG4gIHJhdz86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIC8qKlxuICAgKiBUaGUgcXVlcnkgdHlwZVxuICAgKi9cbiAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlO1xuICAvKipcbiAgICogVGhlIHNlcmFsaXNlZCB0aXRsZVxuICAgKi9cbiAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICovXG4gIHRpbWVjb2Rlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgY3JlYXRlIHByb2dyZXNzIGJhciBmb3IgdGhlIHdob2xlIHF1ZXVlXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYmFyIGxlbmd0aFxuICAgKi9cbiAgbGVmdENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAqL1xuICByaWdodENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVtYWluaW5nIHRpbWUgdHJhY2tcbiAgICovXG4gIHNlcGFyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gICAqL1xuICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kaWNhdG9yXG4gICAqL1xuICBxdWV1ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFF1ZXJ5VHlwZVxuICovXG5leHBvcnQgY29uc3QgUXVlcnlUeXBlID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFlPVVRVQkU6ICd5b3V0dWJlJyxcbiAgWU9VVFVCRV9QTEFZTElTVDogJ3lvdXR1YmVQbGF5bGlzdCcsXG4gIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICBTT1VORENMT1VEX1BMQVlMSVNUOiAnc291bmRjbG91ZFBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRDogJ3NvdW5kY2xvdWQnLFxuICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gIFNQT1RJRllfQUxCVU06ICdzcG90aWZ5QWxidW0nLFxuICBTUE9USUZZX1BMQVlMSVNUOiAnc3BvdGlmeVBsYXlsaXN0JyxcbiAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgRkFDRUJPT0s6ICdmYWNlYm9vaycsXG4gIFZJTUVPOiAndmltZW8nLFxuICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICBSRVZFUkJOQVRJT046ICdyZXZlcmJuYXRpb24nLFxuICBZT1VUVUJFX1NFQVJDSDogJ3lvdXR1YmVTZWFyY2gnLFxuICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgU09VTkRDTE9VRF9TRUFSQ0g6ICdzb3VuZGNsb3VkU2VhcmNoJyxcbiAgQVBQTEVfTVVTSUNfU09ORzogJ2FwcGxlTXVzaWNTb25nJyxcbiAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICBBUFBMRV9NVVNJQ19QTEFZTElTVDogJ2FwcGxlTXVzaWNQbGF5bGlzdCcsXG4gIEFQUExFX01VU0lDX1NFQVJDSDogJ2FwcGxlTXVzaWNTZWFyY2gnLFxuICBGSUxFOiAnZmlsZScsXG4gIEFVVE9fU0VBUkNIOiAnYXV0b1NlYXJjaCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckV2ZW50cyB7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIGVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiBhbnk7XG4gIHZvaWNlU3RhdGVVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSA9PiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBQbGF5ZXJFdmVudCA9IHtcbiAgZGVidWc6ICdkZWJ1ZycsXG4gIERlYnVnOiAnZGVidWcnLFxuICBlcnJvcjogJ2Vycm9yJyxcbiAgRXJyb3I6ICdlcnJvcicsXG4gIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsYXllckV2ZW50ID0gKHR5cGVvZiBQbGF5ZXJFdmVudClba2V5b2YgdHlwZW9mIFBsYXllckV2ZW50XTtcblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheU9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdGhpcyBwbGF5IHdhcyB0cmlnZ2VyZWQgZm9yIGZpbHRlcnMgdXBkYXRlXG4gICAqL1xuICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZGbXBlZyBhcmdzIHBhc3NlZCB0byBlbmNvZGVyXG4gICAqL1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gICAqL1xuICBzZWVrPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgaXQgc2hvdWxkIHN0YXJ0IHBsYXlpbmcgdGhlIHByb3ZpZGVkIHRyYWNrIGltbWVkaWF0ZWx5XG4gICAqL1xuICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyBzZWFyY2hcbiAgICovXG4gIHJlcXVlc3RlZEJ5PzogVXNlclJlc29sdmFibGU7XG4gIC8qKlxuICAgKiBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAgICovXG4gIHNlYXJjaEVuZ2luZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoO1xuICAvKipcbiAgICogTGlzdCBvZiB0aGUgZXh0cmFjdG9ycyB0byBibG9ja1xuICAgKi9cbiAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgaWdub3JlIHF1ZXJ5IGNhY2hlIGxvb2t1cFxuICAgKi9cbiAgaWdub3JlQ2FjaGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHJlcXVlc3RPcHRpb25zPzogYW55O1xuICAvKipcbiAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICovXG4gIGZhbGxiYWNrU2VhcmNoRW5naW5lPzogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xufVxuXG4vKipcbiAqIFRoZSBxdWV1ZSByZXBlYXQgbW9kZS4gVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBPRkZcbiAqIC0gVFJBQ0tcbiAqIC0gUVVFVUVcbiAqIC0gQVVUT1BMQVlcbiAqL1xuZXhwb3J0IGVudW0gUXVldWVSZXBlYXRNb2RlIHtcbiAgLyoqXG4gICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAqL1xuICBPRkYgPSAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0sgPSAxLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBlbnRpcmUgcXVldWUuXG4gICAqL1xuICBRVUVVRSA9IDIsXG4gIC8qKlxuICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgKi9cbiAgQVVUT1BMQVkgPSAzLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAvKipcbiAgICogVGhlIHRyYWNrcyBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICB0cmFja3M6IFRyYWNrW107XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3Qgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICAgKi9cbiAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB2aWV3c1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICovXG4gIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVySW5pdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICAgKi9cbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICovXG4gIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQcmV2ZW50IHZvaWNlIHN0YXRlIGhhbmRsZXIgZnJvbSBiZWluZyBvdmVycmlkZGVuXG4gICAqL1xuICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICAgKi9cbiAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgKi9cbiAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRdWVyeSBjYWNoZSBwcm92aWRlclxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGVQcm92aWRlcjxhbnk+IHwgbnVsbDtcbiAgLyoqXG4gICAqIFVzZSBsZWdhY3kgdmVyc2lvbiBvZiBmZm1wZWdcbiAgICovXG4gIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXQgYnJpZGdlIHByb3ZpZGVyXG4gICAqL1xuICBicmlkZ2VQcm92aWRlcj86IEJyaWRnZVByb3ZpZGVyO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgcXVlcnk6IHN0cmluZztcbiAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2ggfCBudWxsO1xuICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgcGxheWxpc3Q/OiBQbGF5bGlzdCB8IG51bGw7XG4gIHRyYWNrcz86IFRyYWNrW107XG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwcml2YXRlIF9kYXRhOiBTZWFyY2hSZXN1bHREYXRhKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRRdWVyeVR5cGUodHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2gpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UmVxdWVzdGVkQnkodXNlcjogVXNlcikge1xuICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldEV4dHJhY3RvcihleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpIHtcbiAgICB0aGlzLl9kYXRhLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3MgPSB0cmFja3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGEucXVlcnkgPSBxdWVyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICB0aGlzLl9kYXRhLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4dHJhY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5bGlzdCByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucGxheWxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIHJlc3VsdFxuICAgKi9cbiAgcHVibGljIGdldCB0cmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RlZCBieVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1ZXN0ZWRCeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWV4ZWN1dGUgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5zZWFyY2godGhpcy5xdWVyeSwge1xuICAgICAgc2VhcmNoRW5naW5lOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5ISxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGwsXG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgc29mdGxpbWl0ZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCcsXG4gICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJyxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHN0YXRpYyBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubWFwKChtKSA9PiAodGhpcyBhcyBhbnkpW21dKS5qb2luKCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZm1wZWcgYXJncyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsdGVycyBuYW1lXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiAoSyB8IHN0cmluZylbXSkge1xuICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0gYXMgSykpXG4gICAgICAuam9pbignLCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYXVkaW8gZmlsdGVyXG4gICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJzW2ZpbHRlck5hbWUgYXMgRmlsdGVyc05hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBtdWx0aXBsZSBhdWRpbyBmaWx0ZXJzXG4gICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmaW5lQnVsayhmaWx0ZXJzQXJyYXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSkge1xuICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERlZmF1bHRMaXN0ZW5lciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBMaXN0ZW5lclNpZ25hdHVyZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEwgZXh0ZW5kcyBMaXN0ZW5lclNpZ25hdHVyZTxMPiA9IERlZmF1bHRMaXN0ZW5lcj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8TD4ge1xuICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICBpZiAodGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5ldmVudE5hbWVzKCkuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICBgTm8gZXZlbnQgbGlzdGVuZXIgZm91bmQgZm9yIGV2ZW50IFwiJHtTdHJpbmcobmFtZSl9XCIuIEV2ZW50cyAke3RoaXMucmVxdWlyZWRFdmVudHNcbiAgICAgICAgICAubWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApXG4gICAgICAgICAgLmpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4uL3F1ZXVlJztcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yU3RyZWFtYWJsZSA9XG4gIHwgUmVhZGFibGVcbiAgfCBzdHJpbmdcbiAgfCB7XG4gICAgICAkZm10OiBzdHJpbmc7XG4gICAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgIH07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIG9mIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbmV3IG9wdGlvbnMgdG8gYXBwbHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdGl2YXRlKCkge1xuICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlYWN0aXZhdGUoKSB7XG4gICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHZhbGlkYXRlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2b2lkIHR5cGU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIGluZm8gVGhlIHRyYWNrIHRvIHN0cmVhbVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZT4ge1xuICAgIHZvaWQgaW5mbztcbiAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUocXVlcnk6IHN0cmluZywgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dCk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgIHZvaWQgY29udGV4dDtcbiAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyh0cmFjazogVHJhY2ssIGhpc3Rvcnk6IEd1aWxkUXVldWVIaXN0b3J5KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCB0cmFjaztcbiAgICB2b2lkIGhpc3Rvcnk7XG4gICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYCk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgKiBAcGFyYW0gbmV4dCBUaGUgbmV4dCBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGRhdGEgdG8gZGlzcGF0Y2hcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KGV2ZW50OiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPFBsYXllckV2ZW50c1tLXT4pIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAqIEBwYXJhbSBwbGF5bGlzdCBUaGUgcGxheWxpc3RcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2sgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVSZXNwb25zZShwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCwgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSk6IEV4dHJhY3RvckluZm8ge1xuICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZGVidWcobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgKi9cbiAgcHVibGljIGdldCBzdXBwb3J0c0RlbXV4KCkge1xuICAgIHJldHVybiAhIXRoaXMuY29udGV4dC5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdHJlYW0gZXh0cmFjdGlvbiBmb3IgYW5vdGhlciBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBicmlkZ2VcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJyaWRnZSh0cmFjazogVHJhY2ssIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwpOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgdm9pZCBzb3VyY2VFeHRyYWN0b3I7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IsIEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vaG9va3MnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2Vzc2lvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIGF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xuICBicmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzOiBTZXQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICovXG4gIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICovXG4gIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoWydlcnJvciddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgIGNvbnN0IHNhbXBsZSA9IGBcXHRpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xcblxcdGF3YWl0IHBsYXllci5leHRyYWN0b3JzLmxvYWRNdWx0aShEZWZhdWx0RXh0cmFjdG9ycyk7YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0KCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGV4dHJhY3RvcnMubG9hZE11bHRpIGluc3RlYWQuIEV4YW1wbGU6XFxuJHtzYW1wbGV9XFxuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBidW5kbGUgb2YgZXh0cmFjdG9ycy5cbiAgICogQGV4YW1wbGUgaW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcbiAgICpcbiAgICogYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgTyBleHRlbmRzIG9iamVjdCxcbiAgICBUIGV4dGVuZHMgKHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+KVtdLFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQ8VFtudW1iZXJdWydpZGVudGlmaWVyJ10sIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPixcbiAgPihidW5kbGU6IFQsIG9wdGlvbnM6IFIgPSB7fSBhcyBSKSB7XG4gICAgYnVuZGxlLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZWdpc3RlcihleHQsIG9wdGlvbnM/LltleHQuaWRlbnRpZmllcl0gfHwge30pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBpZiB0aGUgZ2l2ZW4gZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgdG8gZ2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzdXBwbGllZCB0byB0aGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXI8TyBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+PihcbiAgICBfZXh0cmFjdG9yOiBULFxuICAgIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddLFxuICApOiBQcm9taXNlPEluc3RhbmNlVHlwZTxUPiB8IG51bGw+IHtcbiAgICBpZiAodHlwZW9mIF9leHRyYWN0b3IuaWRlbnRpZmllciAhPT0gJ3N0cmluZycgfHwgdGhpcy5zdG9yZS5oYXMoX2V4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHRoaXMucGxheWVyLm9wdGlvbnMuYnJpZGdlUHJvdmlkZXIpIG9wdGlvbnMuYnJpZGdlUHJvdmlkZXIgPz89IHRoaXMucGxheWVyLm9wdGlvbnMuYnJpZGdlUHJvdmlkZXI7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShfZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YCk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byB1bnJlZ2lzdGVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlcjxLIGV4dGVuZHMgc3RyaW5nIHwgQmFzZUV4dHJhY3Rvcj4oX2V4dHJhY3RvcjogSykge1xuICAgIGNvbnN0IGV4dHJhY3RvciA9XG4gICAgICB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgPyB0aGlzLnN0b3JlLmdldChfZXh0cmFjdG9yKSA6IHRoaXMuc3RvcmUuZmluZCgocikgPT4gciA9PT0gX2V4dHJhY3Rvcik7XG4gICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXkgPSBleHRyYWN0b3IuaWRlbnRpZmllciB8fCB0aGlzLnN0b3JlLmZpbmRLZXkoKGUpID0+IGUgPT09IGV4dHJhY3RvcikhO1xuICAgICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlckFsbCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5zdG9yZS5tYXAoKGUpID0+IHRoaXMudW5yZWdpc3RlcihlKSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICBpZiAoIXRoaXMuc3RvcmUuc2l6ZSkge1xuICAgICAgVXRpbC53YXJuKCdTa2lwcGluZyBleHRyYWN0b3JzIGV4ZWN1dGlvbiBzaW5jZSB6ZXJvIGV4dHJhY3RvcnMgd2VyZSByZWdpc3RlcmVkJywgJ05vRXh0cmFjdG9ycycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNvcnQgYnkgcHJpb3JpdHkgc28gdGhhdCBleHRyYWN0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5IGFyZSBleGVjdXRlZCBmaXJzdFxuICAgIGNvbnN0IGV4dHJhY3RvcnMgPSB0aGlzLnN0b3JlLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcblxuICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRyYWN0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9Li4uYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihleHQpLnRoZW4oXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApO1xuXG4gICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBlcnIgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycilcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZm9yIGEgdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKHRyYWNrOiBUcmFjaywgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IHRyYWNrLmV4dHJhY3Rvcikge1xuICAgIGNvbnN0IHByZXZpb3VzbHlBdHRlbXB0ZWQgPSB0aGlzLmdldENvbnRleHQoKT8uYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9ycyA/PyBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocHJldmlvdXNseUF0dGVtcHRlZC5oYXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHByZXZpb3VzbHlBdHRlbXB0ZWQuYWRkKGV4dC5pZGVudGlmaWVyKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcblxuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpXG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9CUklER0VfRkFJTEVEKFxuICAgICAgICB0aGlzLmdldEV4ZWN1dGlvbklkKCksXG4gICAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8IHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ05vIGV4dHJhY3RvcnMgYXZhaWxhYmxlIHRvIGJyaWRnZScsXG4gICAgICApO1xuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IHJlc3VsdC5leHRyYWN0b3I7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYnJpZGdlIGZyb20gdGhlIHNwZWNpZmllZCBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICogQHBhcmFtIHRhcmdldEV4dHJhY3RvciBUaGUgdGFyZ2V0IGV4dHJhY3RvciB0byBicmlkZ2UgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlRnJvbShcbiAgICB0cmFjazogVHJhY2ssXG4gICAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCxcbiAgICB0YXJnZXRFeHRyYWN0b3I6IEV4dHJhY3RvclJlc29sdmFibGUsXG4gICkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZSh0YXJnZXRFeHRyYWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7XG4iLCAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgdW5zYWZlID0gYW55O1xuXG4vKipcbiAqIFRoZSByZWNlaXZlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRleHQgaXMgcHJvdmlkZWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dFJlY2VpdmVyPFI+ID0gKCkgPT4gUjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHQ8VD4ge1xuICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZhdWx0VmFsdWU/OiBUKSB7fVxuXG4gIC8qKlxuICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBleGl0KHNjb3BlOiBDb250ZXh0UmVjZWl2ZXI8dm9pZD4pIHtcbiAgICB0aGlzLnN0b3JhZ2UuZXhpdChzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29udGV4dCBpcyBsb3N0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFN0b3JlKCkgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICAgKi9cbiAgcHVibGljIGNvbnN1bWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHZhbHVlIG1heSBub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0XG4gKiBAZXhhbXBsZSBjb25zdCB1c2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAqXG4gKiAgLy8gdGhlIHZhbHVlIHRvIHByb3ZpZGVcbiAqICBjb25zdCB1c2VyID0ge1xuICogICBpZDogMSxcbiAqICAgbmFtZTogJ0pvaG4gRG9lJ1xuICogIH07XG4gKlxuICogIC8vIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUgdG8gdGhlIHJlY2VpdmVyXG4gKiAgY29udGV4dC5wcm92aWRlKHVzZXIsIGhhbmRsZXIpO1xuICpcbiAqICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICogICAgLy8gZ2V0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICpcbiAqICAgIGNvbnNvbGUubG9nKGlkLCBuYW1lKTsgLy8gMSwgSm9obiBEb2VcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQgPSB1bnNhZmU+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn1cbiIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpO1xuIiwgImltcG9ydCB7IGdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbFJlZ2lzdHJ5KCkge1xuICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGQgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICBndWlsZDogR3VpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBTVVBFUl9DT05URVhUID0gY3JlYXRlQ29udGV4dDxQbGF5ZXI+KCk7XG5cbmNvbnN0IGdldEZhbGxiYWNrQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICBsZXQgaXNGYWxsYmFjayA9IGZhbHNlO1xuXG4gIGxldCBwbGF5ZXI6IFBsYXllciB8IHVuZGVmaW5lZDtcblxuICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICBwbGF5ZXIgPSBnZXRGYWxsYmFja0NvbnRleHQoKTtcbiAgICBpc0ZhbGxiYWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghcGxheWVyKVxuICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKFxuICAgICAgJ2Rpc2NvcmQtcGxheWVyJyxcbiAgICAgIGBQbGF5ZXIgY29udGV4dCBpcyBub3QgYXZhaWxhYmxlLCAke1xuICAgICAgICBpc0ZhbGxiYWNrXG4gICAgICAgICAgPyAnZGlkIHlvdSBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGxheWVyIHdpdGggYG5ldyBQbGF5ZXIoY2xpZW50KWA/J1xuICAgICAgICAgIDogJ2lzIGl0IGJlaW5nIGNhbGxlZCBpbnNpZGUgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKCk/J1xuICAgICAgfWAsXG4gICAgKTtcblxuICBpZiAobWFpbk9ubHkpIHJldHVybiB7IHBsYXllciwgY29udGV4dDoge30gYXMgSG9va3NDdHgsIGlzRmFsbGJhY2sgfTtcblxuICBsZXQgY29udGV4dDogSG9va3NDdHggfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFpc0ZhbGxiYWNrKSB7XG4gICAgY29udGV4dCA9IHVzZUNvbnRleHQocGxheWVyLmNvbnRleHQpO1xuICAgIGlmICghY29udGV4dClcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKFxuICAgICAgICBob29rTmFtZSxcbiAgICAgICAgYCR7aG9va05hbWV9IG11c3QgYmUgY2FsbGVkIGluc2lkZSBhIHBsYXllciBjb250ZXh0IGNyZWF0ZWQgYnkgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKClgLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgZ2V0IGd1aWxkKCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTihcbiAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleHBsaWNpdCBndWlsZCBhcmd1bWVudCB3aGVuIG5vdCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dGAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBIb29rc0N0eDtcbiAgfVxuXG4gIHJldHVybiB7IGNvbnRleHQsIHBsYXllciwgaXNGYWxsYmFjayB9O1xufVxuIiwgImltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5LCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBoaXN0b3J5XG4gKiBAcGFyYW0gbm9kZSBndWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihub2RlPzogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VIaXN0b3J5Jyk7XG5cbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgcGxheWVyIG5vZGVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVBsYXllcicpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZS5ub2RlO1xufVxuIiwgImltcG9ydCB7IEd1aWxkUXVldWUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlLlxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlLiBEZWZhdWx0cyB0byBpbmZlcnJlZCBndWlsZCBmcm9tIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLnJlc29sdmU8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBtYWluIHBsYXllciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFpblBsYXllcigpIHtcbiAgY29uc3QgeyBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlTWFpblBsYXllcicsIHRydWUpO1xuXG4gIHJldHVybiBwbGF5ZXI7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IHR5cGUgU2V0dGVyRk48VCwgUD4gPSAocHJldmlvdXM6IFApID0+IFQ7XG5leHBvcnQgdHlwZSBNZXRhZGF0YURpc3BhdGNoPFQ+ID0gcmVhZG9ubHkgWygpID0+IFQsIChtZXRhZGF0YTogVCB8IFNldHRlckZOPFQsIFQ+KSA9PiB2b2lkXTtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPigpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IE1ldGFkYXRhRGlzcGF0Y2g8VD4ge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNZXRhZGF0YScpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PFQ+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGNvbnN0IHNldHRlciA9IChtZXRhZGF0YTogVCB8IFNldHRlckZOPFQsIFQ+KSA9PiB7XG4gICAgaWYgKHF1ZXVlKSB7XG4gICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn1cbiIsICJpbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSwgUGxheWVyVGltZXN0YW1wIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlOiBOb2RlUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlVGltZWxpbmUge1xuICByZWFkb25seSB0aW1lc3RhbXA6IFBsYXllclRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhY2s6IFRyYWNrPHVua25vd24+IHwgbnVsbDtcbiAgcGF1c2UoKTogYm9vbGVhbjtcbiAgcmVzdW1lKCk6IGJvb2xlYW47XG4gIHNldFZvbHVtZSh2b2w6IG51bWJlcik6IGJvb2xlYW47XG4gIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gdGltZWxpbmU7XG59XG4iLCAiaW1wb3J0IHsgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTiA9IChwcmV2aW91czogbnVtYmVyKSA9PiBudW1iZXI7XG50eXBlIFZvbHVtZURpc3BhdGNoID0gcmVhZG9ubHkgWygpID0+IG51bWJlciwgKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUoKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVm9sdW1lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQobm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gIH07XG5cbiAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIGRpc2FibGVGYWxsYmFja1N0cmVhbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5vZGVSZXNvbHZhYmxlID0gR3VpbGRRdWV1ZSB8IEd1aWxkUmVzb2x2YWJsZTtcblxuZXhwb3J0IGNsYXNzIEd1aWxkTm9kZU1hbmFnZXI8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIGNhY2hlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPigpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZ3VpbGQgcXVldWUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIG9wdGlvbnMgUXVldWUgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgY29uc3Qgc2VydmVyID0gdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlKGd1aWxkKTtcbiAgICBpZiAoIXNlcnZlcikge1xuICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTEQoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIH1cblxuICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgfVxuXG4gICAgY29uc3QgcXVldWUgPSBuZXcgR3VpbGRRdWV1ZTxUPih0aGlzLnBsYXllciwge1xuICAgICAgZ3VpbGQ6IHNlcnZlcixcbiAgICAgIHF1ZXVlU3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICB2b2x1bWU6IG9wdGlvbnMudm9sdW1lLFxuICAgICAgZXF1YWxpemVyOiBvcHRpb25zLmVxdWFsaXplcixcbiAgICAgIGZpbHRlcmVyOiBvcHRpb25zLmFfZmlsdGVyLFxuICAgICAgYmlxdWFkOiBvcHRpb25zLmJpcXVhZCxcbiAgICAgIHJlc2FtcGxlcjogb3B0aW9ucy5yZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlSGlzdG9yeTogb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSxcbiAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZSxcbiAgICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEsXG4gICAgICBtYXhIaXN0b3J5U2l6ZTogb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSxcbiAgICAgIG1heFNpemU6IG9wdGlvbnMubWF4U2l6ZSxcbiAgICAgIHBhdXNlT25FbXB0eTogb3B0aW9ucy5wYXVzZU9uRW1wdHksXG4gICAgICBkaXNhYmxlQmlxdWFkOiBvcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICBkaXNhYmxlRXF1YWxpemVyOiBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICBkaXNhYmxlRmlsdGVyZXI6IG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgZGlzYWJsZVJlc2FtcGxlcjogb3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgZGlzYWJsZVZvbHVtZTogb3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBvcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbSxcbiAgICB9KTtcblxuICAgIHRoaXMuY2FjaGUuc2V0KHNlcnZlci5pZCwgcXVldWUpO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuICh0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgIHJldHVybiBub2RlIGFzIEd1aWxkUXVldWU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpISkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEd1aWxkLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIFZvaWNlQmFzZWRDaGFubmVsLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZSwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUsIFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlUmVwZWF0TW9kZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFN5bmNlZEx5cmljc1Byb3ZpZGVyIH0gZnJvbSAnLi9TeW5jZWRMeXJpY3NQcm92aWRlcic7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IHVua25vd24+IHtcbiAgZ3VpbGQ6IEd1aWxkO1xuICBxdWV1ZVN0cmF0ZWd5OiBRdWV1ZVN0cmF0ZWd5O1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gIHZvbHVtZTogbnVtYmVyIHwgYm9vbGVhbjtcbiAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcmVzYW1wbGVyOiBudW1iZXIgfCBib29sZWFuO1xuICBmaWx0ZXJlcjogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgZmZtcGVnRmlsdGVyczogRmlsdGVyc05hbWVbXTtcbiAgZGlzYWJsZUhpc3Rvcnk6IGJvb2xlYW47XG4gIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gIGxlYXZlT25FbXB0eTogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG51bWJlcjtcbiAgbGVhdmVPbkVuZDogYm9vbGVhbjtcbiAgbGVhdmVPbkVuZENvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25TdG9wOiBib29sZWFuO1xuICBsZWF2ZU9uU3RvcENvb2xkb3duOiBudW1iZXI7XG4gIGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG4gIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgbWV0YWRhdGE/OiBNZXRhIHwgbnVsbDtcbiAgYnVmZmVyaW5nVGltZW91dDogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ6IGJvb2xlYW47XG4gIG1heFNpemU/OiBudW1iZXI7XG4gIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IGJvb2xlYW47XG4gIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gIGRpc2FibGVWb2x1bWU6IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI6IGJvb2xlYW47XG4gIGRpc2FibGVGaWx0ZXJlcjogYm9vbGVhbjtcbiAgZGlzYWJsZUJpcXVhZDogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcjogYm9vbGVhbjtcbiAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlQ29ubmVjdENvbmZpZyB7XG4gIGRlYWY/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBncm91cD86IHN0cmluZztcbiAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3N0UHJvY2Vzc2VkUmVzdWx0IHtcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgdHlwZTogU3RyZWFtVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gKFxuICB0cmFjazogVHJhY2ssXG4gIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbikgPT4gUHJvbWlzZTxSZWFkYWJsZSB8IG51bGw+O1xuZXhwb3J0IHR5cGUgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAoc3RyZWFtOiBSZWFkYWJsZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5Jyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEd1aWxkUXVldWVFdmVudCA9ICh0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50KVtrZXlvZiB0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50XTtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgTm9TdHJlYW0gPSAnRVJSX05PX1NUUkVBTScsXG4gIE1hbnVhbCA9ICdNQU5VQUwnLFxuICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICBKdW1wID0gJ0pVTVBFRF9UT19BTk9USEVSX1RSQUNLJyxcbiAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSycsXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IGFueT4ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrW10pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25dOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EaXNjb25uZWN0XTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRlYnVnXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBtZXNzYWdlOiBzdHJpbmcpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXJyb3JdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvciwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckZpbmlzaF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBza2lwcGVkXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICB0cmFjazogVHJhY2ssXG4gICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJUcmlnZ2VyXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZV06IChcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sXG4gICAgbmV3RmlsdGVyczogRXF1YWxpemVyQmFuZFtdLFxuICApID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZV06IChcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCxcbiAgICBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCxcbiAgKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogUENNRmlsdGVyc1tdLCBuZXdGaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZmZtcGVnIGF1ZGlvIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlXTogKFxuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICAgIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gICAgbmV3RmlsdGVyczogRmlsdGVyc05hbWVbXSxcbiAgKSA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICB0cmFjazogVHJhY2s8dW5rbm93bj4sXG4gICAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gICAgZG9uZTogKCkgPT4gdm9pZCxcbiAgKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyBwb3B1bGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHNpbWlsYXIgdHJhY2tzIHRoYXQgd2VyZSBmb3VuZFxuICAgKiBAcGFyYW0gZG9uZSBEb25lIGNhbGxiYWNrXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LldpbGxBdXRvUGxheV06IChcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICB0cmFja3M6IFRyYWNrW10sXG4gICAgZG9uZTogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQsXG4gICkgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IHVua25vd24+IHtcbiAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgI2RlbGV0ZWQgPSBmYWxzZTtcbiAgI3NodWZmbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyB0cmFja3M6IFF1ZXVlPFRyYWNrPjtcbiAgcHVibGljIGhpc3RvcnkgPSBuZXcgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBub2RlID0gbmV3IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZmlsdGVycyA9IG5ldyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gIHB1YmxpYyBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jIChzdHJlYW0pID0+ICh7XG4gICAgc3RyZWFtLFxuICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3LFxuICB9KTtcbiAgcHVibGljIHJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIHN5bmNlZEx5cmljc1Byb3ZpZGVyID0gbmV3IFN5bmNlZEx5cmljc1Byb3ZpZGVyKHRoaXMpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KSB7XG4gICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpIHRoaXMub25BZnRlckNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbTtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaChvcHRpb25zLnJlcGVhdE1vZGUpKSB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZXF1YWxpemVyKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IHRoaXMub3B0aW9ucy5lcXVhbGl6ZXI7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmZpbHRlcmVyKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyZXI7XG4gICAgfVxuXG4gICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgaWYgKFR5cGVVdGlsLmlzQXJyYXkodGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuZmZtcGVnLnNldERlZmF1bHRzKHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4U2l6ZSkpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJywgJ251bWJlcicsIHR5cGVvZiBvcHRpb25zLm1heFNpemUpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgKTtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZSBpbiBtc1xuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN5bmMgbHlyaWNzIHByb3ZpZGVyIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAZXhhbXBsZSBjb25zdCBseXJpY3MgPSBhd2FpdCBwbGF5ZXIubHlyaWNzLnNlYXJjaCh7IHE6ICdBbGFuIFdhbGtlciBGYWRlZCcgfSk7XG4gICAqIGNvbnN0IHN5bmNlZEx5cmljcyA9IHF1ZXVlLnN5bmNlZEx5cmljcyhseXJpY3NbMF0pO1xuICAgKiBjb25zb2xlLmxvZyhzeW5jZWRMeXJpY3MuYXQoMTBfMDAwKSk7XG4gICAqIC8vIHN1YnNjcmliZSB0byBseXJpY3MgY2hhbmdlXG4gICAqIGNvbnN0IHVuc3Vic2NyaWJlID0gc3luY2VkTHlyaWNzLm9uQ2hhbmdlKChseXJpY3MsIHRpbWVzdGFtcCkgPT4ge1xuICAgKiAgICBjb25zb2xlLmxvZyhseXJpY3MsIHRpbWVzdGFtcCk7XG4gICAqIH0pO1xuICAgKiAvLyB1bnN1YnNjcmliZSBmcm9tIGx5cmljcyBjaGFuZ2VcbiAgICogdW5zdWJzY3JpYmUoKTsgLy8gb3JcbiAgICogc3luY2VkTHlyaWNzLnVuc3Vic2NyaWJlKCk7XG4gICAqL1xuICBwdWJsaWMgc3luY2VkTHlyaWNzKGx5cmljczogTHJjR2V0UmVzdWx0IHwgTHJjU2VhcmNoUmVzdWx0KSB7XG4gICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci5sb2FkKGx5cmljcz8uc3luY2VkTHlyaWNzID8/ICcnKTtcbiAgICByZXR1cm4gdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhIGRlYnVnIG1lc3NhZ2UgdG8gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGVidWcsIHRoaXMsIG0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRhZGF0YSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWV0YWRhdGEhO1xuICB9XG5cbiAgcHVibGljIHNldCBtZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG0gTWV0YWRhdGEgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGN1cnJlbnQgdHJhY2sgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgKi9cbiAgcHVibGljIGdldCBkZWxldGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNkZWxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjaGFubmVsIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5jaGFubmVsIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgc2V0IGNoYW5uZWwoYzogVm9pY2VCYXNlZENoYW5uZWwgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwgPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZWxldGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBndWlsZCB0aGlzIHF1ZXVlIGJlbG9uZ3MgdG9cbiAgICovXG4gIHB1YmxpYyBnZXQgZ3VpbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNpdGlvbiBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0VHJhbnNpdGlvbmluZyhzdGF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc1RyYW5zaXRpb25pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RyYW5zaXRpb25pbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJlcGVhdCBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtb2RlIFRoZSByZXBlYXQgbW9kZSB0byBhcHBseVxuICAgKi9cbiAgcHVibGljIHNldFJlcGVhdE1vZGUobW9kZTogUXVldWVSZXBlYXRNb2RlKSB7XG4gICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhTaXplID8/IEluZmluaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRNYXhTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm1heFNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID8/IEluZmluaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm1heEhpc3RvcnlTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXggaGlzdG9yeSBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldE1heEhpc3RvcnlTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaXMgZnVsbFxuICAgKi9cbiAgcHVibGljIGlzRnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gY2FwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgY3VycmVudGx5IGhvbGRzIGFjdGl2ZSBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgKiBAcGFyYW0gdHJhY2sgVHJhY2sgb3IgcGxheWxpc3Qgb3IgYXJyYXkgb2YgdHJhY2tzIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgIGNvbnN0IHRvQWRkID0gdHJhY2sgaW5zdGFuY2VvZiBQbGF5bGlzdCA/IHRyYWNrLnRyYWNrcyA6IHRyYWNrO1xuICAgIGNvbnN0IGlzTXVsdGkgPSBBcnJheS5pc0FycmF5KHRvQWRkKTtcblxuICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCB0b0FkZCk7XG5cbiAgICB0aGlzLnRyYWNrcy5hZGQodG9BZGQpO1xuXG4gICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRyYWNrIGZyb20gcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5yZW1vdmUodHJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byB1c2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKFxuICAgIGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbixcbiAgICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSxcbiAgKSB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMuY2FjaGUuZ2V0KGNvbm5lY3Rpb24uam9pbkNvbmZpZy5jaGFubmVsSWQhKTtcbiAgICBpZiAoIWNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NIQU5ORUwoKTtcbiAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpXG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKFxuICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSksXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihcbiAgICAgIGNvbm5lY3Rpb24sXG4gICAgICBjaGFubmVsLFxuICAgICAgdGhpcyxcbiAgICAgIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBvcHRpb25zLmF1ZGlvUGxheWVyLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoXG4gICAgICAgICdjaGFubmVsJyxcbiAgICAgICAgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsXG4gICAgICAgIFN0cmluZyhjaGFubmVsPy50eXBlKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtcbiAgICAgICAgICBjaGFubmVsLm5hbWVcbiAgICAgICAgfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCxcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLiNhdHRhY2hMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBEeW5hbWljIHNodWZmbGluZyB3aWxsIHNodWZmbGUgdGhlIHF1ZXVlIHdoZW4gdGhlIGN1cnJlbnQgdHJhY2sgZW5kcywgd2l0aG91dCBtdXRhdGluZyB0aGUgcXVldWUuXG4gICAqIElmIHNldCB0byBgZmFsc2VgLCB0aGUgcXVldWUgd2lsbCBiZSBzaHVmZmxlZCBpbW1lZGlhdGVseSBpbi1wbGFjZSwgd2hpY2ggY2Fubm90IGJlIHVuZG9uZS5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVTaHVmZmxlKGR5bmFtaWMgPSB0cnVlKSB7XG4gICAgaWYgKCFkeW5hbWljKSB7XG4gICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLiNzaHVmZmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyBkaXNhYmxlU2h1ZmZsZSgpIHtcbiAgICB0aGlzLiNzaHVmZmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHNodWZmbGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVTaHVmZmxlKGR5bmFtaWMgPSB0cnVlKSB7XG4gICAgaWYgKGR5bmFtaWMpIHtcbiAgICAgIHRoaXMuI3NodWZmbGUgPSAhdGhpcy4jc2h1ZmZsZTtcbiAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzaHVmZmxlIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhpcyBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTaHVmZmxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbj8ucGluZy51ZHAgPz8gLTE7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyLm5vZGVzLmRlbGV0ZSh0aGlzLmlkKSkge1xuICAgICAgdGhpcy4jZGVsZXRlZCA9IHRydWU7XG4gICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGUsIHRoaXMpO1xuICAgICAgdGhpcy5ub2RlLnRhc2tzUXVldWUuY2FuY2VsQWxsKCk7XG4gICAgICB0aGlzLnRhc2tzUXVldWUuY2FuY2VsQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldml2ZXMgdGhpcyBxdWV1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHJldml2ZSgpIHtcbiAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICB0aGlzLiNkZWxldGVkID0gZmFsc2U7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBkZWFmXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXREZWFmKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGYgbXV0ZVxuICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0TXV0ZShtb2RlLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgYSB0cmFjayBpbiB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBub2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KHRyYWNrOiBUcmFja0xpa2UsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04oKTtcblxuICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KFxuICAgIGV2ZW50OiBLLFxuICAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLCBlKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZGVidWcnLCAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZmluaXNoJywgKHIpID0+IHRoaXMuI3BlcmZvcm1GaW5pc2gocikpO1xuICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZik7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCwgZik7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcUJhbmRzJywgKGYpID0+IHtcbiAgICAgIGlmICghT2JqZWN0LmlzKGYsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIpKSB7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXF1YWxpemVyVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLCBmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZilcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0RlYnVnZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuaGFzRGVidWdnZXI7XG4gIH1cblxuICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7IHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdW5rbm93biB9Pih0YXJnZXQ6IFQpIHtcbiAgICB0YXJnZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gIH1cblxuICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICBjb25zdCByZWFzb24gPSB0aGlzLmlzVHJhbnNpdGlvbmluZygpID8gJ2ZpbHRlcnMnIDogJ25vcm1hbCc7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfSl9YCxcbiAgICAgICk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXIsIHRoaXMsIHRyYWNrISwgcmVhc29uKTtcbiAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICB9XG5cbiAgI2dldE5leHRUcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy50cmFja3Muc3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZShzdG9yZSk7XG5cbiAgICB0aGlzLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHtcbiAgICAgIHJldHVybiB0LmlkID09PSB0cmFjay5pZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgaXNUcmFuc2l0aW9uTW9kZTogdGhpcy5pc1RyYW5zaXRpb25pbmcoKSxcbiAgICAgICAgfSl9IHdhcyBtYXJrZWQgYXMgZmluaXNoZWRgLFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci5seXJpY3MuY2xlYXIoKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBZGRpbmcgdHJhY2sgdG8gaGlzdG9yeSBhbmQgZW1pdHRpbmcgZmluaXNoIGV2ZW50IHNpbmNlIHRyYW5zaXRpb24gbW9kZSBpcyBkaXNhYmxlZC4uLicpO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLicpO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gYXV0b3BsYXksIGluaXRpYXRpbmcgYXV0b3BsYXkgaGFuZGxlci4uLicpO1xuICAgICAgICAgICAgdGhpcy4jaGFuZGxlQXV0b3BsYXkodHJhY2spO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICNlbWl0RW5kKCkge1xuICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5UXVldWUsIHRoaXMpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYEF1dG9wbGF5ID4+IEZpbmRpbmcgcmVsYXRlZCB0cmFja3MgZm9yIFRyYWNrICR7dHJhY2sudGl0bGV9ICgke3RyYWNrLnVybH0pIFtleHQ6JHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ1xuICAgICAgICAgIH1dYCxcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYWNrcyA9XG4gICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSkpPy50cmFja3MgfHxcbiAgICAgICAgKFxuICAgICAgICAgIGF3YWl0IHRoaXMucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dC5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgICAgICAgaWYgKCFyZXMudHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYCk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgfSlcbiAgICAgICAgKT8ucmVzdWx0IHx8XG4gICAgICAgIFtdO1xuXG4gICAgICBsZXQgcmVzb2x2ZXI6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTxUcmFjayB8IG51bGw+KChyZXNvbHZlKSA9PiAocmVzb2x2ZXIgPSByZXNvbHZlKSk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LldpbGxBdXRvUGxheSwgdGhpcywgdHJhY2tzLCByZXNvbHZlciEpO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoXG4gICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcigodHIpID0+ICF0aGlzLmhpc3RvcnkudHJhY2tzLmZpbmQoKHQpID0+IHQudXJsID09PSB0ci51cmwpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0VHJhY2sgPSBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgaWYgKCFuZXh0VHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0F1dG9wbGF5ID4+IE5vIHRyYWNrIHdhcyBmb3VuZCwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgIHRocm93ICdObyB0cmFjayB3YXMgZm91bmQnO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICBzZWVrOiAwLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyRXJyb3IsXG4gIEF1ZGlvUGxheWVyU3RhdHVzLFxuICBBdWRpb1Jlc291cmNlLFxuICBjcmVhdGVBdWRpb1BsYXllcixcbiAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgZW50ZXJzU3RhdGUsXG4gIFN0cmVhbVR5cGUsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLFxufSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IEVxdWFsaXplckJhbmQsIEJpcXVhZEZpbHRlcnMsIFBDTUZpbHRlcnMsIEZpbHRlcnNDaGFpbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBQb3N0UHJvY2Vzc2VkUmVzdWx0IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgdHlwZT86IFN0cmVhbVR5cGU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGRhdGE/OiBhbnk7XG4gIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gIGVxPzogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICBkaXNhYmxlRmlsdGVycz86IGJvb2xlYW47XG4gIGRlZmF1bHRGaWx0ZXJzPzogUENNRmlsdGVyc1tdO1xuICB2b2x1bWU/OiBudW1iZXI7XG4gIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICBzYW1wbGVSYXRlPzogbnVtYmVyO1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgZXJyb3I6IChlcnJvcjogQXVkaW9QbGF5ZXJFcnJvcikgPT4gYW55O1xuICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICBzdGFydDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICBmaW5pc2g6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gIGVxQmFuZHM6IChmaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IGFueTtcbiAgc2FtcGxlUmF0ZTogKGZpbHRlcnM6IG51bWJlcikgPT4gYW55O1xuICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIGNvbm5lY3RlZCBjaGFubmVsXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gICAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICAgIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLFxuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEB0eXBlIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICovXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAqIEB0eXBlIHtBdWRpb1BsYXllcn1cbiAgICAgKi9cbiAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICAgIGRlYnVnOiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyLFxuICAgICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEB0eXBlIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfVxuICAgICAqL1xuICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IgYXMgQXVkaW9QbGF5ZXJFcnJvcikpO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgIHRoaXMuZHNwLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRzcCkgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKSB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycyk7XG4gICAgICBpZiAodGhpcy5kc3AuZXF1YWxpemVyKSB0aGlzLmVtaXQoJ2VxQmFuZHMnLCB0aGlzLmRzcC5lcXVhbGl6ZXIuZ2V0RVEoKSk7XG4gICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB0aGlzLmVtaXQoJ3ZvbHVtZScsIHRoaXMuZHNwLnZvbHVtZS52b2x1bWUpO1xuICAgICAgaWYgKHRoaXMuZHNwLnJlc2FtcGxlcikgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLnRhcmdldFNhbXBsZVJhdGUpO1xuICAgIH07XG5cbiAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb25cbiAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uTWFudWFsKSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQsICgpID0+IHtcbiAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3N0YXJ0JywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICovXG4gIGdldCBwYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gIH1cblxuICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF1c2VkIHx8IHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgKi9cbiAgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cbiAgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAqL1xuICBpc0lkbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGlzY29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgKi9cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgKi9cbiAgaXNTaWduYWxsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICovXG4gIGlzQ29ubmVjdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAqL1xuICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzPzogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYXRpbmcgRFNQIGZpbHRlcnMgcGlwZWxpbmUuLi4nKTtcbiAgICBjb25zdCBzdHJlYW0gPSAhb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgPyB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICAgICAgZHNwOiB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVzYW1wbGVyOiB7XG4gICAgICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2b2x1bWU6IHtcbiAgICAgICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICA6IHNyYztcblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUub25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSkuY2F0Y2goXG4gICAgICAoKSA9PlxuICAgICAgICAoe1xuICAgICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgfSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0KSxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSxcbiAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHN0YXR1c1xuICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJTdGF0dXN9XG4gICAqL1xuICBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyBmcm9tIHZvaWNlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzY29ubmVjdCgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuYXVkaW9QbGF5ZXIpIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy9cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHN0cmVhbVxuICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0FVRElPX1JFU09VUkNFKCk7XG4gICAgfVxuICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSB0aGlzLmF1ZGlvUmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2b2x1bWUgYW1vdW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2V0Vm9sdW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB2b2x1bWUoKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiAxMDA7XG4gICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzdHJlYW1UaW1lKCkge1xuICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlLnBsYXliYWNrRHVyYXRpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciBhcyBTdHJlYW1EaXNwYXRjaGVyIH07XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAvKipcbiAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKCh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIHRoaXMucXVldWUubm9kZS5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkhpc3RvcnlOZXh0LFxuICAgICAgZGVzY3JpcHRpb246ICdTa2lwcGVkIGJ5IEd1aWxkUXVldWVIaXN0b3J5Lm5leHQoKScsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAqL1xuICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgRXh0cmFjdG9yU3RyZWFtYWJsZSB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBPZ2dEZW11eGVyLCBPcHVzRGVjb2RlciwgV2VibURlbXV4ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvb3B1cyc7XG5cbmV4cG9ydCBjb25zdCBGRk1QRUdfU1JBVEVfUkVHRVggPSAvYXNldHJhdGU9XFxkK1xcKihcXGQoXFwuXFxkKT8pLztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGEgPSB1bmtub3duPiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QodGhpcy5xdWV1ZS5wbGF5ZXIuc2NhbkRlcHMoKSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgaXNJZGxlKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNJZGxlKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNCdWZmZXJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICovXG4gIHB1YmxpYyBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGF1c2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcHJvZ3Jlc3MgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwbGF5ZXIgcHJvZ3Jlc3NcbiAgICovXG4gIHB1YmxpYyBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGdldCBzdHJlYW1UaW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnN0cmVhbVRpbWUgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHBsYXliYWNrIGR1cmF0aW9uIHdpdGggaGlzdG9yeSBpbmNsdWRlZFxuICAgKi9cbiAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICByZXR1cm4gZHVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9BcnJheSgpLmZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnNcbiAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/IDEgOiBtdWx0aXBsaWVycy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBjdXJyZW50ICsgYWNjdW11bGF0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBwcm9ncmVzcyBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZFBsYXliYWNrVGltZSgpIHtcbiAgICBjb25zdCBkdXIgPSB0aGlzLnBsYXliYWNrVGltZTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpICogZHVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgdG90YWwgZHVyYXRpb24gb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICBjb25zdCBkdXIgPSB0aGlzLnRvdGFsRHVyYXRpb247XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChkdXIgLyB0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSkge1xuICAgICAgY29uc3QgdHJhY2tIYXNMZWdhY3lNZXRhZGF0YSA9XG4gICAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICAgIHR5cGVvZiB0cmFjay5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEgJiZcbiAgICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgICB0cmFjay5icmlkZ2VkVHJhY2s/LmR1cmF0aW9uTVMgPz9cbiAgICAgICAgICAoXG4gICAgICAgICAgICB0cmFjayBhcyBUcmFjazx7XG4gICAgICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9PlxuICAgICAgICAgICkubWV0YWRhdGE/LmJyaWRnZS5kdXJhdGlvbjtcblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIoZHVyYXRpb24pKSByZXR1cm4gZHVyYXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNrPy5kdXJhdGlvbk1TID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0cmVhbSBwcm9ncmVzc1xuICAgKiBAcGFyYW0gaWdub3JlRmlsdGVycyBJZ25vcmUgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldFRpbWVzdGFtcChpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBQbGF5ZXJUaW1lc3RhbXAgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy5wbGF5YmFja1RpbWUgOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICB2YWx1ZTogY3VycmVudCxcbiAgICAgIH0sXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICB2YWx1ZTogdG90YWwsXG4gICAgICB9LFxuICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoKGN1cnJlbnQgLyB0b3RhbCkgKiAxMDApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsXG4gICAgICBsZWZ0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIGxlbmd0aCA9IDE1LFxuICAgICAgdGltZWNvZGVzID0gdHJ1ZSxcbiAgICAgIHNlcGFyYXRvciA9ICdcXHUyNTAzJyxcbiAgICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbUGxheWVyUHJvZ3Jlc3NCYXJPcHRpb25zLmxlbmd0aF0nLCBTdHJpbmcobGVuZ3RoKSwgJzAnLCAnRmluaXRlIE51bWJlcicpO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoKHRpbWVzdGFtcC5jdXJyZW50LnZhbHVlIC8gdGltZXN0YW1wLnRvdGFsLnZhbHVlKSAqIGxlbmd0aCk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKCcnKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfSAke3NlcGFyYXRvcn0gJHtcbiAgICAgICAgICB0aW1lc3RhbXAudG90YWwubGFiZWxcbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfUkFOR0UoJ1tkdXJhdGlvbl0nLCBTdHJpbmcoZHVyYXRpb24pLCAnMCcsIFN0cmluZyh0aGlzLnRvdGFsRHVyYXRpb24pKVxuICAgICAgICAgIC5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChkdXJhdGlvbiA8IDApIGR1cmF0aW9uID0gMDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdm9sdW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2b2x1bWVcbiAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYml0IHJhdGVcbiAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKFxuICAgICAgcmF0ZSA9PT0gJ2F1dG8nID8gdGhpcy5xdWV1ZS5jaGFubmVsPy5iaXRyYXRlID8/IDY0MDAwIDogcmF0ZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSkgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGF1c2UodHJ1ZSkgfHwgZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBza2lwKG9wdGlvbnM/OiBTa2lwT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgY29uc3QgeyByZWFzb24sIGRlc2NyaXB0aW9uIH0gPSBvcHRpb25zIHx8IHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLk1hbnVhbCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBza2lwcGVkIG1hbnVhbGx5JyxcbiAgICB9O1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IFdoZXRoZXIgb3Igbm90IHRvIGVtaXQgdGhlIGV2ZW50IEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZSh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgZm91bmRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmZpbmQoKHQsIGlkeCkgPT4ge1xuICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICB9KTtcbiAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgdGhpcy5xdWV1ZS50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB0LmlkID09PSBmb3VuZFRyYWNrLmlkKTtcblxuICAgIGlmIChlbWl0RXZlbnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICovXG4gIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5JyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYSB0cmFjayBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0KHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKSB7XG4gICAgaWYgKCEodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykpXG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCd0cmFjayB2YWx1ZScsICdpbnN0YW5jZSBvZiBUcmFjaycsIFN0cmluZyh0cmFjaykpO1xuICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCB0cmFjayk7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0KHJlbW92ZWQsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLnF1ZXVlLnRyYWNrcy5hdCh0aGlzLmdldFRyYWNrUG9zaXRpb24oZnJvbSkpO1xuICAgIGlmICghc3JjKSB7XG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChzcmMsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgKi9cbiAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oZmlyc3QpO1xuICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICBpZiAoZGVzdCA8IDApIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCBkZXN0IHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdID0gZGVzdFQ7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIG9yIG5vdCB0byBmb3JjZWZ1bGx5IHN0b3AgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLnF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRlc3Ryb3koKTtcbiAgICAgIH0sIHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duKS51bnJlZigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHJhdyBhdWRpbyByZXNvdXJjZVxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5UmF3KHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wbGF5U3RyZWFtKHJlc291cmNlIGFzIEF1ZGlvUmVzb3VyY2U8VHJhY2s+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgKTtcblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDAsXG4gICAgICB9IGFzIFJlc291cmNlUGxheU9wdGlvbnMsXG4gICAgICBvcHRpb25zLFxuICAgICkhO1xuXG4gICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLicpO1xuICAgICAgcmV0dXJuIHRoaXMucXVldWUuYWRkVHJhY2socmVzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdQbGF5IHJlcXVlc3QgcmVjZWl2ZWQgYnV0IHRyYWNrIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEluaXRpYXRpbmcgc3RyZWFtIGV4dHJhY3Rpb24gcHJvY2Vzcy4uLmApO1xuICAgICAgY29uc3Qgc3JjID0gdHJhY2sucmF3Py5zb3VyY2UgfHwgdHJhY2suc291cmNlO1xuICAgICAgY29uc3QgcXQ6IFNlYXJjaFF1ZXJ5VHlwZSA9XG4gICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCAoc3JjID09PSAnc3BvdGlmeScgPyAnc3BvdGlmeVNvbmcnIDogc3JjID09PSAnYXBwbGVfbXVzaWMnID8gJ2FwcGxlTXVzaWNTb25nJyA6IHNyYyk7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRXhlY3V0aW5nIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhvb2sgKFF1ZXJ5VHlwZTogJHtxdH0pLi4uYCk7XG5cbiAgICAgIGNvbnN0IHN0cmVhbVNyYyA9IHtcbiAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICBzdHJlYW06IG51bGwgYXMgRXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGwsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAocykgPT4ge1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpLFxuICAgICAgKTtcblxuICAgICAgLy8gdGhyb3cgaWYgJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBwYW5pY3NcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSAmJiBzdHJlYW1TcmMuZXJyb3IpIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgLy8gZGVmYXVsdCBiZWhhdmlvciB3aGVuICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgZGlkIG5vdCBwYW5pY1xuICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdGYWlsZWQgdG8gZ2V0IHN0cmVhbSBmcm9tIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIScpO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmNvbnRleHQucHJvdmlkZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgICAgICAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPnIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyPy5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlZWsgPT09ICdudW1iZXInICYmIG9wdGlvbnMuc2VlayA+PSAwKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gb3B0aW9ucy5zZWVrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFja1N0cmVhbUNvbmZpZzogU3RyZWFtQ29uZmlnID0ge1xuICAgICAgICBkaXNwYXRjaGVyQ29uZmlnOiB7XG4gICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgZGlzYWJsZVZvbHVtZTogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMFxuICAgICAgICAgICAgICA/IHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYmlxdWFkRmlsdGVyOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgdm9sdW1lOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3LFxuICAgICAgICAgIHNraXBGRm1wZWc6IHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZyxcbiAgICAgICAgfSxcbiAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zLFxuICAgICAgfTtcblxuICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrLCB0aGlzLnF1ZXVlLCB0cmFjaywgdHJhY2tTdHJlYW1Db25maWcsIHJlc29sdmVyISk7XG5cbiAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVZvbHVtZVxuICAgICAgICAgICAgXS5ldmVyeSgoZSkgPT4gISFlID09PSB0cnVlKTtcblxuICAgICAgY29uc3QgbmVlZHNGaWx0ZXJzID0gISF0cmFja1N0cmVhbUNvbmZpZy5wbGF5ZXJDb25maWcuc2VlayB8fCAhIXRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncy5sZW5ndGg7XG4gICAgICBjb25zdCBzaG91bGRTa2lwRkZtcGVnID0gISF0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnNraXBGRm1wZWcgJiYgIW5lZWRzRmlsdGVycztcblxuICAgICAgbGV0IGZpbmFsU3RyZWFtOiBSZWFkYWJsZTtcblxuICAgICAgY29uc3QgZGVtdXhhYmxlID0gKGZtdDogc3RyaW5nKSA9PlxuICAgICAgICBbU3RyZWFtVHlwZS5PcHVzLCBTdHJlYW1UeXBlLldlYm1PcHVzLCBTdHJlYW1UeXBlLk9nZ09wdXNdLmluY2x1ZGVzKGZtdCBhcyBTdHJlYW1UeXBlKTtcblxuICAgICAgLy8gc2tpcCBmZm1wZWcgd2hlbiBwb3NzaWJsZVxuICAgICAgaWYgKFxuICAgICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAgICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJlxuICAgICAgICB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdClcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7ICRmbXQsIHN0cmVhbSB9ID0gc3RyZWFtU3JjLnN0cmVhbTtcbiAgICAgICAgY29uc3Qgc2hvdWxkUENNID0gIWRhc3BEaXNhYmxlZDtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtcbiAgICAgICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cydcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0gOlxuICAgICAgICAgICAgICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgcmF0ZTogNDgwMDAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsU3RyZWFtID0gb3B1c1N0cmVhbTtcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLk9wdXM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNvbnN0IG9wdXMgPSBkYXNwRGlzYWJsZWQgJiYgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uO1xuICAgICAgICAvLyBpZiAob3B1cyAmJiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNhYmxpbmcgUENNIG91dHB1dCBzaW5jZSBhbGwgZmlsdGVycyBhcmUgZGlzYWJsZWQgYW5kIG9wdXMgZW5jb2RpbmcgaXMgc3VwcG9ydGVkLi4uJyk7XG5cbiAgICAgICAgZmluYWxTdHJlYW0gPSB0aGlzLiNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlIHx8IHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzdHJlYW1TcmMuc3RyZWFtXG4gICAgICAgICAgICA6IHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwLFxuICAgICAgICAgIC8vIG9wdXNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgIC8vIEZJWE1FOiBPZ2dPcHVzIHJlc3VsdHMgaW4gc3RhdGljIG5vaXNlXG4gICAgICAgIC8vIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IG9wdXMgPyBTdHJlYW1UeXBlLk9nZ09wdXMgOiBTdHJlYW1UeXBlLlJhdztcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbk1vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgIGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgLFxuICAgICAgICAgICk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeSh0cmFja1N0cmVhbUNvbmZpZywgbnVsbCwgMil9YCk7XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI7XG5cbiAgICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmluYWxTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBkaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShmaW5hbFN0cmVhbSwgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPSAoXG4gICAgICAgICAgICBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYENvdWxkIG5vdCBleHRyYWN0IHN0cmVhbSBmb3IgdGhpcyB0cmFjayR7ZXJyb3IgPyBgXFxuXFxuJHtlcnJvci5zdGFjayB8fCBlcnJvcn1gIDogJyd9YClcbiAgICAgICAgKTtcblxuICAgIHRoaXMucXVldWUuZW1pdChcbiAgICAgIEd1aWxkUXVldWVFdmVudC5QbGF5ZXJTa2lwLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHRyYWNrLFxuICAgICAgVHJhY2tTa2lwUmVhc29uLk5vU3RyZWFtLFxuICAgICAgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0Lm1lc3NhZ2UsXG4gICAgKTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0LFxuICAgICAgdHJhY2ssXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2AsXG4gICAgICApO1xuXG4gICAgY29uc3QgYXR0ZW1wdGVkRXh0cmFjdG9ycyA9IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuZ2V0Q29udGV4dCgpPy5hdHRlbXB0ZWRFeHRyYWN0b3JzIHx8IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGUpO1xuICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBHZW5lcmljIHN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCBhbmQgZmFsbGJhY2sgc3RyZWFtIGV4dHJhY3Rpb24gaXMgZW5hYmxlZGApO1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgICAgIHN0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnXG4gICAgICAgIH0pYCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyBmYWxsYmFjayBzdHJlYW1pbmcgbWV0aG9kLi4uYCxcbiAgICAgICk7XG5cbiAgICBjb25zdCBmYWxsYmFja1N0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2tzID0gYXdhaXQgZXh0cmFjdG9yLmhhbmRsZShxdWVyeSwge1xuICAgICAgICByZXF1ZXN0ZWRCeTogdHJhY2sucmVxdWVzdGVkQnksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZmFsbGJhY2tUcmFjayA9IGZhbGxiYWNrVHJhY2tzLnRyYWNrc1swXTtcblxuICAgICAgaWYgKCFmYWxsYmFja1RyYWNrKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0oZmFsbGJhY2tUcmFjayk7XG5cbiAgICAgIGlmICghc3RyZWFtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHRyYWNrLmJyaWRnZWRUcmFjayA9IGZhbGxiYWNrVHJhY2s7XG5cbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICBpZiAoIWZhbGxiYWNrU3RyZWFtIHx8ICFmYWxsYmFja1N0cmVhbS5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgLFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZywgdHJhY2s6IFRyYWNrLCBzZWVrID0gMCwgb3B1cz86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnXG4gICAgICAuY3JlYXRlU3RyZWFtKHN0cmVhbSwge1xuICAgICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgZm10OiBvcHVzID8gJ29wdXMnIDogJ3MxNmxlJyxcbiAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiAhIXRoaXMucXVldWUucGxheWVyLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnLFxuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBgJHtlcnJ9YC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuXG4gICAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBmZm1wZWdTdHJlYW07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9XG4gIC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPVxuICAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID1cbiAgL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID1cbiAgL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9XG4gIC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPVxuICAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gIFlvdVR1YmU6IFsneW91dHViZS5jb20nLCAneW91dHUuYmUnLCAnbXVzaWMueW91dHViZS5jb20nLCAnZ2FtaW5nLnlvdXR1YmUuY29tJywgJ3d3dy55b3V0dWJlLmNvbScsICdtLnlvdXR1YmUuY29tJ10sXG4gIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ10sXG59O1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IHJlZGlyZWN0RG9tYWlucyA9IG5ldyBTZXQoW1xuICAgIC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkubGlua1xcL1tBLVphLXowLTldKyQvLFxuICAgIC9eaHR0cHM6XFwvXFwvb25cXC5zb3VuZGNsb3VkXFwuY29tXFwvW2EtekEtWjEtOV17MCwxN30kL1xuXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRRdWVyeSB7XG4gIHR5cGU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbiAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBRdWVyeSByZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3BvdGlmeUFsYnVtUmVnZXgsXG4gICAgICBzcG90aWZ5UGxheWxpc3RSZWdleCxcbiAgICAgIHNwb3RpZnlTb25nUmVnZXgsXG4gICAgICB2aW1lb1JlZ2V4LFxuICAgICAgcmV2ZXJibmF0aW9uUmVnZXgsXG4gICAgICBhdHRhY2htZW50UmVnZXgsXG4gICAgICBhcHBsZU11c2ljQWxidW1SZWdleCxcbiAgICAgIGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY1NvbmdSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRUcmFja1JlZ2V4LFxuICAgICAgc291bmRjbG91ZFBsYXlsaXN0UmVnZXgsXG4gICAgICB5b3V0dWJlUGxheWxpc3RSZWdleCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1yZXNvbHZlIHJlZGlyZWN0IHVybHNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgIGlmICgvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmFwcC5saW5rXFwvKC4rKSQvLnRlc3QocmVzLnVybCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYm9keS5zcGxpdCgnaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLycpWzFdLnNwbGl0KCc/c2k9JylbMF07XG5cbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSBicmVhaztcblxuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJHt0YXJnZXR9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1heERlcHRoIDwgMSA/IHJlcy51cmwgOiB0aGlzLnByZVJlc29sdmUocmVzLnVybCwgbWF4RGVwdGggLSAxKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGdpdmVuIHNlYXJjaCBxdWVyeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqL1xuICBzdGF0aWMgcmVzb2x2ZShcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gsXG4gICk6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5GT19SRVFVSVJFRCgncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gKHR5cGU6IHR5cGVvZiBmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnk6IHN0cmluZykgPT4gKHsgdHlwZSwgcXVlcnkgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChxdWVyeSk7XG5cbiAgICAgIGlmIChEb21haW5zTWFwLllvdVR1YmUuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvKG0odXNpYyk/fGdhbWluZylcXC4vLCAnJykudHJpbSgpO1xuICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgY29uc3QgdmlkZW9JZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd2Jyk7XG4gICAgICAgIGlmIChwbGF5bGlzdElkKSB7XG4gICAgICAgICAgaWYgKHZpZGVvSWQgJiYgcGxheWxpc3RJZC5zdGFydHNXaXRoKCdSRCcpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgICBRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCxcbiAgICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUXVlcnlSZXNvbHZlci52YWxpZGF0ZUlkKHF1ZXJ5KSB8fCBRdWVyeVJlc29sdmVyLnZhbGlkYXRlVVJMKHF1ZXJ5KSlcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID8gcXVlcnkuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgOiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVVSTChxOiBzdHJpbmcpIHtcbiAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgfVxufVxuXG5leHBvcnQgeyBRdWVyeVJlc29sdmVyIH07XG4iLCAiaW1wb3J0IHsgU25vd2ZsYWtlVXRpbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgdHlwZSBBc3luY1F1ZXVlRXhjZXB0aW9uSGFuZGxlciA9IChleGNlcHRpb246IEVycm9yKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZSB7XG4gIC8qKlxuICAgKiBUaGUgcXVldWVkIGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgcHVibGljIGV4Y2VwdGlvbkhhbmRsZXI/OiBBc3luY1F1ZXVlRXhjZXB0aW9uSGFuZGxlcjtcblxuICAvKipcbiAgICogQ2xlYXIgZW50cmllcyBxdWV1ZVxuICAgKiBAcGFyYW0gY29uc3VtZSBXaGV0aGVyIG9yIG5vdCB0byBjb25zdW1lIGFsbCBlbnRyaWVzIGJlZm9yZSBjbGVhcmluZ1xuICAgKi9cbiAgcHVibGljIGNsZWFyKGNvbnN1bWUgPSBmYWxzZSkge1xuICAgIGlmIChjb25zdW1lKSB7XG4gICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNvbnN1bWUoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzID0gW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgcXVldWUuIFJldHVybnMgYDBgIGlmIG5vIGVudHJpZXMgYXJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIGFuIGVudHJ5LlxuICAgKlxuICAgKiBAZXhhbXBsZSAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgKiBjb25zdCBlbnRyeSA9IGFzeW5jUXVldWUuYWNxdWlyZSgpO1xuICAgKiAvLyB3YWl0IHVudGlsIHByZXZpb3VzIHRhc2sgaXMgY29tcGxldGVkXG4gICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICogLy8gZG8gc29tZXRoaW5nIGV4cGVuc2l2ZVxuICAgKiBhd2FpdCBwZXJmb3JtU29tZXRoaW5nRXhwZW5zaXZlKCk7XG4gICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgKiBhc3luY1F1ZXVlLnJlbGVhc2UoKTtcbiAgICpcbiAgICovXG4gIHB1YmxpYyBhY3F1aXJlKG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuZXhjZXB0aW9uSGFuZGxlcikgZW50cnkuZ2V0VGFzaygpLmNhdGNoKHRoaXMuZXhjZXB0aW9uSGFuZGxlcik7XG5cbiAgICBpZiAodGhpcy5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgZW50cnkuY29uc3VtZSgpO1xuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgY3VycmVudCBhY3F1aXNpdGlvbiBhbmQgbW92ZSB0byBuZXh0IGVudHJ5LlxuICAgKi9cbiAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVudHJpZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLmVudHJpZXMuc2hpZnQoKTtcbiAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyBjYW5jZWxBbGwoKSB7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5OiBBc3luY1F1ZXVlRW50cnkpIHtcbiAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgIGlmIChlbnRyeUlkeCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoZW50cnlJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlRW50cnkge1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBwdWJsaWMgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgb25BYm9ydDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVqZWN0ITogKGVycjogRXJyb3IpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSwgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdW1lKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5jb25zdW1lKCk7XG4gICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXIsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEZGbXBlZ1N0cmVhbU9wdGlvbnMsIGNyZWF0ZUZGbXBlZ1N0cmVhbSB9IGZyb20gJy4uL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5ULFxuICAgIH0sXG4gICAgKF8sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogYXJyW2ldID8gYXJyW2ldIC8gMzAgOiAwLFxuICAgIH0pLFxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAgIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC03LjIsIC03LjIsIC03LjIsIC05LjYsXG4gIF0pLFxuICBDbHViOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA4LjAsIDUuNiwgNS42LCA1LjYsIDMuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICBEYW5jZTogbWFrZUJhbmRzKFs5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgRnVsbEJhc3M6IG1ha2VCYW5kcyhbLTguMCwgOS42LCA5LjYsIDUuNiwgMS42LCAtNC4wLCAtOC4wLCAtMTAuNCwgLTExLjIsIC0xMS4yXSksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoWzcuMiwgNS42LCAtMS4xMTAyMmUtMTUsIC03LjIsIC00LjgsIDEuNiwgOC4wLCAxMS4yLCAxMi4wLCAxMi4wXSksXG4gIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XSksXG4gIEhlYWRwaG9uZXM6IG1ha2VCYW5kcyhbNC44LCAxMS4yLCA1LjYsIC0zLjIsIC0yLjQsIDEuNiwgNC44LCA5LjYsIDEyLjgsIDE0LjRdKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoWzEwLjQsIDEwLjQsIDUuNiwgNS42LCAtMS4xMTAyMmUtMTUsIC00LjgsIC00LjgsIC00LjgsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICBQYXJ0eTogbWFrZUJhbmRzKFtcbiAgICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjIsXG4gIF0pLFxuICBQb3A6IG1ha2VCYW5kcyhbLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdKSxcbiAgUmVnZ2FlOiBtYWtlQmFuZHMoW1xuICAgIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC0xLjExMDIyZS0xNSwgNi40LCA2LjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsXG4gIF0pLFxuICBSb2NrOiBtYWtlQmFuZHMoWzguMCwgNC44LCAtNS42LCAtOC4wLCAtMy4yLCA0LjAsIDguOCwgMTEuMiwgMTEuMiwgMTEuMl0pLFxuICBTa2E6IG1ha2VCYW5kcyhbLTIuNCwgLTQuOCwgLTQuMCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgOC44LCA5LjYsIDExLjIsIDkuNl0pLFxuICBTb2Z0OiBtYWtlQmFuZHMoWzQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF0pLFxuICBTb2Z0Um9jazogbWFrZUJhbmRzKFs0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdKSxcbiAgVGVjaG5vOiBtYWtlQmFuZHMoWzguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC01LjYsIC00LjgsIC0xLjExMDIyZS0xNSwgOC4wLCA5LjYsIDkuNiwgOC44XSksXG59KTtcblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSB1bmtub3duPiB7XG4gICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNraXBwYWJsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLmFmLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gIH1cblxuICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgIC8vIHNraXAgaWYgZmlsdGVycyBhcmUgdGhlIHNhbWVcbiAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICAgIHRoaXMuZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJykgJiZcbiAgICAgICFmaWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKTtcbiAgICBjb25zdCBzZWVrVGltZSA9IHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMpPy5jdXJyZW50LnZhbHVlIHx8IDA7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gWy4uLm5ldyBTZXQoZmlsdGVycyldO1xuXG4gICAgcmV0dXJuIHRoaXMuYWYudHJpZ2dlclJlcGxheShzZWVrVGltZSkudGhlbigodCkgPT4ge1xuICAgICAgcXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLCBxdWV1ZSwgcHJldiwgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpKTtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICovXG4gIHB1YmxpYyBzZXRJbnB1dEFyZ3MoYXJnczogc3RyaW5nW10pIHtcbiAgICBpZiAoIWFyZ3MuZXZlcnkoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpKVxuICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnYXJncycsICdBcnJheTxzdHJpbmc+JywgJ2ludmFsaWQgaXRlbShzKScpO1xuICAgIHRoaXMuI2lucHV0QXJncyA9IGFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGlucHV0IGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgIHJldHVybiB0aGlzLiNpbnB1dEFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVuY29kZXIgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBlbmNvZGVyQXJncygpIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBbJy1hZicsIHRoaXMudG9TdHJpbmcoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbmFsIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFyZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzdHJlYW0gc291cmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVN0cmVhbShzb3VyY2U6IHN0cmluZyB8IFJlYWRhYmxlLCBvcHRpb25zOiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgIHJldHVybiBjcmVhdGVGRm1wZWdTdHJlYW0oc291cmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSB8IFJlY29yZDxGaWx0ZXJzLCBib29sZWFuPiB8IHN0cmluZ1tdIHwgYm9vbGVhbikge1xuICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXJzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIF9maWx0ZXJzID0gIWZpbHRlcnMgPyBbXSA6IChPYmplY3Qua2V5cyhBdWRpb0ZpbHRlcnMuZmlsdGVycykgYXMgRmlsdGVyc1tdKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcbiAgICAgIF9maWx0ZXJzID0gZmlsdGVycyBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycylcbiAgICAgICAgLmZpbHRlcigocmVzKSA9PiByZXNbMV0gPT09IHRydWUpXG4gICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnModGhpcy4jZmZtcGVnRmlsdGVycy5maWx0ZXIoKHIpID0+ICFmaWx0ZXJzLmluY2x1ZGVzKHIpKS5jb25jYXQoZnJlc2gpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGVmYXVsdCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBmZiBGaWx0ZXJzIGxpc3RcbiAgICovXG4gIHB1YmxpYyBzZXREZWZhdWx0cyhmZjogRmlsdGVyc1tdKSB7XG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaXN0IG9mIGRpc2FibGVkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5uYW1lcy5maWx0ZXIoKGYpID0+ICF0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGYpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGVuYWJsZWRcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAqL1xuICBwdWJsaWMgaXNFbmFibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZGlzYWJsZWRcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAqL1xuICBwdWJsaWMgaXNEaXNhYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHRlc3RcbiAgICovXG4gIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLmhhcyhmaWx0ZXIgYXMgRmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gYXJyYXlcbiAgICovXG4gIHB1YmxpYyB0b0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgY29uc3Qgb2JqID0ge30gYXMgUmVjb3JkPGtleW9mIFF1ZXVlRmlsdGVycywgc3RyaW5nPjtcblxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgIGJpcXVhZDogbnVsbCxcbiAgICBlcXVhbGl6ZXI6IFtdLFxuICAgIGZpbHRlcnM6IFtdLFxuICAgIHZvbHVtZTogMTAwLFxuICAgIHNhbXBsZVJhdGU6IC0xLFxuICB9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgLy8gICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWcpIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZ2l0YWwgYmlxdWFkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERTUCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgKi9cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzYW1wbGVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5IGN1cnJlbnQgdHJhY2sgaW4gdHJhbnNpdGlvbiBtb2RlXG4gICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJpZ2dlclJlcGxheShzZWVrID0gMCkge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodGhpcy5xdWV1ZS5jdXJyZW50VHJhY2ssIHtcbiAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICBzZWVrLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBRmlsdGVyR3JhcGg8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWc/LmZpbHRlcnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBtLFxuICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gKHRoaXMuYWYuYmlxdWFkPy5nZXRGaWx0ZXJOYW1lKCkgYXMgRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbCkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICB9XG5cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgIHJldHVybiB7XG4gICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDAsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgZmZtcGVnOiBGaWx0ZXJzW107XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgZm10Pzogc3RyaW5nO1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICBzZWVrPzogbnVtYmVyO1xuICBza2lwPzogYm9vbGVhbjtcbiAgY29va2llcz86IHN0cmluZztcbiAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZ2V0RkZtcGVnUHJvdmlkZXIgPSAobGVnYWN5ID0gZmFsc2UpID0+XG4gIGxlZ2FjeSA/IChwcmlzbSBhcyB0eXBlb2YgcHJpc20gJiB7IGRlZmF1bHQ6IHR5cGVvZiBwcmlzbSB9KS5kZWZhdWx0Py5GRm1wZWcgfHwgcHJpc20uRkZtcGVnIDogRkZtcGVnO1xuXG5jb25zdCByZXNvbHZlQXJncyA9IChjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ+KTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZmlnKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBhY2M7XG4gICAgYWNjLnB1c2goYC0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSBhcyBzdHJpbmdbXSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgY29uc3QgYXJncyA9IHJlc29sdmVBcmdzKHtcbiAgICByZWNvbm5lY3Q6IDEsXG4gICAgcmVjb25uZWN0X3N0cmVhbWVkOiAxLFxuICAgIHJlY29ubmVjdF9kZWxheV9tYXg6IDUsXG4gICAgaTogc3RyZWFtLFxuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgY29va2llczogdHlwZW9mIGNvb2tpZXMgPT09ICdzdHJpbmcnID8gKCFjb29raWVzLmluY2x1ZGVzKCcgJykgPyBjb29raWVzIDogYFwiJHtjb29raWVzfVwiYCkgOiBudWxsLFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gcmVzb2x2ZUFyZ3Moe1xuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gIH0pO1xuXG4gIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gIG9wdGlvbnMgPz89IHt9O1xuICBjb25zdCBhcmdzID1cbiAgICB0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJ1xuICAgICAgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKVxuICAgICAgOiBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgY29uc3QgRkZNUEVHID0gZ2V0RkZtcGVnUHJvdmlkZXIoISFvcHRpb25zLnVzZUxlZ2FjeUZGbXBlZyk7XG5cbiAgY29uc3QgdHJhbnNjb2RlcjogRHVwbGV4ID0gbmV3IEZGTVBFRyh7IHNoZWxsOiBmYWxzZSwgYXJncyB9KTtcblxuICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RyZWFtLnBpcGUodHJhbnNjb2RlciBhcyBhbnkpO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gIGxhdGVuY3k6IHtcbiAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICB2b2ljZUNvbm5lY3Rpb246IG51bWJlcjtcbiAgfTtcbiAgc3RhdHVzOiB7XG4gICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgcGF1c2VkOiBib29sZWFuO1xuICAgIGlkbGU6IGJvb2xlYW47XG4gIH07XG4gIHRyYWNrc0NvdW50OiBudW1iZXI7XG4gIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gIGV4dHJhY3RvcnM6IG51bWJlcjtcbiAgbGlzdGVuZXJzOiBudW1iZXI7XG4gIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gIHZlcnNpb25zOiB7XG4gICAgbm9kZTogc3RyaW5nO1xuICAgIHBsYXllcjogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAvKipcbiAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGVuY3k6IHtcbiAgICAgICAgZXZlbnRMb29wOiB0aGlzLnF1ZXVlLnBsYXllci5ldmVudExvb3BMYWcsXG4gICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nLFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBidWZmZXJpbmc6IHRoaXMucXVldWUubm9kZS5pc0J1ZmZlcmluZygpLFxuICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgIHBhdXNlZDogdGhpcy5xdWV1ZS5ub2RlLmlzUGF1c2VkKCksXG4gICAgICAgIGlkbGU6IHRoaXMucXVldWUubm9kZS5pc0lkbGUoKSxcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICBwbGF5ZXI6ICc3LjAuMC1kZXYuNScsXG4gICAgICB9LFxuICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7IHRpbWVzdGFtcDogbnVtYmVyOyBsaW5lOiBzdHJpbmcgfTtcblxuY29uc3QgdGltZXN0YW1wUGF0dGVybiA9IC9cXFsoXFxkezJ9KTooXFxkezJ9KVxcLihcXGR7Mn0pXFxdLztcblxuZXhwb3J0IGNsYXNzIFN5bmNlZEx5cmljc1Byb3ZpZGVyIHtcbiAgI2xvb3A6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICNjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2sgfCBudWxsID0gbnVsbDtcbiAgI29uVW5zdWJzY3JpYmU6IFVuc3Vic2NyaWJlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGludGVydmFsID0gMTAwO1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzOiBMeXJpY3NEYXRhID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSByYXc/OiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICBpZiAocmF3Py5zeW5jZWRMeXJpY3MpIHRoaXMubG9hZChyYXc/LnN5bmNlZEx5cmljcyk7XG4gIH1cblxuICBwdWJsaWMgaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWxsYmFjayAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGx5cmljczogc3RyaW5nKSB7XG4gICAgaWYgKCFseXJpY3MpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9FWElTVElORygnc3luY2VkTHlyaWNzJyk7XG5cbiAgICB0aGlzLmx5cmljcy5jbGVhcigpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IGxpbmVzID0gbHlyaWNzLnNwbGl0KCdcXG4nKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHRpbWVzdGFtcFBhdHRlcm4pO1xuXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgWywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzXSA9IG1hdGNoO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJzZUludChtaW51dGVzKSAqIDYwICogMTAwMCArIHBhcnNlSW50KHNlY29uZHMpICogMTAwMCArIHBhcnNlSW50KG1pbGxpc2Vjb25kcyk7XG5cbiAgICAgICAgdGhpcy5seXJpY3Muc2V0KHRpbWVzdGFtcCwgbGluZS5yZXBsYWNlKHRpbWVzdGFtcFBhdHRlcm4sICcnKS50cmltKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBseXJpY3MgYXQgYSBzcGVjaWZpYyB0aW1lIG9yIGF0IHRoZSBjbG9zZXN0IHRpbWUgKFx1MDBCMTIgc2Vjb25kcylcbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgYXQodGltZTogbnVtYmVyKTogTHlyaWNzQXQgfCBudWxsIHtcbiAgICBjb25zdCBsb3dlc3RUaW1lID0gdGhpcy5seXJpY3Mua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAobG93ZXN0VGltZSA9PSBudWxsIHx8IHRpbWUgPCBsb3dlc3RUaW1lKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5seXJpY3MuaGFzKHRpbWUpKSByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMubHlyaWNzLmtleXMoKSk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+IChNYXRoLmFicyhiIC0gdGltZSkgPCBNYXRoLmFicyhhIC0gdGltZSkgPyBiIDogYSkpO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKGxhc3RWYWx1ZSAhPT0gbnVsbCAmJiBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiYgbHlyaWNzLnRpbWVzdGFtcCA9PT0gbGFzdFZhbHVlLnRpbWVzdGFtcCkgcmV0dXJuO1xuXG4gICAgICBsYXN0VmFsdWUgPSBseXJpY3M7XG5cbiAgICAgIHRoaXMuI2NhbGxiYWNrKGx5cmljcy5saW5lLCBseXJpY3MudGltZXN0YW1wKTtcbiAgICB9LCB0aGlzLmludGVydmFsKS51bnJlZigpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi9Bc3luY1F1ZXVlJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEVudGl0eSA9ICgpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG5leHBvcnQgY2xhc3MgU2VxdWVudGlhbEJ1Y2tldCB7XG4gIHB1YmxpYyBsaW1pdCA9IDE7XG4gIHB1YmxpYyByZW1haW5pbmcgPSAxO1xuICBwdWJsaWMgcmVzZXRBZnRlciA9IDA7XG4gIHB1YmxpYyBxdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gIHB1YmxpYyBNQVhfUkVUUklFUyA9IDU7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgYnVja2V0IGlzIHJhdGUgbGltaXRlZC5cbiAgICovXG4gIHB1YmxpYyBpc1JhdGVMaW1pdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnJlbWFpbmluZyA8PSAwICYmIERhdGUubm93KCkgPCB0aGlzLnJlc2V0QWZ0ZXI7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IGZ1bmN0aW9uIHRvIGVucXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnF1ZXVlKHJlcTogUmVxdWVzdEVudGl0eSkge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5hY3F1aXJlKCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVudHJ5LnJlbGVhc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZXF1ZXN0KHJlcTogUmVxdWVzdEVudGl0eSwgcmV0cmllcyA9IDApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgd2hpbGUgKHRoaXMuaXNSYXRlTGltaXRlZCgpKSB7XG4gICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICBhd2FpdCBzZXRUaW1lb3V0KHJlc2V0KTtcbiAgICB9XG5cbiAgICBsZXQgcGFzcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcSgpO1xuXG4gICAgICB0aGlzLl9wYXRjaEhlYWRlcnMocmVzKTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBsZXQgZXJyOiBFcnJvcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHk6IHtcbiAgICAgICAgICAgIGNvZGU6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICB9ID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGJvZHkubWVzc2FnZSkgYXMgRXJyb3IgJiB7IGNvZGU6IG51bWJlciB9O1xuXG4gICAgICAgICAgZXJyb3IubmFtZSA9IGJvZHkubmFtZTtcbiAgICAgICAgICBlcnJvci5jb2RlID0gYm9keS5jb2RlO1xuXG4gICAgICAgICAgZXJyID0gZXJyb3I7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihgSFRUUCBFcnJvcjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFzcyA9IHRydWU7XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChwYXNzKSB0aHJvdyBlO1xuXG4gICAgICBjb25zdCBiYWRSZXEgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgL0Vycm9yOiA0WzAtOV17Mn0vLnRlc3QoZS5tZXNzYWdlKTtcblxuICAgICAgaWYgKCFiYWRSZXEgJiYgcmV0cmllcyA8IHRoaXMuTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxLCArK3JldHJpZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhdGNoSGVhZGVycyhyZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1MaW1pdCcpKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKSk7XG4gICAgY29uc3QgcmVzZXRBZnRlciA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgU2VxdWVudGlhbEJ1Y2tldCB9IGZyb20gJy4uL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcXVlcnkgdG8gc2VhcmNoIGZvci4gRWl0aGVyIHRoaXMgb3IgdHJhY2tOYW1lIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBuYW1lIHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHF1ZXJ5IGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgdHJhY2tOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFsYnVtTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMcmNHZXRQYXJhbXMgZXh0ZW5kcyBSZXF1aXJlZDxPbWl0PExyY1NlYXJjaFBhcmFtcywgJ3F1ZXJ5Jz4+IHtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmNvbnN0IHRvU25ha2VDYXNlID0gKG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCBzbmFrZU9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbmV3S2V5ID0ga2V5LnJlcGxhY2UoL1tBLVpdL2csIChsZXR0ZXIpID0+IGBfJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gKTtcbiAgICBzbmFrZU9ialtuZXdLZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gc25ha2VPYmo7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgY3JlYXRlUXVlcnkgPSAocGFyYW1zOiBhbnkpID0+IG5ldyBVUkxTZWFyY2hQYXJhbXModG9TbmFrZUNhc2UocGFyYW1zKSkudG9TdHJpbmcoKTtcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRyYWNrIG5hbWVcbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgdHJhY2tOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFsYnVtTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBpbnN0cnVtZW50YWw6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgcGxhaW5MeXJpY3M6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBzeW5jZWRMeXJpY3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExyY0dldFJlc3VsdCA9IE9taXQ8THJjU2VhcmNoUmVzdWx0LCAnbmFtZSc+O1xuXG5leHBvcnQgY2xhc3MgTHJjTGliIHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgVVJMXG4gICAqL1xuICBwdWJsaWMgYXBpID0gJ2h0dHBzOi8vbHJjbGliLm5ldC9hcGknO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgdGltZW91dC4gRGVmYXVsdCBpcyAxNSBzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIHRpbWVvdXQgPSAxNV8wMDA7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBidWNrZXQgPSBuZXcgU2VxdWVudGlhbEJ1Y2tldCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExyY0xpYiBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlcXVlc3QgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0VGltZW91dCh0aW1lb3V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJldHJ5IGxpbWl0LiBEZWZhdWx0IGlzIDUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgcmV0cnkgbGltaXRcbiAgICovXG4gIHB1YmxpYyBzZXRSZXRyeUxpbWl0KGxpbWl0OiBudW1iZXIpIHtcbiAgICB0aGlzLmJ1Y2tldC5NQVhfUkVUUklFUyA9IGxpbWl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBnZXQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICBjb25zdCBwYXRoID0gYGdldD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGx5cmljcyBieSBJRFxuICAgKiBAcGFyYW0gaWQgVGhlIGx5cmljcyBJRFxuICAgKi9cbiAgcHVibGljIGdldEJ5SWQoaWQ6IGAke251bWJlcn1gIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KGBnZXQvJHtpZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNhY2hlZCBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldENhY2hlZChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0LWNhY2hlZD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIHNlYXJjaCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBzZWFyY2gocGFyYW1zOiBMcmNTZWFyY2hQYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcy5xICYmICFwYXJhbXMudHJhY2tOYW1lKSB7XG4gICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKFxuICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgJ3N0cmluZycsXG4gICAgICAgIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJyksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBgc2VhcmNoPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHRbXT4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgdGhlIEFQSVxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aFxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8VD4ge1xuICAgIGxldCB0aW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3QgZGlzcGF0Y2hlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSwgdGhpcy50aW1lb3V0KS51bnJlZigpO1xuXG4gICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IFV0aWwuZ2V0UnVudGltZSgpO1xuXG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdVc2VyLUFnZW50JzogYERpc2NvcmQtUGxheWVyLyR7dGhpcy5wbGF5ZXIudmVyc2lvbn0gJHtydW50aW1lVmVyc2lvbiA/PyAnJ31gLnRyaW1FbmQoKSxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgW0xyY0xpYl0gUmVxdWVzdGluZyAke3BhdGh9YCk7XG5cbiAgICAgIHJldHVybiBmZXRjaChgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCwgaW5pdCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICBpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICBqb2luVm9pY2VDaGFubmVsLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBBdWRpb1BsYXllcixcbn0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAvKipcbiAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAvKipcbiAgICogVGhlIHZvaWNlIHV0aWxzIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gICAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICBncm91cD86IHN0cmluZztcbiAgICB9LFxuICApOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgpO1xuICAgIGNvbnN0IGNvbm4gPSBhd2FpdCB0aGlzLmpvaW4oY2hhbm5lbCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICByZXR1cm4gc3ViO1xuICB9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbFxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtWb2ljZUNvbm5lY3Rpb259XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgam9pbihcbiAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29ubmVjdGlvbiA9IHRoaXMuZ2V0Q29ubmVjdGlvbihjaGFubmVsLmd1aWxkLmlkLCBvcHRpb25zPy5ncm91cCk7XG5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgICAgZXhpc3RpbmdDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZFxuICAgICkge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQudm9pY2VBZGFwdGVyQ3JlYXRvciBhcyB1bmtub3duIGFzIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gICAgICBzZWxmRGVhZjogQm9vbGVhbihvcHRpb25zPy5kZWFmKSxcbiAgICAgIGRlYnVnOiB0aGlzLnBsYXllci5ldmVudHMubGlzdGVuZXJDb3VudCgnZGVidWcnKSA+IDAsXG4gICAgICBncm91cDogb3B0aW9ucz8uZ3JvdXAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29ubjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIGRpc2Nvbm5lY3QoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uIHwgU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy9cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7U25vd2ZsYWtlfSBndWlsZCBUaGUgZ3VpbGQgaWRcbiAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29ubmVjdGlvbihndWlsZDogU25vd2ZsYWtlLCBncm91cD86IHN0cmluZykge1xuICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgfVxufVxuXG5leHBvcnQgeyBWb2ljZVV0aWxzIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpOiBQcm9taXNlPHZvaWQ+O1xuICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBwbGF5ZXI6IFBsYXllcixcbiAgICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VULFxuICAgIH0sXG4gICkge1xuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmNsZWFudXAuYmluZCh0aGlzKSwgdGhpcy5jaGVja0ludGVydmFsKS51bnJlZigpO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2hlY2tJbnRlcnZhbCA/PyBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyKCkge1xuICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLiNkZWZhdWx0Q2FjaGUudmFsdWVzKCldO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICB9KTtcblxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgZXhwaXJlQWZ0ZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRhdGE6IFQsIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKSB7XG4gICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fCBpc05hTih0aGlzLmV4cGlyZUFmdGVyKSB8fCB0aGlzLmV4cGlyZUFmdGVyIDwgMSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0IHtcbiAgcXVlcnk6IHN0cmluZztcbiAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBgZXh0OiR7c3RyaW5nfWA7XG59XG4iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIFNub3dmbGFrZVV0aWwsXG4gIFZvaWNlU3RhdGUsXG4gIEludGVudHNCaXRGaWVsZCxcbiAgVXNlcixcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24sXG4gIEV2ZW50cyxcbn0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFNlYXJjaFJlc3VsdCB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWVFdmVudHMsXG4gIFZvaWNlQ29ubmVjdENvbmZpZyxcbiAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgR3VpbGROb2RlTWFuYWdlcixcbiAgR3VpbGRRdWV1ZSxcbiAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgR3VpbGRRdWV1ZUV2ZW50LFxufSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHtcbiAgUGxheWVyRXZlbnRzLFxuICBRdWVyeVR5cGUsXG4gIFNlYXJjaE9wdGlvbnMsXG4gIFBsYXllckluaXRPcHRpb25zLFxuICBQbGF5bGlzdEluaXREYXRhLFxuICBTZWFyY2hRdWVyeVR5cGUsXG4gIFBsYXllckV2ZW50LFxufSBmcm9tICcuL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIsIFJlc29sdmVkUXVlcnkgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24gfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBRdWVyeUNhY2hlIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcbmltcG9ydCB7IENvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IEhvb2tzQ3R4LCBTVVBFUl9DT05URVhUIH0gZnJvbSAnLi9ob29rcy9jb21tb24nO1xuaW1wb3J0IHsgTHJjTGliIH0gZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB7IGdldENvbXBhdE5hbWUsIGlzQ2xpZW50UHJveHkgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIHRyYWNrOiBUcmFjaztcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQ7XG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUcmFja0xpa2UgPSBzdHJpbmcgfCBUcmFjayB8IFNlYXJjaFJlc3VsdCB8IFRyYWNrW10gfCBQbGF5bGlzdDtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChcbiAgcGxheWVyOiBQbGF5ZXIsXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBvbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxuICBuZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxuKSA9PiBBd2FpdGVkPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgI2xhc3RMYXRlbmN5ID0gLTE7XG4gICN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIgPSB0aGlzLmhhbmRsZVZvaWNlU3RhdGUuYmluZCh0aGlzKTtcbiAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWwhOiBOb2RlSlMuVGltZW91dDtcbiAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICNob29rc0N0eDogQ29udGV4dDxIb29rc0N0eD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIGRpc2NvcmQtcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9ICc3LjAuMC1kZXYuNSc7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwbGF5ZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAvKipcbiAgICogVGhlIGRpc2NvcmQuanMgY2xpZW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50ITogQ2xpZW50O1xuICAvKipcbiAgICogVGhlIHBsYXllciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyE6IFBsYXllckluaXRPcHRpb25zO1xuICAvKipcbiAgICogVGhlIHBsYXllciBub2RlcyAocXVldWUpIG1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBub2RlcyA9IG5ldyBHdWlsZE5vZGVNYW5hZ2VyKHRoaXMpO1xuICAvKipcbiAgICogVGhlIHZvaWNlIGFwaSB1dGlsaXRpZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgZXh0cmFjdG9ycyBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgZXh0cmFjdG9ycyA9IG5ldyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0KHRoaXMpO1xuICAvKipcbiAgICogVGhlIHBsYXllciBldmVudHMgY2hhbm5lbFxuICAgKi9cbiAgcHVibGljIGV2ZW50cyA9IG5ldyBQbGF5ZXJFdmVudHNFbWl0dGVyPEd1aWxkUXVldWVFdmVudHM+KFtHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl0pO1xuICAvKipcbiAgICogVGhlIHBsYXllciB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9IFBsYXllci52ZXJzaW9uO1xuICAvKipcbiAgICogVGhlIGx5cmljcyBhcGlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBseXJpY3MgPSBuZXcgTHJjTGliKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IFRoZSBEaXNjb3JkIENsaWVudFxuICAgKiBAcGFyYW0ge1BsYXllckluaXRPcHRpb25zfSBbb3B0aW9uc10gVGhlIHBsYXllciBpbml0IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgb3B0aW9uczogUGxheWVySW5pdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKFtQbGF5ZXJFdmVudC5FcnJvcl0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZmZtcGVnUGF0aCkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGggIT09ICdzdHJpbmcnKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgZm9yIG9wdGlvbnMuZmZtcGVnUGF0aC4gR290ICR7dHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aH0gaW5zdGVhZGApO1xuXG4gICAgICBwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCA9IG9wdGlvbnMuZmZtcGVnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NvbXBhdE1vZGUgPSBpc0NsaWVudFByb3h5KGNsaWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZCBjbGllbnRcbiAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAqL1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudCkpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICBgQ2xpZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBkaXNjb3JkLmpzQCR7ZGpzVmVyc2lvbn0gY2xpZW50LCBzb21lIHRoaW5ncyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGNvcnJ1cHQgZGVwZW5kZW5jaWVzIG9yIGhhdmluZyBtdWx0aXBsZSBpbnN0YWxsYXRpb25zIG9mIGRpc2NvcmQuanMuYCxcbiAgICAgICAgICAgICdJbnZhbGlkQ2xpZW50SW5zdGFuY2UnLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpYmYgPVxuICAgICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyBpbnN0YW5jZW9mIEludGVudHNCaXRGaWVsZFxuICAgICAgICAgICAgPyB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHNcbiAgICAgICAgICAgIDogbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBub29wXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICBxdWVyeUNhY2hlOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgPyBudWxsIDogb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgdXNlTGVnYWN5RkZtcGVnOiBmYWxzZSxcbiAgICAgIHNraXBGRm1wZWc6IHRydWUsXG4gICAgICBwcm9iZVRpbWVvdXQ6IDUwMDAsXG4gICAgICBvdmVycmlkZUZhbGxiYWNrQ29udGV4dDogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgIGlmICghaXNDb21wYXRNb2RlKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICB0aGlzLmNsaWVudC5pbmNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuY2xpZW50Lm9uKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICAgIHRoaXMuY2xpZW50Ll9fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSh0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBhdHRhY2ggdm9pY2Ugc3RhdGUgdXBkYXRlIHByb3h5LCB2b2ljZSBzdGF0ZSBoYW5kbGVyIHdpbGwgbm90IHdvcmsgcHJvcGVybHknLFxuICAgICAgICAgICdDb21wYXRNb2RlRXJyb3InLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMCkge1xuICAgICAgdGhpcy4jbGFnTW9uaXRvckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2xhc3RMYXRlbmN5ID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbGF5ZXIgaXMgaW4gY29tcGF0aWJpbGl0eSBtb2RlLiBDb21wYXRpYmlsaXR5IG1vZGUgaXMgZW5hYmxlZCB3aGVuIG5vbi1kaXNjb3JkLmpzIGNsaWVudCBpcyB1c2VkLlxuICAgKi9cbiAgcHVibGljIGlzQ29tcGF0TW9kZSgpIHtcbiAgICByZXR1cm4gaXNDbGllbnRQcm94eSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSBldmVyeSBzaW5nbGUgcXVldWVzIG1hbmFnZWQgYnkgdGhpcyBtYXN0ZXIgcGxheWVyIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gdXNlIG1lIHdoZW4geW91IHdhbnQgdG8gaW1tZWRpYXRlbHkgdGVybWluYXRlIGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgaW4gZXhpc3RlbmNlIFx1RDgzRFx1REQyQVxuICAgKiBhd2FpdCBwbGF5ZXIuZGVzdHJveSgpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgIHRoaXMubm9kZXMuY2FjaGUuZm9yRWFjaCgobm9kZSkgPT4gbm9kZS5kZWxldGUoKSk7XG5cbiAgICBpZiAoIXRoaXMuaXNDb21wYXRNb2RlKCkpIHtcbiAgICAgIHRoaXMuY2xpZW50Lm9mZihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgIHRoaXMuY2xpZW50LmRlY3JlbWVudE1heExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvckludGVydmFsKSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCk7XG4gICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmdldChvbGRTdGF0ZS5ndWlsZC5pZCk7XG4gICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgLy8gZGlzcGF0Y2ggdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgY29uc3Qgd2FzSGFuZGxlZCA9IHRoaXMuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGUsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgIHJldHVybiB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUodGhpcywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgKiAgIHBsYXllci5oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIsIGV2ZW4gaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhdWRpbyBwbGF5ZXJcbiAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5ZXJcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgKiBjb25zdCBxdWVyeSA9ICd0aGlzIGlzIG15IHN1cGVyIGNvb2wgc2VhcmNoIHF1ZXJ5IHRoYXQgSSB3YW50IHRvIHBsYXknO1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgICBjb25zdCB7IHRyYWNrIH0gPSBhd2FpdCBwbGF5ZXIucGxheSh2b2ljZUNoYW5uZWwsIHF1ZXJ5KTtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICogfSBjYXRjaChlKSB7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzRFx1REUyRCBGYWlsZWQgdG8gcGxheSBlcnJvciBvaCBubzpcXG5cXG4ke2V9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gICAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICAgIHF1ZXJ5OiBUcmFja0xpa2UsXG4gICAgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9LFxuICApOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSlcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoXG4gICAgICAgICdjaGFubmVsJyxcbiAgICAgICAgJ1ZvaWNlQmFzZWRDaGFubmVsJyxcbiAgICAgICAgIXZjID8gJ3VuZGVmaW5lZCcgOiBgY2hhbm5lbCB0eXBlICR7dmMudHlwZX1gLFxuICAgICAgKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsUmVzdWx0ID0gcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVChcbiAgICAgICAgYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKSBhd2FpdCBxdWV1ZS5ub2RlLnBsYXkobnVsbCwgb3B0aW9ucy5hdWRpb1BsYXllck9wdGlvbnMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCB0cmFja3NcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgKiBAcGFyYW0ge1NlYXJjaE9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlYXJjaCBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlYXJjaFJlc3VsdD59XG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2VhcmNoUXVlcnkgPSAncGFzcyB1cmwgb3IgdGV4dCBvciBkaXNjb3JkLXBsYXllciB0cmFjayBjb25zdHJ1Y3RhYmxlIG9iamVjdHMsIHdlIGdvdCB5b3UgY292ZXJlZCBcdUQ4M0RcdURFMEUnO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwbGF5ZXIuc2VhcmNoKHNlYXJjaFF1ZXJ5KTtcbiAgICpcbiAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gTG9ncyBgU2VhcmNoUmVzdWx0YCBvYmplY3RcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoKFxuICAgIHNlYXJjaFF1ZXJ5OiBzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdCxcbiAgICBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gc2VhcmNoUXVlcnk7XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgIHRyYWNrczogW3NlYXJjaFF1ZXJ5XSxcbiAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBzZWFyY2hRdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgUGxheWxpc3QpIHtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICB0cmFja3M6IHNlYXJjaFF1ZXJ5LnRyYWNrcyxcbiAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbCxcbiAgICAgIHByb3RvY29sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUTztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBTZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuc2VhcmNoRW5naW5lfSwgZmFsbGJhY2sgc2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lfWAsXG4gICAgICApO1xuXG4gICAgaWYgKC9eXFx3KzovLnRlc3Qoc2VhcmNoUXVlcnkpKSB7XG4gICAgICBjb25zdCBbcHJvdG9jb2xOYW1lLCAuLi5xdWVyeV0gPSBzZWFyY2hRdWVyeS5zcGxpdCgnOicpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKFxuICAgICAgICAoZSkgPT4gIXRoaXMuZXh0cmFjdG9ycy5pc0Rpc2FibGVkKGUuaWRlbnRpZmllcikgJiYgZS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2xOYW1lKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0V4dHJhY3Rvcikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gaXMgc3VwcG9ydGVkIGJ5ICR7bWF0Y2hpbmdFeHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIWApO1xuICAgICAgICBleHRyYWN0b3IgPSBtYXRjaGluZ0V4dHJhY3RvcjtcbiAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYCxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUT1xuICAgICAgICA/IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKVxuICAgICAgICA6ICh7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogcmVkaXJlY3RlZCB9IGFzIFJlc29sdmVkUXVlcnkpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgUXVlcnkgdHlwZSBpZGVudGlmaWVkIGFzICR7cXVlcnlUeXBlfSR7XG4gICAgICAgICAgZXh0cmFjdG9yICYmIHByb3RvY29sID8gJyBidXQgbWlnaHQgbm90IGJlIHVzZWQgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBwcm90b2NvbCcgOiAnJ1xuICAgICAgICB9YCxcbiAgICAgICk7XG5cbiAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgIGlmIChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdGFydHNXaXRoKCdleHQ6JykpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBGb3JjaW5nICR7b3B0aW9ucy5zZWFyY2hFbmdpbmUuc3Vic3RyaW5nKDQpfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgIGV4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5nZXQob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3Vic3RyaW5nKDQpKSE7XG4gICAgICBpZiAoIWV4dHJhY3RvcilcbiAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGFsbCBleHRyYWN0b3JzXG4gICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAgIChcbiAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgICAgICB9KVxuICAgICAgICApPy5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3JcbiAgICAgIC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgKGF3YWl0IGV4dC52YWxpZGF0ZShxdWVyeSkpICYmXG4gICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIH0pLFxuICAgICk7XG4gICAgaWYgKCFyZXN1bHQ/LnJlc3VsdCkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke3Jlc3VsdD8uZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgJ04vQSd9IGV4dHJhY3Rvci5gKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICB9KTtcblxuICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgYGRpc2NvcmQtdm9pcGAgbW9kdWxlLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zb2xlLmxvZyhwbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAqIC8vIC0+IGxvZ3MgZGVwZW5kZW5jaWVzIHJlcG9ydFxuICAgKiBgYGBcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHB1YmxpYyBzY2FuRGVwcygpIHtcbiAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG4gICAgY29uc3QgcnVudGltZSA9ICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgICAgbGluZSxcbiAgICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufSR7XG4gICAgICAgIHRoaXMuaXNDb21wYXRNb2RlKCkgPyBgICgke2dldENvbXBhdE5hbWUodGhpcy5jbGllbnQpfSBjb21wYXRpYmlsaXR5IG1vZGUpYCA6ICcnXG4gICAgICB9YCxcbiAgICAgIGAtIGRpc2NvcmQtdm9pcDogJHtkVm9pY2VWZXJzaW9ufWAsXG4gICAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICAgIGAtIE5vZGUgdmVyc2lvbjogJHtwcm9jZXNzLnZlcnNpb259IChEZXRlY3RlZCBSdW50aW1lOiAke3J1bnRpbWV9LCBQbGF0Zm9ybTogJHtwcm9jZXNzLnBsYXRmb3JtfSBbJHtwcm9jZXNzLmFyY2h9XSlgLFxuICAgICAgKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpIHJldHVybiAnLSBmZm1wZWc6IE4vQSAodXNpbmcgbGVnYWN5IGZmbXBlZyknO1xuICAgICAgICBjb25zdCBpbmZvID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG4gICAgICAgIGlmICghaW5mbykgcmV0dXJuICdGRm1wZWcvQXZjb252IG5vdCBmb3VuZCc7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgLSBmZm1wZWc6ICR7aW5mby52ZXJzaW9ufWAsXG4gICAgICAgICAgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCxcbiAgICAgICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgICAgICBgLSBsaWJvcHVzOiAke2luZm8ucmVzdWx0IS5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpfWAsXG4gICAgICAgIF0uam9pbignXFxuJyk7XG4gICAgICB9KSgpLFxuICAgICAgJ1xcbicsXG4gICAgICAnTG9hZGVkIEV4dHJhY3RvcnM6JyxcbiAgICAgIGxpbmUsXG4gICAgICB0aGlzLmV4dHJhY3RvcnMuc3RvcmVcbiAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgIHJldHVybiBtLmlkZW50aWZpZXI7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZVN0cmluZygpLFxuICAgIF07XG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIoXG4gIHBsYXllcjogUGxheWVyLFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlLFxuKSB7XG4gIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICB0cnkge1xuICAgICAgcXVldWUuZGVsZXRlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBub29wICovXG4gICAgfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgICAgUmVmbGVjdC5zZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknLCB0cnVlKTtcbiAgICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKSkge1xuICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChmYWxzZSk7XG4gICAgICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgICAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICBpZiAobmV3U3RhdGUuc2VydmVyTXV0ZSAhPSBudWxsICYmIG9sZFN0YXRlLnNlcnZlck11dGUgIT09IG5ld1N0YXRlLnNlcnZlck11dGUpIHtcbiAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnNlcnZlck11dGUpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgICAgIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiZcbiAgICAgIG9sZFN0YXRlLnN1cHByZXNzICE9PSBuZXdTdGF0ZS5zdXBwcmVzc1xuICAgICkge1xuICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICAgIG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICB9XG5cbiAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAobmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSBxdWV1ZS5jaGFubmVsID0gbmV3U3RhdGUuY2hhbm5lbCE7XG4gICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKTtcbiAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uICYmICFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISk7XG4gICAgICAgIGlmICghY2hhbm5lbEVtcHR5KSByZXR1cm47XG4gICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEZGbXBlZywgRkZtcGVnTGliIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUpTT04ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWF5YmVOdWxsPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgY29yZToge1xuICAgICdkaXNjb3JkLXBsYXllcic6IHN0cmluZztcbiAgICAnZGlzY29yZC12b2lwJzogc3RyaW5nO1xuICB9O1xuICBsaWJvcHVzOiB7XG4gICAgbWVkaWFwbGV4OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQGRpc2NvcmRqcy9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BldmFuL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICBvcHVzc2NyaXB0OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbm9kZS1vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGxpYnNvZGl1bToge1xuICAgICdzb2RpdW0tbmF0aXZlJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgc29kaXVtOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQG5vYmVsL2NpcGhlcnMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgfTtcbiAgZmZtcGVnOiBGRm1wZWdSZXBvcnQ7XG59XG5cbmV4cG9ydCB0eXBlIEZGbXBlZ1JlcG9ydCA9IFJlY29yZDxcbiAgRkZtcGVnTGliLFxuICBNYXliZU51bGw8e1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBoYXNMaWJvcHVzOiBib29sZWFuO1xuICB9PlxuPjtcblxuLyoqXG4gKiBBIHV0aWxpdHkgdG8gZ2VuZXJhdGUgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yID0ge1xuICAvKipcbiAgICogRmluZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIG9mIGEgcGFja2FnZS5cbiAgICogQHBhcmFtIGRpciAtIFRoZSBkaXJlY3RvcnkgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cbiAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gZmluZFxuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2hcbiAgICogQHJldHVybnMgVGhlIHBhY2thZ2UuanNvbiBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZmluZFBhY2thZ2VKU09OKGRpcjogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nLCBkZXB0aDogbnVtYmVyKTogUGFja2FnZUpTT04gfCBudWxsIHtcbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcblxuICAgIGNvbnN0IG5leHQgPSAoKSA9PiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihyZXNvbHZlKGRpciwgJy4uJyksIHBhY2thZ2VOYW1lLCBkZXB0aCAtIDEpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICBjb25zdCBwa2dKU09OOiBQYWNrYWdlSlNPTiA9IHJlcXVpcmUodGFyZ2V0KTtcblxuICAgICAgaWYgKHBrZ0pTT04ubmFtZSAhPT0gcGFja2FnZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBrZ0pTT047XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFRyaWVzIHRvIGZpbmQgdGhlIHZlcnNpb24gb2YgYSBkZXBlbmRlbmN5LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwYWNrYWdlIHRvIGZpbmQgdGhlIHZlcnNpb24gb2ZcbiAgICogQHBhcmFtIG1heExvb2t1cERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoIGZvciB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHJldHVybnMgVGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICB2ZXJzaW9uKG5hbWU6IHN0cmluZywgbWF4TG9va3VwRGVwdGggPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuYW1lID09PSAnZGlzY29yZC1wbGF5ZXInKSB7XG4gICAgICAgIHJldHVybiAnNy4wLjAtZGV2LjUnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2cgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShuYW1lKSksIG5hbWUsIG1heExvb2t1cERlcHRoKTtcbiAgICAgIHJldHVybiBwa2c/LnZlcnNpb24gPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGRpc2NvcmQtcGxheWVyIG1vZHVsZS5cbiAgICogQHJldHVybnMgVGhlIHJlcG9ydCBvYmplY3RcbiAgICovXG4gIGdlbmVyYXRlKCk6IERlcGVuZGVuY2llc1JlcG9ydCB7XG4gICAgY29uc3QgZmZtcGVnUmVwb3J0ID0ge30gYXMgRkZtcGVnUmVwb3J0O1xuXG4gICAgZm9yIChjb25zdCBsaWIgb2YgRkZtcGVnLnNvdXJjZXMpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtsaWIubmFtZV0gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZmbXBlZyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuXG4gICAgaWYgKGZmbXBlZykge1xuICAgICAgZmZtcGVnUmVwb3J0W2ZmbXBlZy5uYW1lXSA9IHtcbiAgICAgICAgaGFzTGlib3B1czogZmZtcGVnLmNvbW1hbmQuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKSxcbiAgICAgICAgdmVyc2lvbjogZmZtcGVnLnZlcnNpb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb3JlOiB7XG4gICAgICAgICdkaXNjb3JkLXBsYXllcic6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignZGlzY29yZC1wbGF5ZXInKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2Rpc2NvcmQtdm9pcCcpIGFzIHN0cmluZyxcbiAgICAgIH0sXG4gICAgICBsaWJvcHVzOiB7XG4gICAgICAgIG1lZGlhcGxleDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdtZWRpYXBsZXgnKSxcbiAgICAgICAgJ0BkaXNjb3JkanMvb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQGRpc2NvcmRqcy9vcHVzJyksXG4gICAgICAgICdAZXZhbi9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZXZhbi9vcHVzJyksXG4gICAgICAgIG9wdXNzY3JpcHQ6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignb3B1c3NjcmlwdCcpLFxuICAgICAgICAnbm9kZS1vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdub2RlLW9wdXMnKSxcbiAgICAgIH0sXG4gICAgICBsaWJzb2RpdW06IHtcbiAgICAgICAgJ3NvZGl1bS1uYXRpdmUnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bS1uYXRpdmUnKSxcbiAgICAgICAgc29kaXVtOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bScpLFxuICAgICAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdsaWJzb2RpdW0td3JhcHBlcnMnKSxcbiAgICAgICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnKSxcbiAgICAgICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tamF2YXNjcmlwdCcpLFxuICAgICAgICAnQG5vYmVsL2NpcGhlcnMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0Bub2JlbC9jaXBoZXJzJyksXG4gICAgICB9LFxuICAgICAgZmZtcGVnOiBmZm1wZWdSZXBvcnQsXG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydC5cbiAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgZ2VuZXJhdGVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgb3V0cHV0LnB1c2goJ0RlcGVuZGVuY2llcyBSZXBvcnQnKTtcbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXBvcnQpIGFzIChrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQpW107XG5cbiAgICBmb3IgKGNvbnN0IF9rZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qga2V5ID0gX2tleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQ7XG5cbiAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cbiAgICAgIGNvbnN0IHN1YktleXMgPSBPYmplY3Qua2V5cyhyZXBvcnRba2V5XSk7XG5cbiAgICAgIGZvciAoY29uc3QgX3N1YktleSBvZiBzdWJLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YktleSA9IF9zdWJLZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0W3R5cGVvZiBrZXldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcG9ydFtrZXldW3N1YktleV0gPz8gJ04vQSc7XG5cbiAgICAgICAgb3V0cHV0LnB1c2goYC0gJHtzdWJLZXl9OiAke3R5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiB2YWx1ZX1gKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cblxuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfSxcbn07XG4i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QUE7QUFBQTtBQUFBO0FBQUEsRUFJN0IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVoscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVgsb0JBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJcEIsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUNoQjtBQUlPLElBQUssa0JBQUwsa0JBQUtDLHFCQUFMO0FBQ0wsRUFBQUEsaUJBQUEsY0FBVztBQUNYLEVBQUFBLGlCQUFBLFlBQVM7QUFDVCxFQUFBQSxpQkFBQSx5QkFBc0I7QUFDdEIsRUFBQUEsaUJBQUEsVUFBTztBQUNQLEVBQUFBLGlCQUFBLFlBQVM7QUFDVCxFQUFBQSxpQkFBQSxpQkFBYztBQU5KLFNBQUFBO0FBQUEsR0FBQTtBQXhNWjtBQWlhTyxJQUFNLGNBQU4sTUFBTSxZQUEyQjtBQUFBLEVBcUIvQixZQUFtQixRQUF1QixTQUE4QjtBQUFyRDtBQUF1QjtBQXJCNUM7QUFDTCx1Q0FBaUI7QUFDakIsaUNBQVc7QUFDWCxpQ0FBVztBQUNYLHdCQUFRLGFBQTBCO0FBQ2xDLHdCQUFPO0FBQ1Asd0JBQU8sV0FBVSxJQUFJLGtCQUF3QixJQUFJO0FBQ2pELHdCQUFPLGNBQXNDO0FBQzdDLHdCQUFPLFFBQU8sSUFBSSxxQkFBMkIsSUFBSTtBQUNqRCx3QkFBTyxXQUFVLElBQUksdUJBQTZCLElBQUk7QUFDdEQsd0JBQU8sd0JBQW9ELG1DQUFZLE1BQVo7QUFDM0Qsd0JBQU8sdUJBQWtELDhCQUFPLFlBQVk7QUFBQSxNQUMxRTtBQUFBLE1BQ0EsTUFBTSxnQ0FBVztBQUFBLElBQ25CLElBSHlEO0FBSXpELHdCQUFPO0FBQ1Asd0JBQU8sWUFBVyxJQUFJLHlCQUFtQztBQUN6RCx3QkFBTyxTQUFRLElBQUkscUJBQTJCLElBQUk7QUFDbEQsd0JBQU8sY0FBYSxJQUFJLFdBQVc7QUFDbkMsd0JBQU8sd0JBQXVCLElBQUkscUJBQXFCLElBQUk7QUFHekQsU0FBSyxTQUFTLElBQUksb0JBQWEsUUFBUSxhQUFhO0FBQ3BELFFBQUksU0FBUyxXQUFXLFFBQVEsb0JBQW9CLEVBQUcsTUFBSyx1QkFBdUIsUUFBUTtBQUMzRixRQUFJLFNBQVMsV0FBVyxRQUFRLG1CQUFtQixFQUFHLE1BQUssc0JBQXNCLFFBQVE7QUFDekYsUUFBSSxDQUFDLFNBQVMsVUFBVSxRQUFRLFVBQVUsRUFBRyxNQUFLLGFBQWEsUUFBUTtBQUV2RSxZQUFRLGFBQVIsUUFBUSxXQUFhO0FBQ3JCLFlBQVEsWUFBUixRQUFRLFVBQVk7QUFDcEIsWUFBUSxtQkFBUixRQUFRLGlCQUFtQjtBQUMzQixZQUFRLGlCQUFSLFFBQVEsZUFBaUI7QUFFekIsUUFBSSxDQUFDLFNBQVMsVUFBVSxLQUFLLFFBQVEsTUFBTSxLQUFLLENBQUMsU0FBUyxVQUFVLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFDeEYsV0FBSyxRQUFRLGtCQUFrQixTQUFTLEtBQUssUUFBUTtBQUFBLElBQ3ZEO0FBRUEsUUFBSSxNQUFNLFFBQVEsS0FBSyxRQUFRLFNBQVMsR0FBRztBQUN6QyxXQUFLLFFBQVEsa0JBQWtCLFlBQVksS0FBSyxRQUFRO0FBQUEsSUFDMUQ7QUFFQSxRQUFJLE1BQU0sUUFBUSxLQUFLLFFBQVEsUUFBUSxHQUFHO0FBQ3hDLFdBQUssUUFBUSxrQkFBa0IsVUFBVSxLQUFLLFFBQVE7QUFBQSxJQUN4RDtBQUVBLFFBQUksU0FBUyxTQUFTLEtBQUssUUFBUSxTQUFTLEdBQUc7QUFDN0MsV0FBSyxRQUFRLGtCQUFrQixhQUFhLEtBQUssUUFBUTtBQUFBLElBQzNEO0FBRUEsUUFBSSxTQUFTLFFBQVEsS0FBSyxRQUFRLGFBQWEsR0FBRztBQUNoRCxXQUFLLFFBQVEsT0FBTyxZQUFZLEtBQUssUUFBUSxhQUFhO0FBQUEsSUFDNUQ7QUFFQSxRQUFJLENBQUMsU0FBUyxTQUFTLFFBQVEsT0FBTyxHQUFHO0FBQ3ZDLFlBQU0sV0FBVyxxQkFBcUIsMkJBQTJCLFVBQVUsT0FBTyxRQUFRLE9BQU87QUFBQSxJQUNuRztBQUVBLFFBQUksQ0FBQyxTQUFTLFNBQVMsUUFBUSxjQUFjLEdBQUc7QUFDOUMsWUFBTSxXQUFXLHFCQUFxQixrQ0FBa0MsVUFBVSxPQUFPLFFBQVEsY0FBYztBQUFBLElBQ2pIO0FBRUEsUUFBSSxRQUFRLFVBQVUsRUFBRyxTQUFRLFVBQVU7QUFDM0MsUUFBSSxRQUFRLGlCQUFpQixFQUFHLFNBQVEsaUJBQWlCO0FBRXpELFFBQUksS0FBSztBQUNQLFdBQUssTUFBTSxvQ0FBb0MsS0FBSyxRQUFRLE1BQU0sSUFBSSxTQUFTLEtBQUssUUFBUSxNQUFNLEVBQUUsR0FBRztBQUN6RyxTQUFLLEtBQUssZ0JBQWdCLGFBQWEsSUFBSTtBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLG9CQUFvQjtBQUM3QixXQUFPLEtBQUssT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxFQUFFLFlBQVksQ0FBQztBQUFBLEVBQy9EO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLG9CQUFvQjtBQUM3QixXQUFPLEtBQUssY0FBYyxLQUFLLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQztBQUFBLEVBQ2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWVPLGFBQWEsUUFBd0M7QUFDMUQsU0FBSyxxQkFBcUIsS0FBSyxRQUFRLGdCQUFnQixFQUFFO0FBQ3pELFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sTUFBTSxHQUFXO0FBQ3RCLFNBQUssS0FBSyxnQkFBZ0IsT0FBTyxNQUFNLENBQUM7QUFBQSxFQUMxQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxXQUFXO0FBQ3BCLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDdEI7QUFBQSxFQUVBLElBQVcsU0FBUyxHQUFTO0FBQzNCLFNBQUssUUFBUSxXQUFXO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sWUFBWSxHQUFTO0FBQzFCLFNBQUssUUFBUSxXQUFXO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZUFBZTtBQUN4QixXQUFPLEtBQUssWUFBWSxlQUFlLFlBQVksS0FBSztBQUFBLEVBQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFVBQVU7QUFDbkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNuQixXQUFPLEtBQUssWUFBWSxXQUFXO0FBQUEsRUFDckM7QUFBQSxFQUVBLElBQVcsUUFBUSxHQUE2QjtBQUM5QyxRQUFJLEtBQUssWUFBWTtBQUNuQixVQUFJLEdBQUc7QUFDTCxhQUFLLFdBQVcsVUFBVTtBQUFBLE1BQzVCLE9BQU87QUFDTCxhQUFLLE9BQU87QUFBQSxNQUNkO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsYUFBYTtBQUN0QixXQUFPLEtBQUssWUFBWSxtQkFBbUI7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxRQUFRO0FBQ2pCLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsS0FBSztBQUNkLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8saUJBQWlCLE9BQWdCO0FBQ3RDLHVCQUFLLGdCQUFpQjtBQUFBLEVBQ3hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxrQkFBa0I7QUFDdkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sY0FBYyxNQUF1QjtBQUMxQyxTQUFLLGFBQWE7QUFBQSxFQUNwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ25CLFdBQU8sS0FBSyxRQUFRLFdBQVc7QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sYUFBYTtBQUNsQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDaEIsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVTtBQUNmLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsaUJBQWlCO0FBQzFCLFdBQU8sS0FBSyxRQUFRLGtCQUFrQjtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxvQkFBb0I7QUFDekIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxrQkFBa0IsTUFBYztBQUNyQyxRQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUM1QixZQUFNLFdBQVcscUJBQXFCLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUNyRTtBQUVBLFFBQUksT0FBTyxFQUFHLFFBQU87QUFFckIsU0FBSyxRQUFRLGlCQUFpQjtBQUFBLEVBQ2hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQVcsTUFBYztBQUM5QixRQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUM1QixZQUFNLFdBQVcscUJBQXFCLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUNyRTtBQUVBLFFBQUksT0FBTyxFQUFHLFFBQU87QUFFckIsU0FBSyxRQUFRLFVBQVU7QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBUTtBQUNiLFNBQUssT0FBTyxNQUFNO0FBQ2xCLFNBQUssUUFBUSxNQUFNO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDZixXQUFPLEtBQUssT0FBTyxPQUFPO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFNBQVM7QUFDZCxXQUFPLEtBQUssT0FBTyxRQUFRLEtBQUs7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sY0FBYztBQUNuQixRQUFJLEtBQUssT0FBTyxFQUFHLFFBQU87QUFDMUIsVUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLO0FBQ2hDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2pCLFdBQU8sS0FBSyxZQUFZLGlCQUFpQixRQUFRLENBQUMsS0FBSyxXQUFXLGNBQWM7QUFBQSxFQUNsRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxTQUFTLE9BQW1DO0FBQ2pELFVBQU0sUUFBUSxpQkFBaUIsV0FBVyxNQUFNLFNBQVM7QUFDekQsVUFBTSxVQUFVLE1BQU0sUUFBUSxLQUFLO0FBRW5DLHVCQUFtQixNQUFNLEtBQUs7QUFFOUIsU0FBSyxPQUFPLElBQUksS0FBSztBQUVyQixRQUFJLFNBQVM7QUFDWCxXQUFLLEtBQUssZ0JBQWdCLGdCQUFnQixNQUFNLEtBQUs7QUFBQSxJQUN2RCxPQUFPO0FBQ0wsV0FBSyxLQUFLLGdCQUFnQixlQUFlLE1BQU0sS0FBSztBQUFBLElBQ3REO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxZQUFZLE9BQXdCO0FBQ3pDLFdBQU8sS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sWUFBWSxPQUFjLFFBQVEsR0FBUztBQUNoRCxXQUFPLEtBQUssS0FBSyxPQUFPLE9BQU8sS0FBSztBQUFBLEVBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sVUFBVSxPQUF3QixRQUFRLEdBQVM7QUFDeEQsV0FBTyxLQUFLLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFVBQVUsT0FBd0IsUUFBUSxHQUFTO0FBQ3hELFdBQU8sS0FBSyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxXQUFXLEtBQXNCLE1BQTZCO0FBQ25FLFdBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDakM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8saUJBQ0wsWUFDQSxVQUErRCxDQUFDLEdBQ2hFO0FBQ0EsUUFBSSxXQUFXLE1BQU0sV0FBVywyQ0FBc0IsV0FBVztBQUMvRCxZQUFNLFdBQVcsK0JBQStCO0FBQUEsSUFDbEQ7QUFFQSxVQUFNLFVBQVUsS0FBSyxPQUFPLE9BQU8sU0FBUyxNQUFNLElBQUksV0FBVyxXQUFXLFNBQVU7QUFDdEYsUUFBSSxDQUFDLFFBQVMsT0FBTSxXQUFXLHFCQUFxQjtBQUNwRCxRQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3hCLFlBQU0sV0FBVztBQUFBLFFBQ2Y7QUFBQSxRQUNBLDJCQUEyQiw0QkFBWSxVQUFVLElBQUksNEJBQVksZUFBZTtBQUFBLFFBQ2hGLE9BQU8sU0FBUyxJQUFJO0FBQUEsTUFDdEI7QUFFRixRQUFJLEtBQUssWUFBWTtBQUNuQiw0QkFBSywyQ0FBTCxXQUFzQixLQUFLO0FBQzNCLFdBQUssV0FBVyxRQUFRO0FBQ3hCLFdBQUssYUFBYTtBQUFBLElBQ3BCO0FBRUEsU0FBSyxhQUFhLElBQUk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRLFdBQVcsS0FBSyxRQUFRO0FBQUEsTUFDaEMsUUFBUTtBQUFBLElBQ1Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxRQUFRLG1CQUFnRCxVQUE4QixDQUFDLEdBQUc7QUFDckcsVUFBTSxVQUFVLEtBQUssT0FBTyxPQUFPLFNBQVMsUUFBUSxpQkFBaUI7QUFDckUsUUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLGFBQWEsR0FBRztBQUN2QyxZQUFNLFdBQVc7QUFBQSxRQUNmO0FBQUEsUUFDQSwyQkFBMkIsNEJBQVksVUFBVSxJQUFJLDRCQUFZLGVBQWU7QUFBQSxRQUNoRixPQUFPLFNBQVMsSUFBSTtBQUFBLE1BQ3RCO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBSztBQUNQLFdBQUs7QUFBQSxRQUNILGlCQUFpQixRQUFRLFNBQVMsNEJBQVksa0JBQWtCLFVBQVUsT0FBTyxZQUMvRSxRQUFRLElBQ1YsU0FBUyxRQUFRLEVBQUU7QUFBQSxNQUNyQjtBQUVGLFFBQUksS0FBSyxjQUFjLFFBQVEsT0FBTyxLQUFLLFdBQVcsUUFBUSxJQUFJO0FBQ2hFLFVBQUksS0FBSyxZQUFhLE1BQUssTUFBTSwyQkFBMkI7QUFDNUQsNEJBQUssMkNBQUwsV0FBc0IsS0FBSztBQUMzQixXQUFLLFdBQVcsUUFBUTtBQUN4QixXQUFLLGFBQWE7QUFBQSxJQUNwQjtBQUVBLFNBQUssYUFBYSxNQUFNLEtBQUssT0FBTyxXQUFXLFFBQVEsU0FBUztBQUFBLE1BQzlELE1BQU0sUUFBUSxRQUFRLEtBQUssUUFBUSxZQUFZO0FBQUEsTUFDL0MsU0FBUyxTQUFTLFdBQVcsS0FBSyxRQUFRLHFCQUFxQjtBQUFBLE1BQy9ELE9BQU87QUFBQSxNQUNQLGFBQWEsU0FBUztBQUFBLE1BQ3RCLE9BQU8sUUFBUSxTQUFTLEtBQUssT0FBTyxPQUFPLE1BQU07QUFBQSxJQUNuRCxDQUFDO0FBRUQsU0FBSyxLQUFLLGdCQUFnQixZQUFZLElBQUk7QUFFMUMsUUFBSSxLQUFLLFFBQVMsU0FBUyw0QkFBWSxpQkFBaUI7QUFDdEQsWUFBTSxLQUFLLFFBQVMsTUFBTSxRQUFRLEdBQUksTUFBTSxjQUFjLEtBQUssRUFBRSxNQUFNLFlBQVk7QUFDakYsZUFBTyxNQUFNLEtBQUssUUFBUyxNQUFNLFFBQVEsR0FBSSxNQUFNLGtCQUFrQixJQUFJLEVBQUUsTUFBTSxLQUFLLElBQUk7QUFBQSxNQUM1RixDQUFDO0FBQUEsSUFDSDtBQUVBLDBCQUFLLDJDQUFMLFdBQXNCLEtBQUs7QUFFM0IsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGNBQWMsVUFBVSxNQUFNO0FBQ25DLFFBQUksQ0FBQyxTQUFTO0FBQ1osV0FBSyxPQUFPLFFBQVE7QUFDcEIsYUFBTztBQUFBLElBQ1Q7QUFFQSx1QkFBSyxVQUFXO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxpQkFBaUI7QUFDdEIsdUJBQUssVUFBVztBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQWMsVUFBVSxNQUFNO0FBQ25DLFFBQUksU0FBUztBQUNYLHlCQUFLLFVBQVcsQ0FBQyxtQkFBSztBQUN0QixhQUFPLG1CQUFLO0FBQUEsSUFDZCxPQUFPO0FBQ0wsV0FBSyxPQUFPLFFBQVE7QUFDcEIsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGNBQWM7QUFDdkIsV0FBTyxtQkFBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsT0FBTztBQUNoQixXQUFPLEtBQUssWUFBWSxLQUFLLE9BQU87QUFBQSxFQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNkLFFBQUksS0FBSyxPQUFPLE1BQU0sT0FBTyxLQUFLLEVBQUUsR0FBRztBQUNyQyx5QkFBSyxVQUFXO0FBQ2hCLFdBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLGFBQWEsSUFBSTtBQUN6RCxXQUFLLEtBQUssV0FBVyxVQUFVO0FBQy9CLFdBQUssV0FBVyxVQUFVO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFNBQVM7QUFDZCxRQUFJLENBQUMsS0FBSyxXQUFXLEtBQUssT0FBTyxNQUFNLElBQUksS0FBSyxFQUFFLEVBQUc7QUFDckQsdUJBQUssVUFBVztBQUNoQixTQUFLLGlCQUFpQixLQUFLO0FBQzNCLFNBQUssT0FBTyxNQUFNLE1BQU0sSUFBSSxLQUFLLElBQUksSUFBSTtBQUN6QyxTQUFLLE9BQU8sT0FBTyxLQUFLLGdCQUFnQixhQUFhLElBQUk7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksTUFBZ0IsUUFBaUI7QUFDbEQsV0FBTyxLQUFLLE1BQU0sUUFBUSxHQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksTUFBZ0IsUUFBaUI7QUFDbEQsV0FBTyxLQUFLLE1BQU0sUUFBUSxHQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsS0FBSyxPQUFrQixTQUE4QztBQUNoRixRQUFJLENBQUMsS0FBSyxRQUFTLE9BQU0sV0FBVyx3QkFBd0I7QUFFNUQsV0FBTyxLQUFLLE9BQU8sS0FBSyxLQUFLLFNBQVMsT0FBTyxPQUFPO0FBQUEsRUFDdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUNMLFVBQ0csTUFDTTtBQUNULFFBQUksS0FBSyxRQUFTLFFBQU87QUFDekIsV0FBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLE9BQU8sR0FBRyxJQUFJO0FBQUEsRUFDL0M7QUFBQSxFQW9DQSxJQUFXLGNBQWM7QUFDdkIsV0FBTyxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQzVCO0FBc0tGO0FBM3dCRTtBQUNBO0FBQ0E7QUFISztBQWtrQkwscUJBQWdCLGdDQUFDLFlBQThCO0FBQzdDLGFBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDdkUsYUFBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEtBQUssZUFBZSxLQUFLLEtBQUssZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDM0YsYUFBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLHNCQUFLLHlDQUFMLFdBQW9CLEVBQUU7QUFDckQsYUFBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLHNCQUFLLHdDQUFMLFdBQW1CLEVBQUU7QUFDbkQsYUFBVyxHQUFHLGFBQWEsTUFBTTtBQUMvQiwwQkFBSywyQ0FBTCxXQUFzQjtBQUN0QixTQUFLLGFBQWE7QUFBQSxFQUNwQixDQUFDO0FBQ0QsYUFBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNO0FBQzFCLFFBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLGtCQUFrQixTQUFTLENBQUMsR0FBRztBQUN6RCxXQUFLLEtBQUssZ0JBQWdCLFdBQVcsTUFBTSxLQUFLLFFBQVEsa0JBQWtCLFNBQVMsQ0FBQztBQUFBLElBQ3RGO0FBQ0EsU0FBSyxRQUFRLGtCQUFrQixVQUFVO0FBQUEsRUFDM0MsQ0FBQztBQUNELGFBQVcsR0FBRyxVQUFVLENBQUMsTUFBTTtBQUM3QixRQUFJLEtBQUssUUFBUSxrQkFBa0IsV0FBVyxHQUFHO0FBQy9DLFdBQUssS0FBSyxnQkFBZ0IscUJBQXFCLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxJQUMvRjtBQUNBLFNBQUssUUFBUSxrQkFBa0IsU0FBUztBQUFBLEVBQzFDLENBQUM7QUFDRCxhQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU07QUFDOUIsUUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEtBQUssUUFBUSxrQkFBa0IsU0FBUyxHQUFHO0FBQzNELFdBQUssS0FBSyxnQkFBZ0IsaUJBQWlCLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixXQUFXLENBQUM7QUFBQSxJQUM5RjtBQUNBLFNBQUssUUFBUSxrQkFBa0IsWUFBWTtBQUFBLEVBQzdDLENBQUM7QUFDRCxhQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDN0IsUUFBSSxLQUFLLFFBQVEsa0JBQWtCLFdBQVc7QUFDNUMsV0FBSyxLQUFLLGdCQUFnQixjQUFjLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFDeEYsU0FBSyxRQUFRLGtCQUFrQixTQUFTO0FBQUEsRUFDMUMsQ0FBQztBQUNILEdBaENnQjtBQXNDaEIscUJBQWlFLGdDQUFDQyxTQUFXO0FBQzNFLEVBQUFBLFFBQU8sbUJBQW1CO0FBQzVCLEdBRmlFO0FBSWpFLGtCQUFhLGdDQUFDLFVBQWlDO0FBQzdDLFFBQU0sUUFBUSxVQUFVLFlBQVksS0FBSztBQUN6QyxRQUFNLFNBQVMsS0FBSyxnQkFBZ0IsSUFBSSxZQUFZO0FBRXBELE1BQUksS0FBSztBQUNQLFNBQUs7QUFBQSxNQUNILDhCQUE4QixLQUFLLFVBQVU7QUFBQSxRQUMzQyxPQUFPLE9BQU87QUFBQSxRQUNkO0FBQUEsTUFDRixDQUFDLENBQUM7QUFBQSxJQUNKO0FBRUYsT0FBSyxLQUFLLGdCQUFnQixlQUFlLE1BQU0sT0FBUSxNQUFNO0FBQzdELE1BQUksU0FBUyxDQUFDLEtBQUssZ0JBQWdCLEVBQUcsTUFBSyxLQUFLLGdCQUFnQixhQUFhLE1BQU0sS0FBSztBQUN4RixPQUFLLGlCQUFpQixLQUFLO0FBQzdCLEdBZmE7QUFpQmIsa0JBQWEsa0NBQUc7QUFDZCxNQUFJLENBQUMsS0FBSyxhQUFhO0FBQ3JCLFdBQU8sS0FBSyxPQUFPLFNBQVM7QUFBQSxFQUM5QjtBQUVBLFFBQU0sUUFBUSxLQUFLLE9BQU87QUFFMUIsTUFBSSxDQUFDLE1BQU0sT0FBUTtBQUVuQixRQUFNLFFBQVEsS0FBSyxhQUFhLEtBQUs7QUFFckMsT0FBSyxPQUFPLFVBQVUsQ0FBQyxNQUFNO0FBQzNCLFdBQU8sRUFBRSxPQUFPLE1BQU07QUFBQSxFQUN4QixDQUFDO0FBRUQsU0FBTztBQUNULEdBaEJhO0FBa0JiLG1CQUFjLGdDQUFDLFVBQWlDO0FBQzlDLFFBQU0sUUFBUSxVQUFVLFlBQVksS0FBSztBQUV6QyxNQUFJLEtBQUs7QUFDUCxTQUFLO0FBQUEsTUFDSCxTQUFTLEtBQUssVUFBVTtBQUFBLFFBQ3RCLE9BQU8sT0FBTztBQUFBLFFBQ2Qsa0JBQWtCLEtBQUssZ0JBQWdCO0FBQUEsTUFDekMsQ0FBQyxDQUFDO0FBQUEsSUFDSjtBQUVGLE1BQUksQ0FBQyxLQUFLLGdCQUFnQixHQUFHO0FBQzNCLFNBQUsscUJBQXFCLFlBQVk7QUFDdEMsU0FBSyxxQkFBcUIsT0FBTyxNQUFNO0FBQ3ZDLFFBQUksS0FBSztBQUNQLFdBQUssTUFBTSx3RkFBd0Y7QUFDckcsUUFBSSxPQUFPO0FBQ1QsV0FBSyxRQUFRLEtBQUssS0FBSztBQUN2QixXQUFLLEtBQUssY0FBYztBQUN4QixXQUFLLEtBQUssZ0JBQWdCLGNBQWMsTUFBTSxLQUFLO0FBQUEsSUFDckQ7QUFDQSxRQUFJLG1CQUFLLFVBQVUsUUFBTyxzQkFBSyxtQ0FBTDtBQUMxQixRQUFJLEtBQUssT0FBTyxPQUFPLEtBQUssS0FBSyw0QkFBb0M7QUFDbkUsVUFBSSxLQUFLO0FBQ1AsYUFBSyxNQUFNLHdGQUF3RjtBQUNyRyw0QkFBSyxtQ0FBTDtBQUFBLElBQ0YsT0FBTztBQUNMLFVBQUksS0FBSyw4QkFBc0M7QUFDN0MsWUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLHVFQUF1RTtBQUN4RyxhQUFLLFlBQVksS0FBSyxRQUFRLE9BQU8sU0FBUyxLQUFLO0FBQ25ELGVBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxXQUFZLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxNQUN6RDtBQUNBLFVBQUksS0FBSyw4QkFBc0M7QUFDN0MsWUFBSSxLQUFLO0FBQ1AsZUFBSyxNQUFNLHFGQUFxRjtBQUNsRyxjQUFNLE9BQU8sS0FBSyxRQUFRLE9BQU8sU0FBUyxLQUFLO0FBQy9DLFlBQUksS0FBTSxNQUFLLE9BQU8sSUFBSSxJQUFJO0FBQUEsTUFDaEM7QUFDQSxVQUFJLENBQUMsS0FBSyxPQUFPLFFBQVEsT0FBTztBQUM5QixZQUFJLEtBQUssaUNBQXlDO0FBQ2hELGNBQUksS0FBSyxZQUFhLE1BQUssTUFBTSxnRUFBZ0U7QUFDakcsZ0NBQUssMENBQUwsV0FBcUI7QUFDckI7QUFBQSxRQUNGO0FBQUEsTUFDRixPQUFPO0FBQ0wsWUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLHlDQUF5QztBQUMxRSxhQUFLLFlBQVksc0JBQUssd0NBQUw7QUFDakIsYUFBSyxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQUEsVUFDN0IsT0FBTztBQUFBLFFBQ1QsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLEdBckRjO0FBdURkLGFBQVEsa0NBQUc7QUFDVCxPQUFLLFlBQVk7QUFDakIsT0FBSyxLQUFLLGdCQUFnQixZQUFZLElBQUk7QUFDMUMsTUFBSSxLQUFLLFFBQVEsWUFBWTtBQUMzQixVQUFNLFNBQXFCLDBCQUFXLE1BQU07QUFDMUMsVUFBSSxLQUFLLFVBQVUsRUFBRyxRQUFPLGFBQWEsRUFBRTtBQUM1QyxXQUFLLFlBQVksV0FBVztBQUFBLElBQzlCLEdBQUcsS0FBSyxRQUFRLGtCQUFrQixFQUFFLE1BQU07QUFBQSxFQUM1QztBQUNGLEdBVFE7QUFXRixvQkFBZSxzQ0FBQyxPQUFjO0FBQ2xDLE1BQUk7QUFDRixRQUFJLEtBQUs7QUFDUCxXQUFLO0FBQUEsUUFDSCxnREFBZ0QsTUFBTSxLQUFLLEtBQUssTUFBTSxHQUFHLFVBQ3ZFLE1BQU0sV0FBVyxjQUFjLEtBQ2pDO0FBQUEsTUFDRjtBQUNGLFVBQU0sVUFDSCxNQUFNLE1BQU0sV0FBVyxpQkFBaUIsT0FBTyxLQUFLLE9BQU8sSUFBSSxXQUU5RCxNQUFNLEtBQUssT0FBTyxXQUFXLElBQUksT0FBTyxRQUFRO0FBQzlDLFVBQUksS0FBSyxZQUFhLE1BQUssTUFBTSxrQ0FBa0MsSUFBSSxVQUFVLEVBQUU7QUFDbkYsWUFBTSxNQUFNLE1BQU0sSUFBSSxpQkFBaUIsT0FBTyxLQUFLLE9BQU87QUFDMUQsVUFBSSxDQUFDLElBQUksT0FBTyxRQUFRO0FBQ3RCLFlBQUksS0FBSyxZQUFhLE1BQUssTUFBTSx5QkFBeUIsSUFBSSxVQUFVLDZCQUE2QjtBQUNyRyxlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUksS0FBSyxZQUFhLE1BQUssTUFBTSx5QkFBeUIsSUFBSSxVQUFVLGlDQUFpQztBQUV6RyxhQUFPLElBQUk7QUFBQSxJQUNiLENBQUMsSUFDQSxVQUNILENBQUM7QUFFSCxRQUFJLFdBQTBDLEtBQUs7QUFDbkQsVUFBTSxjQUFjLElBQUksUUFBc0IsQ0FBQ0MsYUFBYSxXQUFXQSxRQUFRO0FBRS9FLFVBQU0sVUFBVSxLQUFLLEtBQUssZ0JBQWdCLGNBQWMsTUFBTSxRQUFRLFFBQVM7QUFHL0UsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLFFBQ0UsT0FBTyxVQUNGLE1BQU07QUFDTCxnQkFBTSxTQUFTLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDdkYsaUJBQU8sU0FBUyxDQUFDLEtBQUssS0FBSyxhQUFhLE9BQU8sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUFBLFFBQzVELEdBQUcsSUFDSDtBQUFBLE1BQ047QUFBQSxJQUNGO0FBRUEsVUFBTSxZQUFZLE1BQU07QUFFeEIsUUFBSSxDQUFDLFdBQVc7QUFDZCxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sdURBQXVEO0FBQ3hGLFlBQU07QUFBQSxJQUNSO0FBRUEsVUFBTSxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQUEsTUFDOUIsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sZ0JBQWdCO0FBQUEsSUFDbEIsQ0FBQztBQUFBLEVBQ0gsUUFBUTtBQUNOLFdBQU8sc0JBQUssbUNBQUw7QUFBQSxFQUNUO0FBQ0YsR0ExRHFCO0FBanRCaUI7QUFBakMsSUFBTUMsY0FBTjs7O0FEblhBLElBQU0sb0JBQU4sTUFBTSxrQkFBaUM7QUFBQSxFQUVyQyxZQUFtQixRQUFnQjtBQUFoQjtBQUQxQix3QkFBTyxTQUFRLElBQUkseUJBQStCO0FBQUEsRUFDUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9wQyxPQUFpQixPQUF3QixVQUFxQyxDQUFDLEdBQWtCO0FBQ3RHLFVBQU0sU0FBUyxLQUFLLE9BQU8sT0FBTyxPQUFPLFFBQVEsS0FBSztBQUN0RCxRQUFJLENBQUMsUUFBUTtBQUNYLFlBQU0sV0FBVyxhQUFhLDBCQUEwQjtBQUFBLElBQzFEO0FBRUEsUUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLEVBQUUsR0FBRztBQUM3QixhQUFPLEtBQUssTUFBTSxJQUFJLE9BQU8sRUFBRTtBQUFBLElBQ2pDO0FBRUEsWUFBUSxhQUFSLFFBQVEsV0FBYTtBQUNyQixZQUFRLFdBQVIsUUFBUSxTQUFXO0FBQ25CLFlBQVEsY0FBUixRQUFRLFlBQWMsQ0FBQztBQUN2QixZQUFRLGFBQVIsUUFBUSxXQUFhLENBQUM7QUFDdEIsWUFBUSxtQkFBUixRQUFRLGlCQUFtQjtBQUMzQixZQUFRLGlCQUFSLFFBQVEsZUFBaUI7QUFDekIsWUFBUSx5QkFBUixRQUFRLHVCQUF5QjtBQUNqQyxZQUFRLGVBQVIsUUFBUSxhQUFlO0FBQ3ZCLFlBQVEsdUJBQVIsUUFBUSxxQkFBdUI7QUFDL0IsWUFBUSxnQkFBUixRQUFRLGNBQWdCO0FBQ3hCLFlBQVEsd0JBQVIsUUFBUSxzQkFBd0I7QUFDaEMsWUFBUSxjQUFSLFFBQVEsWUFBYztBQUN0QixZQUFRLGFBQVIsUUFBUSxXQUFhO0FBQ3JCLFlBQVEsc0JBQVIsUUFBUSxvQkFBc0IsS0FBSyxPQUFPLFFBQVE7QUFDbEQsWUFBUSxxQkFBUixRQUFRLG1CQUFxQjtBQUM3QixZQUFRLFlBQVIsUUFBUSxVQUFZO0FBQ3BCLFlBQVEsbUJBQVIsUUFBUSxpQkFBbUI7QUFDM0IsWUFBUSwwQkFBUixRQUFRLHdCQUEwQjtBQUNsQyxZQUFRLGlCQUFSLFFBQVEsZUFBaUI7QUFFekIsWUFBUSxrQkFBUixRQUFRLGdCQUFrQjtBQUMxQixZQUFRLHFCQUFSLFFBQVEsbUJBQXFCO0FBQzdCLFlBQVEsb0JBQVIsUUFBUSxrQkFBb0I7QUFDNUIsWUFBUSxrQkFBUixRQUFRLGdCQUFrQjtBQUMxQixZQUFRLHFCQUFSLFFBQVEsbUJBQXFCO0FBQzdCLFlBQVEsMEJBQVIsUUFBUSx3QkFBMEI7QUFFbEMsUUFBSSxrQkFBa0IsRUFBRSxJQUFJLHlCQUF5QixLQUFLLENBQUMsUUFBUSxzQkFBc0I7QUFDdkYsY0FBUSx1QkFBdUIsa0JBQWtCLEVBQUUsSUFBSSx5QkFBeUI7QUFBQSxJQUNsRjtBQUVBLFFBQUksa0JBQWtCLEVBQUUsSUFBSSx3QkFBd0IsS0FBSyxDQUFDLFFBQVEscUJBQXFCO0FBQ3JGLGNBQVEsc0JBQXNCLGtCQUFrQixFQUFFLElBQUksd0JBQXdCO0FBQUEsSUFDaEY7QUFFQSxVQUFNLFFBQVEsSUFBSUMsWUFBYyxLQUFLLFFBQVE7QUFBQSxNQUMzQyxPQUFPO0FBQUEsTUFDUCxlQUFlLFFBQVE7QUFBQSxNQUN2QixRQUFRLFFBQVE7QUFBQSxNQUNoQixXQUFXLFFBQVE7QUFBQSxNQUNuQixVQUFVLFFBQVE7QUFBQSxNQUNsQixRQUFRLFFBQVE7QUFBQSxNQUNoQixXQUFXLFFBQVE7QUFBQSxNQUNuQixnQkFBZ0IsUUFBUTtBQUFBLE1BQ3hCLHNCQUFzQixRQUFRO0FBQUEsTUFDOUIscUJBQXFCLFFBQVE7QUFBQSxNQUM3QixZQUFZLFFBQVE7QUFBQSxNQUNwQixjQUFjLFFBQVE7QUFBQSxNQUN0QixzQkFBc0IsUUFBUTtBQUFBLE1BQzlCLFlBQVksUUFBUTtBQUFBLE1BQ3BCLG9CQUFvQixRQUFRO0FBQUEsTUFDNUIsYUFBYSxRQUFRO0FBQUEsTUFDckIscUJBQXFCLFFBQVE7QUFBQSxNQUM3QixVQUFVLFFBQVE7QUFBQSxNQUNsQixtQkFBbUIsUUFBUSxxQkFBcUI7QUFBQSxNQUNoRCxVQUFVLFFBQVE7QUFBQSxNQUNsQixlQUFlLFFBQVEsd0JBQXdCLENBQUM7QUFBQSxNQUNoRCxrQkFBa0IsUUFBUTtBQUFBLE1BQzFCLGNBQWMsUUFBUSxnQkFBZ0I7QUFBQSxNQUN0Qyx1QkFBdUIsUUFBUTtBQUFBLE1BQy9CLGdCQUFnQixRQUFRO0FBQUEsTUFDeEIsU0FBUyxRQUFRO0FBQUEsTUFDakIsY0FBYyxRQUFRO0FBQUEsTUFDdEIsZUFBZSxRQUFRO0FBQUEsTUFDdkIsa0JBQWtCLFFBQVE7QUFBQSxNQUMxQixpQkFBaUIsUUFBUTtBQUFBLE1BQ3pCLGtCQUFrQixRQUFRO0FBQUEsTUFDMUIsZUFBZSxRQUFRO0FBQUEsTUFDdkIsdUJBQXVCLFFBQVE7QUFBQSxJQUNqQyxDQUFDO0FBRUQsU0FBSyxNQUFNLElBQUksT0FBTyxJQUFJLEtBQUs7QUFFL0IsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sSUFBYyxNQUFzQjtBQUN6QyxVQUFNLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFDL0IsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUVuQixXQUFRLEtBQUssTUFBTSxJQUFJLE1BQU0sRUFBRSxLQUF1QjtBQUFBLEVBQ3hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLElBQUksTUFBc0I7QUFDL0IsVUFBTSxLQUFLLGdCQUFnQkEsY0FBYSxLQUFLLEtBQUssS0FBSyxPQUFPLE9BQU8sT0FBTyxVQUFVLElBQUk7QUFDMUYsV0FBTyxLQUFLLE1BQU0sSUFBSSxFQUFFO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sT0FBTyxNQUFzQjtBQUNsQyxVQUFNLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFDL0IsUUFBSSxDQUFDLE9BQU87QUFDVixZQUFNLFdBQVcsbUJBQW1CLGtDQUFrQztBQUFBLElBQ3hFO0FBRUEsVUFBTSxpQkFBaUIsSUFBSTtBQUMzQixVQUFNLEtBQUssS0FBSyxJQUFJO0FBRXBCLFVBQU0sWUFBWSxtQkFBbUI7QUFDckMsVUFBTSxZQUFZLG1CQUFtQjtBQUNyQyxVQUFNLFlBQVksV0FBVztBQUM3QixVQUFNLFNBQVMsUUFBUSxDQUFDLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDL0MsVUFBTSxRQUFRLE1BQU07QUFDcEIsVUFBTSxPQUFPLE1BQU07QUFFbkIsV0FBTyxLQUFLLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxRQUFrQixNQUFpRDtBQUN4RSxRQUFJLGdCQUFnQkEsYUFBWTtBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQU8sS0FBSyxNQUFNLElBQUksS0FBSyxPQUFPLE9BQU8sT0FBTyxVQUFVLElBQUksQ0FBRTtBQUFBLEVBQ2xFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFVBQVUsTUFBc0I7QUFDckMsVUFBTSxJQUFJLEtBQUssUUFBUSxJQUFJO0FBQzNCLFdBQU8sR0FBRyxNQUFNO0FBQUEsRUFDbEI7QUFDRjtBQTlKOEM7QUFBdkMsSUFBTSxtQkFBTjs7O0FXOUNQLElBQUFDLG1CQUEyQjtBQUtwQixJQUFNLG9CQUFOLE1BQU0sa0JBQWlCO0FBQUEsRUFBdkI7QUFDTCx3QkFBTyxTQUFRO0FBQ2Ysd0JBQU8sYUFBWTtBQUNuQix3QkFBTyxjQUFhO0FBQ3BCLHdCQUFPLFNBQVEsSUFBSSxXQUFXO0FBQzlCLHdCQUFPLGVBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2QsZ0JBQWdCO0FBQ3JCLFdBQU8sS0FBSyxhQUFhLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSztBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsUUFBUSxLQUFvQjtBQUN2QyxVQUFNLFFBQVEsS0FBSyxNQUFNLFFBQVE7QUFDakMsVUFBTSxNQUFNLFFBQVE7QUFFcEIsUUFBSTtBQUNGLGFBQU8sS0FBSyxTQUFTLEdBQUc7QUFBQSxJQUMxQixVQUFFO0FBQ0EsWUFBTSxRQUFRO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFjLFNBQVMsS0FBb0IsVUFBVSxHQUFzQjtBQUN6RSxXQUFPLEtBQUssY0FBYyxHQUFHO0FBQzNCLFlBQU0sUUFBUSxLQUFLLGFBQWEsS0FBSyxJQUFJO0FBQ3pDLGdCQUFNLDZCQUFXLEtBQUs7QUFBQSxJQUN4QjtBQUVBLFFBQUksT0FBTztBQUVYLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxJQUFJO0FBRXRCLFdBQUssY0FBYyxHQUFHO0FBRXRCLFVBQUksSUFBSSxXQUFXLEtBQUs7QUFDdEIsY0FBTSxRQUFRLEtBQUssYUFBYSxLQUFLLElBQUk7QUFDekMsa0JBQU0sNkJBQVcsS0FBSztBQUN0QixlQUFPLEtBQUssU0FBUyxHQUFHO0FBQUEsTUFDMUI7QUFFQSxVQUFJLENBQUMsSUFBSSxJQUFJO0FBQ1gsWUFBSTtBQUVKLFlBQUk7QUFDRixnQkFBTSxPQUlGLE1BQU0sSUFBSSxLQUFLO0FBRW5CLGdCQUFNLFFBQVEsSUFBSSxNQUFNLEtBQUssT0FBTztBQUVwQyxnQkFBTSxPQUFPLEtBQUs7QUFDbEIsZ0JBQU0sT0FBTyxLQUFLO0FBRWxCLGdCQUFNO0FBQUEsUUFDUixRQUFRO0FBQ04sZ0JBQU0sSUFBSSxNQUFNLGVBQWUsSUFBSSxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUU7QUFBQSxRQUMvRDtBQUVBLGVBQU87QUFFUCxjQUFNO0FBQUEsTUFDUjtBQUVBLGFBQU87QUFBQSxJQUNULFNBQVMsR0FBRztBQUNWLFVBQUksS0FBTSxPQUFNO0FBRWhCLFlBQU0sU0FBUyxhQUFhLFNBQVMsbUJBQW1CLEtBQUssRUFBRSxPQUFPO0FBRXRFLFVBQUksQ0FBQyxVQUFVLFVBQVUsS0FBSyxhQUFhO0FBQ3pDLGVBQU8sS0FBSyxTQUFTLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFDckM7QUFFQSxZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGNBQWMsS0FBZTtBQUNuQyxVQUFNLFFBQVEsT0FBTyxJQUFJLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQztBQUN6RCxVQUFNLFlBQVksT0FBTyxJQUFJLFFBQVEsSUFBSSx1QkFBdUIsQ0FBQztBQUNqRSxVQUFNLGFBQWEsT0FBTyxJQUFJLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLE1BQU8sS0FBSyxJQUFJO0FBRWxGLFFBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxFQUFHLE1BQUssUUFBUTtBQUN2QyxRQUFJLENBQUMsT0FBTyxNQUFNLFNBQVMsRUFBRyxNQUFLLFlBQVk7QUFDL0MsUUFBSSxDQUFDLE9BQU8sTUFBTSxVQUFVLEVBQUcsTUFBSyxhQUFhO0FBQUEsRUFDbkQ7QUFDRjtBQWhHOEI7QUFBdkIsSUFBTSxtQkFBTjs7O0FDMEJQLElBQU0sY0FBYyx3QkFBQyxRQUF3RDtBQUMzRSxRQUFNLFdBQW1DLENBQUM7QUFFMUMsYUFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUSxHQUFHLEdBQUc7QUFDOUMsUUFBSSxTQUFTLEtBQU07QUFDbkIsVUFBTSxTQUFTLElBQUksUUFBUSxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sWUFBWSxDQUFDLEVBQUU7QUFDM0UsYUFBUyxNQUFNLElBQUk7QUFBQSxFQUNyQjtBQUVBLFNBQU87QUFDVCxHQVZvQjtBQWFwQixJQUFNLGNBQWMsd0JBQUMsV0FBZ0IsSUFBSSxnQkFBZ0IsWUFBWSxNQUFNLENBQUMsRUFBRSxTQUFTLEdBQW5FO0FBMkNiLElBQU0sVUFBTixNQUFNLFFBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBa0JYLFlBQTRCLFFBQWdCO0FBQWhCO0FBZG5DO0FBQUE7QUFBQTtBQUFBLHdCQUFPLE9BQU07QUFJYjtBQUFBO0FBQUE7QUFBQSx3QkFBTyxXQUFVO0FBSWpCO0FBQUE7QUFBQTtBQUFBLHdCQUFPLFVBQVMsSUFBSSxpQkFBaUI7QUFBQSxFQU1lO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU03QyxrQkFBa0IsU0FBaUI7QUFDeEMsU0FBSyxVQUFVO0FBQUEsRUFDakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sY0FBYyxPQUFlO0FBQ2xDLFNBQUssT0FBTyxjQUFjO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sSUFBSSxRQUFzQjtBQUMvQixVQUFNLE9BQU8sT0FBTyxZQUFZLE1BQU0sQ0FBQztBQUV2QyxXQUFPLEtBQUssUUFBeUIsSUFBSTtBQUFBLEVBQzNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFFBQVEsSUFBMEI7QUFDdkMsV0FBTyxLQUFLLFFBQXlCLE9BQU8sRUFBRSxFQUFFO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sVUFBVSxRQUFzQjtBQUNyQyxVQUFNLE9BQU8sY0FBYyxZQUFZLE1BQU0sQ0FBQztBQUU5QyxXQUFPLEtBQUssUUFBeUIsSUFBSTtBQUFBLEVBQzNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLE9BQU8sUUFBeUI7QUFDckMsUUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sV0FBVztBQUNsQyxZQUFNLFdBQVc7QUFBQSxRQUNmO0FBQUEsUUFDQTtBQUFBLFFBQ0EsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLE9BQU8sT0FBTyxTQUFTLENBQUMsRUFBRSxLQUFLLElBQUk7QUFBQSxNQUN4RDtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sVUFBVSxZQUFZLE1BQU0sQ0FBQztBQUUxQyxXQUFPLEtBQUssUUFBMkIsSUFBSTtBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxRQUFXLE1BQWMsU0FBbUM7QUFDdkUsUUFBSSxVQUFpQztBQUVyQyxVQUFNLGFBQWEsNkJBQU07QUFDdkIsWUFBTSxhQUFhLElBQUksZ0JBQWdCO0FBRXZDLGdCQUFVLFdBQVcsTUFBTTtBQUN6QixtQkFBVyxNQUFNO0FBQUEsTUFDbkIsR0FBRyxLQUFLLE9BQU8sRUFBRSxNQUFNO0FBRXZCLFlBQU0sRUFBRSxNQUFNLFNBQUFDLFNBQVEsSUFBSSxLQUFLLFdBQVc7QUFFMUMsWUFBTSxpQkFBaUIsU0FBUyxZQUFZQSxXQUFVLEdBQUcsSUFBSSxJQUFJQSxRQUFPO0FBRXhFLFlBQU0sT0FBb0I7QUFBQSxRQUN4QixRQUFRO0FBQUEsUUFDUixVQUFVO0FBQUEsUUFDVixRQUFRLFdBQVc7QUFBQSxRQUNuQixHQUFHO0FBQUEsUUFDSCxTQUFTO0FBQUEsVUFDUCxjQUFjLGtCQUFrQixLQUFLLE9BQU8sT0FBTyxJQUFJLGtCQUFrQixFQUFFLEdBQUcsUUFBUTtBQUFBLFVBQ3RGLGdCQUFnQjtBQUFBLFVBQ2hCLEdBQUcsU0FBUztBQUFBLFFBQ2Q7QUFBQSxNQUNGO0FBRUEsV0FBSyxPQUFPLE1BQU0sdUJBQXVCLElBQUksRUFBRTtBQUUvQyxhQUFPLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxLQUFLLFdBQVcsR0FBRyxJQUFJLE9BQU8sTUFBTSxJQUFJLElBQUksSUFBSTtBQUFBLElBQzdFLEdBMUJtQjtBQTRCbkIsVUFBTSxNQUFNLE1BQU0sS0FBSyxPQUFPLFFBQVEsVUFBVTtBQUVoRCxRQUFJLFFBQVMsY0FBYSxPQUFPO0FBRWpDLFdBQU8sSUFBSSxLQUFLO0FBQUEsRUFDbEI7QUFDRjtBQTVIb0I7QUFBYixJQUFNLFNBQU47OztBQ3RGUCxJQUFBQyx1QkFPTztBQUVQLElBQUFDLGdCQUEyQjtBQUszQixJQUFNLGNBQU4sTUFBTSxZQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZZixZQUFtQixRQUFnQjtBQUFoQjtBQUxuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx3QkFBTyxTQUFpRCxJQUFJLHlCQUF3QztBQUFBLEVBS2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRcEMsTUFBYSxRQUNYLFNBQ0EsU0FPMkI7QUFDM0IsUUFBSSxDQUFDLFNBQVMsTUFBTyxPQUFNLFdBQVcsbUJBQW1CO0FBQ3pELFVBQU0sT0FBTyxNQUFNLEtBQUssS0FBSyxTQUFTLE9BQU87QUFDN0MsVUFBTSxNQUFNLElBQUksaUJBQWlCLE1BQU0sU0FBUyxRQUFRLE9BQU8sUUFBUSxTQUFTLFFBQVEsV0FBVztBQUNuRyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxLQUNYLFNBQ0EsU0FLQTtBQUNBLFVBQU0scUJBQXFCLEtBQUssY0FBYyxRQUFRLE1BQU0sSUFBSSxTQUFTLEtBQUs7QUFFOUUsUUFDRSxvQkFBb0IsV0FBVyxjQUFjLFNBQVMsTUFDdEQsbUJBQW1CLE1BQU0sV0FBVywyQ0FBc0IsV0FDMUQ7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sV0FBTyx1Q0FBaUI7QUFBQSxNQUM1QixTQUFTLFFBQVEsTUFBTTtBQUFBLE1BQ3ZCLFdBQVcsUUFBUTtBQUFBLE1BQ25CLGdCQUFnQixRQUFRLE1BQU07QUFBQSxNQUM5QixVQUFVLFFBQVEsU0FBUyxJQUFJO0FBQUEsTUFDL0IsT0FBTyxLQUFLLE9BQU8sT0FBTyxjQUFjLE9BQU8sSUFBSTtBQUFBLE1BQ25ELE9BQU8sU0FBUztBQUFBLElBQ2xCLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFdBQVcsWUFBZ0Q7QUFDaEUsUUFBSSxzQkFBc0IsaUJBQWtCLGNBQWEsV0FBVztBQUVwRSxRQUFJO0FBQ0YsVUFBSSxXQUFXLE1BQU0sV0FBVywyQ0FBc0IsVUFBVyxRQUFPLFdBQVcsUUFBUTtBQUFBLElBQzdGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQWMsT0FBa0IsT0FBZ0I7QUFDckQsZUFBTyx5Q0FBbUIsT0FBTyxLQUFLO0FBQUEsRUFDeEM7QUFDRjtBQTlGaUI7QUFBakIsSUFBTSxhQUFOOzs7QUNKQSxJQUFNLHlCQUF5QjtBQVgvQjtBQW1CTyxJQUFNLGNBQU4sTUFBTSxZQUFnRDtBQUFBLEVBR3BELFlBQ0UsUUFDQSxVQUE2QjtBQUFBLElBQ2xDLGVBQWU7QUFBQSxFQUNqQixHQUNBO0FBSk87QUFDQTtBQUpULHNDQUFnQixvQkFBSSxJQUFrRDtBQUN0RSx3QkFBTztBQU9MLFNBQUssUUFBUSxZQUFZLEtBQUssUUFBUSxLQUFLLElBQUksR0FBRyxLQUFLLGFBQWEsRUFBRSxNQUFNO0FBQUEsRUFDOUU7QUFBQSxFQUVBLElBQVcsZ0JBQWdCO0FBQ3pCLFdBQU8sS0FBSyxRQUFRLGlCQUFpQjtBQUFBLEVBQ3ZDO0FBQUEsRUFFQSxNQUFhLFVBQVU7QUFDckIsZUFBVyxDQUFDLElBQUksS0FBSyxLQUFLLG1CQUFLLGdCQUFlO0FBQzVDLFVBQUksTUFBTSxXQUFXLEdBQUc7QUFDdEIsMkJBQUssZUFBYyxPQUFPLEVBQUU7QUFBQSxNQUM5QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFhLFFBQVE7QUFDbkIsdUJBQUssZUFBYyxNQUFNO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE1BQWEsVUFBVTtBQUNyQixXQUFPLENBQUMsR0FBRyxtQkFBSyxlQUFjLE9BQU8sQ0FBQztBQUFBLEVBQ3hDO0FBQUEsRUFFQSxNQUFhLFFBQVEsTUFBb0I7QUFDdkMsU0FBSyxPQUFPLFFBQVEsQ0FBQyxNQUFNO0FBQ3pCLFVBQUksbUJBQUssZUFBYyxJQUFJLEVBQUUsR0FBRyxFQUFHO0FBQ25DLHlCQUFLLGVBQWMsSUFBSSxFQUFFLEtBQUssSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO0FBQUEsSUFDcEUsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLE1BQWEsUUFBUSxTQUFvQztBQUN2RCxVQUFNLFNBQVMsbUJBQUssZUFBYyxJQUFJLFFBQVEsS0FBSztBQUNuRCxRQUFJLENBQUM7QUFDSCxhQUFPLElBQUksYUFBYSxLQUFLLFFBQVE7QUFBQSxRQUNuQyxPQUFPLFFBQVE7QUFBQSxRQUNmLGFBQWEsUUFBUTtBQUFBLFFBQ3JCLFdBQVcsUUFBUTtBQUFBLE1BQ3JCLENBQUM7QUFFSCxXQUFPLElBQUksYUFBYSxLQUFLLFFBQVE7QUFBQSxNQUNuQyxPQUFPLFFBQVE7QUFBQSxNQUNmLFFBQVEsQ0FBQyxPQUFPLElBQUk7QUFBQSxNQUNwQixVQUFVO0FBQUEsTUFDVixXQUFXLFFBQVE7QUFBQSxNQUNuQixhQUFhLFFBQVE7QUFBQSxJQUN2QixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBdkRFO0FBRDJEO0FBQXRELElBQU0sYUFBTjtBQTBEQSxJQUFNLGlDQUFOLE1BQU0sK0JBQTJDO0FBQUEsRUFFL0MsWUFBbUIsTUFBUyxjQUFzQix3QkFBd0I7QUFBdkQ7QUFEMUIsd0JBQU8sZUFBYztBQUVuQixRQUFJLE9BQU8sZ0JBQWdCLFVBQVU7QUFDbkMsV0FBSyxjQUFjLEtBQUssSUFBSSxJQUFJO0FBQUEsSUFDbEM7QUFBQSxFQUNGO0FBQUEsRUFFTyxhQUFhO0FBQ2xCLFFBQUksT0FBTyxLQUFLLGdCQUFnQixZQUFZLE1BQU0sS0FBSyxXQUFXLEtBQUssS0FBSyxjQUFjLEVBQUcsUUFBTztBQUNwRyxXQUFPLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxFQUM1QjtBQUNGO0FBWndEO0FBQWpELElBQU0sZ0NBQU47OztBekMzRFAsd0JBQWMsbUNBbEJkOzs7QTBDQUEsSUFBQUMsaUJBQXVCO0FBQ3ZCLElBQUFDLGtCQVNPO0FBdUJQLElBQUFDLHVCQUF5Qzs7O0FDakN6QyxJQUFBQyxrQkFBd0M7QUFLeEMsZUFBc0IseUJBQ3BCLFFBQ0EsT0FDQSxVQUNBLFVBQ0E7QUFDQSxNQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sUUFBUztBQUVuRCxNQUFJLFNBQVMsYUFBYSxDQUFDLFNBQVMsYUFBYSxTQUFTLFFBQVEsT0FBTyxTQUFTLE1BQU0sUUFBUSxJQUFJLElBQUk7QUFDdEcsUUFBSTtBQUNGLFlBQU0sT0FBTztBQUFBLElBQ2YsUUFBUTtBQUFBLElBRVI7QUFDQSxXQUFPLEtBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLFlBQVksS0FBSztBQUFBLEVBQ2xFO0FBRUEsTUFBSSxNQUFNLFFBQVEsY0FBYztBQUM5QixVQUFNLFVBQVUsS0FBSyxhQUFhLE1BQU0sT0FBTztBQUUvQyxRQUFJLFNBQVM7QUFDWCxZQUFNLEtBQUssVUFBVSxJQUFJO0FBQ3pCLGNBQVEsSUFBSSxPQUFPLG1CQUFtQixJQUFJO0FBQzFDLFVBQUksTUFBTSxhQUFhO0FBQ3JCLGNBQU0sTUFBTSxxRUFBcUU7QUFBQSxNQUNuRjtBQUFBLElBQ0YsT0FBTztBQUNMLFVBQUksUUFBUSxJQUFJLE9BQU8saUJBQWlCLEdBQUc7QUFDekMsY0FBTSxLQUFLLFVBQVUsS0FBSztBQUMxQixnQkFBUSxJQUFJLE9BQU8sbUJBQW1CLEtBQUs7QUFDM0MsWUFBSSxNQUFNLGFBQWE7QUFDckIsZ0JBQU0sTUFBTSwwRUFBMEU7QUFBQSxRQUN4RjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxTQUFTLGFBQWEsU0FBUyxhQUFhLFNBQVMsUUFBUSxPQUFPLFNBQVMsTUFBTSxRQUFRLElBQUksSUFBSTtBQUN0RyxRQUFJLFNBQVMsY0FBYyxRQUFRLFNBQVMsZUFBZSxTQUFTLFlBQVk7QUFDOUUsWUFBTSxLQUFLLFVBQVUsU0FBUyxVQUFVO0FBQUEsSUFDMUMsV0FDRSxTQUFTLFNBQVMsU0FBUyw0QkFBWSxtQkFDdkMsU0FBUyxZQUFZLFFBQ3JCLFNBQVMsYUFBYSxTQUFTLFVBQy9CO0FBQ0EsWUFBTSxLQUFLLFVBQVUsU0FBUyxRQUFRO0FBQ3RDLFVBQUksU0FBUyxVQUFVO0FBQ3JCLGlCQUFTLE1BQU0sUUFBUSxJQUFJLE1BQU0sa0JBQWtCLElBQUksRUFBRSxNQUFNLEtBQUssSUFBSTtBQUFBLE1BQzFFO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsU0FBUyxhQUFhLFNBQVMsY0FBYyxNQUFNLFFBQVEsSUFBSTtBQUNsRSxRQUFJLENBQUMsS0FBSyxhQUFhLE1BQU0sT0FBTyxFQUFHO0FBQ3ZDLFVBQU0sVUFBVSxXQUFXLE1BQU07QUFDL0IsVUFBSSxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQVEsRUFBRztBQUN4QyxVQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSxNQUFNLEVBQUUsRUFBRztBQUN2QyxVQUFJLE1BQU0sUUFBUSxhQUFjLE9BQU0sT0FBTztBQUM3QyxhQUFPLE9BQU8sS0FBSyxnQkFBZ0IsY0FBYyxLQUFLO0FBQUEsSUFDeEQsR0FBRyxNQUFNLFFBQVEsd0JBQXdCLENBQUMsRUFBRSxNQUFNO0FBQ2xELFVBQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsSUFBSSxPQUFPO0FBQUEsRUFDMUQ7QUFFQSxNQUFJLFNBQVMsYUFBYSxTQUFTLGNBQWMsTUFBTSxRQUFRLElBQUk7QUFDakUsVUFBTSxlQUFlLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsRUFBRTtBQUNwRSxVQUFNLGVBQWUsS0FBSyxhQUFhLE1BQU0sT0FBTztBQUNwRCxRQUFJLENBQUMsZ0JBQWdCLGNBQWM7QUFDakMsbUJBQWEsWUFBWTtBQUN6QixZQUFNLFNBQVMsT0FBTyxTQUFTLFNBQVMsTUFBTSxFQUFFLEVBQUU7QUFDbEQsYUFBTyxPQUFPLEtBQUssZ0JBQWdCLGlCQUFpQixLQUFLO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBRUEsTUFBSSxTQUFTLGFBQWEsU0FBUyxhQUFhLFNBQVMsY0FBYyxTQUFTLFdBQVc7QUFDekYsUUFBSSxTQUFTLFFBQVEsT0FBTyxTQUFTLE1BQU0sUUFBUSxJQUFJLElBQUk7QUFDekQsVUFBSSxNQUFNLGNBQWMsU0FBUyxRQUFRLE9BQU8sU0FBUyxNQUFNLFFBQVEsSUFBSSxHQUFJLE9BQU0sVUFBVSxTQUFTO0FBQ3hHLFlBQU0sZUFBZSxNQUFNLFNBQVMsSUFBSSxTQUFTLFNBQVMsTUFBTSxFQUFFLEVBQUU7QUFDcEUsWUFBTSxlQUFlLEtBQUssYUFBYSxNQUFNLE9BQU87QUFDcEQsVUFBSSxDQUFDLGdCQUFnQixjQUFjO0FBQ2pDLHFCQUFhLFlBQVk7QUFDekIsY0FBTSxTQUFTLE9BQU8sU0FBUyxTQUFTLE1BQU0sRUFBRSxFQUFFO0FBQ2xELGVBQU8sT0FBTyxLQUFLLGdCQUFnQixpQkFBaUIsS0FBSztBQUFBLE1BQzNELE9BQU87QUFDTCxjQUFNLFVBQVUsV0FBVyxNQUFNO0FBQy9CLGNBQUksTUFBTSxjQUFjLENBQUMsS0FBSyxhQUFhLE1BQU0sT0FBUSxFQUFHO0FBQzVELGNBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLE1BQU0sRUFBRSxFQUFHO0FBQ3ZDLGNBQUksTUFBTSxRQUFRLGFBQWMsT0FBTSxPQUFPO0FBQzdDLGlCQUFPLE9BQU8sS0FBSyxnQkFBZ0IsY0FBYyxLQUFLO0FBQUEsUUFDeEQsR0FBRyxNQUFNLFFBQVEsd0JBQXdCLENBQUMsRUFBRSxNQUFNO0FBQ2xELGNBQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsSUFBSSxPQUFPO0FBQUEsTUFDMUQ7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLFNBQVMsY0FBYyxNQUFNLFFBQVEsSUFBSTtBQUMzQyxjQUFNLGVBQWUsS0FBSyxhQUFhLE1BQU0sT0FBUTtBQUNyRCxZQUFJLENBQUMsYUFBYztBQUNuQixZQUFJLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsRUFBRSxFQUFHO0FBQ3RELGNBQU0sVUFBVSxXQUFXLE1BQU07QUFDL0IsY0FBSSxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQVEsRUFBRztBQUN4QyxjQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSxNQUFNLEVBQUUsRUFBRztBQUN2QyxjQUFJLE1BQU0sUUFBUSxhQUFjLE9BQU0sT0FBTztBQUM3QyxpQkFBTyxPQUFPLEtBQUssZ0JBQWdCLGNBQWMsS0FBSztBQUFBLFFBQ3hELEdBQUcsTUFBTSxRQUFRLHdCQUF3QixDQUFDLEVBQUUsTUFBTTtBQUNsRCxjQUFNLFNBQVMsSUFBSSxTQUFTLFNBQVMsTUFBTSxFQUFFLElBQUksT0FBTztBQUFBLE1BQzFELE9BQU87QUFDTCxjQUFNLGVBQWUsTUFBTSxTQUFTLElBQUksU0FBUyxTQUFTLE1BQU0sRUFBRSxFQUFFO0FBQ3BFLGNBQU0sZUFBZSxLQUFLLGFBQWEsTUFBTSxPQUFRO0FBQ3JELFlBQUksQ0FBQyxnQkFBZ0IsY0FBYztBQUNqQyx1QkFBYSxZQUFZO0FBQ3pCLGdCQUFNLFNBQVMsT0FBTyxTQUFTLFNBQVMsTUFBTSxFQUFFLEVBQUU7QUFDbEQsaUJBQU8sT0FBTyxLQUFLLGdCQUFnQixpQkFBaUIsS0FBSztBQUFBLFFBQzNEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFsSHNCOzs7QUNMdEIsdUJBQWlDO0FBQ2pDLElBQUFDLGlCQUFrQztBQTJDM0IsSUFBTSw0QkFBNEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUXZDLGdCQUFnQixLQUFhLGFBQXFCLE9BQW1DO0FBQ25GLFFBQUksVUFBVSxFQUFHLFFBQU87QUFFeEIsVUFBTUMsY0FBUywwQkFBUSxLQUFLLGNBQWM7QUFFMUMsVUFBTSxPQUFPLDZCQUFNLDBCQUEwQixvQkFBZ0IsMEJBQVEsS0FBSyxJQUFJLEdBQUcsYUFBYSxRQUFRLENBQUMsR0FBMUY7QUFFYixRQUFJO0FBRUYsWUFBTSxVQUF1QixRQUFRQSxPQUFNO0FBRTNDLFVBQUksUUFBUSxTQUFTLGFBQWE7QUFDaEMsZUFBTyxLQUFLO0FBQUEsTUFDZDtBQUVBLGFBQU87QUFBQSxJQUNULFFBQVE7QUFDTixhQUFPLEtBQUs7QUFBQSxJQUNkO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsUUFBUSxNQUFjLGlCQUFpQixHQUFrQjtBQUN2RCxRQUFJO0FBQ0YsVUFBSSxTQUFTLGtCQUFrQjtBQUM3QixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sTUFBTSwwQkFBMEIsb0JBQWdCLDBCQUFRLFFBQVEsUUFBUSxJQUFJLENBQUMsR0FBRyxNQUFNLGNBQWM7QUFDMUcsYUFBTyxLQUFLLFdBQVc7QUFBQSxJQUN6QixRQUFRO0FBQ04sYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQStCO0FBQzdCLFVBQU0sZUFBZSxDQUFDO0FBRXRCLGVBQVcsT0FBTyxzQkFBTyxTQUFTO0FBQ2hDLG1CQUFhLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDM0I7QUFFQSxVQUFNLFNBQVMsc0JBQU8sWUFBWTtBQUVsQyxRQUFJLFFBQVE7QUFDVixtQkFBYSxPQUFPLElBQUksSUFBSTtBQUFBLFFBQzFCLFlBQVksT0FBTyxRQUFRLFNBQVMsa0JBQWtCO0FBQUEsUUFDdEQsU0FBUyxPQUFPO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLE1BQ0wsTUFBTTtBQUFBLFFBQ0osa0JBQWtCLDBCQUEwQixRQUFRLGdCQUFnQjtBQUFBLFFBQ3BFLGdCQUFnQiwwQkFBMEIsUUFBUSxjQUFjO0FBQUEsTUFDbEU7QUFBQSxNQUNBLFNBQVM7QUFBQSxRQUNQLFdBQVcsMEJBQTBCLFFBQVEsV0FBVztBQUFBLFFBQ3hELG1CQUFtQiwwQkFBMEIsUUFBUSxpQkFBaUI7QUFBQSxRQUN0RSxjQUFjLDBCQUEwQixRQUFRLFlBQVk7QUFBQSxRQUM1RCxZQUFZLDBCQUEwQixRQUFRLFlBQVk7QUFBQSxRQUMxRCxhQUFhLDBCQUEwQixRQUFRLFdBQVc7QUFBQSxNQUM1RDtBQUFBLE1BQ0EsV0FBVztBQUFBLFFBQ1QsaUJBQWlCLDBCQUEwQixRQUFRLGVBQWU7QUFBQSxRQUNsRSxRQUFRLDBCQUEwQixRQUFRLFFBQVE7QUFBQSxRQUNsRCxzQkFBc0IsMEJBQTBCLFFBQVEsb0JBQW9CO0FBQUEsUUFDNUUsZ0NBQWdDLDBCQUEwQixRQUFRLDhCQUE4QjtBQUFBLFFBQ2hHLHFCQUFxQiwwQkFBMEIsUUFBUSxtQkFBbUI7QUFBQSxRQUMxRSxrQkFBa0IsMEJBQTBCLFFBQVEsZ0JBQWdCO0FBQUEsTUFDdEU7QUFBQSxNQUNBLFFBQVE7QUFBQSxJQUNWO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxpQkFBeUI7QUFDdkIsVUFBTSxTQUFTLDBCQUEwQixTQUFTO0FBQ2xELFVBQU0sT0FBTyxJQUFJLE9BQU8sRUFBRTtBQUUxQixVQUFNLFNBQW1CLENBQUM7QUFFMUIsV0FBTyxLQUFLLHFCQUFxQjtBQUNqQyxXQUFPLEtBQUssSUFBSTtBQUVoQixVQUFNLE9BQU8sT0FBTyxLQUFLLE1BQU07QUFFL0IsZUFBVyxRQUFRLE1BQU07QUFDdkIsWUFBTSxNQUFNO0FBRVosYUFBTyxLQUFLLEdBQUc7QUFFZixZQUFNLFVBQVUsT0FBTyxLQUFLLE9BQU8sR0FBRyxDQUFDO0FBRXZDLGlCQUFXLFdBQVcsU0FBUztBQUM3QixjQUFNLFNBQVM7QUFDZixjQUFNLFFBQVEsT0FBTyxHQUFHLEVBQUUsTUFBTSxLQUFLO0FBRXJDLGVBQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLFVBQVUsV0FBVyxLQUFLLFVBQVUsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFBQSxNQUNsRztBQUVBLGFBQU8sS0FBSyxFQUFFO0FBQUEsSUFDaEI7QUFFQSxXQUFPLEtBQUssSUFBSTtBQUVoQixXQUFPLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDekI7QUFDRjs7O0FGektBO0FBdUVPLElBQU0sVUFBTixNQUFNLGdCQUFlLG9CQUFrQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXFEckQsWUFBWSxRQUFnQixVQUE2QixDQUFDLEdBQUc7QUFDbEUsVUFBTSxDQUFDLFlBQVksS0FBSyxDQUFDO0FBckQzQixxQ0FBZTtBQUNmLGtEQUE0QixLQUFLLGlCQUFpQixLQUFLLElBQUk7QUFDM0Q7QUFDQTtBQUNBLDRDQUF5QztBQUN6QyxrQ0FBc0M7QUFRdEM7QUFBQTtBQUFBO0FBQUEsd0JBQWdCLE1BQUssOEJBQWMsU0FBUyxFQUFFLFNBQVM7QUFJdkQ7QUFBQTtBQUFBO0FBQUEsd0JBQWdCO0FBSWhCO0FBQUE7QUFBQTtBQUFBLHdCQUFnQjtBQUloQjtBQUFBO0FBQUE7QUFBQSx3QkFBTyxTQUFRLElBQUksaUJBQWlCLElBQUk7QUFJeEM7QUFBQTtBQUFBO0FBQUEsd0JBQWdCLGNBQWEsSUFBSSxXQUFXLElBQUk7QUFJaEQ7QUFBQTtBQUFBO0FBQUEsd0JBQU8sY0FBYSxJQUFJLDBCQUEwQixJQUFJO0FBSXREO0FBQUE7QUFBQTtBQUFBLHdCQUFPLFVBQVMsSUFBSSxvQkFBc0MsQ0FBQyxnQkFBZ0IsT0FBTyxnQkFBZ0IsV0FBVyxDQUFDO0FBSTlHO0FBQUE7QUFBQTtBQUFBLHdCQUFnQixXQUFVLFFBQU87QUFJakM7QUFBQTtBQUFBO0FBQUEsd0JBQWdCLFVBQVMsSUFBSSxPQUFPLElBQUk7QUFVdEMsUUFBSSxRQUFRLFlBQVk7QUFDdEIsVUFBSSxPQUFPLFFBQVEsZUFBZTtBQUNoQyxjQUFNLElBQUksVUFBVSxzREFBc0QsT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUUvRyxjQUFRLElBQUksY0FBYyxRQUFRO0FBQUEsSUFDcEM7QUFFQSxVQUFNLGVBQWUsY0FBYyxNQUFNO0FBTXpDLFNBQUssU0FBUztBQUVkLFFBQUksQ0FBQyxjQUFjO0FBQ2pCLFVBQUk7QUFDRixZQUFJLEVBQUUsa0JBQWtCLHlCQUFTO0FBQy9CLGVBQUs7QUFBQSxZQUNILDJDQUEyQyxnQkFBQUMsT0FBVTtBQUFBLFlBQ3JEO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLE1BQ0osS0FBSyxPQUFPLFFBQVEsbUJBQW1CLGtDQUNuQyxLQUFLLE9BQU8sUUFBUSxVQUNwQixJQUFJLGdDQUFnQixLQUFLLE9BQU8sUUFBUSxPQUFPO0FBRXJELFlBQUksQ0FBQyxJQUFJLElBQUksZ0NBQWdCLE1BQU0sZ0JBQWdCLEdBQUc7QUFDcEQsZUFBSyxLQUFLLCtDQUErQyx3QkFBd0I7QUFBQSxRQUNuRjtBQUFBLE1BQ0YsUUFBUTtBQUFBLE1BRVI7QUFBQSxJQUNGO0FBRUEsU0FBSyxVQUFVO0FBQUEsTUFDYix1QkFBdUI7QUFBQSxNQUN2QixpQkFBaUIsQ0FBQztBQUFBLE1BQ2xCLGlCQUFpQixDQUFDO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsTUFDbkIsWUFBWTtBQUFBLE1BQ1osWUFBWSxRQUFRLGVBQWUsT0FBTyxPQUFPLFFBQVEsY0FBYyxJQUFJLFdBQVcsSUFBSTtBQUFBLE1BQzFGLGlCQUFpQjtBQUFBLE1BQ2pCLFlBQVk7QUFBQSxNQUNaLGNBQWM7QUFBQSxNQUNkLHlCQUF5QjtBQUFBLE1BQ3pCLEdBQUc7QUFBQSxJQUNMO0FBRUEsUUFBSSxDQUFDLGNBQWM7QUFFakIsV0FBSyxPQUFPLHNCQUFzQjtBQUNsQyxXQUFLLE9BQU8sR0FBRyx1QkFBTyxrQkFBa0IsbUJBQUssMEJBQXlCO0FBQUEsSUFDeEUsT0FBTztBQUNMLFVBQUk7QUFFRixhQUFLLE9BQU8sNEJBQTRCLG1CQUFLLDBCQUF5QjtBQUFBLE1BQ3hFLFNBQVMsR0FBRztBQUNWLGFBQUs7QUFBQSxVQUNIO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFFBQUksT0FBTyxLQUFLLFFBQVEsZUFBZSxZQUFZLEtBQUssUUFBUSxhQUFhLEdBQUc7QUFDOUUseUJBQUsscUJBQXNCLFlBQVksTUFBTTtBQUMzQyxjQUFNLFFBQVEsWUFBWSxJQUFJO0FBQzlCLDJCQUFLLG9CQUFxQixXQUFXLE1BQU07QUFDekMsNkJBQUssY0FBZSxZQUFZLElBQUksSUFBSTtBQUN4QyxjQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0scUNBQXFDLG1CQUFLLGFBQVksSUFBSTtBQUFBLFFBQzdGLEdBQUcsQ0FBQyxFQUFFLE1BQU07QUFBQSxNQUNkLEdBQUcsS0FBSyxRQUFRLFVBQVUsRUFBRSxNQUFNO0FBQUEsSUFDcEM7QUFFQSxRQUFJLEtBQUssUUFBUSx5QkFBeUI7QUFDeEMsd0JBQWtCLEVBQUUsSUFBSSxhQUFhLElBQUk7QUFBQSxJQUMzQztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNuQixRQUFJLENBQUMsbUJBQUssWUFBVztBQUNuQix5QkFBSyxXQUFZLGNBQWM7QUFFL0IsWUFBTSxtQkFBbUIsbUJBQUssV0FBVSxRQUFRLEtBQUssbUJBQUssVUFBUztBQUVuRSx5QkFBSyxXQUFVLFVBQVUsQ0FBQyxPQUFPLGFBQWE7QUFDNUMsZUFBTyxjQUFjLFFBQVEsTUFBTSxNQUFNO0FBQ3ZDLGlCQUFPLGlCQUFpQixPQUFPLE1BQU07QUFDbkMsbUJBQU8sU0FBUztBQUFBLFVBQ2xCLENBQUM7QUFBQSxRQUNILENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUVBLFdBQU8sbUJBQUs7QUFBQSxFQUNkO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLG1CQUFtQkMsVUFBNEI7QUFDcEQsdUJBQUsscUJBQXNCQTtBQUFBLEVBQzdCO0FBQUEsRUFFTyxNQUFNLEdBQVc7QUFDdEIsV0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sUUFBZ0IsVUFBNkIsQ0FBQyxHQUFHO0FBQ3BFLFdBQU8sSUFBSSxRQUFPLFFBQVEsT0FBTztBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGFBQWE7QUFDdEIsV0FBTyxLQUFLLFFBQVEsY0FBYztBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFNBQVM7QUFDbEIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQVcsZUFBZTtBQUN4QixXQUFPLG1CQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXNCTyxxQkFBcUI7QUFDMUIsV0FBTztBQUFBLE1BQ0wsYUFBYSxLQUFLLE9BQU8sTUFBTTtBQUFBLE1BQy9CLG1CQUFtQixLQUFLLGNBQWM7QUFBQSxNQUN0QyxRQUFRLEtBQUssT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGVBQWU7QUFDcEIsV0FBTyxjQUFjLEtBQUssTUFBTTtBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE1BQWEsVUFBVTtBQUNyQixTQUFLLE1BQU0sTUFBTSxRQUFRLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUVoRCxRQUFJLENBQUMsS0FBSyxhQUFhLEdBQUc7QUFDeEIsV0FBSyxPQUFPLElBQUksdUJBQU8sa0JBQWtCLG1CQUFLLDBCQUF5QjtBQUV2RSxXQUFLLE9BQU8sc0JBQXNCO0FBQUEsSUFDcEM7QUFFQSxTQUFLLG1CQUFtQjtBQUN4QixTQUFLLE9BQU8sbUJBQW1CO0FBQy9CLFVBQU0sS0FBSyxXQUFXLGNBQWM7QUFDcEMsUUFBSSxtQkFBSyxxQkFBcUIsZUFBYyxtQkFBSyxvQkFBbUI7QUFDcEUsUUFBSSxtQkFBSyxvQkFBb0IsZUFBYyxtQkFBSyxtQkFBa0I7QUFBQSxFQUNwRTtBQUFBLEVBRVEsa0JBQWtCLFVBQXNCLFVBQXNCO0FBQ3BFLFVBQU0sUUFBUSxLQUFLLE1BQU0sSUFBSSxTQUFTLE1BQU0sRUFBRTtBQUM5QyxRQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sUUFBUztBQUduRCxVQUFNLGFBQWEsS0FBSyxPQUFPLEtBQUssZ0JBQWdCLGtCQUFrQixPQUFPLFVBQVUsUUFBUTtBQUUvRixRQUFJLGNBQWMsQ0FBQyxLQUFLLFFBQVEsc0JBQXVCO0FBRXZELFdBQU8sbUJBQUsscUJBQUwsV0FBeUIsTUFBTSxPQUFPLFVBQVU7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCTyxpQkFBaUIsVUFBc0IsVUFBNEI7QUFDeEUsU0FBSyxrQkFBa0IsVUFBVSxRQUFRO0FBQUEsRUFDM0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLHdCQUF3QjtBQUM3QixTQUFLLFFBQVEsd0JBQXdCO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLDBCQUEwQjtBQUMvQixTQUFLLFFBQVEsd0JBQXdCO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLDRCQUE0QjtBQUNqQyxXQUFPLENBQUMsQ0FBQyxLQUFLLFFBQVE7QUFBQSxFQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW1CQSxNQUFhLEtBQ1gsU0FDQSxPQUNBLFVBQTJDLENBQUMsR0FDQTtBQUM1QyxVQUFNLEtBQUssS0FBSyxPQUFPLFNBQVMsUUFBUSxPQUFPO0FBQy9DLFFBQUksQ0FBQyxJQUFJLGFBQWE7QUFDcEIsWUFBTSxXQUFXO0FBQUEsUUFDZjtBQUFBLFFBQ0E7QUFBQSxRQUNBLENBQUMsS0FBSyxjQUFjLGdCQUFnQixHQUFHLElBQUk7QUFBQSxNQUM3QztBQUVGLFVBQU0saUJBQWlCLGlCQUFpQixlQUFlLFFBQVEsTUFBTSxLQUFLLE9BQU8sT0FBTyxPQUFPO0FBQy9GLFVBQU0sU0FBVSxNQUFNLFFBQVEsY0FBYyxjQUFjLEtBQU07QUFDaEUsUUFBSSxPQUFPLFFBQVEsR0FBRztBQUNwQixZQUFNLFdBQVc7QUFBQSxRQUNmLHlCQUF5QixLQUFLLGlCQUFpQixPQUFPLFdBQVcsY0FBYyxLQUFLO0FBQUEsTUFDdEY7QUFBQSxJQUNGO0FBRUEsVUFBTSxRQUFRLEtBQUssTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLFdBQVc7QUFFN0QsUUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLG9DQUFvQztBQUNyRSxVQUFNLFFBQVEsTUFBTSxXQUFXLFFBQVEsRUFBRSxRQUFRLFFBQVEsT0FBTyxDQUFDO0FBQ2pFLFFBQUksS0FBSyxZQUFhLE1BQUssTUFBTSxzQkFBc0IsTUFBTSxFQUFFLDZCQUE2QjtBQUU1RixRQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sa0RBQWtEO0FBQ25GLFVBQU0sTUFBTSxRQUFRO0FBQ3BCLFFBQUksS0FBSyxZQUFhLE1BQUssTUFBTSxzQkFBc0IsTUFBTSxFQUFFLGdCQUFnQjtBQUUvRSxRQUFJO0FBQ0YsVUFBSSxDQUFDLE1BQU0sUUFBUyxPQUFNLE1BQU0sUUFBUSxJQUFJLFFBQVEsaUJBQWlCO0FBRXJFLFVBQUksQ0FBQyxPQUFPLFVBQVU7QUFDcEIsY0FBTSxTQUFTLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFBQSxNQUNqQyxPQUFPO0FBQ0wsY0FBTSxTQUFTLE9BQU8sUUFBUTtBQUFBLE1BQ2hDO0FBQ0EsVUFBSSxDQUFDLE1BQU0sVUFBVSxFQUFHLE9BQU0sTUFBTSxLQUFLLEtBQUssTUFBTSxRQUFRLGtCQUFrQjtBQUFBLElBQ2hGLFVBQUU7QUFDQSxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sbURBQW1EO0FBQ3BGLFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDM0I7QUFFQSxXQUFPO0FBQUEsTUFDTCxPQUFPLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDdEIsV0FBVyxPQUFPO0FBQUEsTUFDbEIsY0FBYztBQUFBLE1BQ2Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY0EsTUFBYSxPQUNYLGFBQ0EsVUFBeUIsQ0FBQyxHQUNIO0FBQ3ZCLFFBQUksdUJBQXVCLGFBQWMsUUFBTztBQUVoRCxRQUFJLFFBQVEsZUFBZSxLQUFNLFNBQVEsY0FBYyxLQUFLLE9BQU8sTUFBTSxRQUFRLFFBQVEsV0FBVztBQUNwRyxZQUFRLG9CQUFSLFFBQVEsa0JBQW9CLEtBQUssUUFBUTtBQUN6QyxZQUFRLHlCQUFSLFFBQVEsdUJBQXlCLFVBQVU7QUFFM0MsUUFBSSx1QkFBdUIsT0FBTztBQUNoQyxhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDNUIsVUFBVSxZQUFZLFlBQVk7QUFBQSxRQUNsQyxRQUFRLENBQUMsV0FBVztBQUFBLFFBQ3BCLE9BQU8sWUFBWTtBQUFBLFFBQ25CLFdBQVcsWUFBWTtBQUFBLFFBQ3ZCLFdBQVcsWUFBWTtBQUFBLFFBQ3ZCLGFBQWEsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBRUEsUUFBSSx1QkFBdUIsVUFBVTtBQUNuQyxhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDNUIsVUFBVTtBQUFBLFFBQ1YsUUFBUSxZQUFZO0FBQUEsUUFDcEIsT0FBTyxZQUFZO0FBQUEsUUFDbkIsV0FBVyxZQUFZLE9BQU8sQ0FBQyxHQUFHO0FBQUEsUUFDbEMsV0FBVyxVQUFVO0FBQUEsUUFDckIsYUFBYSxRQUFRO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0g7QUFFQSxRQUFJLE1BQU0sUUFBUSxXQUFXLEdBQUc7QUFDOUIsWUFBTSxTQUFTLFlBQVksT0FBTyxDQUFDLE1BQU0sYUFBYSxLQUFLO0FBQzNELGFBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxRQUM1QixVQUFVO0FBQUEsUUFDVjtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsV0FBVztBQUFBLFFBQ1gsV0FBVyxVQUFVO0FBQUEsUUFDckIsYUFBYSxRQUFRO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0g7QUFFQSxRQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sYUFBYSxXQUFXLEVBQUU7QUFFM0QsUUFBSSxZQUFrQyxNQUNwQyxXQUEwQjtBQUU1QixZQUFRLGlCQUFSLFFBQVEsZUFBaUIsVUFBVTtBQUNuQyxZQUFRLHlCQUFSLFFBQVEsdUJBQXlCLFVBQVU7QUFFM0MsUUFBSSxLQUFLO0FBQ1AsV0FBSztBQUFBLFFBQ0gsd0JBQXdCLFFBQVEsWUFBWSxtQ0FBbUMsUUFBUSxvQkFBb0I7QUFBQSxNQUM3RztBQUVGLFFBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixZQUFNLENBQUMsY0FBYyxHQUFHQyxNQUFLLElBQUksWUFBWSxNQUFNLEdBQUc7QUFDdEQsVUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLFlBQVksWUFBWSxvQkFBb0I7QUFFN0UsWUFBTSxvQkFBb0IsS0FBSyxXQUFXLE1BQU07QUFBQSxRQUM5QyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVcsV0FBVyxFQUFFLFVBQVUsS0FBSyxFQUFFLFVBQVUsU0FBUyxZQUFZO0FBQUEsTUFDdkY7QUFFQSxVQUFJLG1CQUFtQjtBQUNyQixZQUFJLEtBQUs7QUFDUCxlQUFLLE1BQU0sWUFBWSxZQUFZLG9CQUFvQixrQkFBa0IsVUFBVSxhQUFhO0FBQ2xHLG9CQUFZO0FBQ1osc0JBQWNBLE9BQU0sS0FBSyxHQUFHO0FBQzVCLG1CQUFXO0FBQUEsTUFDYixPQUFPO0FBQ0wsWUFBSSxLQUFLO0FBQ1AsZUFBSztBQUFBLFlBQ0gsNkNBQTZDLFlBQVk7QUFBQSxVQUMzRDtBQUFBLE1BQ0o7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhLE1BQU0sY0FBYyxXQUFXLFdBQVc7QUFDN0QsVUFBTSxFQUFFLE1BQU0sV0FBVyxNQUFNLElBQzdCLFFBQVEsaUJBQWlCLFVBQVUsT0FDL0IsY0FBYyxRQUFRLFlBQVksUUFBUSxvQkFBb0IsSUFDN0QsRUFBRSxNQUFNLFFBQVEsY0FBYyxPQUFPLFdBQVc7QUFFdkQsUUFBSSxLQUFLO0FBQ1AsV0FBSztBQUFBLFFBQ0gsNEJBQTRCLFNBQVMsR0FDbkMsYUFBYSxXQUFXLDJEQUEyRCxFQUNyRjtBQUFBLE1BQ0Y7QUFHRixRQUFJLFFBQVEsYUFBYSxXQUFXLE1BQU0sR0FBRztBQUMzQyxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBVSxDQUFDLENBQUMsZUFBZTtBQUM1RixrQkFBWSxLQUFLLFdBQVcsSUFBSSxRQUFRLGFBQWEsVUFBVSxDQUFDLENBQUM7QUFDakUsVUFBSSxDQUFDO0FBQ0gsZUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFVBQzVCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBLGFBQWEsUUFBUTtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxJQUNMO0FBR0EsUUFBSSxDQUFDLFdBQVc7QUFFZCxVQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3hCLFlBQUksS0FBSyxZQUFhLE1BQUssTUFBTSxtQkFBbUI7QUFDcEQsY0FBTUMsT0FBTSxNQUFNLEtBQUssWUFBWSxRQUFRO0FBQUEsVUFDekM7QUFBQSxVQUNBO0FBQUEsVUFDQSxhQUFhLFFBQVE7QUFBQSxRQUN2QixDQUFDO0FBRUQsWUFBSUEsTUFBSyxVQUFVLEdBQUc7QUFDcEIsY0FBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLHVCQUF1QixLQUFLLEVBQUU7QUFDL0QsaUJBQU9BO0FBQUEsUUFDVDtBQUVBLFlBQUksS0FBSyxZQUFhLE1BQUssTUFBTSx3QkFBd0IsS0FBSyxFQUFFO0FBQUEsTUFDbEU7QUFFQSxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0seUJBQXlCO0FBRzFELG1CQUVJLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRO0FBQ3ZDLFlBQUksUUFBUSxpQkFBaUIsU0FBUyxJQUFJLFVBQVUsRUFBRyxRQUFPO0FBQzlELGVBQU8sSUFBSSxTQUFTLE9BQU8sU0FBNEI7QUFBQSxNQUN6RCxDQUFDLElBQ0EsYUFBYTtBQUFBLElBQ3BCO0FBR0EsUUFBSSxDQUFDLFdBQVc7QUFDZCxVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0sc0NBQXNDO0FBQ3ZFLGFBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxRQUM1QjtBQUFBLFFBQ0E7QUFBQSxRQUNBLGFBQWEsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBRUEsUUFBSSxLQUFLLFlBQWEsTUFBSyxNQUFNLGtDQUFrQyxVQUFVLFVBQVUsZUFBZTtBQUN0RyxVQUFNLE1BQU0sTUFBTSxVQUNmLE9BQU8sT0FBTztBQUFBLE1BQ2IsTUFBTTtBQUFBLE1BQ04sYUFBYSxRQUFRO0FBQUEsTUFDckIsZ0JBQWdCLFFBQVE7QUFBQSxNQUN4QjtBQUFBLElBQ0YsQ0FBQyxFQUNBLE1BQU0sTUFBTSxJQUFJO0FBRW5CLFFBQUksS0FBSztBQUNQLFVBQUksS0FBSyxZQUFhLE1BQUssTUFBTSxnQ0FBZ0M7QUFDakUsWUFBTUMsVUFBUyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQ3BDO0FBQUEsUUFDQTtBQUFBLFFBQ0EsVUFBVSxJQUFJO0FBQUEsUUFDZCxRQUFRLElBQUk7QUFBQSxRQUNaO0FBQUEsUUFDQSxhQUFhLFFBQVE7QUFBQSxNQUN2QixDQUFDO0FBRUQsVUFBSSxDQUFDLFFBQVEsYUFBYTtBQUN4QixZQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0seUJBQXlCO0FBQzFELGNBQU0sS0FBSyxZQUFZLFFBQVFBLE9BQU07QUFBQSxNQUN2QztBQUVBLGFBQU9BO0FBQUEsSUFDVDtBQUVBLFFBQUksS0FBSyxZQUFhLE1BQUssTUFBTSwrRUFBK0U7QUFDaEgsVUFBTSxTQUFTLE1BQU0sS0FBSyxXQUFXO0FBQUEsTUFDbkMsT0FBTyxRQUNMLENBQUMsUUFBUSxpQkFBaUIsU0FBUyxJQUFJLFVBQVUsS0FDaEQsTUFBTSxJQUFJLFNBQVMsS0FBSyxLQUN6QixJQUFJLE9BQU8sT0FBTztBQUFBLFFBQ2hCLE1BQU07QUFBQSxRQUNOLGFBQWEsUUFBUTtBQUFBLFFBQ3JCLGdCQUFnQixRQUFRO0FBQUEsUUFDeEI7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNMO0FBQ0EsUUFBSSxDQUFDLFFBQVEsUUFBUTtBQUNuQixVQUFJLEtBQUs7QUFDUCxhQUFLLE1BQU0sd0NBQXdDLFFBQVEsVUFBVSxjQUFjLEtBQUssYUFBYTtBQUN2RyxhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDNUI7QUFBQSxRQUNBO0FBQUEsUUFDQSxhQUFhLFFBQVE7QUFBQSxRQUNyQixXQUFXLFFBQVE7QUFBQSxNQUNyQixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksS0FBSyxZQUFhLE1BQUssTUFBTSx1Q0FBdUMsT0FBTyxVQUFVLFVBQVUsR0FBRztBQUV0RyxVQUFNLE9BQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxNQUNsQztBQUFBLE1BQ0E7QUFBQSxNQUNBLFVBQVUsT0FBTyxPQUFPO0FBQUEsTUFDeEIsUUFBUSxPQUFPLE9BQU87QUFBQSxNQUN0QixXQUFXLE9BQU87QUFBQSxNQUNsQixhQUFhLFFBQVE7QUFBQSxJQUN2QixDQUFDO0FBRUQsUUFBSSxDQUFDLFFBQVEsYUFBYTtBQUN4QixVQUFJLEtBQUssWUFBYSxNQUFLLE1BQU0seUJBQXlCO0FBQzFELFlBQU0sS0FBSyxZQUFZLFFBQVEsSUFBSTtBQUFBLElBQ3JDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyxXQUFXO0FBQ2hCLFVBQU0sT0FBTyxJQUFJLE9BQU8sRUFBRTtBQUMxQixVQUFNLFVBQVUsU0FBUyxhQUFhLFFBQVEsVUFBVSxhQUFhLFNBQVM7QUFDOUUsVUFBTSxhQUFhO0FBQUEsTUFDakI7QUFBQSxNQUNBO0FBQUEsTUFDQSxxQkFBcUIsUUFBTyxPQUFPLEdBQ2pDLEtBQUssYUFBYSxJQUFJLEtBQUssY0FBYyxLQUFLLE1BQU0sQ0FBQyx5QkFBeUIsRUFDaEY7QUFBQSxNQUNBLG1CQUFtQixxQkFBQUMsT0FBYTtBQUFBLE1BQ2hDLGlCQUFpQixnQkFBQUwsT0FBVTtBQUFBLE1BQzNCLG1CQUFtQixRQUFRLE9BQU8sdUJBQXVCLE9BQU8sZUFBZSxRQUFRLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFBQSxPQUMvRyxNQUFNO0FBQ0wsWUFBSSxLQUFLLFFBQVEsZ0JBQWlCLFFBQU87QUFDekMsY0FBTSxPQUFPLHNCQUFPLFlBQVk7QUFDaEMsWUFBSSxDQUFDLEtBQU0sUUFBTztBQUVsQixlQUFPO0FBQUEsVUFDTCxhQUFhLEtBQUssT0FBTztBQUFBLFVBQ3pCLGNBQWMsS0FBSyxPQUFPO0FBQUEsVUFDMUIsYUFBYSxLQUFLLE1BQU07QUFBQSxVQUN4QixjQUFjLEtBQUssT0FBUSxTQUFTLGtCQUFrQixDQUFDO0FBQUEsUUFDekQsRUFBRSxLQUFLLElBQUk7QUFBQSxNQUNiLEdBQUc7QUFBQSxNQUNIO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUssV0FBVyxNQUNiLElBQUksQ0FBQyxNQUFNO0FBQ1YsZUFBTyxFQUFFO0FBQUEsTUFDWCxDQUFDLEVBQ0EsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsMEJBQTBCLGVBQWU7QUFBQSxJQUMzQztBQUVBLFdBQU8sV0FBVyxLQUFLLElBQUk7QUFBQSxFQUM3QjtBQUFBLEVBRUEsRUFBUyxPQUFPLFFBQVEsSUFBSTtBQUMxQixXQUFPLEtBQUssTUFBTSxNQUFNLE9BQU87QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxlQUFlLE1BQXdCO0FBQzVDLFdBQU8sSUFBSSxTQUFTLE1BQU0sSUFBSTtBQUFBLEVBQ2hDO0FBQ0Y7QUE1cEJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU40RDtBQUFBO0FBQUE7QUFBQTtBQVU1RCxjQVZXLFNBVVksV0FBa0I7QUFWcEMsSUFBTSxTQUFOOzs7QTFDaERQLElBQUFNLG9CQVdPO0FBQ1AsSUFBQUMsdUJBU087QUFHQSxJQUFNLFVBQWtCOyIsCiAgIm5hbWVzIjogWyJHdWlsZFF1ZXVlIiwgInRhcmdldCIsICJTZXJpYWxpemVkVHlwZSIsICJRdWV1ZVJlcGVhdE1vZGUiLCAidmVyc2lvbiIsICJ0YXJnZXQiLCAibW9kdWxlIiwgImhhbmRsZXIiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJoYW5kbGVyIiwgImhhbmRsZXIiLCAicmVzdWx0IiwgInRhcmdldCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgInRhcmdldCIsICJxdWVyeSIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicmVzb2x2ZSIsICJyZXNvbHZlIiwgIndhaXRGb3IiLCAiaW1wb3J0X2VxdWFsaXplciIsICJUcmFja1NraXBSZWFzb24iLCAidGFyZ2V0IiwgInJlc29sdmUiLCAiR3VpbGRRdWV1ZSIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF9wcm9taXNlcyIsICJ2ZXJzaW9uIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9mZm1wZWciLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZmZtcGVnIiwgInRhcmdldCIsICJkanNWZXJzaW9uIiwgImhhbmRsZXIiLCAicXVlcnkiLCAicmVzIiwgInJlc3VsdCIsICJkVm9pY2VWZXJzaW9uIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCJdCn0K
|
|
6198
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXIudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9ob29rcy9jb250ZXh0L2FzeW5jLWNvbnRleHQudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9zdHJlYW0vVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGNyZWF0ZUVyaXNDb21wYXQsIGlzRXJpc1Byb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuZXhwb3J0IHtcbiAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gIHR5cGUgUENNRmlsdGVycyxcbiAgUV9CVVRURVJXT1JUSCxcbiAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gIEJBU1NfRVFfQkFORFMsXG4gIEFGX05JR0hUQ09SRV9SQVRFLFxuICBBRl9WQVBPUldBVkVfUkFURSxcbiAgRmlsdGVyc0NoYWluIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGEsXG4gIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgRXJpcyBmcm9tICdlcmlzJztcblxudHlwZSBFcmlzVXNlclJlc29sdmFibGUgPSBFcmlzLlVzZXIgfCBzdHJpbmcgfCBFcmlzLk1lbWJlcjtcbnR5cGUgRXJpc0d1aWxkUmVzb2x2YWJsZSA9IEVyaXMuR3VpbGQgfCBzdHJpbmcgfCBFcmlzLk1lbWJlciB8IEVyaXMuR3VpbGRDaGFubmVsIHwgRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGllbnRQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGF0TmFtZShjbGllbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID8/IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNQcm94eShjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBFcmlzLkNsaWVudCB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID09PSAnRXJpcyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNDbGllbnQoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnZXJpcycpO1xuXG4gIGlmIChlcnJvcikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gIHJldHVybiBjbGllbnQgaW5zdGFuY2VvZiBlcmlzLkNsaWVudDtcbn1cblxuZnVuY3Rpb24gZGVjbGFyZVByb3BlcnR5KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eTxUPih0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiBUIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbn1cblxuLyoqXG4gKiBBbGxvd3MgRXJpcyBjbGllbnRzIHRvIGJlIHVzZWQgd2l0aCBkaXNjb3JkLXBsYXllci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIGNyZWF0ZXMgYSBwcm94eSBvYmplY3QgdGhhdCBpbnRlcmNlcHRzIGNlcnRhaW4gbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBkaXNjb3JkLXBsYXllci5cbiAqIEBwYXJhbSBjbGllbnQgVGhlIEVyaXMgY2xpZW50IHRvIGJlIHVzZWQuXG4gKiBAcmV0dXJucyBUaGUgRXJpcyBjbGllbnQgd2l0aCBkaXNjb3JkLXBsYXllciBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXJpc0NvbXBhdChjbGllbnQ6IEVyaXMuQ2xpZW50KTogQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuXG4gIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50KTtcblxuICBjb25zdCBlcmlzUHJveHkgPSBuZXcgUHJveHkoY2xpZW50LCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ3VzZXJzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1VzZXJzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnZ3VpbGRzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc0d1aWxkc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2NoYW5uZWxzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc0NoYW5uZWxzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5JzpcbiAgICAgICAgICByZXR1cm4gKGhhbmRsZXI6IChhLCBiKSA9PiB2b2lkKSA9PiBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBlcmlzUHJveHkgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZVN0YXRlVXBkYXRlUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgcHJveHk6IEVyaXMuQ2xpZW50LCBoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkge1xuICBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAobWVtYmVyLCBvbGRTdGF0ZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm94aWVkT2xkU3RhdGUgPSB7XG4gICAgICAgIGNoYW5uZWxJZDogb2xkU3RhdGUuY2hhbm5lbElELFxuICAgICAgICBzZXJ2ZXJNdXRlOiBvbGRTdGF0ZS5tdXRlLFxuICAgICAgICBzdXBwcmVzczogb2xkU3RhdGUuc3VwcHJlc3MsXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLmd1aWxkLmlkXG4gICAgICAgIH0sXG4gICAgICAgIG1lbWJlcjoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS51c2VyLmlkXG4gICAgICAgIH1cbiAgICAgIH0gYXMgVm9pY2VTdGF0ZTtcblxuICAgICAgY29uc3QgbWUgPSBtZW1iZXIuZ3VpbGQubWVtYmVycy5nZXQoY2xpZW50LnVzZXIuaWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRDaGFubmVsID0gbWVtYmVyLmd1aWxkLmNoYW5uZWxzLmdldChtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQpO1xuXG4gICAgICBjb25zdCBwcm94aWVkTmV3U3RhdGUgPSB7XG4gICAgICAgIGNoYW5uZWxJZDogbWVtYmVyLnZvaWNlU3RhdGUuY2hhbm5lbElELFxuICAgICAgICBzZXJ2ZXJNdXRlOiBtZW1iZXIudm9pY2VTdGF0ZS5tdXRlLFxuICAgICAgICBzdXBwcmVzczogbWVtYmVyLnZvaWNlU3RhdGUuc3VwcHJlc3MsXG4gICAgICAgIGNoYW5uZWw6IGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZlZENoYW5uZWwsIGNsaWVudCksXG4gICAgICAgIG1lbWJlcjoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuaWRcbiAgICAgICAgfSxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmd1aWxkLmlkLFxuICAgICAgICAgIG1lbWJlcnM6IHtcbiAgICAgICAgICAgIG1lOiB7XG4gICAgICAgICAgICAgIGlkOiBtZT8uaWQsXG4gICAgICAgICAgICAgIHZvaWNlOiB7XG4gICAgICAgICAgICAgICAgYXN5bmMgc2V0UmVxdWVzdFRvU3BlYWsodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgIHZvaWQgdmFsdWU7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWU/LnZvaWNlU3RhdGU7XG4gICAgICAgICAgICAgICAgICAvLyBpZiAobWUpIHtcbiAgICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuIG1lLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gYXMgVm9pY2VTdGF0ZTtcblxuICAgICAgcmV0dXJuIGhhbmRsZXIocHJveGllZE5ld1N0YXRlLCBwcm94aWVkT2xkU3RhdGUpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQ6IEVyaXMuQ2xpZW50KSB7XG4gIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIGFueT4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgaWYgKCFhZGFwdGVycykge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGFkYXB0ZXJzID0gY29sbGVjdGlvbjtcbiAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgfVxuXG4gIGNsaWVudC5vbignc2hhcmREaXNjb25uZWN0JywgKF8sIHNoYXJkSWQpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtndWlsZElkLCBhZGFwdGVyXSBvZiBhZGFwdGVycy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChjbGllbnQuZ3VpbGRzLmdldChndWlsZElkKT8uc2hhcmQuaWQgPT09IHNoYXJkSWQpIHtcbiAgICAgICAgYWRhcHRlci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjbGllbnQub24oJ3Jhd1dTJywgKHBhY2tldCkgPT4ge1xuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU2VydmVyVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhO1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVNlcnZlclVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICAgIGlmIChwYXlsb2FkLmd1aWxkX2lkICYmIHBheWxvYWQuc2Vzc2lvbl9pZCAmJiBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKSB7XG4gICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNDaGFubmVsc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IEVyaXNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgRXJpcy5HdWlsZENoYW5uZWwsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEVyaXNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBFcmlzLkNsaWVudClcbjogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBFcmlzLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fCB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShndWlsZDogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCwgY2xpZW50OiBFcmlzLkNsaWVudCk6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcihndWlsZDogRXJpcy5HdWlsZCwgY2xpZW50OiBFcmlzLkNsaWVudCk6IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3Ige1xuICByZXR1cm4gKG1ldGhvZHMpID0+IHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgYWRhcHRlcnMuc2V0KGd1aWxkLmlkLCBtZXRob2RzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChndWlsZC5zaGFyZC5zdGF0dXMgIT09ICdyZWFkeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZ3VpbGQuc2hhcmQuc2VuZFdTKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1VzZXJzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IE91dE9mU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQgfSBmcm9tXG4nQHdlYi1zY3JvYmJsZXIvbWV0YWRhdGEtZmlsdGVyJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWUge1xuICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIFV0aWxzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAvKipcbiAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdkZW5vJywgdmVyc2lvbjogRGVuby52ZXJzaW9uLmRlbm8gfTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICByZXR1cm4geyBuYW1lOiAndW5rbm93bicsIHZlcnNpb246IHZlcnNpb24gPz8gJ3Vua25vd24nIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKS5cbiAgICBtYXAoKG0pID0+IGlzTmFOKG0pID8gMCA6IG0pLlxuICAgIGpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICB9IGFzIFRpbWVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5maWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5tYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICBjb25zdCBmaW5hbCA9IHBhcnNlZC5cbiAgICBzbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSkuXG4gICAgbWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSkuXG4gICAgam9pbignOicpO1xuXG4gICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZHVyYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICByZXR1cm4gY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAqL1xuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbHRlck9wdHMgPSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFjazogW1xuICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XVxuXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3BvdGlmeUZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcbiAgICAgIHNwb3RpZnlGaWx0ZXIuZXh0ZW5kKGNyZWF0ZVNwb3RpZnlGaWx0ZXIoKSk7XG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICByZXR1cm4geW91dHViZSh0aXRsZSk7XG4gICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgIHJldHVybiBzcG90aWZ5RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdEZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVyIHJlcXVpcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gIH1cblxuICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICBjb25zdCByZXMgPSByZXF1aXJlKGxpYik7XG4gICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgICAgLy8gbm8/XG4gICAgICAgIH19XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBjb2RlID0gJ0RlcHJlY2F0aW9uV2FybmluZycsIGRldGFpbD86IHN0cmluZykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobWVzc2FnZSwge1xuICAgICAgY29kZSxcbiAgICAgIGRldGFpbFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHJhbmRvbUNob2ljZTxUPihzcmM6IFRbXSk6IFQge1xuICAgIHJldHVybiBzcmNbcmFuZG9tSW50KHNyYy5sZW5ndGgpXTtcbiAgfVxuXG4gIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgY29uc3QgYXJyID0gc3JjLnNsaWNlKCk7XG5cbiAgICBsZXQgbSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAobSkge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBWQUxJREFURV9RVUVVRV9DQVAgPSAocXVldWU6IEd1aWxkUXVldWUsIGl0ZW1zOiBQbGF5bGlzdCB8IFRyYWNrIHwgVHJhY2tbXSkgPT4ge1xuICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgaWYgKHF1ZXVlLm1heFNpemUgPCAxIHx8IHF1ZXVlLm1heFNpemUgPT09IEluZmluaXR5KSByZXR1cm47XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXJyb3IoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IFV0aWwgfTsiLCAiaW1wb3J0IHsgVXNlciwgZXNjYXBlTWFya2Rvd24sIFNub3dmbGFrZVV0aWwsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgQVBJVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFBsYXlsaXN0SlNPTiB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5cbmV4cG9ydCB0eXBlIFRyYWNrUmVzb2x2YWJsZSA9IFRyYWNrIHwgc3RyaW5nIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBXaXRoTWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdCwgTT4gPSBUICYge1xuICBtZXRhZGF0YTogTTtcbiAgcmVxdWVzdE1ldGFkYXRhKCk6IFByb21pc2U8TT47XG59O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkVHJhY2sgPSBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT47XG5cbi8qKlxuICogVGhlIHRyYWNrIHNvdXJjZTpcbiAqIC0gc291bmRjbG91ZFxuICogLSB5b3V0dWJlXG4gKiAtIHNwb3RpZnlcbiAqIC0gYXBwbGVfbXVzaWNcbiAqIC0gYXJiaXRyYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrU291cmNlID0gJ3NvdW5kY2xvdWQnIHwgJ3lvdXR1YmUnIHwgJ3Nwb3RpZnknIHwgJ2FwcGxlX211c2ljJyB8ICdhcmJpdHJhcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhd1RyYWNrRGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3RcbiAgICovXG4gIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlXG4gICAqL1xuICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBlbmdpbmVcbiAgICovXG4gIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIC8qKlxuICAgKiBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAgICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJhdyBkYXRhXG4gICAqL1xuICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogVGhlIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbiAgLyoqXG4gICAqIFRoZSBzZXJpYWxpemVkIHRpdGxlXG4gICAqL1xuICBjbGVhblRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB2aWV3c1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgcmF3OiBhbnk7XG4gIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG4gIHB1YmxpYyBjbGVhblRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBicmlkZ2VkRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBicmlkZ2VkVHJhY2s6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLCBkYXRhOiBQYXJ0aWFsPFdpdGhNZXRhZGF0YTxSYXdUcmFja0RhdGEsIFQ+Pikge1xuICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmwgPz8gJyc7XG4gICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICB0aGlzLnZpZXdzID0gZGF0YS52aWV3cyA/PyAwO1xuICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB0aGlzLnBsYXlsaXN0ID0gZGF0YS5wbGF5bGlzdDtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSA/PyBudWxsO1xuICAgIHRoaXMuX19yZXFNZXRhZGF0YUZuID0gZGF0YS5yZXF1ZXN0TWV0YWRhdGEgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZTxUIHwgbnVsbD4obnVsbCkpO1xuICAgIHRoaXMuY2xlYW5UaXRsZSA9IGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGF1ZGlvIHJlc291cmNlIGZvciB0aGlzIHRyYWNrLiBUaGlzIGlzIG5vdCB1c2VmdWwgb3V0c2lkZSBvZiB0aGUgbGlicmFyeS5cbiAgICogQHBhcmFtIHJlc291cmNlIEF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgc2V0UmVzb3VyY2UocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbCkge1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2UgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICB0aGlzLnNldE1ldGFkYXRhKHJlcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maW5kKChxKSA9PiBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgdHJhY2sgZnJvbSBzZXJpYWxpemVkIGRhdGFcbiAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIGRhdGEgU2VyaWFsaXplZCBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHBsYXllci5jbGllbnQsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KSgpIDpcbiAgICAgIG51bGwsXG4gICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRyYWNrLnNldE1ldGFkYXRhKGRhdGEubWV0YWRhdGEpO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRCZWxvbmdpbmdRdWV1ZXMoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpKTtcblxuICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGVzO1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiB0aGlzLnRpbWVzdGFtcFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE91dE9mU3BhY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLCBgTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmdUeXBlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsIGBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1JFU1VMVCwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9JTVBMRU1FTlRFRCwgYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEV4aXN0aW5nRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElORywgYCR7dGFyZ2V0fSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlJhbmdlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWluaW11bTogc3RyaW5nLCBtYXhpbXVtOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX09VVF9PRl9SQU5HRSxcbiAgICAgIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWluaW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTixcbiAgICAgIG1lc3NhZ2UgfHwgJ05vIHZvaWNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCwgJ0Nhbm5vdCB1c2UgZGVzdHJveWVkIHZvaWNlIGNvbm5lY3Rpb24nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNoYW5uZWxFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NIQU5ORUwsICdDb3VsZCBub3QgZ2V0IHRoZSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRWb2ljZUNoYW5uZWxFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTCwgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1JlY2VpdmVyRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9OT19SRUNFSVZFUixcbiAgICAgIG1lc3NhZ2UgfHwgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19BVURJT19SRVNPVVJDRSwgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5GT19SRVFVSVJFRCwgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCwgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQsIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtpZCA/IGAoRXh0cmFjdG9yIEV4ZWN1dGlvbiBDb250ZXh0IElEIGlzICR7aWR9KWAgOiAnJ31GYWlsZWQgdG8gYnJpZGdlIHRoaXMgcXVlcnk6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0ge1xuICBFUlJfT1VUX09GX1NQQUNFOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBFUlJfTk9fUkVTVUxUOiAnRVJSX05PX1JFU1VMVCcsXG4gIEVSUl9OT1RfSU1QTEVNRU5URUQ6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgRVJSX05PVF9FWElTVElORzogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICBFUlJfT1VUX09GX1JBTkdFOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiAnRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04nLFxuICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDogJ0VSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwnLFxuICBFUlJfTk9fUkVDRUlWRVI6ICdFUlJfTk9fUkVDRUlWRVInLFxuICBFUlJfRkZNUEVHX0xPQ0FUT1I6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6ICdFUlJfTk9fQVVESU9fUkVTT1VSQ0UnLFxuICBFUlJfTk9fR1VJTERfUVVFVUU6ICdFUlJfTk9fR1VJTERfUVVFVUUnLFxuICBFUlJfTk9fR1VJTEQ6ICdFUlJfTk9fR1VJTEQnLFxuICBFUlJfSU5GT19SRVFVSVJFRDogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgRVJSX1NFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gIEVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFOiAnRVJSX05PVF9FWElTVElOR19NT0RVTEUnLFxuICBFUlJfQlJJREdFX0ZBSUxFRDogJ0VSUl9CUklER0VfRkFJTEVEJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlcyA9ICh0eXBlb2YgRXJyb3JDb2Rlcylba2V5b2YgdHlwZW9mIEVycm9yQ29kZXNdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgZXJyb3IgaW5zdGFuY2VvZiBEaXNjb3JkUGxheWVyRXJyb3I7XG59XG5cbi8qKlxuICogSGFuZGxlIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAgZXJyb3IuXG4gKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGhhbmRsZVxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZXJyb3IgaXMgYSBgRGlzY29yZFBsYXllckVycm9yYC5cbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgaGFuZGxlclxuICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgLy8gLi4uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcihlcnJvciwgKGVycm9yKSA9PiB7XG4gKiAgICBjb25zb2xlLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBmcm9tIGRpc2NvcmQtcGxheWVyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gKiAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcjxcbiAgVCBleHRlbmRzIGFueVtdLFxuICBGIGV4dGVuZHMgKGVycm9yOiBEaXNjb3JkUGxheWVyRXJyb3IsIC4uLmFyZ3M6IFQpID0+IGFueSxcbiAgUiBleHRlbmRzIFJldHVyblR5cGU8Rj4+KFxuZXJyb3I6IGFueSwgaGFuZGxlcjogRiwgYXJnczogVCk6IFIge1xuICBpZiAoaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIoZXJyb3IsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkIGFzIFI7XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyIsICJpbXBvcnQgeyBEaXNjb3JkUGxheWVyRXJyb3IsIGlzRGlzY29yZFBsYXllckVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gVHlwZVV0aWw7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdCA9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRGlzY29yZFBsYXllckVycm9yKHQ6IHVua25vd24pOiB0IGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gICAgcmV0dXJuIGlzRGlzY29yZFBsYXllckVycm9yKHQpO1xuICB9XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRGVzZXJpYWxpemF0aW9uRXJyb3IsIFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgdHlwZSBTZXJpYWxpemVkVHJhY2ssIFRyYWNrLCBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgZW51bSBTZXJpYWxpemVkVHlwZSB7XG4gIFRyYWNrID0gJ3RyYWNrJyxcbiAgUGxheWxpc3QgPSAncGxheWxpc3QnLFxufVxuXG5leHBvcnQgdHlwZSBFbmNvZGFibGUgPSBTZXJpYWxpemVkVHJhY2sgfCBTZXJpYWxpemVkUGxheWxpc3Q7XG5cbmNvbnN0IGlzVHJhY2sgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkVHJhY2sgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBUcmFjaykgcmV0dXJuIGRhdGEuc2VyaWFsaXplKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gIGlmIChpc1BsYXlsaXN0KGRhdGEpKSByZXR1cm4gUGxheWxpc3QuZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcblxuICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXJyb3IoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiBFbmNvZGFibGUpIHtcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICBjb25zdCBzdHIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkUGxheWxpc3QgPSBSZXR1cm5UeXBlPFBsYXlsaXN0WydzZXJpYWxpemUnXT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RJbml0RGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHRyYWNrczogVHJhY2tbXTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAqL1xuICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAgICovXG4gIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gICAqL1xuICByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gICAqL1xuICB0cmFja3M6IFRyYWNrSlNPTltdO1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWxpc3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gIHB1YmxpYyB0cmFja3M6IFRyYWNrW107XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICBwdWJsaWMgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICBwdWJsaWMgYXV0aG9yOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gIC8qKlxuICAgKiBQbGF5bGlzdCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIHtQbGF5bGlzdEluaXREYXRhfSBkYXRhIFRoZSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXJcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgKiBAdHlwZSB7UGxheWVyfVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdHJhY2tzXG4gICAgICogQHR5cGUge1RyYWNrW119XG4gICAgICovXG4gICAgdGhpcy50cmFja3MgPSBkYXRhLnRyYWNrcyA/PyBbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2F1dGhvclxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2Rlc2NyaXB0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3RodW1ibmFpbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAqIC0gYGFsYnVtYFxuICAgICAqIC0gYHBsYXlsaXN0YFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhpcyBwbGF5bGlzdDpcbiAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAqIC0gYHNvdW5kY2xvdWRgXG4gICAgICogLSBgc3BvdGlmeWBcbiAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICogQG5hbWUgUGxheWxpc3Qjc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnNvdXJjZSA9IGRhdGEuc291cmNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICogQG5hbWUgUGxheWxpc3QjaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3VybFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy51cmwgPSBkYXRhLnVybDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNyYXdQbGF5bGlzdFxuICAgICAqIEB0eXBlIHthbnl9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMudHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhUcmFja3M9dHJ1ZV0gSWYgaXQgc2hvdWxkIGJ1aWxkIGpzb24gd2l0aCB0cmFja3NcbiAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICovXG4gIHRvSlNPTih3aXRoVHJhY2tzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgdHJhY2tzOiBbXSBhcyBUcmFja0pTT05bXVxuICAgIH07XG5cbiAgICBpZiAod2l0aFRyYWNrcykgcGF5bG9hZC50cmFja3MgPSB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0udG9KU09OKHRydWUpKTtcblxuICAgIHJldHVybiBwYXlsb2FkIGFzIFBsYXlsaXN0SlNPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBpbnRvIHJlY29uc3RydWN0YWJsZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS5zZXJpYWxpemUoKSksXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBUeXBlVXRpbC5pc1N0cmluZyh0aGlzLnRodW1ibmFpbCkgPyB0aGlzLnRodW1ibmFpbCA6IHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuUGxheWxpc3QsXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdkYXRhJywgJ1NlcmlhbGl6ZWRQbGF5bGlzdCcsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgIHJldHVybiBuZXcgUGxheWxpc3QocGxheWVyLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgdHJhY2tzOiBkYXRhLnRyYWNrcy5tYXAoKG0pID0+IFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgbSkpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHBsYXlsaXN0IHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHBsYXlsaXN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBJbmZvUmVxdWlyZWRFcnJvciwgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86cGxheWxpc3RcXC98XFw/dXJpPXNwb3RpZnk6cGxheWxpc3Q6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeUFsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID1cbi9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS18cG0tKT9bYS16QS1aMC05XSskLztcbmNvbnN0IGFwcGxlTXVzaWNBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC9zZXRzXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3QgeW91dHViZVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKHd3dy4pP3lvdXR1YmUuY29tXFwvcGxheWxpc3RcXD9saXN0PSgoUEx8Rkx8VVV8TEx8UkR8T0wpW2EtekEtWjAtOS1fXXsxNiw0MX0pJC87XG5jb25zdCB5b3V0dWJlVmlkZW9VUkxSZWdleCA9XG4vXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gZGlzY29yZC1wbGF5ZXI6Ly9ibG9iL3V1aWQtdjRcbmNvbnN0IGRpc2NvcmRQbGF5ZXJCbG9iUmVnZXggPSAvXmRpc2NvcmQtcGxheWVyOlxcL1xcL2Jsb2JcXC9cXGQrJC87XG4vLyAjZW5kcmVnaW9uIHNjYXJ5IHRoaW5ncyBhYm92ZSAqc2lnaCpcblxuY29uc3QgRG9tYWluc01hcCA9IHtcbiAgRGlzY29yZFBsYXllcjogWydkaXNjb3JkLXBsYXllciddLFxuICBZb3VUdWJlOiBbJ3lvdXR1YmUuY29tJywgJ3lvdXR1LmJlJywgJ211c2ljLnlvdXR1YmUuY29tJywgJ2dhbWluZy55b3V0dWJlLmNvbScsICd3d3cueW91dHViZS5jb20nLCAnbS55b3V0dWJlLmNvbSddLFxuICBTcG90aWZ5OiBbJ29wZW4uc3BvdGlmeS5jb20nLCAnZW1iZWQuc3BvdGlmeS5jb20nXSxcbiAgVmltZW86IFsndmltZW8uY29tJywgJ3BsYXllci52aW1lby5jb20nXSxcbiAgUmV2ZXJiTmF0aW9uOiBbJ3JldmVyYm5hdGlvbi5jb20nXSxcbiAgU291bmRDbG91ZDogWydzb3VuZGNsb3VkLmNvbSddLFxuICBBcHBsZU11c2ljOiBbJ211c2ljLmFwcGxlLmNvbSddXG59O1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IHJlZGlyZWN0RG9tYWlucyA9IG5ldyBTZXQoW1xuL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG4vXmh0dHBzOlxcL1xcL29uXFwuc291bmRjbG91ZFxcLmNvbVxcL1thLXpBLVoxLTldezAsMTd9JC9dXG4pO1xuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiAtIERJU0NPUkRfUExBWUVSX0JMT0JcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFF1ZXJ5VHlwZVxuICovXG5leHBvcnQgY29uc3QgUXVlcnlUeXBlID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFlPVVRVQkU6ICd5b3V0dWJlJyxcbiAgWU9VVFVCRV9QTEFZTElTVDogJ3lvdXR1YmVQbGF5bGlzdCcsXG4gIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICBTT1VORENMT1VEX1BMQVlMSVNUOiAnc291bmRjbG91ZFBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRDogJ3NvdW5kY2xvdWQnLFxuICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gIFNQT1RJRllfQUxCVU06ICdzcG90aWZ5QWxidW0nLFxuICBTUE9USUZZX1BMQVlMSVNUOiAnc3BvdGlmeVBsYXlsaXN0JyxcbiAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgRkFDRUJPT0s6ICdmYWNlYm9vaycsXG4gIFZJTUVPOiAndmltZW8nLFxuICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICBSRVZFUkJOQVRJT046ICdyZXZlcmJuYXRpb24nLFxuICBZT1VUVUJFX1NFQVJDSDogJ3lvdXR1YmVTZWFyY2gnLFxuICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgU09VTkRDTE9VRF9TRUFSQ0g6ICdzb3VuZGNsb3VkU2VhcmNoJyxcbiAgQVBQTEVfTVVTSUNfU09ORzogJ2FwcGxlTXVzaWNTb25nJyxcbiAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICBBUFBMRV9NVVNJQ19QTEFZTElTVDogJ2FwcGxlTXVzaWNQbGF5bGlzdCcsXG4gIEFQUExFX01VU0lDX1NFQVJDSDogJ2FwcGxlTXVzaWNTZWFyY2gnLFxuICBGSUxFOiAnZmlsZScsXG4gIEFVVE9fU0VBUkNIOiAnYXV0b1NlYXJjaCcsXG4gIERJU0NPUkRfUExBWUVSX0JMT0I6ICdkaXNjb3JkUGxheWVyQmxvYidcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5VHlwZSA9ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8IFF1ZXJ5VHlwZTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgdHlwZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuICBxdWVyeTogc3RyaW5nO1xufVxuXG5jbGFzcyBRdWVyeVJlc29sdmVyIHtcbiAgLyoqXG4gICAqIFF1ZXJ5IHJlc29sdmVyXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICBzdGF0aWMgZ2V0IHJlZ2V4KCkge1xuICAgIHJldHVybiB7XG4gICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgIHZpbWVvUmVnZXgsXG4gICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4LFxuICAgICAgZGlzY29yZFBsYXllckJsb2JSZWdleFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlLXJlc29sdmUgcmVkaXJlY3QgdXJsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIHByZVJlc29sdmUocXVlcnk6IHN0cmluZywgbWF4RGVwdGggPSA1KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzU3RyaW5nKHF1ZXJ5KSkgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdydcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgIC8vIHNwb3RpZnkgZG9lcyBub3QgXCJyZWRpcmVjdFwiLCBpdCByZXR1cm5zIGEgcGFnZSB3aXRoIGpzIHRoYXQgcmVkaXJlY3RzXG4gICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LnNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uc3BsaXQoJz9zaT0nKVswXTtcblxuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGJyZWFrO1xuXG4gICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8ke3RhcmdldH1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbWF4RGVwdGggPCAxID8gcmVzLnVybCA6IHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihxdWVyeSwgJ3N0cmluZycsIHR5cGVvZiBxdWVyeSk7XG4gICAgaWYgKCFxdWVyeS5sZW5ndGgpIHRocm93IG5ldyBJbmZvUmVxdWlyZWRFcnJvcigncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gKHR5cGU6IHR5cGVvZiBmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnk6IHN0cmluZykgPT4gKHsgdHlwZSwgcXVlcnkgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ESVNDT1JEX1BMQVlFUl9CTE9CLCBxdWVyeSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChxdWVyeSk7XG5cbiAgICAgIGlmIChEb21haW5zTWFwLllvdVR1YmUuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvKG0odXNpYyk/fGdhbWluZylcXC4vLCAnJykudHJpbSgpO1xuICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgY29uc3QgdmlkZW9JZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd2Jyk7XG4gICAgICAgIGlmIChwbGF5bGlzdElkKSB7XG4gICAgICAgICAgaWYgKHZpZGVvSWQgJiYgcGxheWxpc3RJZC5zdGFydHNXaXRoKCdSRCcpKVxuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUXVlcnlSZXNvbHZlci52YWxpZGF0ZUlkKHF1ZXJ5KSB8fCBRdWVyeVJlc29sdmVyLnZhbGlkYXRlVVJMKHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1ZJREVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNwb3RpZnkuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvaW50bC0oW2EtekEtWl0rKVxcLy8sICcnKTtcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHNwb3RpZnlBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHNwb3RpZnlTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9TT05HLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlZpbWVvLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5WSU1FTywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5SZXZlcmJOYXRpb24uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChyZXZlcmJuYXRpb25SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5SRVZFUkJOQVRJT04sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU291bmRDbG91ZC5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHNvdW5kY2xvdWRUcmFja1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfVFJBQ0ssIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuQXBwbGVNdXNpYy5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1NvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19TT05HLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUkJJVFJBUlksIHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGdldFZpbWVvSUQocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpLnR5cGUgPT09IFF1ZXJ5VHlwZS5WSU1FTyA/IHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgc29mdGxpbWl0ZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCcsXG4gICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJ1xuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8e25hbWU6IEZpbHRlcnNOYW1lO3ZhbHVlOiBzdHJpbmc7fT4ge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHN0YXRpYyBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubWFwKChtKSA9PiAodGhpcyBhcyBhbnkpW21dKS5qb2luKCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZm1wZWcgYXJncyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsdGVycyBuYW1lXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiAoSyB8IHN0cmluZylbXSkge1xuICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gZmlsdGVycy5cbiAgICBmaWx0ZXIoKHByZWRpY2F0ZSkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpLlxuICAgIG1hcCgobSkgPT4gdGhpcy5nZXQobSBhcyBLKSkuXG4gICAgam9pbignLCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYXVkaW8gZmlsdGVyXG4gICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJzW2ZpbHRlck5hbWUgYXMgRmlsdGVyc05hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBtdWx0aXBsZSBhdWRpbyBmaWx0ZXJzXG4gICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmaW5lQnVsayhmaWx0ZXJzQXJyYXk6IHtuYW1lOiBzdHJpbmc7dmFsdWU6IHN0cmluZzt9W10pIHtcbiAgICBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoYXJyKSA9PiB0aGlzLmRlZmluZShhcnIubmFtZSwgYXJyLnZhbHVlKSk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICNoYXNEZWJ1Z2dlciA9IGZhbHNlO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLm9mZihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICBVdGlsLndhcm4oXG4gICAgICAgIGBObyBldmVudCBsaXN0ZW5lciBmb3VuZCBmb3IgZXZlbnQgXCIke1N0cmluZyhuYW1lKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPiB7fSkge31cblxuICAvKipcbiAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG5ldyBvcHRpb25zIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgYXdhaXQgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHF1ZXJ5OiBzdHJpbmcsIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUocXVlcnk6IHN0cmluZywgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dCk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgIHZvaWQgY29udGV4dDtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmhhbmRsZSgpYCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlbGF0ZWQgdHJhY2tzIGZvciB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGVkVHJhY2tzKHRyYWNrOiBUcmFjaywgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIHRyYWNrO1xuICAgIHZvaWQgaGlzdG9yeTtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UocGxheWxpc3Q/OiBQbGF5bGlzdCB8IG51bGwsIHRyYWNrczogVHJhY2tbXSA9IHBsYXlsaXN0Py50cmFja3MgfHwgW10pOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UodHJhY2s6IFRyYWNrLCBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbD4ge1xuICAgIHZvaWQgc291cmNlRXh0cmFjdG9yO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE5leHRGdW5jdGlvbiA9IChlcnJvcj86IEVycm9yIHwgbnVsbCwgc3RyZWFtPzogUmVhZGFibGUpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9ySW5mbyB7XG4gIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gIHRyYWNrczogVHJhY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZWFyY2hDb250ZXh0IHtcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGw7XG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIHJlcXVlc3RPcHRpb25zPzogUmVxdWVzdE9wdGlvbnM7XG4gIHByb3RvY29sPzogc3RyaW5nIHwgbnVsbDtcbn0iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciwgRXh0cmFjdG9yU3RyZWFtYWJsZSB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuLi9ob29rcyc7XG5pbXBvcnQgeyBCcmlkZ2VGYWlsZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2Vzc2lvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIGF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xuICBicmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzOiBTZXQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICovXG4gIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICovXG4gIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoWydlcnJvciddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgIGNvbnN0IHNhbXBsZSA9IGBcXHRpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xcblxcdGF3YWl0IHBsYXllci5leHRyYWN0b3JzLmxvYWRNdWx0aShEZWZhdWx0RXh0cmFjdG9ycyk7YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0KCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGV4dHJhY3RvcnMubG9hZE11bHRpIGluc3RlYWQuIEV4YW1wbGU6XFxuJHtzYW1wbGV9XFxuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGJ1bmRsZSBvZiBleHRyYWN0b3JzLlxuICAgKiBAZXhhbXBsZSBpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuICAgKlxuICAgKiBhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNdWx0aTxcbiAgICBPIGV4dGVuZHMgb2JqZWN0LFxuICAgIFQgZXh0ZW5kcyAodHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4pW10sXG4gICAgUiBleHRlbmRzIFJlY29yZDxUW251bWJlcl1bJ2lkZW50aWZpZXInXSwgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFRbbnVtYmVyXT5bMV0+PihcbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yIGFzIHVua25vd24gYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKF9leHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YCk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byB1bnJlZ2lzdGVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlcjxLIGV4dGVuZHMgc3RyaW5nIHwgQmFzZUV4dHJhY3Rvcj4oX2V4dHJhY3RvcjogSykge1xuICAgIGNvbnN0IGV4dHJhY3RvciA9XG4gICAgdHlwZW9mIF9leHRyYWN0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOiB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGRlYWN0aXZhdGUhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oZm46IEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQ+LCBmaWx0ZXJCbG9ja2VkID0gdHJ1ZSkge1xuICAgIGNvbnN0IGJsb2NrZWQgPSB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/PyBbXTtcblxuICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc29ydCBieSBwcmlvcml0eSBzbyB0aGF0IGV4dHJhY3RvcnMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgYXJlIGV4ZWN1dGVkIGZpcnN0XG4gICAgY29uc3QgZXh0cmFjdG9ycyA9IHRoaXMuc3RvcmUuc29ydCgoYSwgYikgPT4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHkpO1xuXG4gICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dHJhY3RvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChmaWx0ZXJCbG9ja2VkICYmIGJsb2NrZWQuc29tZSgoZSkgPT4gZSA9PT0gZXh0LmlkZW50aWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YCk7XG5cbiAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dCxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICByZXN1bHRcbiAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBlcnIgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycilcbiAgICByZXR1cm4ge1xuICAgICAgZXh0cmFjdG9yOiBsYXN0RXh0ISxcbiAgICAgIGVycm9yOiBlcnIsXG4gICAgICByZXN1bHQ6IGZhbHNlXG4gICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8ZmFsc2U+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYnJpZGdlIGZvciBhIHRyYWNrXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3Igb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdEJyaWRnZSh0cmFjazogVHJhY2ssIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID0gdGhpcy5nZXRDb250ZXh0KCk/LmJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnMgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bjxFeHRyYWN0b3JTdHJlYW1hYmxlPihhc3luYyAoZXh0KSA9PiB7XG4gICAgICBpZiAoc291cmNlRXh0cmFjdG9yICYmIGV4dC5pZGVudGlmaWVyID09PSBzb3VyY2VFeHRyYWN0b3IuaWRlbnRpZmllcikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8IHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ05vIGV4dHJhY3RvcnMgYXZhaWxhYmxlIHRvIGJyaWRnZSdcbiAgICApO1xuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IHJlc3VsdC5leHRyYWN0b3I7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYnJpZGdlIGZyb20gdGhlIHNwZWNpZmllZCBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICogQHBhcmFtIHRhcmdldEV4dHJhY3RvciBUaGUgdGFyZ2V0IGV4dHJhY3RvciB0byBicmlkZ2UgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlRnJvbShcbiAgdHJhY2s6IFRyYWNrLFxuICBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsLFxuICB0YXJnZXRFeHRyYWN0b3I6IEV4dHJhY3RvclJlc29sdmFibGUpXG4gIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmUodGFyZ2V0RXh0cmFjdG9yKTtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRhcmdldC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGRpc2FibGVkXG4gICAqL1xuICBwdWJsaWMgaXNEaXNhYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGlkZW50aWZpZXIpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBlbmFibGVkXG4gICAqL1xuICBwdWJsaWMgaXNFbmFibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiAhdGhpcy5pc0Rpc2FibGVkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgZXh0cmFjdG9yIGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlSWQocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyByZXNvbHZhYmxlIDogcmVzb2x2YWJsZS5pZGVudGlmaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZShyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHRoaXMuZ2V0KHJlc29sdmFibGUpIDogcmVzb2x2YWJsZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3I7XG4gIGVycm9yOiBFcnJvciB8IG51bGw7XG4gIHJlc3VsdDogVDtcbn1cblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yRXhlY3V0aW9uRk48VCA9IHVua25vd24+ID0gKGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gUHJvbWlzZTxUIHwgYm9vbGVhbj47XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclJlc29sdmFibGUgPSBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yOyIsICJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSB1bnNhZmUgPSBhbnk7XG5cbi8qKlxuICogVGhlIHJlY2VpdmVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGV4dCBpcyBwcm92aWRlZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0UmVjZWl2ZXI8Uj4gPSAoKSA9PiBSO1xuXG5leHBvcnQgY2xhc3MgQ29udGV4dDxUPiB7XG4gIHByaXZhdGUgc3RvcmFnZSA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxUPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlZmF1bHRWYWx1ZT86IFQpIHt9XG5cbiAgLyoqXG4gICAqIEV4aXQgb3V0IG9mIHRoaXMgY29udGV4dFxuICAgKi9cbiAgcHVibGljIGV4aXQoc2NvcGU6IENvbnRleHRSZWNlaXZlcjx2b2lkPikge1xuICAgIHRoaXMuc3RvcmFnZS5leGl0KHNjb3BlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNMb3N0KCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29udGV4dC4gSWYgdGhlIGNvbnRleHQgaXMgbG9zdCBhbmQgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcm92aWRlZCwgdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3VtZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zdG9yYWdlLmdldFN0b3JlKCk7XG5cbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgcHJvdmlkZTxSID0gdW5zYWZlPih2YWx1ZTogVCwgcmVjZWl2ZXI6IENvbnRleHRSZWNlaXZlcjxSPik6IFIge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgcmVjZWl2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjb250ZXh0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHRcbiAqIEBleGFtcGxlIGNvbnN0IHVzZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICpcbiAqICAvLyB0aGUgdmFsdWUgdG8gcHJvdmlkZVxuICogIGNvbnN0IHVzZXIgPSB7XG4gKiAgIGlkOiAxLFxuICogICBuYW1lOiAnSm9obiBEb2UnXG4gKiAgfTtcbiAqXG4gKiAgLy8gcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSB0byB0aGUgcmVjZWl2ZXJcbiAqICBjb250ZXh0LnByb3ZpZGUodXNlciwgaGFuZGxlcik7XG4gKlxuICogIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gKiAgICAvLyBnZXQgdGhlIGNvbnRleHQgdmFsdWVcbiAqICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKlxuICogICAgY29uc29sZS5sb2coaWQsIG5hbWUpOyAvLyAxLCBKb2huIERvZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCA9IHVuc2FmZT4oZGVmYXVsdFZhbHVlPzogVCk6IENvbnRleHQ8VD4ge1xuICByZXR1cm4gbmV3IENvbnRleHQoZGVmYXVsdFZhbHVlKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tXG4gKiBAZXhhbXBsZSBjb25zdCB2YWx1ZSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb250ZXh0PFQgPSB1bnNhZmU+KGNvbnRleHQ6IENvbnRleHQ8VD4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufSIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpOyIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufSIsICJpbXBvcnQgeyBHdWlsZCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICBndWlsZDogR3VpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBTVVBFUl9DT05URVhUID0gY3JlYXRlQ29udGV4dDxQbGF5ZXI+KCk7XG5cbmNvbnN0IGdldEZhbGxiYWNrQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICBsZXQgaXNGYWxsYmFjayA9IGZhbHNlO1xuXG4gIGxldCBwbGF5ZXI6IFBsYXllciB8IHVuZGVmaW5lZDtcblxuICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICBwbGF5ZXIgPSBnZXRGYWxsYmFja0NvbnRleHQoKTtcbiAgICBpc0ZhbGxiYWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghcGxheWVyKVxuICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgJ2Rpc2NvcmQtcGxheWVyJyxcbiAgICBgUGxheWVyIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSwgJHtcbiAgICBpc0ZhbGxiYWNrID9cbiAgICAnZGlkIHlvdSBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGxheWVyIHdpdGggYG5ldyBQbGF5ZXIoY2xpZW50KWA/JyA6XG4gICAgJ2lzIGl0IGJlaW5nIGNhbGxlZCBpbnNpZGUgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKCk/J31gXG5cbiAgKTtcblxuICBpZiAobWFpbk9ubHkpIHJldHVybiB7IHBsYXllciwgY29udGV4dDoge30gYXMgSG9va3NDdHgsIGlzRmFsbGJhY2sgfTtcblxuICBsZXQgY29udGV4dDogSG9va3NDdHggfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFpc0ZhbGxiYWNrKSB7XG4gICAgY29udGV4dCA9IHVzZUNvbnRleHQocGxheWVyLmNvbnRleHQpO1xuICAgIGlmICghY29udGV4dClcbiAgICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgICBob29rTmFtZSxcbiAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIGdldCBndWlsZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgICAgIGhvb2tOYW1lLFxuICAgICAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGd1aWxkIGFyZ3VtZW50IHdoZW4gbm90IGluc2lkZSBhIHBsYXllciBjb250ZXh0YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gYXMgdW5rbm93biBhcyBIb29rc0N0eDtcbiAgfVxuXG4gIHJldHVybiB7IGNvbnRleHQsIHBsYXllciwgaXNGYWxsYmFjayB9O1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUGxheWVyJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLm5vZGU7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlLlxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlLiBEZWZhdWx0cyB0byBpbmZlcnJlZCBndWlsZCBmcm9tIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLnJlc29sdmU8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlO1xufSIsICJpbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gIGNvbnN0IHsgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1haW5QbGF5ZXInLCB0cnVlKTtcblxuICByZXR1cm4gcGxheWVyO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbKCkgPT4gVCwgKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHZvaWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSwgUGxheWVyVGltZXN0YW1wIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlOiBOb2RlUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlVGltZWxpbmUge1xuICByZWFkb25seSB0aW1lc3RhbXA6IFBsYXllclRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhY2s6IFRyYWNrPHVua25vd24+IHwgbnVsbDtcbiAgcGF1c2UoKTogYm9vbGVhbjtcbiAgcmVzdW1lKCk6IGJvb2xlYW47XG4gIHNldFZvbHVtZSh2b2w6IG51bWJlcik6IGJvb2xlYW47XG4gIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aW1lbGluZTtcbn0iLCAiaW1wb3J0IHsgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn0iLCAiaW1wb3J0IHsgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25CZWZvcmVDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcbnR5cGUgVm9sdW1lRGlzcGF0Y2ggPSByZWFkb25seSBbKCkgPT4gbnVtYmVyLCAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBwbGF5ZXIgdm9sdW1lXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZSgpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZTogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZT86IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2gge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VWb2x1bWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldChub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgIGlmIChxdWV1ZSkge1xuICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24odm9sdW1lKSkgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgTm9HdWlsZEVycm9yLCBOb0d1aWxkUXVldWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICBzdHJhdGVneT86IFF1ZXVlU3RyYXRlZ3k7XG4gIHZvbHVtZT86IG51bWJlcjtcbiAgZXF1YWxpemVyPzogRXF1YWxpemVyQmFuZFtdO1xuICBhX2ZpbHRlcj86IFBDTUZpbHRlcnNbXTtcbiAgYmlxdWFkPzogQmlxdWFkRmlsdGVycztcbiAgcmVzYW1wbGVyPzogbnVtYmVyO1xuICBkaXNhYmxlSGlzdG9yeT86IGJvb2xlYW47XG4gIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eT86IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duPzogbnVtYmVyO1xuICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgbGVhdmVPbkVuZENvb2xkb3duPzogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcD86IGJvb2xlYW47XG4gIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gIG1ldGFkYXRhPzogVCB8IG51bGw7XG4gIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIGRlZmF1bHRGRm1wZWdGaWx0ZXJzPzogRmlsdGVyc05hbWVbXTtcbiAgYnVmZmVyaW5nVGltZW91dD86IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW0/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBOb2RlUmVzb2x2YWJsZSA9IEd1aWxkUXVldWUgfCBHdWlsZFJlc29sdmFibGU7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAqIEBwYXJhbSBndWlsZCBUaGUgZ3VpbGQgd2hpY2ggd2lsbCBiZSB0aGUgb3duZXIgb2YgdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBvcHRpb25zIFF1ZXVlIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGU8VCA9IE1ldGE+KGd1aWxkOiBHdWlsZFJlc29sdmFibGUsIG9wdGlvbnM6IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD4gPSB7fSk6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIH1cblxuICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgfVxuXG4gICAgY29uc3QgcXVldWUgPSBuZXcgR3VpbGRRdWV1ZTxUPih0aGlzLnBsYXllciwge1xuICAgICAgZ3VpbGQ6IHNlcnZlcixcbiAgICAgIHF1ZXVlU3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICB2b2x1bWU6IG9wdGlvbnMudm9sdW1lLFxuICAgICAgZXF1YWxpemVyOiBvcHRpb25zLmVxdWFsaXplcixcbiAgICAgIGZpbHRlcmVyOiBvcHRpb25zLmFfZmlsdGVyLFxuICAgICAgYmlxdWFkOiBvcHRpb25zLmJpcXVhZCxcbiAgICAgIHJlc2FtcGxlcjogb3B0aW9ucy5yZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlSGlzdG9yeTogb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSxcbiAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZSxcbiAgICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEsXG4gICAgICBtYXhIaXN0b3J5U2l6ZTogb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSxcbiAgICAgIG1heFNpemU6IG9wdGlvbnMubWF4U2l6ZSxcbiAgICAgIHBhdXNlT25FbXB0eTogb3B0aW9ucy5wYXVzZU9uRW1wdHksXG4gICAgICBkaXNhYmxlQmlxdWFkOiBvcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICBkaXNhYmxlRXF1YWxpemVyOiBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICBkaXNhYmxlRmlsdGVyZXI6IG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgZGlzYWJsZVJlc2FtcGxlcjogb3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgZGlzYWJsZVZvbHVtZTogb3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBvcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbVxuICAgIH0pO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQocXVldWUuaWQpIGFzIEd1aWxkUXVldWU8VD4gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkUXVldWVFcnJvcignQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICByZXR1cm4gbm9kZSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCh0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSEpIGFzIEd1aWxkUXVldWU8VD47XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgfVxufSIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUsIFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQge1xuICBJbnZhbGlkQXJnVHlwZUVycm9yLFxuICBOb1ZvaWNlQ2hhbm5lbEVycm9yLFxuICBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChzdHJlYW06IFJlYWRhYmxlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxQb3N0UHJvY2Vzc2VkUmVzdWx0IHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIFBsYXllclRyaWdnZXJlZFJlYXNvbiA9ICdmaWx0ZXJzJyB8ICdub3JtYWwnO1xuXG5leHBvcnQgY29uc3QgR3VpbGRRdWV1ZUV2ZW50ID0ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja0FkZDogJ2F1ZGlvVHJhY2tBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja3NSZW1vdmU6ICdhdWRpb1RyYWNrc1JlbW92ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICovXG4gIENvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAqL1xuICBDb25uZWN0aW9uRGVzdHJveWVkOiAnY29ubmVjdGlvbkRlc3Ryb3llZCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKi9cbiAgRGlzY29ubmVjdDogJ2Rpc2Nvbm5lY3QnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICovXG4gIERlYnVnOiAnZGVidWcnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAqL1xuICBFcnJvcjogJ2Vycm9yJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKi9cbiAgRW1wdHlDaGFubmVsOiAnZW1wdHlDaGFubmVsJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKi9cbiAgUGxheWVyRXJyb3I6ICdwbGF5ZXJFcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICovXG4gIFBsYXllclRyaWdnZXI6ICdwbGF5ZXJUcmlnZ2VyJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgKi9cbiAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHZvbHVtZSBpcyB1cGRhdGVkXG4gICAqL1xuICBWb2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICovXG4gIFBsYXllclBhdXNlOiAncGxheWVyUGF1c2UnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyByZXN1bWVkXG4gICAqL1xuICBQbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAvKipcbiAgICogQmlxdWFkIEZpbHRlcnMgVXBkYXRlXG4gICAqL1xuICBCaXF1YWRGaWx0ZXJzVXBkYXRlOiAnYmlxdWFkRmlsdGVyc1VwZGF0ZScsXG4gIC8qKlxuICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAqL1xuICBFcXVhbGl6ZXJVcGRhdGU6ICdlcXVhbGl6ZXJVcGRhdGUnLFxuICAvKipcbiAgICogRFNQIHVwZGF0ZVxuICAgKi9cbiAgRFNQVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIEZpbHRlcnMgVXBkYXRlXG4gICAqL1xuICBBdWRpb0ZpbHRlcnNVcGRhdGU6ICdhdWRpb0ZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAqL1xuICBXaWxsUGxheVRyYWNrOiAnd2lsbFBsYXlUcmFjaycsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHJlcG9wdWxhdGVkXG4gICAqL1xuICBDaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICovXG4gIFF1ZXVlQ3JlYXRlOiAncXVldWVDcmVhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgKi9cbiAgUXVldWVEZWxldGU6ICdxdWV1ZURlbGV0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAqL1xuICBXaWxsQXV0b1BsYXk6ICd3aWxsQXV0b1BsYXknXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBHdWlsZFF1ZXVlRXZlbnQgPSAodHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25EZXN0cm95ZWRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVycm9yXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVtcHR5UXVldWVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU3RhcnRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IsIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2hdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHNraXBwaW5nXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gZm9yIHNraXBwaW5nXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXBdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2ssXG4gIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJUcmlnZ2VyXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSxcbiAgbmV3RmlsdGVyczogRXF1YWxpemVyQmFuZFtdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkJpcXVhZEZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLFxuICBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKVxuICA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gIGRvbmU6ICgpID0+IHZvaWQpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2tzOiBUcmFja1tdLFxuICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPSAodHlwZW9mIFF1ZXVlUmVwZWF0TW9kZSlba2V5b2YgdHlwZW9mIFF1ZXVlUmVwZWF0TW9kZV07XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICN0cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICNkZWxldGVkID0gZmFsc2U7XG4gICNzaHVmZmxlID0gZmFsc2U7XG4gIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgIHN0cmVhbSxcbiAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICB9KTtcbiAgcHVibGljIHJlcGVhdE1vZGU6IFF1ZXVlUmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgc3luY2VkTHlyaWNzUHJvdmlkZXIgPSBuZXcgU3luY2VkTHlyaWNzUHJvdmlkZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHVibGljIG9wdGlvbnM6IEd1aWxkTm9kZUluaXQ8TWV0YT4pIHtcbiAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKHRoaXMub3B0aW9ucy5iaXF1YWQpICYmICFUeXBlVXRpbC5pc0Jvb2xlYW4odGhpcy5vcHRpb25zLmJpcXVhZCkpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJywgJ251bWJlcicsIHR5cGVvZiBvcHRpb25zLm1heFNpemUpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYEd1aWxkUXVldWUgaW5pdGlhbGl6ZWQgZm9yIGd1aWxkICR7dGhpcy5vcHRpb25zLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLm9wdGlvbnMuZ3VpbGQuaWR9KWApO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgIGlmIChpc011bHRpKSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgKi9cbiAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSlcbiAge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCEpO1xuICAgIGlmICghY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDaGFubmVsRXJyb3IoKTtcbiAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnY2hhbm5lbCcsXG4gICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgIFN0cmluZyhjaGFubmVsPy50eXBlKVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIGNoYW5uZWwsXG4gICAgICB0aGlzLFxuICAgICAgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCxcbiAgICAgIG9wdGlvbnMuYXVkaW9QbGF5ZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSBjaGFubmVsUmVzb2x2YWJsZSBUaGUgdm9pY2UgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtcbiAgICAgIGNoYW5uZWwubmFtZX0gKElEOiAke1xuICAgICAgY2hhbm5lbC5pZH0pYFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgfSk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIGJlIHNodWZmbGVkIGltbWVkaWF0ZWx5IGluLXBsYWNlLCB3aGljaCBjYW5ub3QgYmUgdW5kb25lLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVTaHVmZmxlKCkge1xuICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2h1ZmZsZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoZHluYW1pYykge1xuICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBsYXRlbmN5IG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgcmV2aXZlKCkge1xuICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIGRlYWZcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBtdXRlXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkodHJhY2s6IFRyYWNrTGlrZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8TWV0YT4pIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPilcbiAgOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMsIGUpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZWJ1ZycsIChtKSA9PiB0aGlzLmhhc0RlYnVnZ2VyICYmIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGVidWcsIHRoaXMsIG0pKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZXN0cm95ZWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnMoZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EU1BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdiaXF1YWQnLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgIT09IGYpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLCBmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsIGYpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKVxuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0RlYnVnZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuaGFzRGVidWdnZXI7XG4gIH1cblxuICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7cmVtb3ZlQWxsTGlzdGVuZXJzOiAoKSA9PiB1bmtub3duO30+KHRhcmdldDogVCkge1xuICAgIHRhcmdldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gICNwZXJmb3JtU3RhcnQocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgUGxheWVyIHRyaWdnZXJlZCBmb3IgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgIHJlYXNvblxuICAgICAgfSl9YFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXIsIHRoaXMsIHRyYWNrISwgcmVhc29uKTtcbiAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICB9XG5cbiAgI2dldE5leHRUcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy50cmFja3Muc3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZShzdG9yZSk7XG5cbiAgICB0aGlzLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHtcbiAgICAgIHJldHVybiB0LmlkID09PSB0cmFjay5pZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgIH0pfSB3YXMgbWFya2VkIGFzIGZpbmlzaGVkYFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHtcbiAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubHlyaWNzLmNsZWFyKCk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJhY2spO1xuICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2RlbGV0ZWQpIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSA8IDEgJiYgdGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuT0ZGKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHF1ZXVlLCBtb3ZpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5IHRvIGN1cnJlbnQgcXVldWUuLi4nKTtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgIGlmIChuZXh0KSB0aGlzLnRyYWNrcy5hZGQobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplICYmIHRyYWNrKSB7XG4gICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0luaXRpYWxpemluZyBuZXh0IHRyYWNrIG9mIHRoZSBxdWV1ZS4uLicpO1xuICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy4jZ2V0TmV4dFRyYWNrKCkhO1xuICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICNlbWl0RW5kKCkge1xuICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5UXVldWUsIHRoaXMpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcblxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYWNrcyA9XG4gICAgICAoYXdhaXQgdHJhY2suZXh0cmFjdG9yPy5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpKT8udHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICByZXR1cm4gcmVzLnRyYWNrcztcbiAgICAgIH0pKT8uXG4gICAgICByZXN1bHQgfHxcbiAgICAgIFtdO1xuXG4gICAgICBsZXQgcmVzb2x2ZXI6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTxUcmFjayB8IG51bGw+KChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmUpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksIHRoaXMsIHRyYWNrcywgcmVzb2x2ZXIhKTtcblxuICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgcmVzb2x2ZXIoXG4gICAgICAgICAgdHJhY2tzLmxlbmd0aCA/XG4gICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZSA9IHRyYWNrcy5maWx0ZXIoKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKSk7XG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICB9KSgpIDpcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRUcmFjayA9IGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICBpZiAoIW5leHRUcmFjaykge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQXV0b3BsYXkgPj4gTm8gdHJhY2sgd2FzIGZvdW5kLCBpbml0aWF0aW5nICNlbWl0RW5kKCknKTtcbiAgICAgICAgdGhyb3cgJ05vIHRyYWNrIHdhcyBmb3VuZCc7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubm9kZS5wbGF5KG5leHRUcmFjaywge1xuICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDAsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgIH1cbiAgfVxufSIsICJpbXBvcnQge1xuICBBdWRpb1BsYXllcixcbiAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgQXVkaW9QbGF5ZXJTdGF0dXMsXG4gIEF1ZGlvUmVzb3VyY2UsXG4gIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICBjcmVhdGVBdWRpb1Jlc291cmNlLFxuICBlbnRlcnNTdGF0ZSxcbiAgU3RyZWFtVHlwZSxcbiAgVm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24gfSBmcm9tXG4nZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJCYW5kLCBCaXF1YWRGaWx0ZXJzLCBQQ01GaWx0ZXJzLCBGaWx0ZXJzQ2hhaW4gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IE5vQXVkaW9SZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICB0eXBlPzogU3RyZWFtVHlwZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZGF0YT86IGFueTtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZXE/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZEZpbHRlcj86IEJpcXVhZEZpbHRlcnM7XG4gIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgZGVmYXVsdEZpbHRlcnM/OiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZT86IG51bWJlcjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIHNhbXBsZVJhdGU/OiBudW1iZXI7XG4gIHNraXBGRm1wZWc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlRXZlbnRzIHtcbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICBlcnJvcjogKGVycm9yOiBBdWRpb1BsYXllckVycm9yKSA9PiBhbnk7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGZpbmlzaDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICBkc3A6IChmaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IGFueTtcbiAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICBzYW1wbGVSYXRlOiAoZmlsdGVyczogbnVtYmVyKSA9PiBhbnk7XG4gIGJpcXVhZDogKGZpbHRlcnM6IEJpcXVhZEZpbHRlcnMpID0+IGFueTtcbiAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgZGVzdHJveWVkOiAoKSA9PiBhbnk7XG4gIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgcHVibGljIGF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcjtcbiAgcHVibGljIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbDtcbiAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLFxuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKVxuICB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAqL1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICovXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKSk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgIGlmICh0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcnMpIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKTtcbiAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHRoaXMuZW1pdCgnZXFCYW5kcycsIHRoaXMuZHNwLmVxdWFsaXplci5nZXRFUSgpKTtcbiAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICBpZiAodGhpcy5kc3AucmVzYW1wbGVyKSB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgdGhpcy5lbmQoKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUmVzdW1lLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZykge1xuICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8IG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgJiYgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgKi9cbiAgZ2V0IHBhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgfVxuXG4gIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAqL1xuICBpc0J1ZmZlcmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nXG4gICAqL1xuICBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGlkbGVcbiAgICovXG4gIGlzSWRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAqL1xuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyByZWFkeSB0byBwbGF5XG4gICAqL1xuICBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAqL1xuICBpc1NpZ25hbGxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlNpZ25hbGxpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGluZ1xuICAgKi9cbiAgaXNDb25uZWN0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgc3RyZWFtXG4gICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wc10gT3B0aW9uc1xuICAgKiBAcmV0dXJucyB7QXVkaW9SZXNvdXJjZX1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVN0cmVhbShzcmM6IFJlYWRhYmxlLCBvcHM/OiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzID9cbiAgICB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICBkc3A6IHtcbiAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyID9cbiAgICAgIHtcbiAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJlc2FtcGxlcjoge1xuICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgIH0sXG4gICAgICBlcXVhbGl6ZXI6IHtcbiAgICAgICAgYmFuZE11bHRpcGxpZXI6IG9wcz8uZXEsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXJcbiAgICAgIH0sXG4gICAgICB2b2x1bWU6IHtcbiAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVZvbHVtZVxuICAgICAgfVxuICAgIH0pIDpcbiAgICBzcmM7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgIH0pIGFzIFBvc3RQcm9jZXNzZWRSZXN1bHRcbiAgICApO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSxcbiAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsYXllclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuZCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHN0cmVhbVxuICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb0F1ZGlvUmVzb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UuZW5kZWQpIHtcbiAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZmluaXNoJywgcmVzb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTm9SZXN1bHRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAvKipcbiAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJldmlvdXNUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUhpc3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFjayB0byB0cmFjayBoaXN0b3J5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgcHVzaCh0cmFjazogVHJhY2sgfCBUcmFja1tdKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuXG4gICAgdGhpcy5yZXNpemUoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMubmV4dFRyYWNrO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIHRoaXMucXVldWUubm9kZS5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkhpc3RvcnlOZXh0LFxuICAgICAgZGVzY3JpcHRpb246ICdTa2lwcGVkIGJ5IEd1aWxkUXVldWVIaXN0b3J5Lm5leHQoKSdcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdObyBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0cmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgKi9cbiAgcHVibGljIGJhY2socHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnByZXZpb3VzKHByZXNlcnZlQ3VycmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzaXplIGhpc3Rvcnkgc3RvcmVcbiAgICovXG4gIHB1YmxpYyByZXNpemUoKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy50cmFja3Muc3RvcmUubGVuZ3RoIDwgdGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkgcmV0dXJuO1xuICAgIHRoaXMudHJhY2tzLnN0b3JlLnNwbGljZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKTtcbiAgfVxufSIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgd2FpdEZvciB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yLCBOb1Jlc3VsdEVycm9yLCBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yLCBPdXRPZlJhbmdlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICovXG4gIHRpbWVjb2Rlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgY3JlYXRlIHByb2dyZXNzIGJhciBmb3IgdGhlIHdob2xlIHF1ZXVlXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYmFyIGxlbmd0aFxuICAgKi9cbiAgbGVmdENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAqL1xuICByaWdodENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVtYWluaW5nIHRpbWUgdHJhY2tcbiAgICovXG4gIHNlcGFyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gICAqL1xuICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kaWNhdG9yXG4gICAqL1xuICBxdWV1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gIHF1ZXVlPzogYm9vbGVhbjtcbiAgc2Vlaz86IG51bWJlcjtcbiAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNraXBPcHRpb25zIHtcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb247XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyVGltZXN0YW1wIHtcbiAgY3VycmVudDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgdG90YWw6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG4gIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgZGlzcGF0Y2hlckNvbmZpZzogQ3JlYXRlU3RyZWFtT3BzO1xuICBwbGF5ZXJDb25maWc6IFJlc291cmNlUGxheU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gdW5rbm93bj4ge1xuICAjcHJvZ3Jlc3MgPSAwO1xuICAjaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gZmFsc2U7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IC9saWJvcHVzOiAoeWVzfHRydWUpLy50ZXN0KHRoaXMucXVldWUucGxheWVyLnNjYW5EZXBzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGlkbGUgbW9kZVxuICAgKi9cbiAgcHVibGljIGlzSWRsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBpc0J1ZmZlcmluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQbGF5aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkXG4gICAqL1xuICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyByZXNldFByb2dyZXNzKCkge1xuICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuI3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0cmVhbSB0aW1lIGZvciBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgcmV0dXJuIGR1cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZHVyYXRpb24gbXVsdGlwbGllclxuICAgKi9cbiAgcHVibGljIGdldER1cmF0aW9uTXVsdGlwbGllcigpIHtcbiAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgIGNvbnN0IG11bHRpcGxpZXJzID0gc3JhdGVGaWx0ZXJzLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgIH0pLlxuICAgIGZpbHRlcigoZikgPT4gIWlzTmFOKGYpKTtcblxuICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID1cbiAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJlxuICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrPy5kdXJhdGlvbk1TID8/XG4gICAgICAgIChcbiAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICB9O1xuICAgICAgICB9PikuXG4gICAgICAgIG1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgY29uc3QgdG90YWwgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy50b3RhbER1cmF0aW9uIDogdGhpcy5lc3RpbWF0ZWREdXJhdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50OiB7XG4gICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKGN1cnJlbnQpKSxcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRcbiAgICAgIH0sXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICB2YWx1ZTogdG90YWxcbiAgICAgIH0sXG4gICAgICBwcm9ncmVzczogTWF0aC5yb3VuZChjdXJyZW50IC8gdG90YWwgKiAxMDApXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciBjdXJyZW50IHByb2dyZXNzXG4gICAqIEBwYXJhbSBvcHRpb25zIFByb2dyZXNzIGJhciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUHJvZ3Jlc3NCYXIob3B0aW9ucz86IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucykge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XG4gICAgaWYgKCF0aW1lc3RhbXApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHtcbiAgICAgIGluZGljYXRvciA9ICdcXHV7MUY1MTh9JyxcbiAgICAgIGxlZnRDaGFyID0gJ1xcdTI1QUMnLFxuICAgICAgcmlnaHRDaGFyID0gJ1xcdTI1QUMnLFxuICAgICAgbGVuZ3RoID0gMTUsXG4gICAgICB0aW1lY29kZXMgPSB0cnVlLFxuICAgICAgc2VwYXJhdG9yID0gJ1xcdTI1MDMnXG4gICAgfSA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKGlzTmFOKGxlbmd0aCkgfHwgbGVuZ3RoIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXJyb3IoJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsIFN0cmluZyhsZW5ndGgpLCAnMCcsICdGaW5pdGUgTnVtYmVyJyk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSAqIGxlbmd0aCk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKCcnKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfSAke3NlcGFyYXRvcn0gJHtcbiAgICAgICAgdGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWVrKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGR1cmF0aW9uID09PSB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGR1cmF0aW9uID4gdGhpcy50b3RhbER1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU0VFS19PVkVSX1RIUkVTSE9MRCxcbiAgICAgICAgZGVzY3JpcHRpb246IG5ldyBPdXRPZlJhbmdlRXJyb3IoJ1tkdXJhdGlvbl0nLCBTdHJpbmcoZHVyYXRpb24pLCAnMCcsIFN0cmluZyh0aGlzLnRvdGFsRHVyYXRpb24pKS5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCB2b2x1bWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvbHVtZVxuICAgKiBAcGFyYW0gdm9sIFZvbHVtZSBhbW91bnQgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXMgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuc2V0Vm9sdW1lKHZvbCk7XG4gICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBiaXQgcmF0ZVxuICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/LmVuY29kZXI/LnNldEJpdHJhdGUoXG4gICAgICByYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc3VtZSgpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHBhdXNlKCkge1xuICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcmVzdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAqL1xuICBwdWJsaWMgc2tpcChvcHRpb25zPzogU2tpcE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgaWYgKCF0cmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGNvbnN0IHsgcmVhc29uLCBkZXNjcmlwdGlvbiB9ID0gb3B0aW9ucyB8fCB7XG4gICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5NYW51YWwsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMgc2tpcHBlZCBtYW51YWxseSdcbiAgICB9O1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IFdoZXRoZXIgb3Igbm90IHRvIGVtaXQgdGhlIGV2ZW50IEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZSh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgZm91bmRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmZpbmQoKHQsIGlkeCkgPT4ge1xuICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICB9KTtcbiAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgdGhpcy5xdWV1ZS50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB0LmlkID09PSBmb3VuZFRyYWNrLmlkKTtcblxuICAgIGlmIChlbWl0RXZlbnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgKi9cbiAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKSB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcigndHJhY2sgdmFsdWUnLCAnaW5zdGFuY2Ugb2YgVHJhY2snLCBTdHJpbmcodHJhY2spKTtcbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAqL1xuICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoZnJvbSk7XG4gICAgaWYgKCFyZW1vdmVkKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0KHJlbW92ZWQsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLnF1ZXVlLnRyYWNrcy5hdCh0aGlzLmdldFRyYWNrUG9zaXRpb24oZnJvbSkpO1xuICAgIGlmICghc3JjKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCB0cmFjayB0byBjb3B5Jyk7XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcChmaXJzdDogVHJhY2tSZXNvbHZhYmxlLCBzZWNvbmQ6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgaWYgKHNyYyA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHNyYyB0cmFjayB0byBzd2FwJyk7XG5cbiAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCBkZXN0IHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdID0gZGVzdFQ7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIG9yIG5vdCB0byBmb3JjZWZ1bGx5IHN0b3AgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLnF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRlc3Ryb3koKTtcbiAgICAgIH0sIHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duKS51bnJlZigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWApO1xuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMFxuICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgb3B0aW9uc1xuICAgICkhO1xuXG4gICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBOb1Jlc3VsdEVycm9yKCdQbGF5IHJlcXVlc3QgcmVjZWl2ZWQgYnV0IHRyYWNrIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXNzaWduZWRSZXNvdXJjZSA9IHRyYWNrLnJlc291cmNlO1xuXG4gICAgICBpZiAoYXNzaWduZWRSZXNvdXJjZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnVHJhY2sgaGFzIGFuIGF1ZGlvIHJlc291cmNlIGFzc2lnbmVkLCBwbGF5ZXIgd2lsbCBub3cgcGxheSB0aGUgcmVzb3VyY2UgZGlyZWN0bHkuLi4nKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPVxuICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IChzcmMgPT09ICdzcG90aWZ5JyA/ICdzcG90aWZ5U29uZycgOiBzcmMgPT09ICdhcHBsZV9tdXNpYycgPyAnYXBwbGVNdXNpY1NvbmcnIDogc3JjKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICBlcnJvcjogbnVsbCBhcyBFcnJvciB8IG51bGwsXG4gICAgICAgIHN0cmVhbTogbnVsbCBhcyBFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5vbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkudGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSEnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5jb250ZXh0LnByb3ZpZGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT4gci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICBzYW1wbGVSYXRlOlxuICAgICAgICAgIHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/XG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6XG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICBza2lwRkZtcGVnOiB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWdcbiAgICAgICAgfSxcbiAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzb2x2ZXI6ICgpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmUpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrLCB0aGlzLnF1ZXVlLCB0cmFjaywgdHJhY2tTdHJlYW1Db25maWcsIHJlc29sdmVyISk7XG5cbiAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVdLlxuICAgICAgZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9ICEhdHJhY2tTdHJlYW1Db25maWcucGxheWVyQ29uZmlnLnNlZWsgfHwgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9ICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT5cbiAgICAgIFtTdHJlYW1UeXBlLk9wdXMsIFN0cmVhbVR5cGUuV2VibU9wdXMsIFN0cmVhbVR5cGUuT2dnT3B1c10uaW5jbHVkZXMoZm10IGFzIFN0cmVhbVR5cGUpO1xuXG4gICAgICAvLyBza2lwIGZmbXBlZyB3aGVuIHBvc3NpYmxlXG4gICAgICBpZiAoXG4gICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAhKHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSkgJiZcbiAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtICE9PSAnc3RyaW5nJyAmJlxuICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7XG4gICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cyd9YFxuXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICBzdHJlYW0gOlxuICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fCB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gOlxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwXG4gICAgICAgICAgLy8gb3B1c1xuICAgICAgICApO1xuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRyYWNrU3RyZWFtQ29uZmlnLCBudWxsLCAyKX1gKTtcblxuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMucXVldWUuZGlzcGF0Y2hlcjtcblxuICAgICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbmFsU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgZGlzcGF0Y2hlci5jcmVhdGVTdHJlYW0oZmluYWxTdHJlYW0sIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcpO1xuXG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuI3BlcmZvcm1QbGF5KHJlc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID1cbiAgICBuZXcgTm9SZXN1bHRFcnJvcihgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKTtcblxuXG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZVxuICAgICk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgIHRyYWNrXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF0dGVtcHRlZEV4dHJhY3RvcnMgPSB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmdldENvbnRleHQoKT8uYXR0ZW1wdGVkRXh0cmFjdG9ycyB8fCBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHN0cmVhbUluZm8gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChhdHRlbXB0ZWRFeHRyYWN0b3JzLmhhcyhleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnMuYWRkKGV4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZSh0cmFjay51cmwsIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlKTtcbiAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgR2VuZXJpYyBzdHJlYW0gZXh0cmFjdGlvbiBmYWlsZWQgYW5kIGZhbGxiYWNrIHN0cmVhbSBleHRyYWN0aW9uIGlzIGVuYWJsZWRgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgc3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gXG4gICAgKTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgaWYgKGV4dHJhY3Rvci5pZGVudGlmaWVyID09PSB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBxdWVyeSA9IGAke3RyYWNrLnRpdGxlfSAke3RyYWNrLmF1dGhvcn1gO1xuICAgICAgY29uc3QgZmFsbGJhY2tUcmFja3MgPSBhd2FpdCBleHRyYWN0b3IuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2sgPSBmYWxsYmFja1RyYWNrcy50cmFja3NbMF07XG5cbiAgICAgIGlmICghZmFsbGJhY2tUcmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICBpZiAoIXN0cmVhbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB0cmFjay5icmlkZ2VkVHJhY2sgPSBmYWxsYmFja1RyYWNrO1xuXG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sIHRydWUpO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZywgdHJhY2s6IFRyYWNrLCBzZWVrID0gMCwgb3B1cz86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLlxuICAgIGNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgIGZtdDogb3B1cyA/ICdvcHVzJyA6ICdzMTZsZSdcbiAgICB9KS5cbiAgICBvbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gY2xvc2VkIGR1ZSB0byBhbiBlcnJvciBmcm9tIEZGbXBlZyBzdHJlYW06ICR7ZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gKTtcblxuICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICB9XG59IiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAvKipcbiAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICBpZiAoY29uc3VtZSkge1xuICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICpcbiAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0QWJvcnRTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2lnbmFsID0gc2lnbmFsO1xuICAgIHRoaXMub25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHRoaXMucXVldWUucmVtb3ZlRW50cnkodGhpcyk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLnJlc29sdmUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlKCkge1xuICAgIHRoaXMuY29uc3VtZSgpO1xuICAgIHRoaXMucXVldWUucmVsZWFzZSgpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLnJlamVjdChuZXcgRXJyb3IoJ0NhbmNlbGxlZCcpKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgdGhpcy5zaWduYWwgPSBudWxsO1xuICAgIHRoaXMub25BYm9ydCA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICB9XG59IiwgImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycywgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAge1xuICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgIH0sXG4gICAgKF8sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogYXJyW2ldID8gYXJyW2ldIC8gMzAgOiAwXG4gICAgfSlcbiAgKSBhcyBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG50eXBlIEVRUHJlc2V0ID0ge1xuICBGbGF0OiBFcXVhbGl6ZXJCYW5kW107XG4gIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICBDbHViOiBFcXVhbGl6ZXJCYW5kW107XG4gIERhbmNlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxCYXNzVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICBMYXJnZUhhbGw6IEVxdWFsaXplckJhbmRbXTtcbiAgTGl2ZTogRXF1YWxpemVyQmFuZFtdO1xuICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICBQb3A6IEVxdWFsaXplckJhbmRbXTtcbiAgUmVnZ2FlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgU2thOiBFcXVhbGl6ZXJCYW5kW107XG4gIFNvZnQ6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgVGVjaG5vOiBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG5leHBvcnQgY29uc3QgRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDogUmVhZG9ubHk8RVFQcmVzZXQ+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZsYXQ6IG1ha2VCYW5kcyhbXSksXG4gIENsYXNzaWNhbDogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl1cbiAgKSxcbiAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgRGFuY2U6IG1ha2VCYW5kcyhbOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoWy04LjAsIDkuNiwgOS42LCA1LjYsIDEuNiwgLTQuMCwgLTguMCwgLTEwLjQsIC0xMS4yLCAtMTEuMl0pLFxuICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoWy05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF0pLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoWzQuOCwgMTEuMiwgNS42LCAtMy4yLCAtMi40LCAxLjYsIDQuOCwgOS42LCAxMi44LCAxNC40XSksXG4gIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgUGFydHk6IG1ha2VCYW5kcyhbXG4gIDcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl1cbiAgKSxcbiAgUG9wOiBtYWtlQmFuZHMoWy0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XSksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgU29mdDogbWFrZUJhbmRzKFs0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdKSxcbiAgU29mdFJvY2s6IG1ha2VCYW5kcyhbNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XSksXG4gIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pXG59KTtcblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSB1bmtub3duPiB7XG4gICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNraXBwYWJsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLmFmLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gIH1cblxuICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgIC8vIHNraXAgaWYgZmlsdGVycyBhcmUgdGhlIHNhbWVcbiAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgY29uc3QgaWdub3JlRmlsdGVycyA9XG4gICAgdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJlxuICAgICFmaWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKTtcbiAgICBjb25zdCBzZWVrVGltZSA9IHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMpPy5jdXJyZW50LnZhbHVlIHx8IDA7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gWy4uLm5ldyBTZXQoZmlsdGVycyldO1xuXG4gICAgcmV0dXJuIHRoaXMuYWYudHJpZ2dlclJlcGxheShzZWVrVGltZSkudGhlbigodCkgPT4ge1xuICAgICAgcXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLCBxdWV1ZSwgcHJldiwgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpKTtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICovXG4gIHB1YmxpYyBzZXRJbnB1dEFyZ3MoYXJnczogc3RyaW5nW10pIHtcbiAgICBpZiAoIWFyZ3MuZXZlcnkoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdhcmdzJywgJ0FycmF5PHN0cmluZz4nLCAnaW52YWxpZCBpdGVtKHMpJyk7XG4gICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dEFyZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lucHV0QXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW5jb2RlciBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgIGlmICghdGhpcy5maWx0ZXJzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIFsnLWFmJywgdGhpcy50b1N0cmluZygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmluYWwgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dEFyZ3MuY29uY2F0KHRoaXMuZW5jb2RlckFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHN0cmVhbSBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jaW5wdXRBcmdzLmxlbmd0aCkgb3B0aW9ucy5lbmNvZGVyQXJncyA9IFsuLi50aGlzLiNpbnB1dEFyZ3MsIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG4gICAgcmV0dXJuIGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmZm1wZWcgZmlsdGVyc1xuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIHNldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdIHwgUmVjb3JkPEZpbHRlcnMsIGJvb2xlYW4+IHwgc3RyaW5nW10gfCBib29sZWFuKSB7XG4gICAgbGV0IF9maWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICBpZiAodHlwZW9mIGZpbHRlcnMgPT09ICdib29sZWFuJykge1xuICAgICAgX2ZpbHRlcnMgPSAhZmlsdGVycyA/IFtdIDogT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcbiAgICAgIF9maWx0ZXJzID0gZmlsdGVycyBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycykuXG4gICAgICBmaWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKS5cbiAgICAgIG1hcCgobSkgPT4gbVswXSkgYXMgRmlsdGVyc1tdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgdGhpcy5zZXRGaWx0ZXJzKGZpbHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBnaXZlbiBmZm1wZWcgZmlsdGVyKHMpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoZmlsdGVyczogRmlsdGVyc1tdIHwgRmlsdGVycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgZmlsdGVycyA9IFtmaWx0ZXJzXTtcbiAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICBmaWx0ZXJzLmZvckVhY2goKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuaW5jbHVkZXMoZikpIHJldHVybjtcbiAgICAgIGZyZXNoLnB1c2goZik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgIGJpcXVhZDogbnVsbCxcbiAgICBlcXVhbGl6ZXI6IFtdLFxuICAgIGZpbHRlcnM6IFtdLFxuICAgIHZvbHVtZTogMTAwLFxuICAgIHNhbXBsZVJhdGU6IC0xXG4gIH07XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogZW5hYmxlIHRoaXMgaW4gdGhlIGZ1dHVyZVxuICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAvLyAgICAgICAgIGlmICh0aGlzLiNmZm1wZWcpIHRoaXMuI2ZmbXBlZyA9IG51bGw7XG4gIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy4jZmZtcGVnKSB7XG4gIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICByZXR1cm4gdGhpcy4jZmZtcGVnO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFZvbHVtZSB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgKi9cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRFNQIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICogQHBhcmFtIHNlZWsgVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUuYWNxdWlyZSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgIHNlZWssXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgcHVibGljIGdldCBmZm1wZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogbVxuICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnZvbHVtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBkdW1wKCk6IEZpbHRlckdyYXBoIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgZmZtcGVnOiBGaWx0ZXJzW107XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn0iLCAiaW1wb3J0IHR5cGUgeyBEdXBsZXgsIFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZGbXBlZyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZGbXBlZ1N0cmVhbU9wdGlvbnMge1xuICBmbXQ/OiBzdHJpbmc7XG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIHNlZWs/OiBudW1iZXI7XG4gIHNraXA/OiBib29sZWFuO1xuICBjb29raWVzPzogc3RyaW5nO1xufVxuXG5jb25zdCByZXNvbHZlQXJncyA9IChjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ+KTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZmlnKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBhY2M7XG4gICAgYWNjLnB1c2goYC0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSBhcyBzdHJpbmdbXSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgY29uc3QgYXJncyA9IHJlc29sdmVBcmdzKHtcbiAgICByZWNvbm5lY3Q6IDEsXG4gICAgcmVjb25uZWN0X3N0cmVhbWVkOiAxLFxuICAgIHJlY29ubmVjdF9kZWxheV9tYXg6IDUsXG4gICAgaTogc3RyZWFtLFxuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgY29va2llczogdHlwZW9mIGNvb2tpZXMgPT09ICdzdHJpbmcnID8gIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gcmVzb2x2ZUFyZ3Moe1xuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGxcbiAgfSk7XG5cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBGRm1wZWcgc3RyZWFtXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBzb3VyY2Ugc3RyZWFtXG4gKiBAcGFyYW0gb3B0aW9ucyBGRm1wZWcgc3RyZWFtIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgRHVwbGV4IHwgc3RyaW5nLCBvcHRpb25zPzogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIGNvbnN0IGFyZ3MgPVxuICB0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gIEZGTVBFR19BUkdTX1NUUklORyhzdHJlYW0sIG9wdGlvbnMuZm10LCBvcHRpb25zLmNvb2tpZXMpIDpcbiAgRkZNUEVHX0FSR1NfUElQRUQob3B0aW9ucy5mbXQpO1xuXG4gIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gIGNvbnN0IHRyYW5zY29kZXI6IER1cGxleCA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gdW5rbm93bj4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICBwbGF5ZXI6IHRoaXMucXVldWUucGxheWVyLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGFzIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGE7XG4gIH1cbn0iLCAiaW1wb3J0IHsgTm90RXhpc3RpbmdFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IHR5cGUgTHlyaWNzRGF0YSA9IE1hcDxudW1iZXIsIHN0cmluZz47XG5leHBvcnQgdHlwZSBVbnN1YnNjcmliZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMeXJpY3NDYWxsYmFjayA9IChseXJpY3M6IHN0cmluZywgdGltZXN0YW1wOiBudW1iZXIpID0+IHVua25vd247XG5leHBvcnQgdHlwZSBMeXJpY3NBdCA9IHt0aW1lc3RhbXA6IG51bWJlcjtsaW5lOiBzdHJpbmc7fTtcblxuY29uc3QgdGltZXN0YW1wUGF0dGVybiA9IC9cXFsoXFxkezJ9KTooXFxkezJ9KVxcLihcXGR7Mn0pXFxdLztcblxuZXhwb3J0IGNsYXNzIFN5bmNlZEx5cmljc1Byb3ZpZGVyIHtcbiAgI2xvb3A6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICNjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2sgfCBudWxsID0gbnVsbDtcbiAgI29uVW5zdWJzY3JpYmU6IFVuc3Vic2NyaWJlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGludGVydmFsID0gMTAwO1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzOiBMeXJpY3NEYXRhID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSByYXc/OiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICBpZiAocmF3Py5zeW5jZWRMeXJpY3MpIHRoaXMubG9hZChyYXc/LnN5bmNlZEx5cmljcyk7XG4gIH1cblxuICBwdWJsaWMgaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWxsYmFjayAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGx5cmljczogc3RyaW5nKSB7XG4gICAgaWYgKCFseXJpY3MpIHRocm93IG5ldyBOb3RFeGlzdGluZ0Vycm9yKCdzeW5jZWRMeXJpY3MnKTtcblxuICAgIHRoaXMubHlyaWNzLmNsZWFyKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgbGluZXMgPSBseXJpY3Muc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2godGltZXN0YW1wUGF0dGVybik7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCBbLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KG1pbnV0ZXMpICogNjAgKiAxMDAwICsgcGFyc2VJbnQoc2Vjb25kcykgKiAxMDAwICsgcGFyc2VJbnQobWlsbGlzZWNvbmRzKTtcblxuICAgICAgICB0aGlzLmx5cmljcy5zZXQodGltZXN0YW1wLCBsaW5lLnJlcGxhY2UodGltZXN0YW1wUGF0dGVybiwgJycpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGx5cmljcyBhdCBhIHNwZWNpZmljIHRpbWUgb3IgYXQgdGhlIGNsb3Nlc3QgdGltZSAoXHUwMEIxMiBzZWNvbmRzKVxuICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBhdCh0aW1lOiBudW1iZXIpOiBMeXJpY3NBdCB8IG51bGwge1xuICAgIGNvbnN0IGxvd2VzdFRpbWUgPSB0aGlzLmx5cmljcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChsb3dlc3RUaW1lID09IG51bGwgfHwgdGltZSA8IGxvd2VzdFRpbWUpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmx5cmljcy5oYXModGltZSkpIHJldHVybiB7IGxpbmU6IHRoaXMubHlyaWNzLmdldCh0aW1lKSBhcyBzdHJpbmcsIHRpbWVzdGFtcDogdGltZSB9O1xuXG4gICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5seXJpY3Mua2V5cygpKTtcblxuICAgIGNvbnN0IGNsb3Nlc3QgPSBrZXlzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGEpO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKGxhc3RWYWx1ZSAhPT0gbnVsbCAmJiBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiYgbHlyaWNzLnRpbWVzdGFtcCA9PT0gbGFzdFZhbHVlLnRpbWVzdGFtcCkgcmV0dXJuO1xuXG4gICAgICBsYXN0VmFsdWUgPSBseXJpY3M7XG5cbiAgICAgIHRoaXMuI2NhbGxiYWNrKGx5cmljcy5saW5lLCBseXJpY3MudGltZXN0YW1wKTtcbiAgICB9LCB0aGlzLmludGVydmFsKS51bnJlZigpO1xuICB9XG59IiwgImltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4vQXN5bmNRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RFbnRpdHkgPSAoKSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcblxuZXhwb3J0IGNsYXNzIFNlcXVlbnRpYWxCdWNrZXQge1xuICBwdWJsaWMgbGltaXQgPSAxO1xuICBwdWJsaWMgcmVtYWluaW5nID0gMTtcbiAgcHVibGljIHJlc2V0QWZ0ZXIgPSAwO1xuICBwdWJsaWMgcXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgTUFYX1JFVFJJRVMgPSA1O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGJ1Y2tldCBpcyByYXRlIGxpbWl0ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNSYXRlTGltaXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcgPD0gMCAmJiBEYXRlLm5vdygpIDwgdGhpcy5yZXNldEFmdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCBmdW5jdGlvbiB0byBlbnF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5xdWV1ZShyZXE6IFJlcXVlc3RFbnRpdHkpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUuYWNxdWlyZSgpO1xuICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbnRyeS5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVxdWVzdChyZXE6IFJlcXVlc3RFbnRpdHksIHJldHJpZXMgPSAwKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHdoaWxlICh0aGlzLmlzUmF0ZUxpbWl0ZWQoKSkge1xuICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgfVxuXG4gICAgbGV0IHBhc3MgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXEoKTtcblxuICAgICAgdGhpcy5fcGF0Y2hIZWFkZXJzKHJlcyk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KHJlc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgbGV0IGVycjogRXJyb3I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5OiB7XG4gICAgICAgICAgICBjb2RlOiBudW1iZXI7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgfSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpIGFzIEVycm9yICYge2NvZGU6IG51bWJlcjt9O1xuXG4gICAgICAgICAgZXJyb3IubmFtZSA9IGJvZHkubmFtZTtcbiAgICAgICAgICBlcnJvci5jb2RlID0gYm9keS5jb2RlO1xuXG4gICAgICAgICAgZXJyID0gZXJyb3I7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihgSFRUUCBFcnJvcjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFzcyA9IHRydWU7XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChwYXNzKSB0aHJvdyBlO1xuXG4gICAgICBjb25zdCBiYWRSZXEgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgL0Vycm9yOiA0WzAtOV17Mn0vLnRlc3QoZS5tZXNzYWdlKTtcblxuICAgICAgaWYgKCFiYWRSZXEgJiYgcmV0cmllcyA8IHRoaXMuTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxLCArK3JldHJpZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhdGNoSGVhZGVycyhyZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1MaW1pdCcpKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKSk7XG4gICAgY29uc3QgcmVzZXRBZnRlciA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PiBuZXcgVVJMU2VhcmNoUGFyYW1zKHRvU25ha2VDYXNlKHBhcmFtcykpLnRvU3RyaW5nKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBpZFxuICAgKi9cbiAgaWQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICovXG4gIHRyYWNrTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFydGlzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgaW5zdHJ1bWVudGFsOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHBsYWluTHlyaWNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgc3luY2VkTHlyaWNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMcmNHZXRSZXN1bHQgPSBPbWl0PExyY1NlYXJjaFJlc3VsdCwgJ25hbWUnPjtcblxuZXhwb3J0IGNsYXNzIExyY0xpYiB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIFVSTFxuICAgKi9cbiAgcHVibGljIGFwaSA9ICdodHRwczovL2xyY2xpYi5uZXQvYXBpJztcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IHRpbWVvdXQuIERlZmF1bHQgaXMgMTUgc2Vjb25kcy5cbiAgICovXG4gIHB1YmxpYyB0aW1lb3V0ID0gMTVfMDAwO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgYnVja2V0XG4gICAqL1xuICBwdWJsaWMgYnVja2V0ID0gbmV3IFNlcXVlbnRpYWxCdWNrZXQoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBMcmNMaWIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZXF1ZXN0IHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgc2V0UmVxdWVzdFRpbWVvdXQodGltZW91dDogbnVtYmVyKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZXRyeSBsaW1pdC4gRGVmYXVsdCBpcyA1LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIHJldHJ5IGxpbWl0XG4gICAqL1xuICBwdWJsaWMgc2V0UmV0cnlMaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgdGhpcy5idWNrZXQuTUFYX1JFVFJJRVMgPSBsaW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0KHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQ/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3MgYnkgSURcbiAgICogQHBhcmFtIGlkIFRoZSBseXJpY3MgSURcbiAgICovXG4gIHB1YmxpYyBnZXRCeUlkKGlkOiBgJHtudW1iZXJ9YCB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihgZ2V0LyR7aWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjYWNoZWQgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBnZXRDYWNoZWQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICBjb25zdCBwYXRoID0gYGdldC1jYWNoZWQ/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgZm9yIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBzZWFyY2ggcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKHBhcmFtczogTHJjU2VhcmNoUGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMucSAmJiAhcGFyYW1zLnRyYWNrTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdvbmUgb2YgcSBvciB0cmFja05hbWUnLFxuICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgW1N0cmluZyhwYXJhbXMucSksIFN0cmluZyhwYXJhbXMudHJhY2tOYW1lKV0uam9pbignLCAnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gYHNlYXJjaD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0W10+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRoZSBBUElcbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGhcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3Q8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBVdGlsLmdldFJ1bnRpbWUoKTtcblxuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBuYW1lID09PSAndW5rbm93bicgPyB2ZXJzaW9uIDogYCR7bmFtZX0vJHt2ZXJzaW9ufWA7XG5cbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCh0aGlzLnRpbWVvdXQpLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiBgRGlzY29yZC1QbGF5ZXIvJHt0aGlzLnBsYXllci52ZXJzaW9ufSAke3J1bnRpbWVWZXJzaW9uID8/ICcnfWAudHJpbUVuZCgpLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgW0xyY0xpYl0gUmVxdWVzdGluZyAke3BhdGh9YCk7XG5cbiAgICAgIHJldHVybiBmZXRjaChgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCwgaW5pdCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgfVxufSIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICBqb2luVm9pY2VDaGFubmVsLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBBdWRpb1BsYXllciB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBOb0d1aWxkUXVldWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAvKipcbiAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAvKipcbiAgICogVGhlIHZvaWNlIHV0aWxzIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gIH0pXG4gIDogUHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPiB7XG4gICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCk7XG4gICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uLCBjaGFubmVsLCBvcHRpb25zLnF1ZXVlLCBvcHRpb25zLm1heFRpbWUsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgIHJldHVybiBzdWI7XG4gIH1cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luKFxuICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgbWF4VGltZT86IG51bWJlcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29ubmVjdGlvbiA9IHRoaXMuZ2V0Q29ubmVjdGlvbihjaGFubmVsLmd1aWxkLmlkLCBvcHRpb25zPy5ncm91cCk7XG5cbiAgICBpZiAoXG4gICAgZXhpc3RpbmdDb25uZWN0aW9uPy5qb2luQ29uZmlnLmNoYW5uZWxJZCA9PT0gY2hhbm5lbD8uaWQgJiZcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0Nvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwLFxuICAgICAgZ3JvdXA6IG9wdGlvbnM/Lmdyb3VwXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29ubjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIGRpc2Nvbm5lY3QoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uIHwgU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJldHVybnMgRGlzY29yZCBQbGF5ZXIgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZ2V0Vm9pY2VDb25uZWN0aW9uKGd1aWxkLCBncm91cCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9OyIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpOiBQcm9taXNlPHZvaWQ+O1xuICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gIH0pXG4gIHtcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5jbGVhbnVwLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhbnVwKCkge1xuICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCkge1xuICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgIGlmICghcmVzdWx0KVxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgdHJhY2tzOiBbcmVzdWx0LmRhdGFdLFxuICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnlcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VCA9IHVua25vd24+IHtcbiAgcHVibGljIGV4cGlyZUFmdGVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHwgaXNOYU4odGhpcy5leHBpcmVBZnRlcikgfHwgdGhpcy5leHBpcmVBZnRlciA8IDEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSA8PSB0aGlzLmV4cGlyZUFmdGVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHJlcXVlc3RlZEJ5PzogVXNlcjtcbiAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgYGV4dDoke3N0cmluZ31gO1xufSIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgU25vd2ZsYWtlVXRpbCxcbiAgVm9pY2VTdGF0ZSxcbiAgSW50ZW50c0JpdEZpZWxkLFxuICBVc2VyLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHZlcnNpb24gYXMgZGpzVmVyc2lvbixcbiAgRXZlbnRzIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQsIFNlYXJjaE9wdGlvbnMsIFBsYXlsaXN0SW5pdERhdGEgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQge1xuICBHdWlsZFF1ZXVlRXZlbnRzLFxuICBWb2ljZUNvbm5lY3RDb25maWcsXG4gIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsXG4gIEd1aWxkTm9kZU1hbmFnZXIsXG4gIEd1aWxkUXVldWUsXG4gIFJlc291cmNlUGxheU9wdGlvbnMsXG4gIEd1aWxkUXVldWVFdmVudCB9IGZyb21cbicuL3F1ZXVlJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIsIFF1ZXJ5VHlwZSwgUmVzb2x2ZWRRdWVyeSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgUXVlcnlDYWNoZSwgUXVlcnlDYWNoZVByb3ZpZGVyIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciwgTm9SZXN1bHRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcbmltcG9ydCB7IENvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IEhvb2tzQ3R4LCBTVVBFUl9DT05URVhUIH0gZnJvbSAnLi9ob29rcy9jb21tb24nO1xuaW1wb3J0IHsgTHJjTGliIH0gZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB7IGdldENvbXBhdE5hbWUsIGlzQ2xpZW50UHJveHkgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRwVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyRXZlbnRzIHtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IFBsYXllckV2ZW50ID0ge1xuICBkZWJ1ZzogJ2RlYnVnJyxcbiAgRGVidWc6ICdkZWJ1ZycsXG4gIGVycm9yOiAnZXJyb3InLFxuICBFcnJvcjogJ2Vycm9yJyxcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICBWb2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZSdcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQbGF5ZXJFdmVudCA9ICh0eXBlb2YgUGxheWVyRXZlbnQpW2tleW9mIHR5cGVvZiBQbGF5ZXJFdmVudF07XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID0gc3RyaW5nIHwgVHJhY2sgfCBTZWFyY2hSZXN1bHQgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBBdWRpb1Jlc291cmNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKVxuPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgKi9cbiAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICovXG4gIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAqL1xuICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICNsYWdNb25pdG9yVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0O1xuICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgI2hvb2tzQ3R4OiBDb250ZXh0PEhvb2tzQ3R4PiB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gZHBWZXJzaW9uO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgLyoqXG4gICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbm9kZXMgKHF1ZXVlKSBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBhcGkgdXRpbGl0aWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgZXZlbnRzIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSBQbGF5ZXIudmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSBseXJpY3MgYXBpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihbUGxheWVyRXZlbnQuRXJyb3JdKTtcblxuICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHR5cGUgXCJzdHJpbmdcIiBmb3Igb3B0aW9ucy5mZm1wZWdQYXRoLiBHb3QgJHt0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRofSBpbnN0ZWFkYCk7XG5cbiAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXNjb3JkIGNsaWVudFxuICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoY2xpZW50IGluc3RhbmNlb2YgQ2xpZW50KSkge1xuICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWJmID1cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID9cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDpcbiAgICAgICAgbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH19XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgIHF1ZXJ5Q2FjaGU6IG9wdGlvbnMucXVlcnlDYWNoZSA9PT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSBzYXRpc2ZpZXMgUGxheWVySW5pdE9wdGlvbnM7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuaW5jcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmNsaWVudC5vbihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICB0aGlzLmNsaWVudC5fX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHkodGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gYXR0YWNoIHZvaWNlIHN0YXRlIHVwZGF0ZSBwcm94eSwgdm9pY2Ugc3RhdGUgaGFuZGxlciB3aWxsIG5vdCB3b3JrIHByb3Blcmx5JyxcbiAgICAgICAgICAnQ29tcGF0TW9kZUVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMCkge1xuICAgICAgdGhpcy4jbGFnTW9uaXRvckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2xhc3RMYXRlbmN5ID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgIHJldHVybiBpc0NsaWVudFByb3h5KHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuVm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgLy8gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCByZXR1cm4gYXNzdW1pbmcgdGhlIGxpc3RlbmVyIGltcGxlbWVudGVkIGFsbCBvZiB0aGUgbG9naWMgYmVsb3dcbiAgICBpZiAod2FzSGFuZGxlZCAmJiAhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG9sZFN0YXRlIFRoZSBvbGQgdm9pY2Ugc3RhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICpcbiAgICogY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwgc3RvcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGUgbXVzaWMgc2hvdWxkIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAqXG4gICAqIHRyeSB7XG4gICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0NcdURGODkgSSBhbSBwbGF5aW5nICR7dHJhY2sudGl0bGV9IFx1RDgzQ1x1REY4OWApO1xuICAgKiB9IGNhdGNoKGUpIHtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBxdWVyeTogVHJhY2tMaWtlLFxuICBvcHRpb25zOiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+ID0ge30pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCB2YyA9IHRoaXMuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbCk7XG4gICAgaWYgKCF2Yz8uaXNWb2ljZUJhc2VkKCkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2NoYW5uZWwnLCAnVm9pY2VCYXNlZENoYW5uZWwnLCAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWApO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKSBhd2FpdCBxdWV1ZS5ub2RlLnBsYXkobnVsbCwgb3B0aW9ucy5hdWRpb1BsYXllck9wdGlvbnMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRyYWNrc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIEF1ZGlvUmVzb3VyY2UpIHtcbiAgICAgIHNlYXJjaFF1ZXJ5ID0gdGhpcy5jcmVhdGVUcmFja0Zyb21BdWRpb1Jlc291cmNlKHNlYXJjaFF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG5cbiAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgdHJhY2tzOiBbc2VhcmNoUXVlcnldLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IHNlYXJjaFF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgbGV0IGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsLFxuICAgICAgcHJvdG9jb2w6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gXG4gICAgKTtcblxuICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gZGV0ZWN0ZWQgaW4gcXVlcnlgKTtcblxuICAgICAgY29uc3QgbWF0Y2hpbmdFeHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuZmluZChcbiAgICAgICAgKGUpID0+ICF0aGlzLmV4dHJhY3RvcnMuaXNEaXNhYmxlZChlLmlkZW50aWZpZXIpICYmIGUucHJvdG9jb2xzLmluY2x1ZGVzKHByb3RvY29sTmFtZSlcbiAgICAgICk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0V4dHJhY3Rvcikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGlzIHN1cHBvcnRlZCBieSAke21hdGNoaW5nRXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciFgKTtcbiAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gP1xuICAgIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6XG4gICAgeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgIGV4dHJhY3RvciAmJiBwcm90b2NvbCA/ICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDogJyd9YFxuXG4gICAgKTtcblxuICAgIC8vIGZvcmNlIHBhcnRpY3VsYXIgZXh0cmFjdG9yXG4gICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICB9KSk/LlxuICAgICAgZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3IuXG4gICAgaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgcHJvdG9jb2xcbiAgICB9KS5cbiAgICBjYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0KSA9PlxuICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiYgKFxuICAgICAgYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgIHByb3RvY29sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKCFyZXN1bHQ/LnJlc3VsdCkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICBleHRyYWN0b3I6IHJlc3VsdD8uZXh0cmFjdG9yXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAqIGBgYFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICBjb25zdCBydW50aW1lID0gJ0J1bicgaW4gZ2xvYmFsVGhpcyA/ICdCdW4nIDogJ0Rlbm8nIGluIGdsb2JhbFRoaXMgPyAnRGVubycgOiAnTm9kZSc7XG4gICAgY29uc3QgZGVwc1JlcG9ydCA9IFtcbiAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgIGxpbmUsXG4gICAgYC0gZGlzY29yZC1wbGF5ZXI6ICR7UGxheWVyLnZlcnNpb259JHtcbiAgICB0aGlzLmlzQ29tcGF0TW9kZSgpID8gYCAoJHtnZXRDb21wYXROYW1lKHRoaXMuY2xpZW50KX0gY29tcGF0aWJpbGl0eSBtb2RlKWAgOiAnJ31gLFxuXG4gICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAoKCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgcmV0dXJuIFtcbiAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsXG4gICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uXG4gICAgICBqb2luKCdcXG4nKTtcbiAgICB9KSgpLFxuICAgICdcXG4nLFxuICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgIGxpbmUsXG4gICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICB9KS5cbiAgICBqb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAnXFxuXFxuZGlzY29yZC12b2lwJyxcbiAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCldO1xuXG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFjayBmcm9tIGFuIGF1ZGlvIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzb3VyY2UubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgcmVmID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgbWF5YmVUaXRsZSA9ICd0aXRsZScgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aXRsZX1gIDogYFRyYWNrICR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVBdXRob3IgPSAnYXV0aG9yJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmF1dGhvcn1gIDogJ1Vua25vd24gYXV0aG9yJztcbiAgICBjb25zdCBtYXliZUR1cmF0aW9uID0gJ2R1cmF0aW9uJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmR1cmF0aW9ufWAgOiAnMDA6MDAnO1xuICAgIGNvbnN0IG1heWJlVGh1bWJuYWlsID0gJ3RodW1ibmFpbCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aHVtYm5haWx9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXliZVVSTCA9ICd1cmwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudXJsfWAgOiBgZGlzY29yZC1wbGF5ZXI6Ly9ibG9iLyR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9ICdkZXNjcmlwdGlvbicgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1gIDogJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nO1xuICAgIGNvbnN0IG1heWJlVmlld3MgPSAndmlld3MnIGluIG1ldGFkYXRhID8gTnVtYmVyKG1ldGFkYXRhLnZpZXdzKSB8fCAwIDogMDtcblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHtcbiAgICAgIHRpdGxlOiBtYXliZVRpdGxlLFxuICAgICAgYXV0aG9yOiBtYXliZUF1dGhvcixcbiAgICAgIGR1cmF0aW9uOiBtYXliZUR1cmF0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBtYXliZVRodW1ibmFpbCxcbiAgICAgIHVybDogbWF5YmVVUkwsXG4gICAgICBkZXNjcmlwdGlvbjogbWF5YmVEZXNjcmlwdGlvbixcbiAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsXG4gICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHZpZXdzOiBtYXliZVZpZXdzXG4gICAgfSk7XG5cbiAgICByZXNvdXJjZS5tZXRhZGF0YSA9IHRyYWNrO1xuXG4gICAgdHJhY2suc2V0UmVzb3VyY2UocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG59IiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5mdW5jdGlvbiBoYW5kbGVFbXB0eUNoYW5uZWwocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBndWlsZElkOiBzdHJpbmcpIHtcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpIHx8ICFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7Z3VpbGRJZH1gLCB0aW1lb3V0KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlQ2hhbm5lbFBvcHVsYXRlKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgZ3VpbGRJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtndWlsZElkfWApO1xuICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZTogR3VpbGRRdWV1ZSkge1xuICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICBjb25zdCB3YXNQYXVzZWRPbkVtcHR5ID0gUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKTtcblxuICBpZiAoaXNFbXB0eSAmJiAhd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghaXNFbXB0eSAmJiB3YXNQYXVzZWRPbkVtcHR5KSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoJ1ZvaWNlIGNoYW5uZWwgaXMgbm90IGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCByZXN1bWluZy4uLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVCb3RWb2ljZVN0YXRlVXBkYXRlKHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpXG4gIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFN0YXRlOiBWb2ljZVN0YXRlLFxubmV3U3RhdGU6IFZvaWNlU3RhdGUpXG57XG4gIGlmICghcXVldWU/LmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBjb25zdCBpc0JvdFN0YXRlID0gbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQ7XG4gIGNvbnN0IGd1aWxkSWQgPSBvbGRTdGF0ZS5ndWlsZC5pZDtcblxuICAvLyBCb3QgZGlzY29ubmVjdGVkXG4gIGlmIChpc0JvdFN0YXRlICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgaGFuZGxlUGF1c2VPbkVtcHR5KHF1ZXVlKTtcbiAgfVxuXG4gIC8vIEJvdCBqb2luZWQgY2hhbm5lbCBvciBjaGFuZ2VkIHN0YXRlXG4gIGlmIChpc0JvdFN0YXRlICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiAoIW9sZFN0YXRlLmNoYW5uZWxJZCB8fCBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkpIHtcbiAgICBpZiAocXVldWUuY29ubmVjdGlvbikgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgIGhhbmRsZUJvdFZvaWNlU3RhdGVVcGRhdGUocXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyBIYW5kbGUgY2hhbm5lbCBlbXB0eS9wb3B1bGF0ZSBldmVudHNcbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBoYW5kbGVDaGFubmVsUG9wdWxhdGUocGxheWVyLCBxdWV1ZSwgZ3VpbGRJZCk7XG4gIH0gZWxzZSBpZiAob2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkICYmICFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGlmICghcXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke2d1aWxkSWR9YCkpIHtcbiAgICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gIGNvcmU6IHtcbiAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgJ2Rpc2NvcmQtdm9pcCc6IHN0cmluZztcbiAgfTtcbiAgbGlib3B1czoge1xuICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BkaXNjb3JkanMvb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ25vZGUtb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICB9O1xuICBsaWJzb2RpdW06IHtcbiAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIHNvZGl1bTogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGZmbXBlZzogRkZtcGVnUmVwb3J0O1xufVxuXG5leHBvcnQgdHlwZSBGRm1wZWdSZXBvcnQgPSBSZWNvcmQ8XG4gIEZGbXBlZ0xpYixcbiAgTWF5YmVOdWxsPHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaGFzTGlib3B1czogYm9vbGVhbjtcbiAgfT4+O1xuXG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBhIHBhY2thZ2UuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICogQHBhcmFtIGRlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGZpbmRQYWNrYWdlSlNPTihkaXI6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IFBhY2thZ2VKU09OIHwgbnVsbCB7XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHRhcmdldCA9IHJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG5cbiAgICBjb25zdCBuZXh0ID0gKCkgPT4gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04ocmVzb2x2ZShkaXIsICcuLicpLCBwYWNrYWdlTmFtZSwgZGVwdGggLSAxKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgY29uc3QgcGtnSlNPTjogUGFja2FnZUpTT04gPSByZXF1aXJlKHRhcmdldCk7XG5cbiAgICAgIGlmIChwa2dKU09OLm5hbWUgIT09IHBhY2thZ2VOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwa2dKU09OO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBUcmllcyB0byBmaW5kIHRoZSB2ZXJzaW9uIG9mIGEgZGVwZW5kZW5jeS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgcGFja2FnZSB0byBmaW5kIHRoZSB2ZXJzaW9uIG9mXG4gICAqIEBwYXJhbSBtYXhMb29rdXBEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaCBmb3IgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAqIEByZXR1cm5zIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgdmVyc2lvbihuYW1lOiBzdHJpbmcsIG1heExvb2t1cERlcHRoID0gMyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ2Rpc2NvcmQtcGxheWVyJykge1xuICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGtnID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04oZGlybmFtZShyZXF1aXJlLnJlc29sdmUobmFtZSkpLCBuYW1lLCBtYXhMb29rdXBEZXB0aCk7XG4gICAgICByZXR1cm4gcGtnPy52ZXJzaW9uID8/IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gICAqIEByZXR1cm5zIFRoZSByZXBvcnQgb2JqZWN0XG4gICAqL1xuICBnZW5lcmF0ZSgpOiBEZXBlbmRlbmNpZXNSZXBvcnQge1xuICAgIGNvbnN0IGZmbXBlZ1JlcG9ydCA9IHt9IGFzIEZGbXBlZ1JlcG9ydDtcblxuICAgIGZvciAoY29uc3QgbGliIG9mIEZGbXBlZy5zb3VyY2VzKSB7XG4gICAgICBmZm1wZWdSZXBvcnRbbGliLm5hbWVdID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmZm1wZWcgPSBGRm1wZWcucmVzb2x2ZVNhZmUoKTtcblxuICAgIGlmIChmZm1wZWcpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtmZm1wZWcubmFtZV0gPSB7XG4gICAgICAgIGhhc0xpYm9wdXM6IGZmbXBlZy5jb21tYW5kLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyksXG4gICAgICAgIHZlcnNpb246IGZmbXBlZy52ZXJzaW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb3JlOiB7XG4gICAgICAgICdkaXNjb3JkLXBsYXllcic6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignZGlzY29yZC1wbGF5ZXInKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2Rpc2NvcmQtdm9pcCcpIGFzIHN0cmluZ1xuICAgICAgfSxcbiAgICAgIGxpYm9wdXM6IHtcbiAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgJ0BldmFuL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BldmFuL29wdXMnKSxcbiAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpXG4gICAgICB9LFxuICAgICAgbGlic29kaXVtOiB7XG4gICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbGlic29kaXVtLXdyYXBwZXJzJyksXG4gICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JyksXG4gICAgICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLWphdmFzY3JpcHQnKSxcbiAgICAgICAgJ0Bub2JlbC9jaXBoZXJzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAbm9iZWwvY2lwaGVycycpXG4gICAgICB9LFxuICAgICAgZmZtcGVnOiBmZm1wZWdSZXBvcnRcbiAgICB9O1xuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXBlbmRlbmNpZXMgcmVwb3J0LlxuICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBnZW5lcmF0ZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlcG9ydCA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGUoKTtcbiAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG5cbiAgICBjb25zdCBvdXRwdXQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBvdXRwdXQucHVzaCgnRGVwZW5kZW5jaWVzIFJlcG9ydCcpO1xuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlcG9ydCkgYXMgKGtleW9mIERlcGVuZGVuY2llc1JlcG9ydClbXTtcblxuICAgIGZvciAoY29uc3QgX2tleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBrZXkgPSBfa2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydDtcblxuICAgICAgb3V0cHV0LnB1c2goa2V5KTtcblxuICAgICAgY29uc3Qgc3ViS2V5cyA9IE9iamVjdC5rZXlzKHJlcG9ydFtrZXldKTtcblxuICAgICAgZm9yIChjb25zdCBfc3ViS2V5IG9mIHN1YktleXMpIHtcbiAgICAgICAgY29uc3Qgc3ViS2V5ID0gX3N1YktleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnRbdHlwZW9mIGtleV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVwb3J0W2tleV1bc3ViS2V5XSA/PyAnTi9BJztcblxuICAgICAgICBvdXRwdXQucHVzaChgLSAke3N1YktleX06ICR7dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA6IHZhbHVlfWApO1xuICAgICAgfVxuXG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oJ1xcbicpO1xuICB9XG59OyIsICJcblxuXG5cblxuXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9IC8qIEBfX01BQ1JPX18gZ2V0VmVyc2lvbiAqL1wiNy4wLjBcIjsiXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0dBLGlCQUFtRDs7O0FDRm5ELHNCQUEyQjs7O0FDRDNCLHFCQUEwRjs7O0FDQW5GLElBQU0sc0JBQU4sTUFBTSw0QkFBMkIsTUFBTTtBQUFBLEVBSXJDLFlBQVksTUFBa0IsU0FBaUI7QUFDcEQsVUFBTSxPQUFPO0FBSmYsd0JBQWdCO0FBQ2hCLHdCQUFnQixhQUFvQixLQUFLLElBQUk7QUFJM0MsU0FBSyxPQUFPLEtBQUssWUFBWTtBQUM3QixTQUFLLE9BQU87QUFFWixRQUFJLE1BQU0sbUJBQW1CO0FBQzNCLFlBQU0sa0JBQWtCLE1BQU0sS0FBSyxXQUFXO0FBQUEsSUFDaEQ7QUFBQSxFQUNGO0FBQUEsRUFFTyxTQUFTO0FBQ2QsV0FBTztBQUFBLE1BQ0wsTUFBTSxLQUFLLFlBQVk7QUFBQSxNQUN2QixN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TSx1QkFBTjs7O0FSMEVBLElBQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVoscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVgsb0JBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJcEIsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFB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QUFTLEtBQUs7QUFDM0UsVUFBTSxXQUFXLFNBQVMsV0FBVyxHQUFHLFNBQVMsR0FBRyxLQUFLLHlCQUF5QixHQUFHO0FBQ3JGLFVBQU0sbUJBQW1CLGlCQUFpQixXQUFXLEdBQUcsU0FBUyxXQUFXLEtBQUs7QUFDakYsVUFBTSxhQUFhLFdBQVcsV0FBVyxPQUFPLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFFdkUsVUFBTSxRQUFRLElBQUksTUFBTSxNQUFNO0FBQUEsTUFDNUIsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsS0FBSztBQUFBLE1BQ0wsYUFBYTtBQUFBLE1BQ2IsV0FBVyxVQUFVO0FBQUEsTUFDckIsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxJQUNULENBQUM7QUFFRCxhQUFTLFdBQVc7QUFFcEIsVUFBTSxZQUFZLFFBQWdDO0FBRWxELFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUExckJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU40RDtBQUFBO0FBQUE7QUFBQTtBQVU1RCxjQVZXLFNBVVksV0FBa0I7QUFWcEMsSUFBTSxTQUFOOzs7QXpDeEdQLElBQUFLLG9CQVdBO0FBQ0EsSUFBQUMsdUJBU0E7IiwKICAibmFtZXMiOiBbIkd1aWxkUXVldWUiLCAiU2VyaWFsaXplZFR5cGUiLCAicXVlcnkiLCAidmVyc2lvbiIsICJtb2R1bGUiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJyZXN1bHQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicmVzb2x2ZSIsICJyZXNvbHZlIiwgIndhaXRGb3IiLCAiaW1wb3J0X2VxdWFsaXplciIsICJUcmFja1NraXBSZWFzb24iLCAicmVzb2x2ZSIsICJHdWlsZFF1ZXVlIiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X3Byb21pc2VzIiwgInZlcnNpb24iLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2ZmbXBlZyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9mZm1wZWciLCAiZGpzVmVyc2lvbiIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIl0KfQo=
|