@decaf-ts/decorator-validation 1.7.3 → 1.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -157
- package/dist/decorator-validation.cjs +320 -211
- package/dist/decorator-validation.esm.cjs +320 -211
- package/lib/constants/errors.cjs +19 -0
- package/lib/constants/errors.d.ts +11 -0
- package/lib/constants/index.cjs +2 -1
- package/lib/constants/index.d.ts +1 -0
- package/lib/esm/constants/errors.d.ts +11 -0
- package/lib/esm/constants/errors.js +16 -0
- package/lib/esm/constants/index.d.ts +1 -0
- package/lib/esm/constants/index.js +2 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/validation.js +3 -3
- package/lib/esm/utils/PathProxy.d.ts +43 -0
- package/lib/esm/utils/PathProxy.js +89 -0
- package/lib/esm/utils/index.d.ts +1 -0
- package/lib/esm/utils/index.js +2 -1
- package/lib/esm/validation/Validators/DiffValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/DiffValidator.js +5 -5
- package/lib/esm/validation/Validators/EqualsValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/EqualsValidator.js +5 -5
- package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js +6 -5
- package/lib/esm/validation/Validators/GreaterThanValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/GreaterThanValidator.js +6 -5
- package/lib/esm/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/LessThanOrEqualValidator.js +6 -5
- package/lib/esm/validation/Validators/LessThanValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/LessThanValidator.js +6 -5
- package/lib/esm/validation/Validators/Validator.d.ts +3 -2
- package/lib/esm/validation/Validators/Validator.js +1 -1
- package/lib/esm/validation/Validators/constants.d.ts +0 -13
- package/lib/esm/validation/Validators/constants.js +1 -14
- package/lib/esm/validation/Validators/utils.d.ts +0 -14
- package/lib/esm/validation/Validators/utils.js +69 -56
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/validation.cjs +3 -3
- package/lib/utils/PathProxy.cjs +93 -0
- package/lib/utils/PathProxy.d.ts +43 -0
- package/lib/utils/index.cjs +2 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/validation/Validators/DiffValidator.cjs +5 -5
- package/lib/validation/Validators/DiffValidator.d.ts +4 -2
- package/lib/validation/Validators/EqualsValidator.cjs +5 -5
- package/lib/validation/Validators/EqualsValidator.d.ts +4 -2
- package/lib/validation/Validators/GreaterThanOrEqualValidator.cjs +5 -4
- package/lib/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
- package/lib/validation/Validators/GreaterThanValidator.cjs +5 -4
- package/lib/validation/Validators/GreaterThanValidator.d.ts +4 -2
- package/lib/validation/Validators/LessThanOrEqualValidator.cjs +5 -4
- package/lib/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
- package/lib/validation/Validators/LessThanValidator.cjs +5 -4
- package/lib/validation/Validators/LessThanValidator.d.ts +4 -2
- package/lib/validation/Validators/Validator.cjs +1 -1
- package/lib/validation/Validators/Validator.d.ts +3 -2
- package/lib/validation/Validators/constants.cjs +2 -15
- package/lib/validation/Validators/constants.d.ts +0 -13
- package/lib/validation/Validators/utils.cjs +79 -67
- package/lib/validation/Validators/utils.d.ts +0 -14
- package/package.json +2 -2
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["decorator-validation"] = {}, null, global.reflection, global.tslib));
|
|
5
5
|
})(this, (function (exports, reflectMetadata, reflection, tslib) { 'use strict';
|
|
6
6
|
|
|
7
|
+
const COMPARISON_ERROR_MESSAGES = {
|
|
8
|
+
INVALID_PATH: "Invalid path argument. Expected non-empty string but received: '{0}'",
|
|
9
|
+
CONTEXT_NOT_OBJECT_COMPARISON: "Unable to access parent at level {0} for path '{1}': current context is not an object",
|
|
10
|
+
PROPERTY_INVALID: "Failed to resolve path {0}: property '{1}' is invalid or does not exist.",
|
|
11
|
+
PROPERTY_NOT_EXIST: "Failed to resolve path: property '{0}' does not exist.",
|
|
12
|
+
UNSUPPORTED_TYPES_COMPARISON: "Unsupported types for comparison: '{0}' and '{1}'",
|
|
13
|
+
NULL_OR_UNDEFINED_COMPARISON: "Comparison failed due to null or undefined value",
|
|
14
|
+
INVALID_DATE_COMPARISON: "Invalid Date objects are not comparable",
|
|
15
|
+
TYPE_MISMATCH_COMPARISON: "Cannot compare values of different types: {0} and {1}.",
|
|
16
|
+
NAN_COMPARISON: "Comparison not supported for NaN values",
|
|
17
|
+
// NO_PARENT_COMPARISON: "Unable to access parent at level {0} for path '{1}': no parent available",
|
|
18
|
+
// PROPERTY_NOT_FOUND: "Failed to resolve path {0}: property '{1}' does not exist.",
|
|
19
|
+
// PROPERTY_NOT_FOUND_ON_PARENT: "Failed to resolve path {0}: property '{1}' does not exist on parent.",
|
|
20
|
+
// PROPERTY_NOT_FOUND_AFTER_PARENT: "Failed to resolve path {0}: property '{1}' does not exist after {2} parent level(s).",
|
|
21
|
+
};
|
|
22
|
+
|
|
7
23
|
/**
|
|
8
24
|
* @description Symbol key for tracking parent-child relationships in validation
|
|
9
25
|
* @summary Symbol used to internally track the parent object during nested validation
|
|
@@ -208,19 +224,6 @@
|
|
|
208
224
|
GREATER_THAN: "This field must be greater than field {0}",
|
|
209
225
|
GREATER_THAN_OR_EQUAL: "This field must be greater than or equal to field {0}",
|
|
210
226
|
};
|
|
211
|
-
const COMPARISON_ERROR_MESSAGES = {
|
|
212
|
-
INVALID_PATH: "Invalid path argument. Expected non-empty string but received: '{0}'",
|
|
213
|
-
CONTEXT_NOT_OBJECT_COMPARISON: "Unable to access parent at level {0} for path '{1}': current context is not an object",
|
|
214
|
-
NO_PARENT_COMPARISON: "Unable to access parent at level {0} for path '{1}': no parent available",
|
|
215
|
-
PROPERTY_NOT_FOUND: "Failed to resolve path {0}: property '{1}' does not exist.",
|
|
216
|
-
PROPERTY_NOT_FOUND_ON_PARENT: "Failed to resolve path {0}: property '{1}' does not exist on parent.",
|
|
217
|
-
PROPERTY_NOT_FOUND_AFTER_PARENT: "Failed to resolve path {0}: property '{1}' does not exist after {2} parent level(s).",
|
|
218
|
-
UNSUPPORTED_TYPES_COMPARISON: "Unsupported types for comparison: '{0}' and '{1}'",
|
|
219
|
-
NULL_OR_UNDEFINED_COMPARISON: "Comparison failed due to null or undefined value",
|
|
220
|
-
INVALID_DATE_COMPARISON: "Invalid Date objects are not comparable",
|
|
221
|
-
TYPE_MISMATCH_COMPARISON: "Cannot compare values of different types: {0} and {1}.",
|
|
222
|
-
NAN_COMPARISON: "Comparison not supported for NaN values",
|
|
223
|
-
};
|
|
224
227
|
/**
|
|
225
228
|
* @summary Defines the various default regexp patterns used
|
|
226
229
|
*
|
|
@@ -890,6 +893,93 @@
|
|
|
890
893
|
}
|
|
891
894
|
}
|
|
892
895
|
|
|
896
|
+
const fallbackGetParent = (target) => {
|
|
897
|
+
return target[VALIDATION_PARENT_KEY];
|
|
898
|
+
};
|
|
899
|
+
const fallbackGetValue = (target, prop) => {
|
|
900
|
+
if (!Object.prototype.hasOwnProperty.call(target, prop))
|
|
901
|
+
throw new Error(sf(COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_EXIST, prop));
|
|
902
|
+
return target[prop];
|
|
903
|
+
};
|
|
904
|
+
/**
|
|
905
|
+
* Standard path resolution utility for accessing nested object properties.
|
|
906
|
+
* Provides consistent dot-notation access to both parent and child properties
|
|
907
|
+
* across complex object structures.
|
|
908
|
+
*
|
|
909
|
+
* - Dot-notation path resolution ('object.child.property')
|
|
910
|
+
* - Parent traversal using '../' notation
|
|
911
|
+
* - Configurable property access behavior
|
|
912
|
+
* - Null/undefined safety checks
|
|
913
|
+
*/
|
|
914
|
+
class PathProxyEngine {
|
|
915
|
+
/**
|
|
916
|
+
* Creates a path-aware proxy for the target object
|
|
917
|
+
* @template T - The type of the target object
|
|
918
|
+
* @param {T} rootTarget - The target object to proxy
|
|
919
|
+
* @param opts - Configuration options
|
|
920
|
+
* @param opts.getValue - Custom function to get property value
|
|
921
|
+
* @param opts.getParent - Custom function to get parent object
|
|
922
|
+
* @param opts.ignoreUndefined - Whether to ignore undefined values in paths
|
|
923
|
+
* @param opts.ignoreNull - Whether to ignore null values in paths
|
|
924
|
+
* @returns A proxy object with path access capabilities
|
|
925
|
+
*/
|
|
926
|
+
static create(rootTarget, opts) {
|
|
927
|
+
const { getValue, getParent, ignoreUndefined, ignoreNull } = {
|
|
928
|
+
getParent: fallbackGetParent,
|
|
929
|
+
getValue: fallbackGetValue,
|
|
930
|
+
ignoreNull: false,
|
|
931
|
+
ignoreUndefined: false,
|
|
932
|
+
...opts,
|
|
933
|
+
};
|
|
934
|
+
const proxy = new Proxy({}, {
|
|
935
|
+
get(target, prop) {
|
|
936
|
+
if (prop === "getValueFromPath") {
|
|
937
|
+
return function (path) {
|
|
938
|
+
const parts = PathProxyEngine.parsePath(path);
|
|
939
|
+
let current = rootTarget;
|
|
940
|
+
for (let i = 0; i < parts.length; i++) {
|
|
941
|
+
const part = parts[i];
|
|
942
|
+
if (part === "..") {
|
|
943
|
+
const parent = getParent(current);
|
|
944
|
+
if (!parent || typeof parent !== "object") {
|
|
945
|
+
throw new Error(sf(COMPARISON_ERROR_MESSAGES.CONTEXT_NOT_OBJECT_COMPARISON, i + 1, path));
|
|
946
|
+
}
|
|
947
|
+
current = parent; //PathProxyEngine.create(parentTarget, opts);
|
|
948
|
+
continue;
|
|
949
|
+
}
|
|
950
|
+
current = getValue(current, part);
|
|
951
|
+
if (!ignoreUndefined && typeof current === "undefined")
|
|
952
|
+
throw new Error(sf(COMPARISON_ERROR_MESSAGES.PROPERTY_INVALID, path, part));
|
|
953
|
+
if (!ignoreNull && current === null)
|
|
954
|
+
throw new Error(sf(COMPARISON_ERROR_MESSAGES.PROPERTY_INVALID, path, part));
|
|
955
|
+
}
|
|
956
|
+
return current;
|
|
957
|
+
};
|
|
958
|
+
}
|
|
959
|
+
return target[prop];
|
|
960
|
+
},
|
|
961
|
+
});
|
|
962
|
+
// Object.defineProperty(proxy, PROXY_PROP, {
|
|
963
|
+
// value: true, // overwrite by proxy behavior
|
|
964
|
+
// enumerable: false,
|
|
965
|
+
// configurable: false,
|
|
966
|
+
// writable: false,
|
|
967
|
+
// });
|
|
968
|
+
return proxy;
|
|
969
|
+
}
|
|
970
|
+
/**
|
|
971
|
+
* Parses a path string into individual components
|
|
972
|
+
* @param path - The path string to parse (e.g., "user.address.city")
|
|
973
|
+
* @returns An array of path components
|
|
974
|
+
* @throws Error if the path is invalid
|
|
975
|
+
*/
|
|
976
|
+
static parsePath(path) {
|
|
977
|
+
if (typeof path !== "string" || !path.trim())
|
|
978
|
+
throw new Error(sf(COMPARISON_ERROR_MESSAGES.INVALID_PATH, path));
|
|
979
|
+
return path.match(/(\.\.|[^/.]+)/g) || [];
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
|
|
893
983
|
/**
|
|
894
984
|
* @summary Helper Class to hold the error results
|
|
895
985
|
* @description holds error results in an 'indexable' manner
|
|
@@ -1298,8 +1388,7 @@
|
|
|
1298
1388
|
const decoratorProps = decorator.key === exports.ModelKeys.TYPE
|
|
1299
1389
|
? [decorator.props]
|
|
1300
1390
|
: decorator.props || {};
|
|
1301
|
-
const err = validator.hasErrors(obj[prop.toString()], decoratorProps, obj
|
|
1302
|
-
);
|
|
1391
|
+
const err = validator.hasErrors(obj[prop.toString()], decoratorProps, PathProxyEngine.create(obj, { ignoreUndefined: true, ignoreNull: true }));
|
|
1303
1392
|
if (err) {
|
|
1304
1393
|
errs = errs || {};
|
|
1305
1394
|
errs[decorator.key] = err;
|
|
@@ -2160,181 +2249,6 @@
|
|
|
2160
2249
|
tslib.__metadata("design:paramtypes", [String])
|
|
2161
2250
|
], exports.DateValidator);
|
|
2162
2251
|
|
|
2163
|
-
/**
|
|
2164
|
-
* Safely retrieves a nested property value from an object using a dot-notated path string.
|
|
2165
|
-
*
|
|
2166
|
-
* @template T - The expected return type of the property value.
|
|
2167
|
-
*
|
|
2168
|
-
* @param {Record<string, any>} obj - The source object to retrieve the value from.
|
|
2169
|
-
* @param {string} path - A dot-separated string representing the path to the desired property (e.g., "user.address.street").
|
|
2170
|
-
*
|
|
2171
|
-
* @returns {T} - The value found at the specified path
|
|
2172
|
-
*
|
|
2173
|
-
* @throws {Error} - Throws an error if the path is not a non-empty string or if any part of the path does not exist in the object.
|
|
2174
|
-
* @memberOf module:decorator-validation
|
|
2175
|
-
*/
|
|
2176
|
-
function getValueByPath(obj, path) {
|
|
2177
|
-
if (typeof path !== "string" || !path.trim()) {
|
|
2178
|
-
throw new Error(sf(COMPARISON_ERROR_MESSAGES.INVALID_PATH, path));
|
|
2179
|
-
}
|
|
2180
|
-
// Process parent directory access (../)
|
|
2181
|
-
const parentAccessors = path.match(/\.\.\//g) || [];
|
|
2182
|
-
const parentLevel = parentAccessors.length;
|
|
2183
|
-
const cleanPath = path.replace(/\.\.\//g, "");
|
|
2184
|
-
// Navigate up the parent chain
|
|
2185
|
-
let currentContext = obj;
|
|
2186
|
-
for (let i = 0; i < parentLevel; i++) {
|
|
2187
|
-
if (!currentContext || typeof currentContext !== "object") {
|
|
2188
|
-
throw new Error(sf(COMPARISON_ERROR_MESSAGES.CONTEXT_NOT_OBJECT_COMPARISON, i + 1, path));
|
|
2189
|
-
}
|
|
2190
|
-
if (!currentContext[VALIDATION_PARENT_KEY]) {
|
|
2191
|
-
throw new Error(sf(COMPARISON_ERROR_MESSAGES.NO_PARENT_COMPARISON, i + 1, path));
|
|
2192
|
-
}
|
|
2193
|
-
currentContext = currentContext[VALIDATION_PARENT_KEY];
|
|
2194
|
-
}
|
|
2195
|
-
// Process dot notation path
|
|
2196
|
-
const parts = cleanPath.split(".");
|
|
2197
|
-
let currentValue = currentContext;
|
|
2198
|
-
for (const part of parts) {
|
|
2199
|
-
if (currentValue !== null &&
|
|
2200
|
-
typeof currentValue === "object" &&
|
|
2201
|
-
part in currentValue) {
|
|
2202
|
-
currentValue = currentValue[part];
|
|
2203
|
-
}
|
|
2204
|
-
else {
|
|
2205
|
-
const errorMsgTemplate = parentLevel === 0
|
|
2206
|
-
? COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND
|
|
2207
|
-
: parentLevel === 1
|
|
2208
|
-
? COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_ON_PARENT
|
|
2209
|
-
: COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_AFTER_PARENT;
|
|
2210
|
-
throw new Error(sf(errorMsgTemplate, path, part, parentLevel));
|
|
2211
|
-
}
|
|
2212
|
-
}
|
|
2213
|
-
return currentValue;
|
|
2214
|
-
}
|
|
2215
|
-
const getTypeName = (value) => {
|
|
2216
|
-
if (value === null)
|
|
2217
|
-
return "null";
|
|
2218
|
-
if (value instanceof Date)
|
|
2219
|
-
return "Date";
|
|
2220
|
-
if (Number.isNaN(value))
|
|
2221
|
-
return "NaN";
|
|
2222
|
-
if (value === Infinity)
|
|
2223
|
-
return "Infinity";
|
|
2224
|
-
if (value === -Infinity)
|
|
2225
|
-
return "-Infinity";
|
|
2226
|
-
if (Array.isArray(value))
|
|
2227
|
-
return "array";
|
|
2228
|
-
return typeof value;
|
|
2229
|
-
};
|
|
2230
|
-
const isSupported = (value) => {
|
|
2231
|
-
if (value === undefined || value instanceof Date)
|
|
2232
|
-
return true;
|
|
2233
|
-
if (typeof value === "bigint")
|
|
2234
|
-
return true;
|
|
2235
|
-
// Numbers must be finite (excludes NaN, Infinity, -Infinity)
|
|
2236
|
-
if (typeof value === "number")
|
|
2237
|
-
return Number.isFinite(value);
|
|
2238
|
-
return false;
|
|
2239
|
-
};
|
|
2240
|
-
/**
|
|
2241
|
-
* Validates whether two values are eligible for comparison using >= or <= operators.
|
|
2242
|
-
*
|
|
2243
|
-
* Supported types: `undefined`, `number`, `bigint`, and `Date`.
|
|
2244
|
-
*
|
|
2245
|
-
* @param a - The first value to compare.
|
|
2246
|
-
* @param b - The second value to compare.
|
|
2247
|
-
*
|
|
2248
|
-
* @returns {boolean} True if both values are of supported types.
|
|
2249
|
-
*
|
|
2250
|
-
* @throws {TypeError} If either value is of an unsupported type.
|
|
2251
|
-
* @memberOf module:decorator-validation
|
|
2252
|
-
*/
|
|
2253
|
-
function isValidForGteOrLteComparison(a, b) {
|
|
2254
|
-
if (isSupported(a) && isSupported(b))
|
|
2255
|
-
return true;
|
|
2256
|
-
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
|
|
2257
|
-
}
|
|
2258
|
-
/**
|
|
2259
|
-
* @summary Compares two values to determine if the first is less than the second.
|
|
2260
|
-
* @description Supports numbers and dates. Throws an error for unsupported types.
|
|
2261
|
-
*
|
|
2262
|
-
* @param {any} a - The first value to compare.
|
|
2263
|
-
* @param {any} b - The second value to compare against.
|
|
2264
|
-
*
|
|
2265
|
-
* @returns {boolean} True if `a` is less than `b`, false otherwise.
|
|
2266
|
-
*
|
|
2267
|
-
* @throws {Error} If either `a` or `b` is `null` or `undefined`.
|
|
2268
|
-
* @throws {TypeError} If values are of mismatched or unsupported types.
|
|
2269
|
-
* @memberOf module:decorator-validation
|
|
2270
|
-
*/
|
|
2271
|
-
function isLessThan(a, b) {
|
|
2272
|
-
if ([null, undefined].includes(a) || [null, undefined].includes(b))
|
|
2273
|
-
throw new Error(COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
|
|
2274
|
-
// Validate type compatibility
|
|
2275
|
-
const aType = typeof a;
|
|
2276
|
-
const bType = typeof b;
|
|
2277
|
-
if (aType !== bType) {
|
|
2278
|
-
// Allow number X bigint
|
|
2279
|
-
if (aType === "bigint" && bType === "number")
|
|
2280
|
-
return Number(a) < b;
|
|
2281
|
-
if (aType === "number" && bType === "bigint")
|
|
2282
|
-
return a < Number(b);
|
|
2283
|
-
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
|
|
2284
|
-
}
|
|
2285
|
-
if ((aType === "number" && bType === "number") ||
|
|
2286
|
-
(aType === "bigint" && bType === "bigint")) {
|
|
2287
|
-
if (Number.isNaN(a) || Number.isNaN(b))
|
|
2288
|
-
throw new TypeError(COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
|
|
2289
|
-
return a < b;
|
|
2290
|
-
}
|
|
2291
|
-
if (a instanceof Date && b instanceof Date) {
|
|
2292
|
-
if (isNaN(a.getTime()) || isNaN(b.getTime()))
|
|
2293
|
-
throw new TypeError(COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
|
|
2294
|
-
return a.getTime() < b.getTime();
|
|
2295
|
-
}
|
|
2296
|
-
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
|
|
2297
|
-
}
|
|
2298
|
-
/**
|
|
2299
|
-
* Checks if `a` is greater than `b`.
|
|
2300
|
-
* Supports comparison for numbers and Date objects.
|
|
2301
|
-
*
|
|
2302
|
-
* @param {any} a - The value to validate.
|
|
2303
|
-
* @param {any} b - The value to compare against.
|
|
2304
|
-
*
|
|
2305
|
-
* @returns {boolean} True if `a` is greater than `b`, otherwise false.
|
|
2306
|
-
*
|
|
2307
|
-
* @throws {Error} If either `a` or `b` is `null` or `undefined`.
|
|
2308
|
-
* @throws {TypeError} If values are of mismatched or unsupported types.
|
|
2309
|
-
* @memberOf module:decorator-validation
|
|
2310
|
-
*/
|
|
2311
|
-
function isGreaterThan(a, b) {
|
|
2312
|
-
if ([null, undefined].includes(a) || [null, undefined].includes(b))
|
|
2313
|
-
throw new Error(COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
|
|
2314
|
-
const aType = typeof a;
|
|
2315
|
-
const bType = typeof b;
|
|
2316
|
-
if (aType !== bType) {
|
|
2317
|
-
// Allow number X bigint
|
|
2318
|
-
if (aType === "bigint" && bType === "number")
|
|
2319
|
-
return Number(a) > b;
|
|
2320
|
-
if (aType === "number" && bType === "bigint")
|
|
2321
|
-
return a > Number(b);
|
|
2322
|
-
throw new Error(sf(COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
|
|
2323
|
-
}
|
|
2324
|
-
if ((aType === "number" && bType === "number") ||
|
|
2325
|
-
(aType === "bigint" && bType === "bigint")) {
|
|
2326
|
-
if (Number.isNaN(a) || Number.isNaN(b))
|
|
2327
|
-
throw new TypeError(COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
|
|
2328
|
-
return a > b;
|
|
2329
|
-
}
|
|
2330
|
-
if (a instanceof Date && b instanceof Date) {
|
|
2331
|
-
if (isNaN(a.getTime()) || isNaN(b.getTime()))
|
|
2332
|
-
throw new TypeError(COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
|
|
2333
|
-
return a.getTime() > b.getTime();
|
|
2334
|
-
}
|
|
2335
|
-
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
|
|
2336
|
-
}
|
|
2337
|
-
|
|
2338
2252
|
/**
|
|
2339
2253
|
* @summary Diff Validator
|
|
2340
2254
|
*
|
|
@@ -2353,17 +2267,18 @@
|
|
|
2353
2267
|
* @summary Validates a model
|
|
2354
2268
|
*
|
|
2355
2269
|
* @param {string} value
|
|
2356
|
-
* @param {
|
|
2270
|
+
* @param {DiffValidatorOptions} options
|
|
2271
|
+
* @param {PathProxy<any>} accessor - Proxy-like object used to resolve values from nested structures via path strings.
|
|
2357
2272
|
*
|
|
2358
2273
|
* @return {string | undefined}
|
|
2359
2274
|
*
|
|
2360
2275
|
* @override
|
|
2361
2276
|
* @see Validator#hasErrors
|
|
2362
2277
|
*/
|
|
2363
|
-
hasErrors(value, options,
|
|
2278
|
+
hasErrors(value, options, accessor) {
|
|
2364
2279
|
let comparisonPropertyValue;
|
|
2365
2280
|
try {
|
|
2366
|
-
comparisonPropertyValue =
|
|
2281
|
+
comparisonPropertyValue = accessor.getValueFromPath(options[ValidationKeys.DIFF]);
|
|
2367
2282
|
}
|
|
2368
2283
|
catch (e) {
|
|
2369
2284
|
return this.getMessage(e.message || this.message);
|
|
@@ -2591,17 +2506,18 @@
|
|
|
2591
2506
|
* @summary Validates a model
|
|
2592
2507
|
*
|
|
2593
2508
|
* @param {string} value
|
|
2594
|
-
* @param {
|
|
2509
|
+
* @param {EqualsValidatorOptions} options
|
|
2510
|
+
* @param {PathProxy<any>} accessor - Proxy-like object used to resolve values from nested structures via path strings.
|
|
2595
2511
|
*
|
|
2596
2512
|
* @return {string | undefined}
|
|
2597
2513
|
*
|
|
2598
2514
|
* @override
|
|
2599
2515
|
* @see Validator#hasErrors
|
|
2600
2516
|
*/
|
|
2601
|
-
hasErrors(value, options,
|
|
2517
|
+
hasErrors(value, options, accessor) {
|
|
2602
2518
|
let comparisonPropertyValue;
|
|
2603
2519
|
try {
|
|
2604
|
-
comparisonPropertyValue =
|
|
2520
|
+
comparisonPropertyValue = accessor.getValueFromPath(options[ValidationKeys.EQUALS]);
|
|
2605
2521
|
}
|
|
2606
2522
|
catch (e) {
|
|
2607
2523
|
return this.getMessage(e.message || this.message);
|
|
@@ -2621,6 +2537,195 @@
|
|
|
2621
2537
|
// save: false,
|
|
2622
2538
|
// } as ValidatorDefinition);
|
|
2623
2539
|
|
|
2540
|
+
// /**
|
|
2541
|
+
// * Safely retrieves a nested property value from an object using a dot-notated path string.
|
|
2542
|
+
// *
|
|
2543
|
+
// * @template T - The expected return type of the property value.
|
|
2544
|
+
// *
|
|
2545
|
+
// * @param {Record<string, any>} obj - The source object to retrieve the value from.
|
|
2546
|
+
// * @param {string} path - A dot-separated string representing the path to the desired property (e.g., "user.address.street").
|
|
2547
|
+
// *
|
|
2548
|
+
// * @returns {T} - The value found at the specified path
|
|
2549
|
+
// *
|
|
2550
|
+
// * @throws {Error} - Throws an error if the path is not a non-empty string or if any part of the path does not exist in the object.
|
|
2551
|
+
// * @memberOf module:decorator-validation
|
|
2552
|
+
// */
|
|
2553
|
+
// export function getValueByPath<T>(obj: Record<string, any>, path: string): T {
|
|
2554
|
+
// if (typeof path !== "string" || !path.trim()) {
|
|
2555
|
+
// throw new Error(sf(COMPARISON_ERROR_MESSAGES.INVALID_PATH, path));
|
|
2556
|
+
// }
|
|
2557
|
+
//
|
|
2558
|
+
// // Process parent directory access (../)
|
|
2559
|
+
// const parentAccessors = path.match(/\.\.\//g) || [];
|
|
2560
|
+
// const parentLevel = parentAccessors.length;
|
|
2561
|
+
// const cleanPath = path.replace(/\.\.\//g, "");
|
|
2562
|
+
//
|
|
2563
|
+
// // Navigate up the parent chain
|
|
2564
|
+
// let currentContext: any = obj;
|
|
2565
|
+
// for (let i = 0; i < parentLevel; i++) {
|
|
2566
|
+
// if (!currentContext || typeof currentContext !== "object") {
|
|
2567
|
+
// throw new Error(
|
|
2568
|
+
// sf(COMPARISON_ERROR_MESSAGES.CONTEXT_NOT_OBJECT_COMPARISON, i + 1, path)
|
|
2569
|
+
// );
|
|
2570
|
+
// }
|
|
2571
|
+
//
|
|
2572
|
+
// if (!currentContext[VALIDATION_PARENT_KEY]) {
|
|
2573
|
+
// throw new Error(
|
|
2574
|
+
// sf(COMPARISON_ERROR_MESSAGES.NO_PARENT_COMPARISON, i + 1, path)
|
|
2575
|
+
// );
|
|
2576
|
+
// }
|
|
2577
|
+
//
|
|
2578
|
+
// currentContext = currentContext[VALIDATION_PARENT_KEY];
|
|
2579
|
+
// }
|
|
2580
|
+
//
|
|
2581
|
+
// // Process dot notation path
|
|
2582
|
+
// const parts = cleanPath.split(".");
|
|
2583
|
+
// let currentValue: any = currentContext;
|
|
2584
|
+
//
|
|
2585
|
+
// for (const part of parts) {
|
|
2586
|
+
// if (
|
|
2587
|
+
// currentValue !== null &&
|
|
2588
|
+
// typeof currentValue === "object" &&
|
|
2589
|
+
// part in currentValue
|
|
2590
|
+
// ) {
|
|
2591
|
+
// currentValue = (currentValue as Record<string, any>)[part];
|
|
2592
|
+
// } else {
|
|
2593
|
+
// const errorMsgTemplate =
|
|
2594
|
+
// parentLevel === 0
|
|
2595
|
+
// ? COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND
|
|
2596
|
+
// : parentLevel === 1
|
|
2597
|
+
// ? COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_ON_PARENT
|
|
2598
|
+
// : COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_AFTER_PARENT;
|
|
2599
|
+
//
|
|
2600
|
+
// throw new Error(sf(errorMsgTemplate, path, part, parentLevel));
|
|
2601
|
+
// }
|
|
2602
|
+
// }
|
|
2603
|
+
//
|
|
2604
|
+
// return currentValue as T;
|
|
2605
|
+
// }
|
|
2606
|
+
const getTypeName = (value) => {
|
|
2607
|
+
if (value === null)
|
|
2608
|
+
return "null";
|
|
2609
|
+
if (value instanceof Date)
|
|
2610
|
+
return "Date";
|
|
2611
|
+
if (Number.isNaN(value))
|
|
2612
|
+
return "NaN";
|
|
2613
|
+
if (value === Infinity)
|
|
2614
|
+
return "Infinity";
|
|
2615
|
+
if (value === -Infinity)
|
|
2616
|
+
return "-Infinity";
|
|
2617
|
+
if (Array.isArray(value))
|
|
2618
|
+
return "array";
|
|
2619
|
+
return typeof value;
|
|
2620
|
+
};
|
|
2621
|
+
const isSupported = (value) => {
|
|
2622
|
+
if (value === undefined || value instanceof Date)
|
|
2623
|
+
return true;
|
|
2624
|
+
if (typeof value === "bigint")
|
|
2625
|
+
return true;
|
|
2626
|
+
// Numbers must be finite (excludes NaN, Infinity, -Infinity)
|
|
2627
|
+
if (typeof value === "number")
|
|
2628
|
+
return Number.isFinite(value);
|
|
2629
|
+
return false;
|
|
2630
|
+
};
|
|
2631
|
+
/**
|
|
2632
|
+
* Validates whether two values are eligible for comparison using >= or <= operators.
|
|
2633
|
+
*
|
|
2634
|
+
* Supported types: `undefined`, `number`, `bigint`, and `Date`.
|
|
2635
|
+
*
|
|
2636
|
+
* @param a - The first value to compare.
|
|
2637
|
+
* @param b - The second value to compare.
|
|
2638
|
+
*
|
|
2639
|
+
* @returns {boolean} True if both values are of supported types.
|
|
2640
|
+
*
|
|
2641
|
+
* @throws {TypeError} If either value is of an unsupported type.
|
|
2642
|
+
* @memberOf module:decorator-validation
|
|
2643
|
+
*/
|
|
2644
|
+
function isValidForGteOrLteComparison(a, b) {
|
|
2645
|
+
if (isSupported(a) && isSupported(b))
|
|
2646
|
+
return true;
|
|
2647
|
+
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
|
|
2648
|
+
}
|
|
2649
|
+
/**
|
|
2650
|
+
* @summary Compares two values to determine if the first is less than the second.
|
|
2651
|
+
* @description Supports numbers and dates. Throws an error for unsupported types.
|
|
2652
|
+
*
|
|
2653
|
+
* @param {any} a - The first value to compare.
|
|
2654
|
+
* @param {any} b - The second value to compare against.
|
|
2655
|
+
*
|
|
2656
|
+
* @returns {boolean} True if `a` is less than `b`, false otherwise.
|
|
2657
|
+
*
|
|
2658
|
+
* @throws {Error} If either `a` or `b` is `null` or `undefined`.
|
|
2659
|
+
* @throws {TypeError} If values are of mismatched or unsupported types.
|
|
2660
|
+
* @memberOf module:decorator-validation
|
|
2661
|
+
*/
|
|
2662
|
+
function isLessThan(a, b) {
|
|
2663
|
+
if ([null, undefined].includes(a) || [null, undefined].includes(b))
|
|
2664
|
+
throw new Error(COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
|
|
2665
|
+
// Validate type compatibility
|
|
2666
|
+
const aType = typeof a;
|
|
2667
|
+
const bType = typeof b;
|
|
2668
|
+
if (aType !== bType) {
|
|
2669
|
+
// Allow number X bigint
|
|
2670
|
+
if (aType === "bigint" && bType === "number")
|
|
2671
|
+
return Number(a) < b;
|
|
2672
|
+
if (aType === "number" && bType === "bigint")
|
|
2673
|
+
return a < Number(b);
|
|
2674
|
+
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
|
|
2675
|
+
}
|
|
2676
|
+
if ((aType === "number" && bType === "number") ||
|
|
2677
|
+
(aType === "bigint" && bType === "bigint")) {
|
|
2678
|
+
if (Number.isNaN(a) || Number.isNaN(b))
|
|
2679
|
+
throw new TypeError(COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
|
|
2680
|
+
return a < b;
|
|
2681
|
+
}
|
|
2682
|
+
if (a instanceof Date && b instanceof Date) {
|
|
2683
|
+
if (isNaN(a.getTime()) || isNaN(b.getTime()))
|
|
2684
|
+
throw new TypeError(COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
|
|
2685
|
+
return a.getTime() < b.getTime();
|
|
2686
|
+
}
|
|
2687
|
+
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
|
|
2688
|
+
}
|
|
2689
|
+
/**
|
|
2690
|
+
* Checks if `a` is greater than `b`.
|
|
2691
|
+
* Supports comparison for numbers and Date objects.
|
|
2692
|
+
*
|
|
2693
|
+
* @param {any} a - The value to validate.
|
|
2694
|
+
* @param {any} b - The value to compare against.
|
|
2695
|
+
*
|
|
2696
|
+
* @returns {boolean} True if `a` is greater than `b`, otherwise false.
|
|
2697
|
+
*
|
|
2698
|
+
* @throws {Error} If either `a` or `b` is `null` or `undefined`.
|
|
2699
|
+
* @throws {TypeError} If values are of mismatched or unsupported types.
|
|
2700
|
+
* @memberOf module:decorator-validation
|
|
2701
|
+
*/
|
|
2702
|
+
function isGreaterThan(a, b) {
|
|
2703
|
+
if ([null, undefined].includes(a) || [null, undefined].includes(b))
|
|
2704
|
+
throw new Error(COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
|
|
2705
|
+
const aType = typeof a;
|
|
2706
|
+
const bType = typeof b;
|
|
2707
|
+
if (aType !== bType) {
|
|
2708
|
+
// Allow number X bigint
|
|
2709
|
+
if (aType === "bigint" && bType === "number")
|
|
2710
|
+
return Number(a) > b;
|
|
2711
|
+
if (aType === "number" && bType === "bigint")
|
|
2712
|
+
return a > Number(b);
|
|
2713
|
+
throw new Error(sf(COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
|
|
2714
|
+
}
|
|
2715
|
+
if ((aType === "number" && bType === "number") ||
|
|
2716
|
+
(aType === "bigint" && bType === "bigint")) {
|
|
2717
|
+
if (Number.isNaN(a) || Number.isNaN(b))
|
|
2718
|
+
throw new TypeError(COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
|
|
2719
|
+
return a > b;
|
|
2720
|
+
}
|
|
2721
|
+
if (a instanceof Date && b instanceof Date) {
|
|
2722
|
+
if (isNaN(a.getTime()) || isNaN(b.getTime()))
|
|
2723
|
+
throw new TypeError(COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
|
|
2724
|
+
return a.getTime() > b.getTime();
|
|
2725
|
+
}
|
|
2726
|
+
throw new TypeError(sf(COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
|
|
2727
|
+
}
|
|
2728
|
+
|
|
2624
2729
|
/**
|
|
2625
2730
|
* @summary Greater Than Validator
|
|
2626
2731
|
*
|
|
@@ -2639,17 +2744,18 @@
|
|
|
2639
2744
|
* @summary Validates a model
|
|
2640
2745
|
*
|
|
2641
2746
|
* @param {string} value
|
|
2642
|
-
* @param {
|
|
2747
|
+
* @param {GreaterThanValidatorOptions} options
|
|
2748
|
+
* @param {PathProxy<any>} accessor - Proxy-like object used to resolve values from nested structures via path strings.
|
|
2643
2749
|
*
|
|
2644
2750
|
* @return {string | undefined}
|
|
2645
2751
|
*
|
|
2646
2752
|
* @override
|
|
2647
2753
|
* @see Validator#hasErrors
|
|
2648
2754
|
*/
|
|
2649
|
-
hasErrors(value, options,
|
|
2755
|
+
hasErrors(value, options, accessor) {
|
|
2650
2756
|
let comparisonPropertyValue;
|
|
2651
2757
|
try {
|
|
2652
|
-
comparisonPropertyValue =
|
|
2758
|
+
comparisonPropertyValue = accessor.getValueFromPath(options[ValidationKeys.GREATER_THAN]);
|
|
2653
2759
|
}
|
|
2654
2760
|
catch (e) {
|
|
2655
2761
|
return this.getMessage(e.message || this.message);
|
|
@@ -2687,17 +2793,18 @@
|
|
|
2687
2793
|
* @summary Validates a model
|
|
2688
2794
|
*
|
|
2689
2795
|
* @param {string} value
|
|
2690
|
-
* @param {
|
|
2796
|
+
* @param {GreaterThanOrEqualValidatorOptions} options
|
|
2797
|
+
* @param {PathProxy<any>} accessor - Proxy-like object used to resolve values from nested structures via path strings.
|
|
2691
2798
|
*
|
|
2692
2799
|
* @return {string | undefined}
|
|
2693
2800
|
*
|
|
2694
2801
|
* @override
|
|
2695
2802
|
* @see Validator#hasErrors
|
|
2696
2803
|
*/
|
|
2697
|
-
hasErrors(value, options,
|
|
2804
|
+
hasErrors(value, options, accessor) {
|
|
2698
2805
|
let comparisonPropertyValue;
|
|
2699
2806
|
try {
|
|
2700
|
-
comparisonPropertyValue =
|
|
2807
|
+
comparisonPropertyValue = accessor.getValueFromPath(options[ValidationKeys.GREATER_THAN_OR_EQUAL]);
|
|
2701
2808
|
}
|
|
2702
2809
|
catch (e) {
|
|
2703
2810
|
return this.getMessage(e.message || this.message);
|
|
@@ -2737,17 +2844,18 @@
|
|
|
2737
2844
|
* @summary Validates a model
|
|
2738
2845
|
*
|
|
2739
2846
|
* @param {string} value
|
|
2740
|
-
* @param {
|
|
2847
|
+
* @param {LessThanValidatorOptions} options
|
|
2848
|
+
* @param {PathProxy<any>} accessor - Proxy-like object used to resolve values from nested structures via path strings.
|
|
2741
2849
|
*
|
|
2742
2850
|
* @return {string | undefined}
|
|
2743
2851
|
*
|
|
2744
2852
|
* @override
|
|
2745
2853
|
* @see Validator#hasErrors
|
|
2746
2854
|
*/
|
|
2747
|
-
hasErrors(value, options,
|
|
2855
|
+
hasErrors(value, options, accessor) {
|
|
2748
2856
|
let comparisonPropertyValue;
|
|
2749
2857
|
try {
|
|
2750
|
-
comparisonPropertyValue =
|
|
2858
|
+
comparisonPropertyValue = accessor.getValueFromPath(options[ValidationKeys.LESS_THAN]);
|
|
2751
2859
|
}
|
|
2752
2860
|
catch (e) {
|
|
2753
2861
|
return this.getMessage(e.message || this.message);
|
|
@@ -2785,17 +2893,18 @@
|
|
|
2785
2893
|
* @summary Validates a model
|
|
2786
2894
|
*
|
|
2787
2895
|
* @param {string} value
|
|
2788
|
-
* @param {
|
|
2896
|
+
* @param {LessThanOrEqualValidatorOptions} options
|
|
2897
|
+
* @param {PathProxy<any>} accessor - Proxy-like object used to resolve values from nested structures via path strings.
|
|
2789
2898
|
*
|
|
2790
2899
|
* @return {string | undefined}
|
|
2791
2900
|
*
|
|
2792
2901
|
* @override
|
|
2793
2902
|
* @see Validator#hasErrors
|
|
2794
2903
|
*/
|
|
2795
|
-
hasErrors(value, options,
|
|
2904
|
+
hasErrors(value, options, accessor) {
|
|
2796
2905
|
let comparisonPropertyValue;
|
|
2797
2906
|
try {
|
|
2798
|
-
comparisonPropertyValue =
|
|
2907
|
+
comparisonPropertyValue = accessor.getValueFromPath(options[ValidationKeys.LESS_THAN_OR_EQUAL]);
|
|
2799
2908
|
}
|
|
2800
2909
|
catch (e) {
|
|
2801
2910
|
return this.getMessage(e.message || this.message);
|
|
@@ -4129,7 +4238,7 @@
|
|
|
4129
4238
|
* @const VERSION
|
|
4130
4239
|
* @memberOf module:decorator-validation
|
|
4131
4240
|
*/
|
|
4132
|
-
const VERSION = "1.7.
|
|
4241
|
+
const VERSION = "1.7.4";
|
|
4133
4242
|
|
|
4134
4243
|
exports.COMPARISON_ERROR_MESSAGES = COMPARISON_ERROR_MESSAGES;
|
|
4135
4244
|
exports.ComparisonValidationKeys = ComparisonValidationKeys;
|
|
@@ -4146,6 +4255,7 @@
|
|
|
4146
4255
|
exports.Model = Model;
|
|
4147
4256
|
exports.ModelErrorDefinition = ModelErrorDefinition;
|
|
4148
4257
|
exports.ModelRegistryManager = ModelRegistryManager;
|
|
4258
|
+
exports.PathProxyEngine = PathProxyEngine;
|
|
4149
4259
|
exports.Serialization = Serialization;
|
|
4150
4260
|
exports.VALIDATION_PARENT_KEY = VALIDATION_PARENT_KEY;
|
|
4151
4261
|
exports.VERSION = VERSION;
|
|
@@ -4166,7 +4276,6 @@
|
|
|
4166
4276
|
exports.formatDate = formatDate;
|
|
4167
4277
|
exports.getMetadata = getMetadata;
|
|
4168
4278
|
exports.getModelKey = getModelKey;
|
|
4169
|
-
exports.getValueByPath = getValueByPath;
|
|
4170
4279
|
exports.gt = gt;
|
|
4171
4280
|
exports.gte = gte;
|
|
4172
4281
|
exports.hashCode = hashCode;
|
|
@@ -4204,4 +4313,4 @@
|
|
|
4204
4313
|
exports.validator = validator;
|
|
4205
4314
|
|
|
4206
4315
|
}));
|
|
4207
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvc3RyaW5ncy50cyIsIi4uL3NyYy91dGlscy9kYXRlcy50cyIsIi4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIiwiLi4vc3JjL3V0aWxzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdXRpbHMvaGFzaGluZy50cyIsIi4uL3NyYy9tb2RlbC9Nb2RlbEVycm9yRGVmaW5pdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1ZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnkudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvdXRpbHMvc2VyaWFsaXphdGlvbi50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRGF0ZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvdXRpbHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0RpZmZWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1BhdHRlcm5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0VtYWlsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9FcXVhbHNWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0dyZWF0ZXJUaGFuVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9HcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xlc3NUaGFuVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9MZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xpc3RWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01heExlbmd0aFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWF4VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5MZW5ndGhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01pblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGFzc3dvcmRWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1JlcXVpcmVkVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9TdGVwVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9UeXBlVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9VUkxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFN5bWJvbCBrZXkgZm9yIHRyYWNraW5nIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGluIHZhbGlkYXRpb25cbiAqIEBzdW1tYXJ5IFN5bWJvbCB1c2VkIHRvIGludGVybmFsbHkgdHJhY2sgdGhlIHBhcmVudCBvYmplY3QgZHVyaW5nIG5lc3RlZCB2YWxpZGF0aW9uXG4gKlxuICogQGNvbnN0IFZBTElEQVRJT05fUEFSRU5UX0tFWVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkFMSURBVElPTl9QQVJFTlRfS0VZID0gU3ltYm9sKFwiX3BhcmVudFwiKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gY29udGFpbmluZyBtZXRhZGF0YSBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb24gaW4gdGhlIG1vZGVsIHN5c3RlbVxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdmFyaW91cyBNb2RlbCBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb24gYW5kIG1ldGFkYXRhIHN0b3JhZ2UuXG4gKiBUaGVzZSBrZXlzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IG1vZGVscyxcbiAqIHRoZWlyIHByb3BlcnRpZXMsIGFuZCB0aGVpciBiZWhhdmlvci5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIFByZWZpeCB0byBhbGwgb3RoZXIga2V5cywgdXNlZCBhcyBhIG5hbWVzcGFjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHN0b3JpbmcgZGVzaWduIHR5cGUgaW5mb3JtYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVJBTVMgLSBLZXkgZm9yIHN0b3JpbmcgbWV0aG9kIHBhcmFtZXRlciB0eXBlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFVFVSTiAtIEtleSBmb3Igc3RvcmluZyBtZXRob2QgcmV0dXJuIHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT0RFTCAtIEtleSBmb3IgaWRlbnRpZnlpbmcgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBTkNIT1IgLSBBbmNob3Iga2V5IHRoYXQgc2VydmVzIGFzIGEgZ2hvc3QgcHJvcGVydHkgaW4gdGhlIG1vZGVsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09OU1RSVUNUSU9OIC0gS2V5IGZvciBzdG9yaW5nIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFUVFJJQlVURSAtIEtleSBmb3Igc3RvcmluZyBhdHRyaWJ1dGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIQVNISU5HIC0gS2V5IGZvciBzdG9yaW5nIGhhc2hpbmcgY29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUklBTElaQVRJT04gLSBLZXkgZm9yIHN0b3Jpbmcgc2VyaWFsaXphdGlvbiBjb25maWd1cmF0aW9uXG4gKlxuICogQHJlYWRvbmx5XG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsS2V5cyB7XG4gIFJFRkxFQ1QgPSBcImRlY2FmLm1vZGVsLlwiLFxuICBUWVBFID0gXCJkZXNpZ246dHlwZVwiLFxuICBQQVJBTVMgPSBcImRlc2lnbjpwYXJhbXR5cGVzXCIsXG4gIFJFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbiAgTU9ERUwgPSBcIm1vZGVsXCIsXG4gIEFOQ0hPUiA9IFwiX19tb2RlbFwiLFxuICBDT05TVFJVQ1RJT04gPSBcImNvbnN0cnVjdGVkLWJ5XCIsXG4gIEFUVFJJQlVURSA9IFwiX19hdHRyaWJ1dGVzXCIsXG4gIEhBU0hJTkcgPSBcImhhc2hpbmdcIixcbiAgU0VSSUFMSVpBVElPTiA9IFwic2VyaWFsaXphdGlvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZsYXZvdXIgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvciBzeXN0ZW1cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgZmxhdm91ciB1c2VkIGJ5IHRoZSBEZWNvcmF0aW9uIGNsYXNzIHdoZW4gbm8gc3BlY2lmaWMgZmxhdm91ciBpcyBwcm92aWRlZC5cbiAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IGFzIHRoZSBmYWxsYmFjayBmbGF2b3VyIGZvciBkZWNvcmF0b3JzLlxuICpcbiAqIEBjb25zdCB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Rmxhdm91ciA9IFwiZGVjYWZcIjtcbiIsImltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBLZXlzIHVzZWQgZm9yIGNvbXBhcmlzb24tYmFzZWQgdmFsaWRhdGlvbnMuXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVRVUFMUyAtIFZhbGlkYXRlcyBpZiB0d28gdmFsdWVzIGFyZSBlcXVhbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGIC0gVmFsaWRhdGVzIGlmIHR3byB2YWx1ZXMgYXJlIGRpZmZlcmVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMRVNTX1RIQU4gLSBWYWxpZGF0ZXMgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gYW5vdGhlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMRVNTX1RIQU5fT1JfRVFVQUwgLSBWYWxpZGF0ZXMgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYW5vdGhlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU4gLSBWYWxpZGF0ZXMgaWYgYSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gYW5vdGhlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgLSBWYWxpZGF0ZXMgaWYgYSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYW5vdGhlci5cbiAqXG4gKiBAY29uc3RhbnQgQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBDb21wYXJpc29uVmFsaWRhdGlvbktleXMgPSB7XG4gIEVRVUFMUzogXCJlcXVhbHNcIixcbiAgRElGRjogXCJkaWZmZXJlbnRcIixcbiAgTEVTU19USEFOOiBcImxlc3NUaGFuXCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTDogXCJsZXNzVGhhbk9yRXF1YWxcIixcbiAgR1JFQVRFUl9USEFOOiBcImdyZWF0ZXJUaGFuXCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogXCJncmVhdGVyVGhhbk9yRXF1YWxcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIGtleXMgdXNlZCBmb3IgdmFsaWRhdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIHByZWZpeGVzIG90aGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIHNldHMgYXMgcmVxdWlyZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmaW5lcyBtaW4gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVggZGVmaW5lcyBtYXggdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIGRlZmluZXMgc3RlcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmaW5lcyBtaW4gbGVuZ3RoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZpbmVzIG1heCBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmluZXMgcGF0dGVyblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmluZXMgZW1haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgZGVmaW5lcyB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIGRlZmluZXMgZGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgZGVmaW5lcyB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgZGVmaW5lcyBwYXNzd29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmaW5lcyBsaXN0XG4gKlxuICogQGNvbnN0YW50IFZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9dmFsaWRhdGlvbi5gLFxuICBWQUxJREFUT1I6IFwidmFsaWRhdG9yXCIsXG4gIFJFUVVJUkVEOiBcInJlcXVpcmVkXCIsXG4gIE1JTjogXCJtaW5cIixcbiAgTUFYOiBcIm1heFwiLFxuICBTVEVQOiBcInN0ZXBcIixcbiAgTUlOX0xFTkdUSDogXCJtaW5sZW5ndGhcIixcbiAgTUFYX0xFTkdUSDogXCJtYXhsZW5ndGhcIixcbiAgUEFUVEVSTjogXCJwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcImVtYWlsXCIsXG4gIFVSTDogXCJ1cmxcIixcbiAgREFURTogXCJkYXRlXCIsXG4gIFRZUEU6IFwidHlwZVwiLFxuICBQQVNTV09SRDogXCJwYXNzd29yZFwiLFxuICBMSVNUOiBcImxpc3RcIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxuICAuLi5Db21wYXJpc29uVmFsaWRhdGlvbktleXMsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBzdW1tYXJ5IGxpc3Qgb2YgbW9udGggbmFtZXNcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgbW9udGggbmFtZXMuIENhbiBiZSBjaGFuZ2VkIGZvciBsb2NhbGl6YXRpb24gcHVycG9zZXNcbiAqXG4gKiBAY29uc3RhbnQgTU9OVEhfTkFNRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTlRIX05BTUVTID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG4vKipcbiAqIEBzdW1tYXJ5IGxpc3Qgb2YgbmFtZXMgb2YgZGF5cyBvZiB0aGUgd2Vla1xuICogQGRlc2NyaXB0aW9uIFN0b3JlcyBuYW1lcyBmb3IgZGF5cyBvZiB0aGUgd2Vlay4gQ2FuIGJlIGNoYW5nZWQgZm9yIGxvY2FsaXphdGlvbiBwdXJwb3Nlc1xuICpcbiAqIEBjb25zdGFudCBEQVlTX09GX1dFRUtfTkFNRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERBWVNfT0ZfV0VFS19OQU1FUyA9IFtcbiAgXCJTdW5kYXlcIixcbiAgXCJNb25kYXlcIixcbiAgXCJUdWVzZGF5XCIsXG4gIFwiV2VkbmVzZGF5XCIsXG4gIFwiVGh1cnNkYXlcIixcbiAgXCJGcmlkYXlcIixcbiAgXCJTYXR1cmRheVwiLFxuXTtcblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTiBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOX0xFTkdUSCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVhfTEVOR1RIIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBVFRFUk4gZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRU1BSUwgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1RFUCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERFRkFVTFQgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElTVCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMSVNUX0lOU0lERSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT0RFTF9OT1RfRk9VTkQgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNvbnN0YW50IERFRkFVTFRfRVJST1JfTUVTU0FHRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIFJFUVVJUkVEOiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbiAgTUlOOiBcIlRoZSBtaW5pbXVtIHZhbHVlIGlzIHswfVwiLFxuICBNQVg6IFwiVGhlIG1heGltdW0gdmFsdWUgaXMgezB9XCIsXG4gIE1JTl9MRU5HVEg6IFwiVGhlIG1pbmltdW0gbGVuZ3RoIGlzIHswfVwiLFxuICBNQVhfTEVOR1RIOiBcIlRoZSBtYXhpbXVtIGxlbmd0aCBpcyB7MH1cIixcbiAgUEFUVEVSTjogXCJUaGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm5cIixcbiAgRU1BSUw6IFwiVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIGVtYWlsXCIsXG4gIFVSTDogXCJUaGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgVVJMXCIsXG4gIFRZUEU6IFwiSW52YWxpZCB0eXBlLiBFeHBlY3RlZCB7MH0sIHJlY2VpdmVkIHsxfVwiLFxuICBTVEVQOiBcIkludmFsaWQgdmFsdWUuIE5vdCBhIHN0ZXAgb2YgezB9XCIsXG4gIERBVEU6IFwiSW52YWxpZCB2YWx1ZS4gbm90IGEgdmFsaWQgRGF0ZVwiLFxuICBERUZBVUxUOiBcIlRoZXJlIGlzIGFuIEVycm9yXCIsXG4gIFBBU1NXT1JEOlxuICAgIFwiTXVzdCBiZSBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgYW5kIGNvbnRhaW4gb25lIG9mIG51bWJlciwgbG93ZXIgYW5kIHVwcGVyIGNhc2UgbGV0dGVycywgYW5kIHNwZWNpYWwgY2hhcmFjdGVyIChAJCElKj8mXy0uLClcIixcbiAgTElTVDogXCJJbnZhbGlkIGxpc3Qgb2YgezB9XCIsXG4gIE1PREVMX05PVF9GT1VORDogXCJObyBtb2RlbCByZWdpc3RlcmVkIHVuZGVyIHswfVwiLFxuICBFUVVBTFM6IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGVxdWFsIHRvIGZpZWxkIHswfVwiLFxuICBESUZGOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBmaWVsZCB7MH1cIixcbiAgTEVTU19USEFOOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBsZXNzIHRoYW4gZmllbGQgezB9XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTDogXCJUaGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGZpZWxkIHswfVwiLFxuICBHUkVBVEVSX1RIQU46IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaWVsZCB7MH1cIixcbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMOlxuICAgIFwiVGhpcyBmaWVsZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBmaWVsZCB7MH1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTID0ge1xuICBJTlZBTElEX1BBVEg6XG4gICAgXCJJbnZhbGlkIHBhdGggYXJndW1lbnQuIEV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcgYnV0IHJlY2VpdmVkOiAnezB9J1wiLFxuICBDT05URVhUX05PVF9PQkpFQ1RfQ09NUEFSSVNPTjpcbiAgICBcIlVuYWJsZSB0byBhY2Nlc3MgcGFyZW50IGF0IGxldmVsIHswfSBmb3IgcGF0aCAnezF9JzogY3VycmVudCBjb250ZXh0IGlzIG5vdCBhbiBvYmplY3RcIixcbiAgTk9fUEFSRU5UX0NPTVBBUklTT046XG4gICAgXCJVbmFibGUgdG8gYWNjZXNzIHBhcmVudCBhdCBsZXZlbCB7MH0gZm9yIHBhdGggJ3sxfSc6IG5vIHBhcmVudCBhdmFpbGFibGVcIixcbiAgUFJPUEVSVFlfTk9UX0ZPVU5EOlxuICAgIFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0LlwiLFxuICBQUk9QRVJUWV9OT1RfRk9VTkRfT05fUEFSRU5UOlxuICAgIFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0IG9uIHBhcmVudC5cIixcbiAgUFJPUEVSVFlfTk9UX0ZPVU5EX0FGVEVSX1BBUkVOVDpcbiAgICBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggezB9OiBwcm9wZXJ0eSAnezF9JyBkb2VzIG5vdCBleGlzdCBhZnRlciB7Mn0gcGFyZW50IGxldmVsKHMpLlwiLFxuICBVTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OOlxuICAgIFwiVW5zdXBwb3J0ZWQgdHlwZXMgZm9yIGNvbXBhcmlzb246ICd7MH0nIGFuZCAnezF9J1wiLFxuICBOVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OOlxuICAgIFwiQ29tcGFyaXNvbiBmYWlsZWQgZHVlIHRvIG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlXCIsXG4gIElOVkFMSURfREFURV9DT01QQVJJU09OOiBcIkludmFsaWQgRGF0ZSBvYmplY3RzIGFyZSBub3QgY29tcGFyYWJsZVwiLFxuICBUWVBFX01JU01BVENIX0NPTVBBUklTT046XG4gICAgXCJDYW5ub3QgY29tcGFyZSB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzOiB7MH0gYW5kIHsxfS5cIixcbiAgTkFOX0NPTVBBUklTT046IFwiQ29tcGFyaXNvbiBub3Qgc3VwcG9ydGVkIGZvciBOYU4gdmFsdWVzXCIsXG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgZGVmYXVsdCByZWdleHAgcGF0dGVybnMgdXNlZFxuICpcbiAqIEBlbnVtIERFRkFVTFRfUEFUVEVSTlNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFUVEVSTlMgPSB7XG4gIEVNQUlMOlxuICAgIC9bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqQCg/OlthLXpBLVowLTldKD86W2EtejAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVowLTldKD86W2EtekEtWjAtOS1dKlthLXpBLVowLTldKT8vLFxuICBVUkw6IC9eKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXowLTlcXHUwMGExLVxcdWZmZmZdW2EtejAtOVxcdTAwYTEtXFx1ZmZmZl8tXXswLDYyfSk/W2EtejAtOVxcdTAwYTEtXFx1ZmZmZl1cXC4pKyg/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfVxcLj8pKSg/OjpcXGR7Miw1fSk/KD86Wy8/I11cXFMqKT8kL2ksXG4gIFBBU1NXT1JEOiB7XG4gICAgQ0hBUjhfT05FX09GX0VBQ0g6XG4gICAgICAvXig/PS4qW2Etel0pKD89LipbQS1aXSkoPz0uKlxcZCkoPz0uKltAJCElKj8mX1xcLS4sXSlbQS1aYS16XFxkQCQhJSo/Jl9cXC0uLF17OCx9JC9nLFxuICB9LFxufTtcbiIsIi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gW2FyZ3NdIHJlcGxhY2VtZW50cyBtYWRlIGJ5IG9yZGVyIG9mIGFwcGVhcmFuY2UgKHJlcGxhY2VtZW50MCB3aWwgcmVwbGFjZSB7MH0gYW5kIHNvIG9uKVxuICogQHJldHVybiB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGb3JtYXQoc3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IGFyZ3NbbnVtYmVyXS50b1N0cmluZygpXG4gICAgICA6IFwidW5kZWZpbmVkXCI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqIEBkZXNjcmlwdGlvbiBhbGlhcyBmb3Ige0BsaW5rIHN0cmluZ0Zvcm1hdH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBzZiA9IHN0cmluZ0Zvcm1hdDtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIERBWVNfT0ZfV0VFS19OQU1FUyxcbiAgTU9OVEhfTkFNRVMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuL3N0cmluZ3NcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXZlcnNlcyB0aGUgcHJvY2VzcyBmcm9tIHtAbGluayBmb3JtYXREYXRlfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlIHRoZSBkYXRlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgYmFjayBpbnRvIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGRhdGUgZm9ybWF0XG4gKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZSBmcm9tIHRoZSBmb3JtYXQgb3IgdGhlIHN0YW5kYXJkIG5ldyBEYXRlKHtAcHJvcCBkYXRlfSkgaWYgdGhlIHN0cmluZyBjb3VsZG4ndCBiZSBwYXJzZWQgKGFyZSB5b3Ugc3VyZSB0aGUgZm9ybWF0IG1hdGNoZXMgdGhlIHN0cmluZz8pXG4gKlxuICogQGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0KGRhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpIHtcbiAgbGV0IGZvcm1hdFJlZ2V4cDogc3RyaW5nID0gZm9ybWF0O1xuXG4gIC8vIEhvdXJcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaGgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImhoXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSEgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkhIXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gTWludXRlc1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tbS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwibW1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtXCIsIFwiKD88bWludXRlcz5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBTZWNvbmRzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3NzLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJzc1wiLCBcIig/PHNlY29uZHM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNcIiwgXCIoPzxzZWNvbmRzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIERheVxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9kZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZGRcIiwgXCIoPzxkYXk+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2QvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImRcIiwgXCIoPzxkYXk+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5IE9mIFdlZWtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFRVwiLCBcIig/PGRheW9md2Vlaz5cXFxcdyspXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1lbHNlLWlmXG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG5cbiAgLy8gWWVhclxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eXl5LykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJ5eXl5XCIsIFwiKD88eWVhcj5cXFxcZHs0fSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgveXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5XCIsIFwiKD88eWVhcj5cXFxcZHsyfSlcIik7XG5cbiAgLy8gTW9udGhcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NTVwiLCBcIig/PG1vbnRobmFtZT5cXFxcdyspXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NXCIsIFwiKD88bW9udGhuYW1lc21hbGw+XFxcXHcrKVwiKTtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NXCIsIFwiKD88bW9udGg+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL00vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1cIiwgXCIoPzxtb250aD5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaWxpcyBhbmQgQW0gUG1cbiAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwXG4gICAgLnJlcGxhY2UoXCJTXCIsIFwiKD88bWlsaXM+XFxcXGR7MSwzfSlcIilcbiAgICAucmVwbGFjZShcImFhYVwiLCBcIig/PGFtcG0+XFxcXHd7Mn0pXCIpO1xuXG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZm9ybWF0UmVnZXhwLCBcImdcIik7XG5cbiAgY29uc3QgbWF0Y2g6IHtcbiAgICBncm91cHM6IHtcbiAgICAgIHllYXI/OiBzdHJpbmc7XG4gICAgICBkYXk/OiBzdHJpbmc7XG4gICAgICBhbXBtPzogc3RyaW5nO1xuICAgICAgaG91cj86IHN0cmluZztcbiAgICAgIG1pbnV0ZXM/OiBzdHJpbmc7XG4gICAgICBzZWNvbmRzPzogc3RyaW5nO1xuICAgICAgbWlsaXM/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWU/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWVzbWFsbD86IHN0cmluZztcbiAgICAgIG1vbnRoPzogc3RyaW5nO1xuICAgIH07XG4gIH0gPSByZWdleHAuZXhlYyhkYXRlKSBhcyBhbnk7XG5cbiAgaWYgKCFtYXRjaCB8fCAhbWF0Y2guZ3JvdXBzKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG5cbiAgY29uc3Qgc2FmZVBhcnNlSW50ID0gZnVuY3Rpb24gKG4/OiBzdHJpbmcpIHtcbiAgICBpZiAoIW4pIHJldHVybiAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KG4pO1xuXG4gICAgcmV0dXJuIGlzTmFOKHJlc3VsdCkgPyAwIDogcmVzdWx0O1xuICB9O1xuXG4gIGNvbnN0IHllYXIgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnllYXIpO1xuICBjb25zdCBkYXkgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLmRheSk7XG5cbiAgY29uc3QgYW1QbSA9IG1hdGNoLmdyb3Vwcy5hbXBtO1xuICBsZXQgaG91ciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuaG91cik7XG5cbiAgaWYgKGFtUG0pIGhvdXIgPSBhbVBtID09PSBcIlBNXCIgPyBob3VyICsgMTIgOiBob3VyO1xuXG4gIGNvbnN0IG1pbnV0ZXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbnV0ZXMpO1xuICBjb25zdCBzZWNvbmRzID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5zZWNvbmRzKTtcbiAgY29uc3QgbXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbGlzKTtcblxuICBjb25zdCBtb250aE5hbWUgPSBtYXRjaC5ncm91cHMubW9udGhuYW1lO1xuICBjb25zdCBtb250aE5hbWVTbWFsbCA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWVzbWFsbDtcbiAgbGV0IG1vbnRoOiBudW1iZXIgfCBzdHJpbmcgPSBtYXRjaC5ncm91cHMubW9udGggYXMgc3RyaW5nO1xuICBpZiAobW9udGhOYW1lKSBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobW9udGhOYW1lKTtcbiAgZWxzZSBpZiAobW9udGhOYW1lU21hbGwpIHtcbiAgICBjb25zdCBtID0gTU9OVEhfTkFNRVMuZmluZCgobSkgPT5cbiAgICAgIG0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1vbnRoTmFtZVNtYWxsLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgICBpZiAoIW0pIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgICBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobSk7XG4gIH0gZWxzZSBtb250aCA9IHNhZmVQYXJzZUludChgJHttb250aH1gKTtcblxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMsIG1zKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmluZHMgYSBzcGVjaWZpYyBkYXRlIGZvcm1hdCB0byBhIERhdGUgb2JqZWN0J3MgdG9TdHJpbmcgYW5kIHRvSVNPU3RyaW5nIG1ldGhvZHNcbiAqIEBzdW1tYXJ5IE1vZGlmaWVzIGEgRGF0ZSBvYmplY3QgdG8gcmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyB3aGVuIHRvU3RyaW5nIG9yIHRvSVNPU3RyaW5nIGlzIGNhbGxlZC5cbiAqIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHRvU3RyaW5nIGFuZCB0b0lTT1N0cmluZyBtZXRob2RzIG9mIHRoZSBEYXRlIG9iamVjdCB0byByZXR1cm5cbiAqIHRoZSBkYXRlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICogQHBhcmFtIHtEYXRlfSBbZGF0ZV0gVGhlIERhdGUgb2JqZWN0IHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZSBmb3IgZm9ybWF0dGluZyB0aGUgZGF0ZVxuICogQHJldHVybiB7RGF0ZXx1bmRlZmluZWR9IFRoZSBtb2RpZmllZCBEYXRlIG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZGF0ZSB3YXMgcHJvdmlkZWRcbiAqIEBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmREYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgaWYgKCFkYXRlKSByZXR1cm47XG4gIGNvbnN0IGZ1bmMgPSAoKSA9PiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvSVNPU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsIFwidG9TdHJpbmdcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmMsXG4gIH0pO1xuICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZGF0ZSwgRGF0ZS5wcm90b3R5cGUpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2FmZWx5IGNoZWNrcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAqIEBzdW1tYXJ5IEEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdXNpbmcgaW5zdGFuY2VvZiBEYXRlIGFzIGl0IGFsc28gY2hlY2tzXG4gKiB0aGF0IHRoZSBkYXRlIGlzIG5vdCBOYU4sIHdoaWNoIGNhbiBoYXBwZW4gd2l0aCBpbnZhbGlkIGRhdGUgc3RyaW5ncy5cbiAqIEBwYXJhbSB7YW55fSBkYXRlIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKiBAZnVuY3Rpb24gaXNWYWxpZERhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBkYXRlICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGUpID09PSBcIltvYmplY3QgRGF0ZV1cIiAmJlxuICAgICFOdW1iZXIuaXNOYU4oZGF0ZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHBhZCBudW1iZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICpcbiAqIEBmdW5jdGlvbiB0d29EaWdpdFBhZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d29EaWdpdFBhZChudW06IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBudW0gPCAxMCA/IFwiMFwiICsgbnVtIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBGb3JtYXQgSGFuZGxpbmdcbiAqIEBkZXNjcmlwdGlvbiBDb2RlIGZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NTI0NjEvaG93LXRvLWZvcm1hdC1hLWphdmFzY3JpcHQtZGF0ZX1cbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5TdHJdIGRlZmF1bHRzIHRvICd5eXl5L01NL2RkJ1xuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZm9ybWF0RGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGU6IERhdGUsIHBhdHRlcm5TdHI6IHN0cmluZyA9IFwieXl5eS9NTS9kZFwiKSB7XG4gIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCksXG4gICAgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSxcbiAgICB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgaG91cjogbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpLFxuICAgIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgc2Vjb25kOiBudW1iZXIgPSBkYXRlLmdldFNlY29uZHMoKSxcbiAgICBtaWxpc2Vjb25kczogbnVtYmVyID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICBoOiBudW1iZXIgPSBob3VyICUgMTIsXG4gICAgaGg6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGgpLFxuICAgIEhIOiBzdHJpbmcgPSB0d29EaWdpdFBhZChob3VyKSxcbiAgICBtbTogc3RyaW5nID0gdHdvRGlnaXRQYWQobWludXRlKSxcbiAgICBzczogc3RyaW5nID0gdHdvRGlnaXRQYWQoc2Vjb25kKSxcbiAgICBhYWE6IHN0cmluZyA9IGhvdXIgPCAxMiA/IFwiQU1cIiA6IFwiUE1cIixcbiAgICBFRUVFOiBzdHJpbmcgPSBEQVlTX09GX1dFRUtfTkFNRVNbZGF0ZS5nZXREYXkoKV0sXG4gICAgRUVFOiBzdHJpbmcgPSBFRUVFLnN1YnN0cigwLCAzKSxcbiAgICBkZDogc3RyaW5nID0gdHdvRGlnaXRQYWQoZGF5KSxcbiAgICBNOiBudW1iZXIgPSBtb250aCArIDEsXG4gICAgTU06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKE0pLFxuICAgIE1NTU06IHN0cmluZyA9IE1PTlRIX05BTUVTW21vbnRoXSxcbiAgICBNTU06IHN0cmluZyA9IE1NTU0uc3Vic3RyKDAsIDMpLFxuICAgIHl5eXk6IHN0cmluZyA9IHllYXIgKyBcIlwiLFxuICAgIHl5OiBzdHJpbmcgPSB5eXl5LnN1YnN0cigyLCAyKTtcbiAgLy8gY2hlY2tzIHRvIHNlZSBpZiBtb250aCBuYW1lIHdpbGwgYmUgdXNlZFxuICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0clxuICAgIC5yZXBsYWNlKFwiaGhcIiwgaGgpXG4gICAgLnJlcGxhY2UoXCJoXCIsIGgudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIkhIXCIsIEhIKVxuICAgIC5yZXBsYWNlKFwiSFwiLCBob3VyLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJtbVwiLCBtbSlcbiAgICAucmVwbGFjZShcIm1cIiwgbWludXRlLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJzc1wiLCBzcylcbiAgICAucmVwbGFjZShcInNcIiwgc2Vjb25kLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJTXCIsIG1pbGlzZWNvbmRzLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJkZFwiLCBkZClcbiAgICAucmVwbGFjZShcImRcIiwgZGF5LnRvU3RyaW5nKCkpXG5cbiAgICAucmVwbGFjZShcIkVFRUVcIiwgRUVFRSlcbiAgICAucmVwbGFjZShcIkVFRVwiLCBFRUUpXG4gICAgLnJlcGxhY2UoXCJ5eXl5XCIsIHl5eXkpXG4gICAgLnJlcGxhY2UoXCJ5eVwiLCB5eSlcbiAgICAucmVwbGFjZShcImFhYVwiLCBhYWEpO1xuICBpZiAocGF0dGVyblN0ci5pbmRleE9mKFwiTU1NXCIpID4gLTEpIHtcbiAgICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0ci5yZXBsYWNlKFwiTU1NTVwiLCBNTU1NKS5yZXBsYWNlKFwiTU1NXCIsIE1NTSk7XG4gIH0gZWxzZSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NXCIsIE1NKS5yZXBsYWNlKFwiTVwiLCBNLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBwYXR0ZXJuU3RyO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhcnNlcyBhIGRhdGUgZnJvbSBhIHNwZWNpZmllZCBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgRGF0ZSB8IG51bWJlcn0gW3ZdXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZShmb3JtYXQ6IHN0cmluZywgdj86IHN0cmluZyB8IERhdGUgfCBudW1iZXIpIHtcbiAgbGV0IHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAodiBpbnN0YW5jZW9mIERhdGUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZSh2IGFzIERhdGUsIGZvcm1hdCksIGZvcm1hdCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdi50b1N0cmluZygpLCBmb3JtYXQpXG4gICAgICApO1xuICAgIH1cbiAgZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KHYsIGZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKGQsIGZvcm1hdCksIGZvcm1hdCk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZERhdGUodikpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHYpO1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKGQsIGZvcm1hdCksIGZvcm1hdCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGUgezB9IHRvIGZvcm1hdDogezF9XCIsIHYsIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBwcm92aWRlZCAke3Z9YCk7XG4gIH1cbiAgcmV0dXJuIGJpbmREYXRlVG9TdHJpbmcodmFsdWUsIGZvcm1hdCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZGVjb3JhdG9yIG1hbmFnZW1lbnQgY2xhc3MgdGhhdCBoYW5kbGVzIGZsYXZvdXJlZCBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuXG4gKiBJdCBzdXBwb3J0cyByZWdpc3RlcmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGNvbnRleHQtYXdhcmUgZmxhdm91ciByZXNvbHV0aW9uLlxuICogVGhlIGNsYXNzIGltcGxlbWVudHMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBkZWZpbmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3VycyxcbiAqIGFsbG93aW5nIGZvciBmcmFtZXdvcmstc3BlY2lmaWMgZGVjb3JhdG9yIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBmbGF2b3VyIHBhcmFtZXRlciBmb3IgdGhlIGRlY29yYXRvciBjb250ZXh0XG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTdG9yZXMgYWxsIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycyBvcmdhbml6ZWQgYnkga2V5IGFuZCBmbGF2b3VyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXRcbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmxhdm91clJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIgPSBkZWZhdWx0Rmxhdm91clJlc29sdmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxcbiAgICBDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yXG4gID47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgYWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVjb3JhdG9yIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBkZWNvcmF0aW9uIGNoYWluIHdpdGggdGhlIHNwZWNpZmllZCBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvclxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBhZGQgZGVjb3JhdG9ycyB3aXRoIGFkZG9uIHN1cHBvcnRcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWRkb249ZmFsc2VdIFdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZG9uc1xuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBcnJheSBvZiBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge3RoaXN9IEN1cnJlbnQgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSBkZWNvcmF0b3JzIGNhbiBiZSBhZGRlZFwiKTtcbiAgICBpZiAoXG4gICAgICAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSAmJlxuICAgICAgIWFkZG9uICYmXG4gICAgICB0aGlzLmZsYXZvdXIgIT09IERlZmF1bHRGbGF2b3VyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk11c3QgcHJvdmlkZSBvdmVycmlkZXMgb3IgYWRkb25zIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBkZWNhZidzIGRlY29yYXRvcnNcIlxuICAgICAgKTtcbiAgICBpZiAodGhpcy5mbGF2b3VyID09PSBEZWZhdWx0Rmxhdm91ciAmJiBhZGRvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmF1bHQgZmxhdm91ciBjYW5ub3QgYmUgZXh0ZW5kZWRcIik7XG5cbiAgICB0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSA9IG5ldyBTZXQoW1xuICAgICAgLi4uKHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICAuLi5kZWNvcmF0b3JzLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGJhc2UgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byBkZWZpbmVcbiAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlIGZvciBmaW5pc2hpbmcgdGhlIGNoYWluXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBBZGRzIGFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yXG4gICAqL1xuICBleHRlbmQoXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBjb25zdCBjb250ZXh0RGVjb3JhdG9yID0gZnVuY3Rpb24gY29udGV4dERlY29yYXRvcihcbiAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICAgICkge1xuICAgICAgY29uc3QgZmxhdm91ciA9IERlY29yYXRpb24uZmxhdm91clJlc29sdmVyKHRhcmdldCk7XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdXG4gICAgICAgID8gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcbiAgICAgIGlmIChcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gJiZcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gJiZcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9yc1xuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW0RlZmF1bHRGbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfVxuICAgICAgW1xuICAgICAgICAuLi4oZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMudmFsdWVzKCkgOiBbXSksXG4gICAgICAgIC4uLihleHRyYXMgPyBleHRyYXMudmFsdWVzKCkgOiBbXSksXG4gICAgICBdLmZvckVhY2goKGQpID0+IChkIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciwgZGVzY3JpcHRvcikpO1xuICAgICAgLy8gcmV0dXJuIGFwcGx5KFxuICAgICAgLy9cbiAgICAgIC8vICkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dERlY29yYXRvciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBbZiwga2V5XS5qb2luKFwiX2RlY29yYXRvcl9mb3JfXCIpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZXh0RGVjb3JhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBmaW5hbCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvblxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueT8sIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPyk6IGFueX0gVGhlIGdlbmVyYXRlZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKHRoaXMua2V5LCB0aGlzLmZsYXZvdXIsIHRoaXMuZGVjb3JhdG9ycywgdGhpcy5leHRyYXMpO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRvckZhY3RvcnkodGhpcy5rZXksIHRoaXMuZmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBkZWNvcmF0b3JzIGZvciBhIHNwZWNpZmljIGtleSBhbmQgZmxhdm91clxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBEZWNvcmF0b3IgZmxhdm91clxuICAgKiBAcGFyYW0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9yc1xuICAgKiBAcGFyYW0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPixcbiAgICBleHRyYXM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGRlY29yYXRvciBmbGF2b3Vyc1xuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vyc1xuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIHN0YXRpYyBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKCkuZm9yKGtleSk7XG4gIH1cblxuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbW9kZWwgYXR0cmlidXRlc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1hcmtzIGNsYXNzIHByb3BlcnRpZXMgYXMgbW9kZWwgYXR0cmlidXRlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PU1vZGVsS2V5cy5BVFRSSUJVVEVdIC0gVGhlIG1ldGFkYXRhIGtleSB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgcHJvcGVydHkgbmFtZVxuICogQHJldHVybiB7ZnVuY3Rpb24ob2JqZWN0LCBhbnk/KTogdm9pZH0gLSBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCByZWdpc3RlcnMgdGhlIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICpcbiAqICAgIEQtPj5NOiBDaGVjayBpZiBrZXkgZXhpc3RzXG4gKiAgICBhbHQga2V5IGV4aXN0c1xuICogICAgICAgIE0tLT4+RDogUmV0dXJuIGV4aXN0aW5nIHByb3BzIGFycmF5XG4gKiAgICBlbHNlIGtleSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICAgRC0+Pk06IENyZWF0ZSBuZXcgcHJvcHMgYXJyYXlcbiAqICAgIGVuZFxuICogICAgRC0+Pk06IENoZWNrIGlmIHByb3BlcnR5IGV4aXN0c1xuICogICAgYWx0IHByb3BlcnR5IG5vdCBpbiBhcnJheVxuICogICAgICAgIEQtPj5NOiBBZGQgcHJvcGVydHkgdG8gYXJyYXlcbiAqICAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcChrZXk6IHN0cmluZyA9IE1vZGVsS2V5cy5BVFRSSUJVVEUpIHtcbiAgcmV0dXJuIChtb2RlbDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSk6IHZvaWQgPT4ge1xuICAgIGxldCBwcm9wczogc3RyaW5nW107XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwga2V5KSkge1xuICAgICAgcHJvcHMgPSAobW9kZWwgYXMgYW55KVtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcyA9IChtb2RlbCBhcyBhbnkpW2tleV0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5pbmNsdWRlcyhwcm9wZXJ0eUtleSBhcyBzdHJpbmcpKVxuICAgICAgcHJvcHMucHVzaChwcm9wZXJ0eUtleSBhcyBzdHJpbmcpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21iaW5lZCBwcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbWV0YWRhdGEgYW5kIGF0dHJpYnV0ZSBtYXJraW5nXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgYm90aCBtYXJrcyBhIHByb3BlcnR5IGFzIGEgbW9kZWwgYXR0cmlidXRlIGFuZCBhc3NpZ25zIG1ldGFkYXRhIHRvIGl0XG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbWV0YWRhdGEga2V5XG4gKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybiB7RnVuY3Rpb259IC0gQ29tYmluZWQgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKiBAZnVuY3Rpb24gcHJvcE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE1ldGFkYXRhPFY+KGtleTogc3RyaW5nLCB2YWx1ZTogVikge1xuICByZXR1cm4gYXBwbHkocHJvcCgpLCBtZXRhZGF0YTxWPihrZXksIHZhbHVlKSk7XG59XG4iLCIvKipcbiAqIEBzdW1tYXJ5IE1pbWljcyBKYXZhJ3MgU3RyaW5nJ3MgSGFzaCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sIHwgRGF0ZX0gb2JqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGhhc2ggdmFsdWUgb2Ygb2JqXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hDb2RlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hDb2RlKG9iajogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sIHwgRGF0ZSk6IHN0cmluZyB7XG4gIG9iaiA9IFN0cmluZyhvYmopO1xuICBsZXQgaGFzaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gb2JqLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXJhY3RlcjtcbiAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoYXNoLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0ZWggdHlwZSBmb3IgYSBIYXNoaW5nIGZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgSGFzaGluZ0Z1bmN0aW9uID0gKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogQHN1bW1hcnkgSGFzaGVzIGFuIG9iamVjdCBieSBjb21iaW5pbmcgdGhlIGhhc2ggb2YgYWxsIGl0cyBwcm9wZXJ0aWVzXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHJlc3VsdGluZyBoYXNoXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hPYmpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaE9iaihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hSZWR1Y2VyID0gZnVuY3Rpb24gKGg6IG51bWJlciB8IHN0cmluZywgZWw6IGFueSk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgY29uc3QgZWxIYXNoID0gaGFzaEZ1bmN0aW9uKGVsKTtcblxuICAgIGlmICh0eXBlb2YgZWxIYXNoID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIGhhc2hGdW5jdGlvbigoKGggYXMgc3RyaW5nKSB8fCBcIlwiKSArIGhhc2hGdW5jdGlvbihlbCkpO1xuXG4gICAgaCA9IGggfHwgMDtcbiAgICBoID0gKChoIGFzIG51bWJlcikgPDwgNSkgLSAoaCBhcyBudW1iZXIpICsgZWxIYXNoO1xuICAgIHJldHVybiBoICYgaDtcbiAgfTtcblxuICBjb25zdCBmdW5jOiBIYXNoaW5nRnVuY3Rpb24gPSBoYXNoQ29kZTtcblxuICBjb25zdCBoYXNoRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWU6IGFueSk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwiXCI7XG4gICAgaWYgKFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcInN5bWJvbFwiXS5pbmRleE9mKHR5cGVvZiB2YWx1ZSkgIT09IC0xKVxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUudG9TdHJpbmcoKSk7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGZ1bmModmFsdWUuZ2V0VGltZSgpKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5yZWR1Y2UoaGFzaFJlZHVjZXIsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIChPYmplY3QudmFsdWVzKHZhbHVlKSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKS5yZWR1Y2UoXG4gICAgICBoYXNoUmVkdWNlcixcbiAgICAgIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHN0cmluZyB8IG51bWJlclxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LnZhbHVlcyhvYmopLnJlZHVjZShoYXNoUmVkdWNlciwgMCk7XG5cbiAgcmV0dXJuICh0eXBlb2YgcmVzdWx0ID09PSBcIm51bWJlclwiID8gTWF0aC5hYnMocmVzdWx0KSA6IHJlc3VsdCkudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRIYXNoaW5nTWV0aG9kID0gXCJkZWZhdWx0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hbmFnZXMgaGFzaGluZyBtZXRob2RzIGFuZCBwcm92aWRlcyBhIHVuaWZpZWQgaGFzaGluZyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IEEgdXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgZm9yIGRpZmZlcmVudCBoYXNoaW5nIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyB0byBoYXNoIG9iamVjdHMuXG4gKiBUaGUgY2xhc3MgbWFpbnRhaW5zIGEgY2FjaGUgb2YgcmVnaXN0ZXJlZCBoYXNoaW5nIGZ1bmN0aW9ucyBhbmQgYWxsb3dzIHNldHRpbmcgYSBkZWZhdWx0IGhhc2hpbmcgbWV0aG9kLlxuICogSXQgcHJldmVudHMgZGlyZWN0IGluc3RhbnRpYXRpb24gYW5kIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciByZWdpc3RyYXRpb24gYW5kIGhhc2hpbmcuXG4gKlxuICogQGNsYXNzIEhhc2hpbmdcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBSZWdpc3RlciBhIGN1c3RvbSBoYXNoaW5nIGZ1bmN0aW9uXG4gKiBIYXNoaW5nLnJlZ2lzdGVyKCdtZDUnLCAob2JqKSA9PiBjcmVhdGVNRDVIYXNoKG9iaiksIHRydWUpO1xuICpcbiAqIC8vIEhhc2ggYW4gb2JqZWN0IHVzaW5nIGRlZmF1bHQgbWV0aG9kXG4gKiBjb25zdCBoYXNoMSA9IEhhc2hpbmcuaGFzaChteU9iamVjdCk7XG4gKlxuICogLy8gSGFzaCB1c2luZyBzcGVjaWZpYyBtZXRob2RcbiAqIGNvbnN0IGhhc2gyID0gSGFzaGluZy5oYXNoKG15T2JqZWN0LCAnbWQ1Jyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEhhc2hpbmcge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVmYXVsdCBoYXNoaW5nIG1ldGhvZCBpZGVudGlmaWVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OiBzdHJpbmcgPSBEZWZhdWx0SGFzaGluZ01ldGhvZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhY2hlIG9mIHJlZ2lzdGVyZWQgaGFzaGluZyBmdW5jdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBIYXNoaW5nRnVuY3Rpb24+ID0ge1xuICAgIGRlZmF1bHQ6IGhhc2hPYmosXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIGhhc2hpbmcgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIGhhc2hpbmcgZnVuY3Rpb24gZnJvbSB0aGUgY2FjaGUgYnkgaXRzIGtleS4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtZXRob2QgaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgaGFzaGluZyBmdW5jdGlvbiB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtIYXNoaW5nRnVuY3Rpb259IFRoZSByZXF1ZXN0ZWQgaGFzaGluZyBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBoYXNoaW5nIG1ldGhvZCByZWdpc3RlcmVkIHVuZGVyICR7a2V5fWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBuZXcgaGFzaGluZyBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIGEgbmV3IGhhc2hpbmcgZnVuY3Rpb24gdG8gdGhlIHJlZ2lzdHJ5LiBPcHRpb25hbGx5IHNldHMgaXQgYXMgdGhlIGRlZmF1bHQgbWV0aG9kLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBrZXkgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBoYXNoaW5nIGZ1bmN0aW9uXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZnVuYzogSGFzaGluZ0Z1bmN0aW9uLFxuICAgIHNldERlZmF1bHQgPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhhc2hpbmcgbWV0aG9kICR7a2V5fSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLmNhY2hlW2tleV0gPSBmdW5jO1xuICAgIGlmIChzZXREZWZhdWx0KSB0aGlzLmN1cnJlbnQgPSBrZXk7XG4gIH1cblxuICBzdGF0aWMgaGFzaChvYmo6IGFueSwgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgc2V0RGVmYXVsdChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZ2V0KG1ldGhvZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsRXJyb3JzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgQ2xhc3MgdG8gaG9sZCB0aGUgZXJyb3IgcmVzdWx0c1xuICogQGRlc2NyaXB0aW9uIGhvbGRzIGVycm9yIHJlc3VsdHMgaW4gYW4gJ2luZGV4YWJsZScgbWFubmVyXG4gKiB3aGlsZSBzdGlsbCBwcm92aWRpbmcgdGhlIHNhbWUgcmVzdWx0IG9uIHRvU3RyaW5nXG4gKlxuICogQHBhcmFtIHtNb2RlbEVycm9yc30gZXJyb3JzXG4gKlxuICogQGNsYXNzIE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEVycm9yRGVmaW5pdGlvbiB7XG4gIFtpbmRleGVyOiBzdHJpbmddOlxuICAgIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuICAgIHwgKCgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgY29uc3RydWN0b3IoZXJyb3JzOiBNb2RlbEVycm9ycykge1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBlcnJvcnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3JzLCBwcm9wKSAmJiBlcnJvcnNbcHJvcF0pXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzIGFzIGFueSwgcHJvcCwge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogZXJyb3JzW3Byb3BdLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IE91dHB1dHMgdGhlIGNsYXNzIHRvIGEgbmljZSByZWFkYWJsZSBzdHJpbmdcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGY6IGFueSA9IHRoaXMgYXMgYW55O1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzZWxmKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGspID0+XG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlbGYsIGspICYmXG4gICAgICAgICAgdHlwZW9mIHNlbGZba10gIT09IFwiZnVuY3Rpb25cIlxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZywgcHJvcCkgPT4ge1xuICAgICAgICBsZXQgcHJvcEVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBPYmplY3Qua2V5cyhzZWxmW3Byb3BdKS5yZWR1Y2UoXG4gICAgICAgICAgKHByb3BBY2N1bTogdW5kZWZpbmVkIHwgc3RyaW5nLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghcHJvcEFjY3VtKSBwcm9wQWNjdW0gPSBzZWxmW3Byb3BdW2tleV07XG4gICAgICAgICAgICBlbHNlIHByb3BBY2N1bSArPSBgXFxuJHtzZWxmW3Byb3BdW2tleV19YDtcbiAgICAgICAgICAgIHJldHVybiBwcm9wQWNjdW07XG4gICAgICAgICAgfSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJvcEVycm9yKSB7XG4gICAgICAgICAgcHJvcEVycm9yID0gYCR7cHJvcH0gLSAke3Byb3BFcnJvcn1gO1xuICAgICAgICAgIGlmICghYWNjdW0pIGFjY3VtID0gcHJvcEVycm9yO1xuICAgICAgICAgIGVsc2UgYWNjdW0gKz0gYFxcbiR7cHJvcEVycm9yfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBcIlwiKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSByZWxldmFudCBKUyBwcmltaXRpdmVzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNUUklORyByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIHJlZmVyZW5jZXMgdGhlIG51bWJlciBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOIHJlZmVyZW5jZXMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UIHJlZmVyZW5jZXMgdGhlIGJpZ2ludCBwcmltaXRpdmVcbiAqXG4gKiBAY29uc3RhbnQgUHJpbWl0aXZlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBQcmltaXRpdmVzIHtcbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgTlVNQkVSID0gXCJudW1iZXJcIixcbiAgQk9PTEVBTiA9IFwiYm9vbGVhblwiLFxuICBCSUdJTlQgPSBcImJpZ2ludFwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIFJlc2VydmVkIG1vZGVsIG5hbWVzIHRvIGlnbm9yZSBkdXJpbmcgTW9kZWwgcmVidWlsZGluZ1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVxuICpcbiAqIEBjb25zdGFudCBSZXNlcnZlZE1vZGVsc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBSZXNlcnZlZE1vZGVscyB7XG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIE9CSkVDVCA9IFwib2JqZWN0XCIsXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIEJPT0xFQU4gPSBcImJvb2xlYW5cIixcbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbiAgREFURSA9IFwiZGF0ZVwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIGJhc2ljIHN1cHBvcnRlZCBqcyB0eXBlc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcnJheVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG51bWJlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJvb2xlYW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW1ib2xcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmdW5jdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdJTlRcbiAqXG4gKiBAY29uc3RhbnQganNUeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QganNUeXBlcyA9IFtcbiAgXCJzdHJpbmdcIixcbiAgXCJhcnJheVwiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG4iLCJpbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCB2YWxpZGF0b3JzIGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29ya1xuICogQHN1bW1hcnkgVGhlIFZhbGlkYXRvciBjbGFzcyBwcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3IgYWxsIHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbnMuXG4gKiBJdCBoYW5kbGVzIHR5cGUgY2hlY2tpbmcsIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZywgYW5kIGRlZmluZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VcbiAqIHRoYXQgYWxsIHZhbGlkYXRvcnMgbXVzdCBpbXBsZW1lbnQuIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWNcbiAqIHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBwcm92aWRlIGNvbmNyZXRlIHZhbGlkYXRpb24gbG9naWMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RFRkFVTFR9XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhY2NlcHRlZFR5cGVzIC0gQXJyYXkgb2YgdHlwZSBuYW1lcyB0aGF0IHRoaXMgdmFsaWRhdG9yIGNhbiB2YWxpZGF0ZVxuICpcbiAqIEBjbGFzcyBWYWxpZGF0b3JcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIGV4dGVuZGluZyB0aGUgVmFsaWRhdG9yIGNsYXNzIHRvIGNyZWF0ZSBhIGN1c3RvbSB2YWxpZGF0b3JcbiAqIGNsYXNzIEN1c3RvbVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxDdXN0b21WYWxpZGF0b3JPcHRpb25zPiB7XG4gKiAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IFwiQ3VzdG9tIHZhbGlkYXRpb24gZmFpbGVkXCIpIHtcbiAqICAgICAvLyBTcGVjaWZ5IHRoYXQgdGhpcyB2YWxpZGF0b3IgYWNjZXB0cyBTdHJpbmcgYW5kIE51bWJlciB0eXBlc1xuICogICAgIHN1cGVyKG1lc3NhZ2UsIFN0cmluZy5uYW1lLCBOdW1iZXIubmFtZSk7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IEN1c3RvbVZhbGlkYXRvck9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICogICAgIC8vIEltcGxlbWVudCBjdXN0b20gdmFsaWRhdGlvbiBsb2dpY1xuICogICAgIGlmIChzb21lQ29uZGl0aW9uKSB7XG4gKiAgICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnM/Lm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm8gZXJyb3JzXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBWYWxpZGF0b3IgU3ViY2xhc3NcbiAqICAgcGFydGljaXBhbnQgQiBhcyBCYXNlIFZhbGlkYXRvclxuICpcbiAqICAgQy0+PlY6IG5ldyBDdXN0b21WYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgVi0+PkI6IHN1cGVyKG1lc3NhZ2UsIGFjY2VwdGVkVHlwZXMpXG4gKiAgIEItPj5COiBTdG9yZSBtZXNzYWdlIGFuZCB0eXBlc1xuICogICBCLT4+QjogV3JhcCBoYXNFcnJvcnMgd2l0aCB0eXBlIGNoZWNraW5nXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSB0eXBlIG5vdCBpbiBhY2NlcHRlZFR5cGVzXG4gKiAgICAgQi0tPj5DOiBUeXBlIGVycm9yIG1lc3NhZ2VcbiAqICAgZWxzZSB2YWx1ZSB0eXBlIGlzIGFjY2VwdGVkXG4gKiAgICAgVi0+PlY6IEN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljXG4gKiAgICAgVi0tPj5DOiBWYWxpZGF0aW9uIHJlc3VsdFxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdG9yPFYgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zID0gVmFsaWRhdG9yT3B0aW9ucz4ge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY2VwdGVkVHlwZXM/OiBzdHJpbmdbXTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ERUZBVUxULFxuICAgIC4uLmFjY2VwdGVkVHlwZXM6IHN0cmluZ1tdXG4gICkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cbiAgICBpZiAoYWNjZXB0ZWRUeXBlcy5sZW5ndGgpIHRoaXMuYWNjZXB0ZWRUeXBlcyA9IGFjY2VwdGVkVHlwZXM7XG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRUeXBlcylcbiAgICAgIHRoaXMuaGFzRXJyb3JzID0gdGhpcy5jaGVja1R5cGVBbmRIYXNFcnJvcnModGhpcy5oYXNFcnJvcnMuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1hdHMgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9wdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgZm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgYnkgcmVwbGFjaW5nIHBsYWNlaG9sZGVycyB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgc3RyaW5nIGZvcm1hdHRpbmcgdXRpbGl0eSB0byBnZW5lcmF0ZSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzXG4gICAqIGFjcm9zcyBhbGwgdmFsaWRhdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHBsYWNlaG9sZGVyc1xuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyAtIFZhbHVlcyB0byBpbnNlcnQgaW50byB0aGUgbWVzc2FnZSB0ZW1wbGF0ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIHNmKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgdHlwZS1jaGVja2luZyB3cmFwcGVyIGFyb3VuZCB0aGUgaGFzRXJyb3JzIG1ldGhvZFxuICAgKiBAc3VtbWFyeSBXcmFwcyB0aGUgaGFzRXJyb3JzIG1ldGhvZCB3aXRoIHR5cGUgdmFsaWRhdGlvbiBsb2dpYyB0byBlbnN1cmUgdGhhdFxuICAgKiB0aGUgdmFsdWUgYmVpbmcgdmFsaWRhdGVkIGlzIG9mIGFuIGFjY2VwdGVkIHR5cGUgYmVmb3JlIHBlcmZvcm1pbmcgc3BlY2lmaWMgdmFsaWRhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gaWYgYWNjZXB0ZWRUeXBlcyBhcmUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHVuYm91bmQgLSBUaGUgb3JpZ2luYWwgaGFzRXJyb3JzIG1ldGhvZCB0byBiZSB3cmFwcGVkXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHR5cGUgY2hlY2tpbmcgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1R5cGVBbmRIYXNFcnJvcnMoXG4gICAgdW5ib3VuZDogKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IFZhbGlkYXRvcixcbiAgICAgIHZhbHVlOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5hY2NlcHRlZFR5cGVzKVxuICAgICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgLi4uYXJncyk7XG4gICAgICBpZiAoIVJlZmxlY3Rpb24uY2hlY2tUeXBlcyh2YWx1ZSwgdGhpcy5hY2NlcHRlZFR5cGVzKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEUsXG4gICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB0eXBlb2YgdmFsdWVcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB1bmJvdW5kKHZhbHVlLCAuLi5hcmdzKTtcbiAgICB9LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhIHZhbHVlIGFnYWluc3Qgc3BlY2lmaWMgdmFsaWRhdGlvbiBydWxlc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCB2YWxpZGF0b3Igc3ViY2xhc3Nlcy5cbiAgICogVGhpcyBtZXRob2QgY29udGFpbnMgdGhlIGNvcmUgdmFsaWRhdGlvbiBsb2dpYyB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIHZhbHVlXG4gICAqIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWMgcnVsZXMgb2YgdGhlIHZhbGlkYXRvci4gSWYgdGhlIHZhbHVlIGlzIHZhbGlkLFxuICAgKiB0aGUgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkOyBvdGhlcndpc2UsIGl0IHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICpcbiAgICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICpcbiAgICogQHNlZSBNb2RlbCN2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBWLFxuICAgIGluc3RhbmNlT2JqPzogYW55XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHN1bW1hcnkgRHVjayB0eXBpbmcgZm9yIFZhbGlkYXRvcnNcbiAgICogQHBhcmFtIHZhbFxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRhdG9yKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbC5jb25zdHJ1Y3RvciAmJiAhIXZhbFtcImhhc0Vycm9yc1wiXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSVZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBCYXNlIEltcGxlbWVudGF0aW9uIG9mIGEgVmFsaWRhdG9yIFJlZ2lzdHJ5XG4gKlxuICogQHByb3Age1ZhbGlkYXRvcltdfSBbdmFsaWRhdG9yc10gdGhlIGluaXRpYWwgdmFsaWRhdG9ycyB0byByZWdpc3RlclxuICpcbiAqIEBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeVxuICogQGltcGxlbWVudHMgSVZhbGlkYXRvclJlZ2lzdHJ5PFQ+XG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5PFQgZXh0ZW5kcyBWYWxpZGF0b3I+XG4gIGltcGxlbWVudHMgSVZhbGlkYXRvclJlZ2lzdHJ5PFQ+XG57XG4gIHByaXZhdGUgY2FjaGU6IGFueSA9IHt9O1xuICBwcml2YXRlIGN1c3RvbUtleUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKC4uLnZhbGlkYXRvcnM6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVmFsaWRhdG9yKVtdKSB7XG4gICAgdGhpcy5jdXN0b21LZXlDYWNoZSA9IHt9O1xuICAgIHRoaXMucmVnaXN0ZXIoLi4udmFsaWRhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0cmlldmVzIHRoZSBjdXN0b20ga2V5c1xuICAgKi9cbiAgZ2V0Q3VzdG9tS2V5cygpOiB7IFtpbmRleGVyOiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY3VzdG9tS2V5Q2FjaGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJldHJpZXZlcyB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzIGtleXNcbiAgICovXG4gIGdldEtleXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSB2YWxpZGF0b3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICogQHJldHVybiB7VmFsaWRhdG9yIHwgdW5kZWZpbmVkfSB0aGUgcmVnaXN0ZXJlZCBWYWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbm8gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGtleVxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsaWRhdG9yS2V5IGluIHRoaXMuY2FjaGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2xhc3NPckluc3RhbmNlID0gdGhpcy5jYWNoZVt2YWxpZGF0b3JLZXldO1xuICAgIGlmIChWYWxpZGF0b3IuaXNWYWxpZGF0b3IoY2xhc3NPckluc3RhbmNlKSkgcmV0dXJuIGNsYXNzT3JJbnN0YW5jZSBhcyBUO1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gY2xhc3NPckluc3RhbmNlLmRlZmF1bHQgfHwgY2xhc3NPckluc3RhbmNlO1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnN0cnVjdG9yKCk7XG4gICAgdGhpcy5jYWNoZVt2YWxpZGF0b3JLZXldID0gaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycyBvbnRvIHRoZSByZWdpc3RyeVxuICAgKlxuICAgKiBAcGFyYW0ge1RbXSB8IFZhbGlkYXRvckRlZmluaXRpb25bXX0gdmFsaWRhdG9yXG4gICAqL1xuICByZWdpc3RlcjxUIGV4dGVuZHMgVmFsaWRhdG9yPihcbiAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICApOiB2b2lkIHtcbiAgICB2YWxpZGF0b3IuZm9yRWFjaCgodikgPT4ge1xuICAgICAgaWYgKFZhbGlkYXRvci5pc1ZhbGlkYXRvcih2KSkge1xuICAgICAgICAvLyBjb25zdCBrID1cblxuICAgICAgICBpZiAoKHYgYXMgVmFsaWRhdG9yRGVmaW5pdGlvbikudmFsaWRhdGlvbktleSBpbiB0aGlzLmNhY2hlKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FjaGVbKHYgYXMgVmFsaWRhdG9yRGVmaW5pdGlvbikudmFsaWRhdGlvbktleV0gPSB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB2YWxpZGF0aW9uS2V5LCB2YWxpZGF0b3IsIHNhdmUgfSA9IHYgYXMgVmFsaWRhdG9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25LZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhY2hlW3ZhbGlkYXRpb25LZXldID0gdmFsaWRhdG9yO1xuICAgICAgICBpZiAoIXNhdmUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIG9ialt2YWxpZGF0aW9uS2V5LnRvVXBwZXJDYXNlKCldID0gdmFsaWRhdGlvbktleTtcblxuICAgICAgICB0aGlzLmN1c3RvbUtleUNhY2hlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jdXN0b21LZXlDYWNoZSwgb2JqKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9ycy9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IElWYWxpZGF0b3JSZWdpc3RyeSwgVmFsaWRhdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gXCIuL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnlcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBTdGF0aWMgY2xhc3MgYWN0aW5nIGFzIGEgbmFtZXNwYWNlIGZvciB0aGUgVmFsaWRhdGlvblxuICpcbiAqIEBjbGFzcyBWYWxpZGF0aW9uXG4gKiBAc3RhdGljXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb24ge1xuICBwcml2YXRlIHN0YXRpYyBhY3RpbmdWYWxpZGF0b3JSZWdpc3RyeT86IElWYWxpZGF0b3JSZWdpc3RyeTxWYWxpZGF0b3I+ID1cbiAgICB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGFjdGluZyBWYWxpZGF0b3JSZWdpc3RyeVxuICAgKlxuICAgKiBAcGFyYW0ge0lWYWxpZGF0b3JSZWdpc3RyeX0gdmFsaWRhdG9yUmVnaXN0cnkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIFJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oVmFsaWRhdG9yKTogVmFsaWRhdG9yfSBbbWlncmF0aW9uSGFuZGxlcl0gdGhlIG1ldGhvZCB0byBtYXAgdGhlIHZhbGlkYXRvciBpZiByZXF1aXJlZDtcbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShcbiAgICB2YWxpZGF0b3JSZWdpc3RyeTogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4sXG4gICAgbWlncmF0aW9uSGFuZGxlcj86ICh2YWxpZGF0b3I6IFZhbGlkYXRvcikgPT4gVmFsaWRhdG9yXG4gICkge1xuICAgIGlmIChtaWdyYXRpb25IYW5kbGVyICYmIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkpXG4gICAgICBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5LmdldEtleXMoKS5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdG9yUmVnaXN0cnkuZ2V0KGspO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB2YWxpZGF0b3JSZWdpc3RyeS5yZWdpc3RlcihtaWdyYXRpb25IYW5kbGVyKHZhbGlkYXRvcikpO1xuICAgICAgfSk7XG4gICAgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSA9IHZhbGlkYXRvclJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICpcbiAgICogQHJldHVybiBJVmFsaWRhdG9yUmVnaXN0cnksIGRlZmF1bHRzIHRvIHtAbGluayBWYWxpZGF0b3JSZWdpc3RyeX1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5KCkge1xuICAgIGlmICghVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSlcbiAgICAgIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkgPSBuZXcgVmFsaWRhdG9yUmVnaXN0cnkoKTtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSB2YWxpZGF0b3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICogQHJldHVybiB7VmFsaWRhdG9yIHwgdW5kZWZpbmVkfSB0aGUgcmVnaXN0ZXJlZCBWYWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbm8gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGtleVxuICAgKi9cbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmdldFJlZ2lzdHJ5KCkuZ2V0KHZhbGlkYXRvcktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUIGV4dGVuZHMgVmFsaWRhdG9yPihcbiAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKC4uLnZhbGlkYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVGTEVDVH0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIHZhbGlkYXRpb24ga2V5c1xuICAgKi9cbiAgc3RhdGljIGtleXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVnaXN0cnkoKS5nZXRLZXlzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIi4vTW9kZWxFcnJvckRlZmluaXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhLCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXNlcnZlZE1vZGVscyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVkFMSURBVElPTl9QQVJFTlRfS0VZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVmFsaWRhdGFibGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvbi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFuYWx5c2VzIHRoZSBkZWNvcmF0aW9ucyBvZiB0aGUgcHJvcGVydGllcyBhbmQgdmFsaWRhdGVzIHRoZSBvYmogYWNjb3JkaW5nIHRvIHRoZW1cbiAqXG4gKiBAdHlwZWRlZiBNIGV4dGVuZHMgTW9kZWxcbiAqIEBwcm9wIHtNfSBvYmogTW9kZWwgb2JqZWN0IHRvIHZhbGlkYXRlXG4gKiBAcHJvcCB7c3RyaW5nW119IFtwcm9wc1RvSWdub3JlXSBvYmplY3QgcHJvcGVydGllcyB0byBpZ25vcmUgaW4gdGhlIHZhbGlkYXRpb25cbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgb2JqOiBNLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIG9iailcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSAmJlxuICAgICAgcHJvcHNUb0lnbm9yZS5pbmRleE9mKHByb3ApID09PSAtMVxuICAgIClcbiAgICAgIGRlY29yYXRlZFByb3BlcnRpZXMucHVzaChcbiAgICAgICAgUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBvYmosXG4gICAgICAgICAgcHJvcFxuICAgICAgICApIGFzIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25cbiAgICAgICk7XG5cbiAgbGV0IHJlc3VsdDogTW9kZWxFcnJvcnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0eSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gPSBkZWNvcmF0ZWRQcm9wZXJ0eTtcblxuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVmYXVsdFR5cGVEZWNvcmF0b3I6IERlY29yYXRvck1ldGFkYXRhID0gZGVjb3JhdG9yc1swXTtcblxuICAgIC8vIHRyaWVzIHRvIGZpbmQgYW55IHR5cGUgZGVjb3JhdG9ycyBvciBvdGhlciBkZWNvcmF0b3JzIHRoYXQgYWxyZWFkeSBlbmZvcmNlIHR5cGUgKHRoZSBvbmVzIHdpdGggdGhlIGFsbG93ZWQgdHlwZXMgcHJvcGVydHkgZGVmaW5lZCkuIGlmIHNvLCBza2lwIHRoZSBkZWZhdWx0IHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB7XG4gICAgICAgIGlmIChkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuVFlQRSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhIWQucHJvcHMudHlwZXM/LmZpbmQoXG4gICAgICAgICAgKHQpID0+IHQgPT09IGRlZmF1bHRUeXBlRGVjb3JhdG9yLnByb3BzLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBkZWNvcmF0b3JzLnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSB0aGUgdHlwZSB3aWxsIGFscmVhZHkgYmUgY2hlY2tlZFxuICAgIH1cblxuICAgIGxldCBlcnJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoZGVjb3JhdG9yLmtleSk7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdmFsaWRhdG9yIGZvciAke2RlY29yYXRvci5rZXl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvclByb3BzID1cbiAgICAgICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICAgICA/IFtkZWNvcmF0b3IucHJvcHNdXG4gICAgICAgICAgOiBkZWNvcmF0b3IucHJvcHMgfHwge307XG5cbiAgICAgIGNvbnN0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdmFsaWRhdG9yLmhhc0Vycm9ycyhcbiAgICAgICAgKG9iaiBhcyBhbnkpW3Byb3AudG9TdHJpbmcoKV0sXG4gICAgICAgIGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnMsXG4gICAgICAgIG9iaiAvLyBUT0RPOiBBc3NlcnQgdHlwZSBhbmQgZGVlcCBPYmplY3QuZnJlZXplXG4gICAgICApO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVycnMgPSBlcnJzIHx8IHt9O1xuICAgICAgICBlcnJzW2RlY29yYXRvci5rZXldID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHRbZGVjb3JhdGVkUHJvcGVydHkucHJvcC50b1N0cmluZygpXSA9IGVycnM7XG4gICAgfVxuICB9XG5cbiAgLy8gdGVzdHMgbmVzdGVkIGNsYXNzZXNcbiAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKChrKSA9PiAhcmVzdWx0IHx8ICFyZXN1bHRba10pKSB7XG4gICAgbGV0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIGlmIGEgbmVzdGVkIE1vZGVsXG4gICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnMuZmlsdGVyKFxuICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT5cbiAgICAgICAgW01vZGVsS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5UWVBFIGFzIHN0cmluZ10uaW5kZXhPZihkLmtleSkgIT09IC0xXG4gICAgKTtcbiAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWMgPSBkZWNvcmF0b3JzLnBvcCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgIGNvbnN0IGNsYXp6ID0gZGVjLnByb3BzLm5hbWVcbiAgICAgID8gW2RlYy5wcm9wcy5uYW1lXVxuICAgICAgOiBBcnJheS5pc0FycmF5KGRlYy5wcm9wcy5jdXN0b21UeXBlcylcbiAgICAgICAgPyBkZWMucHJvcHMuY3VzdG9tVHlwZXNcbiAgICAgICAgOiBbZGVjLnByb3BzLmN1c3RvbVR5cGVzXTtcbiAgICBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT5cbiAgICAgIHYudG9Mb3dlckNhc2UoKVxuICAgICkgYXMgc3RyaW5nW107XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2xhenopIHtcbiAgICAgIGlmIChyZXNlcnZlZC5pbmRleE9mKGMudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHR5cGVEZWNvcmF0b3JLZXkgPSBBcnJheS5pc0FycmF5KChvYmogYXMgYW55KVtwcm9wXSlcbiAgICAgICAgICA/IFZhbGlkYXRpb25LZXlzLkxJU1RcbiAgICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEU7XG4gICAgICAgIGNvbnN0IHR5cGVzOiBhbnkgPVxuICAgICAgICAgIGFsbERlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAgIChkOiB7IGtleTogc3RyaW5nIH0pID0+IGQua2V5ID09PSB0eXBlRGVjb3JhdG9yS2V5XG4gICAgICAgICAgKSB8fCB7fTtcbiAgICAgICAgbGV0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVzICYmIHR5cGVzLnByb3BzKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tVHlwZXMgPSBBcnJheS5pc0FycmF5KChvYmogYXMgYW55KVtwcm9wXSlcbiAgICAgICAgICAgID8gdHlwZXMucHJvcHMuY2xhc3NcbiAgICAgICAgICAgIDogdHlwZXMucHJvcHMuY3VzdG9tVHlwZXM7XG4gICAgICAgICAgaWYgKGN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzID0gQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcylcbiAgICAgICAgICAgICAgPyBjdXN0b21UeXBlcy5tYXAoKHQpID0+IGAke3R9YC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICA6IFtjdXN0b21UeXBlcy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlID0gKHByb3A6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICF2YWx1ZVtWQUxJREFUSU9OX1BBUkVOVF9LRVldKVxuICAgICAgICAgICAgICB2YWx1ZVtWQUxJREFUSU9OX1BBUkVOVF9LRVldID0gb2JqOyAvLyBUT0RPOiBmcmVlemU/XG5cbiAgICAgICAgICAgIHJldHVybiBNb2RlbC5pc01vZGVsKHZhbHVlKVxuICAgICAgICAgICAgICA/IHZhbHVlLmhhc0Vycm9ycygpXG4gICAgICAgICAgICAgIDogYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogXCJWYWx1ZSBoYXMgbm8gdmFsaWRhdGFibGUgdHlwZVwiO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWVbVkFMSURBVElPTl9QQVJFTlRfS0VZXSlcbiAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW1ZBTElEQVRJT05fUEFSRU5UX0tFWV07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgQXJyYXkubmFtZTpcbiAgICAgICAgICBjYXNlIFNldC5uYW1lOlxuICAgICAgICAgICAgaWYgKGFsbERlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBhbGxEZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1RcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGxpc3REZWMpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSAoXG4gICAgICAgICAgICAgICAgICBjID09PSBBcnJheS5uYW1lXG4gICAgICAgICAgICAgICAgICAgID8gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXVxuICAgICAgICAgICAgICAgICAgICA6IC8vIElmIGl0J3MgYSBTZXRcbiAgICAgICAgICAgICAgICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdLnZhbHVlcygpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLm1hcCgodjogVmFsaWRhdGFibGUpID0+IHZhbGlkYXRlKHByb3AsIHYpKVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZTogYW55KSA9PiAhIWUpIGFzIGFueTtcbiAgICAgICAgICAgICAgICBpZiAoIWVycj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGxpc3QuLi5cbiAgICAgICAgICAgICAgICAgIGVyciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSlcbiAgICAgICAgICAgICAgICBlcnIgPSB2YWxpZGF0ZShwcm9wLCAob2JqIGFzIGFueSlbcHJvcF0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXRzIG5vdDogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0W3Byb3BdID0gZXJyIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdCkgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsS2V5KHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBNb2RlbEtleXMuUkVGTEVDVCArIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIGdldE1vZGVsS2V5KE1vZGVsS2V5cy5NT0RFTCksXG4gICAgbW9kZWwuY29uc3RydWN0b3JcbiAgKTtcbiAgaWYgKCFtZXRhZGF0YSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImNvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciBwcm92aWRlZCBcIiArIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICByZXR1cm4gbWV0YWRhdGE7XG59XG4iLCJpbXBvcnQgeyBTZXJpYWxpemF0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7IEJ1aWxkZXJSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgQ29tcGFyYWJsZSxcbiAgQ29uc3RydWN0b3IsXG4gIEhhc2hhYmxlLFxuICBNb2RlbEFyZyxcbiAgTW9kZWxCdWlsZGVyRnVuY3Rpb24sXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFNlcmlhbGl6YWJsZSxcbiAgVmFsaWRhdGFibGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgaXNFcXVhbCwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgdmFsaWRhdGUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIYXNoaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hhc2hpbmdcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGpzVHlwZXMsIFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRNb2RlbEtleSwgZ2V0TWV0YWRhdGEgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5sZXQgbW9kZWxCdWlsZGVyRnVuY3Rpb246IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xubGV0IGFjdGluZ01vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSB0eXBlIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIG1vZGVsIGNvbnN0cnVjdG9yc1xuICogQHN1bW1hcnkgVGhlIE1vZGVsUmVnaXN0cnkgdHlwZSBkZWZpbmVzIGEgcmVnaXN0cnkgZm9yIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGV4dGVuZHNcbiAqIHRoZSBCdWlsZGVyUmVnaXN0cnkgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gcmVnaXN0ZXIsIHJldHJpZXZlLFxuICogYW5kIGJ1aWxkIG1vZGVsIGluc3RhbmNlcywgZW5hYmxpbmcgdGhlIG1vZGVsIHN5c3RlbSB0byB3b3JrIHdpdGggZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVscy5cbiAqXG4gKiBAaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlcbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgbW9kZWwgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCwgbXVzdCBleHRlbmQgTW9kZWxcbiAqIEBleHRlbmRzIEJ1aWxkZXJSZWdpc3RyeTxUPlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnk8VCBleHRlbmRzIE1vZGVsPiA9IEJ1aWxkZXJSZWdpc3RyeTxUPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgbWFuYWdlciBmb3IgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgZW5hYmxlcyBzZXJpYWxpemF0aW9uIGFuZCByZWJ1aWxkaW5nXG4gKiBAc3VtbWFyeSBUaGUgTW9kZWxSZWdpc3RyeU1hbmFnZXIgaW1wbGVtZW50cyB0aGUgTW9kZWxSZWdpc3RyeSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzXG4gKiBmdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZywgcmV0cmlldmluZywgYW5kIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlcy4gSXQgbWFpbnRhaW5zXG4gKiBhIGNhY2hlIG9mIG1vZGVsIGNvbnN0cnVjdG9ycyBpbmRleGVkIGJ5IG5hbWUsIGFsbG93aW5nIGZvciBlZmZpY2llbnQgbG9va3VwIGFuZCBpbnN0YW50aWF0aW9uLlxuICogVGhpcyBjbGFzcyBpcyBlc3NlbnRpYWwgZm9yIHRoZSBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2YgbW9kZWwgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFufSBbdGVzdEZ1bmN0aW9uXSAtIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWwsIGRlZmF1bHRzIHRvIHtAbGluayBNb2RlbCNpc01vZGVsfVxuICpcbiAqIEBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlclxuICogQHRlbXBsYXRlIE0gVHlwZSBvZiBtb2RlbCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkLCBtdXN0IGV4dGVuZCBNb2RlbFxuICogQGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxNPlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG1vZGVsIHJlZ2lzdHJ5XG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcigpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGEgbW9kZWwgY2xhc3NcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKFVzZXIpO1xuICpcbiAqIC8vIFJldHJpZXZlIGEgbW9kZWwgY29uc3RydWN0b3IgYnkgbmFtZVxuICogY29uc3QgVXNlckNsYXNzID0gcmVnaXN0cnkuZ2V0KFwiVXNlclwiKTtcbiAqXG4gKiAvLyBCdWlsZCBhIG1vZGVsIGluc3RhbmNlIGZyb20gYSBwbGFpbiBvYmplY3RcbiAqIGNvbnN0IHVzZXJEYXRhID0geyBuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMCB9O1xuICogY29uc3QgdXNlciA9IHJlZ2lzdHJ5LmJ1aWxkKHVzZXJEYXRhLCBcIlVzZXJcIik7XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgTW9kZWxSZWdpc3RyeU1hbmFnZXJcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbCBDbGFzc1xuICpcbiAqICAgQy0+PlI6IG5ldyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcih0ZXN0RnVuY3Rpb24pXG4gKiAgIEMtPj5SOiByZWdpc3RlcihNb2RlbENsYXNzKVxuICogICBSLT4+UjogU3RvcmUgaW4gY2FjaGVcbiAqICAgQy0+PlI6IGdldChcIk1vZGVsTmFtZVwiKVxuICogICBSLS0+PkM6IE1vZGVsQ2xhc3MgY29uc3RydWN0b3JcbiAqICAgQy0+PlI6IGJ1aWxkKGRhdGEsIFwiTW9kZWxOYW1lXCIpXG4gKiAgIFItPj5SOiBHZXQgY29uc3RydWN0b3IgZnJvbSBjYWNoZVxuICogICBSLT4+TTogbmV3IE1vZGVsQ2xhc3MoZGF0YSlcbiAqICAgTS0tPj5SOiBNb2RlbCBpbnN0YW5jZVxuICogICBSLS0+PkM6IE1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcjxNIGV4dGVuZHMgTW9kZWw+IGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxNPiB7XG4gIHByaXZhdGUgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8TT4+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZ1bmN0aW9uOiAob2JqOiBvYmplY3QpID0+IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGVzdEZ1bmN0aW9uOiAob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBib29sZWFuID0gTW9kZWwuaXNNb2RlbFxuICApIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IHRlc3RGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbW9kZWwgY29uc3RydWN0b3Igd2l0aCB0aGUgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgQWRkcyBhIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHRoZSByZWdpc3RyeSBjYWNoZSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3JcbiAgICogbGF0ZXIgcmV0cmlldmFsIGFuZCBpbnN0YW50aWF0aW9uLiBJZiBubyBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0b3IncyBuYW1lXG4gICAqIHByb3BlcnR5IGlzIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3RvcjxNPn0gY29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIE9wdGlvbmFsIG5hbWUgdG8gcmVnaXN0ZXIgdGhlIGNvbnN0cnVjdG9yIHVuZGVyLCBkZWZhdWx0cyB0byBjb25zdHJ1Y3Rvci5uYW1lXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGEgZnVuY3Rpb25cbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPE0+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vZGVsIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yXCJcbiAgICAgICk7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNhY2hlW25hbWVdID0gY29uc3RydWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxNPiB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBjbGF6ej86IHN0cmluZyk6IE0ge1xuICAgIGlmICghY2xhenogJiYgIXRoaXMudGVzdEZ1bmN0aW9uKG9iaikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBvYmogaXMgbm90IGEgTW9kZWwgb2JqZWN0XCIpO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBNb2RlbC5nZXRNZXRhZGF0YShvYmogYXMgYW55KTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUHJvdmlkZWQgY2xhc3MgJHtuYW1lfSBpcyBub3QgYSByZWdpc3RlcmVkIE1vZGVsIG9iamVjdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNhY2hlW25hbWVdKG9iaik7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCdWxrIFJlZ2lzdGVycyBNb2RlbHNcbiAqIEBkZXNjcmlwdGlvbiBVc2VmdWwgd2hlbiB1c2luZyBidW5kbGVycyB0aGF0IG1pZ2h0IG5vdCBldmFsdWF0ZSBhbGwgdGhlIGNvZGUgYXQgb25jZVxuICpcbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7QXJyYXk8Q29uc3RydWN0b3I8TT4+IHwgQXJyYXk8e25hbWU6IHN0cmluZywgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+fT59IFttb2RlbHNdXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWxrTW9kZWxSZWdpc3RlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAuLi5tb2RlbHM6IChDb25zdHJ1Y3RvcjxNPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfSlbXVxuKSB7XG4gIG1vZGVscy5mb3JFYWNoKFxuICAgIChtOiBDb25zdHJ1Y3RvcjxNPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+ID0gKFxuICAgICAgICBtLmNvbnN0cnVjdG9yID8gbS5jb25zdHJ1Y3RvciA6IG1cbiAgICAgICkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBNb2RlbC5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgKG0gYXMgQ29uc3RydWN0b3I8TT4pLm5hbWUpO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBWYWxpZGF0YWJsZSBNb2RlbCBvYmplY3RcbiAqIEBkZXNjcmlwdGlvbiBNZWFudCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgYWxsIE1vZGVsIGNsYXNzZXNcbiAqXG4gKiBNb2RlbCBvYmplY3RzIG11c3Q6XG4gKiAgLSBIYXZlIGFsbCB0aGVpciByZXF1aXJlZCBwcm9wZXJ0aWVzIG1hcmtlZCB3aXRoICchJztcbiAqICAtIEhhdmUgYWxsIHRoZWlyIG9wdGlvbmFsIHByb3BlcnRpZXMgbWFya2VkIGFzICc/JzpcbiAqXG4gKiBAcGFyYW0ge01vZGVsQXJnPE1vZGVsPn0gbW9kZWwgYmFzZSBvYmplY3QgZnJvbSB3aGljaCB0byBwb3B1bGF0ZSBwcm9wZXJ0aWVzIGZyb21cbiAqXG4gKiBAY2xhc3MgTW9kZWxcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGFic3RyYWN0XG4gKiBAaW1wbGVtZW50cyBWYWxpZGF0YWJsZVxuICogQGltcGxlbWVudHMgU2VyaWFsaXphYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgIEByZXF1aXJlZCgpXG4gKiAgICAgICAgICByZXF1aXJlZFByb3BlcnR5TmFtZSE6IFByb3BlcnR5VHlwZTtcbiAqXG4gKiAgICAgICAgICBvcHRpb25hbFByb3BlcnR5TmFtZT86IFByb3BlcnR5VHlwZTtcbiAqICAgICAgfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9kZWxcbiAgaW1wbGVtZW50cyBWYWxpZGF0YWJsZSwgU2VyaWFsaXphYmxlLCBIYXNoYWJsZSwgQ29tcGFyYWJsZTxNb2RlbD5cbntcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8TW9kZWw+KSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoZSBtb2RlbCBvYmplY3QgYWdhaW5zdCBpdHMgZGVmaW5lZCB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgb2JqZWN0IGFjY29yZGluZyB0byBpdHMgZGVjb3JhdGVkIHByb3BlcnRpZXMsIHJldHVybmluZyBhbnkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICpcbiAgICogQHBhcmFtIHthbnlbXX0gW2V4Y2VwdGlvbnNdIC0gUHJvcGVydGllcyBpbiB0aGUgb2JqZWN0IHRvIGJlIGlnbm9yZWQgZm9yIHRoZSB2YWxpZGF0aW9uLiBNYXJrZWQgYXMgJ2FueScgdG8gYWxsb3cgZm9yIGV4dGVuc2lvbiBidXQgZXhwZWN0cyBzdHJpbmdzXG4gICAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkfSAtIFJldHVybnMgYSBNb2RlbEVycm9yRGVmaW5pdGlvbiBvYmplY3QgaWYgdmFsaWRhdGlvbiBlcnJvcnMgZXhpc3QsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoLi4uZXhjZXB0aW9uczogYW55W10pOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKHRoaXMsIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoaXMgbW9kZWwgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3RcbiAgICogQHN1bW1hcnkgQ29tcGFyZSBvYmplY3QgZXF1YWxpdHkgcmVjdXJzaXZlbHksIGNoZWNraW5nIGFsbCBwcm9wZXJ0aWVzIHVubGVzcyBleGNsdWRlZFxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gb2JqIC0gT2JqZWN0IHRvIGNvbXBhcmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2V4Y2VwdGlvbnNdIC0gUHJvcGVydHkgbmFtZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvblxuICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIGVxdWFscyhvYmo6IGFueSwgLi4uZXhjZXB0aW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLCBvYmosIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgbW9kZWwgdG8gYSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIG1vZGVsIGFjY29yZGluZyB0byB0aGUgY3VycmVudGx5IGRlZmluZWQge0BsaW5rIFNlcmlhbGl6ZXJ9XG4gICAqIFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1vZGVsLnNlcmlhbGl6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IganMncyAndG9TdHJpbmcoKScgdG8gcHJvdmlkZSBhIG1vcmUgdXNlZnVsIHJlcHJlc2VudGF0aW9uXG4gICAqIFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIGluY2x1ZGluZyBpdHMgY2xhc3MgbmFtZSBhbmQgSlNPTiByZXByZXNlbnRhdGlvblxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLCB1bmRlZmluZWQsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBoYXNoIHN0cmluZyBmb3IgdGhlIG1vZGVsIG9iamVjdFxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igb2JqZWN0IGhhc2gsIHJlbHlpbmcgb24gYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBKYXZhJ3Mgc3RyaW5nIGhhc2hcbiAgICogXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBBIGhhc2ggc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbW9kZWxcbiAgICovXG4gIHB1YmxpYyBoYXNoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1vZGVsLmhhc2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc2VyaWFsaXplZCBzdHJpbmcgYmFjayBpbnRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgRGVzZXJpYWxpemVzIGEgTW9kZWwgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc2VyaWFsaXplZCBzdHJpbmcgdG8gY29udmVydCBiYWNrIHRvIGEgbW9kZWxcbiAgICogQHJldHVybiB7YW55fSAtIFRoZSBkZXNlcmlhbGl6ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIGlmIGl0IGZhaWxzIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSxcbiAgICAgIHRoaXMuY29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgaWYgKG1ldGFkYXRhICYmIG1ldGFkYXRhLnNlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShcbiAgICAgICAgc3RyLFxuICAgICAgICBtZXRhZGF0YS5zZXJpYWxpemVyLFxuICAgICAgICAuLi4obWV0YWRhdGEuYXJncyB8fCBbXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29waWVzIHByb3BlcnRpZXMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgT2JqZWN0IHByb3BlcnRpZXMgd2l0aCB0aGUgb25lcyBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VH0gc2VsZiAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2UgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdIC0gVGhlIHNvdXJjZSBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNvcHlcbiAgICogQHJldHVybiB7VH0gLSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Q8VCBleHRlbmRzIE1vZGVsPihcbiAgICBzZWxmOiBULFxuICAgIG9iaj86IFQgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFQge1xuICAgIGlmICghb2JqKSBvYmogPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKSkge1xuICAgICAgKHNlbGYgYXMgYW55KVtwcm9wXSA9IChvYmogYXMgYW55KVtwcm9wXSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb3BpZXMgYW5kIHJlYnVpbGRzIHByb3BlcnRpZXMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSBtb2RlbCBpbnN0YW5jZSwgaGFuZGxpbmcgbmVzdGVkIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0aWVzIGZyb20gdGhlIG5ldyBNb2RlbCBPYmplY3QsIHJlY3Vyc2l2ZWx5IHJlYnVpbGRpbmcgbmVzdGVkIG1vZGVsc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1R9IHNlbGYgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1QgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb2JqXSAtIFRoZSBzb3VyY2Ugb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjb3B5XG4gICAqIEByZXR1cm4ge1R9IC0gVGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2Ugd2l0aCByZWJ1aWx0IG5lc3RlZCBtb2RlbHNcbiAgICogXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbC5mcm9tTW9kZWxcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE1vZGVsLmJ1aWxkXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0aW9uXG4gICAqICAgXG4gICAqICAgQy0+Pk06IGZyb21Nb2RlbChzZWxmLCBvYmopXG4gICAqICAgTS0+Pk06IEdldCBhdHRyaWJ1dGVzIGZyb20gc2VsZlxuICAgKiAgIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgIE0tPj5NOiBDb3B5IHByb3BlcnR5IGZyb20gb2JqIHRvIHNlbGZcbiAgICogICAgIGFsdCBQcm9wZXJ0eSBpcyBhIG1vZGVsXG4gICAqICAgICAgIE0tPj5NOiBDaGVjayBpZiBwcm9wZXJ0eSBpcyBhIG1vZGVsXG4gICAqICAgICAgIE0tPj5COiBidWlsZChwcm9wZXJ0eSwgbW9kZWxUeXBlKVxuICAgKiAgICAgICBCLS0+Pk06IFJldHVybiBidWlsdCBtb2RlbFxuICAgKiAgICAgZWxzZSBQcm9wZXJ0eSBpcyBhIGNvbXBsZXggdHlwZVxuICAgKiAgICAgICBNLT4+UjogR2V0IHByb3BlcnR5IGRlY29yYXRvcnNcbiAgICogICAgICAgUi0tPj5NOiBSZXR1cm4gZGVjb3JhdG9yc1xuICAgKiAgICAgICBNLT4+TTogRmlsdGVyIHR5cGUgZGVjb3JhdG9yc1xuICAgKiAgICAgICBhbHQgUHJvcGVydHkgaXMgQXJyYXkvU2V0IHdpdGggbGlzdCBkZWNvcmF0b3JcbiAgICogICAgICAgICBNLT4+TTogUHJvY2VzcyBlYWNoIGl0ZW0gaW4gY29sbGVjdGlvblxuICAgKiAgICAgICAgIGxvb3AgRm9yIGVhY2ggaXRlbVxuICAgKiAgICAgICAgICAgTS0+PkI6IGJ1aWxkKGl0ZW0sIGl0ZW1Nb2RlbFR5cGUpXG4gICAqICAgICAgICAgICBCLS0+Pk06IFJldHVybiBidWlsdCBtb2RlbFxuICAgKiAgICAgICAgIGVuZFxuICAgKiAgICAgICBlbHNlIFByb3BlcnR5IGlzIGFub3RoZXIgbW9kZWwgdHlwZVxuICAgKiAgICAgICAgIE0tPj5COiBidWlsZChwcm9wZXJ0eSwgcHJvcGVydHlUeXBlKVxuICAgKiAgICAgICAgIEItLT4+TTogUmV0dXJuIGJ1aWx0IG1vZGVsXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgTS0tPj5DOiBSZXR1cm4gdXBkYXRlZCBzZWxmXG4gICAqL1xuICBzdGF0aWMgZnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbD4oc2VsZjogVCwgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUIHtcbiAgICBpZiAoIW9iaikgb2JqID0ge307XG5cbiAgICBsZXQgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSwgZGVjOiBEZWNvcmF0b3JNZXRhZGF0YTtcblxuICAgIGNvbnN0IHByb3BzID0gTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPVxuICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID8/IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgKHNlbGYgYXMgYW55KVtwcm9wXSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgICBjb25zdCBwcm9wTSA9IE1vZGVsLmlzUHJvcGVydHlNb2RlbChzZWxmLCBwcm9wKTtcbiAgICAgIGlmIChwcm9wTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSxcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wTSA9PT0gXCJzdHJpbmdcIiA/IHByb3BNIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbERlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gPVxuICAgICAgICBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgcHJvcFxuICAgICAgICApLmRlY29yYXRvcnM7XG4gICAgICBkZWNvcmF0b3JzID0gYWxsRGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAgIChkOiBEZWNvcmF0b3JNZXRhZGF0YSkgPT5cbiAgICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEUgYXMgc3RyaW5nXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICAgICk7XG4gICAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBmaW5kIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcH1gKTtcbiAgICAgIGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICBjb25zdCBjbGF6eiA9IGRlYy5wcm9wcy5uYW1lXG4gICAgICAgID8gW2RlYy5wcm9wcy5uYW1lXVxuICAgICAgICA6IEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICAgID8gZGVjLnByb3BzLmN1c3RvbVR5cGVzXG4gICAgICAgICAgOiBbZGVjLnByb3BzLmN1c3RvbVR5cGVzXTtcbiAgICAgIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PlxuICAgICAgICB2LnRvTG93ZXJDYXNlKClcbiAgICAgICkgYXMgc3RyaW5nW107XG5cbiAgICAgIGNsYXp6LmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlNldFwiOlxuICAgICAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IGFsbERlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKGxpc3REZWMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhenpOYW1lID0gKGxpc3REZWMucHJvcHMuY2xhenogYXMgc3RyaW5nW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKHQ6IHN0cmluZykgPT4gIWpzVHlwZXMuaW5jbHVkZXModC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCJBcnJheVwiKVxuICAgICAgICAgICAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgKVtwcm9wXS5tYXAoKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXCJvYmplY3RcIiwgXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlb2YgZWwpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1vZGVsLmJ1aWxkKGVsLCBjbGF6ek5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogZWw7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBcIlNldFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib2JqZWN0XCIsIFwiZnVuY3Rpb25cIl0uaW5jbHVkZXModHlwZW9mIHYpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKE1vZGVsLmJ1aWxkKHYsIGNsYXp6TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGQodik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pXG4gICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IE1vZGVsLmJ1aWxkKFxuICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBhbnkpW3Byb3BdLFxuICAgICAgICAgICAgICAgICAgICBjXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYXZlIG5vIHJlZ2lzdHJ5IG9mIHRoaXMgY2xhc3NcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgdGhlIGdsb2JhbCBtb2RlbCBidWlsZGVyIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIEdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IHVzZWQgZm9yIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlc1xuICAgKlxuICAgKiBAcGFyYW0ge01vZGVsQnVpbGRlckZ1bmN0aW9ufSBbYnVpbGRlcl0gLSBUaGUgYnVpbGRlciBmdW5jdGlvbiB0byBzZXQgYXMgdGhlIGdsb2JhbCBidWlsZGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0QnVpbGRlcihidWlsZGVyPzogTW9kZWxCdWlsZGVyRnVuY3Rpb24pIHtcbiAgICBtb2RlbEJ1aWxkZXJGdW5jdGlvbiA9IGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZ2xvYmFsIG1vZGVsIGJ1aWxkZXIgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufSB1c2VkIGZvciBidWlsZGluZyBtb2RlbCBpbnN0YW5jZXNcbiAgICpcbiAgICogQHJldHVybiB7TW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWR9IC0gVGhlIGN1cnJlbnQgZ2xvYmFsIGJ1aWxkZXIgZnVuY3Rpb24gb3IgdW5kZWZpbmVkIGlmIG5vdCBzZXRcbiAgICovXG4gIHN0YXRpYyBnZXRCdWlsZGVyKCk6IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbW9kZWxCdWlsZGVyRnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCBtb2RlbCByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBNb2RlbFJlZ2lzdHJ5TWFuYWdlcn0gaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqXG4gICAqIEByZXR1cm4ge01vZGVsUmVnaXN0cnk8YW55Pn0gLSBUaGUgY3VycmVudCBtb2RlbCByZWdpc3RyeSwgZGVmYXVsdHMgdG8gYSBuZXcge0BsaW5rIE1vZGVsUmVnaXN0cnlNYW5hZ2VyfSBpZiBub3Qgc2V0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIWFjdGluZ01vZGVsUmVnaXN0cnkpIGFjdGluZ01vZGVsUmVnaXN0cnkgPSBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIoKTtcbiAgICByZXR1cm4gYWN0aW5nTW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyB0aGUgbW9kZWwgcmVnaXN0cnkgdG8gYmUgdXNlZCBieSB0aGUgTW9kZWwgc3lzdGVtXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGN1cnJlbnQgbW9kZWwgcmVnaXN0cnkgdG8gYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtCdWlsZGVyUmVnaXN0cnk8YW55Pn0gbW9kZWxSZWdpc3RyeSAtIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkobW9kZWxSZWdpc3RyeTogQnVpbGRlclJlZ2lzdHJ5PGFueT4pIHtcbiAgICBhY3RpbmdNb2RlbFJlZ2lzdHJ5ID0gbW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbW9kZWwgY29uc3RydWN0b3Igd2l0aCB0aGUgbW9kZWwgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIG5ldyBtb2RlbCBjbGFzc2VzIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgZm9yIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvblxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8VD59IGNvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBPcHRpb25hbCBuYW1lIHRvIHJlZ2lzdGVyIHRoZSBjb25zdHJ1Y3RvciB1bmRlciwgZGVmYXVsdHMgdG8gY29uc3RydWN0b3IubmFtZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIE1vZGVsPihcbiAgICBjb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvcjxUPixcbiAgICBuYW1lPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKGNvbnN0cnVjdG9yLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBtb2RlbCBjb25zdHJ1Y3RvciBieSBuYW1lXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfSBmcm9tIHRoZSBtb2RlbCByZWdpc3RyeVxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtNb2RlbENvbnN0cnVjdG9yPFQ+IHwgdW5kZWZpbmVkfSAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKiBcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBNb2RlbD4obmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBhIHBsYWluIG9iamVjdFxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBtb2RlbCBpbnN0YW5jZSB1c2luZyB0aGUgbW9kZWwgcmVnaXN0cnksIG9wdGlvbmFsbHkgc3BlY2lmeWluZyB0aGUgbW9kZWwgY2xhc3NcbiAgICpcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc291cmNlIG9iamVjdCB0byBidWlsZCB0aGUgbW9kZWwgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXp6XSAtIFdoZW4gcHJvdmlkZWQsIGl0IHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBtYXRjaGluZyBjb25zdHJ1Y3RvciBieSBuYW1lXG4gICAqIEByZXR1cm4ge1R9IC0gVGhlIGJ1aWx0IG1vZGVsIGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjbGF6eiBpcyBub3QgZm91bmQsIG9yIG9iaiBpcyBub3QgYSB7QGxpbmsgTW9kZWx9IG1lYW5pbmcgaXQgaGFzIG5vIHtAbGluayBNb2RlbEtleXMuQU5DSE9SfSBwcm9wZXJ0eVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBidWlsZDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGNsYXp6Pzogc3RyaW5nXG4gICk6IFQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLmJ1aWxkKG9iaiwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIG1vZGVsIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbCBpbnN0YW5jZSwgdHlwaWNhbGx5IHRoZSBtb2RlbCBjbGFzcyBuYW1lXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gZ2V0IG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBtb2RlbCBtZXRhZGF0YSAodHlwaWNhbGx5IHRoZSBjbGFzcyBuYW1lKVxuICAgKi9cbiAgc3RhdGljIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICByZXR1cm4gZ2V0TWV0YWRhdGE8TT4obW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGEgbW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgR2V0cyBhbGwgYXR0cmlidXRlcyBkZWZpbmVkIGluIGEgbW9kZWwsIHRyYXZlcnNpbmcgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBpbmNsdWRlIGluaGVyaXRlZCBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8Vj4gfCBWfSBtb2RlbCAtIFRoZSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZSB0byBnZXQgYXR0cmlidXRlcyBmcm9tXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSAtIEFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGdldEF0dHJpYnV0ZXM8ViBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8Vj4gfCBWKSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBwcm90b3R5cGUgPVxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbFxuICAgICAgICA/IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcbiAgICAgICAgOiAobW9kZWwgYXMgYW55KS5wcm90b3R5cGU7XG4gICAgd2hpbGUgKHByb3RvdHlwZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwcm9wczogc3RyaW5nW10gPSBwcm90b3R5cGVbTW9kZWxLZXlzLkFUVFJJQlVURV07XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4ucHJvcHMpO1xuICAgICAgfVxuICAgICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBhcmVzIHR3byBtb2RlbCBpbnN0YW5jZXMgZm9yIGVxdWFsaXR5XG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgdHdvIG1vZGVsIGluc3RhbmNlcyBhcmUgZXF1YWwgYnkgY29tcGFyaW5nIHRoZWlyIHByb3BlcnRpZXNcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBvYmoxIC0gRmlyc3QgbW9kZWwgaW5zdGFuY2UgdG8gY29tcGFyZVxuICAgKiBAcGFyYW0ge019IG9iajIgLSBTZWNvbmQgbW9kZWwgaW5zdGFuY2UgdG8gY29tcGFyZVxuICAgKiBAcGFyYW0ge2FueVtdfSBbZXhjZXB0aW9uc10gLSBQcm9wZXJ0eSBuYW1lcyB0byBleGNsdWRlIGZyb20gY29tcGFyaXNvblxuICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG1vZGVscyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgc3RhdGljIGVxdWFsczxNIGV4dGVuZHMgTW9kZWw+KG9iajE6IE0sIG9iajI6IE0sIC4uLmV4Y2VwdGlvbnM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGlzRXF1YWwob2JqMSwgb2JqMiwgLi4uZXhjZXB0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhIG1vZGVsIGluc3RhbmNlIGFnYWluc3QgaXRzIHZhbGlkYXRpb24gcnVsZXNcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgbW9kZWwgaGFzIHZhbGlkYXRpb24gZXJyb3JzLCBvcHRpb25hbGx5IGlnbm9yaW5nIHNwZWNpZmllZCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIC0gUHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICAgKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzIGlmIGFueSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGhhc0Vycm9yczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShtb2RlbCwgLi4ucHJvcHNUb0lnbm9yZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgdG8gYSBzZXJpYWxpemVkIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgc2VyaWFsaXplciBvciB0aGUgZGVmYXVsdCBvbmVcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuc2VyaWFsaXplcilcbiAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbWV0YWRhdGEuc2VyaWFsaXplcixcbiAgICAgICAgLi4uKG1ldGFkYXRhLmFyZ3MgfHwgW10pXG4gICAgICApO1xuICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGhhc2ggc3RyaW5nIGZvciBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBoYXNoIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kZWwgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWxnb3JpdGhtIG9yIHRoZSBkZWZhdWx0IG9uZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGhhc2hcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBoYXNoIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1vZGVsXG4gICAqL1xuICBzdGF0aWMgaGFzaDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5IQVNISU5HKSxcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5hbGdvcml0aG0pXG4gICAgICByZXR1cm4gSGFzaGluZy5oYXNoKG1vZGVsLCBtZXRhZGF0YS5hbGdvcml0aG0sIC4uLihtZXRhZGF0YS5hcmdzIHx8IFtdKSk7XG4gICAgcmV0dXJuIEhhc2hpbmcuaGFzaChtb2RlbCk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5IGZvciB1c2Ugd2l0aCB0aGUgUmVmbGVjdGlvbiBBUElcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBiYXNlIGtleSB0byBjb25jYXRlbmF0ZSB3aXRoIHRoZSBtb2RlbCByZWZsZWN0aW9uIHByZWZpeFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBnZXRNb2RlbEtleShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YVxuICAgKiBAc3VtbWFyeSBDaGVja3Mgd2hldGhlciBhIGdpdmVuIG9iamVjdCBpcyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIE1vZGVsIGNsYXNzIG9yXG4gICAqIGhhcyBtb2RlbCBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdC4gVGhpcyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIHNlcmlhbGl6YXRpb24gYW5kXG4gICAqIGRlc2VyaWFsaXphdGlvbiBwcm9jZXNzZXMsIGFzIGl0IGhlbHBzIGlkZW50aWZ5IG1vZGVsIG9iamVjdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAqIEl0IHNhZmVseSBoYW5kbGVzIHBvdGVudGlhbCBlcnJvcnMgZHVyaW5nIG1ldGFkYXRhIHJldHJpZXZhbC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgLSBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWxcbiAgICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogXCJKb2huXCIgfSk7XG4gICAqIGNvbnN0IGlzVXNlck1vZGVsID0gaXNNb2RlbCh1c2VyKTsgLy8gdHJ1ZVxuICAgKlxuICAgKiAvLyBDaGVjayBhIHBsYWluIG9iamVjdFxuICAgKiBjb25zdCBwbGFpbk9iamVjdCA9IHsgbmFtZTogXCJKb2huXCIgfTtcbiAgICogY29uc3QgaXNQbGFpbk9iamVjdE1vZGVsID0gaXNNb2RlbChwbGFpbk9iamVjdCk7IC8vIGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGlzTW9kZWwodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbCB8fCAhIU1vZGVsLmdldE1ldGFkYXRhKHRhcmdldCBhcyBhbnkpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgcHJvcGVydHkgb2YgYSBtb2RlbCBpcyBpdHNlbGYgYSBtb2RlbCBvciBoYXMgYSBtb2RlbCB0eXBlXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgbW9kZWwgaW5zdGFuY2UgaXMgZWl0aGVyIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogb3IgaGFzIGEgdHlwZSB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgYSBtb2RlbFxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IHRhcmdldCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjaGVja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGEgbW9kZWwgaW5zdGFuY2UsXG4gICAqIHRoZSBtb2RlbCBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYSBtb2RlbCB0eXBlLCBvciB1bmRlZmluZWQgaWYgbm90IGEgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBpc1Byb3BlcnR5TW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgYXR0cmlidXRlOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKE1vZGVsLmlzTW9kZWwoKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVthdHRyaWJ1dGVdKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1vZGVsS2V5cy5UWVBFLCB0YXJnZXQsIGF0dHJpYnV0ZSk7XG4gICAgcmV0dXJuIE1vZGVsLmdldChtZXRhZGF0YS5uYW1lKSA/IG1ldGFkYXRhLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VyaWFsaXphdGlvbk1ldGhvZCA9IFwianNvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIFNlcmlhbGl6ZXJ9IGluIEpTT04gZm9ybWF0XG4gKiBAZGVzY3JpcHRpb24gSlMncyBuYXRpdmUgSlNPTi5zdHJpbmdpZnkgKHVzZWQgaGVyZSkgaXMgbm90IGRldGVybWluaXN0aWNcbiAqIGFuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBoYXNoaW5nIHB1cnBvc2VzXG4gKlxuICogVG8ga2VlcCBkZXBlbmRlbmNpZXMgbG93LCB3ZSB3aWxsIG5vdCBpbXBsZW1lbnQgdGhpcywgYnV0IHdlIHJlY29tbWVuZFxuICogaW1wbGVtZW50aW5nIGEgc2ltaWxhciB7QGxpbmsgSlNPTlNlcmlhbGl6ZXJ9IHVzaW5nICdkZXRlcm1pbmlzdGljLWpzb24nIGxpYnJhcmllc1xuICpcbiAqIEBjbGFzcyBKU09OU2VyaWFsaXplclxuICogQGltcGxlbWVudHMgU2VyaWFsaXplclxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSlNPTlNlcmlhbGl6ZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIFNlcmlhbGl6ZXI8VD4ge1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBwcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHNlcmlhbGl6YXRpb25cbiAgICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIG9iamVjdCwgY29udGFpbmluZyBhbiBlbnVtZXJhYmxlIHtAbGluayBNb2RlbEtleXMjQU5DSE9SfSBwcm9wZXJ0eVxuICAgKiBzbyB0aGUgb2JqZWN0IGNhbiBiZSByZWNvZ25pemVkIHVwb24gZGVzZXJpYWxpemF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VH0gbW9kZWxcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZVNlcmlhbGl6ZShtb2RlbDogVCkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YShtb2RlbCk7XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gYSBzZXJpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBUIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IFQgPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBUO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWxcbiAgICogQHBhcmFtIHtUfSBtb2RlbFxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgZmFpbHMgdG8gc2VyaWFsaXplXG4gICAqL1xuICBzZXJpYWxpemUobW9kZWw6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDogc3RyaW5nID0gRGVmYXVsdFNlcmlhbGl6YXRpb25NZXRob2Q7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6ZXI8YW55Pj4gPSB7XG4gICAganNvbjogbmV3IEpTT05TZXJpYWxpemVyKCksXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzZXJpYWxpemF0aW9uIG1ldGhvZCByZWdpc3RlcmVkIHVuZGVyICR7a2V5fWApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZ1bmM6IENvbnN0cnVjdG9yPFNlcmlhbGl6ZXI8YW55Pj4sXG4gICAgc2V0RGVmYXVsdCA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VyaWFsaXphdGlvbiBtZXRob2QgJHtrZXl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIHRoaXMuY2FjaGVba2V5XSA9IG5ldyBmdW5jKCk7XG4gICAgaWYgKHNldERlZmF1bHQpIHRoaXMuY3VycmVudCA9IGtleTtcbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqOiBhbnksIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkuc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG1ldGhvZCkuc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUob2JqOiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkuZGVzZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKS5kZXNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICB9XG5cbiAgc3RhdGljIHNldERlZmF1bHQobWV0aG9kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmdldChtZXRob2QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgY2xhc3MgYXMgYSB2YWxpZGF0b3IgZm9yIGEgY2VydGFpbiBrZXkuXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIHRoZSBjbGFzcyBpbiB0aGUge0BsaW5rIFZhbGlkYXRpb259IHdpdGggdGhlIHByb3ZpZGVkIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlzIHRoZSB2YWxpZGF0aW9uIGtleVxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdG9yPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KC4uLmtleXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseShcbiAgICAoKG9yaWdpbmFsOiBDb25zdHJ1Y3RvcjxUPikgPT4ge1xuICAgICAga2V5cy5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgVmFsaWRhdGlvbi5yZWdpc3Rlcih7XG4gICAgICAgICAgdmFsaWRhdG9yOiBvcmlnaW5hbCxcbiAgICAgICAgICB2YWxpZGF0aW9uS2V5OiBrLFxuICAgICAgICAgIHNhdmU6IHRydWUsXG4gICAgICAgIH0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbDtcbiAgICB9KSBhcyBDbGFzc0RlY29yYXRvcixcbiAgICBtZXRhZGF0YShWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5WQUxJREFUT1IpLCBrZXlzKVxuICApO1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0ZVZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHN1bW1hcnkgVGhlIERhdGVWYWxpZGF0b3IgY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSB2YWxpZCBkYXRlLlxuICogSXQgdmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIHJlcHJlc2VudHMgYSByZWFsIGRhdGUgYW5kIG5vdCBhbiBpbnZhbGlkIGRhdGUgbGlrZSBcIjIwMjMtMDItMzFcIi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqIEBjbGFzcyBEYXRlVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGRhdGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBkYXRlVmFsaWRhdG9yID0gbmV3IERhdGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBkYXRlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21EYXRlVmFsaWRhdG9yID0gbmV3IERhdGVWYWxpZGF0b3IoXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIpO1xuICpcbiAqIC8vIFZhbGlkYXRlIGEgZGF0ZVxuICogY29uc3QgcmVzdWx0ID0gZGF0ZVZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoKSk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gZGF0ZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJub3QgYSBkYXRlXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBEYXRlVmFsaWRhdG9yXG4gKlxuICogICBDLT4+VjogbmV3IERhdGVWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBzdHJpbmdcbiAqICAgICBWLT4+VjogQ29udmVydCB0byBEYXRlXG4gKiAgIGVuZFxuICogICBhbHQgRGF0ZSBpcyBpbnZhbGlkIChOYU4pXG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgRGF0ZSBpcyB2YWxpZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZW5kXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuREFURSlcbmV4cG9ydCBjbGFzcyBEYXRlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPERhdGVWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE51bWJlci5uYW1lLCBEYXRlLm5hbWUsIFN0cmluZy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBhIHZhbGlkIGRhdGVcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLFxuICAgKiBpdCBhdHRlbXB0cyB0byBjb252ZXJ0IGl0IHRvIGEgRGF0ZSBvYmplY3QuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgZGF0ZSBpcyBpbnZhbGlkLFxuICAgKiBvciB1bmRlZmluZWQgaWYgdGhlIGRhdGUgaXMgdmFsaWQgb3IgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZSwgY2FuIGJlIGEgRGF0ZSBvYmplY3Qgb3IgYSBzdHJpbmdcbiAgICogQHBhcmFtIHtEYXRlVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBEYXRlVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuXG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZS5nZXREYXRlKCkpKSB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2UgPSBcIlwiIH0gPSBvcHRpb25zO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWQUxJREFUSU9OX1BBUkVOVF9LRVkgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogU2FmZWx5IHJldHJpZXZlcyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBhIGRvdC1ub3RhdGVkIHBhdGggc3RyaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgZGVzaXJlZCBwcm9wZXJ0eSAoZS5nLiwgXCJ1c2VyLmFkZHJlc3Muc3RyZWV0XCIpLlxuICpcbiAqIEByZXR1cm5zIHtUfSAtIFRoZSB2YWx1ZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGhcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhdGggaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb2JqZWN0LlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGg8VD4ob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBUIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiIHx8ICFwYXRoLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfUEFUSCwgcGF0aCkpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBwYXJlbnQgZGlyZWN0b3J5IGFjY2VzcyAoLi4vKVxuICBjb25zdCBwYXJlbnRBY2Nlc3NvcnMgPSBwYXRoLm1hdGNoKC9cXC5cXC5cXC8vZykgfHwgW107XG4gIGNvbnN0IHBhcmVudExldmVsID0gcGFyZW50QWNjZXNzb3JzLmxlbmd0aDtcbiAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5cXC5cXC8vZywgXCJcIik7XG5cbiAgLy8gTmF2aWdhdGUgdXAgdGhlIHBhcmVudCBjaGFpblxuICBsZXQgY3VycmVudENvbnRleHQ6IGFueSA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRMZXZlbDsgaSsrKSB7XG4gICAgaWYgKCFjdXJyZW50Q29udGV4dCB8fCB0eXBlb2YgY3VycmVudENvbnRleHQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5DT05URVhUX05PVF9PQkpFQ1RfQ09NUEFSSVNPTiwgaSArIDEsIHBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY3VycmVudENvbnRleHRbVkFMSURBVElPTl9QQVJFTlRfS0VZXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5PX1BBUkVOVF9DT01QQVJJU09OLCBpICsgMSwgcGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dFtWQUxJREFUSU9OX1BBUkVOVF9LRVldO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBkb3Qgbm90YXRpb24gcGF0aFxuICBjb25zdCBwYXJ0cyA9IGNsZWFuUGF0aC5zcGxpdChcIi5cIik7XG4gIGxldCBjdXJyZW50VmFsdWU6IGFueSA9IGN1cnJlbnRDb250ZXh0O1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgcGFydCBpbiBjdXJyZW50VmFsdWVcbiAgICApIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcGFydF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnVGVtcGxhdGUgPVxuICAgICAgICBwYXJlbnRMZXZlbCA9PT0gMFxuICAgICAgICAgID8gQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRk9VTkRcbiAgICAgICAgICA6IHBhcmVudExldmVsID09PSAxXG4gICAgICAgICAgICA/IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0ZPVU5EX09OX1BBUkVOVFxuICAgICAgICAgICAgOiBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9GT1VORF9BRlRFUl9QQVJFTlQ7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihzZihlcnJvck1zZ1RlbXBsYXRlLCBwYXRoLCBwYXJ0LCBwYXJlbnRMZXZlbCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjdXJyZW50VmFsdWUgYXMgVDtcbn1cblxuY29uc3QgZ2V0VHlwZU5hbWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBcIm51bGxcIjtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIFwiRGF0ZVwiO1xuICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuIFwiTmFOXCI7XG4gIGlmICh2YWx1ZSA9PT0gSW5maW5pdHkpIHJldHVybiBcIkluZmluaXR5XCI7XG4gIGlmICh2YWx1ZSA9PT0gLUluZmluaXR5KSByZXR1cm4gXCItSW5maW5pdHlcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gXCJhcnJheVwiO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlO1xufTtcblxuY29uc3QgaXNTdXBwb3J0ZWQgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB1bmRlZmluZWQgfCBudW1iZXIgfCBiaWdpbnQgfCBEYXRlID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBOdW1iZXJzIG11c3QgYmUgZmluaXRlIChleGNsdWRlcyBOYU4sIEluZmluaXR5LCAtSW5maW5pdHkpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgZWxpZ2libGUgZm9yIGNvbXBhcmlzb24gdXNpbmcgPj0gb3IgPD0gb3BlcmF0b3JzLlxuICpcbiAqIFN1cHBvcnRlZCB0eXBlczogYHVuZGVmaW5lZGAsIGBudW1iZXJgLCBgYmlnaW50YCwgYW5kIGBEYXRlYC5cbiAqXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm90aCB2YWx1ZXMgYXJlIG9mIHN1cHBvcnRlZCB0eXBlcy5cbiAqXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGVpdGhlciB2YWx1ZSBpcyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBwb3J0ZWQoYSkgJiYgaXNTdXBwb3J0ZWQoYikpIHJldHVybiB0cnVlO1xuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IENvbXBhcmVzIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0cyBudW1iZXJzIGFuZCBkYXRlcy4gVGhyb3dzIGFuIGVycm9yIGZvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHthbnl9IGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgYWAgaXMgbGVzcyB0aGFuIGBiYCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgYGFgIG9yIGBiYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHZhbHVlcyBhcmUgb2YgbWlzbWF0Y2hlZCBvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGVzc1RoYW4oYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGEpIHx8IFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGIpKVxuICAgIHRocm93IG5ldyBFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5VTExfT1JfVU5ERUZJTkVEX0NPTVBBUklTT04pO1xuXG4gIC8vIFZhbGlkYXRlIHR5cGUgY29tcGF0aWJpbGl0eVxuICBjb25zdCBhVHlwZSA9IHR5cGVvZiBhO1xuICBjb25zdCBiVHlwZSA9IHR5cGVvZiBiO1xuXG4gIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAvLyBBbGxvdyBudW1iZXIgWCBiaWdpbnRcbiAgICBpZiAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyKGEpIDwgKGIgYXMgbnVtYmVyKTtcbiAgICBpZiAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICByZXR1cm4gKGEgYXMgbnVtYmVyKSA8IE51bWJlcihiKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5UWVBFX01JU01BVENIX0NPTVBBUklTT04sIGFUeXBlLCBiVHlwZSlcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIikgfHxcbiAgICAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4oYSkgfHwgTnVtYmVyLmlzTmFOKGIpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5BTl9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYSA8IGI7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4oYS5nZXRUaW1lKCkpIHx8IGlzTmFOKGIuZ2V0VGltZSgpKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX0RBVEVfQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpIDwgYi5nZXRUaW1lKCk7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmAuXG4gKiBTdXBwb3J0cyBjb21wYXJpc29uIGZvciBudW1iZXJzIGFuZCBEYXRlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGEgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0ge2FueX0gYiAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmAsIG90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIGBhYCBvciBgYmAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB2YWx1ZXMgYXJlIG9mIG1pc21hdGNoZWQgb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyZWF0ZXJUaGFuKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhKSB8fCBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhiKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OKTtcblxuICBjb25zdCBhVHlwZSA9IHR5cGVvZiBhO1xuICBjb25zdCBiVHlwZSA9IHR5cGVvZiBiO1xuXG4gIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAvLyBBbGxvdyBudW1iZXIgWCBiaWdpbnRcbiAgICBpZiAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyKGEpID4gKGIgYXMgbnVtYmVyKTtcbiAgICBpZiAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICByZXR1cm4gKGEgYXMgbnVtYmVyKSA+IE51bWJlcihiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlRZUEVfTUlTTUFUQ0hfQ09NUEFSSVNPTiwgYVR5cGUsIGJUeXBlKVxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKSB8fFxuICAgIChhVHlwZSA9PT0gXCJiaWdpbnRcIiAmJiBiVHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgKSB7XG4gICAgaWYgKE51bWJlci5pc05hTihhKSB8fCBOdW1iZXIuaXNOYU4oYikpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTkFOX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhID4gYjtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGlmIChpc05hTihhLmdldFRpbWUoKSkgfHwgaXNOYU4oYi5nZXRUaW1lKCkpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfREFURV9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPiBiLmdldFRpbWUoKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGlmZlZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IGdldFZhbHVlQnlQYXRoIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBEaWZmIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRGlmZlZhbGlkYXRvcn1cbiAqXG4gKiBAY2xhc3MgRGlmZlZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5ESUZGKVxuZXhwb3J0IGNsYXNzIERpZmZWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8RGlmZlZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ESUZGKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogRGlmZlZhbGlkYXRvck9wdGlvbnMsXG4gICAgaW5zdGFuY2U6IGFueVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGdldFZhbHVlQnlQYXRoKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5ESUZGXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkRJRkZdXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgc3RyaW5nIHBhdHRlcm5zIHdpdGggZmxhZ3NcbiAqIEBzdW1tYXJ5IFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIHBhdHRlcm5zIGluIHRoZSBmb3JtYXQgXCIvcGF0dGVybi9mbGFnc1wiLlxuICogSXQgY2FwdHVyZXMgdGhlIHBhdHRlcm4gYW5kIGZsYWdzIHNlcGFyYXRlbHksIGFsbG93aW5nIHRoZSBjcmVhdGlvbiBvZiBhIFJlZ0V4cCBvYmplY3RcbiAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzLlxuICpcbiAqIEBjb25zdCB7UmVnRXhwfVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2V4cFBhcnNlcjogUmVnRXhwID0gbmV3IFJlZ0V4cChcIl4vKC4rKS8oW2dpbXVzXSopJFwiKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAqIEBzdW1tYXJ5IFRoZSBQYXR0ZXJuVmFsaWRhdG9yIGNoZWNrcyBpZiBhIHN0cmluZyB2YWx1ZSBtYXRjaGVzIGEgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLlxuICogSXQgc3VwcG9ydHMgYm90aCBSZWdFeHAgb2JqZWN0cyBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBwYXR0ZXJucywgaW5jbHVkaW5nIHRob3NlIHdpdGggZmxhZ3MuXG4gKiBUaGlzIHZhbGlkYXRvciBpcyB0aGUgZm91bmRhdGlvbiBmb3Igc3BlY2lhbGl6ZWQgdmFsaWRhdG9ycyBsaWtlIEVtYWlsVmFsaWRhdG9yIGFuZCBVUkxWYWxpZGF0b3IsXG4gKiBhbmQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHBhdHRlcm4gZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFUVEVSTn1cbiAqXG4gKiBAY2xhc3MgUGF0dGVyblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHBhdHRlcm4gdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBwYXR0ZXJuVmFsaWRhdG9yID0gbmV3IFBhdHRlcm5WYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBwYXR0ZXJuIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21QYXR0ZXJuVmFsaWRhdG9yID0gbmV3IFBhdHRlcm5WYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IG1hdGNoIHRoZSByZXF1aXJlZCBmb3JtYXRcIik7XG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBSZWdFeHAgb2JqZWN0XG4gKiBjb25zdCByZWdleE9wdGlvbnMgPSB7IHBhdHRlcm46IC9eW0EtWl1bYS16XSskLyB9O1xuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiLCByZWdleE9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCByZWdleE9wdGlvbnMpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBzdHJpbmcgcGF0dGVyblxuICogY29uc3Qgc3RyaW5nT3B0aW9ucyA9IHsgcGF0dGVybjogXCJeXFxcXGR7M30tXFxcXGR7Mn0tXFxcXGR7NH0kXCIgfTtcbiAqIHBhdHRlcm5WYWxpZGF0b3IuaGFzRXJyb3JzKFwiMTIzLTQ1LTY3ODlcIiwgc3RyaW5nT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBzdHJpbmcgcGF0dGVybiB3aXRoIGZsYWdzXG4gKiBjb25zdCBmbGFnT3B0aW9ucyA9IHsgcGF0dGVybjogXCIvXmhlbGxvJC9pXCIgfTtcbiAqIHBhdHRlcm5WYWxpZGF0b3IuaGFzRXJyb3JzKFwiSGVsbG9cIiwgZmxhZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgUGF0dGVyblZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgZW1wdHlcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgcGF0dGVybiBpcyBtaXNzaW5nXG4gKiAgICAgVi0tPj5DOiBFcnJvcjogTWlzc2luZyBQYXR0ZXJuXG4gKiAgIGVsc2UgcGF0dGVybiBpcyBzdHJpbmdcbiAqICAgICBWLT4+VjogZ2V0UGF0dGVybihwYXR0ZXJuKVxuICogICBlbmRcbiAqICAgVi0+PlY6IFJlc2V0IHBhdHRlcm4ubGFzdEluZGV4XG4gKiAgIFYtPj5WOiBUZXN0IHZhbHVlIGFnYWluc3QgcGF0dGVyblxuICogICBhbHQgcGF0dGVybiB0ZXN0IHBhc3Nlc1xuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSBwYXR0ZXJuIHRlc3QgZmFpbHNcbiAqICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuZXhwb3J0IGNsYXNzIFBhdHRlcm5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHBhdHRlcm4gdG8gYSBSZWdFeHAgb2JqZWN0XG4gICAqIEBzdW1tYXJ5IFBhcnNlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgY29udmVydHMgaXQgdG8gYSBSZWdFeHAgb2JqZWN0LlxuICAgKiBJdCBoYW5kbGVzIGJvdGggc2ltcGxlIHN0cmluZyBwYXR0ZXJucyBhbmQgcGF0dGVybnMgd2l0aCBmbGFncyBpbiB0aGUgZm9ybWF0IFwiL3BhdHRlcm4vZmxhZ3NcIi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gLSBUaGUgc3RyaW5nIHBhdHRlcm4gdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtSZWdFeHB9IEEgUmVnRXhwIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHN0cmluZyBwYXR0ZXJuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldFBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUmVnRXhwIHtcbiAgICBpZiAoIXJlZ2V4cFBhcnNlci50ZXN0KHBhdHRlcm4pKSByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICBjb25zdCBtYXRjaDogYW55ID0gcGF0dGVybi5tYXRjaChyZWdleHBQYXJzZXIpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICogSWYgdGhlIHBhdHRlcm4gaXMgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGl0J3MgY29udmVydGVkIHRvIGEgUmVnRXhwIG9iamVjdCB1c2luZyB0aGUgZ2V0UGF0dGVybiBtZXRob2QuXG4gICAqIFRoZSBtZXRob2QgcmVzZXRzIHRoZSBwYXR0ZXJuJ3MgbGFzdEluZGV4IHByb3BlcnR5IHRvIGVuc3VyZSBjb25zaXN0ZW50IHZhbGlkYXRpb24gcmVzdWx0c1xuICAgKiBmb3IgcGF0dGVybnMgd2l0aCB0aGUgZ2xvYmFsIGZsYWcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgcGF0dGVyblxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gcGF0dGVybiBpcyBwcm92aWRlZCBpbiB0aGUgb3B0aW9uc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICBsZXQgeyBwYXR0ZXJuIH0gPSBvcHRpb25zO1xuICAgIGlmICghcGF0dGVybikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBQYXR0ZXJuXCIpO1xuICAgIHBhdHRlcm4gPSB0eXBlb2YgcGF0dGVybiA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuZ2V0UGF0dGVybihwYXR0ZXJuKSA6IHBhdHRlcm47XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwOyAvLyByZXNldHMgcGF0dGVybiBwb3NpdGlvbiBmb3IgcmVwZWF0IHZhbGlkYXRpb24gcmVxdWVzdHNcbiAgICByZXR1cm4gIXBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXG4gKiBAc3VtbWFyeSBUaGUgRW1haWxWYWxpZGF0b3IgY2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSBzdGFuZGFyZCBlbWFpbCBhZGRyZXNzIHBhdHRlcm4uXG4gKiBJdCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yIGFuZCB1c2VzIGEgcHJlZGVmaW5lZCBlbWFpbCByZWdleCBwYXR0ZXJuIHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3Nlcy5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBlbWFpbCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFTUFJTH1cbiAqXG4gKiBAY2xhc3MgRW1haWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGFuIGVtYWlsIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgZW1haWxWYWxpZGF0b3IgPSBuZXcgRW1haWxWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYW4gZW1haWwgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbUVtYWlsVmFsaWRhdG9yID0gbmV3IEVtYWlsVmFsaWRhdG9yKFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhbiBlbWFpbFxuICogY29uc3QgcmVzdWx0ID0gZW1haWxWYWxpZGF0b3IuaGFzRXJyb3JzKFwidXNlckBleGFtcGxlLmNvbVwiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIGNvbnN0IGludmFsaWRSZXN1bHQgPSBlbWFpbFZhbGlkYXRvci5oYXNFcnJvcnMoXCJpbnZhbGlkLWVtYWlsXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgRW1haWxWYWxpZGF0b3JcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogICBDLT4+RTogbmV3IEVtYWlsVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEUtPj5QOiBzdXBlcihtZXNzYWdlKVxuICogICBDLT4+RTogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBFLT4+UDogc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zIHdpdGggRU1BSUwgcGF0dGVybilcbiAqICAgUC0tPj5FOiB2YWxpZGF0aW9uIHJlc3VsdFxuICogICBFLS0+PkM6IHZhbGlkYXRpb24gcmVzdWx0XG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5FTUFJTClcbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVNQUlMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBlbWFpbCBwYXR0ZXJuLlxuICAgKiBUaGlzIG1ldGhvZCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZCBieSBlbnN1cmluZ1xuICAgKiB0aGUgZW1haWwgcGF0dGVybiBpcyB1c2VkLCBldmVuIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlIGFzIGFuIGVtYWlsIGFkZHJlc3NcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgUGF0dGVyblZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICBwYXR0ZXJuOiBvcHRpb25zPy5wYXR0ZXJuIHx8IERFRkFVTFRfUEFUVEVSTlMuRU1BSUwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IGdldFZhbHVlQnlQYXRoIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBFcXVhbHMgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFUVVBTFN9XG4gKlxuICogQGNsYXNzIEVxdWFsc1ZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5FUVVBTFMpXG5leHBvcnQgY2xhc3MgRXF1YWxzVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPEVxdWFsc1ZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBFcXVhbHNWYWxpZGF0b3JPcHRpb25zLFxuICAgIGluc3RhbmNlOiBhbnlcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY29tcGFyaXNvblByb3BlcnR5VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29tcGFyaXNvblByb3BlcnR5VmFsdWUgPSBnZXRWYWx1ZUJ5UGF0aChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuRVFVQUxTXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5FUVVBTFNdXG4gICAgICAgICk7XG4gIH1cbn1cblxuLy8gVmFsaWRhdGlvbi5yZWdpc3Rlcih7XG4vLyAgIHZhbGlkYXRvcjogRXF1YWxzVmFsaWRhdG9yLFxuLy8gICB2YWxpZGF0aW9uS2V5OiBWYWxpZGF0aW9uS2V5cy5FUVVBTFMsXG4vLyAgIHNhdmU6IGZhbHNlLFxuLy8gfSBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKTtcbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVBhdGgsIGlzR3JlYXRlclRoYW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEdyZWF0ZXIgVGhhbiBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0dSRUFURVJfVEhBTn1cbiAqXG4gKiBAY2xhc3MgR3JlYXRlclRoYW5WYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOKVxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJUaGFuVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgICBpbnN0YW5jZTogYW55XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gZ2V0VmFsdWVCeVBhdGgoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKGUubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWlzR3JlYXRlclRoYW4odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UsIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0VmFsdWVCeVBhdGgsXG4gIGlzR3JlYXRlclRoYW4sXG4gIGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24sXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgR3JlYXRlciBUaGFuIG9yIEVxdWFsIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjR1JFQVRFUl9USEFOX09SX0VRVUFMfVxuICpcbiAqIEBjbGFzcyBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMKVxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgICBpbnN0YW5jZTogYW55XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gZ2V0VmFsdWVCeVBhdGgoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKGUubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIChpc1ZhbGlkRm9yR3RlT3JMdGVDb21wYXJpc29uKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSkgJiZcbiAgICAgICAgICBpc0VxdWFsKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSkpIHx8XG4gICAgICAgIGlzR3JlYXRlclRoYW4odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3Iob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBlLm1lc3NhZ2UsXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVBhdGgsIGlzTGVzc1RoYW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IExlc3MgVGhhbiBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xFU1NfVEhBTn1cbiAqXG4gKiBAY2xhc3MgTGVzc1RoYW5WYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTEVTU19USEFOKVxuZXhwb3J0IGNsYXNzIExlc3NUaGFuVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgICBpbnN0YW5jZTogYW55XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gZ2V0VmFsdWVCeVBhdGgoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKGUubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWlzTGVzc1RoYW4odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UsIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRWYWx1ZUJ5UGF0aCxcbiAgaXNMZXNzVGhhbixcbiAgaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBMZXNzIFRoYW4gb3IgRXF1YWwgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMRVNTX1RIQU5fT1JfRVFVQUx9XG4gKlxuICogQGNsYXNzIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwpXG5leHBvcnQgY2xhc3MgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICAgIGluc3RhbmNlOiBhbnlcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY29tcGFyaXNvblByb3BlcnR5VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29tcGFyaXNvblByb3BlcnR5VmFsdWUgPSBnZXRWYWx1ZUJ5UGF0aChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChcbiAgICAgICAgKGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSAmJlxuICAgICAgICAgIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSkgfHxcbiAgICAgICAgaXNMZXNzVGhhbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIGUubWVzc2FnZSxcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUxdXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTGlzdFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBlbGVtZW50cyBpbiBhIGxpc3Qgb3Igc2V0IG1hdGNoIGV4cGVjdGVkIHR5cGVzXG4gKiBAc3VtbWFyeSBUaGUgTGlzdFZhbGlkYXRvciB2YWxpZGF0ZXMgdGhhdCBhbGwgZWxlbWVudHMgaW4gYW4gYXJyYXkgb3IgU2V0IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAqIEl0IGNoZWNrcyBlYWNoIGVsZW1lbnQgYWdhaW5zdCBhIGxpc3Qgb2YgYWxsb3dlZCBjbGFzcyB0eXBlcyBhbmQgZW5zdXJlcyB0eXBlIGNvbnNpc3RlbmN5LlxuICogVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQGxpc3QgZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKiBcbiAqIEBjbGFzcyBMaXN0VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGxpc3QgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBsaXN0VmFsaWRhdG9yID0gbmV3IExpc3RWYWxpZGF0b3IoKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgbGlzdCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTGlzdFZhbGlkYXRvciA9IG5ldyBMaXN0VmFsaWRhdG9yKFwiQWxsIGl0ZW1zIG11c3QgYmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlXCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBhIGxpc3RcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IGNsYXp6OiBbXCJTdHJpbmdcIiwgXCJOdW1iZXJcIl0gfTtcbiAqIGNvbnN0IHJlc3VsdCA9IGxpc3RWYWxpZGF0b3IuaGFzRXJyb3JzKFtcInRlc3RcIiwgMTIzXSwgb3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gbGlzdFZhbGlkYXRvci5oYXNFcnJvcnMoW25ldyBEYXRlKCldLCBvcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBMaXN0VmFsaWRhdG9yXG4gKiAgIFxuICogICBDLT4+VjogbmV3IExpc3RWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIGVtcHR5XG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGhhcyBlbGVtZW50c1xuICogICAgIFYtPj5WOiBDaGVjayBlYWNoIGVsZW1lbnQncyB0eXBlXG4gKiAgICAgYWx0IEFsbCBlbGVtZW50cyBtYXRjaCBhbGxvd2VkIHR5cGVzXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZWxzZSBTb21lIGVsZW1lbnRzIGRvbid0IG1hdGNoXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTElTVClcbmV4cG9ydCBjbGFzcyBMaXN0VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPExpc3RWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEFycmF5Lm5hbWUsIFNldC5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFsbCBlbGVtZW50cyBpbiBhIGxpc3Qgb3Igc2V0IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlc1xuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCBlYWNoIGVsZW1lbnQgaW4gdGhlIHByb3ZpZGVkIGFycmF5IG9yIFNldCBtYXRjaGVzIG9uZSBvZiB0aGUgXG4gICAqIGNsYXNzIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy4gRm9yIG9iamVjdCB0eXBlcywgaXQgY2hlY2tzIHRoZSBjb25zdHJ1Y3RvciBuYW1lLFxuICAgKiBhbmQgZm9yIHByaW1pdGl2ZSB0eXBlcywgaXQgY29tcGFyZXMgYWdhaW5zdCB0aGUgbG93ZXJjYXNlIHR5cGUgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHthbnlbXSB8IFNldDxhbnk+fSB2YWx1ZSAtIFRoZSBhcnJheSBvciBTZXQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtMaXN0VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBhbGxvd2VkIGNsYXNzIHR5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnlbXSB8IFNldDxhbnk+LFxuICAgIG9wdGlvbnM6IExpc3RWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAhdmFsdWUubGVuZ3RoIDogIXZhbHVlLnNpemUpKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGF6eiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5jbGF6eilcbiAgICAgID8gb3B0aW9ucy5jbGF6elxuICAgICAgOiBbb3B0aW9ucy5jbGF6el07XG4gICAgbGV0IHZhbDogYW55LFxuICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGkgPCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiB2YWx1ZS5zaXplKTtcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgdmFsID0gKHZhbHVlIGFzIGFueSlbaV07XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouaW5jbHVkZXMoKHZhbCBhcyBvYmplY3QpLmNvbnN0cnVjdG9yPy5uYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouc29tZSgoYzogc3RyaW5nKSA9PiB0eXBlb2YgdmFsID09PSBjLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgY2xhenopO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzLCBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWF4aW11bSBMZW5ndGggVmFsaWRhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHN0cmluZ3MgYW5kIEFycmF5cyBvbiB0aGVpciBtYXhpbXVtIGxlbmd0aFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAY2xhc3MgTWluTGVuZ3RoVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG5leHBvcnQgY2xhc3MgTWF4TGVuZ3RoVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge01heExlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBvcHRpb25zLm1heGxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5tYXhsZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWF4VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgbWF4aW11bVxuICogQHN1bW1hcnkgVGhlIE1heFZhbGlkYXRvciBjaGVja3MgaWYgYSBudW1lcmljIHZhbHVlLCBkYXRlLCBvciBzdHJpbmcgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gKiBhIHNwZWNpZmllZCBtYXhpbXVtIHZhbHVlLiBJdCBzdXBwb3J0cyBjb21wYXJpbmcgbnVtYmVycyBkaXJlY3RseSwgZGF0ZXMgY2hyb25vbG9naWNhbGx5LFxuICogYW5kIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBtYXggZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqIFxuICogQGNsYXNzIE1heFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtYXggdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBtYXhWYWxpZGF0b3IgPSBuZXcgTWF4VmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG1heCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTWF4VmFsaWRhdG9yID0gbmV3IE1heFZhbGlkYXRvcihcIlZhbHVlIG11c3Qgbm90IGV4Y2VlZCB7MH1cIik7XG4gKiBcbiAqIC8vIFZhbGlkYXRlIGEgbnVtYmVyXG4gKiBjb25zdCBudW1PcHRpb25zID0geyBtYXg6IDEwMCwgbWVzc2FnZTogXCJOdW1iZXIgdG9vIGxhcmdlXCIgfTtcbiAqIGNvbnN0IG51bVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMoNTAsIG51bU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZE51bVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMoMTUwLCBudW1PcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogXG4gKiAvLyBWYWxpZGF0ZSBhIGRhdGVcbiAqIGNvbnN0IGRhdGVPcHRpb25zID0geyBtYXg6IG5ldyBEYXRlKDIwMjMsIDExLCAzMSkgfTtcbiAqIGNvbnN0IGRhdGVSZXN1bHQgPSBtYXhWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKDIwMjMsIDUsIDE1KSwgZGF0ZU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBNYXhWYWxpZGF0b3JcbiAqICAgXG4gKiAgIEMtPj5WOiBuZXcgTWF4VmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaXMgRGF0ZSBhbmQgbWF4IGlzIG5vdCBEYXRlXG4gKiAgICAgVi0+PlY6IENvbnZlcnQgbWF4IHRvIERhdGVcbiAqICAgICBhbHQgY29udmVyc2lvbiBmYWlsc1xuICogICAgICAgVi0tPj5DOiBFcnJvcjogSW52YWxpZCBNYXggcGFyYW1cbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIGFsdCB2YWx1ZSA+IG1heFxuICogICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICBlbHNlIHZhbHVlIDw9IG1heFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUFYKVxuZXhwb3J0IGNsYXNzIE1heFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNYXhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJEYXRlXCIsIFwic3RyaW5nXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBtYXhpbXVtXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gdmFsdWVcbiAgICogc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLiBGb3IgZGF0ZXMsIGl0IHBlcmZvcm1zIGNocm9ub2xvZ2ljYWwgY29tcGFyaXNvbixcbiAgICogY29udmVydGluZyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIERhdGUgb2JqZWN0cyBpZiBuZWNlc3NhcnkuIEZvciBudW1iZXJzXG4gICAqIGFuZCBzdHJpbmdzLCBpdCBwZXJmb3JtcyBkaXJlY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge01heFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgbWF4aW11bSB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWF4VmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1heCB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWF4IGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1heCA9IG5ldyBEYXRlKG1heCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1heC5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1heCBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA+IG1heFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgbWF4KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNaW5pbXVtIExlbmd0aCBWYWxpZGF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgc3RyaW5ncyBhbmQgQXJyYXlzIG9uIHRoZWlyIG1pbmltdW0gbGVuZ3RoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbmV4cG9ydCBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTl9MRU5HVEgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBTdHJpbmcubmFtZSwgQXJyYXkubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG1lbWJlck9mIE1pbkxlbmd0aFZhbGlkYXRvclxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBvcHRpb25zLm1pbmxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5taW5sZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgbWluaW11bVxuICogQHN1bW1hcnkgVGhlIE1pblZhbGlkYXRvciBjaGVja3MgaWYgYSBudW1lcmljIHZhbHVlLCBkYXRlLCBvciBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gKiBhIHNwZWNpZmllZCBtaW5pbXVtIHZhbHVlLiBJdCBzdXBwb3J0cyBjb21wYXJpbmcgbnVtYmVycyBkaXJlY3RseSwgZGF0ZXMgY2hyb25vbG9naWNhbGx5LFxuICogYW5kIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBtaW4gZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIFxuICogQGNsYXNzIE1pblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtaW4gdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBtaW5WYWxpZGF0b3IgPSBuZXcgTWluVmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG1pbiB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTWluVmFsaWRhdG9yID0gbmV3IE1pblZhbGlkYXRvcihcIlZhbHVlIG11c3QgYmUgYXQgbGVhc3QgezB9XCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBhIG51bWJlclxuICogY29uc3QgbnVtT3B0aW9ucyA9IHsgbWluOiAxMCwgbWVzc2FnZTogXCJOdW1iZXIgdG9vIHNtYWxsXCIgfTtcbiAqIGNvbnN0IG51bVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMoNTAsIG51bU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZE51bVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMoNSwgbnVtT3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIFxuICogLy8gVmFsaWRhdGUgYSBkYXRlXG4gKiBjb25zdCBkYXRlT3B0aW9ucyA9IHsgbWluOiBuZXcgRGF0ZSgyMDIzLCAwLCAxKSB9O1xuICogY29uc3QgZGF0ZVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoMjAyMywgNSwgMTUpLCBkYXRlT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIE1pblZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBNaW5WYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBEYXRlIGFuZCBtaW4gaXMgbm90IERhdGVcbiAqICAgICBWLT4+VjogQ29udmVydCBtaW4gdG8gRGF0ZVxuICogICAgIGFsdCBjb252ZXJzaW9uIGZhaWxzXG4gKiAgICAgICBWLS0+PkM6IEVycm9yOiBJbnZhbGlkIE1pbiBwYXJhbVxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgYWx0IHZhbHVlIDwgbWluXG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgdmFsdWUgPj0gbWluXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbmRcbiAqIFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG5leHBvcnQgY2xhc3MgTWluVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1pblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU4pIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcIkRhdGVcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIG1pbmltdW1cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBsZXNzIHRoYW4gdGhlIG1pbmltdW0gdmFsdWVcbiAgICogc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLiBGb3IgZGF0ZXMsIGl0IHBlcmZvcm1zIGNocm9ub2xvZ2ljYWwgY29tcGFyaXNvbixcbiAgICogY29udmVydGluZyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIERhdGUgb2JqZWN0cyBpZiBuZWNlc3NhcnkuIEZvciBudW1iZXJzXG4gICAqIGFuZCBzdHJpbmdzLCBpdCBwZXJmb3JtcyBkaXJlY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge01pblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgbWluaW11bSB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWluVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1pbiB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWluIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1pbiA9IG5ldyBEYXRlKG1pbik7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1pbi5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1pbiBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPCBtaW5cbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIG1pbilcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIYW5kbGVzIFBhc3N3b3JkIFZhbGlkYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Vycm9yTWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFTU1dPUkR9XG4gKlxuICogQGNsYXNzIFBhc3N3b3JkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVNTV09SRClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBQYXR0ZXJuVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTpcbiAgICAgICAgb3B0aW9ucz8ucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLlBBU1NXT1JELkNIQVI4X09ORV9PRl9FQUNILFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBwcmVzZW50IGFuZCBub3QgZW1wdHlcbiAqIEBzdW1tYXJ5IFRoZSBSZXF1aXJlZFZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBpcyBwcm92aWRlZCBhbmQgbm90IGVtcHR5LlxuICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzIGFwcHJvcHJpYXRlbHk6IGZvciBib29sZWFucyBhbmQgbnVtYmVycyxcbiAqIGl0IGNoZWNrcyBpZiB0aGV5J3JlIHVuZGVmaW5lZDsgZm9yIG90aGVyIHR5cGVzIChzdHJpbmdzLCBhcnJheXMsIG9iamVjdHMpLFxuICogaXQgY2hlY2tzIGlmIHRoZXkncmUgZmFsc3kuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEByZXF1aXJlZCBkZWNvcmF0b3JcbiAqIGFuZCBpcyBvZnRlbiB0aGUgZmlyc3QgdmFsaWRhdGlvbiBhcHBsaWVkIHRvIGltcG9ydGFudCBmaWVsZHMuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUkVRVUlSRUR9XG4gKiBcbiAqIEBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSByZXF1aXJlZCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IHJlcXVpcmVkVmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkVmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIHJlcXVpcmVkIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21SZXF1aXJlZFZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvcihcIlRoaXMgZmllbGQgaXMgbWFuZGF0b3J5XCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhcIlwiKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKDApOyAvLyB1bmRlZmluZWQgKHZhbGlkIC0gMCBpcyBhIHZhbGlkIG51bWJlcilcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhudWxsKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKFtdKTsgLy8gdW5kZWZpbmVkICh2YWxpZCAtIGVtcHR5IGFycmF5IGlzIHN0aWxsIGFuIGFycmF5KVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBSZXF1aXJlZFZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBSZXF1aXJlZFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdHlwZW9mIHZhbHVlIGlzIGJvb2xlYW4gb3IgbnVtYmVyXG4gKiAgICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZWxzZSB2YWx1ZSBpcyBkZWZpbmVkXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZW5kXG4gKiAgIGVsc2Ugb3RoZXIgdHlwZXNcbiAqICAgICBhbHQgdmFsdWUgaXMgZmFsc3kgKG51bGwsIHVuZGVmaW5lZCwgZW1wdHkgc3RyaW5nKVxuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZWxzZSB2YWx1ZSBpcyB0cnV0aHlcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG5leHBvcnQgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIHByZXNlbnQgYW5kIG5vdCBlbXB0eVxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgZXhpc3RzIGFuZCBpcyBub3QgZW1wdHkuXG4gICAqIFRoZSB2YWxpZGF0aW9uIGxvZ2ljIHZhcmllcyBieSB0eXBlOlxuICAgKiAtIEZvciBib29sZWFucyBhbmQgbnVtYmVyczogY2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAgICogLSBGb3Igb3RoZXIgdHlwZXMgKHN0cmluZ3MsIGFycmF5cywgb2JqZWN0cyk6IGNoZWNrcyBpZiB0aGUgdmFsdWUgaXMgZmFsc3lcbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IFZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAhdmFsdWVcbiAgICAgICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU3RlcFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBTdGVwIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjU1RFUH1cbiAqXG4gKiBAY2xhc3MgU3RlcFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5TVEVQKVxuZXhwb3J0IGNsYXNzIFN0ZXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8U3RlcFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5TVEVQKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwXG4gICAqIEBwYXJhbSB7U3RlcFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogU3RlcFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgJSBOdW1iZXIob3B0aW9ucy5zdGVwKSAhPT0gMFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5zdGVwKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHlwZVZhbGlkYXRvck9wdGlvbnMsIFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gKiBAc3VtbWFyeSBUaGUgVHlwZVZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICogSXQgY2FuIHZhbGlkYXRlIGFnYWluc3QgYSBzaW5nbGUgdHlwZSwgbXVsdGlwbGUgdHlwZXMsIG9yIGEgdHlwZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEB0eXBlIGRlY29yYXRvciBhbmQgaXMgZnVuZGFtZW50YWwgZm9yXG4gKiBlbnN1cmluZyB0eXBlIHNhZmV0eSBpbiB2YWxpZGF0ZWQgbW9kZWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAY2xhc3MgVHlwZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHR5cGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCB0eXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSB0eXBlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21UeXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IGJlIG9mIHR5cGUgezB9LCBidXQgZ290IHsxfVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhZ2FpbnN0IGEgc2luZ2xlIHR5cGVcbiAqIGNvbnN0IHN0cmluZ09wdGlvbnMgPSB7IHR5cGVzOiBcInN0cmluZ1wiIH07XG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyhcImhlbGxvXCIsIHN0cmluZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBzdHJpbmdPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgbXVsdGlwbGUgdHlwZXNcbiAqIGNvbnN0IG11bHRpT3B0aW9ucyA9IHsgdHlwZXM6IFtcInN0cmluZ1wiLCBcIm51bWJlclwiXSB9O1xuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnModHJ1ZSwgbXVsdGlPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgYSBjbGFzcyB0eXBlXG4gKiBjb25zdCBjbGFzc09wdGlvbnMgPSB7IHR5cGVzOiB7IG5hbWU6IFwiRGF0ZVwiIH0gfTtcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKCksIGNsYXNzT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVHlwZVZhbGlkYXRvclxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAqXG4gKiAgIEMtPj5WOiBuZXcgVHlwZVZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGlzIGRlZmluZWRcbiAqICAgICBWLT4+UjogZXZhbHVhdGVEZXNpZ25UeXBlcyh2YWx1ZSwgdHlwZXMpXG4gKiAgICAgYWx0IHR5cGUgZXZhbHVhdGlvbiBwYXNzZXNcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbHNlIHR5cGUgZXZhbHVhdGlvbiBmYWlsc1xuICogICAgICAgVi0+PlY6IEZvcm1hdCBlcnJvciBtZXNzYWdlIHdpdGggdHlwZSBpbmZvXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuZXhwb3J0IGNsYXNzIFR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8VHlwZVZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICAgKiBJdCB1c2VzIHRoZSBSZWZsZWN0aW9uIHV0aWxpdHkgdG8gZXZhbHVhdGUgaWYgdGhlIHZhbHVlJ3MgdHlwZSBtYXRjaGVzIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAgICogVGhlIG1ldGhvZCBza2lwcyB2YWxpZGF0aW9uIGZvciB1bmRlZmluZWQgdmFsdWVzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBSZXF1aXJlZFZhbGlkYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VHlwZVZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgZXhwZWN0ZWQgdHlwZXNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVHlwZVZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBEb24ndCB0cnkgYW5kIGVuZm9yY2UgdHlwZSBpZiB1bmRlZmluZWRcbiAgICBjb25zdCB7IHR5cGVzLCBtZXNzYWdlIH0gPSBvcHRpb25zO1xuICAgIGlmICghUmVmbGVjdGlvbi5ldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0eXBlcykpXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdHlwZW9mIHR5cGVzID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB0eXBlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh0eXBlcylcbiAgICAgICAgICAgID8gdHlwZXMuam9pbihcIiwgXCIpXG4gICAgICAgICAgICA6IHR5cGVzLm5hbWUsXG4gICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciB0aGUgVHlwZVZhbGlkYXRvciB3aXRoIHRoZSBWYWxpZGF0aW9uIHJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBUaGlzIHJlZ2lzdHJhdGlvbiBhc3NvY2lhdGVzIHRoZSBUeXBlVmFsaWRhdG9yIHdpdGggdGhlIE1vZGVsS2V5cy5UWVBFIGtleSxcbiAqIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpbmcgZGVzaWduIHR5cGVzLiBUaGUgc2F2ZSBmbGFnIGlzIHNldCB0byBmYWxzZVxuICogdG8gcHJldmVudCB0aGUgdmFsaWRhdG9yIGZyb20gYmVpbmcgc2F2ZWQgaW4gdGhlIHN0YW5kYXJkIHZhbGlkYXRvciByZWdpc3RyeS5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICB2YWxpZGF0b3I6IFR5cGVWYWxpZGF0b3IsXG4gIHZhbGlkYXRpb25LZXk6IE1vZGVsS2V5cy5UWVBFLFxuICBzYXZlOiBmYWxzZSxcbn0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4iLCJpbXBvcnQge1xuICBWYWxpZGF0aW9uS2V5cyxcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIFVSTFxuICogQHN1bW1hcnkgVGhlIFVSTFZhbGlkYXRvciBjaGVja3MgaWYgYSBzdHJpbmcgbWF0Y2hlcyBhIHN0YW5kYXJkIFVSTCBwYXR0ZXJuLlxuICogSXQgZXh0ZW5kcyB0aGUgUGF0dGVyblZhbGlkYXRvciBhbmQgdXNlcyBhIHJvYnVzdCBVUkwgcmVnZXggcGF0dGVybiB0byB2YWxpZGF0ZSB3ZWIgYWRkcmVzc2VzLlxuICogVGhlIHBhdHRlcm4gaXMgc291cmNlZCBmcm9tIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kcGVyaW5pLzcyOTI5NH0gYW5kIGlzIHdpZGVseVxuICogcmVjb2duaXplZCBmb3IgaXRzIGFjY3VyYWN5IGluIHZhbGlkYXRpbmcgVVJMcy4gVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHVybCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNVUkx9XG4gKlxuICogQGNsYXNzIFVSTFZhbGlkYXRvclxuICogQGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBVUkwgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCB1cmxWYWxpZGF0b3IgPSBuZXcgVVJMVmFsaWRhdG9yKCk7XG4gKlxuICogLy8gQ3JlYXRlIGEgVVJMIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21VcmxWYWxpZGF0b3IgPSBuZXcgVVJMVmFsaWRhdG9yKFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgd2ViIGFkZHJlc3NcIik7XG4gKlxuICogLy8gVmFsaWRhdGUgYSBVUkxcbiAqIGNvbnN0IHJlc3VsdCA9IHVybFZhbGlkYXRvci5oYXNFcnJvcnMoXCJodHRwczovL2V4YW1wbGUuY29tXCIpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZFJlc3VsdCA9IHVybFZhbGlkYXRvci5oYXNFcnJvcnMoXCJub3QtYS11cmxcIik7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgVSBhcyBVUkxWYWxpZGF0b3JcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogICBDLT4+VTogbmV3IFVSTFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBVLT4+UDogc3VwZXIobWVzc2FnZSlcbiAqICAgQy0+PlU6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgVS0+PlA6IHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucyB3aXRoIFVSTCBwYXR0ZXJuKVxuICogICBQLS0+PlU6IHZhbGlkYXRpb24gcmVzdWx0XG4gKiAgIFUtLT4+QzogdmFsaWRhdGlvbiByZXN1bHRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlVSTClcbmV4cG9ydCBjbGFzcyBVUkxWYWxpZGF0b3IgZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgVVJMXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBzdHJpbmcgbWF0Y2hlcyB0aGUgVVJMIHBhdHRlcm4uXG4gICAqIFRoaXMgbWV0aG9kIGV4dGVuZHMgdGhlIFBhdHRlcm5WYWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kIGJ5IGVuc3VyaW5nXG4gICAqIHRoZSBVUkwgcGF0dGVybiBpcyB1c2VkLCBldmVuIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlIGFzIGEgVVJMXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFBhdHRlcm5WYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnModmFsdWUsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBtZXNzYWdlOiBvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLFxuICAgICAgcGF0dGVybjogb3B0aW9ucy5wYXR0ZXJuIHx8IERFRkFVTFRfUEFUVEVSTlMuVVJMLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEaWZmVmFsaWRhdG9yT3B0aW9ucyxcbiAgRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gIFZhbGlkYXRpb25NZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSBcIi4uL3V0aWxzL2RhdGVzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvRGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGZpZWxkIGFzIHJlcXVpcmVkXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVxdWlyZWQsIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIG51bGwsIG9yIGVtcHR5LlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFUVVJUkVEfS5cbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGNvbW1vbmx5IHVzZWQgYXMgdGhlIGZpcnN0IHZhbGlkYXRpb24gc3RlcCBmb3IgaW1wb3J0YW50IGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1JFUVVJUkVEfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiByZXF1aXJlZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoXCJFbWFpbCBhZGRyZXNzIGlzIG1hbmRhdG9yeVwiKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgZW5mb3JjZXMgYSBtaW5pbXVtIHZhbHVlIGNvbnN0cmFpbnRcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHksIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCBtaW5pbXVtLlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTn0uXG4gKiBUaGlzIGRlY29yYXRvciB3b3JrcyB3aXRoIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGUgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZC4gRm9yIGRhdGVzLCBjYW4gYmUgYSBEYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqXG4gKiBAZnVuY3Rpb24gbWluXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQG1pbigwKVxuICogICBwcmljZTogbnVtYmVyO1xuICpcbiAqICAgQG1pbihuZXcgRGF0ZSgyMDIzLCAwLCAxKSwgXCJEYXRlIG11c3QgYmUgYWZ0ZXIgSmFudWFyeSAxLCAyMDIzXCIpXG4gKiAgIHJlbGVhc2VEYXRlOiBEYXRlO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4oXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTlxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuTUlOXTogdmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWH1cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGV9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVh9XG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhdOiB2YWx1ZSxcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzdGVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjU1RFUH1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1NURVB9XG4gKlxuICogQGZ1bmN0aW9uIHN0ZXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVBcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5TVEVQKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5TVEVQXTogdmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbTnVtYmVyLm5hbWVdLFxuICAgICAgfSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1pbmxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbmxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5fTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSF06IHZhbHVlLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNQVhfTEVOR1RIfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4bGVuZ3RoXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4bGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWF9MRU5HVEhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXTogdmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBSZWdFeHAgcGF0dGVybiB0aGUgcHJvcGVydHkgbXVzdCByZXNwZWN0XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBVFRFUk59XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVRURVJOfVxuICpcbiAqIEBmdW5jdGlvbiBwYXR0ZXJuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0dGVybihcbiAgdmFsdWU6IFJlZ0V4cCB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUEFUVEVSTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIGVtYWlsXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0VNQUlMfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0VNQUlMfVxuICpcbiAqIEBmdW5jdGlvbiBlbWFpbFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRU1BSUwpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihrZXksIHtcbiAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLkVNQUlMLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIFVSTFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNVUkx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBmdW5jdGlvbiB1cmxcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVVJMKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogREVGQVVMVF9QQVRURVJOUy5VUkwsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgICAgfSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRW5mb3JjZXMgdHlwZSB2ZXJpZmljYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjVFlQRX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSB0eXBlcyBhY2NlcHRlZCB0eXBlc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGUoXG4gIHR5cGVzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVFlQRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBjdXN0b21UeXBlczogdHlwZXMsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEYXRlIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0RBVEV9XG4gKlxuICogV2lsbCBlbmZvcmNlIHNlcmlhbGl6YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBmb3JtYXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IGFjY2VwdGVkIGZvcm1hdCBhY2NvcmRpbmcgdG8ge0BsaW5rIGZvcm1hdERhdGV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNEQVRFfVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlXG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUoXG4gIGZvcm1hdDogc3RyaW5nID0gXCJkZC9NTS95eXl5XCIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURVxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkRBVEUpO1xuICBjb25zdCBkYXRlRGVjID0gKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcGVydHlLZXk/OiBhbnkpOiBhbnkgPT4ge1xuICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdOiBmb3JtYXQsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgdHlwZXM6IFtEYXRlLm5hbWVdLFxuICAgIH0pKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgc2V0KHRoaXM6IGFueSwgbmV3VmFsdWU6IHN0cmluZyB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgcHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci5jb25maWd1cmFibGUpXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gdmFsdWVzLmdldCh0aGlzKSxcbiAgICAgICAgICAgIHNldDogKG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWw6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFsID0gcGFyc2VEYXRlKGZvcm1hdCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgdmFsKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihzZihcIkZhaWxlZCB0byBwYXJzZSBkYXRlOiB7MH1cIiwgZS5tZXNzYWdlIHx8IGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpc1twcm9wZXJ0eUtleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiaGVyZVwiKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpLmRlZmluZShkYXRlRGVjKS5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhc3N3b3JkIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBU1NXT1JEfVxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSBbcGF0dGVybl0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUEFUVEVSTlMjQ0hBUjhfT05FX09GX0VBQ0h9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVNTV09SRH1cbiAqXG4gKiBAZnVuY3Rpb24gcGFzc3dvcmRcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmQoXG4gIHBhdHRlcm46IFJlZ0V4cCA9IERFRkFVTFRfUEFUVEVSTlMuUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0gsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFTU1dPUkRcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5QQVNTV09SRCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBwYXR0ZXJuLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IExpc3QgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gQWxzbyBzZXRzIHRoZSB7QGxpbmsgdHlwZX0gdG8gdGhlIHByb3ZpZGVkIGNvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbGxlY3Rpb25dIFRoZSBjb2xsZWN0aW9uIGJlaW5nIHVzZWQuIGRlZmF1bHRzIHRvIEFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIGxpc3RcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PiB8IE1vZGVsQ29uc3RydWN0b3I8YW55PltdLFxuICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1Rcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwge1xuICAgICAgICBjbGF6ejogQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6ei5tYXAoKGMpID0+IGMubmFtZSkgOiBbY2xhenoubmFtZV0sXG4gICAgICAgIHR5cGU6IGNvbGxlY3Rpb24sXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXQgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gV3JhcHBlciBmb3Ige0BsaW5rIGxpc3R9IHdpdGggdGhlICdTZXQnIENvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIHNldFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCB0byBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRVFVQUxTfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGVxdWFsaXR5IGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBlcXVhbGl0eSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBlcVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU1xuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuRVFVQUxTXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVRVUFMUyksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRElGRn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRpZmZlcmVuY2UgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZGlmZlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRlxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IERpZmZWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkRJRkZdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgfTtcblxuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRElGRiksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTiksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHRlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTFxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTiksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3RlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTl9PUl9FUVVBTFxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTCksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgRnVuY3Rpb24gdG8gb3ZlcnJpZGUgY29uc3RydWN0b3JzXG4gKlxuICogQHRlbXBsYXRlIE0gdGhlIG1vZGVsIGluc3RhbmNlIHR5cGVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdXG4gKiBAcmV0dXJuIHtNfSB0aGUgbmV3IGluc3RhbmNlXG4gKlxuICogQGZ1bmN0aW9uIGNvbnN0cnVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNvbnN0cnVjdG9yOiBhbnksXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBNIHtcbiAgY29uc3QgX2NvbnN0ciA9ICguLi5hcmd6OiBhbnlbXSkgPT4gbmV3IGNvbnN0cnVjdG9yKC4uLmFyZ3opO1xuICBfY29uc3RyLnByb3RvdHlwZSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIF9jb25zdHIoLi4uYXJncyk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVjdXJzaXZlbHkgZmluZHMgdGhlIGxhc3QgcHJvdG90eXBlIGJlZm9yZSBPYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdChvYmo6IG9iamVjdCk6IG9iamVjdCB7XG4gIGxldCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gb2JqO1xuICB3aGlsZSAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBwcm90b3R5cGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZVwiKTtcbn1cblxuLyoqXG4gKiBAc3VtYXJ5IGJpbmRzIHRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzIGFzIGEgcm9vdCBwcm90b3R5cGUgb2YgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kTW9kZWxQcm90b3R5cGUob2JqOiB1bmtub3duKSB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbCkgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIGJpbmRQcm90b3R5cGUob2JqVG9PdmVycmlkZTogdW5rbm93biwgcHJvdG90eXBlOiBvYmplY3QpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqVG9PdmVycmlkZSwgcHJvdG90eXBlKTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gYmluZFByb3RvdHlwZShvYmosIE1vZGVsLnByb3RvdHlwZSk7XG4gIH1cbiAgd2hpbGUgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGNvbnN0IHByb3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAoXG4gICAgICBwcm90ID09PSBPYmplY3QucHJvdG90eXBlIHx8XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIHJldHVybiBiaW5kUHJvdG90eXBlKHByb3RvdHlwZSwgTW9kZWwucHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZSB0byBiaW5kXCIpO1xufVxuIiwiaW1wb3J0IHsgYmluZE1vZGVsUHJvdG90eXBlLCBjb25zdHJ1Y3QgfSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyB0aGUgdHBlIG9zIGFuIEluc3RhbmNlQ2FsbGJhY2sgZnVuY3Rpb25cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VDYWxsYmFjayA9IChpbnN0YW5jZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYSBNb2RlbCBjbGFzc1xuICogQGRlc2NyaXB0aW9uXG4gKlxuICogLSBSZWdpc3RlcnMgdGhlIGNsYXNzIHVuZGVyIHRoZSBtb2RlbCByZWdpc3RyeSBzbyBpdCBjYW4gYmUgZWFzaWx5IHJlYnVpbHQ7XG4gKiAtIE92ZXJyaWRlcyB0aGUgY2xhc3MgY29uc3RydWN0b3I7XG4gKiAtIFJ1bnMgdGhlIGdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IGlmIGRlZmluZWQ7XG4gKiAtIFJ1bnMgdGhlIG9wdGlvbmFsIHtAbGluayBJbnN0YW5jZUNhbGxiYWNrfSBpZiBwcm92aWRlZDtcbiAqXG4gKiBAcGFyYW0ge0luc3RhbmNlQ2FsbGJhY2t9IFtpbnN0YW5jZUNhbGxiYWNrXSBvcHRpb25hbCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGluc3RhbmNlIHVwb24gaW5zdGFudGlhdGlvbi4gZGVmYXVsdHMgdG8gdW5kZWZpbmVkXG4gKlxuICogQGZ1bmN0aW9uIG1vZGVsXG4gKlxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsKGluc3RhbmNlQ2FsbGJhY2s/OiBJbnN0YW5jZUNhbGxiYWNrKSB7XG4gIHJldHVybiAoKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBvcmlnaW5hbD4gPSBjb25zdHJ1Y3QoXG4gICAgICAgIG9yaWdpbmFsLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgICAgYmluZE1vZGVsUHJvdG90eXBlKGluc3RhbmNlKTtcbiAgICAgIC8vIHJ1biBhIGJ1aWxkZXIgZnVuY3Rpb24gaWYgZGVmaW5lZCB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAoVGhlIE1vZGVsQXJnKVxuICAgICAgY29uc3QgYnVpbGRlciA9IE1vZGVsLmdldEJ1aWxkZXIoKTtcbiAgICAgIGlmIChidWlsZGVyKSBidWlsZGVyKGluc3RhbmNlLCBhcmdzLmxlbmd0aCA/IGFyZ3NbMF0gOiB1bmRlZmluZWQpO1xuXG4gICAgICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkoaW5zdGFuY2UuY29uc3RydWN0b3IpO1xuXG4gICAgICBpZiAoaW5zdGFuY2VDYWxsYmFjaykgaW5zdGFuY2VDYWxsYmFjayhpbnN0YW5jZSwgLi4uYXJncyk7XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcblxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKG9yaWdpbmFsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIGtleSxcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShrZXksIG9yaWdpbmFsKSxcbiAgICAgICAgbmV3Q29uc3RydWN0b3JcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkob3JpZ2luYWwpO1xuXG4gICAgTW9kZWwucmVnaXN0ZXIobmV3Q29uc3RydWN0b3IsIG9yaWdpbmFsLm5hbWUpO1xuXG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH0pIGFzIGFueTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBoYXNoaW5nIGFsZ29yaXRobSB0byB1c2Ugb24gdGhlIG1vZGVsXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiAtIFJlZ2lzdGVycyB0aGUgY2xhc3MgdW5kZXIgdGhlIG1vZGVsIHJlZ2lzdHJ5IHNvIGl0IGNhbiBiZSBlYXNpbHkgcmVidWlsdDtcbiAqIC0gT3ZlcnJpZGVzIHRoZSBjbGFzcyBjb25zdHJ1Y3RvcjtcbiAqIC0gUnVucyB0aGUgZ2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn0gaWYgZGVmaW5lZDtcbiAqIC0gUnVucyB0aGUgb3B0aW9uYWwge0BsaW5rIEluc3RhbmNlQ2FsbGJhY2t9IGlmIHByb3ZpZGVkO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGdvcml0aG0gdGhlIGFsZ29yaXRobSB0byB1c2VcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaGVkQnlcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaGVkQnkoYWxnb3JpdGhtOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLkhBU0hJTkcpLCB7XG4gICAgYWxnb3JpdGhtOiBhbGdvcml0aG0sXG4gICAgYXJnczogYXJncyxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiBhbGdvcml0aG0gdG8gdXNlIG9uIHRoZSBtb2RlbFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXJpYWxpemVyIHRoZSBhbGdvcml0aG0gdG8gdXNlXG4gKlxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZWRCeVxuICpcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVkQnkoc2VyaWFsaXplcjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSwge1xuICAgIHNlcmlhbGl6ZXI6IHNlcmlhbGl6ZXIsXG4gICAgYXJnczogYXJncyxcbiAgfSk7XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBUeXBlU2NyaXB0IGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9uIGxpYnJhcnlcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGZyYW1ld29yayB1c2luZyBUeXBlU2NyaXB0IGRlY29yYXRvcnMuXG4gKiBJdCBleHBvc2VzIHV0aWxpdHkgZnVuY3Rpb25zLCB2YWxpZGF0aW9uIGRlY29yYXRvcnMsIGFuZCBtb2RlbC1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgZm9yXG4gKiBpbXBsZW1lbnRpbmcgdHlwZS1zYWZlLCBkZWNsYXJhdGl2ZSB2YWxpZGF0aW9uIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIHJlZmxlY3Rpb24gcGFja2FnZVxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiTW9kZWxLZXlzIiwiYXBwbHkiLCJtZXRhZGF0YSIsIlByaW1pdGl2ZXMiLCJSZXNlcnZlZE1vZGVscyIsIlJlZmxlY3Rpb24iLCJpc0VxdWFsIiwiRGF0ZVZhbGlkYXRvciIsIl9fZGVjb3JhdGUiLCJEaWZmVmFsaWRhdG9yIiwiUGF0dGVyblZhbGlkYXRvciIsIkVtYWlsVmFsaWRhdG9yIiwiRXF1YWxzVmFsaWRhdG9yIiwiR3JlYXRlclRoYW5WYWxpZGF0b3IiLCJHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IiLCJMZXNzVGhhblZhbGlkYXRvciIsIkxlc3NUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkxpc3RWYWxpZGF0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IiLCJNYXhWYWxpZGF0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJNaW5WYWxpZGF0b3IiLCJQYXNzd29yZFZhbGlkYXRvciIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiU3RlcFZhbGlkYXRvciIsIlR5cGVWYWxpZGF0b3IiLCJVUkxWYWxpZGF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7SUFNRztVQUNVLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxTQUFTOztJQ1ByRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBcUJHO0FBQ1NBO0lBQVosQ0FBQSxVQUFZLFNBQVMsRUFBQTtJQUNuQixJQUFBLFNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxjQUF3QjtJQUN4QixJQUFBLFNBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxhQUFvQjtJQUNwQixJQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxtQkFBNEI7SUFDNUIsSUFBQSxTQUFBLENBQUEsUUFBQSxDQUFBLEdBQUEsbUJBQTRCO0lBQzVCLElBQUEsU0FBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7SUFDZixJQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxTQUFrQjtJQUNsQixJQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsR0FBQSxnQkFBK0I7SUFDL0IsSUFBQSxTQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsY0FBMEI7SUFDMUIsSUFBQSxTQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7SUFDbkIsSUFBQSxTQUFBLENBQUEsZUFBQSxDQUFBLEdBQUEsZUFBK0I7SUFDakMsQ0FBQyxFQVhXQSxpQkFBUyxLQUFUQSxpQkFBUyxHQVdwQixF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
|
|
4316
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzL2Vycm9ycy50cyIsIi4uL3NyYy9jb25zdGFudHMvdmFsaWRhdGlvbi50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy9zdHJpbmdzLnRzIiwiLi4vc3JjL3V0aWxzL2RhdGVzLnRzIiwiLi4vc3JjL3V0aWxzL0RlY29yYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9oYXNoaW5nLnRzIiwiLi4vc3JjL3V0aWxzL1BhdGhQcm94eS50cyIsIi4uL3NyYy9tb2RlbC9Nb2RlbEVycm9yRGVmaW5pdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1ZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnkudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvdXRpbHMvc2VyaWFsaXphdGlvbi50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRGF0ZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRGlmZlZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGF0dGVyblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRW1haWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0VxdWFsc1ZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvdXRpbHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0dyZWF0ZXJUaGFuVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9HcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xlc3NUaGFuVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9MZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xpc3RWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01heExlbmd0aFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWF4VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5MZW5ndGhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01pblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGFzc3dvcmRWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1JlcXVpcmVkVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9TdGVwVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9UeXBlVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9VUkxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTID0ge1xuICBJTlZBTElEX1BBVEg6XG4gICAgXCJJbnZhbGlkIHBhdGggYXJndW1lbnQuIEV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcgYnV0IHJlY2VpdmVkOiAnezB9J1wiLFxuICBDT05URVhUX05PVF9PQkpFQ1RfQ09NUEFSSVNPTjpcbiAgICBcIlVuYWJsZSB0byBhY2Nlc3MgcGFyZW50IGF0IGxldmVsIHswfSBmb3IgcGF0aCAnezF9JzogY3VycmVudCBjb250ZXh0IGlzIG5vdCBhbiBvYmplY3RcIixcbiAgUFJPUEVSVFlfSU5WQUxJRDpcbiAgICBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggezB9OiBwcm9wZXJ0eSAnezF9JyBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0LlwiLFxuICBQUk9QRVJUWV9OT1RfRVhJU1Q6IFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aDogcHJvcGVydHkgJ3swfScgZG9lcyBub3QgZXhpc3QuXCIsXG4gIFVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT046XG4gICAgXCJVbnN1cHBvcnRlZCB0eXBlcyBmb3IgY29tcGFyaXNvbjogJ3swfScgYW5kICd7MX0nXCIsXG4gIE5VTExfT1JfVU5ERUZJTkVEX0NPTVBBUklTT046XG4gICAgXCJDb21wYXJpc29uIGZhaWxlZCBkdWUgdG8gbnVsbCBvciB1bmRlZmluZWQgdmFsdWVcIixcbiAgSU5WQUxJRF9EQVRFX0NPTVBBUklTT046IFwiSW52YWxpZCBEYXRlIG9iamVjdHMgYXJlIG5vdCBjb21wYXJhYmxlXCIsXG4gIFRZUEVfTUlTTUFUQ0hfQ09NUEFSSVNPTjpcbiAgICBcIkNhbm5vdCBjb21wYXJlIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXM6IHswfSBhbmQgezF9LlwiLFxuICBOQU5fQ09NUEFSSVNPTjogXCJDb21wYXJpc29uIG5vdCBzdXBwb3J0ZWQgZm9yIE5hTiB2YWx1ZXNcIixcbiAgLy8gTk9fUEFSRU5UX0NPTVBBUklTT046IFwiVW5hYmxlIHRvIGFjY2VzcyBwYXJlbnQgYXQgbGV2ZWwgezB9IGZvciBwYXRoICd7MX0nOiBubyBwYXJlbnQgYXZhaWxhYmxlXCIsXG4gIC8vIFBST1BFUlRZX05PVF9GT1VORDogXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIHswfTogcHJvcGVydHkgJ3sxfScgZG9lcyBub3QgZXhpc3QuXCIsXG4gIC8vIFBST1BFUlRZX05PVF9GT1VORF9PTl9QQVJFTlQ6IFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0IG9uIHBhcmVudC5cIixcbiAgLy8gUFJPUEVSVFlfTk9UX0ZPVU5EX0FGVEVSX1BBUkVOVDogXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIHswfTogcHJvcGVydHkgJ3sxfScgZG9lcyBub3QgZXhpc3QgYWZ0ZXIgezJ9IHBhcmVudCBsZXZlbChzKS5cIixcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBTeW1ib2wga2V5IGZvciB0cmFja2luZyBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyBpbiB2YWxpZGF0aW9uXG4gKiBAc3VtbWFyeSBTeW1ib2wgdXNlZCB0byBpbnRlcm5hbGx5IHRyYWNrIHRoZSBwYXJlbnQgb2JqZWN0IGR1cmluZyBuZXN0ZWQgdmFsaWRhdGlvblxuICpcbiAqIEBjb25zdCBWQUxJREFUSU9OX1BBUkVOVF9LRVlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEQVRJT05fUEFSRU5UX0tFWSA9IFN5bWJvbChcIl9wYXJlbnRcIik7XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGNvbnRhaW5pbmcgbWV0YWRhdGEga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uIGluIHRoZSBtb2RlbCBzeXN0ZW1cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgTW9kZWwga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uIGFuZCBtZXRhZGF0YSBzdG9yYWdlLlxuICogVGhlc2Uga2V5cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBtb2RlbHMsXG4gKiB0aGVpciBwcm9wZXJ0aWVzLCBhbmQgdGhlaXIgYmVoYXZpb3IuXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBQcmVmaXggdG8gYWxsIG90aGVyIGtleXMsIHVzZWQgYXMgYSBuYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIC0gS2V5IGZvciBzdG9yaW5nIGRlc2lnbiB0eXBlIGluZm9ybWF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFSQU1TIC0gS2V5IGZvciBzdG9yaW5nIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVRVUk4gLSBLZXkgZm9yIHN0b3JpbmcgbWV0aG9kIHJldHVybiB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUwgLSBLZXkgZm9yIGlkZW50aWZ5aW5nIG1vZGVsIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5DSE9SIC0gQW5jaG9yIGtleSB0aGF0IHNlcnZlcyBhcyBhIGdob3N0IHByb3BlcnR5IGluIHRoZSBtb2RlbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IENPTlNUUlVDVElPTiAtIEtleSBmb3Igc3RvcmluZyBjb25zdHJ1Y3Rpb24gaW5mb3JtYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBVFRSSUJVVEUgLSBLZXkgZm9yIHN0b3JpbmcgYXR0cmlidXRlIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSEFTSElORyAtIEtleSBmb3Igc3RvcmluZyBoYXNoaW5nIGNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVJJQUxJWkFUSU9OIC0gS2V5IGZvciBzdG9yaW5nIHNlcmlhbGl6YXRpb24gY29uZmlndXJhdGlvblxuICpcbiAqIEByZWFkb25seVxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZW51bSBNb2RlbEtleXMge1xuICBSRUZMRUNUID0gXCJkZWNhZi5tb2RlbC5cIixcbiAgVFlQRSA9IFwiZGVzaWduOnR5cGVcIixcbiAgUEFSQU1TID0gXCJkZXNpZ246cGFyYW10eXBlc1wiLFxuICBSRVRVUk4gPSBcImRlc2lnbjpyZXR1cm50eXBlXCIsXG4gIE1PREVMID0gXCJtb2RlbFwiLFxuICBBTkNIT1IgPSBcIl9fbW9kZWxcIixcbiAgQ09OU1RSVUNUSU9OID0gXCJjb25zdHJ1Y3RlZC1ieVwiLFxuICBBVFRSSUJVVEUgPSBcIl9fYXR0cmlidXRlc1wiLFxuICBIQVNISU5HID0gXCJoYXNoaW5nXCIsXG4gIFNFUklBTElaQVRJT04gPSBcInNlcmlhbGl6YXRpb25cIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBmbGF2b3VyIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3Igc3lzdGVtXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGZsYXZvdXIgdXNlZCBieSB0aGUgRGVjb3JhdGlvbiBjbGFzcyB3aGVuIG5vIHNwZWNpZmljIGZsYXZvdXIgaXMgcHJvdmlkZWQuXG4gKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeSBhcyB0aGUgZmFsbGJhY2sgZmxhdm91ciBmb3IgZGVjb3JhdG9ycy5cbiAqXG4gKiBAY29uc3Qge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEZsYXZvdXIgPSBcImRlY2FmXCI7XG4iLCJpbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgS2V5cyB1c2VkIGZvciBjb21wYXJpc29uLWJhc2VkIHZhbGlkYXRpb25zLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTFMgLSBWYWxpZGF0ZXMgaWYgdHdvIHZhbHVlcyBhcmUgZXF1YWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRiAtIFZhbGlkYXRlcyBpZiB0d28gdmFsdWVzIGFyZSBkaWZmZXJlbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOIC0gVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIGFub3RoZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOX09SX0VRVUFMIC0gVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOIC0gVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIGFub3RoZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOX09SX0VRVUFMIC0gVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuXG4gKlxuICogQGNvbnN0YW50IENvbXBhcmlzb25WYWxpZGF0aW9uS2V5c1xuICogQG1lbWJlcm9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzID0ge1xuICBFUVVBTFM6IFwiZXF1YWxzXCIsXG4gIERJRkY6IFwiZGlmZmVyZW50XCIsXG4gIExFU1NfVEhBTjogXCJsZXNzVGhhblwiLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwibGVzc1RoYW5PckVxdWFsXCIsXG4gIEdSRUFURVJfVEhBTjogXCJncmVhdGVyVGhhblwiLFxuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUw6IFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBrZXlzIHVzZWQgZm9yIHZhbGlkYXRpb25cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBwcmVmaXhlcyBvdGhlcnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCBzZXRzIGFzIHJlcXVpcmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOIGRlZmluZXMgbWluIHZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIGRlZmluZXMgbWF4IHZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1RFUCBkZWZpbmVzIHN0ZXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU5fTEVOR1RIIGRlZmluZXMgbWluIGxlbmd0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWF9MRU5HVEggZGVmaW5lcyBtYXggbGVuZ3RoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFUVEVSTiBkZWZpbmVzIHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCBkZWZpbmVzIGVtYWlsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIGRlZmluZXMgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSBkZWZpbmVzIGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIGRlZmluZXMgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIGRlZmluZXMgcGFzc3dvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMSVNUIGRlZmluZXMgbGlzdFxuICpcbiAqIEBjb25zdGFudCBWYWxpZGF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGlvbktleXMgPSB7XG4gIFJFRkxFQ1Q6IGAke01vZGVsS2V5cy5SRUZMRUNUfXZhbGlkYXRpb24uYCxcbiAgVkFMSURBVE9SOiBcInZhbGlkYXRvclwiLFxuICBSRVFVSVJFRDogXCJyZXF1aXJlZFwiLFxuICBNSU46IFwibWluXCIsXG4gIE1BWDogXCJtYXhcIixcbiAgU1RFUDogXCJzdGVwXCIsXG4gIE1JTl9MRU5HVEg6IFwibWlubGVuZ3RoXCIsXG4gIE1BWF9MRU5HVEg6IFwibWF4bGVuZ3RoXCIsXG4gIFBBVFRFUk46IFwicGF0dGVyblwiLFxuICBFTUFJTDogXCJlbWFpbFwiLFxuICBVUkw6IFwidXJsXCIsXG4gIERBVEU6IFwiZGF0ZVwiLFxuICBUWVBFOiBcInR5cGVcIixcbiAgUEFTU1dPUkQ6IFwicGFzc3dvcmRcIixcbiAgTElTVDogXCJsaXN0XCIsXG4gIEZPUk1BVDogXCJmb3JtYXRcIixcbiAgLi4uQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAc3VtbWFyeSBsaXN0IG9mIG1vbnRoIG5hbWVzXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIG1vbnRoIG5hbWVzLiBDYW4gYmUgY2hhbmdlZCBmb3IgbG9jYWxpemF0aW9uIHB1cnBvc2VzXG4gKlxuICogQGNvbnN0YW50IE1PTlRIX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBNT05USF9OQU1FUyA9IFtcbiAgXCJKYW51YXJ5XCIsXG4gIFwiRmVicnVhcnlcIixcbiAgXCJNYXJjaFwiLFxuICBcIkFwcmlsXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuZVwiLFxuICBcIkp1bHlcIixcbiAgXCJBdWd1c3RcIixcbiAgXCJTZXB0ZW1iZXJcIixcbiAgXCJPY3RvYmVyXCIsXG4gIFwiTm92ZW1iZXJcIixcbiAgXCJEZWNlbWJlclwiLFxuXTtcblxuLyoqXG4gKiBAc3VtbWFyeSBsaXN0IG9mIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWtcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgbmFtZXMgZm9yIGRheXMgb2YgdGhlIHdlZWsuIENhbiBiZSBjaGFuZ2VkIGZvciBsb2NhbGl6YXRpb24gcHVycG9zZXNcbiAqXG4gKiBAY29uc3RhbnQgREFZU19PRl9XRUVLX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEQVlTX09GX1dFRUtfTkFNRVMgPSBbXG4gIFwiU3VuZGF5XCIsXG4gIFwiTW9uZGF5XCIsXG4gIFwiVHVlc2RheVwiLFxuICBcIldlZG5lc2RheVwiLFxuICBcIlRodXJzZGF5XCIsXG4gIFwiRnJpZGF5XCIsXG4gIFwiU2F0dXJkYXlcIixcbl07XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUZBVUxUIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElTVF9JTlNJREUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUxfTk9UX0ZPVU5EIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjb25zdGFudCBERUZBVUxUX0VSUk9SX01FU1NBR0VTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRVFVSVJFRDogXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIsXG4gIE1JTjogXCJUaGUgbWluaW11bSB2YWx1ZSBpcyB7MH1cIixcbiAgTUFYOiBcIlRoZSBtYXhpbXVtIHZhbHVlIGlzIHswfVwiLFxuICBNSU5fTEVOR1RIOiBcIlRoZSBtaW5pbXVtIGxlbmd0aCBpcyB7MH1cIixcbiAgTUFYX0xFTkdUSDogXCJUaGUgbWF4aW11bSBsZW5ndGggaXMgezB9XCIsXG4gIFBBVFRFUk46IFwiVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcIlRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbWFpbFwiLFxuICBVUkw6IFwiVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIFVSTFwiLFxuICBUWVBFOiBcIkludmFsaWQgdHlwZS4gRXhwZWN0ZWQgezB9LCByZWNlaXZlZCB7MX1cIixcbiAgU1RFUDogXCJJbnZhbGlkIHZhbHVlLiBOb3QgYSBzdGVwIG9mIHswfVwiLFxuICBEQVRFOiBcIkludmFsaWQgdmFsdWUuIG5vdCBhIHZhbGlkIERhdGVcIixcbiAgREVGQVVMVDogXCJUaGVyZSBpcyBhbiBFcnJvclwiLFxuICBQQVNTV09SRDpcbiAgICBcIk11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9uZSBvZiBudW1iZXIsIGxvd2VyIGFuZCB1cHBlciBjYXNlIGxldHRlcnMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlciAoQCQhJSo/Jl8tLiwpXCIsXG4gIExJU1Q6IFwiSW52YWxpZCBsaXN0IG9mIHswfVwiLFxuICBNT0RFTF9OT1RfRk9VTkQ6IFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCB1bmRlciB7MH1cIixcbiAgRVFVQUxTOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBmaWVsZCB7MH1cIixcbiAgRElGRjogXCJUaGlzIGZpZWxkIG11c3QgYmUgZGlmZmVyZW50IGZyb20gZmllbGQgezB9XCIsXG4gIExFU1NfVEhBTjogXCJUaGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIGZpZWxkIHswfVwiLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBmaWVsZCB7MH1cIixcbiAgR1JFQVRFUl9USEFOOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gZmllbGQgezB9XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDpcbiAgICBcIlRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZmllbGQgezB9XCIsXG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgZGVmYXVsdCByZWdleHAgcGF0dGVybnMgdXNlZFxuICpcbiAqIEBlbnVtIERFRkFVTFRfUEFUVEVSTlNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFUVEVSTlMgPSB7XG4gIEVNQUlMOlxuICAgIC9bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqQCg/OlthLXpBLVowLTldKD86W2EtejAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVowLTldKD86W2EtekEtWjAtOS1dKlthLXpBLVowLTldKT8vLFxuICBVUkw6IC9eKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXowLTlcXHUwMGExLVxcdWZmZmZdW2EtejAtOVxcdTAwYTEtXFx1ZmZmZl8tXXswLDYyfSk/W2EtejAtOVxcdTAwYTEtXFx1ZmZmZl1cXC4pKyg/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfVxcLj8pKSg/OjpcXGR7Miw1fSk/KD86Wy8/I11cXFMqKT8kL2ksXG4gIFBBU1NXT1JEOiB7XG4gICAgQ0hBUjhfT05FX09GX0VBQ0g6XG4gICAgICAvXig/PS4qW2Etel0pKD89LipbQS1aXSkoPz0uKlxcZCkoPz0uKltAJCElKj8mX1xcLS4sXSlbQS1aYS16XFxkQCQhJSo/Jl9cXC0uLF17OCx9JC9nLFxuICB9LFxufTtcbiIsIi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gW2FyZ3NdIHJlcGxhY2VtZW50cyBtYWRlIGJ5IG9yZGVyIG9mIGFwcGVhcmFuY2UgKHJlcGxhY2VtZW50MCB3aWwgcmVwbGFjZSB7MH0gYW5kIHNvIG9uKVxuICogQHJldHVybiB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGb3JtYXQoc3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IGFyZ3NbbnVtYmVyXS50b1N0cmluZygpXG4gICAgICA6IFwidW5kZWZpbmVkXCI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqIEBkZXNjcmlwdGlvbiBhbGlhcyBmb3Ige0BsaW5rIHN0cmluZ0Zvcm1hdH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBzZiA9IHN0cmluZ0Zvcm1hdDtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIERBWVNfT0ZfV0VFS19OQU1FUyxcbiAgTU9OVEhfTkFNRVMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuL3N0cmluZ3NcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXZlcnNlcyB0aGUgcHJvY2VzcyBmcm9tIHtAbGluayBmb3JtYXREYXRlfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlIHRoZSBkYXRlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgYmFjayBpbnRvIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGRhdGUgZm9ybWF0XG4gKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZSBmcm9tIHRoZSBmb3JtYXQgb3IgdGhlIHN0YW5kYXJkIG5ldyBEYXRlKHtAcHJvcCBkYXRlfSkgaWYgdGhlIHN0cmluZyBjb3VsZG4ndCBiZSBwYXJzZWQgKGFyZSB5b3Ugc3VyZSB0aGUgZm9ybWF0IG1hdGNoZXMgdGhlIHN0cmluZz8pXG4gKlxuICogQGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0KGRhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpIHtcbiAgbGV0IGZvcm1hdFJlZ2V4cDogc3RyaW5nID0gZm9ybWF0O1xuXG4gIC8vIEhvdXJcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaGgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImhoXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSEgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkhIXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gTWludXRlc1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tbS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwibW1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtXCIsIFwiKD88bWludXRlcz5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBTZWNvbmRzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3NzLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJzc1wiLCBcIig/PHNlY29uZHM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNcIiwgXCIoPzxzZWNvbmRzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIERheVxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9kZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZGRcIiwgXCIoPzxkYXk+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2QvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImRcIiwgXCIoPzxkYXk+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5IE9mIFdlZWtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFRVwiLCBcIig/PGRheW9md2Vlaz5cXFxcdyspXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1lbHNlLWlmXG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG5cbiAgLy8gWWVhclxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eXl5LykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJ5eXl5XCIsIFwiKD88eWVhcj5cXFxcZHs0fSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgveXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5XCIsIFwiKD88eWVhcj5cXFxcZHsyfSlcIik7XG5cbiAgLy8gTW9udGhcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NTVwiLCBcIig/PG1vbnRobmFtZT5cXFxcdyspXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NXCIsIFwiKD88bW9udGhuYW1lc21hbGw+XFxcXHcrKVwiKTtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NXCIsIFwiKD88bW9udGg+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL00vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1cIiwgXCIoPzxtb250aD5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaWxpcyBhbmQgQW0gUG1cbiAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwXG4gICAgLnJlcGxhY2UoXCJTXCIsIFwiKD88bWlsaXM+XFxcXGR7MSwzfSlcIilcbiAgICAucmVwbGFjZShcImFhYVwiLCBcIig/PGFtcG0+XFxcXHd7Mn0pXCIpO1xuXG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZm9ybWF0UmVnZXhwLCBcImdcIik7XG5cbiAgY29uc3QgbWF0Y2g6IHtcbiAgICBncm91cHM6IHtcbiAgICAgIHllYXI/OiBzdHJpbmc7XG4gICAgICBkYXk/OiBzdHJpbmc7XG4gICAgICBhbXBtPzogc3RyaW5nO1xuICAgICAgaG91cj86IHN0cmluZztcbiAgICAgIG1pbnV0ZXM/OiBzdHJpbmc7XG4gICAgICBzZWNvbmRzPzogc3RyaW5nO1xuICAgICAgbWlsaXM/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWU/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWVzbWFsbD86IHN0cmluZztcbiAgICAgIG1vbnRoPzogc3RyaW5nO1xuICAgIH07XG4gIH0gPSByZWdleHAuZXhlYyhkYXRlKSBhcyBhbnk7XG5cbiAgaWYgKCFtYXRjaCB8fCAhbWF0Y2guZ3JvdXBzKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG5cbiAgY29uc3Qgc2FmZVBhcnNlSW50ID0gZnVuY3Rpb24gKG4/OiBzdHJpbmcpIHtcbiAgICBpZiAoIW4pIHJldHVybiAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KG4pO1xuXG4gICAgcmV0dXJuIGlzTmFOKHJlc3VsdCkgPyAwIDogcmVzdWx0O1xuICB9O1xuXG4gIGNvbnN0IHllYXIgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnllYXIpO1xuICBjb25zdCBkYXkgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLmRheSk7XG5cbiAgY29uc3QgYW1QbSA9IG1hdGNoLmdyb3Vwcy5hbXBtO1xuICBsZXQgaG91ciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuaG91cik7XG5cbiAgaWYgKGFtUG0pIGhvdXIgPSBhbVBtID09PSBcIlBNXCIgPyBob3VyICsgMTIgOiBob3VyO1xuXG4gIGNvbnN0IG1pbnV0ZXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbnV0ZXMpO1xuICBjb25zdCBzZWNvbmRzID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5zZWNvbmRzKTtcbiAgY29uc3QgbXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbGlzKTtcblxuICBjb25zdCBtb250aE5hbWUgPSBtYXRjaC5ncm91cHMubW9udGhuYW1lO1xuICBjb25zdCBtb250aE5hbWVTbWFsbCA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWVzbWFsbDtcbiAgbGV0IG1vbnRoOiBudW1iZXIgfCBzdHJpbmcgPSBtYXRjaC5ncm91cHMubW9udGggYXMgc3RyaW5nO1xuICBpZiAobW9udGhOYW1lKSBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobW9udGhOYW1lKTtcbiAgZWxzZSBpZiAobW9udGhOYW1lU21hbGwpIHtcbiAgICBjb25zdCBtID0gTU9OVEhfTkFNRVMuZmluZCgobSkgPT5cbiAgICAgIG0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1vbnRoTmFtZVNtYWxsLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgICBpZiAoIW0pIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgICBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobSk7XG4gIH0gZWxzZSBtb250aCA9IHNhZmVQYXJzZUludChgJHttb250aH1gKTtcblxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMsIG1zKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmluZHMgYSBzcGVjaWZpYyBkYXRlIGZvcm1hdCB0byBhIERhdGUgb2JqZWN0J3MgdG9TdHJpbmcgYW5kIHRvSVNPU3RyaW5nIG1ldGhvZHNcbiAqIEBzdW1tYXJ5IE1vZGlmaWVzIGEgRGF0ZSBvYmplY3QgdG8gcmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyB3aGVuIHRvU3RyaW5nIG9yIHRvSVNPU3RyaW5nIGlzIGNhbGxlZC5cbiAqIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHRvU3RyaW5nIGFuZCB0b0lTT1N0cmluZyBtZXRob2RzIG9mIHRoZSBEYXRlIG9iamVjdCB0byByZXR1cm5cbiAqIHRoZSBkYXRlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICogQHBhcmFtIHtEYXRlfSBbZGF0ZV0gVGhlIERhdGUgb2JqZWN0IHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZSBmb3IgZm9ybWF0dGluZyB0aGUgZGF0ZVxuICogQHJldHVybiB7RGF0ZXx1bmRlZmluZWR9IFRoZSBtb2RpZmllZCBEYXRlIG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZGF0ZSB3YXMgcHJvdmlkZWRcbiAqIEBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmREYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgaWYgKCFkYXRlKSByZXR1cm47XG4gIGNvbnN0IGZ1bmMgPSAoKSA9PiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvSVNPU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsIFwidG9TdHJpbmdcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmMsXG4gIH0pO1xuICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZGF0ZSwgRGF0ZS5wcm90b3R5cGUpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2FmZWx5IGNoZWNrcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAqIEBzdW1tYXJ5IEEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdXNpbmcgaW5zdGFuY2VvZiBEYXRlIGFzIGl0IGFsc28gY2hlY2tzXG4gKiB0aGF0IHRoZSBkYXRlIGlzIG5vdCBOYU4sIHdoaWNoIGNhbiBoYXBwZW4gd2l0aCBpbnZhbGlkIGRhdGUgc3RyaW5ncy5cbiAqIEBwYXJhbSB7YW55fSBkYXRlIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKiBAZnVuY3Rpb24gaXNWYWxpZERhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBkYXRlICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGUpID09PSBcIltvYmplY3QgRGF0ZV1cIiAmJlxuICAgICFOdW1iZXIuaXNOYU4oZGF0ZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHBhZCBudW1iZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICpcbiAqIEBmdW5jdGlvbiB0d29EaWdpdFBhZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d29EaWdpdFBhZChudW06IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBudW0gPCAxMCA/IFwiMFwiICsgbnVtIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBGb3JtYXQgSGFuZGxpbmdcbiAqIEBkZXNjcmlwdGlvbiBDb2RlIGZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NTI0NjEvaG93LXRvLWZvcm1hdC1hLWphdmFzY3JpcHQtZGF0ZX1cbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5TdHJdIGRlZmF1bHRzIHRvICd5eXl5L01NL2RkJ1xuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZm9ybWF0RGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGU6IERhdGUsIHBhdHRlcm5TdHI6IHN0cmluZyA9IFwieXl5eS9NTS9kZFwiKSB7XG4gIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCksXG4gICAgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSxcbiAgICB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgaG91cjogbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpLFxuICAgIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgc2Vjb25kOiBudW1iZXIgPSBkYXRlLmdldFNlY29uZHMoKSxcbiAgICBtaWxpc2Vjb25kczogbnVtYmVyID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICBoOiBudW1iZXIgPSBob3VyICUgMTIsXG4gICAgaGg6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGgpLFxuICAgIEhIOiBzdHJpbmcgPSB0d29EaWdpdFBhZChob3VyKSxcbiAgICBtbTogc3RyaW5nID0gdHdvRGlnaXRQYWQobWludXRlKSxcbiAgICBzczogc3RyaW5nID0gdHdvRGlnaXRQYWQoc2Vjb25kKSxcbiAgICBhYWE6IHN0cmluZyA9IGhvdXIgPCAxMiA/IFwiQU1cIiA6IFwiUE1cIixcbiAgICBFRUVFOiBzdHJpbmcgPSBEQVlTX09GX1dFRUtfTkFNRVNbZGF0ZS5nZXREYXkoKV0sXG4gICAgRUVFOiBzdHJpbmcgPSBFRUVFLnN1YnN0cigwLCAzKSxcbiAgICBkZDogc3RyaW5nID0gdHdvRGlnaXRQYWQoZGF5KSxcbiAgICBNOiBudW1iZXIgPSBtb250aCArIDEsXG4gICAgTU06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKE0pLFxuICAgIE1NTU06IHN0cmluZyA9IE1PTlRIX05BTUVTW21vbnRoXSxcbiAgICBNTU06IHN0cmluZyA9IE1NTU0uc3Vic3RyKDAsIDMpLFxuICAgIHl5eXk6IHN0cmluZyA9IHllYXIgKyBcIlwiLFxuICAgIHl5OiBzdHJpbmcgPSB5eXl5LnN1YnN0cigyLCAyKTtcbiAgLy8gY2hlY2tzIHRvIHNlZSBpZiBtb250aCBuYW1lIHdpbGwgYmUgdXNlZFxuICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0clxuICAgIC5yZXBsYWNlKFwiaGhcIiwgaGgpXG4gICAgLnJlcGxhY2UoXCJoXCIsIGgudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIkhIXCIsIEhIKVxuICAgIC5yZXBsYWNlKFwiSFwiLCBob3VyLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJtbVwiLCBtbSlcbiAgICAucmVwbGFjZShcIm1cIiwgbWludXRlLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJzc1wiLCBzcylcbiAgICAucmVwbGFjZShcInNcIiwgc2Vjb25kLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJTXCIsIG1pbGlzZWNvbmRzLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJkZFwiLCBkZClcbiAgICAucmVwbGFjZShcImRcIiwgZGF5LnRvU3RyaW5nKCkpXG5cbiAgICAucmVwbGFjZShcIkVFRUVcIiwgRUVFRSlcbiAgICAucmVwbGFjZShcIkVFRVwiLCBFRUUpXG4gICAgLnJlcGxhY2UoXCJ5eXl5XCIsIHl5eXkpXG4gICAgLnJlcGxhY2UoXCJ5eVwiLCB5eSlcbiAgICAucmVwbGFjZShcImFhYVwiLCBhYWEpO1xuICBpZiAocGF0dGVyblN0ci5pbmRleE9mKFwiTU1NXCIpID4gLTEpIHtcbiAgICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0ci5yZXBsYWNlKFwiTU1NTVwiLCBNTU1NKS5yZXBsYWNlKFwiTU1NXCIsIE1NTSk7XG4gIH0gZWxzZSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NXCIsIE1NKS5yZXBsYWNlKFwiTVwiLCBNLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBwYXR0ZXJuU3RyO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhcnNlcyBhIGRhdGUgZnJvbSBhIHNwZWNpZmllZCBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgRGF0ZSB8IG51bWJlcn0gW3ZdXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZShmb3JtYXQ6IHN0cmluZywgdj86IHN0cmluZyB8IERhdGUgfCBudW1iZXIpIHtcbiAgbGV0IHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAodiBpbnN0YW5jZW9mIERhdGUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZSh2IGFzIERhdGUsIGZvcm1hdCksIGZvcm1hdCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdi50b1N0cmluZygpLCBmb3JtYXQpXG4gICAgICApO1xuICAgIH1cbiAgZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KHYsIGZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKGQsIGZvcm1hdCksIGZvcm1hdCk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZERhdGUodikpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHYpO1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKGQsIGZvcm1hdCksIGZvcm1hdCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGUgezB9IHRvIGZvcm1hdDogezF9XCIsIHYsIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBwcm92aWRlZCAke3Z9YCk7XG4gIH1cbiAgcmV0dXJuIGJpbmREYXRlVG9TdHJpbmcodmFsdWUsIGZvcm1hdCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZGVjb3JhdG9yIG1hbmFnZW1lbnQgY2xhc3MgdGhhdCBoYW5kbGVzIGZsYXZvdXJlZCBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuXG4gKiBJdCBzdXBwb3J0cyByZWdpc3RlcmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGNvbnRleHQtYXdhcmUgZmxhdm91ciByZXNvbHV0aW9uLlxuICogVGhlIGNsYXNzIGltcGxlbWVudHMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBkZWZpbmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3VycyxcbiAqIGFsbG93aW5nIGZvciBmcmFtZXdvcmstc3BlY2lmaWMgZGVjb3JhdG9yIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBmbGF2b3VyIHBhcmFtZXRlciBmb3IgdGhlIGRlY29yYXRvciBjb250ZXh0XG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTdG9yZXMgYWxsIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycyBvcmdhbml6ZWQgYnkga2V5IGFuZCBmbGF2b3VyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXRcbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmxhdm91clJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIgPSBkZWZhdWx0Rmxhdm91clJlc29sdmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxcbiAgICBDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yXG4gID47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgYWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVjb3JhdG9yIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBkZWNvcmF0aW9uIGNoYWluIHdpdGggdGhlIHNwZWNpZmllZCBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvclxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBhZGQgZGVjb3JhdG9ycyB3aXRoIGFkZG9uIHN1cHBvcnRcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWRkb249ZmFsc2VdIFdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZG9uc1xuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBcnJheSBvZiBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge3RoaXN9IEN1cnJlbnQgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSBkZWNvcmF0b3JzIGNhbiBiZSBhZGRlZFwiKTtcbiAgICBpZiAoXG4gICAgICAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSAmJlxuICAgICAgIWFkZG9uICYmXG4gICAgICB0aGlzLmZsYXZvdXIgIT09IERlZmF1bHRGbGF2b3VyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk11c3QgcHJvdmlkZSBvdmVycmlkZXMgb3IgYWRkb25zIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBkZWNhZidzIGRlY29yYXRvcnNcIlxuICAgICAgKTtcbiAgICBpZiAodGhpcy5mbGF2b3VyID09PSBEZWZhdWx0Rmxhdm91ciAmJiBhZGRvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmF1bHQgZmxhdm91ciBjYW5ub3QgYmUgZXh0ZW5kZWRcIik7XG5cbiAgICB0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSA9IG5ldyBTZXQoW1xuICAgICAgLi4uKHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICAuLi5kZWNvcmF0b3JzLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGJhc2UgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byBkZWZpbmVcbiAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlIGZvciBmaW5pc2hpbmcgdGhlIGNoYWluXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBBZGRzIGFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yXG4gICAqL1xuICBleHRlbmQoXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBjb25zdCBjb250ZXh0RGVjb3JhdG9yID0gZnVuY3Rpb24gY29udGV4dERlY29yYXRvcihcbiAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICAgICkge1xuICAgICAgY29uc3QgZmxhdm91ciA9IERlY29yYXRpb24uZmxhdm91clJlc29sdmVyKHRhcmdldCk7XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdXG4gICAgICAgID8gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcbiAgICAgIGlmIChcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gJiZcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gJiZcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9yc1xuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW0RlZmF1bHRGbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfVxuICAgICAgW1xuICAgICAgICAuLi4oZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMudmFsdWVzKCkgOiBbXSksXG4gICAgICAgIC4uLihleHRyYXMgPyBleHRyYXMudmFsdWVzKCkgOiBbXSksXG4gICAgICBdLmZvckVhY2goKGQpID0+IChkIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciwgZGVzY3JpcHRvcikpO1xuICAgICAgLy8gcmV0dXJuIGFwcGx5KFxuICAgICAgLy9cbiAgICAgIC8vICkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dERlY29yYXRvciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBbZiwga2V5XS5qb2luKFwiX2RlY29yYXRvcl9mb3JfXCIpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZXh0RGVjb3JhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBmaW5hbCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvblxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueT8sIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPyk6IGFueX0gVGhlIGdlbmVyYXRlZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKHRoaXMua2V5LCB0aGlzLmZsYXZvdXIsIHRoaXMuZGVjb3JhdG9ycywgdGhpcy5leHRyYXMpO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRvckZhY3RvcnkodGhpcy5rZXksIHRoaXMuZmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBkZWNvcmF0b3JzIGZvciBhIHNwZWNpZmljIGtleSBhbmQgZmxhdm91clxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBEZWNvcmF0b3IgZmxhdm91clxuICAgKiBAcGFyYW0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9yc1xuICAgKiBAcGFyYW0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPixcbiAgICBleHRyYXM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGRlY29yYXRvciBmbGF2b3Vyc1xuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vyc1xuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIHN0YXRpYyBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKCkuZm9yKGtleSk7XG4gIH1cblxuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbW9kZWwgYXR0cmlidXRlc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1hcmtzIGNsYXNzIHByb3BlcnRpZXMgYXMgbW9kZWwgYXR0cmlidXRlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PU1vZGVsS2V5cy5BVFRSSUJVVEVdIC0gVGhlIG1ldGFkYXRhIGtleSB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgcHJvcGVydHkgbmFtZVxuICogQHJldHVybiB7ZnVuY3Rpb24ob2JqZWN0LCBhbnk/KTogdm9pZH0gLSBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCByZWdpc3RlcnMgdGhlIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICpcbiAqICAgIEQtPj5NOiBDaGVjayBpZiBrZXkgZXhpc3RzXG4gKiAgICBhbHQga2V5IGV4aXN0c1xuICogICAgICAgIE0tLT4+RDogUmV0dXJuIGV4aXN0aW5nIHByb3BzIGFycmF5XG4gKiAgICBlbHNlIGtleSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICAgRC0+Pk06IENyZWF0ZSBuZXcgcHJvcHMgYXJyYXlcbiAqICAgIGVuZFxuICogICAgRC0+Pk06IENoZWNrIGlmIHByb3BlcnR5IGV4aXN0c1xuICogICAgYWx0IHByb3BlcnR5IG5vdCBpbiBhcnJheVxuICogICAgICAgIEQtPj5NOiBBZGQgcHJvcGVydHkgdG8gYXJyYXlcbiAqICAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcChrZXk6IHN0cmluZyA9IE1vZGVsS2V5cy5BVFRSSUJVVEUpIHtcbiAgcmV0dXJuIChtb2RlbDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSk6IHZvaWQgPT4ge1xuICAgIGxldCBwcm9wczogc3RyaW5nW107XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwga2V5KSkge1xuICAgICAgcHJvcHMgPSAobW9kZWwgYXMgYW55KVtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcyA9IChtb2RlbCBhcyBhbnkpW2tleV0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5pbmNsdWRlcyhwcm9wZXJ0eUtleSBhcyBzdHJpbmcpKVxuICAgICAgcHJvcHMucHVzaChwcm9wZXJ0eUtleSBhcyBzdHJpbmcpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21iaW5lZCBwcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbWV0YWRhdGEgYW5kIGF0dHJpYnV0ZSBtYXJraW5nXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgYm90aCBtYXJrcyBhIHByb3BlcnR5IGFzIGEgbW9kZWwgYXR0cmlidXRlIGFuZCBhc3NpZ25zIG1ldGFkYXRhIHRvIGl0XG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbWV0YWRhdGEga2V5XG4gKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybiB7RnVuY3Rpb259IC0gQ29tYmluZWQgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKiBAZnVuY3Rpb24gcHJvcE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE1ldGFkYXRhPFY+KGtleTogc3RyaW5nLCB2YWx1ZTogVikge1xuICByZXR1cm4gYXBwbHkocHJvcCgpLCBtZXRhZGF0YTxWPihrZXksIHZhbHVlKSk7XG59XG4iLCIvKipcbiAqIEBzdW1tYXJ5IE1pbWljcyBKYXZhJ3MgU3RyaW5nJ3MgSGFzaCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sIHwgRGF0ZX0gb2JqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IGhhc2ggdmFsdWUgb2Ygb2JqXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hDb2RlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hDb2RlKG9iajogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sIHwgRGF0ZSk6IHN0cmluZyB7XG4gIG9iaiA9IFN0cmluZyhvYmopO1xuICBsZXQgaGFzaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gb2JqLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXJhY3RlcjtcbiAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoYXNoLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0ZWggdHlwZSBmb3IgYSBIYXNoaW5nIGZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgSGFzaGluZ0Z1bmN0aW9uID0gKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogQHN1bW1hcnkgSGFzaGVzIGFuIG9iamVjdCBieSBjb21iaW5pbmcgdGhlIGhhc2ggb2YgYWxsIGl0cyBwcm9wZXJ0aWVzXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHJlc3VsdGluZyBoYXNoXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hPYmpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaE9iaihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hSZWR1Y2VyID0gZnVuY3Rpb24gKGg6IG51bWJlciB8IHN0cmluZywgZWw6IGFueSk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgY29uc3QgZWxIYXNoID0gaGFzaEZ1bmN0aW9uKGVsKTtcblxuICAgIGlmICh0eXBlb2YgZWxIYXNoID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIGhhc2hGdW5jdGlvbigoKGggYXMgc3RyaW5nKSB8fCBcIlwiKSArIGhhc2hGdW5jdGlvbihlbCkpO1xuXG4gICAgaCA9IGggfHwgMDtcbiAgICBoID0gKChoIGFzIG51bWJlcikgPDwgNSkgLSAoaCBhcyBudW1iZXIpICsgZWxIYXNoO1xuICAgIHJldHVybiBoICYgaDtcbiAgfTtcblxuICBjb25zdCBmdW5jOiBIYXNoaW5nRnVuY3Rpb24gPSBoYXNoQ29kZTtcblxuICBjb25zdCBoYXNoRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWU6IGFueSk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwiXCI7XG4gICAgaWYgKFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcInN5bWJvbFwiXS5pbmRleE9mKHR5cGVvZiB2YWx1ZSkgIT09IC0xKVxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUudG9TdHJpbmcoKSk7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGZ1bmModmFsdWUuZ2V0VGltZSgpKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5yZWR1Y2UoaGFzaFJlZHVjZXIsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIChPYmplY3QudmFsdWVzKHZhbHVlKSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKS5yZWR1Y2UoXG4gICAgICBoYXNoUmVkdWNlcixcbiAgICAgIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHN0cmluZyB8IG51bWJlclxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LnZhbHVlcyhvYmopLnJlZHVjZShoYXNoUmVkdWNlciwgMCk7XG5cbiAgcmV0dXJuICh0eXBlb2YgcmVzdWx0ID09PSBcIm51bWJlclwiID8gTWF0aC5hYnMocmVzdWx0KSA6IHJlc3VsdCkudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRIYXNoaW5nTWV0aG9kID0gXCJkZWZhdWx0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hbmFnZXMgaGFzaGluZyBtZXRob2RzIGFuZCBwcm92aWRlcyBhIHVuaWZpZWQgaGFzaGluZyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IEEgdXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgZm9yIGRpZmZlcmVudCBoYXNoaW5nIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyB0byBoYXNoIG9iamVjdHMuXG4gKiBUaGUgY2xhc3MgbWFpbnRhaW5zIGEgY2FjaGUgb2YgcmVnaXN0ZXJlZCBoYXNoaW5nIGZ1bmN0aW9ucyBhbmQgYWxsb3dzIHNldHRpbmcgYSBkZWZhdWx0IGhhc2hpbmcgbWV0aG9kLlxuICogSXQgcHJldmVudHMgZGlyZWN0IGluc3RhbnRpYXRpb24gYW5kIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciByZWdpc3RyYXRpb24gYW5kIGhhc2hpbmcuXG4gKlxuICogQGNsYXNzIEhhc2hpbmdcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBSZWdpc3RlciBhIGN1c3RvbSBoYXNoaW5nIGZ1bmN0aW9uXG4gKiBIYXNoaW5nLnJlZ2lzdGVyKCdtZDUnLCAob2JqKSA9PiBjcmVhdGVNRDVIYXNoKG9iaiksIHRydWUpO1xuICpcbiAqIC8vIEhhc2ggYW4gb2JqZWN0IHVzaW5nIGRlZmF1bHQgbWV0aG9kXG4gKiBjb25zdCBoYXNoMSA9IEhhc2hpbmcuaGFzaChteU9iamVjdCk7XG4gKlxuICogLy8gSGFzaCB1c2luZyBzcGVjaWZpYyBtZXRob2RcbiAqIGNvbnN0IGhhc2gyID0gSGFzaGluZy5oYXNoKG15T2JqZWN0LCAnbWQ1Jyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEhhc2hpbmcge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVmYXVsdCBoYXNoaW5nIG1ldGhvZCBpZGVudGlmaWVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OiBzdHJpbmcgPSBEZWZhdWx0SGFzaGluZ01ldGhvZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhY2hlIG9mIHJlZ2lzdGVyZWQgaGFzaGluZyBmdW5jdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBIYXNoaW5nRnVuY3Rpb24+ID0ge1xuICAgIGRlZmF1bHQ6IGhhc2hPYmosXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIGhhc2hpbmcgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIGhhc2hpbmcgZnVuY3Rpb24gZnJvbSB0aGUgY2FjaGUgYnkgaXRzIGtleS4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtZXRob2QgaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgaGFzaGluZyBmdW5jdGlvbiB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtIYXNoaW5nRnVuY3Rpb259IFRoZSByZXF1ZXN0ZWQgaGFzaGluZyBmdW5jdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBoYXNoaW5nIG1ldGhvZCByZWdpc3RlcmVkIHVuZGVyICR7a2V5fWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBuZXcgaGFzaGluZyBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIGEgbmV3IGhhc2hpbmcgZnVuY3Rpb24gdG8gdGhlIHJlZ2lzdHJ5LiBPcHRpb25hbGx5IHNldHMgaXQgYXMgdGhlIGRlZmF1bHQgbWV0aG9kLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBrZXkgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBoYXNoaW5nIGZ1bmN0aW9uXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZnVuYzogSGFzaGluZ0Z1bmN0aW9uLFxuICAgIHNldERlZmF1bHQgPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhhc2hpbmcgbWV0aG9kICR7a2V5fSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLmNhY2hlW2tleV0gPSBmdW5jO1xuICAgIGlmIChzZXREZWZhdWx0KSB0aGlzLmN1cnJlbnQgPSBrZXk7XG4gIH1cblxuICBzdGF0aWMgaGFzaChvYmo6IGFueSwgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgc2V0RGVmYXVsdChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZ2V0KG1ldGhvZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMsIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuXG5jb25zdCBmYWxsYmFja0dldFBhcmVudCA9ICh0YXJnZXQ6IGFueSkgPT4ge1xuICByZXR1cm4gdGFyZ2V0W1ZBTElEQVRJT05fUEFSRU5UX0tFWV07XG59O1xuXG5jb25zdCBmYWxsYmFja0dldFZhbHVlID0gKHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBwcm9wKSlcbiAgICB0aHJvdyBuZXcgRXJyb3Ioc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRVhJU1QsIHByb3ApKTtcbiAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbn07XG5cbi8qKlxuICogUHJveHkgb2JqZWN0IHRoYXQgcHJvdmlkZXMgcGF0aC1iYXNlZCBhY2Nlc3MgdG8gbmVzdGVkIHByb3BlcnRpZXNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHRhcmdldCBvYmplY3QgYmVpbmcgcHJveGllZFxuICovXG5leHBvcnQgdHlwZSBQYXRoUHJveHk8VD4gPSBUICYge1xuICAvLyBbUFJPWFlfUFJPUF06IGJvb2xlYW47XG4gIGdldFZhbHVlRnJvbVBhdGg6IChwYXRoOiBzdHJpbmcsIGZhbGxiYWNrPzogYW55KSA9PiBhbnk7XG59O1xuXG4vKipcbiAqIFN0YW5kYXJkIHBhdGggcmVzb2x1dGlvbiB1dGlsaXR5IGZvciBhY2Nlc3NpbmcgbmVzdGVkIG9iamVjdCBwcm9wZXJ0aWVzLlxuICogUHJvdmlkZXMgY29uc2lzdGVudCBkb3Qtbm90YXRpb24gYWNjZXNzIHRvIGJvdGggcGFyZW50IGFuZCBjaGlsZCBwcm9wZXJ0aWVzXG4gKiBhY3Jvc3MgY29tcGxleCBvYmplY3Qgc3RydWN0dXJlcy5cbiAqXG4gKiAtIERvdC1ub3RhdGlvbiBwYXRoIHJlc29sdXRpb24gKCdvYmplY3QuY2hpbGQucHJvcGVydHknKVxuICogLSBQYXJlbnQgdHJhdmVyc2FsIHVzaW5nICcuLi8nIG5vdGF0aW9uXG4gKiAtIENvbmZpZ3VyYWJsZSBwcm9wZXJ0eSBhY2Nlc3MgYmVoYXZpb3JcbiAqIC0gTnVsbC91bmRlZmluZWQgc2FmZXR5IGNoZWNrc1xuICovXG5leHBvcnQgY2xhc3MgUGF0aFByb3h5RW5naW5lIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXRoLWF3YXJlIHByb3h5IGZvciB0aGUgdGFyZ2V0IG9iamVjdFxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gICAqIEBwYXJhbSB7VH0gcm9vdFRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHByb3h5XG4gICAqIEBwYXJhbSBvcHRzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRzLmdldFZhbHVlIC0gQ3VzdG9tIGZ1bmN0aW9uIHRvIGdldCBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gb3B0cy5nZXRQYXJlbnQgLSBDdXN0b20gZnVuY3Rpb24gdG8gZ2V0IHBhcmVudCBvYmplY3RcbiAgICogQHBhcmFtIG9wdHMuaWdub3JlVW5kZWZpbmVkIC0gV2hldGhlciB0byBpZ25vcmUgdW5kZWZpbmVkIHZhbHVlcyBpbiBwYXRoc1xuICAgKiBAcGFyYW0gb3B0cy5pZ25vcmVOdWxsIC0gV2hldGhlciB0byBpZ25vcmUgbnVsbCB2YWx1ZXMgaW4gcGF0aHNcbiAgICogQHJldHVybnMgQSBwcm94eSBvYmplY3Qgd2l0aCBwYXRoIGFjY2VzcyBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgcm9vdFRhcmdldDogVCxcbiAgICBvcHRzPzoge1xuICAgICAgZ2V0VmFsdWU/OiAodGFyZ2V0OiBULCBwcm9wOiBzdHJpbmcpID0+IGFueTtcbiAgICAgIGdldFBhcmVudD86ICh0YXJnZXQ6IFQpID0+IGFueTtcbiAgICAgIGlnbm9yZVVuZGVmaW5lZDogYm9vbGVhbjtcbiAgICAgIGlnbm9yZU51bGw6IGJvb2xlYW47XG4gICAgfVxuICApOiBQYXRoUHJveHk8VD4ge1xuICAgIGNvbnN0IHsgZ2V0VmFsdWUsIGdldFBhcmVudCwgaWdub3JlVW5kZWZpbmVkLCBpZ25vcmVOdWxsIH0gPSB7XG4gICAgICBnZXRQYXJlbnQ6IGZhbGxiYWNrR2V0UGFyZW50LFxuICAgICAgZ2V0VmFsdWU6IGZhbGxiYWNrR2V0VmFsdWUsXG4gICAgICBpZ25vcmVOdWxsOiBmYWxzZSxcbiAgICAgIGlnbm9yZVVuZGVmaW5lZDogZmFsc2UsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh7fSBhcyBhbnksIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFwiZ2V0VmFsdWVGcm9tUGF0aFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBQYXRoUHJveHlFbmdpbmUucGFyc2VQYXRoKHBhdGgpO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IHJvb3RUYXJnZXQ7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICBpZiAocGFydCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0UGFyZW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHR5cGVvZiBwYXJlbnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2YoXG4gICAgICAgICAgICAgICAgICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5DT05URVhUX05PVF9PQkpFQ1RfQ09NUEFSSVNPTixcbiAgICAgICAgICAgICAgICAgICAgICBpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7IC8vUGF0aFByb3h5RW5naW5lLmNyZWF0ZShwYXJlbnRUYXJnZXQsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY3VycmVudCA9IGdldFZhbHVlKGN1cnJlbnQsIHBhcnQpO1xuICAgICAgICAgICAgICBpZiAoIWlnbm9yZVVuZGVmaW5lZCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX0lOVkFMSUQsIHBhdGgsIHBhcnQpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoIWlnbm9yZU51bGwgJiYgY3VycmVudCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX0lOVkFMSUQsIHBhdGgsIHBhcnQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCBQUk9YWV9QUk9QLCB7XG4gICAgLy8gICB2YWx1ZTogdHJ1ZSwgLy8gb3ZlcndyaXRlIGJ5IHByb3h5IGJlaGF2aW9yXG4gICAgLy8gICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAvLyAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgLy8gICB3cml0YWJsZTogZmFsc2UsXG4gICAgLy8gfSk7XG5cbiAgICByZXR1cm4gcHJveHkgYXMgUGF0aFByb3h5PFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHBhdGggc3RyaW5nIGludG8gaW5kaXZpZHVhbCBjb21wb25lbnRzXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggc3RyaW5nIHRvIHBhcnNlIChlLmcuLCBcInVzZXIuYWRkcmVzcy5jaXR5XCIpXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHBhdGggY29tcG9uZW50c1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwYXRoIGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiIHx8ICFwYXRoLnRyaW0oKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfUEFUSCwgcGF0aCkpO1xuICAgIHJldHVybiBwYXRoLm1hdGNoKC8oXFwuXFwufFteLy5dKykvZykgfHwgW107XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsRXJyb3JzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgQ2xhc3MgdG8gaG9sZCB0aGUgZXJyb3IgcmVzdWx0c1xuICogQGRlc2NyaXB0aW9uIGhvbGRzIGVycm9yIHJlc3VsdHMgaW4gYW4gJ2luZGV4YWJsZScgbWFubmVyXG4gKiB3aGlsZSBzdGlsbCBwcm92aWRpbmcgdGhlIHNhbWUgcmVzdWx0IG9uIHRvU3RyaW5nXG4gKlxuICogQHBhcmFtIHtNb2RlbEVycm9yc30gZXJyb3JzXG4gKlxuICogQGNsYXNzIE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEVycm9yRGVmaW5pdGlvbiB7XG4gIFtpbmRleGVyOiBzdHJpbmddOlxuICAgIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuICAgIHwgKCgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgY29uc3RydWN0b3IoZXJyb3JzOiBNb2RlbEVycm9ycykge1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBlcnJvcnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3JzLCBwcm9wKSAmJiBlcnJvcnNbcHJvcF0pXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzIGFzIGFueSwgcHJvcCwge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogZXJyb3JzW3Byb3BdLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IE91dHB1dHMgdGhlIGNsYXNzIHRvIGEgbmljZSByZWFkYWJsZSBzdHJpbmdcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGY6IGFueSA9IHRoaXMgYXMgYW55O1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzZWxmKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGspID0+XG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlbGYsIGspICYmXG4gICAgICAgICAgdHlwZW9mIHNlbGZba10gIT09IFwiZnVuY3Rpb25cIlxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZywgcHJvcCkgPT4ge1xuICAgICAgICBsZXQgcHJvcEVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBPYmplY3Qua2V5cyhzZWxmW3Byb3BdKS5yZWR1Y2UoXG4gICAgICAgICAgKHByb3BBY2N1bTogdW5kZWZpbmVkIHwgc3RyaW5nLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghcHJvcEFjY3VtKSBwcm9wQWNjdW0gPSBzZWxmW3Byb3BdW2tleV07XG4gICAgICAgICAgICBlbHNlIHByb3BBY2N1bSArPSBgXFxuJHtzZWxmW3Byb3BdW2tleV19YDtcbiAgICAgICAgICAgIHJldHVybiBwcm9wQWNjdW07XG4gICAgICAgICAgfSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJvcEVycm9yKSB7XG4gICAgICAgICAgcHJvcEVycm9yID0gYCR7cHJvcH0gLSAke3Byb3BFcnJvcn1gO1xuICAgICAgICAgIGlmICghYWNjdW0pIGFjY3VtID0gcHJvcEVycm9yO1xuICAgICAgICAgIGVsc2UgYWNjdW0gKz0gYFxcbiR7cHJvcEVycm9yfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBcIlwiKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSByZWxldmFudCBKUyBwcmltaXRpdmVzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNUUklORyByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIHJlZmVyZW5jZXMgdGhlIG51bWJlciBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOIHJlZmVyZW5jZXMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UIHJlZmVyZW5jZXMgdGhlIGJpZ2ludCBwcmltaXRpdmVcbiAqXG4gKiBAY29uc3RhbnQgUHJpbWl0aXZlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBQcmltaXRpdmVzIHtcbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgTlVNQkVSID0gXCJudW1iZXJcIixcbiAgQk9PTEVBTiA9IFwiYm9vbGVhblwiLFxuICBCSUdJTlQgPSBcImJpZ2ludFwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIFJlc2VydmVkIG1vZGVsIG5hbWVzIHRvIGlnbm9yZSBkdXJpbmcgTW9kZWwgcmVidWlsZGluZ1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVxuICpcbiAqIEBjb25zdGFudCBSZXNlcnZlZE1vZGVsc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBSZXNlcnZlZE1vZGVscyB7XG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIE9CSkVDVCA9IFwib2JqZWN0XCIsXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIEJPT0xFQU4gPSBcImJvb2xlYW5cIixcbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbiAgREFURSA9IFwiZGF0ZVwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIGJhc2ljIHN1cHBvcnRlZCBqcyB0eXBlc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcnJheVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG51bWJlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJvb2xlYW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW1ib2xcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmdW5jdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdJTlRcbiAqXG4gKiBAY29uc3RhbnQganNUeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QganNUeXBlcyA9IFtcbiAgXCJzdHJpbmdcIixcbiAgXCJhcnJheVwiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG4iLCJpbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgdmFsaWRhdG9ycyBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmtcbiAqIEBzdW1tYXJ5IFRoZSBWYWxpZGF0b3IgY2xhc3MgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbCB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb25zLlxuICogSXQgaGFuZGxlcyB0eXBlIGNoZWNraW5nLCBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmcsIGFuZCBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlXG4gKiB0aGF0IGFsbCB2YWxpZGF0b3JzIG11c3QgaW1wbGVtZW50LiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIGJ5IHNwZWNpZmljXG4gKiB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb25zIHRoYXQgcHJvdmlkZSBjb25jcmV0ZSB2YWxpZGF0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRGVmYXVsdCBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNERUZBVUxUfVxuICogQHBhcmFtIHtzdHJpbmdbXX0gYWNjZXB0ZWRUeXBlcyAtIEFycmF5IG9mIHR5cGUgbmFtZXMgdGhhdCB0aGlzIHZhbGlkYXRvciBjYW4gdmFsaWRhdGVcbiAqXG4gKiBAY2xhc3MgVmFsaWRhdG9yXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBvZiBleHRlbmRpbmcgdGhlIFZhbGlkYXRvciBjbGFzcyB0byBjcmVhdGUgYSBjdXN0b20gdmFsaWRhdG9yXG4gKiBjbGFzcyBDdXN0b21WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8Q3VzdG9tVmFsaWRhdG9yT3B0aW9ucz4ge1xuICogICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBcIkN1c3RvbSB2YWxpZGF0aW9uIGZhaWxlZFwiKSB7XG4gKiAgICAgLy8gU3BlY2lmeSB0aGF0IHRoaXMgdmFsaWRhdG9yIGFjY2VwdHMgU3RyaW5nIGFuZCBOdW1iZXIgdHlwZXNcbiAqICAgICBzdXBlcihtZXNzYWdlLCBTdHJpbmcubmFtZSwgTnVtYmVyLm5hbWUpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgaGFzRXJyb3JzKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBDdXN0b21WYWxpZGF0b3JPcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAqICAgICAvLyBJbXBsZW1lbnQgY3VzdG9tIHZhbGlkYXRpb24gbG9naWNcbiAqICAgICBpZiAoc29tZUNvbmRpdGlvbikge1xuICogICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zPy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE5vIGVycm9yc1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVmFsaWRhdG9yIFN1YmNsYXNzXG4gKiAgIHBhcnRpY2lwYW50IEIgYXMgQmFzZSBWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgQ3VzdG9tVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIFYtPj5COiBzdXBlcihtZXNzYWdlLCBhY2NlcHRlZFR5cGVzKVxuICogICBCLT4+QjogU3RvcmUgbWVzc2FnZSBhbmQgdHlwZXNcbiAqICAgQi0+PkI6IFdyYXAgaGFzRXJyb3JzIHdpdGggdHlwZSBjaGVja2luZ1xuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgdHlwZSBub3QgaW4gYWNjZXB0ZWRUeXBlc1xuICogICAgIEItLT4+QzogVHlwZSBlcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgdmFsdWUgdHlwZSBpcyBhY2NlcHRlZFxuICogICAgIFYtPj5WOiBDdXN0b20gdmFsaWRhdGlvbiBsb2dpY1xuICogICAgIFYtLT4+QzogVmFsaWRhdGlvbiByZXN1bHRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhbGlkYXRvcjxWIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyA9IFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBhY2NlcHRlZFR5cGVzPzogc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXG4gICAgaWYgKGFjY2VwdGVkVHlwZXMubGVuZ3RoKSB0aGlzLmFjY2VwdGVkVHlwZXMgPSBhY2NlcHRlZFR5cGVzO1xuICAgIGlmICh0aGlzLmFjY2VwdGVkVHlwZXMpXG4gICAgICB0aGlzLmhhc0Vycm9ycyA9IHRoaXMuY2hlY2tUeXBlQW5kSGFzRXJyb3JzKHRoaXMuaGFzRXJyb3JzLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtYXRzIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvcHRpb25hbCBhcmd1bWVudHNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlcnMgd2l0aCBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHN0cmluZyBmb3JtYXR0aW5nIHV0aWxpdHkgdG8gZ2VuZXJhdGUgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlc1xuICAgKiBhY3Jvc3MgYWxsIHZhbGlkYXRvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCBwbGFjZWhvbGRlcnNcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBWYWx1ZXMgdG8gaW5zZXJ0IGludG8gdGhlIG1lc3NhZ2UgdGVtcGxhdGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGVycm9yIG1lc3NhZ2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzZihtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHR5cGUtY2hlY2tpbmcgd3JhcHBlciBhcm91bmQgdGhlIGhhc0Vycm9ycyBtZXRob2RcbiAgICogQHN1bW1hcnkgV3JhcHMgdGhlIGhhc0Vycm9ycyBtZXRob2Qgd2l0aCB0eXBlIHZhbGlkYXRpb24gbG9naWMgdG8gZW5zdXJlIHRoYXRcbiAgICogdGhlIHZhbHVlIGJlaW5nIHZhbGlkYXRlZCBpcyBvZiBhbiBhY2NlcHRlZCB0eXBlIGJlZm9yZSBwZXJmb3JtaW5nIHNwZWNpZmljIHZhbGlkYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIGlmIGFjY2VwdGVkVHlwZXMgYXJlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1bmJvdW5kIC0gVGhlIG9yaWdpbmFsIGhhc0Vycm9ycyBtZXRob2QgdG8gYmUgd3JhcHBlZFxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0eXBlIGNoZWNraW5nIGJlZm9yZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tUeXBlQW5kSGFzRXJyb3JzKFxuICAgIHVuYm91bmQ6ICh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBWYWxpZGF0b3IsXG4gICAgICB2YWx1ZTogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIXRoaXMuYWNjZXB0ZWRUeXBlcylcbiAgICAgICAgcmV0dXJuIHVuYm91bmQodmFsdWUsIC4uLmFyZ3MpO1xuICAgICAgaWYgKCFSZWZsZWN0aW9uLmNoZWNrVHlwZXModmFsdWUsIHRoaXMuYWNjZXB0ZWRUeXBlcykpXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFLFxuICAgICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlcy5qb2luKFwiLCBcIiksXG4gICAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgLi4uYXJncyk7XG4gICAgfS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IHNwZWNpZmljIHZhbGlkYXRpb24gcnVsZXNcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgdmFsaWRhdG9yIHN1YmNsYXNzZXMuXG4gICAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIHRoZSBjb3JlIHZhbGlkYXRpb24gbG9naWMgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZVxuICAgKiBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljIHJ1bGVzIG9mIHRoZSB2YWxpZGF0b3IuIElmIHRoZSB2YWx1ZSBpcyB2YWxpZCxcbiAgICogdGhlIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZDsgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb3B0aW9ucyBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSB2YWxpZGF0b3JcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7Vn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZyB2YWxpZGF0aW9uIGJlaGF2aW9yXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IHByb3h5IC1cbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICpcbiAgICogQHNlZSBNb2RlbCN2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBWLFxuICAgIHByb3h5PzogUGF0aFByb3h5PGFueT5cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEdWNrIHR5cGluZyBmb3IgVmFsaWRhdG9yc1xuICAgKiBAcGFyYW0gdmFsXG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZGF0b3IodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yICYmICEhdmFsW1wiaGFzRXJyb3JzXCJdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEJhc2UgSW1wbGVtZW50YXRpb24gb2YgYSBWYWxpZGF0b3IgUmVnaXN0cnlcbiAqXG4gKiBAcHJvcCB7VmFsaWRhdG9yW119IFt2YWxpZGF0b3JzXSB0aGUgaW5pdGlhbCB2YWxpZGF0b3JzIHRvIHJlZ2lzdGVyXG4gKlxuICogQGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5XG4gKiBAaW1wbGVtZW50cyBJVmFsaWRhdG9yUmVnaXN0cnk8VD5cbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnk8VCBleHRlbmRzIFZhbGlkYXRvcj5cbiAgaW1wbGVtZW50cyBJVmFsaWRhdG9yUmVnaXN0cnk8VD5cbntcbiAgcHJpdmF0ZSBjYWNoZTogYW55ID0ge307XG4gIHByaXZhdGUgY3VzdG9tS2V5Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoLi4udmFsaWRhdG9yczogKFZhbGlkYXRvckRlZmluaXRpb24gfCBWYWxpZGF0b3IpW10pIHtcbiAgICB0aGlzLmN1c3RvbUtleUNhY2hlID0ge307XG4gICAgdGhpcy5yZWdpc3RlciguLi52YWxpZGF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGN1c3RvbSBrZXlzXG4gICAqL1xuICBnZXRDdXN0b21LZXlzKCk6IHsgW2luZGV4ZXI6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jdXN0b21LZXlDYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0cmlldmVzIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMga2V5c1xuICAgKi9cbiAgZ2V0S2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2FjaGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4odmFsaWRhdG9yS2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoISh2YWxpZGF0b3JLZXkgaW4gdGhpcy5jYWNoZSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjbGFzc09ySW5zdGFuY2UgPSB0aGlzLmNhY2hlW3ZhbGlkYXRvcktleV07XG4gICAgaWYgKFZhbGlkYXRvci5pc1ZhbGlkYXRvcihjbGFzc09ySW5zdGFuY2UpKSByZXR1cm4gY2xhc3NPckluc3RhbmNlIGFzIFQ7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBjbGFzc09ySW5zdGFuY2UuZGVmYXVsdCB8fCBjbGFzc09ySW5zdGFuY2U7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoKTtcbiAgICB0aGlzLmNhY2hlW3ZhbGlkYXRvcktleV0gPSBpbnN0YW5jZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICovXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFZhbGlkYXRvckRlZmluaXRpb24gfCBUKVtdXG4gICk6IHZvaWQge1xuICAgIHZhbGlkYXRvci5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICBpZiAoVmFsaWRhdG9yLmlzVmFsaWRhdG9yKHYpKSB7XG4gICAgICAgIC8vIGNvbnN0IGsgPVxuXG4gICAgICAgIGlmICgodiBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKS52YWxpZGF0aW9uS2V5IGluIHRoaXMuY2FjaGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYWNoZVsodiBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKS52YWxpZGF0aW9uS2V5XSA9IHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHZhbGlkYXRpb25LZXksIHZhbGlkYXRvciwgc2F2ZSB9ID0gdiBhcyBWYWxpZGF0b3JEZWZpbml0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbktleSBpbiB0aGlzLmNhY2hlKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FjaGVbdmFsaWRhdGlvbktleV0gPSB2YWxpZGF0b3I7XG4gICAgICAgIGlmICghc2F2ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgb2JqW3ZhbGlkYXRpb25LZXkudG9VcHBlckNhc2UoKV0gPSB2YWxpZGF0aW9uS2V5O1xuXG4gICAgICAgIHRoaXMuY3VzdG9tS2V5Q2FjaGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmN1c3RvbUtleUNhY2hlLCBvYmopO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JzL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgSVZhbGlkYXRvclJlZ2lzdHJ5LCBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4vVmFsaWRhdG9ycy9WYWxpZGF0b3JSZWdpc3RyeVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFN0YXRpYyBjbGFzcyBhY3RpbmcgYXMgYSBuYW1lc3BhY2UgZm9yIHRoZSBWYWxpZGF0aW9uXG4gKlxuICogQGNsYXNzIFZhbGlkYXRpb25cbiAqIEBzdGF0aWNcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIGFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5PzogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4gPVxuICAgIHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYWN0aW5nIFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7SVZhbGlkYXRvclJlZ2lzdHJ5fSB2YWxpZGF0b3JSZWdpc3RyeSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgUmVnaXN0cnlcbiAgICogQHBhcmFtIHtmdW5jdGlvbihWYWxpZGF0b3IpOiBWYWxpZGF0b3J9IFttaWdyYXRpb25IYW5kbGVyXSB0aGUgbWV0aG9kIHRvIG1hcCB0aGUgdmFsaWRhdG9yIGlmIHJlcXVpcmVkO1xuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KFxuICAgIHZhbGlkYXRvclJlZ2lzdHJ5OiBJVmFsaWRhdG9yUmVnaXN0cnk8VmFsaWRhdG9yPixcbiAgICBtaWdyYXRpb25IYW5kbGVyPzogKHZhbGlkYXRvcjogVmFsaWRhdG9yKSA9PiBWYWxpZGF0b3JcbiAgKSB7XG4gICAgaWYgKG1pZ3JhdGlvbkhhbmRsZXIgJiYgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSlcbiAgICAgIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkuZ2V0S2V5cygpLmZvckVhY2goKGs6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JSZWdpc3RyeS5nZXQoayk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IpIHZhbGlkYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyKG1pZ3JhdGlvbkhhbmRsZXIodmFsaWRhdG9yKSk7XG4gICAgICB9KTtcbiAgICBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5ID0gdmFsaWRhdG9yUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBWYWxpZGF0b3JSZWdpc3RyeVxuICAgKlxuICAgKiBAcmV0dXJuIElWYWxpZGF0b3JSZWdpc3RyeSwgZGVmYXVsdHMgdG8ge0BsaW5rIFZhbGlkYXRvclJlZ2lzdHJ5fVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKSB7XG4gICAgaWYgKCFWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5KVxuICAgICAgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSA9IG5ldyBWYWxpZGF0b3JSZWdpc3RyeSgpO1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFZhbGlkYXRpb24uZ2V0UmVnaXN0cnkoKS5nZXQodmFsaWRhdG9yS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtUW10gfCBWYWxpZGF0b3JEZWZpbml0aW9uW119IHZhbGlkYXRvclxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFZhbGlkYXRvckRlZmluaXRpb24gfCBUKVtdXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoLi4udmFsaWRhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIGtleSB0byBzdG9yZSBhcyBNZXRhZGF0YSB1bmRlciBSZWZsZWN0aW9uc1xuICAgKiBAZGVzY3JpcHRpb24gY29uY2F0ZW5hdGVzIHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRUZMRUNUfSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUICsga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgdmFsaWRhdGlvbiBrZXlzXG4gICAqL1xuICBzdGF0aWMga2V5cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWdpc3RyeSgpLmdldEtleXMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBWQUxJREFUSU9OX1BBUkVOVF9LRVkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBWYWxpZGF0YWJsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxFcnJvcnMsXG4gIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb24sXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL3R5cGVzXCI7XG5pbXBvcnQgeyBQYXRoUHJveHlFbmdpbmUgfSBmcm9tIFwiLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgQW5hbHlzZXMgdGhlIGRlY29yYXRpb25zIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWxpZGF0ZXMgdGhlIG9iaiBhY2NvcmRpbmcgdG8gdGhlbVxuICpcbiAqIEB0eXBlZGVmIE0gZXh0ZW5kcyBNb2RlbFxuICogQHByb3Age019IG9iaiBNb2RlbCBvYmplY3QgdG8gdmFsaWRhdGVcbiAqIEBwcm9wIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIG9iamVjdCBwcm9wZXJ0aWVzIHRvIGlnbm9yZSBpbiB0aGUgdmFsaWRhdGlvblxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBvYmo6IE0sXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXM6IFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApICYmXG4gICAgICBwcm9wc1RvSWdub3JlLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgKVxuICAgICAgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKFxuICAgICAgICBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIG9iaixcbiAgICAgICAgICBwcm9wXG4gICAgICAgICkgYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvblxuICAgICAgKTtcblxuICBsZXQgcmVzdWx0OiBNb2RlbEVycm9ycyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRlZFByb3BlcnR5IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB7IHByb3AsIGRlY29yYXRvcnMgfSA9IGRlY29yYXRlZFByb3BlcnR5O1xuXG4gICAgaWYgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgY29udGludWU7XG5cbiAgICBjb25zdCBkZWZhdWx0VHlwZURlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGEgPSBkZWNvcmF0b3JzWzBdO1xuXG4gICAgLy8gdHJpZXMgdG8gZmluZCBhbnkgdHlwZSBkZWNvcmF0b3JzIG9yIG90aGVyIGRlY29yYXRvcnMgdGhhdCBhbHJlYWR5IGVuZm9yY2UgdHlwZSAodGhlIG9uZXMgd2l0aCB0aGUgYWxsb3dlZCB0eXBlcyBwcm9wZXJ0eSBkZWZpbmVkKS4gaWYgc28sIHNraXAgdGhlIGRlZmF1bHQgdHlwZSB2ZXJpZmljYXRpb25cbiAgICBpZiAoXG4gICAgICBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IHtcbiAgICAgICAgaWYgKGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5UWVBFKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICEhZC5wcm9wcy50eXBlcz8uZmluZChcbiAgICAgICAgICAodCkgPT4gdCA9PT0gZGVmYXVsdFR5cGVEZWNvcmF0b3IucHJvcHMubmFtZVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGRlY29yYXRvcnMuc2hpZnQoKTsgLy8gcmVtb3ZlIHRoZSBkZXNpZ246dHlwZSBkZWNvcmF0b3IsIHNpbmNlIHRoZSB0eXBlIHdpbGwgYWxyZWFkeSBiZSBjaGVja2VkXG4gICAgfVxuXG4gICAgbGV0IGVycnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBWYWxpZGF0aW9uLmdldChkZWNvcmF0b3Iua2V5KTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9yUHJvcHMgPVxuICAgICAgICBkZWNvcmF0b3Iua2V5ID09PSBNb2RlbEtleXMuVFlQRVxuICAgICAgICAgID8gW2RlY29yYXRvci5wcm9wc11cbiAgICAgICAgICA6IGRlY29yYXRvci5wcm9wcyB8fCB7fTtcblxuICAgICAgY29uc3QgZXJyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB2YWxpZGF0b3IuaGFzRXJyb3JzKFxuICAgICAgICAob2JqIGFzIGFueSlbcHJvcC50b1N0cmluZygpXSxcbiAgICAgICAgZGVjb3JhdG9yUHJvcHMgYXMgVmFsaWRhdG9yT3B0aW9ucyxcbiAgICAgICAgUGF0aFByb3h5RW5naW5lLmNyZWF0ZShvYmosIHsgaWdub3JlVW5kZWZpbmVkOiB0cnVlLCBpZ25vcmVOdWxsOiB0cnVlIH0pXG4gICAgICApO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVycnMgPSBlcnJzIHx8IHt9O1xuICAgICAgICBlcnJzW2RlY29yYXRvci5rZXldID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHRbZGVjb3JhdGVkUHJvcGVydHkucHJvcC50b1N0cmluZygpXSA9IGVycnM7XG4gICAgfVxuICB9XG5cbiAgLy8gdGVzdHMgbmVzdGVkIGNsYXNzZXNcbiAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKChrKSA9PiAhcmVzdWx0IHx8ICFyZXN1bHRba10pKSB7XG4gICAgbGV0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIGlmIGEgbmVzdGVkIE1vZGVsXG4gICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnMuZmlsdGVyKFxuICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT5cbiAgICAgICAgW01vZGVsS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5UWVBFIGFzIHN0cmluZ10uaW5kZXhPZihkLmtleSkgIT09IC0xXG4gICAgKTtcbiAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWMgPSBkZWNvcmF0b3JzLnBvcCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgIGNvbnN0IGNsYXp6ID0gZGVjLnByb3BzLm5hbWVcbiAgICAgID8gW2RlYy5wcm9wcy5uYW1lXVxuICAgICAgOiBBcnJheS5pc0FycmF5KGRlYy5wcm9wcy5jdXN0b21UeXBlcylcbiAgICAgICAgPyBkZWMucHJvcHMuY3VzdG9tVHlwZXNcbiAgICAgICAgOiBbZGVjLnByb3BzLmN1c3RvbVR5cGVzXTtcbiAgICBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT5cbiAgICAgIHYudG9Mb3dlckNhc2UoKVxuICAgICkgYXMgc3RyaW5nW107XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2xhenopIHtcbiAgICAgIGlmIChyZXNlcnZlZC5pbmRleE9mKGMudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHR5cGVEZWNvcmF0b3JLZXkgPSBBcnJheS5pc0FycmF5KChvYmogYXMgYW55KVtwcm9wXSlcbiAgICAgICAgICA/IFZhbGlkYXRpb25LZXlzLkxJU1RcbiAgICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEU7XG4gICAgICAgIGNvbnN0IHR5cGVzOiBhbnkgPVxuICAgICAgICAgIGFsbERlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAgIChkOiB7IGtleTogc3RyaW5nIH0pID0+IGQua2V5ID09PSB0eXBlRGVjb3JhdG9yS2V5XG4gICAgICAgICAgKSB8fCB7fTtcbiAgICAgICAgbGV0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVzICYmIHR5cGVzLnByb3BzKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tVHlwZXMgPSBBcnJheS5pc0FycmF5KChvYmogYXMgYW55KVtwcm9wXSlcbiAgICAgICAgICAgID8gdHlwZXMucHJvcHMuY2xhc3NcbiAgICAgICAgICAgIDogdHlwZXMucHJvcHMuY3VzdG9tVHlwZXM7XG4gICAgICAgICAgaWYgKGN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzID0gQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcylcbiAgICAgICAgICAgICAgPyBjdXN0b21UeXBlcy5tYXAoKHQpID0+IGAke3R9YC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICA6IFtjdXN0b21UeXBlcy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlID0gKHByb3A6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICF2YWx1ZVtWQUxJREFUSU9OX1BBUkVOVF9LRVldKVxuICAgICAgICAgICAgICB2YWx1ZVtWQUxJREFUSU9OX1BBUkVOVF9LRVldID0gb2JqOyAvLyBUT0RPOiBmcmVlemU/XG5cbiAgICAgICAgICAgIHJldHVybiBNb2RlbC5pc01vZGVsKHZhbHVlKVxuICAgICAgICAgICAgICA/IHZhbHVlLmhhc0Vycm9ycygpXG4gICAgICAgICAgICAgIDogYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogXCJWYWx1ZSBoYXMgbm8gdmFsaWRhdGFibGUgdHlwZVwiO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWVbVkFMSURBVElPTl9QQVJFTlRfS0VZXSlcbiAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW1ZBTElEQVRJT05fUEFSRU5UX0tFWV07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgQXJyYXkubmFtZTpcbiAgICAgICAgICBjYXNlIFNldC5uYW1lOlxuICAgICAgICAgICAgaWYgKGFsbERlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBhbGxEZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1RcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGxpc3REZWMpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSAoXG4gICAgICAgICAgICAgICAgICBjID09PSBBcnJheS5uYW1lXG4gICAgICAgICAgICAgICAgICAgID8gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXVxuICAgICAgICAgICAgICAgICAgICA6IC8vIElmIGl0J3MgYSBTZXRcbiAgICAgICAgICAgICAgICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdLnZhbHVlcygpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLm1hcCgodjogVmFsaWRhdGFibGUpID0+IHZhbGlkYXRlKHByb3AsIHYpKVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZTogYW55KSA9PiAhIWUpIGFzIGFueTtcbiAgICAgICAgICAgICAgICBpZiAoIWVycj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGxpc3QuLi5cbiAgICAgICAgICAgICAgICAgIGVyciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSlcbiAgICAgICAgICAgICAgICBlcnIgPSB2YWxpZGF0ZShwcm9wLCAob2JqIGFzIGFueSlbcHJvcF0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYE1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXRzIG5vdDogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0W3Byb3BdID0gZXJyIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdCkgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsS2V5KHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBNb2RlbEtleXMuUkVGTEVDVCArIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIGdldE1vZGVsS2V5KE1vZGVsS2V5cy5NT0RFTCksXG4gICAgbW9kZWwuY29uc3RydWN0b3JcbiAgKTtcbiAgaWYgKCFtZXRhZGF0YSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImNvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciBwcm92aWRlZCBcIiArIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICByZXR1cm4gbWV0YWRhdGE7XG59XG4iLCJpbXBvcnQgeyBTZXJpYWxpemF0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7IEJ1aWxkZXJSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgQ29tcGFyYWJsZSxcbiAgQ29uc3RydWN0b3IsXG4gIEhhc2hhYmxlLFxuICBNb2RlbEFyZyxcbiAgTW9kZWxCdWlsZGVyRnVuY3Rpb24sXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFNlcmlhbGl6YWJsZSxcbiAgVmFsaWRhdGFibGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgaXNFcXVhbCwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgdmFsaWRhdGUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIYXNoaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hhc2hpbmdcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGpzVHlwZXMsIFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRNb2RlbEtleSwgZ2V0TWV0YWRhdGEgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5sZXQgbW9kZWxCdWlsZGVyRnVuY3Rpb246IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xubGV0IGFjdGluZ01vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSB0eXBlIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIG1vZGVsIGNvbnN0cnVjdG9yc1xuICogQHN1bW1hcnkgVGhlIE1vZGVsUmVnaXN0cnkgdHlwZSBkZWZpbmVzIGEgcmVnaXN0cnkgZm9yIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGV4dGVuZHNcbiAqIHRoZSBCdWlsZGVyUmVnaXN0cnkgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gcmVnaXN0ZXIsIHJldHJpZXZlLFxuICogYW5kIGJ1aWxkIG1vZGVsIGluc3RhbmNlcywgZW5hYmxpbmcgdGhlIG1vZGVsIHN5c3RlbSB0byB3b3JrIHdpdGggZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVscy5cbiAqXG4gKiBAaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlcbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgbW9kZWwgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCwgbXVzdCBleHRlbmQgTW9kZWxcbiAqIEBleHRlbmRzIEJ1aWxkZXJSZWdpc3RyeTxUPlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnk8VCBleHRlbmRzIE1vZGVsPiA9IEJ1aWxkZXJSZWdpc3RyeTxUPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgbWFuYWdlciBmb3IgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgZW5hYmxlcyBzZXJpYWxpemF0aW9uIGFuZCByZWJ1aWxkaW5nXG4gKiBAc3VtbWFyeSBUaGUgTW9kZWxSZWdpc3RyeU1hbmFnZXIgaW1wbGVtZW50cyB0aGUgTW9kZWxSZWdpc3RyeSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzXG4gKiBmdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZywgcmV0cmlldmluZywgYW5kIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlcy4gSXQgbWFpbnRhaW5zXG4gKiBhIGNhY2hlIG9mIG1vZGVsIGNvbnN0cnVjdG9ycyBpbmRleGVkIGJ5IG5hbWUsIGFsbG93aW5nIGZvciBlZmZpY2llbnQgbG9va3VwIGFuZCBpbnN0YW50aWF0aW9uLlxuICogVGhpcyBjbGFzcyBpcyBlc3NlbnRpYWwgZm9yIHRoZSBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2YgbW9kZWwgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFufSBbdGVzdEZ1bmN0aW9uXSAtIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWwsIGRlZmF1bHRzIHRvIHtAbGluayBNb2RlbCNpc01vZGVsfVxuICpcbiAqIEBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlclxuICogQHRlbXBsYXRlIE0gVHlwZSBvZiBtb2RlbCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkLCBtdXN0IGV4dGVuZCBNb2RlbFxuICogQGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxNPlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG1vZGVsIHJlZ2lzdHJ5XG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcigpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGEgbW9kZWwgY2xhc3NcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKFVzZXIpO1xuICpcbiAqIC8vIFJldHJpZXZlIGEgbW9kZWwgY29uc3RydWN0b3IgYnkgbmFtZVxuICogY29uc3QgVXNlckNsYXNzID0gcmVnaXN0cnkuZ2V0KFwiVXNlclwiKTtcbiAqXG4gKiAvLyBCdWlsZCBhIG1vZGVsIGluc3RhbmNlIGZyb20gYSBwbGFpbiBvYmplY3RcbiAqIGNvbnN0IHVzZXJEYXRhID0geyBuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMCB9O1xuICogY29uc3QgdXNlciA9IHJlZ2lzdHJ5LmJ1aWxkKHVzZXJEYXRhLCBcIlVzZXJcIik7XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgTW9kZWxSZWdpc3RyeU1hbmFnZXJcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbCBDbGFzc1xuICpcbiAqICAgQy0+PlI6IG5ldyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcih0ZXN0RnVuY3Rpb24pXG4gKiAgIEMtPj5SOiByZWdpc3RlcihNb2RlbENsYXNzKVxuICogICBSLT4+UjogU3RvcmUgaW4gY2FjaGVcbiAqICAgQy0+PlI6IGdldChcIk1vZGVsTmFtZVwiKVxuICogICBSLS0+PkM6IE1vZGVsQ2xhc3MgY29uc3RydWN0b3JcbiAqICAgQy0+PlI6IGJ1aWxkKGRhdGEsIFwiTW9kZWxOYW1lXCIpXG4gKiAgIFItPj5SOiBHZXQgY29uc3RydWN0b3IgZnJvbSBjYWNoZVxuICogICBSLT4+TTogbmV3IE1vZGVsQ2xhc3MoZGF0YSlcbiAqICAgTS0tPj5SOiBNb2RlbCBpbnN0YW5jZVxuICogICBSLS0+PkM6IE1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcjxNIGV4dGVuZHMgTW9kZWw+IGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxNPiB7XG4gIHByaXZhdGUgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8TT4+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZ1bmN0aW9uOiAob2JqOiBvYmplY3QpID0+IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGVzdEZ1bmN0aW9uOiAob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBib29sZWFuID0gTW9kZWwuaXNNb2RlbFxuICApIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IHRlc3RGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbW9kZWwgY29uc3RydWN0b3Igd2l0aCB0aGUgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgQWRkcyBhIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHRoZSByZWdpc3RyeSBjYWNoZSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3JcbiAgICogbGF0ZXIgcmV0cmlldmFsIGFuZCBpbnN0YW50aWF0aW9uLiBJZiBubyBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0b3IncyBuYW1lXG4gICAqIHByb3BlcnR5IGlzIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3RvcjxNPn0gY29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIE9wdGlvbmFsIG5hbWUgdG8gcmVnaXN0ZXIgdGhlIGNvbnN0cnVjdG9yIHVuZGVyLCBkZWZhdWx0cyB0byBjb25zdHJ1Y3Rvci5uYW1lXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGEgZnVuY3Rpb25cbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPE0+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vZGVsIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yXCJcbiAgICAgICk7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNhY2hlW25hbWVdID0gY29uc3RydWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxNPiB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBjbGF6ej86IHN0cmluZyk6IE0ge1xuICAgIGlmICghY2xhenogJiYgIXRoaXMudGVzdEZ1bmN0aW9uKG9iaikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBvYmogaXMgbm90IGEgTW9kZWwgb2JqZWN0XCIpO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBNb2RlbC5nZXRNZXRhZGF0YShvYmogYXMgYW55KTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUHJvdmlkZWQgY2xhc3MgJHtuYW1lfSBpcyBub3QgYSByZWdpc3RlcmVkIE1vZGVsIG9iamVjdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNhY2hlW25hbWVdKG9iaik7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCdWxrIFJlZ2lzdGVycyBNb2RlbHNcbiAqIEBkZXNjcmlwdGlvbiBVc2VmdWwgd2hlbiB1c2luZyBidW5kbGVycyB0aGF0IG1pZ2h0IG5vdCBldmFsdWF0ZSBhbGwgdGhlIGNvZGUgYXQgb25jZVxuICpcbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7QXJyYXk8Q29uc3RydWN0b3I8TT4+IHwgQXJyYXk8e25hbWU6IHN0cmluZywgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+fT59IFttb2RlbHNdXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWxrTW9kZWxSZWdpc3RlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAuLi5tb2RlbHM6IChDb25zdHJ1Y3RvcjxNPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfSlbXVxuKSB7XG4gIG1vZGVscy5mb3JFYWNoKFxuICAgIChtOiBDb25zdHJ1Y3RvcjxNPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+ID0gKFxuICAgICAgICBtLmNvbnN0cnVjdG9yID8gbS5jb25zdHJ1Y3RvciA6IG1cbiAgICAgICkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBNb2RlbC5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgKG0gYXMgQ29uc3RydWN0b3I8TT4pLm5hbWUpO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBWYWxpZGF0YWJsZSBNb2RlbCBvYmplY3RcbiAqIEBkZXNjcmlwdGlvbiBNZWFudCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgYWxsIE1vZGVsIGNsYXNzZXNcbiAqXG4gKiBNb2RlbCBvYmplY3RzIG11c3Q6XG4gKiAgLSBIYXZlIGFsbCB0aGVpciByZXF1aXJlZCBwcm9wZXJ0aWVzIG1hcmtlZCB3aXRoICchJztcbiAqICAtIEhhdmUgYWxsIHRoZWlyIG9wdGlvbmFsIHByb3BlcnRpZXMgbWFya2VkIGFzICc/JzpcbiAqXG4gKiBAcGFyYW0ge01vZGVsQXJnPE1vZGVsPn0gbW9kZWwgYmFzZSBvYmplY3QgZnJvbSB3aGljaCB0byBwb3B1bGF0ZSBwcm9wZXJ0aWVzIGZyb21cbiAqXG4gKiBAY2xhc3MgTW9kZWxcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGFic3RyYWN0XG4gKiBAaW1wbGVtZW50cyBWYWxpZGF0YWJsZVxuICogQGltcGxlbWVudHMgU2VyaWFsaXphYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgIEByZXF1aXJlZCgpXG4gKiAgICAgICAgICByZXF1aXJlZFByb3BlcnR5TmFtZSE6IFByb3BlcnR5VHlwZTtcbiAqXG4gKiAgICAgICAgICBvcHRpb25hbFByb3BlcnR5TmFtZT86IFByb3BlcnR5VHlwZTtcbiAqICAgICAgfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9kZWxcbiAgaW1wbGVtZW50cyBWYWxpZGF0YWJsZSwgU2VyaWFsaXphYmxlLCBIYXNoYWJsZSwgQ29tcGFyYWJsZTxNb2RlbD5cbntcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8TW9kZWw+KSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoZSBtb2RlbCBvYmplY3QgYWdhaW5zdCBpdHMgZGVmaW5lZCB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgb2JqZWN0IGFjY29yZGluZyB0byBpdHMgZGVjb3JhdGVkIHByb3BlcnRpZXMsIHJldHVybmluZyBhbnkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICpcbiAgICogQHBhcmFtIHthbnlbXX0gW2V4Y2VwdGlvbnNdIC0gUHJvcGVydGllcyBpbiB0aGUgb2JqZWN0IHRvIGJlIGlnbm9yZWQgZm9yIHRoZSB2YWxpZGF0aW9uLiBNYXJrZWQgYXMgJ2FueScgdG8gYWxsb3cgZm9yIGV4dGVuc2lvbiBidXQgZXhwZWN0cyBzdHJpbmdzXG4gICAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkfSAtIFJldHVybnMgYSBNb2RlbEVycm9yRGVmaW5pdGlvbiBvYmplY3QgaWYgdmFsaWRhdGlvbiBlcnJvcnMgZXhpc3QsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoLi4uZXhjZXB0aW9uczogYW55W10pOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKHRoaXMsIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoaXMgbW9kZWwgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3RcbiAgICogQHN1bW1hcnkgQ29tcGFyZSBvYmplY3QgZXF1YWxpdHkgcmVjdXJzaXZlbHksIGNoZWNraW5nIGFsbCBwcm9wZXJ0aWVzIHVubGVzcyBleGNsdWRlZFxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gb2JqIC0gT2JqZWN0IHRvIGNvbXBhcmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2V4Y2VwdGlvbnNdIC0gUHJvcGVydHkgbmFtZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvblxuICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIGVxdWFscyhvYmo6IGFueSwgLi4uZXhjZXB0aW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLCBvYmosIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgbW9kZWwgdG8gYSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIG1vZGVsIGFjY29yZGluZyB0byB0aGUgY3VycmVudGx5IGRlZmluZWQge0BsaW5rIFNlcmlhbGl6ZXJ9XG4gICAqIFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1vZGVsLnNlcmlhbGl6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IganMncyAndG9TdHJpbmcoKScgdG8gcHJvdmlkZSBhIG1vcmUgdXNlZnVsIHJlcHJlc2VudGF0aW9uXG4gICAqIFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIGluY2x1ZGluZyBpdHMgY2xhc3MgbmFtZSBhbmQgSlNPTiByZXByZXNlbnRhdGlvblxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLCB1bmRlZmluZWQsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBoYXNoIHN0cmluZyBmb3IgdGhlIG1vZGVsIG9iamVjdFxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igb2JqZWN0IGhhc2gsIHJlbHlpbmcgb24gYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBKYXZhJ3Mgc3RyaW5nIGhhc2hcbiAgICogXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBBIGhhc2ggc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbW9kZWxcbiAgICovXG4gIHB1YmxpYyBoYXNoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1vZGVsLmhhc2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc2VyaWFsaXplZCBzdHJpbmcgYmFjayBpbnRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgRGVzZXJpYWxpemVzIGEgTW9kZWwgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc2VyaWFsaXplZCBzdHJpbmcgdG8gY29udmVydCBiYWNrIHRvIGEgbW9kZWxcbiAgICogQHJldHVybiB7YW55fSAtIFRoZSBkZXNlcmlhbGl6ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIGlmIGl0IGZhaWxzIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSxcbiAgICAgIHRoaXMuY29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgaWYgKG1ldGFkYXRhICYmIG1ldGFkYXRhLnNlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShcbiAgICAgICAgc3RyLFxuICAgICAgICBtZXRhZGF0YS5zZXJpYWxpemVyLFxuICAgICAgICAuLi4obWV0YWRhdGEuYXJncyB8fCBbXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29waWVzIHByb3BlcnRpZXMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgT2JqZWN0IHByb3BlcnRpZXMgd2l0aCB0aGUgb25lcyBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VH0gc2VsZiAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2UgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdIC0gVGhlIHNvdXJjZSBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNvcHlcbiAgICogQHJldHVybiB7VH0gLSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Q8VCBleHRlbmRzIE1vZGVsPihcbiAgICBzZWxmOiBULFxuICAgIG9iaj86IFQgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFQge1xuICAgIGlmICghb2JqKSBvYmogPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKSkge1xuICAgICAgKHNlbGYgYXMgYW55KVtwcm9wXSA9IChvYmogYXMgYW55KVtwcm9wXSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb3BpZXMgYW5kIHJlYnVpbGRzIHByb3BlcnRpZXMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSBtb2RlbCBpbnN0YW5jZSwgaGFuZGxpbmcgbmVzdGVkIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0aWVzIGZyb20gdGhlIG5ldyBNb2RlbCBPYmplY3QsIHJlY3Vyc2l2ZWx5IHJlYnVpbGRpbmcgbmVzdGVkIG1vZGVsc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1R9IHNlbGYgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1QgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb2JqXSAtIFRoZSBzb3VyY2Ugb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjb3B5XG4gICAqIEByZXR1cm4ge1R9IC0gVGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2Ugd2l0aCByZWJ1aWx0IG5lc3RlZCBtb2RlbHNcbiAgICogXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbC5mcm9tTW9kZWxcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE1vZGVsLmJ1aWxkXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0aW9uXG4gICAqICAgXG4gICAqICAgQy0+Pk06IGZyb21Nb2RlbChzZWxmLCBvYmopXG4gICAqICAgTS0+Pk06IEdldCBhdHRyaWJ1dGVzIGZyb20gc2VsZlxuICAgKiAgIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgIE0tPj5NOiBDb3B5IHByb3BlcnR5IGZyb20gb2JqIHRvIHNlbGZcbiAgICogICAgIGFsdCBQcm9wZXJ0eSBpcyBhIG1vZGVsXG4gICAqICAgICAgIE0tPj5NOiBDaGVjayBpZiBwcm9wZXJ0eSBpcyBhIG1vZGVsXG4gICAqICAgICAgIE0tPj5COiBidWlsZChwcm9wZXJ0eSwgbW9kZWxUeXBlKVxuICAgKiAgICAgICBCLS0+Pk06IFJldHVybiBidWlsdCBtb2RlbFxuICAgKiAgICAgZWxzZSBQcm9wZXJ0eSBpcyBhIGNvbXBsZXggdHlwZVxuICAgKiAgICAgICBNLT4+UjogR2V0IHByb3BlcnR5IGRlY29yYXRvcnNcbiAgICogICAgICAgUi0tPj5NOiBSZXR1cm4gZGVjb3JhdG9yc1xuICAgKiAgICAgICBNLT4+TTogRmlsdGVyIHR5cGUgZGVjb3JhdG9yc1xuICAgKiAgICAgICBhbHQgUHJvcGVydHkgaXMgQXJyYXkvU2V0IHdpdGggbGlzdCBkZWNvcmF0b3JcbiAgICogICAgICAgICBNLT4+TTogUHJvY2VzcyBlYWNoIGl0ZW0gaW4gY29sbGVjdGlvblxuICAgKiAgICAgICAgIGxvb3AgRm9yIGVhY2ggaXRlbVxuICAgKiAgICAgICAgICAgTS0+PkI6IGJ1aWxkKGl0ZW0sIGl0ZW1Nb2RlbFR5cGUpXG4gICAqICAgICAgICAgICBCLS0+Pk06IFJldHVybiBidWlsdCBtb2RlbFxuICAgKiAgICAgICAgIGVuZFxuICAgKiAgICAgICBlbHNlIFByb3BlcnR5IGlzIGFub3RoZXIgbW9kZWwgdHlwZVxuICAgKiAgICAgICAgIE0tPj5COiBidWlsZChwcm9wZXJ0eSwgcHJvcGVydHlUeXBlKVxuICAgKiAgICAgICAgIEItLT4+TTogUmV0dXJuIGJ1aWx0IG1vZGVsXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgTS0tPj5DOiBSZXR1cm4gdXBkYXRlZCBzZWxmXG4gICAqL1xuICBzdGF0aWMgZnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbD4oc2VsZjogVCwgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUIHtcbiAgICBpZiAoIW9iaikgb2JqID0ge307XG5cbiAgICBsZXQgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSwgZGVjOiBEZWNvcmF0b3JNZXRhZGF0YTtcblxuICAgIGNvbnN0IHByb3BzID0gTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPVxuICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID8/IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgKHNlbGYgYXMgYW55KVtwcm9wXSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgICBjb25zdCBwcm9wTSA9IE1vZGVsLmlzUHJvcGVydHlNb2RlbChzZWxmLCBwcm9wKTtcbiAgICAgIGlmIChwcm9wTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSxcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wTSA9PT0gXCJzdHJpbmdcIiA/IHByb3BNIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbERlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gPVxuICAgICAgICBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgcHJvcFxuICAgICAgICApLmRlY29yYXRvcnM7XG4gICAgICBkZWNvcmF0b3JzID0gYWxsRGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAgIChkOiBEZWNvcmF0b3JNZXRhZGF0YSkgPT5cbiAgICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEUgYXMgc3RyaW5nXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICAgICk7XG4gICAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBmaW5kIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcH1gKTtcbiAgICAgIGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICBjb25zdCBjbGF6eiA9IGRlYy5wcm9wcy5uYW1lXG4gICAgICAgID8gW2RlYy5wcm9wcy5uYW1lXVxuICAgICAgICA6IEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICAgID8gZGVjLnByb3BzLmN1c3RvbVR5cGVzXG4gICAgICAgICAgOiBbZGVjLnByb3BzLmN1c3RvbVR5cGVzXTtcbiAgICAgIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PlxuICAgICAgICB2LnRvTG93ZXJDYXNlKClcbiAgICAgICkgYXMgc3RyaW5nW107XG5cbiAgICAgIGNsYXp6LmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlNldFwiOlxuICAgICAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IGFsbERlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKGxpc3REZWMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhenpOYW1lID0gKGxpc3REZWMucHJvcHMuY2xhenogYXMgc3RyaW5nW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKHQ6IHN0cmluZykgPT4gIWpzVHlwZXMuaW5jbHVkZXModC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCJBcnJheVwiKVxuICAgICAgICAgICAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgKVtwcm9wXS5tYXAoKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXCJvYmplY3RcIiwgXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlb2YgZWwpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1vZGVsLmJ1aWxkKGVsLCBjbGF6ek5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogZWw7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBcIlNldFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW1wib2JqZWN0XCIsIFwiZnVuY3Rpb25cIl0uaW5jbHVkZXModHlwZW9mIHYpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKE1vZGVsLmJ1aWxkKHYsIGNsYXp6TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGQodik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pXG4gICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IE1vZGVsLmJ1aWxkKFxuICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBhbnkpW3Byb3BdLFxuICAgICAgICAgICAgICAgICAgICBjXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYXZlIG5vIHJlZ2lzdHJ5IG9mIHRoaXMgY2xhc3NcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgdGhlIGdsb2JhbCBtb2RlbCBidWlsZGVyIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIEdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IHVzZWQgZm9yIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlc1xuICAgKlxuICAgKiBAcGFyYW0ge01vZGVsQnVpbGRlckZ1bmN0aW9ufSBbYnVpbGRlcl0gLSBUaGUgYnVpbGRlciBmdW5jdGlvbiB0byBzZXQgYXMgdGhlIGdsb2JhbCBidWlsZGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0QnVpbGRlcihidWlsZGVyPzogTW9kZWxCdWlsZGVyRnVuY3Rpb24pIHtcbiAgICBtb2RlbEJ1aWxkZXJGdW5jdGlvbiA9IGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZ2xvYmFsIG1vZGVsIGJ1aWxkZXIgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufSB1c2VkIGZvciBidWlsZGluZyBtb2RlbCBpbnN0YW5jZXNcbiAgICpcbiAgICogQHJldHVybiB7TW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWR9IC0gVGhlIGN1cnJlbnQgZ2xvYmFsIGJ1aWxkZXIgZnVuY3Rpb24gb3IgdW5kZWZpbmVkIGlmIG5vdCBzZXRcbiAgICovXG4gIHN0YXRpYyBnZXRCdWlsZGVyKCk6IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbW9kZWxCdWlsZGVyRnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCBtb2RlbCByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBNb2RlbFJlZ2lzdHJ5TWFuYWdlcn0gaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqXG4gICAqIEByZXR1cm4ge01vZGVsUmVnaXN0cnk8YW55Pn0gLSBUaGUgY3VycmVudCBtb2RlbCByZWdpc3RyeSwgZGVmYXVsdHMgdG8gYSBuZXcge0BsaW5rIE1vZGVsUmVnaXN0cnlNYW5hZ2VyfSBpZiBub3Qgc2V0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIWFjdGluZ01vZGVsUmVnaXN0cnkpIGFjdGluZ01vZGVsUmVnaXN0cnkgPSBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIoKTtcbiAgICByZXR1cm4gYWN0aW5nTW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyB0aGUgbW9kZWwgcmVnaXN0cnkgdG8gYmUgdXNlZCBieSB0aGUgTW9kZWwgc3lzdGVtXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGN1cnJlbnQgbW9kZWwgcmVnaXN0cnkgdG8gYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtCdWlsZGVyUmVnaXN0cnk8YW55Pn0gbW9kZWxSZWdpc3RyeSAtIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkobW9kZWxSZWdpc3RyeTogQnVpbGRlclJlZ2lzdHJ5PGFueT4pIHtcbiAgICBhY3RpbmdNb2RlbFJlZ2lzdHJ5ID0gbW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbW9kZWwgY29uc3RydWN0b3Igd2l0aCB0aGUgbW9kZWwgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIG5ldyBtb2RlbCBjbGFzc2VzIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgZm9yIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvblxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8VD59IGNvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBPcHRpb25hbCBuYW1lIHRvIHJlZ2lzdGVyIHRoZSBjb25zdHJ1Y3RvciB1bmRlciwgZGVmYXVsdHMgdG8gY29uc3RydWN0b3IubmFtZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIE1vZGVsPihcbiAgICBjb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvcjxUPixcbiAgICBuYW1lPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKGNvbnN0cnVjdG9yLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBtb2RlbCBjb25zdHJ1Y3RvciBieSBuYW1lXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfSBmcm9tIHRoZSBtb2RlbCByZWdpc3RyeVxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtNb2RlbENvbnN0cnVjdG9yPFQ+IHwgdW5kZWZpbmVkfSAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKiBcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBNb2RlbD4obmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBhIHBsYWluIG9iamVjdFxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBtb2RlbCBpbnN0YW5jZSB1c2luZyB0aGUgbW9kZWwgcmVnaXN0cnksIG9wdGlvbmFsbHkgc3BlY2lmeWluZyB0aGUgbW9kZWwgY2xhc3NcbiAgICpcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc291cmNlIG9iamVjdCB0byBidWlsZCB0aGUgbW9kZWwgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXp6XSAtIFdoZW4gcHJvdmlkZWQsIGl0IHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBtYXRjaGluZyBjb25zdHJ1Y3RvciBieSBuYW1lXG4gICAqIEByZXR1cm4ge1R9IC0gVGhlIGJ1aWx0IG1vZGVsIGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjbGF6eiBpcyBub3QgZm91bmQsIG9yIG9iaiBpcyBub3QgYSB7QGxpbmsgTW9kZWx9IG1lYW5pbmcgaXQgaGFzIG5vIHtAbGluayBNb2RlbEtleXMuQU5DSE9SfSBwcm9wZXJ0eVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBidWlsZDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGNsYXp6Pzogc3RyaW5nXG4gICk6IFQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLmJ1aWxkKG9iaiwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIG1vZGVsIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbCBpbnN0YW5jZSwgdHlwaWNhbGx5IHRoZSBtb2RlbCBjbGFzcyBuYW1lXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gZ2V0IG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBtb2RlbCBtZXRhZGF0YSAodHlwaWNhbGx5IHRoZSBjbGFzcyBuYW1lKVxuICAgKi9cbiAgc3RhdGljIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICByZXR1cm4gZ2V0TWV0YWRhdGE8TT4obW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGEgbW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgR2V0cyBhbGwgYXR0cmlidXRlcyBkZWZpbmVkIGluIGEgbW9kZWwsIHRyYXZlcnNpbmcgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBpbmNsdWRlIGluaGVyaXRlZCBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8Vj4gfCBWfSBtb2RlbCAtIFRoZSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZSB0byBnZXQgYXR0cmlidXRlcyBmcm9tXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSAtIEFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGdldEF0dHJpYnV0ZXM8ViBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8Vj4gfCBWKSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBwcm90b3R5cGUgPVxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbFxuICAgICAgICA/IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcbiAgICAgICAgOiAobW9kZWwgYXMgYW55KS5wcm90b3R5cGU7XG4gICAgd2hpbGUgKHByb3RvdHlwZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwcm9wczogc3RyaW5nW10gPSBwcm90b3R5cGVbTW9kZWxLZXlzLkFUVFJJQlVURV07XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4ucHJvcHMpO1xuICAgICAgfVxuICAgICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBhcmVzIHR3byBtb2RlbCBpbnN0YW5jZXMgZm9yIGVxdWFsaXR5XG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgdHdvIG1vZGVsIGluc3RhbmNlcyBhcmUgZXF1YWwgYnkgY29tcGFyaW5nIHRoZWlyIHByb3BlcnRpZXNcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBvYmoxIC0gRmlyc3QgbW9kZWwgaW5zdGFuY2UgdG8gY29tcGFyZVxuICAgKiBAcGFyYW0ge019IG9iajIgLSBTZWNvbmQgbW9kZWwgaW5zdGFuY2UgdG8gY29tcGFyZVxuICAgKiBAcGFyYW0ge2FueVtdfSBbZXhjZXB0aW9uc10gLSBQcm9wZXJ0eSBuYW1lcyB0byBleGNsdWRlIGZyb20gY29tcGFyaXNvblxuICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgdGhlIG1vZGVscyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgc3RhdGljIGVxdWFsczxNIGV4dGVuZHMgTW9kZWw+KG9iajE6IE0sIG9iajI6IE0sIC4uLmV4Y2VwdGlvbnM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGlzRXF1YWwob2JqMSwgb2JqMiwgLi4uZXhjZXB0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhIG1vZGVsIGluc3RhbmNlIGFnYWluc3QgaXRzIHZhbGlkYXRpb24gcnVsZXNcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgbW9kZWwgaGFzIHZhbGlkYXRpb24gZXJyb3JzLCBvcHRpb25hbGx5IGlnbm9yaW5nIHNwZWNpZmllZCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIC0gUHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICAgKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzIGlmIGFueSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGhhc0Vycm9yczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShtb2RlbCwgLi4ucHJvcHNUb0lnbm9yZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgdG8gYSBzZXJpYWxpemVkIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgc2VyaWFsaXplciBvciB0aGUgZGVmYXVsdCBvbmVcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuc2VyaWFsaXplcilcbiAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbWV0YWRhdGEuc2VyaWFsaXplcixcbiAgICAgICAgLi4uKG1ldGFkYXRhLmFyZ3MgfHwgW10pXG4gICAgICApO1xuICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGhhc2ggc3RyaW5nIGZvciBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBoYXNoIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kZWwgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWxnb3JpdGhtIG9yIHRoZSBkZWZhdWx0IG9uZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGhhc2hcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBoYXNoIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1vZGVsXG4gICAqL1xuICBzdGF0aWMgaGFzaDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5IQVNISU5HKSxcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5hbGdvcml0aG0pXG4gICAgICByZXR1cm4gSGFzaGluZy5oYXNoKG1vZGVsLCBtZXRhZGF0YS5hbGdvcml0aG0sIC4uLihtZXRhZGF0YS5hcmdzIHx8IFtdKSk7XG4gICAgcmV0dXJuIEhhc2hpbmcuaGFzaChtb2RlbCk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5IGZvciB1c2Ugd2l0aCB0aGUgUmVmbGVjdGlvbiBBUElcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBiYXNlIGtleSB0byBjb25jYXRlbmF0ZSB3aXRoIHRoZSBtb2RlbCByZWZsZWN0aW9uIHByZWZpeFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBnZXRNb2RlbEtleShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YVxuICAgKiBAc3VtbWFyeSBDaGVja3Mgd2hldGhlciBhIGdpdmVuIG9iamVjdCBpcyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIE1vZGVsIGNsYXNzIG9yXG4gICAqIGhhcyBtb2RlbCBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdC4gVGhpcyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIHNlcmlhbGl6YXRpb24gYW5kXG4gICAqIGRlc2VyaWFsaXphdGlvbiBwcm9jZXNzZXMsIGFzIGl0IGhlbHBzIGlkZW50aWZ5IG1vZGVsIG9iamVjdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAqIEl0IHNhZmVseSBoYW5kbGVzIHBvdGVudGlhbCBlcnJvcnMgZHVyaW5nIG1ldGFkYXRhIHJldHJpZXZhbC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgLSBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWxcbiAgICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogXCJKb2huXCIgfSk7XG4gICAqIGNvbnN0IGlzVXNlck1vZGVsID0gaXNNb2RlbCh1c2VyKTsgLy8gdHJ1ZVxuICAgKlxuICAgKiAvLyBDaGVjayBhIHBsYWluIG9iamVjdFxuICAgKiBjb25zdCBwbGFpbk9iamVjdCA9IHsgbmFtZTogXCJKb2huXCIgfTtcbiAgICogY29uc3QgaXNQbGFpbk9iamVjdE1vZGVsID0gaXNNb2RlbChwbGFpbk9iamVjdCk7IC8vIGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGlzTW9kZWwodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbCB8fCAhIU1vZGVsLmdldE1ldGFkYXRhKHRhcmdldCBhcyBhbnkpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgcHJvcGVydHkgb2YgYSBtb2RlbCBpcyBpdHNlbGYgYSBtb2RlbCBvciBoYXMgYSBtb2RlbCB0eXBlXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgbW9kZWwgaW5zdGFuY2UgaXMgZWl0aGVyIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogb3IgaGFzIGEgdHlwZSB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgYSBtb2RlbFxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IHRhcmdldCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjaGVja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGEgbW9kZWwgaW5zdGFuY2UsXG4gICAqIHRoZSBtb2RlbCBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYSBtb2RlbCB0eXBlLCBvciB1bmRlZmluZWQgaWYgbm90IGEgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBpc1Byb3BlcnR5TW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgYXR0cmlidXRlOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKE1vZGVsLmlzTW9kZWwoKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVthdHRyaWJ1dGVdKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1vZGVsS2V5cy5UWVBFLCB0YXJnZXQsIGF0dHJpYnV0ZSk7XG4gICAgcmV0dXJuIE1vZGVsLmdldChtZXRhZGF0YS5uYW1lKSA/IG1ldGFkYXRhLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldE1ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL3V0aWxzXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VyaWFsaXphdGlvbk1ldGhvZCA9IFwianNvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIFNlcmlhbGl6ZXJ9IGluIEpTT04gZm9ybWF0XG4gKiBAZGVzY3JpcHRpb24gSlMncyBuYXRpdmUgSlNPTi5zdHJpbmdpZnkgKHVzZWQgaGVyZSkgaXMgbm90IGRldGVybWluaXN0aWNcbiAqIGFuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBoYXNoaW5nIHB1cnBvc2VzXG4gKlxuICogVG8ga2VlcCBkZXBlbmRlbmNpZXMgbG93LCB3ZSB3aWxsIG5vdCBpbXBsZW1lbnQgdGhpcywgYnV0IHdlIHJlY29tbWVuZFxuICogaW1wbGVtZW50aW5nIGEgc2ltaWxhciB7QGxpbmsgSlNPTlNlcmlhbGl6ZXJ9IHVzaW5nICdkZXRlcm1pbmlzdGljLWpzb24nIGxpYnJhcmllc1xuICpcbiAqIEBjbGFzcyBKU09OU2VyaWFsaXplclxuICogQGltcGxlbWVudHMgU2VyaWFsaXplclxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSlNPTlNlcmlhbGl6ZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIFNlcmlhbGl6ZXI8VD4ge1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBwcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHNlcmlhbGl6YXRpb25cbiAgICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIG9iamVjdCwgY29udGFpbmluZyBhbiBlbnVtZXJhYmxlIHtAbGluayBNb2RlbEtleXMjQU5DSE9SfSBwcm9wZXJ0eVxuICAgKiBzbyB0aGUgb2JqZWN0IGNhbiBiZSByZWNvZ25pemVkIHVwb24gZGVzZXJpYWxpemF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VH0gbW9kZWxcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZVNlcmlhbGl6ZShtb2RlbDogVCkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YShtb2RlbCk7XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gYSBzZXJpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBUIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IFQgPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBUO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWxcbiAgICogQHBhcmFtIHtUfSBtb2RlbFxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgZmFpbHMgdG8gc2VyaWFsaXplXG4gICAqL1xuICBzZXJpYWxpemUobW9kZWw6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDogc3RyaW5nID0gRGVmYXVsdFNlcmlhbGl6YXRpb25NZXRob2Q7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6ZXI8YW55Pj4gPSB7XG4gICAganNvbjogbmV3IEpTT05TZXJpYWxpemVyKCksXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzZXJpYWxpemF0aW9uIG1ldGhvZCByZWdpc3RlcmVkIHVuZGVyICR7a2V5fWApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZ1bmM6IENvbnN0cnVjdG9yPFNlcmlhbGl6ZXI8YW55Pj4sXG4gICAgc2V0RGVmYXVsdCA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VyaWFsaXphdGlvbiBtZXRob2QgJHtrZXl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIHRoaXMuY2FjaGVba2V5XSA9IG5ldyBmdW5jKCk7XG4gICAgaWYgKHNldERlZmF1bHQpIHRoaXMuY3VycmVudCA9IGtleTtcbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqOiBhbnksIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkuc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG1ldGhvZCkuc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUob2JqOiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkuZGVzZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKS5kZXNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICB9XG5cbiAgc3RhdGljIHNldERlZmF1bHQobWV0aG9kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmdldChtZXRob2QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgY2xhc3MgYXMgYSB2YWxpZGF0b3IgZm9yIGEgY2VydGFpbiBrZXkuXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIHRoZSBjbGFzcyBpbiB0aGUge0BsaW5rIFZhbGlkYXRpb259IHdpdGggdGhlIHByb3ZpZGVkIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlzIHRoZSB2YWxpZGF0aW9uIGtleVxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdG9yPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KC4uLmtleXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseShcbiAgICAoKG9yaWdpbmFsOiBDb25zdHJ1Y3RvcjxUPikgPT4ge1xuICAgICAga2V5cy5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgVmFsaWRhdGlvbi5yZWdpc3Rlcih7XG4gICAgICAgICAgdmFsaWRhdG9yOiBvcmlnaW5hbCxcbiAgICAgICAgICB2YWxpZGF0aW9uS2V5OiBrLFxuICAgICAgICAgIHNhdmU6IHRydWUsXG4gICAgICAgIH0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbDtcbiAgICB9KSBhcyBDbGFzc0RlY29yYXRvcixcbiAgICBtZXRhZGF0YShWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5WQUxJREFUT1IpLCBrZXlzKVxuICApO1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0ZVZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHN1bW1hcnkgVGhlIERhdGVWYWxpZGF0b3IgY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSB2YWxpZCBkYXRlLlxuICogSXQgdmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIHJlcHJlc2VudHMgYSByZWFsIGRhdGUgYW5kIG5vdCBhbiBpbnZhbGlkIGRhdGUgbGlrZSBcIjIwMjMtMDItMzFcIi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqIEBjbGFzcyBEYXRlVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGRhdGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBkYXRlVmFsaWRhdG9yID0gbmV3IERhdGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBkYXRlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21EYXRlVmFsaWRhdG9yID0gbmV3IERhdGVWYWxpZGF0b3IoXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIpO1xuICpcbiAqIC8vIFZhbGlkYXRlIGEgZGF0ZVxuICogY29uc3QgcmVzdWx0ID0gZGF0ZVZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoKSk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gZGF0ZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJub3QgYSBkYXRlXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBEYXRlVmFsaWRhdG9yXG4gKlxuICogICBDLT4+VjogbmV3IERhdGVWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBzdHJpbmdcbiAqICAgICBWLT4+VjogQ29udmVydCB0byBEYXRlXG4gKiAgIGVuZFxuICogICBhbHQgRGF0ZSBpcyBpbnZhbGlkIChOYU4pXG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgRGF0ZSBpcyB2YWxpZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZW5kXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuREFURSlcbmV4cG9ydCBjbGFzcyBEYXRlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPERhdGVWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE51bWJlci5uYW1lLCBEYXRlLm5hbWUsIFN0cmluZy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBhIHZhbGlkIGRhdGVcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLFxuICAgKiBpdCBhdHRlbXB0cyB0byBjb252ZXJ0IGl0IHRvIGEgRGF0ZSBvYmplY3QuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgZGF0ZSBpcyBpbnZhbGlkLFxuICAgKiBvciB1bmRlZmluZWQgaWYgdGhlIGRhdGUgaXMgdmFsaWQgb3IgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZSwgY2FuIGJlIGEgRGF0ZSBvYmplY3Qgb3IgYSBzdHJpbmdcbiAgICogQHBhcmFtIHtEYXRlVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBEYXRlVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuXG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZS5nZXREYXRlKCkpKSB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2UgPSBcIlwiIH0gPSBvcHRpb25zO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEaWZmVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBEaWZmIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRGlmZlZhbGlkYXRvcn1cbiAqXG4gKiBAY2xhc3MgRGlmZlZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5ESUZGKVxuZXhwb3J0IGNsYXNzIERpZmZWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8RGlmZlZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ESUZGKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7RGlmZlZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gYWNjZXNzb3IgLSBQcm94eS1saWtlIG9iamVjdCB1c2VkIHRvIHJlc29sdmUgdmFsdWVzIGZyb20gbmVzdGVkIHN0cnVjdHVyZXMgdmlhIHBhdGggc3RyaW5ncy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogRGlmZlZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5ESUZGXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkRJRkZdXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgc3RyaW5nIHBhdHRlcm5zIHdpdGggZmxhZ3NcbiAqIEBzdW1tYXJ5IFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIHBhdHRlcm5zIGluIHRoZSBmb3JtYXQgXCIvcGF0dGVybi9mbGFnc1wiLlxuICogSXQgY2FwdHVyZXMgdGhlIHBhdHRlcm4gYW5kIGZsYWdzIHNlcGFyYXRlbHksIGFsbG93aW5nIHRoZSBjcmVhdGlvbiBvZiBhIFJlZ0V4cCBvYmplY3RcbiAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzLlxuICpcbiAqIEBjb25zdCB7UmVnRXhwfVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2V4cFBhcnNlcjogUmVnRXhwID0gbmV3IFJlZ0V4cChcIl4vKC4rKS8oW2dpbXVzXSopJFwiKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAqIEBzdW1tYXJ5IFRoZSBQYXR0ZXJuVmFsaWRhdG9yIGNoZWNrcyBpZiBhIHN0cmluZyB2YWx1ZSBtYXRjaGVzIGEgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLlxuICogSXQgc3VwcG9ydHMgYm90aCBSZWdFeHAgb2JqZWN0cyBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBwYXR0ZXJucywgaW5jbHVkaW5nIHRob3NlIHdpdGggZmxhZ3MuXG4gKiBUaGlzIHZhbGlkYXRvciBpcyB0aGUgZm91bmRhdGlvbiBmb3Igc3BlY2lhbGl6ZWQgdmFsaWRhdG9ycyBsaWtlIEVtYWlsVmFsaWRhdG9yIGFuZCBVUkxWYWxpZGF0b3IsXG4gKiBhbmQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHBhdHRlcm4gZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFUVEVSTn1cbiAqXG4gKiBAY2xhc3MgUGF0dGVyblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHBhdHRlcm4gdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBwYXR0ZXJuVmFsaWRhdG9yID0gbmV3IFBhdHRlcm5WYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBwYXR0ZXJuIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21QYXR0ZXJuVmFsaWRhdG9yID0gbmV3IFBhdHRlcm5WYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IG1hdGNoIHRoZSByZXF1aXJlZCBmb3JtYXRcIik7XG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBSZWdFeHAgb2JqZWN0XG4gKiBjb25zdCByZWdleE9wdGlvbnMgPSB7IHBhdHRlcm46IC9eW0EtWl1bYS16XSskLyB9O1xuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiLCByZWdleE9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCByZWdleE9wdGlvbnMpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBzdHJpbmcgcGF0dGVyblxuICogY29uc3Qgc3RyaW5nT3B0aW9ucyA9IHsgcGF0dGVybjogXCJeXFxcXGR7M30tXFxcXGR7Mn0tXFxcXGR7NH0kXCIgfTtcbiAqIHBhdHRlcm5WYWxpZGF0b3IuaGFzRXJyb3JzKFwiMTIzLTQ1LTY3ODlcIiwgc3RyaW5nT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBzdHJpbmcgcGF0dGVybiB3aXRoIGZsYWdzXG4gKiBjb25zdCBmbGFnT3B0aW9ucyA9IHsgcGF0dGVybjogXCIvXmhlbGxvJC9pXCIgfTtcbiAqIHBhdHRlcm5WYWxpZGF0b3IuaGFzRXJyb3JzKFwiSGVsbG9cIiwgZmxhZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgUGF0dGVyblZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgZW1wdHlcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgcGF0dGVybiBpcyBtaXNzaW5nXG4gKiAgICAgVi0tPj5DOiBFcnJvcjogTWlzc2luZyBQYXR0ZXJuXG4gKiAgIGVsc2UgcGF0dGVybiBpcyBzdHJpbmdcbiAqICAgICBWLT4+VjogZ2V0UGF0dGVybihwYXR0ZXJuKVxuICogICBlbmRcbiAqICAgVi0+PlY6IFJlc2V0IHBhdHRlcm4ubGFzdEluZGV4XG4gKiAgIFYtPj5WOiBUZXN0IHZhbHVlIGFnYWluc3QgcGF0dGVyblxuICogICBhbHQgcGF0dGVybiB0ZXN0IHBhc3Nlc1xuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSBwYXR0ZXJuIHRlc3QgZmFpbHNcbiAqICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuZXhwb3J0IGNsYXNzIFBhdHRlcm5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHBhdHRlcm4gdG8gYSBSZWdFeHAgb2JqZWN0XG4gICAqIEBzdW1tYXJ5IFBhcnNlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgY29udmVydHMgaXQgdG8gYSBSZWdFeHAgb2JqZWN0LlxuICAgKiBJdCBoYW5kbGVzIGJvdGggc2ltcGxlIHN0cmluZyBwYXR0ZXJucyBhbmQgcGF0dGVybnMgd2l0aCBmbGFncyBpbiB0aGUgZm9ybWF0IFwiL3BhdHRlcm4vZmxhZ3NcIi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gLSBUaGUgc3RyaW5nIHBhdHRlcm4gdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtSZWdFeHB9IEEgUmVnRXhwIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHN0cmluZyBwYXR0ZXJuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldFBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUmVnRXhwIHtcbiAgICBpZiAoIXJlZ2V4cFBhcnNlci50ZXN0KHBhdHRlcm4pKSByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICBjb25zdCBtYXRjaDogYW55ID0gcGF0dGVybi5tYXRjaChyZWdleHBQYXJzZXIpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICogSWYgdGhlIHBhdHRlcm4gaXMgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGl0J3MgY29udmVydGVkIHRvIGEgUmVnRXhwIG9iamVjdCB1c2luZyB0aGUgZ2V0UGF0dGVybiBtZXRob2QuXG4gICAqIFRoZSBtZXRob2QgcmVzZXRzIHRoZSBwYXR0ZXJuJ3MgbGFzdEluZGV4IHByb3BlcnR5IHRvIGVuc3VyZSBjb25zaXN0ZW50IHZhbGlkYXRpb24gcmVzdWx0c1xuICAgKiBmb3IgcGF0dGVybnMgd2l0aCB0aGUgZ2xvYmFsIGZsYWcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgcGF0dGVyblxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gcGF0dGVybiBpcyBwcm92aWRlZCBpbiB0aGUgb3B0aW9uc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICBsZXQgeyBwYXR0ZXJuIH0gPSBvcHRpb25zO1xuICAgIGlmICghcGF0dGVybikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBQYXR0ZXJuXCIpO1xuICAgIHBhdHRlcm4gPSB0eXBlb2YgcGF0dGVybiA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuZ2V0UGF0dGVybihwYXR0ZXJuKSA6IHBhdHRlcm47XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwOyAvLyByZXNldHMgcGF0dGVybiBwb3NpdGlvbiBmb3IgcmVwZWF0IHZhbGlkYXRpb24gcmVxdWVzdHNcbiAgICByZXR1cm4gIXBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXG4gKiBAc3VtbWFyeSBUaGUgRW1haWxWYWxpZGF0b3IgY2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSBzdGFuZGFyZCBlbWFpbCBhZGRyZXNzIHBhdHRlcm4uXG4gKiBJdCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yIGFuZCB1c2VzIGEgcHJlZGVmaW5lZCBlbWFpbCByZWdleCBwYXR0ZXJuIHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3Nlcy5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBlbWFpbCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFTUFJTH1cbiAqXG4gKiBAY2xhc3MgRW1haWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGFuIGVtYWlsIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgZW1haWxWYWxpZGF0b3IgPSBuZXcgRW1haWxWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYW4gZW1haWwgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbUVtYWlsVmFsaWRhdG9yID0gbmV3IEVtYWlsVmFsaWRhdG9yKFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhbiBlbWFpbFxuICogY29uc3QgcmVzdWx0ID0gZW1haWxWYWxpZGF0b3IuaGFzRXJyb3JzKFwidXNlckBleGFtcGxlLmNvbVwiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIGNvbnN0IGludmFsaWRSZXN1bHQgPSBlbWFpbFZhbGlkYXRvci5oYXNFcnJvcnMoXCJpbnZhbGlkLWVtYWlsXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgRW1haWxWYWxpZGF0b3JcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogICBDLT4+RTogbmV3IEVtYWlsVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEUtPj5QOiBzdXBlcihtZXNzYWdlKVxuICogICBDLT4+RTogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBFLT4+UDogc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zIHdpdGggRU1BSUwgcGF0dGVybilcbiAqICAgUC0tPj5FOiB2YWxpZGF0aW9uIHJlc3VsdFxuICogICBFLS0+PkM6IHZhbGlkYXRpb24gcmVzdWx0XG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5FTUFJTClcbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVNQUlMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBlbWFpbCBwYXR0ZXJuLlxuICAgKiBUaGlzIG1ldGhvZCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZCBieSBlbnN1cmluZ1xuICAgKiB0aGUgZW1haWwgcGF0dGVybiBpcyB1c2VkLCBldmVuIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlIGFzIGFuIGVtYWlsIGFkZHJlc3NcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgUGF0dGVyblZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICBwYXR0ZXJuOiBvcHRpb25zPy5wYXR0ZXJuIHx8IERFRkFVTFRfUEFUVEVSTlMuRU1BSUwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgUGF0aFByb3h5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgRXF1YWxzIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRVFVQUxTfVxuICpcbiAqIEBjbGFzcyBFcXVhbHNWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuRVFVQUxTKVxuZXhwb3J0IGNsYXNzIEVxdWFsc1ZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxFcXVhbHNWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRVFVQUxTKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7RXF1YWxzVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBhY2Nlc3NvciAtIFByb3h5LWxpa2Ugb2JqZWN0IHVzZWQgdG8gcmVzb2x2ZSB2YWx1ZXMgZnJvbSBuZXN0ZWQgc3RydWN0dXJlcyB2aWEgcGF0aCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBFcXVhbHNWYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuRVFVQUxTXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5FUVVBTFNdXG4gICAgICAgICk7XG4gIH1cbn1cblxuLy8gVmFsaWRhdGlvbi5yZWdpc3Rlcih7XG4vLyAgIHZhbGlkYXRvcjogRXF1YWxzVmFsaWRhdG9yLFxuLy8gICB2YWxpZGF0aW9uS2V5OiBWYWxpZGF0aW9uS2V5cy5FUVVBTFMsXG4vLyAgIHNhdmU6IGZhbHNlLFxuLy8gfSBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKTtcbiIsImltcG9ydCB7IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuXG4vLyAvKipcbi8vICAqIFNhZmVseSByZXRyaWV2ZXMgYSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgZnJvbSBhbiBvYmplY3QgdXNpbmcgYSBkb3Qtbm90YXRlZCBwYXRoIHN0cmluZy5cbi8vICAqXG4vLyAgKiBAdGVtcGxhdGUgVCAtIFRoZSBleHBlY3RlZCByZXR1cm4gdHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuXG4vLyAgKlxuLy8gICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc291cmNlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbS5cbi8vICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQSBkb3Qtc2VwYXJhdGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIGRlc2lyZWQgcHJvcGVydHkgKGUuZy4sIFwidXNlci5hZGRyZXNzLnN0cmVldFwiKS5cbi8vICAqXG4vLyAgKiBAcmV0dXJucyB7VH0gLSBUaGUgdmFsdWUgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4vLyAgKlxuLy8gICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBwYXRoIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgaWYgYW55IHBhcnQgb2YgdGhlIHBhdGggZG9lcyBub3QgZXhpc3QgaW4gdGhlIG9iamVjdC5cbi8vICAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQnlQYXRoPFQ+KG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcGF0aDogc3RyaW5nKTogVCB7XG4vLyAgIGlmICh0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIiB8fCAhcGF0aC50cmltKCkpIHtcbi8vICAgICB0aHJvdyBuZXcgRXJyb3Ioc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX1BBVEgsIHBhdGgpKTtcbi8vICAgfVxuLy9cbi8vICAgLy8gUHJvY2VzcyBwYXJlbnQgZGlyZWN0b3J5IGFjY2VzcyAoLi4vKVxuLy8gICBjb25zdCBwYXJlbnRBY2Nlc3NvcnMgPSBwYXRoLm1hdGNoKC9cXC5cXC5cXC8vZykgfHwgW107XG4vLyAgIGNvbnN0IHBhcmVudExldmVsID0gcGFyZW50QWNjZXNzb3JzLmxlbmd0aDtcbi8vICAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5cXC5cXC8vZywgXCJcIik7XG4vL1xuLy8gICAvLyBOYXZpZ2F0ZSB1cCB0aGUgcGFyZW50IGNoYWluXG4vLyAgIGxldCBjdXJyZW50Q29udGV4dDogYW55ID0gb2JqO1xuLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudExldmVsOyBpKyspIHtcbi8vICAgICBpZiAoIWN1cnJlbnRDb250ZXh0IHx8IHR5cGVvZiBjdXJyZW50Q29udGV4dCAhPT0gXCJvYmplY3RcIikge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFxuLy8gICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLkNPTlRFWFRfTk9UX09CSkVDVF9DT01QQVJJU09OLCBpICsgMSwgcGF0aClcbi8vICAgICAgICk7XG4vLyAgICAgfVxuLy9cbi8vICAgICBpZiAoIWN1cnJlbnRDb250ZXh0W1ZBTElEQVRJT05fUEFSRU5UX0tFWV0pIHtcbi8vICAgICAgIHRocm93IG5ldyBFcnJvcihcbi8vICAgICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OT19QQVJFTlRfQ09NUEFSSVNPTiwgaSArIDEsIHBhdGgpXG4vLyAgICAgICApO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgY3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dFtWQUxJREFUSU9OX1BBUkVOVF9LRVldO1xuLy8gICB9XG4vL1xuLy8gICAvLyBQcm9jZXNzIGRvdCBub3RhdGlvbiBwYXRoXG4vLyAgIGNvbnN0IHBhcnRzID0gY2xlYW5QYXRoLnNwbGl0KFwiLlwiKTtcbi8vICAgbGV0IGN1cnJlbnRWYWx1ZTogYW55ID0gY3VycmVudENvbnRleHQ7XG4vL1xuLy8gICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbi8vICAgICBpZiAoXG4vLyAgICAgICBjdXJyZW50VmFsdWUgIT09IG51bGwgJiZcbi8vICAgICAgIHR5cGVvZiBjdXJyZW50VmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbi8vICAgICAgIHBhcnQgaW4gY3VycmVudFZhbHVlXG4vLyAgICAgKSB7XG4vLyAgICAgICBjdXJyZW50VmFsdWUgPSAoY3VycmVudFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3BhcnRdO1xuLy8gICAgIH0gZWxzZSB7XG4vLyAgICAgICBjb25zdCBlcnJvck1zZ1RlbXBsYXRlID1cbi8vICAgICAgICAgcGFyZW50TGV2ZWwgPT09IDBcbi8vICAgICAgICAgICA/IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0ZPVU5EXG4vLyAgICAgICAgICAgOiBwYXJlbnRMZXZlbCA9PT0gMVxuLy8gICAgICAgICAgICAgPyBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9GT1VORF9PTl9QQVJFTlRcbi8vICAgICAgICAgICAgIDogQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRk9VTkRfQUZURVJfUEFSRU5UO1xuLy9cbi8vICAgICAgIHRocm93IG5ldyBFcnJvcihzZihlcnJvck1zZ1RlbXBsYXRlLCBwYXRoLCBwYXJ0LCBwYXJlbnRMZXZlbCkpO1xuLy8gICAgIH1cbi8vICAgfVxuLy9cbi8vICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSBhcyBUO1xuLy8gfVxuXG5jb25zdCBnZXRUeXBlTmFtZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIFwibnVsbFwiO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gXCJEYXRlXCI7XG4gIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSByZXR1cm4gXCJOYU5cIjtcbiAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkgcmV0dXJuIFwiSW5maW5pdHlcIjtcbiAgaWYgKHZhbHVlID09PSAtSW5maW5pdHkpIHJldHVybiBcIi1JbmZpbml0eVwiO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBcImFycmF5XCI7XG4gIHJldHVybiB0eXBlb2YgdmFsdWU7XG59O1xuXG5jb25zdCBpc1N1cHBvcnRlZCA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHVuZGVmaW5lZCB8IG51bWJlciB8IGJpZ2ludCB8IERhdGUgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiB0cnVlO1xuXG4gIC8vIE51bWJlcnMgbXVzdCBiZSBmaW5pdGUgKGV4Y2x1ZGVzIE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSlcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciB0d28gdmFsdWVzIGFyZSBlbGlnaWJsZSBmb3IgY29tcGFyaXNvbiB1c2luZyA+PSBvciA8PSBvcGVyYXRvcnMuXG4gKlxuICogU3VwcG9ydGVkIHR5cGVzOiBgdW5kZWZpbmVkYCwgYG51bWJlcmAsIGBiaWdpbnRgLCBhbmQgYERhdGVgLlxuICpcbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gYiAtIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBib3RoIHZhbHVlcyBhcmUgb2Ygc3VwcG9ydGVkIHR5cGVzLlxuICpcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgZWl0aGVyIHZhbHVlIGlzIG9mIGFuIHVuc3VwcG9ydGVkIHR5cGUuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRm9yR3RlT3JMdGVDb21wYXJpc29uKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChpc1N1cHBvcnRlZChhKSAmJiBpc1N1cHBvcnRlZChiKSkgcmV0dXJuIHRydWU7XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBzZihcbiAgICAgIENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVU5TVVBQT1JURURfVFlQRVNfQ09NUEFSSVNPTixcbiAgICAgIGdldFR5cGVOYW1lKGEpLFxuICAgICAgZ2V0VHlwZU5hbWUoYilcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgQ29tcGFyZXMgdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhlIGZpcnN0IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLlxuICogQGRlc2NyaXB0aW9uIFN1cHBvcnRzIG51bWJlcnMgYW5kIGRhdGVzLiBUaHJvd3MgYW4gZXJyb3IgZm9yIHVuc3VwcG9ydGVkIHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBhIC0gVGhlIGZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2FueX0gYiAtIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGBhYCBpcyBsZXNzIHRoYW4gYGJgLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIGVpdGhlciBgYWAgb3IgYGJgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdmFsdWVzIGFyZSBvZiBtaXNtYXRjaGVkIG9yIHVuc3VwcG9ydGVkIHR5cGVzLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMZXNzVGhhbihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYSkgfHwgW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYikpXG4gICAgdGhyb3cgbmV3IEVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTlVMTF9PUl9VTkRFRklORURfQ09NUEFSSVNPTik7XG5cbiAgLy8gVmFsaWRhdGUgdHlwZSBjb21wYXRpYmlsaXR5XG4gIGNvbnN0IGFUeXBlID0gdHlwZW9mIGE7XG4gIGNvbnN0IGJUeXBlID0gdHlwZW9mIGI7XG5cbiAgaWYgKGFUeXBlICE9PSBiVHlwZSkge1xuICAgIC8vIEFsbG93IG51bWJlciBYIGJpZ2ludFxuICAgIGlmIChhVHlwZSA9PT0gXCJiaWdpbnRcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBOdW1iZXIoYSkgPCAoYiBhcyBudW1iZXIpO1xuICAgIGlmIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgICAgIHJldHVybiAoYSBhcyBudW1iZXIpIDwgTnVtYmVyKGIpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlRZUEVfTUlTTUFUQ0hfQ09NUEFSSVNPTiwgYVR5cGUsIGJUeXBlKVxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKSB8fFxuICAgIChhVHlwZSA9PT0gXCJiaWdpbnRcIiAmJiBiVHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgKSB7XG4gICAgaWYgKE51bWJlci5pc05hTihhKSB8fCBOdW1iZXIuaXNOYU4oYikpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTkFOX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhIDwgYjtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGlmIChpc05hTihhLmdldFRpbWUoKSkgfHwgaXNOYU4oYi5nZXRUaW1lKCkpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfREFURV9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPCBiLmdldFRpbWUoKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgYWAgaXMgZ3JlYXRlciB0aGFuIGBiYC5cbiAqIFN1cHBvcnRzIGNvbXBhcmlzb24gZm9yIG51bWJlcnMgYW5kIERhdGUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEBwYXJhbSB7YW55fSBiIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgYWAgaXMgZ3JlYXRlciB0aGFuIGBiYCwgb3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgYGFgIG9yIGBiYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHZhbHVlcyBhcmUgb2YgbWlzbWF0Y2hlZCBvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR3JlYXRlclRoYW4oYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGEpIHx8IFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGIpKVxuICAgIHRocm93IG5ldyBFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5VTExfT1JfVU5ERUZJTkVEX0NPTVBBUklTT04pO1xuXG4gIGNvbnN0IGFUeXBlID0gdHlwZW9mIGE7XG4gIGNvbnN0IGJUeXBlID0gdHlwZW9mIGI7XG5cbiAgaWYgKGFUeXBlICE9PSBiVHlwZSkge1xuICAgIC8vIEFsbG93IG51bWJlciBYIGJpZ2ludFxuICAgIGlmIChhVHlwZSA9PT0gXCJiaWdpbnRcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBOdW1iZXIoYSkgPiAoYiBhcyBudW1iZXIpO1xuICAgIGlmIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgICAgIHJldHVybiAoYSBhcyBudW1iZXIpID4gTnVtYmVyKGIpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVFlQRV9NSVNNQVRDSF9DT01QQVJJU09OLCBhVHlwZSwgYlR5cGUpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpIHx8XG4gICAgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICApIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGEpIHx8IE51bWJlci5pc05hTihiKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OQU5fQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEgPiBiO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgaWYgKGlzTmFOKGEuZ2V0VGltZSgpKSB8fCBpc05hTihiLmdldFRpbWUoKSkpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuSU5WQUxJRF9EQVRFX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA+IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBzZihcbiAgICAgIENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVU5TVVBQT1JURURfVFlQRVNfQ09NUEFSSVNPTixcbiAgICAgIGdldFR5cGVOYW1lKGEpLFxuICAgICAgZ2V0VHlwZU5hbWUoYilcbiAgICApXG4gICk7XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzR3JlYXRlclRoYW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgR3JlYXRlciBUaGFuIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjR1JFQVRFUl9USEFOfVxuICpcbiAqIEBjbGFzcyBHcmVhdGVyVGhhblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4pXG5leHBvcnQgY2xhc3MgR3JlYXRlclRoYW5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8R3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7R3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgICBhY2Nlc3NvcjogUGF0aFByb3h5PGFueT5cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY29tcGFyaXNvblByb3BlcnR5VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29tcGFyaXNvblByb3BlcnR5VmFsdWUgPSBhY2Nlc3Nvci5nZXRWYWx1ZUZyb21QYXRoKFxuICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKGUubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWlzR3JlYXRlclRoYW4odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UsIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNHcmVhdGVyVGhhbiwgaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlscy9QYXRoUHJveHlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNHUkVBVEVSX1RIQU5fT1JfRVFVQUx9XG4gKlxuICogQGNsYXNzIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpXG5leHBvcnQgY2xhc3MgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICAoaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpICYmXG4gICAgICAgICAgaXNFcXVhbCh2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpKSB8fFxuICAgICAgICBpc0dyZWF0ZXJUaGFuKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgZS5tZXNzYWdlLFxuICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzTGVzc1RoYW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTGVzcyBUaGFuIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTEVTU19USEFOfVxuICpcbiAqIEBjbGFzcyBMZXNzVGhhblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4pXG5leHBvcnQgY2xhc3MgTGVzc1RoYW5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7TGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgICBhY2Nlc3NvcjogUGF0aFByb3h5XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5dXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFpc0xlc3NUaGFuKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlLCBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl0pO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNMZXNzVGhhbiwgaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlscy9QYXRoUHJveHlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBMZXNzIFRoYW4gb3IgRXF1YWwgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMRVNTX1RIQU5fT1JfRVFVQUx9XG4gKlxuICogQGNsYXNzIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwpXG5leHBvcnQgY2xhc3MgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChcbiAgICAgICAgKGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSAmJlxuICAgICAgICAgIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSkgfHxcbiAgICAgICAgaXNMZXNzVGhhbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIGUubWVzc2FnZSxcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUxdXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTGlzdFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBlbGVtZW50cyBpbiBhIGxpc3Qgb3Igc2V0IG1hdGNoIGV4cGVjdGVkIHR5cGVzXG4gKiBAc3VtbWFyeSBUaGUgTGlzdFZhbGlkYXRvciB2YWxpZGF0ZXMgdGhhdCBhbGwgZWxlbWVudHMgaW4gYW4gYXJyYXkgb3IgU2V0IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAqIEl0IGNoZWNrcyBlYWNoIGVsZW1lbnQgYWdhaW5zdCBhIGxpc3Qgb2YgYWxsb3dlZCBjbGFzcyB0eXBlcyBhbmQgZW5zdXJlcyB0eXBlIGNvbnNpc3RlbmN5LlxuICogVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQGxpc3QgZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKiBcbiAqIEBjbGFzcyBMaXN0VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGxpc3QgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBsaXN0VmFsaWRhdG9yID0gbmV3IExpc3RWYWxpZGF0b3IoKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgbGlzdCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTGlzdFZhbGlkYXRvciA9IG5ldyBMaXN0VmFsaWRhdG9yKFwiQWxsIGl0ZW1zIG11c3QgYmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlXCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBhIGxpc3RcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IGNsYXp6OiBbXCJTdHJpbmdcIiwgXCJOdW1iZXJcIl0gfTtcbiAqIGNvbnN0IHJlc3VsdCA9IGxpc3RWYWxpZGF0b3IuaGFzRXJyb3JzKFtcInRlc3RcIiwgMTIzXSwgb3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gbGlzdFZhbGlkYXRvci5oYXNFcnJvcnMoW25ldyBEYXRlKCldLCBvcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBMaXN0VmFsaWRhdG9yXG4gKiAgIFxuICogICBDLT4+VjogbmV3IExpc3RWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIGVtcHR5XG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGhhcyBlbGVtZW50c1xuICogICAgIFYtPj5WOiBDaGVjayBlYWNoIGVsZW1lbnQncyB0eXBlXG4gKiAgICAgYWx0IEFsbCBlbGVtZW50cyBtYXRjaCBhbGxvd2VkIHR5cGVzXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZWxzZSBTb21lIGVsZW1lbnRzIGRvbid0IG1hdGNoXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTElTVClcbmV4cG9ydCBjbGFzcyBMaXN0VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPExpc3RWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEFycmF5Lm5hbWUsIFNldC5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFsbCBlbGVtZW50cyBpbiBhIGxpc3Qgb3Igc2V0IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlc1xuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCBlYWNoIGVsZW1lbnQgaW4gdGhlIHByb3ZpZGVkIGFycmF5IG9yIFNldCBtYXRjaGVzIG9uZSBvZiB0aGUgXG4gICAqIGNsYXNzIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy4gRm9yIG9iamVjdCB0eXBlcywgaXQgY2hlY2tzIHRoZSBjb25zdHJ1Y3RvciBuYW1lLFxuICAgKiBhbmQgZm9yIHByaW1pdGl2ZSB0eXBlcywgaXQgY29tcGFyZXMgYWdhaW5zdCB0aGUgbG93ZXJjYXNlIHR5cGUgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHthbnlbXSB8IFNldDxhbnk+fSB2YWx1ZSAtIFRoZSBhcnJheSBvciBTZXQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtMaXN0VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBhbGxvd2VkIGNsYXNzIHR5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnlbXSB8IFNldDxhbnk+LFxuICAgIG9wdGlvbnM6IExpc3RWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAhdmFsdWUubGVuZ3RoIDogIXZhbHVlLnNpemUpKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGF6eiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5jbGF6eilcbiAgICAgID8gb3B0aW9ucy5jbGF6elxuICAgICAgOiBbb3B0aW9ucy5jbGF6el07XG4gICAgbGV0IHZhbDogYW55LFxuICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGkgPCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiB2YWx1ZS5zaXplKTtcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgdmFsID0gKHZhbHVlIGFzIGFueSlbaV07XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouaW5jbHVkZXMoKHZhbCBhcyBvYmplY3QpLmNvbnN0cnVjdG9yPy5uYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouc29tZSgoYzogc3RyaW5nKSA9PiB0eXBlb2YgdmFsID09PSBjLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgY2xhenopO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzLCBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWF4aW11bSBMZW5ndGggVmFsaWRhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHN0cmluZ3MgYW5kIEFycmF5cyBvbiB0aGVpciBtYXhpbXVtIGxlbmd0aFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAY2xhc3MgTWluTGVuZ3RoVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG5leHBvcnQgY2xhc3MgTWF4TGVuZ3RoVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge01heExlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBvcHRpb25zLm1heGxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5tYXhsZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWF4VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgbWF4aW11bVxuICogQHN1bW1hcnkgVGhlIE1heFZhbGlkYXRvciBjaGVja3MgaWYgYSBudW1lcmljIHZhbHVlLCBkYXRlLCBvciBzdHJpbmcgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gKiBhIHNwZWNpZmllZCBtYXhpbXVtIHZhbHVlLiBJdCBzdXBwb3J0cyBjb21wYXJpbmcgbnVtYmVycyBkaXJlY3RseSwgZGF0ZXMgY2hyb25vbG9naWNhbGx5LFxuICogYW5kIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBtYXggZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqIFxuICogQGNsYXNzIE1heFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtYXggdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBtYXhWYWxpZGF0b3IgPSBuZXcgTWF4VmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG1heCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTWF4VmFsaWRhdG9yID0gbmV3IE1heFZhbGlkYXRvcihcIlZhbHVlIG11c3Qgbm90IGV4Y2VlZCB7MH1cIik7XG4gKiBcbiAqIC8vIFZhbGlkYXRlIGEgbnVtYmVyXG4gKiBjb25zdCBudW1PcHRpb25zID0geyBtYXg6IDEwMCwgbWVzc2FnZTogXCJOdW1iZXIgdG9vIGxhcmdlXCIgfTtcbiAqIGNvbnN0IG51bVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMoNTAsIG51bU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZE51bVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMoMTUwLCBudW1PcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogXG4gKiAvLyBWYWxpZGF0ZSBhIGRhdGVcbiAqIGNvbnN0IGRhdGVPcHRpb25zID0geyBtYXg6IG5ldyBEYXRlKDIwMjMsIDExLCAzMSkgfTtcbiAqIGNvbnN0IGRhdGVSZXN1bHQgPSBtYXhWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKDIwMjMsIDUsIDE1KSwgZGF0ZU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBNYXhWYWxpZGF0b3JcbiAqICAgXG4gKiAgIEMtPj5WOiBuZXcgTWF4VmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaXMgRGF0ZSBhbmQgbWF4IGlzIG5vdCBEYXRlXG4gKiAgICAgVi0+PlY6IENvbnZlcnQgbWF4IHRvIERhdGVcbiAqICAgICBhbHQgY29udmVyc2lvbiBmYWlsc1xuICogICAgICAgVi0tPj5DOiBFcnJvcjogSW52YWxpZCBNYXggcGFyYW1cbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIGFsdCB2YWx1ZSA+IG1heFxuICogICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICBlbHNlIHZhbHVlIDw9IG1heFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUFYKVxuZXhwb3J0IGNsYXNzIE1heFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNYXhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJEYXRlXCIsIFwic3RyaW5nXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBtYXhpbXVtXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gdmFsdWVcbiAgICogc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLiBGb3IgZGF0ZXMsIGl0IHBlcmZvcm1zIGNocm9ub2xvZ2ljYWwgY29tcGFyaXNvbixcbiAgICogY29udmVydGluZyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIERhdGUgb2JqZWN0cyBpZiBuZWNlc3NhcnkuIEZvciBudW1iZXJzXG4gICAqIGFuZCBzdHJpbmdzLCBpdCBwZXJmb3JtcyBkaXJlY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge01heFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgbWF4aW11bSB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWF4VmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1heCB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWF4IGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1heCA9IG5ldyBEYXRlKG1heCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1heC5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1heCBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA+IG1heFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgbWF4KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNaW5pbXVtIExlbmd0aCBWYWxpZGF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgc3RyaW5ncyBhbmQgQXJyYXlzIG9uIHRoZWlyIG1pbmltdW0gbGVuZ3RoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbmV4cG9ydCBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTl9MRU5HVEgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBTdHJpbmcubmFtZSwgQXJyYXkubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG1lbWJlck9mIE1pbkxlbmd0aFZhbGlkYXRvclxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBvcHRpb25zLm1pbmxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5taW5sZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgbWluaW11bVxuICogQHN1bW1hcnkgVGhlIE1pblZhbGlkYXRvciBjaGVja3MgaWYgYSBudW1lcmljIHZhbHVlLCBkYXRlLCBvciBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gKiBhIHNwZWNpZmllZCBtaW5pbXVtIHZhbHVlLiBJdCBzdXBwb3J0cyBjb21wYXJpbmcgbnVtYmVycyBkaXJlY3RseSwgZGF0ZXMgY2hyb25vbG9naWNhbGx5LFxuICogYW5kIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBtaW4gZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIFxuICogQGNsYXNzIE1pblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtaW4gdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBtaW5WYWxpZGF0b3IgPSBuZXcgTWluVmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG1pbiB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTWluVmFsaWRhdG9yID0gbmV3IE1pblZhbGlkYXRvcihcIlZhbHVlIG11c3QgYmUgYXQgbGVhc3QgezB9XCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBhIG51bWJlclxuICogY29uc3QgbnVtT3B0aW9ucyA9IHsgbWluOiAxMCwgbWVzc2FnZTogXCJOdW1iZXIgdG9vIHNtYWxsXCIgfTtcbiAqIGNvbnN0IG51bVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMoNTAsIG51bU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZE51bVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMoNSwgbnVtT3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIFxuICogLy8gVmFsaWRhdGUgYSBkYXRlXG4gKiBjb25zdCBkYXRlT3B0aW9ucyA9IHsgbWluOiBuZXcgRGF0ZSgyMDIzLCAwLCAxKSB9O1xuICogY29uc3QgZGF0ZVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoMjAyMywgNSwgMTUpLCBkYXRlT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIE1pblZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBNaW5WYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBEYXRlIGFuZCBtaW4gaXMgbm90IERhdGVcbiAqICAgICBWLT4+VjogQ29udmVydCBtaW4gdG8gRGF0ZVxuICogICAgIGFsdCBjb252ZXJzaW9uIGZhaWxzXG4gKiAgICAgICBWLS0+PkM6IEVycm9yOiBJbnZhbGlkIE1pbiBwYXJhbVxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgYWx0IHZhbHVlIDwgbWluXG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgdmFsdWUgPj0gbWluXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbmRcbiAqIFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG5leHBvcnQgY2xhc3MgTWluVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1pblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU4pIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcIkRhdGVcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIG1pbmltdW1cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBsZXNzIHRoYW4gdGhlIG1pbmltdW0gdmFsdWVcbiAgICogc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLiBGb3IgZGF0ZXMsIGl0IHBlcmZvcm1zIGNocm9ub2xvZ2ljYWwgY29tcGFyaXNvbixcbiAgICogY29udmVydGluZyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIERhdGUgb2JqZWN0cyBpZiBuZWNlc3NhcnkuIEZvciBudW1iZXJzXG4gICAqIGFuZCBzdHJpbmdzLCBpdCBwZXJmb3JtcyBkaXJlY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge01pblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgbWluaW11bSB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWluVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1pbiB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWluIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1pbiA9IG5ldyBEYXRlKG1pbik7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1pbi5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1pbiBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPCBtaW5cbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIG1pbilcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIYW5kbGVzIFBhc3N3b3JkIFZhbGlkYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Vycm9yTWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFTU1dPUkR9XG4gKlxuICogQGNsYXNzIFBhc3N3b3JkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVNTV09SRClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBQYXR0ZXJuVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTpcbiAgICAgICAgb3B0aW9ucz8ucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLlBBU1NXT1JELkNIQVI4X09ORV9PRl9FQUNILFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBwcmVzZW50IGFuZCBub3QgZW1wdHlcbiAqIEBzdW1tYXJ5IFRoZSBSZXF1aXJlZFZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBpcyBwcm92aWRlZCBhbmQgbm90IGVtcHR5LlxuICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzIGFwcHJvcHJpYXRlbHk6IGZvciBib29sZWFucyBhbmQgbnVtYmVycyxcbiAqIGl0IGNoZWNrcyBpZiB0aGV5J3JlIHVuZGVmaW5lZDsgZm9yIG90aGVyIHR5cGVzIChzdHJpbmdzLCBhcnJheXMsIG9iamVjdHMpLFxuICogaXQgY2hlY2tzIGlmIHRoZXkncmUgZmFsc3kuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEByZXF1aXJlZCBkZWNvcmF0b3JcbiAqIGFuZCBpcyBvZnRlbiB0aGUgZmlyc3QgdmFsaWRhdGlvbiBhcHBsaWVkIHRvIGltcG9ydGFudCBmaWVsZHMuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUkVRVUlSRUR9XG4gKiBcbiAqIEBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSByZXF1aXJlZCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IHJlcXVpcmVkVmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkVmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIHJlcXVpcmVkIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21SZXF1aXJlZFZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvcihcIlRoaXMgZmllbGQgaXMgbWFuZGF0b3J5XCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhcIlwiKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKDApOyAvLyB1bmRlZmluZWQgKHZhbGlkIC0gMCBpcyBhIHZhbGlkIG51bWJlcilcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhudWxsKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKFtdKTsgLy8gdW5kZWZpbmVkICh2YWxpZCAtIGVtcHR5IGFycmF5IGlzIHN0aWxsIGFuIGFycmF5KVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBSZXF1aXJlZFZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBSZXF1aXJlZFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdHlwZW9mIHZhbHVlIGlzIGJvb2xlYW4gb3IgbnVtYmVyXG4gKiAgICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZWxzZSB2YWx1ZSBpcyBkZWZpbmVkXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZW5kXG4gKiAgIGVsc2Ugb3RoZXIgdHlwZXNcbiAqICAgICBhbHQgdmFsdWUgaXMgZmFsc3kgKG51bGwsIHVuZGVmaW5lZCwgZW1wdHkgc3RyaW5nKVxuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZWxzZSB2YWx1ZSBpcyB0cnV0aHlcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG5leHBvcnQgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIHByZXNlbnQgYW5kIG5vdCBlbXB0eVxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgZXhpc3RzIGFuZCBpcyBub3QgZW1wdHkuXG4gICAqIFRoZSB2YWxpZGF0aW9uIGxvZ2ljIHZhcmllcyBieSB0eXBlOlxuICAgKiAtIEZvciBib29sZWFucyBhbmQgbnVtYmVyczogY2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAgICogLSBGb3Igb3RoZXIgdHlwZXMgKHN0cmluZ3MsIGFycmF5cywgb2JqZWN0cyk6IGNoZWNrcyBpZiB0aGUgdmFsdWUgaXMgZmFsc3lcbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IFZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAhdmFsdWVcbiAgICAgICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU3RlcFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBTdGVwIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjU1RFUH1cbiAqXG4gKiBAY2xhc3MgU3RlcFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5TVEVQKVxuZXhwb3J0IGNsYXNzIFN0ZXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8U3RlcFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5TVEVQKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwXG4gICAqIEBwYXJhbSB7U3RlcFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogU3RlcFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgJSBOdW1iZXIob3B0aW9ucy5zdGVwKSAhPT0gMFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5zdGVwKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHlwZVZhbGlkYXRvck9wdGlvbnMsIFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gKiBAc3VtbWFyeSBUaGUgVHlwZVZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICogSXQgY2FuIHZhbGlkYXRlIGFnYWluc3QgYSBzaW5nbGUgdHlwZSwgbXVsdGlwbGUgdHlwZXMsIG9yIGEgdHlwZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEB0eXBlIGRlY29yYXRvciBhbmQgaXMgZnVuZGFtZW50YWwgZm9yXG4gKiBlbnN1cmluZyB0eXBlIHNhZmV0eSBpbiB2YWxpZGF0ZWQgbW9kZWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAY2xhc3MgVHlwZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHR5cGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCB0eXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSB0eXBlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21UeXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IGJlIG9mIHR5cGUgezB9LCBidXQgZ290IHsxfVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhZ2FpbnN0IGEgc2luZ2xlIHR5cGVcbiAqIGNvbnN0IHN0cmluZ09wdGlvbnMgPSB7IHR5cGVzOiBcInN0cmluZ1wiIH07XG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyhcImhlbGxvXCIsIHN0cmluZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBzdHJpbmdPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgbXVsdGlwbGUgdHlwZXNcbiAqIGNvbnN0IG11bHRpT3B0aW9ucyA9IHsgdHlwZXM6IFtcInN0cmluZ1wiLCBcIm51bWJlclwiXSB9O1xuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnModHJ1ZSwgbXVsdGlPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgYSBjbGFzcyB0eXBlXG4gKiBjb25zdCBjbGFzc09wdGlvbnMgPSB7IHR5cGVzOiB7IG5hbWU6IFwiRGF0ZVwiIH0gfTtcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKCksIGNsYXNzT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVHlwZVZhbGlkYXRvclxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAqXG4gKiAgIEMtPj5WOiBuZXcgVHlwZVZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGlzIGRlZmluZWRcbiAqICAgICBWLT4+UjogZXZhbHVhdGVEZXNpZ25UeXBlcyh2YWx1ZSwgdHlwZXMpXG4gKiAgICAgYWx0IHR5cGUgZXZhbHVhdGlvbiBwYXNzZXNcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbHNlIHR5cGUgZXZhbHVhdGlvbiBmYWlsc1xuICogICAgICAgVi0+PlY6IEZvcm1hdCBlcnJvciBtZXNzYWdlIHdpdGggdHlwZSBpbmZvXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuZXhwb3J0IGNsYXNzIFR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8VHlwZVZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICAgKiBJdCB1c2VzIHRoZSBSZWZsZWN0aW9uIHV0aWxpdHkgdG8gZXZhbHVhdGUgaWYgdGhlIHZhbHVlJ3MgdHlwZSBtYXRjaGVzIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAgICogVGhlIG1ldGhvZCBza2lwcyB2YWxpZGF0aW9uIGZvciB1bmRlZmluZWQgdmFsdWVzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBSZXF1aXJlZFZhbGlkYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VHlwZVZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgZXhwZWN0ZWQgdHlwZXNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVHlwZVZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBEb24ndCB0cnkgYW5kIGVuZm9yY2UgdHlwZSBpZiB1bmRlZmluZWRcbiAgICBjb25zdCB7IHR5cGVzLCBtZXNzYWdlIH0gPSBvcHRpb25zO1xuICAgIGlmICghUmVmbGVjdGlvbi5ldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0eXBlcykpXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdHlwZW9mIHR5cGVzID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB0eXBlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh0eXBlcylcbiAgICAgICAgICAgID8gdHlwZXMuam9pbihcIiwgXCIpXG4gICAgICAgICAgICA6IHR5cGVzLm5hbWUsXG4gICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciB0aGUgVHlwZVZhbGlkYXRvciB3aXRoIHRoZSBWYWxpZGF0aW9uIHJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBUaGlzIHJlZ2lzdHJhdGlvbiBhc3NvY2lhdGVzIHRoZSBUeXBlVmFsaWRhdG9yIHdpdGggdGhlIE1vZGVsS2V5cy5UWVBFIGtleSxcbiAqIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpbmcgZGVzaWduIHR5cGVzLiBUaGUgc2F2ZSBmbGFnIGlzIHNldCB0byBmYWxzZVxuICogdG8gcHJldmVudCB0aGUgdmFsaWRhdG9yIGZyb20gYmVpbmcgc2F2ZWQgaW4gdGhlIHN0YW5kYXJkIHZhbGlkYXRvciByZWdpc3RyeS5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICB2YWxpZGF0b3I6IFR5cGVWYWxpZGF0b3IsXG4gIHZhbGlkYXRpb25LZXk6IE1vZGVsS2V5cy5UWVBFLFxuICBzYXZlOiBmYWxzZSxcbn0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4iLCJpbXBvcnQge1xuICBWYWxpZGF0aW9uS2V5cyxcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIFVSTFxuICogQHN1bW1hcnkgVGhlIFVSTFZhbGlkYXRvciBjaGVja3MgaWYgYSBzdHJpbmcgbWF0Y2hlcyBhIHN0YW5kYXJkIFVSTCBwYXR0ZXJuLlxuICogSXQgZXh0ZW5kcyB0aGUgUGF0dGVyblZhbGlkYXRvciBhbmQgdXNlcyBhIHJvYnVzdCBVUkwgcmVnZXggcGF0dGVybiB0byB2YWxpZGF0ZSB3ZWIgYWRkcmVzc2VzLlxuICogVGhlIHBhdHRlcm4gaXMgc291cmNlZCBmcm9tIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kcGVyaW5pLzcyOTI5NH0gYW5kIGlzIHdpZGVseVxuICogcmVjb2duaXplZCBmb3IgaXRzIGFjY3VyYWN5IGluIHZhbGlkYXRpbmcgVVJMcy4gVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHVybCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNVUkx9XG4gKlxuICogQGNsYXNzIFVSTFZhbGlkYXRvclxuICogQGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBVUkwgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCB1cmxWYWxpZGF0b3IgPSBuZXcgVVJMVmFsaWRhdG9yKCk7XG4gKlxuICogLy8gQ3JlYXRlIGEgVVJMIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21VcmxWYWxpZGF0b3IgPSBuZXcgVVJMVmFsaWRhdG9yKFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgd2ViIGFkZHJlc3NcIik7XG4gKlxuICogLy8gVmFsaWRhdGUgYSBVUkxcbiAqIGNvbnN0IHJlc3VsdCA9IHVybFZhbGlkYXRvci5oYXNFcnJvcnMoXCJodHRwczovL2V4YW1wbGUuY29tXCIpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZFJlc3VsdCA9IHVybFZhbGlkYXRvci5oYXNFcnJvcnMoXCJub3QtYS11cmxcIik7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgVSBhcyBVUkxWYWxpZGF0b3JcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogICBDLT4+VTogbmV3IFVSTFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBVLT4+UDogc3VwZXIobWVzc2FnZSlcbiAqICAgQy0+PlU6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgVS0+PlA6IHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucyB3aXRoIFVSTCBwYXR0ZXJuKVxuICogICBQLS0+PlU6IHZhbGlkYXRpb24gcmVzdWx0XG4gKiAgIFUtLT4+QzogdmFsaWRhdGlvbiByZXN1bHRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlVSTClcbmV4cG9ydCBjbGFzcyBVUkxWYWxpZGF0b3IgZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgVVJMXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBzdHJpbmcgbWF0Y2hlcyB0aGUgVVJMIHBhdHRlcm4uXG4gICAqIFRoaXMgbWV0aG9kIGV4dGVuZHMgdGhlIFBhdHRlcm5WYWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kIGJ5IGVuc3VyaW5nXG4gICAqIHRoZSBVUkwgcGF0dGVybiBpcyB1c2VkLCBldmVuIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlIGFzIGEgVVJMXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFBhdHRlcm5WYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnModmFsdWUsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBtZXNzYWdlOiBvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLFxuICAgICAgcGF0dGVybjogb3B0aW9ucy5wYXR0ZXJuIHx8IERFRkFVTFRfUEFUVEVSTlMuVVJMLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEaWZmVmFsaWRhdG9yT3B0aW9ucyxcbiAgRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gIFZhbGlkYXRpb25NZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSBcIi4uL3V0aWxzL2RhdGVzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvRGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGZpZWxkIGFzIHJlcXVpcmVkXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVxdWlyZWQsIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIG51bGwsIG9yIGVtcHR5LlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFUVVJUkVEfS5cbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGNvbW1vbmx5IHVzZWQgYXMgdGhlIGZpcnN0IHZhbGlkYXRpb24gc3RlcCBmb3IgaW1wb3J0YW50IGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1JFUVVJUkVEfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiByZXF1aXJlZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoXCJFbWFpbCBhZGRyZXNzIGlzIG1hbmRhdG9yeVwiKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgZW5mb3JjZXMgYSBtaW5pbXVtIHZhbHVlIGNvbnN0cmFpbnRcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHksIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCBtaW5pbXVtLlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTn0uXG4gKiBUaGlzIGRlY29yYXRvciB3b3JrcyB3aXRoIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGUgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZC4gRm9yIGRhdGVzLCBjYW4gYmUgYSBEYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqXG4gKiBAZnVuY3Rpb24gbWluXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQG1pbigwKVxuICogICBwcmljZTogbnVtYmVyO1xuICpcbiAqICAgQG1pbihuZXcgRGF0ZSgyMDIzLCAwLCAxKSwgXCJEYXRlIG11c3QgYmUgYWZ0ZXIgSmFudWFyeSAxLCAyMDIzXCIpXG4gKiAgIHJlbGVhc2VEYXRlOiBEYXRlO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4oXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTlxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuTUlOXTogdmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWH1cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGV9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVh9XG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhdOiB2YWx1ZSxcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzdGVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjU1RFUH1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1NURVB9XG4gKlxuICogQGZ1bmN0aW9uIHN0ZXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVBcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5TVEVQKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5TVEVQXTogdmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbTnVtYmVyLm5hbWVdLFxuICAgICAgfSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1pbmxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbmxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5fTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSF06IHZhbHVlLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNQVhfTEVOR1RIfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4bGVuZ3RoXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4bGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWF9MRU5HVEhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXTogdmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBSZWdFeHAgcGF0dGVybiB0aGUgcHJvcGVydHkgbXVzdCByZXNwZWN0XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBVFRFUk59XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVRURVJOfVxuICpcbiAqIEBmdW5jdGlvbiBwYXR0ZXJuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0dGVybihcbiAgdmFsdWU6IFJlZ0V4cCB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUEFUVEVSTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIGVtYWlsXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0VNQUlMfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0VNQUlMfVxuICpcbiAqIEBmdW5jdGlvbiBlbWFpbFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRU1BSUwpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihrZXksIHtcbiAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLkVNQUlMLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIFVSTFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNVUkx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBmdW5jdGlvbiB1cmxcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVVJMKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oa2V5LCB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogREVGQVVMVF9QQVRURVJOUy5VUkwsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgICAgfSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRW5mb3JjZXMgdHlwZSB2ZXJpZmljYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjVFlQRX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSB0eXBlcyBhY2NlcHRlZCB0eXBlc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGUoXG4gIHR5cGVzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVFlQRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KGtleSwge1xuICAgICAgICBjdXN0b21UeXBlczogdHlwZXMsXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEYXRlIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0RBVEV9XG4gKlxuICogV2lsbCBlbmZvcmNlIHNlcmlhbGl6YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBmb3JtYXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IGFjY2VwdGVkIGZvcm1hdCBhY2NvcmRpbmcgdG8ge0BsaW5rIGZvcm1hdERhdGV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNEQVRFfVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlXG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUoXG4gIGZvcm1hdDogc3RyaW5nID0gXCJkZC9NTS95eXl5XCIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURVxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkRBVEUpO1xuICBjb25zdCBkYXRlRGVjID0gKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcGVydHlLZXk/OiBhbnkpOiBhbnkgPT4ge1xuICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdOiBmb3JtYXQsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgdHlwZXM6IFtEYXRlLm5hbWVdLFxuICAgIH0pKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgc2V0KHRoaXM6IGFueSwgbmV3VmFsdWU6IHN0cmluZyB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgcHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci5jb25maWd1cmFibGUpXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gdmFsdWVzLmdldCh0aGlzKSxcbiAgICAgICAgICAgIHNldDogKG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWw6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFsID0gcGFyc2VEYXRlKGZvcm1hdCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgdmFsKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihzZihcIkZhaWxlZCB0byBwYXJzZSBkYXRlOiB7MH1cIiwgZS5tZXNzYWdlIHx8IGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpc1twcm9wZXJ0eUtleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiaGVyZVwiKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpLmRlZmluZShkYXRlRGVjKS5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhc3N3b3JkIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBU1NXT1JEfVxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSBbcGF0dGVybl0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUEFUVEVSTlMjQ0hBUjhfT05FX09GX0VBQ0h9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVNTV09SRH1cbiAqXG4gKiBAZnVuY3Rpb24gcGFzc3dvcmRcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmQoXG4gIHBhdHRlcm46IFJlZ0V4cCA9IERFRkFVTFRfUEFUVEVSTlMuUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0gsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFTU1dPUkRcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5QQVNTV09SRCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBwYXR0ZXJuLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IExpc3QgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gQWxzbyBzZXRzIHRoZSB7QGxpbmsgdHlwZX0gdG8gdGhlIHByb3ZpZGVkIGNvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbGxlY3Rpb25dIFRoZSBjb2xsZWN0aW9uIGJlaW5nIHVzZWQuIGRlZmF1bHRzIHRvIEFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIGxpc3RcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PiB8IE1vZGVsQ29uc3RydWN0b3I8YW55PltdLFxuICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1Rcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwge1xuICAgICAgICBjbGF6ejogQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6ei5tYXAoKGMpID0+IGMubmFtZSkgOiBbY2xhenoubmFtZV0sXG4gICAgICAgIHR5cGU6IGNvbGxlY3Rpb24sXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXQgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gV3JhcHBlciBmb3Ige0BsaW5rIGxpc3R9IHdpdGggdGhlICdTZXQnIENvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIHNldFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCB0byBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRVFVQUxTfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGVxdWFsaXR5IGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBlcXVhbGl0eSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBlcVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU1xuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuRVFVQUxTXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVRVUFMUyksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRElGRn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRpZmZlcmVuY2UgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZGlmZlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRlxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IERpZmZWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkRJRkZdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgfTtcblxuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRElGRiksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTiksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHRlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTFxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTiksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3RlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTl9PUl9FUVVBTFxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gIH07XG5cbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTCksXG4gICAgb3B0aW9ucyBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgRnVuY3Rpb24gdG8gb3ZlcnJpZGUgY29uc3RydWN0b3JzXG4gKlxuICogQHRlbXBsYXRlIE0gdGhlIG1vZGVsIGluc3RhbmNlIHR5cGVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdXG4gKiBAcmV0dXJuIHtNfSB0aGUgbmV3IGluc3RhbmNlXG4gKlxuICogQGZ1bmN0aW9uIGNvbnN0cnVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNvbnN0cnVjdG9yOiBhbnksXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBNIHtcbiAgY29uc3QgX2NvbnN0ciA9ICguLi5hcmd6OiBhbnlbXSkgPT4gbmV3IGNvbnN0cnVjdG9yKC4uLmFyZ3opO1xuICBfY29uc3RyLnByb3RvdHlwZSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIF9jb25zdHIoLi4uYXJncyk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVjdXJzaXZlbHkgZmluZHMgdGhlIGxhc3QgcHJvdG90eXBlIGJlZm9yZSBPYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdChvYmo6IG9iamVjdCk6IG9iamVjdCB7XG4gIGxldCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gb2JqO1xuICB3aGlsZSAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBwcm90b3R5cGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZVwiKTtcbn1cblxuLyoqXG4gKiBAc3VtYXJ5IGJpbmRzIHRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzIGFzIGEgcm9vdCBwcm90b3R5cGUgb2YgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kTW9kZWxQcm90b3R5cGUob2JqOiB1bmtub3duKSB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbCkgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIGJpbmRQcm90b3R5cGUob2JqVG9PdmVycmlkZTogdW5rbm93biwgcHJvdG90eXBlOiBvYmplY3QpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqVG9PdmVycmlkZSwgcHJvdG90eXBlKTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gYmluZFByb3RvdHlwZShvYmosIE1vZGVsLnByb3RvdHlwZSk7XG4gIH1cbiAgd2hpbGUgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGNvbnN0IHByb3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAoXG4gICAgICBwcm90ID09PSBPYmplY3QucHJvdG90eXBlIHx8XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIHJldHVybiBiaW5kUHJvdG90eXBlKHByb3RvdHlwZSwgTW9kZWwucHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZSB0byBiaW5kXCIpO1xufVxuIiwiaW1wb3J0IHsgYmluZE1vZGVsUHJvdG90eXBlLCBjb25zdHJ1Y3QgfSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyB0aGUgdHBlIG9zIGFuIEluc3RhbmNlQ2FsbGJhY2sgZnVuY3Rpb25cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VDYWxsYmFjayA9IChpbnN0YW5jZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYSBNb2RlbCBjbGFzc1xuICogQGRlc2NyaXB0aW9uXG4gKlxuICogLSBSZWdpc3RlcnMgdGhlIGNsYXNzIHVuZGVyIHRoZSBtb2RlbCByZWdpc3RyeSBzbyBpdCBjYW4gYmUgZWFzaWx5IHJlYnVpbHQ7XG4gKiAtIE92ZXJyaWRlcyB0aGUgY2xhc3MgY29uc3RydWN0b3I7XG4gKiAtIFJ1bnMgdGhlIGdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IGlmIGRlZmluZWQ7XG4gKiAtIFJ1bnMgdGhlIG9wdGlvbmFsIHtAbGluayBJbnN0YW5jZUNhbGxiYWNrfSBpZiBwcm92aWRlZDtcbiAqXG4gKiBAcGFyYW0ge0luc3RhbmNlQ2FsbGJhY2t9IFtpbnN0YW5jZUNhbGxiYWNrXSBvcHRpb25hbCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGluc3RhbmNlIHVwb24gaW5zdGFudGlhdGlvbi4gZGVmYXVsdHMgdG8gdW5kZWZpbmVkXG4gKlxuICogQGZ1bmN0aW9uIG1vZGVsXG4gKlxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsKGluc3RhbmNlQ2FsbGJhY2s/OiBJbnN0YW5jZUNhbGxiYWNrKSB7XG4gIHJldHVybiAoKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBvcmlnaW5hbD4gPSBjb25zdHJ1Y3QoXG4gICAgICAgIG9yaWdpbmFsLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgICAgYmluZE1vZGVsUHJvdG90eXBlKGluc3RhbmNlKTtcbiAgICAgIC8vIHJ1biBhIGJ1aWxkZXIgZnVuY3Rpb24gaWYgZGVmaW5lZCB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAoVGhlIE1vZGVsQXJnKVxuICAgICAgY29uc3QgYnVpbGRlciA9IE1vZGVsLmdldEJ1aWxkZXIoKTtcbiAgICAgIGlmIChidWlsZGVyKSBidWlsZGVyKGluc3RhbmNlLCBhcmdzLmxlbmd0aCA/IGFyZ3NbMF0gOiB1bmRlZmluZWQpO1xuXG4gICAgICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkoaW5zdGFuY2UuY29uc3RydWN0b3IpO1xuXG4gICAgICBpZiAoaW5zdGFuY2VDYWxsYmFjaykgaW5zdGFuY2VDYWxsYmFjayhpbnN0YW5jZSwgLi4uYXJncyk7XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcblxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKG9yaWdpbmFsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIGtleSxcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShrZXksIG9yaWdpbmFsKSxcbiAgICAgICAgbmV3Q29uc3RydWN0b3JcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkob3JpZ2luYWwpO1xuXG4gICAgTW9kZWwucmVnaXN0ZXIobmV3Q29uc3RydWN0b3IsIG9yaWdpbmFsLm5hbWUpO1xuXG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH0pIGFzIGFueTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBoYXNoaW5nIGFsZ29yaXRobSB0byB1c2Ugb24gdGhlIG1vZGVsXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiAtIFJlZ2lzdGVycyB0aGUgY2xhc3MgdW5kZXIgdGhlIG1vZGVsIHJlZ2lzdHJ5IHNvIGl0IGNhbiBiZSBlYXNpbHkgcmVidWlsdDtcbiAqIC0gT3ZlcnJpZGVzIHRoZSBjbGFzcyBjb25zdHJ1Y3RvcjtcbiAqIC0gUnVucyB0aGUgZ2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn0gaWYgZGVmaW5lZDtcbiAqIC0gUnVucyB0aGUgb3B0aW9uYWwge0BsaW5rIEluc3RhbmNlQ2FsbGJhY2t9IGlmIHByb3ZpZGVkO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGdvcml0aG0gdGhlIGFsZ29yaXRobSB0byB1c2VcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaGVkQnlcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaGVkQnkoYWxnb3JpdGhtOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLkhBU0hJTkcpLCB7XG4gICAgYWxnb3JpdGhtOiBhbGdvcml0aG0sXG4gICAgYXJnczogYXJncyxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiBhbGdvcml0aG0gdG8gdXNlIG9uIHRoZSBtb2RlbFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXJpYWxpemVyIHRoZSBhbGdvcml0aG0gdG8gdXNlXG4gKlxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZWRCeVxuICpcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVkQnkoc2VyaWFsaXplcjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSwge1xuICAgIHNlcmlhbGl6ZXI6IHNlcmlhbGl6ZXIsXG4gICAgYXJnczogYXJncyxcbiAgfSk7XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBUeXBlU2NyaXB0IGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9uIGxpYnJhcnlcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGZyYW1ld29yayB1c2luZyBUeXBlU2NyaXB0IGRlY29yYXRvcnMuXG4gKiBJdCBleHBvc2VzIHV0aWxpdHkgZnVuY3Rpb25zLCB2YWxpZGF0aW9uIGRlY29yYXRvcnMsIGFuZCBtb2RlbC1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgZm9yXG4gKiBpbXBsZW1lbnRpbmcgdHlwZS1zYWZlLCBkZWNsYXJhdGl2ZSB2YWxpZGF0aW9uIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIHJlZmxlY3Rpb24gcGFja2FnZVxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiTW9kZWxLZXlzIiwiYXBwbHkiLCJtZXRhZGF0YSIsIlByaW1pdGl2ZXMiLCJSZXNlcnZlZE1vZGVscyIsIlJlZmxlY3Rpb24iLCJpc0VxdWFsIiwiRGF0ZVZhbGlkYXRvciIsIl9fZGVjb3JhdGUiLCJEaWZmVmFsaWRhdG9yIiwiUGF0dGVyblZhbGlkYXRvciIsIkVtYWlsVmFsaWRhdG9yIiwiRXF1YWxzVmFsaWRhdG9yIiwiR3JlYXRlclRoYW5WYWxpZGF0b3IiLCJHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IiLCJMZXNzVGhhblZhbGlkYXRvciIsIkxlc3NUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkxpc3RWYWxpZGF0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IiLCJNYXhWYWxpZGF0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJNaW5WYWxpZGF0b3IiLCJQYXNzd29yZFZhbGlkYXRvciIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiU3RlcFZhbGlkYXRvciIsIlR5cGVWYWxpZGF0b3IiLCJVUkxWYWxpZGF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFhLFVBQUEseUJBQXlCLEdBQUc7SUFDdkMsSUFBQSxZQUFZLEVBQ1Ysc0VBQXNFO0lBQ3hFLElBQUEsNkJBQTZCLEVBQzNCLHVGQUF1RjtJQUN6RixJQUFBLGdCQUFnQixFQUNkLDBFQUEwRTtJQUM1RSxJQUFBLGtCQUFrQixFQUFFLHdEQUF3RDtJQUM1RSxJQUFBLDRCQUE0QixFQUMxQixtREFBbUQ7SUFDckQsSUFBQSw0QkFBNEIsRUFDMUIsa0RBQWtEO0lBQ3BELElBQUEsdUJBQXVCLEVBQUUseUNBQXlDO0lBQ2xFLElBQUEsd0JBQXdCLEVBQ3RCLHdEQUF3RDtJQUMxRCxJQUFBLGNBQWMsRUFBRSx5Q0FBeUM7Ozs7Ozs7SUNmM0Q7Ozs7OztJQU1HO1VBQ1UscUJBQXFCLEdBQUcsTUFBTSxDQUFDLFNBQVM7O0lDUHJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFxQkc7QUFDU0E7SUFBWixDQUFBLFVBQVksU0FBUyxFQUFBO0lBQ25CLElBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLGNBQXdCO0lBQ3hCLElBQUEsU0FBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLGFBQW9CO0lBQ3BCLElBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLG1CQUE0QjtJQUM1QixJQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxtQkFBNEI7SUFDNUIsSUFBQSxTQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtJQUNmLElBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFNBQWtCO0lBQ2xCLElBQUEsU0FBQSxDQUFBLGNBQUEsQ0FBQSxHQUFBLGdCQUErQjtJQUMvQixJQUFBLFNBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxjQUEwQjtJQUMxQixJQUFBLFNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjtJQUNuQixJQUFBLFNBQUEsQ0FBQSxlQUFBLENBQUEsR0FBQSxlQUErQjtJQUNqQyxDQUFDLEVBWFdBLGlCQUFTLEtBQVRBLGlCQUFTLEdBV3BCLEVBQUEsQ0FBQSxDQUFBO0lBRUQ7Ozs7Ozs7O0lBUUc7QUFDSSxVQUFNLGNBQWMsR0FBRzs7SUMxQzlCOzs7Ozs7Ozs7Ozs7O0lBYUc7QUFDVSxVQUFBLHdCQUF3QixHQUFHO0lBQ3RDLElBQUEsTUFBTSxFQUFFLFFBQVE7SUFDaEIsSUFBQSxJQUFJLEVBQUUsV0FBVztJQUNqQixJQUFBLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLElBQUEsa0JBQWtCLEVBQUUsaUJBQWlCO0lBQ3JDLElBQUEsWUFBWSxFQUFFLGFBQWE7SUFDM0IsSUFBQSxxQkFBcUIsRUFBRSxvQkFBb0I7O0lBRzdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFxQkc7QUFDVSxVQUFBLGNBQWMsR0FBRztJQUM1QixJQUFBLE9BQU8sRUFBRSxDQUFBLEVBQUdBLGlCQUFTLENBQUMsT0FBTyxDQUFhLFdBQUEsQ0FBQTtJQUMxQyxJQUFBLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUEsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBQSxHQUFHLEVBQUUsS0FBSztJQUNWLElBQUEsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFBLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBQSxVQUFVLEVBQUUsV0FBVztJQUN2QixJQUFBLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLElBQUEsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBQSxLQUFLLEVBQUUsT0FBTztJQUNkLElBQUEsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFBLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBQSxJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUEsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUEsTUFBTSxFQUFFLFFBQVE7SUFDaEIsSUFBQSxHQUFHLHdCQUF3Qjs7SUFHN0I7Ozs7Ozs7SUFPRztBQUNVLFVBQUEsV0FBVyxHQUFHO1FBQ3pCLFNBQVM7UUFDVCxVQUFVO1FBQ1YsT0FBTztRQUNQLE9BQU87UUFDUCxLQUFLO1FBQ0wsTUFBTTtRQUNOLE1BQU07UUFDTixRQUFRO1FBQ1IsV0FBVztRQUNYLFNBQVM7UUFDVCxVQUFVO1FBQ1YsVUFBVTs7SUFHWjs7Ozs7OztJQU9HO0FBQ1UsVUFBQSxrQkFBa0IsR0FBRztRQUNoQyxRQUFRO1FBQ1IsUUFBUTtRQUNSLFNBQVM7UUFDVCxXQUFXO1FBQ1gsVUFBVTtRQUNWLFFBQVE7UUFDUixVQUFVOztJQUdaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXVCRztBQUNVLFVBQUEsc0JBQXNCLEdBQTJCO0lBQzVELElBQUEsUUFBUSxFQUFFLHdCQUF3QjtJQUNsQyxJQUFBLEdBQUcsRUFBRSwwQkFBMEI7SUFDL0IsSUFBQSxHQUFHLEVBQUUsMEJBQTBCO0lBQy9CLElBQUEsVUFBVSxFQUFFLDJCQUEyQjtJQUN2QyxJQUFBLFVBQVUsRUFBRSwyQkFBMkI7SUFDdkMsSUFBQSxPQUFPLEVBQUUsc0NBQXNDO0lBQy9DLElBQUEsS0FBSyxFQUFFLGdDQUFnQztJQUN2QyxJQUFBLEdBQUcsRUFBRSw4QkFBOEI7SUFDbkMsSUFBQSxJQUFJLEVBQUUsMENBQTBDO0lBQ2hELElBQUEsSUFBSSxFQUFFLGtDQUFrQztJQUN4QyxJQUFBLElBQUksRUFBRSxpQ0FBaUM7SUFDdkMsSUFBQSxPQUFPLEVBQUUsbUJBQW1CO0lBQzVCLElBQUEsUUFBUSxFQUNOLDRIQUE0SDtJQUM5SCxJQUFBLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsSUFBQSxlQUFlLEVBQUUsK0JBQStCO0lBQ2hELElBQUEsTUFBTSxFQUFFLHVDQUF1QztJQUMvQyxJQUFBLElBQUksRUFBRSw2Q0FBNkM7SUFDbkQsSUFBQSxTQUFTLEVBQUUsd0NBQXdDO0lBQ25ELElBQUEsa0JBQWtCLEVBQUUsb0RBQW9EO0lBQ3hFLElBQUEsWUFBWSxFQUFFLDJDQUEyQztJQUN6RCxJQUFBLHFCQUFxQixFQUNuQix1REFBdUQ7O0lBRzNEOzs7Ozs7SUFNRztBQUNVLFVBQUEsZ0JBQWdCLEdBQUc7SUFDOUIsSUFBQSxLQUFLLEVBQ0gsNEpBQTRKO0lBQzlKLElBQUEsR0FBRyxFQUFFLHlhQUF5YTtJQUM5YSxJQUFBLFFBQVEsRUFBRTtJQUNSLFFBQUEsaUJBQWlCLEVBQ2YsaUZBQWlGO0lBQ3BGLEtBQUE7OztJQzVLSDs7Ozs7Ozs7OztJQVVHO2FBQ2EsWUFBWSxDQUFDLE1BQWMsRUFBRSxHQUFHLElBQXlCLEVBQUE7UUFDdkUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLEtBQUssRUFBRSxNQUFNLEVBQUE7SUFDdkQsUUFBQSxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO0lBQzdCLGNBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVE7a0JBQ3JCLFdBQVc7SUFDakIsS0FBQyxDQUFDO0lBQ0o7SUFFQTs7Ozs7Ozs7Ozs7SUFXRztBQUNJLFVBQU0sRUFBRSxHQUFHOztJQ3hCbEI7Ozs7Ozs7Ozs7SUFVRztJQUNhLFNBQUEsY0FBYyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQUE7UUFDekQsSUFBSSxZQUFZLEdBQVcsTUFBTTs7SUFHakMsSUFBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQztJQUN6RCxTQUFBLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDOUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDO0lBQzFELFNBQUEsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUMvQixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUM7SUFDekQsU0FBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzlCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQzs7SUFHL0QsSUFBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQztJQUM1RCxTQUFBLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDOUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDOztJQUdsRSxJQUFBLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDMUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDO0lBQzVELFNBQUEsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUM5QixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7O0lBR2xFLElBQUEsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUMxQixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEQsU0FBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzlCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs7SUFHOUQsSUFBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQzs7SUFFOUQsU0FBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pDLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQzs7SUFHbEUsSUFBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztJQUMzRCxTQUFBLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDL0IsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDOztJQUc5RCxJQUFBLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDO0lBQzlELFNBQUEsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUseUJBQXlCLENBQUM7SUFDdkUsSUFBQSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQztJQUMxRCxTQUFBLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDOUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDOztJQUdoRSxJQUFBLFlBQVksR0FBRztJQUNaLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxvQkFBb0I7SUFDakMsU0FBQSxPQUFPLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDO1FBRXBDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUM7UUFFNUMsTUFBTSxLQUFLLEdBYVAsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQVE7SUFFNUIsSUFBQSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07SUFBRSxRQUFBLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWxELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBVSxFQUFBO0lBQ3ZDLFFBQUEsSUFBSSxDQUFDLENBQUM7SUFBRSxZQUFBLE9BQU8sQ0FBQztJQUNoQixRQUFBLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFMUIsUUFBQSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTTtJQUNuQyxLQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzVDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUUxQyxJQUFBLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSTtRQUM5QixJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFFMUMsSUFBQSxJQUFJLElBQUk7SUFBRSxRQUFBLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSTtRQUVqRCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2xELE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUUzQyxJQUFBLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUztJQUN4QyxJQUFBLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYztJQUNsRCxJQUFBLElBQUksS0FBSyxHQUFvQixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQWU7SUFDekQsSUFBQSxJQUFJLFNBQVM7SUFBRSxRQUFBLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQzthQUNoRCxJQUFJLGNBQWMsRUFBRTtZQUN2QixNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUMzQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUN6RDtJQUNELFFBQUEsSUFBSSxDQUFDLENBQUM7SUFBRSxZQUFBLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzdCLFFBQUEsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzs7SUFDekIsUUFBQSxLQUFLLEdBQUcsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFBLENBQUUsQ0FBQztJQUV2QyxJQUFBLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNuRTtJQUVBOzs7Ozs7Ozs7OztJQVdHO0lBQ2EsU0FBQSxnQkFBZ0IsQ0FBQyxJQUFzQixFQUFFLE1BQWMsRUFBQTtJQUNyRSxJQUFBLElBQUksQ0FBQyxJQUFJO1lBQUU7UUFDWCxNQUFNLElBQUksR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQzNDLElBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO0lBQ3pDLFFBQUEsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBQSxZQUFZLEVBQUUsS0FBSztJQUNuQixRQUFBLEtBQUssRUFBRSxJQUFJO0lBQ1osS0FBQSxDQUFDO0lBQ0YsSUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7SUFDdEMsUUFBQSxVQUFVLEVBQUUsS0FBSztJQUNqQixRQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLFFBQUEsS0FBSyxFQUFFLElBQUk7SUFDWixLQUFBLENBQUM7O0lBRUYsSUFBQSxPQUFPLElBQUk7SUFDYjtJQUVBOzs7Ozs7Ozs7O0lBVUc7SUFDRyxTQUFVLFdBQVcsQ0FBQyxJQUFTLEVBQUE7SUFDbkMsSUFBQSxRQUNFLElBQUk7WUFDSixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssZUFBZTtJQUN4RCxRQUFBLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFFdkI7SUFFQTs7Ozs7Ozs7O0lBU0c7SUFDRyxTQUFVLFdBQVcsQ0FBQyxHQUFXLEVBQUE7SUFDckMsSUFBQSxPQUFPLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFO0lBQzlDO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJCRzthQUNhLFVBQVUsQ0FBQyxJQUFVLEVBQUUsYUFBcUIsWUFBWSxFQUFBO0lBQ3RFLElBQUEsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNoQyxLQUFLLEdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUMvQixJQUFJLEdBQVcsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNqQyxJQUFJLEdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUM5QixNQUFNLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNsQyxNQUFNLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNsQyxXQUFXLEdBQVcsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUM1QyxDQUFDLEdBQVcsSUFBSSxHQUFHLEVBQUUsRUFDckIsRUFBRSxHQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDM0IsRUFBRSxHQUFXLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDOUIsRUFBRSxHQUFXLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFDaEMsRUFBRSxHQUFXLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFDaEMsR0FBRyxHQUFXLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFDckMsSUFBSSxHQUFXLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUNoRCxHQUFHLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQy9CLEVBQUUsR0FBVyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQzdCLENBQUMsR0FBVyxLQUFLLEdBQUcsQ0FBQyxFQUNyQixFQUFFLEdBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUMzQixJQUFJLEdBQVcsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUNqQyxHQUFHLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQy9CLElBQUksR0FBVyxJQUFJLEdBQUcsRUFBRSxFQUN4QixFQUFFLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztJQUVoQyxJQUFBLFVBQVUsR0FBRztJQUNWLFNBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3pCLFNBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO0lBQzVCLFNBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO0lBQzlCLFNBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO0lBQzlCLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO0lBQ25DLFNBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLFNBQUEsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFO0lBRTNCLFNBQUEsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJO0lBQ3BCLFNBQUEsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHO0lBQ2xCLFNBQUEsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJO0lBQ3BCLFNBQUEsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLFNBQUEsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDdEIsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNsQyxRQUFBLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQzs7YUFDNUQ7SUFDTCxRQUFBLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7SUFFdEUsSUFBQSxPQUFPLFVBQVU7SUFDbkI7SUFFQTs7Ozs7O0lBTUc7SUFDYSxTQUFBLFNBQVMsQ0FBQyxNQUFjLEVBQUUsQ0FBMEIsRUFBQTtRQUNsRSxJQUFJLEtBQUssR0FBcUIsU0FBUztJQUV2QyxJQUFBLElBQUksQ0FBQyxDQUFDO0lBQUUsUUFBQSxPQUFPLFNBQVM7UUFFeEIsSUFBSSxDQUFDLFlBQVksSUFBSTtJQUNuQixRQUFBLElBQUk7SUFDRixZQUFBLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7OztZQUU3RCxPQUFPLENBQU0sRUFBRTtJQUNmLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixFQUFFLENBQUMsMkNBQTJDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUN0RTs7SUFFQSxTQUFBLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO0lBQzlCLFFBQUEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDOztJQUM1QixTQUFBLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO0lBQ2hDLFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLFFBQUEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQzs7SUFDaEQsU0FBQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN6QixRQUFBLElBQUk7SUFDRixZQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQixZQUFBLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7OztZQUVyRCxPQUFPLENBQUMsRUFBRTtJQUNWLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixFQUFFLENBQUMsMkNBQTJDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUMzRDs7O2FBRUU7SUFDTCxRQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQSxDQUFFLENBQUM7O0lBRWhELElBQUEsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ3hDOztJQzVTQTtJQUNBLFNBQVMsc0JBQXNCLENBQUMsTUFBYyxFQUFBO0lBQzVDLElBQUEsT0FBTyxjQUFjO0lBQ3ZCO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBDRztVQUNVLFVBQVUsQ0FBQTtJQUNyQjs7O0lBR0c7aUJBQ1ksSUFBVSxDQUFBLFVBQUEsR0FTckIsRUFBRSxDQUFDO0lBRVA7OztJQUdHO2lCQUNZLElBQWUsQ0FBQSxlQUFBLEdBQW9CLHNCQUFzQixDQUFDO0lBbUJ6RSxJQUFBLFdBQUEsQ0FBb0IsVUFBa0IsY0FBYyxFQUFBO1lBQWhDLElBQU8sQ0FBQSxPQUFBLEdBQVAsT0FBTzs7SUFFM0I7Ozs7O0lBS0c7SUFDSCxJQUFBLEdBQUcsQ0FBQyxHQUFXLEVBQUE7SUFDYixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRztJQUNkLFFBQUEsT0FBTyxJQUFJOztJQUdiOzs7Ozs7SUFNRztJQUNLLElBQUEsUUFBUSxDQUNkLEtBQUEsR0FBaUIsS0FBSyxFQUN0QixHQUFHLFVBQW9FLEVBQUE7WUFFdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO0lBQ1gsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDO1lBQ3hFLElBQ0UsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO0lBQ2xDLFlBQUEsQ0FBQyxLQUFLO2dCQUNOLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYztJQUUvQixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLENBQzVFO0lBQ0gsUUFBQSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYyxJQUFJLEtBQUs7SUFDMUMsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDO0lBRXZELFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUM7Z0JBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRTtJQUNoRSxZQUFBLEdBQUcsVUFBVTtJQUNkLFNBQUEsQ0FBQztJQUVGLFFBQUEsT0FBTyxJQUFJOztJQUdiOzs7OztJQUtHO1FBQ0gsTUFBTSxDQUNKLEdBQUcsVUFBb0UsRUFBQTtZQUV2RSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsVUFBVSxDQUFDOztJQUc1Qzs7Ozs7SUFLRztRQUNILE1BQU0sQ0FDSixHQUFHLFVBQW9FLEVBQUE7WUFFdkUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQzs7SUFHakMsSUFBQSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsQ0FBQSxHQUFZLGNBQWMsRUFBQTtZQUNoRSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsZ0JBQWdCLENBQ2hELE1BQWMsRUFDZCxXQUFpQixFQUNqQixVQUF5QyxFQUFBO2dCQUV6QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNsRCxZQUFBLElBQUksVUFBVTtnQkFDZCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU87c0JBQzdDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsa0JBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNO0lBQ3JELFlBQUEsSUFDRSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUMxQixnQkFBQSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDbkMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQzlDO0lBQ0EsZ0JBQUEsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVTs7cUJBQ3REO0lBQ0wsZ0JBQUEsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVTs7SUFFcEUsWUFBQTtJQUNFLGdCQUFBLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDMUMsZ0JBQUEsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNuQyxhQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFNLENBQVMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQzs7OztJQUkzRSxTQUFDO0lBQ0QsUUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRTtnQkFDOUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN2QyxZQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2hCLFNBQUEsQ0FBQztJQUNGLFFBQUEsT0FBTyxnQkFBZ0I7O0lBR3pCOzs7O0lBSUc7UUFDSCxLQUFLLEdBQUE7WUFLSCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7SUFDWCxZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUM7SUFDL0QsUUFBQSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDekUsUUFBQSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7O0lBR3REOzs7Ozs7O0lBT0c7UUFDSyxPQUFPLFFBQVEsQ0FDckIsR0FBVyxFQUNYLE9BQWUsRUFDZixVQUFzRSxFQUN0RSxNQUFrRSxFQUFBO0lBRWxFLFFBQUEsSUFBSSxDQUFDLEdBQUc7SUFBRSxZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUM7SUFDdkUsUUFBQSxJQUFJLENBQUMsVUFBVTtJQUNiLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQztJQUN0RSxRQUFBLElBQUksQ0FBQyxPQUFPO0lBQ1YsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDO0lBRW5FLFFBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQUUsWUFBQSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN0QyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7SUFDMUMsUUFBQSxJQUFJLFVBQVU7SUFBRSxZQUFBLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVU7SUFDM0UsUUFBQSxJQUFJLE1BQU07SUFBRSxZQUFBLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU07O0lBR2pFOzs7O0lBSUc7UUFDSCxPQUFPLGtCQUFrQixDQUFDLFFBQXlCLEVBQUE7SUFDakQsUUFBQSxVQUFVLENBQUMsZUFBZSxHQUFHLFFBQVE7O1FBR3ZDLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBQTtZQUNwQixPQUFPLElBQUksVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7UUFHbEMsT0FBTyxXQUFXLENBQUMsT0FBZSxFQUFBO0lBQ2hDLFFBQUEsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUM7Ozs7SUMvUGxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF3Qkc7YUFDYSxJQUFJLENBQUMsR0FBYyxHQUFBQSxpQkFBUyxDQUFDLFNBQVMsRUFBQTtJQUNwRCxJQUFBLE9BQU8sQ0FBQyxLQUFhLEVBQUUsV0FBaUIsS0FBVTtJQUNoRCxRQUFBLElBQUksS0FBZTtJQUNuQixRQUFBLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtJQUNwRCxZQUFBLEtBQUssR0FBSSxLQUFhLENBQUMsR0FBRyxDQUFDOztpQkFDdEI7SUFDTCxZQUFBLEtBQUssR0FBSSxLQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTs7SUFFbEMsUUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFxQixDQUFDO0lBQ3hDLFlBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFxQixDQUFDO0lBQ3JDLEtBQUM7SUFDSDtJQUVBOzs7Ozs7Ozs7O0lBVUc7SUFDYSxTQUFBLFlBQVksQ0FBSSxHQUFXLEVBQUUsS0FBUSxFQUFBO0lBQ25ELElBQUEsT0FBT0MsZ0JBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRUMsbUJBQVEsQ0FBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0M7O0lDdERBOzs7Ozs7Ozs7SUFTRztJQUNHLFNBQVUsUUFBUSxDQUFDLEdBQW9DLEVBQUE7SUFDM0QsSUFBQSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNqQixJQUFJLElBQUksR0FBRyxDQUFDO0lBQ1osSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxTQUFTO0lBQ3JDLFFBQUEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7O0lBRXJCLElBQUEsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFO0lBQ3hCO0lBU0E7Ozs7Ozs7OztJQVNHO0lBQ0csU0FBVSxPQUFPLENBQUMsR0FBZ0MsRUFBQTtJQUN0RCxJQUFBLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBa0IsRUFBRSxFQUFPLEVBQUE7SUFDdkQsUUFBQSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBRS9CLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtJQUM1QixZQUFBLE9BQU8sWUFBWSxDQUFDLENBQUUsQ0FBWSxJQUFJLEVBQUUsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFL0QsUUFBQSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDVixDQUFDLEdBQUcsQ0FBRSxDQUFZLElBQUksQ0FBQyxJQUFLLENBQVksR0FBRyxNQUFNO1lBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDZCxLQUFDO1FBRUQsTUFBTSxJQUFJLEdBQW9CLFFBQVE7UUFFdEMsTUFBTSxZQUFZLEdBQUcsVUFBVSxLQUFVLEVBQUE7WUFDdkMsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXO0lBQUUsWUFBQSxPQUFPLEVBQUU7SUFDM0MsUUFBQSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFO0lBQzdELFlBQUEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksS0FBSyxZQUFZLElBQUk7SUFBRSxZQUFBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2RCxRQUFBLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7SUFDckUsUUFBQSxPQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUF5QixDQUFDLE1BQU0sQ0FDekQsV0FBVyxFQUNYLFNBQXVDLENBQ3hDO0lBQ0gsS0FBQztJQUVELElBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV4RCxPQUFPLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUM1RTtBQUVPLFVBQU0sb0JBQW9CLEdBQUc7SUFFcEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBb0JHO1VBQ1UsT0FBTyxDQUFBO0lBQ2xCOzs7SUFHRztpQkFDWSxJQUFPLENBQUEsT0FBQSxHQUFXLG9CQUFvQixDQUFDO0lBRXREOzs7SUFHRztJQUNZLElBQUEsU0FBQSxJQUFBLENBQUEsS0FBSyxHQUFvQztJQUN0RCxRQUFBLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUM7SUFFRixJQUFBLFdBQUEsR0FBQTtJQUVBOzs7Ozs7O0lBT0c7UUFDSyxPQUFPLEdBQUcsQ0FBQyxHQUFXLEVBQUE7SUFDNUIsUUFBQSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSztJQUFFLFlBQUEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUM3QyxRQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLEdBQUcsQ0FBQSxDQUFFLENBQUM7O0lBRzlEOzs7Ozs7SUFNRztRQUNILE9BQU8sUUFBUSxDQUNiLEdBQVcsRUFDWCxJQUFxQixFQUNyQixVQUFVLEdBQUcsS0FBSyxFQUFBO0lBRWxCLFFBQUEsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUs7SUFDbkIsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixHQUFHLENBQUEsbUJBQUEsQ0FBcUIsQ0FBQztJQUM3RCxRQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSTtJQUN0QixRQUFBLElBQUksVUFBVTtJQUFFLFlBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHOztRQUdwQyxPQUFPLElBQUksQ0FBQyxHQUFRLEVBQUUsTUFBZSxFQUFFLEdBQUcsSUFBVyxFQUFBO0lBQ25ELFFBQUEsSUFBSSxDQUFDLE1BQU07SUFBRSxZQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3hELFFBQUEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzs7UUFHdkMsT0FBTyxVQUFVLENBQUMsTUFBYyxFQUFBO1lBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Ozs7SUMvSW5DLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFXLEtBQUk7SUFDeEMsSUFBQSxPQUFPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQVcsRUFBRSxJQUFZLEtBQUk7SUFDckQsSUFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7SUFDckQsUUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RSxJQUFBLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBV0Q7Ozs7Ozs7OztJQVNHO1VBQ1UsZUFBZSxDQUFBO0lBQzFCOzs7Ozs7Ozs7O0lBVUc7SUFDSCxJQUFBLE9BQU8sTUFBTSxDQUNYLFVBQWEsRUFDYixJQUtDLEVBQUE7WUFFRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUc7SUFDM0QsWUFBQSxTQUFTLEVBQUUsaUJBQWlCO0lBQzVCLFlBQUEsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixZQUFBLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQUEsZUFBZSxFQUFFLEtBQUs7SUFDdEIsWUFBQSxHQUFHLElBQUk7YUFDUjtJQUVELFFBQUEsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBUyxFQUFFO2dCQUNqQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBQTtJQUNkLGdCQUFBLElBQUksSUFBSSxLQUFLLGtCQUFrQixFQUFFO0lBQy9CLG9CQUFBLE9BQU8sVUFBVSxJQUFZLEVBQUE7NEJBQzNCLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOzRCQUM3QyxJQUFJLE9BQU8sR0FBUSxVQUFVO0lBRTdCLHdCQUFBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3JDLDRCQUFBLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckIsNEJBQUEsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO0lBQ2pCLGdDQUFBLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0NBQ2pDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO0lBQ3pDLG9DQUFBLE1BQU0sSUFBSSxLQUFLLENBQ2IsRUFBRSxDQUNBLHlCQUF5QixDQUFDLDZCQUE2QixFQUN2RCxDQUFDLEdBQUcsQ0FBQyxFQUNMLElBQUksQ0FDTCxDQUNGOztJQUVILGdDQUFBLE9BQU8sR0FBRyxNQUFNLENBQUM7b0NBQ2pCOztJQUdGLDRCQUFBLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztJQUNqQyw0QkFBQSxJQUFJLENBQUMsZUFBZSxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVc7SUFDcEQsZ0NBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixFQUFFLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUMzRDtJQUVILDRCQUFBLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxLQUFLLElBQUk7SUFDakMsZ0NBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixFQUFFLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUMzRDs7SUFHTCx3QkFBQSxPQUFPLE9BQU87SUFDaEIscUJBQUM7O0lBR0gsZ0JBQUEsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO2lCQUNwQjtJQUNGLFNBQUEsQ0FBQzs7Ozs7OztJQVNGLFFBQUEsT0FBTyxLQUFxQjs7SUFHOUI7Ozs7O0lBS0c7UUFDSyxPQUFPLFNBQVMsQ0FBQyxJQUFZLEVBQUE7WUFDbkMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO0lBQzFDLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7O0lBRTVDOztJQzVIRDs7Ozs7Ozs7OztJQVVHO1VBQ1Usb0JBQW9CLENBQUE7SUFLL0IsSUFBQSxXQUFBLENBQVksTUFBbUIsRUFBQTtJQUM3QixRQUFBLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO0lBQ3pCLFlBQUEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDcEUsZ0JBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFXLEVBQUUsSUFBSSxFQUFFO0lBQ3ZDLG9CQUFBLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLG9CQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLG9CQUFBLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ25CLG9CQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2hCLGlCQUFBLENBQUM7OztJQUlSOzs7O0lBSUc7UUFDSCxRQUFRLEdBQUE7WUFDTixNQUFNLElBQUksR0FBUSxJQUFXO0lBQzdCLFFBQUEsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUk7SUFDcEIsYUFBQSxNQUFNLENBQ0wsQ0FBQyxDQUFDLEtBQ0EsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0MsWUFBQSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVO0lBRWhDLGFBQUEsTUFBTSxDQUFDLENBQUMsS0FBYSxFQUFFLElBQUksS0FBSTtJQUM5QixZQUFBLElBQUksU0FBUyxHQUF1QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDaEUsQ0FBQyxTQUE2QixFQUFFLEdBQUcsS0FBSTtJQUNyQyxnQkFBQSxJQUFJLENBQUMsU0FBUzt3QkFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQzs7d0JBQ3RDLFNBQVMsSUFBSSxDQUFLLEVBQUEsRUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBRTtJQUN4QyxnQkFBQSxPQUFPLFNBQVM7aUJBQ2pCLEVBQ0QsU0FBUyxDQUNWO2dCQUVELElBQUksU0FBUyxFQUFFO0lBQ2IsZ0JBQUEsU0FBUyxHQUFHLENBQUcsRUFBQSxJQUFJLENBQU0sR0FBQSxFQUFBLFNBQVMsRUFBRTtJQUNwQyxnQkFBQSxJQUFJLENBQUMsS0FBSzt3QkFBRSxLQUFLLEdBQUcsU0FBUzs7SUFDeEIsb0JBQUEsS0FBSyxJQUFJLENBQUEsRUFBQSxFQUFLLFNBQVMsQ0FBQSxDQUFFOztJQUdoQyxZQUFBLE9BQU8sS0FBSzthQUNiLEVBQUUsRUFBRSxDQUFDOztJQUVYOztJQzlERDs7Ozs7Ozs7OztJQVVHO0FBQ1NDO0lBQVosQ0FBQSxVQUFZLFVBQVUsRUFBQTtJQUNwQixJQUFBLFVBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLFVBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLFVBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjtJQUNuQixJQUFBLFVBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNuQixDQUFDLEVBTFdBLGtCQUFVLEtBQVZBLGtCQUFVLEdBS3JCLEVBQUEsQ0FBQSxDQUFBO0lBRUQ7Ozs7Ozs7Ozs7OztJQVlHO0FBQ1NDO0lBQVosQ0FBQSxVQUFZLGNBQWMsRUFBQTtJQUN4QixJQUFBLGNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLGNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLGNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLGNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjtJQUNuQixJQUFBLGNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLGNBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0lBQ2YsQ0FBQyxFQVBXQSxzQkFBYyxLQUFkQSxzQkFBYyxHQU96QixFQUFBLENBQUEsQ0FBQTtJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0lBZ0JHO0FBQ1UsVUFBQSxPQUFPLEdBQUc7UUFDckIsUUFBUTtRQUNSLE9BQU87UUFDUCxRQUFRO1FBQ1IsU0FBUztRQUNULFFBQVE7UUFDUixVQUFVO1FBQ1YsUUFBUTtRQUNSLFdBQVc7UUFDWCxNQUFNO1FBQ04sUUFBUTs7O0lDN0RWOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFtREc7VUFDbUIsU0FBUyxDQUFBO0lBSTdCLElBQUEsV0FBQSxDQUNFLFVBQWtCLHNCQUFzQixDQUFDLE9BQU8sRUFDaEQsR0FBRyxhQUF1QixFQUFBO0lBRTFCLFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPO1lBRXRCLElBQUksYUFBYSxDQUFDLE1BQU07SUFBRSxZQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYTtZQUM1RCxJQUFJLElBQUksQ0FBQyxhQUFhO0lBQ3BCLFlBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRzFFOzs7Ozs7Ozs7O0lBVUc7SUFDTyxJQUFBLFVBQVUsQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFXLEVBQUE7SUFDbEQsUUFBQSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7O0lBRzdCOzs7Ozs7Ozs7SUFTRztJQUNLLElBQUEscUJBQXFCLENBQzNCLE9BQTJELEVBQUE7SUFFM0QsUUFBQSxPQUFPLFVBRUwsS0FBVSxFQUNWLEdBQUcsSUFBVyxFQUFBO0lBRWQsWUFBQSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtJQUM1QyxnQkFBQSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ2hDLElBQUksQ0FBQ0MscUJBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBQ25ELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FDcEIsc0JBQXNCLENBQUMsSUFBSSxFQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDN0IsT0FBTyxLQUFLLENBQ2I7SUFDSCxZQUFBLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUNoQyxTQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7SUEwQmQ7OztJQUdHO1FBQ0gsT0FBTyxXQUFXLENBQUMsR0FBUSxFQUFBO1lBQ3pCLE9BQU8sR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQzs7SUFFL0M7O0lDaEpEOzs7Ozs7Ozs7SUFTRztVQUNVLGlCQUFpQixDQUFBO0lBTTVCLElBQUEsV0FBQSxDQUFZLEdBQUcsVUFBK0MsRUFBQTtZQUh0RCxJQUFLLENBQUEsS0FBQSxHQUFRLEVBQUU7SUFJckIsUUFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUU7SUFDeEIsUUFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUFDOztJQUc5Qjs7SUFFRztRQUNILGFBQWEsR0FBQTtZQUNYLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQzs7SUFHL0M7O0lBRUc7UUFDSCxPQUFPLEdBQUE7WUFDTCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7SUFHaEM7Ozs7O0lBS0c7SUFDSCxJQUFBLEdBQUcsQ0FBc0IsWUFBb0IsRUFBQTtJQUMzQyxRQUFBLElBQUksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztJQUFFLFlBQUEsT0FBTyxTQUFTO1lBRW5ELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO0lBQ2hELFFBQUEsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUFFLFlBQUEsT0FBTyxlQUFvQjtJQUN2RSxRQUFBLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxPQUFPLElBQUksZUFBZTtJQUM5RCxRQUFBLE1BQU0sUUFBUSxHQUFHLElBQUksV0FBVyxFQUFFO0lBQ2xDLFFBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRO0lBQ25DLFFBQUEsT0FBTyxRQUFROztJQUdqQjs7OztJQUlHO1FBQ0gsUUFBUSxDQUNOLEdBQUcsU0FBc0MsRUFBQTtJQUV6QyxRQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUk7SUFDdEIsWUFBQSxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7O0lBRzVCLGdCQUFBLElBQUssQ0FBeUIsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUs7d0JBQUU7b0JBQzVELElBQUksQ0FBQyxLQUFLLENBQUUsQ0FBeUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDOztxQkFDbkQ7b0JBQ0wsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBd0I7SUFDbkUsZ0JBQUEsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUs7d0JBQUU7SUFDakMsZ0JBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxTQUFTO0lBQ3JDLGdCQUFBLElBQUksQ0FBQyxJQUFJO3dCQUFFO29CQUNYLE1BQU0sR0FBRyxHQUEyQixFQUFFO29CQUN0QyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsYUFBYTtJQUVoRCxnQkFBQSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDOztJQUVyRSxTQUFDLENBQUM7O0lBRUw7O0lDN0VEOzs7Ozs7O0lBT0c7VUFDVSxVQUFVLENBQUE7aUJBQ04sSUFBdUIsQ0FBQSx1QkFBQSxHQUNwQyxTQUFTLENBQUM7SUFFWixJQUFBLFdBQUEsR0FBQTtJQUVBOzs7OztJQUtHO0lBQ0gsSUFBQSxPQUFPLFdBQVcsQ0FDaEIsaUJBQWdELEVBQ2hELGdCQUFzRCxFQUFBO0lBRXRELFFBQUEsSUFBSSxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsdUJBQXVCO2dCQUN4RCxVQUFVLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBUyxLQUFJO29CQUNqRSxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLGdCQUFBLElBQUksU0FBUzt3QkFBRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEUsYUFBQyxDQUFDO0lBQ0osUUFBQSxVQUFVLENBQUMsdUJBQXVCLEdBQUcsaUJBQWlCOztJQUd4RDs7OztJQUlHO0lBQ0ssSUFBQSxPQUFPLFdBQVcsR0FBQTtZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QjtJQUNyQyxZQUFBLFVBQVUsQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFO1lBQzlELE9BQU8sVUFBVSxDQUFDLHVCQUF1Qjs7SUFHM0M7Ozs7O0lBS0c7UUFDSCxPQUFPLEdBQUcsQ0FBc0IsWUFBb0IsRUFBQTtZQUNsRCxPQUFPLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDOztJQUduRDs7OztJQUlHO0lBQ0gsSUFBQSxPQUFPLFFBQVEsQ0FDYixHQUFHLFNBQXNDLEVBQUE7WUFFekMsT0FBTyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDOztJQUd4RDs7Ozs7SUFLRztRQUNILE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBQTtJQUNwQixRQUFBLE9BQU8sY0FBYyxDQUFDLE9BQU8sR0FBRyxHQUFHOztJQUdyQzs7SUFFRztJQUNILElBQUEsT0FBTyxJQUFJLEdBQUE7SUFDVCxRQUFBLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRTs7OztJQ25FdkM7Ozs7Ozs7Ozs7SUFVRzthQUNhLFFBQVEsQ0FDdEIsR0FBTSxFQUNOLEdBQUcsYUFBdUIsRUFBQTtRQUUxQixNQUFNLG1CQUFtQixHQUE0QyxFQUFFO1FBQ3ZFLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRztZQUNwQixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQy9DLFlBQUEsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO0lBRWxDLFlBQUEsbUJBQW1CLENBQUMsSUFBSSxDQUN0QkEscUJBQVUsQ0FBQyxxQkFBcUIsQ0FDOUIsY0FBYyxDQUFDLE9BQU8sRUFDdEIsR0FBRyxFQUNILElBQUksQ0FDb0MsQ0FDM0M7UUFFTCxJQUFJLE1BQU0sR0FBNEIsU0FBUztJQUUvQyxJQUFBLEtBQUssTUFBTSxpQkFBaUIsSUFBSSxtQkFBbUIsRUFBRTtJQUNuRCxRQUFBLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsaUJBQWlCO0lBRTlDLFFBQUEsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO2dCQUFFO0lBRXZDLFFBQUEsTUFBTSxvQkFBb0IsR0FBc0IsVUFBVSxDQUFDLENBQUMsQ0FBQzs7SUFHN0QsUUFBQSxJQUNFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUk7SUFDcEIsWUFBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssY0FBYyxDQUFDLElBQUk7SUFBRSxnQkFBQSxPQUFPLElBQUk7Z0JBQzlDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FDMUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzdDO2FBQ0YsQ0FBQyxFQUNGO0lBQ0EsWUFBQSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7O1lBR3JCLElBQUksSUFBSSxHQUFtRCxTQUFTO0lBRXBFLFFBQUEsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7Z0JBQ2xDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLENBQUEsc0JBQUEsRUFBeUIsU0FBUyxDQUFDLEdBQUcsQ0FBRSxDQUFBLENBQUM7O2dCQUczRCxNQUFNLGNBQWMsR0FDbEIsU0FBUyxDQUFDLEdBQUcsS0FBS0wsaUJBQVMsQ0FBQztJQUMxQixrQkFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLO0lBQ2xCLGtCQUFFLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUUzQixZQUFBLE1BQU0sR0FBRyxHQUF1QixTQUFTLENBQUMsU0FBUyxDQUNoRCxHQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzdCLGNBQWtDLEVBQ2xDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDekU7Z0JBRUQsSUFBSSxHQUFHLEVBQUU7SUFDUCxnQkFBQSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDakIsZ0JBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHOzs7WUFJN0IsSUFBSSxJQUFJLEVBQUU7SUFDUixZQUFBLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRTtnQkFDckIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUk7Ozs7UUFLcEQsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3hFLFFBQUEsSUFBSSxHQUF1Qjs7SUFFM0IsUUFBQSxNQUFNLGFBQWEsR0FBR0sscUJBQVUsQ0FBQyxxQkFBcUIsQ0FDcEQsY0FBYyxDQUFDLE9BQU8sRUFDdEIsR0FBRyxFQUNILElBQUksQ0FDTCxDQUFDLFVBQVU7WUFDWixNQUFNLFVBQVUsR0FBR0EscUJBQVUsQ0FBQyxxQkFBcUIsQ0FDakQsY0FBYyxDQUFDLE9BQU8sRUFDdEIsR0FBRyxFQUNILElBQUksQ0FDTCxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ2pCLENBQUMsQ0FBa0IsS0FDakIsQ0FBQ0wsaUJBQVMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUN4RTtJQUNELFFBQUEsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO2dCQUFFO0lBQ3ZDLFFBQUEsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBdUI7SUFDakQsUUFBQSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ3RCLGNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7a0JBQ2YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVc7SUFDbkMsa0JBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztzQkFDVixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUNJLHNCQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQ25ELENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FDSjtJQUViLFFBQUEsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUU7SUFDckIsWUFBQSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUM1QyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUUsR0FBVyxDQUFDLElBQUksQ0FBQzswQkFDckQsY0FBYyxDQUFDO0lBQ2pCLHNCQUFFLGNBQWMsQ0FBQyxJQUFJO0lBQ3ZCLGdCQUFBLE1BQU0sS0FBSyxHQUNULGFBQWEsQ0FBQyxJQUFJLENBQ2hCLENBQUMsQ0FBa0IsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLGdCQUFnQixDQUNuRCxJQUFJLEVBQUU7b0JBQ1QsSUFBSSxZQUFZLEdBQWEsRUFBRTtJQUMvQixnQkFBQSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO3dCQUN4QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFFLEdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDbEQsMEJBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNkLDBCQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVztJQUMzQixvQkFBQSxJQUFJLFdBQVc7SUFDYix3QkFBQSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXO0lBQ3RDLDhCQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUEsQ0FBRSxDQUFDLFdBQVcsRUFBRTtJQUM3Qyw4QkFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7SUFHbkMsZ0JBQUEsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBVSxLQUFTO3dCQUNqRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO0lBQzFELHdCQUFBLE9BQU8sU0FBUztJQUVsQixvQkFBQSxJQUFJO0lBQ0Ysd0JBQUEsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUM7SUFDeEMsNEJBQUEsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRXJDLHdCQUFBLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLO0lBQ3hCLDhCQUFFLEtBQUssQ0FBQyxTQUFTO0lBQ2pCLDhCQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxLQUFLO0lBQ2xDLGtDQUFFO3NDQUNBLCtCQUErQjs7Z0NBQzdCO0lBQ1Isd0JBQUEsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDO0lBQ3ZDLDRCQUFBLE9BQU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDOztJQUV6QyxpQkFBQztvQkFFRCxRQUFRLENBQUM7d0JBQ1AsS0FBSyxLQUFLLENBQUMsSUFBSTt3QkFDZixLQUFLLEdBQUcsQ0FBQyxJQUFJO0lBQ1gsd0JBQUEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO0lBQ3hCLDRCQUFBLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQ2hDLENBQUMsQ0FBa0IsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQ3REO2dDQUNELElBQUksT0FBTyxFQUFFO0lBQ1gsZ0NBQUEsR0FBRyxHQUFHLENBQ0osQ0FBQyxLQUFLLEtBQUssQ0FBQztJQUNWLHNDQUFHLEdBQTJCLENBQUMsSUFBSTtJQUNuQztJQUNHLHdDQUFBLEdBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBRTlDLHFDQUFBLEdBQUcsQ0FBQyxDQUFDLENBQWMsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzt5Q0FDekMsTUFBTSxDQUFDLENBQUMsQ0FBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQVE7SUFDakMsZ0NBQUEsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7O3dDQUVoQixHQUFHLEdBQUcsU0FBUzs7Ozs0QkFJckI7SUFDRixvQkFBQTtJQUNFLHdCQUFBLElBQUk7Z0NBQ0YsSUFBSyxHQUEyQixDQUFDLElBQUksQ0FBQztvQ0FDcEMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUcsR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOzs0QkFDMUMsT0FBTyxDQUFVLEVBQUU7SUFDbkIsNEJBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBLENBQUUsQ0FBQzs7OztnQkFJckUsSUFBSSxHQUFHLEVBQUU7SUFDUCxnQkFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUU7SUFDckIsZ0JBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQVU7Ozs7SUFLL0IsSUFBQSxPQUFPLE1BQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVM7SUFDOUQ7O0lDek1NLFNBQVUsV0FBVyxDQUFDLEdBQVcsRUFBQTtJQUNyQyxJQUFBLE9BQU9KLGlCQUFTLENBQUMsT0FBTyxHQUFHLEdBQUc7SUFDaEM7SUFFTSxTQUFVLFdBQVcsQ0FBa0IsS0FBUSxFQUFBO0lBQ25ELElBQUEsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDbEMsV0FBVyxDQUFDQSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxFQUM1QixLQUFLLENBQUMsV0FBVyxDQUNsQjtJQUNELElBQUEsSUFBSSxDQUFDLFFBQVE7WUFDWCxNQUFNLElBQUksS0FBSyxDQUNiLHVDQUF1QyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNqRTtJQUNILElBQUEsT0FBTyxRQUFRO0lBQ2pCOztJQ0lBLElBQUksb0JBQXNEO0lBQzFELElBQUksbUJBQXlDO0lBZ0I3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThDRztVQUNVLG9CQUFvQixDQUFBO1FBSS9CLFdBQ0UsQ0FBQSxZQUFBLEdBQXNELEtBQUssQ0FBQyxPQUFPLEVBQUE7WUFKN0QsSUFBSyxDQUFBLEtBQUEsR0FBd0MsRUFBRTtJQU1yRCxRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWTs7SUFHbEM7Ozs7Ozs7Ozs7SUFVRztRQUNILFFBQVEsQ0FBQyxXQUFnQyxFQUFFLElBQWEsRUFBQTtZQUN0RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVU7SUFDbkMsWUFBQSxNQUFNLElBQUksS0FBSyxDQUNiLDZEQUE2RCxDQUM5RDtJQUNILFFBQUEsSUFBSSxHQUFHLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSTtJQUMvQixRQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVzs7SUFHaEM7OztJQUdHO0lBQ0gsSUFBQSxHQUFHLENBQUMsSUFBWSxFQUFBO0lBQ2QsUUFBQSxJQUFJO0lBQ0YsWUFBQSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDOzs7WUFFdkIsT0FBTyxDQUFNLEVBQUU7SUFDZixZQUFBLE9BQU8sU0FBUzs7O0lBSXBCOzs7OztJQUtHO0lBQ0gsSUFBQSxLQUFLLENBQUMsR0FBQSxHQUEyQixFQUFFLEVBQUUsS0FBYyxFQUFBO1lBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUNuQyxZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUM7WUFDdkQsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVSxDQUFDO0lBQ25ELFFBQUEsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixrQkFBa0IsSUFBSSxDQUFBLGlDQUFBLENBQW1DLENBQzFEO1lBQ0gsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDOztJQUVuQztJQUVEOzs7Ozs7Ozs7SUFTRztJQUNhLFNBQUEsaUJBQWlCLENBQy9CLEdBQUcsTUFBMEUsRUFBQTtJQUU3RSxJQUFBLE1BQU0sQ0FBQyxPQUFPLENBQ1osQ0FBQyxDQUFpRSxLQUFJO0lBQ3BFLFFBQUEsTUFBTSxXQUFXLElBQ2YsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FDaEI7WUFDbkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUcsQ0FBb0IsQ0FBQyxJQUFJLENBQUM7SUFDekQsS0FBQyxDQUNGO0lBQ0g7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1Qkc7VUFDbUIsS0FBSyxDQUFBOztRQUl6QixXQUFzQixDQUFBLEdBQXFCO0lBRTNDOzs7Ozs7SUFNRztRQUNJLFNBQVMsQ0FBQyxHQUFHLFVBQWlCLEVBQUE7SUFDbkMsUUFBQSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUM7O0lBR3RDOzs7Ozs7O0lBT0c7SUFDSSxJQUFBLE1BQU0sQ0FBQyxHQUFRLEVBQUUsR0FBRyxVQUFvQixFQUFBO1lBQzdDLE9BQU9NLGtCQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQzs7SUFHMUM7Ozs7O0lBS0c7UUFDSCxTQUFTLEdBQUE7SUFDUCxRQUFBLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7O0lBRzlCOzs7Ozs7SUFNRztRQUNJLFFBQVEsR0FBQTtJQUNiLFFBQUEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzs7SUFHMUU7Ozs7O0lBS0c7UUFDSSxJQUFJLEdBQUE7SUFDVCxRQUFBLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O0lBR3pCOzs7Ozs7O0lBT0c7UUFDSCxPQUFPLFdBQVcsQ0FBQyxHQUFXLEVBQUE7SUFDNUIsUUFBQSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNsQyxLQUFLLENBQUMsR0FBRyxDQUFDTixpQkFBUyxDQUFDLGFBQWEsQ0FBQyxFQUNsQyxJQUFJLENBQUMsV0FBVyxDQUNqQjtJQUVELFFBQUEsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVU7SUFDakMsWUFBQSxPQUFPLGFBQWEsQ0FBQyxXQUFXLENBQzlCLEdBQUcsRUFDSCxRQUFRLENBQUMsVUFBVSxFQUNuQixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQ3pCO0lBQ0gsUUFBQSxPQUFPLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDOztJQUd2Qzs7Ozs7Ozs7SUFRRztJQUNILElBQUEsT0FBTyxVQUFVLENBQ2YsSUFBTyxFQUNQLEdBQTZCLEVBQUE7SUFFN0IsUUFBQSxJQUFJLENBQUMsR0FBRztnQkFBRSxHQUFHLEdBQUcsRUFBRTtZQUNsQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNDLElBQVksQ0FBQyxJQUFJLENBQUMsR0FBSSxHQUFXLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUzs7SUFFdkQsUUFBQSxPQUFPLElBQUk7O0lBR2I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBeUNHO0lBQ0gsSUFBQSxPQUFPLFNBQVMsQ0FBa0IsSUFBTyxFQUFFLEdBQTZCLEVBQUE7SUFDdEUsUUFBQSxJQUFJLENBQUMsR0FBRztnQkFBRSxHQUFHLEdBQUcsRUFBRTtZQUVsQixJQUFJLFVBQStCLEVBQUUsR0FBc0I7WUFFM0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFFdkMsUUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtnQkFDdkIsSUFBNEIsQ0FBQyxJQUFJLENBQUM7SUFDaEMsZ0JBQUEsR0FBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTO0lBQ2pELFlBQUEsSUFBSSxPQUFRLElBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRO29CQUFFO2dCQUM3QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQy9DLElBQUksS0FBSyxFQUFFO0lBQ1QsZ0JBQUEsSUFBSTt3QkFDRCxJQUE0QixDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQzlDLElBQTRCLENBQUMsSUFBSSxDQUFDLEVBQ25DLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUM5Qzs7b0JBQ0QsT0FBTyxDQUFNLEVBQUU7SUFDZixvQkFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7b0JBRWhCOztJQUdGLFlBQUEsTUFBTSxhQUFhLEdBQ2pCSyxxQkFBVSxDQUFDLHFCQUFxQixDQUM5QixjQUFjLENBQUMsT0FBTyxFQUN0QixJQUFJLEVBQ0osSUFBSSxDQUNMLENBQUMsVUFBVTtJQUNkLFlBQUEsVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQy9CLENBQUMsQ0FBb0IsS0FDbkIsQ0FBQ0wsaUJBQVMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUN4RTtJQUNELFlBQUEsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO0lBQ25DLGdCQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLElBQUksQ0FBQSxDQUFFLENBQUM7SUFDbkUsWUFBQSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBdUI7SUFDM0MsWUFBQSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ3RCLGtCQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJO3NCQUNmLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXO0lBQ25DLHNCQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUM7MEJBQ1YsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFDN0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQ0ksc0JBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FDbkQsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUNKO0lBRWIsWUFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFJO29CQUNsQixJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRTtJQUMxQyxvQkFBQSxJQUFJOzRCQUNGLFFBQVEsQ0FBQztJQUNQLDRCQUFBLEtBQUssT0FBTztJQUNaLDRCQUFBLEtBQUssS0FBSztJQUNSLGdDQUFBLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtJQUN4QixvQ0FBQSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQ3JDO3dDQUNELElBQUksT0FBTyxFQUFFOzRDQUNYLE1BQU0sU0FBUyxHQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBa0IsQ0FBQyxJQUFJLENBQ3RELENBQUMsQ0FBUyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDbEQ7NENBQ0QsSUFBSSxDQUFDLEtBQUssT0FBTztJQUNkLDRDQUFBLElBQTRCLENBQUMsSUFBSSxDQUFDLEdBQ2pDLElBQ0QsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFPLEtBQUk7b0RBQ3RCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dEQUMvQzswREFDRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxTQUFTOzBEQUN6QixFQUFFO0lBQ1IsNkNBQUMsQ0FBQztJQUNKLHdDQUFBLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtJQUNmLDRDQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFO2dEQUNuQixLQUFLLE1BQU0sQ0FBQyxJQUFLLElBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUU7b0RBQ25ELElBQ0UsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLG9EQUFBLFNBQVMsRUFDVDtJQUNBLG9EQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7O3lEQUMzQjtJQUNMLG9EQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7SUFHWCw0Q0FBQSxJQUE0QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Ozs7b0NBSTdDO0lBQ0YsNEJBQUE7b0NBQ0UsSUFBSyxJQUE0QixDQUFDLElBQUksQ0FBQztJQUNwQyxvQ0FBQSxJQUE0QixDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQzlDLElBQVksQ0FBQyxJQUFJLENBQUMsRUFDbkIsQ0FBQyxDQUNGOzs7d0JBRVAsT0FBTyxDQUFNLEVBQUU7SUFDZix3QkFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O0lBR3BCLGFBQUMsQ0FBQzs7SUFFSixRQUFBLE9BQU8sSUFBSTs7SUFHYjs7Ozs7O0lBTUc7UUFDSCxPQUFPLFVBQVUsQ0FBQyxPQUE4QixFQUFBO1lBQzlDLG9CQUFvQixHQUFHLE9BQU87O0lBR2hDOzs7OztJQUtHO0lBQ0gsSUFBQSxPQUFPLFVBQVUsR0FBQTtJQUNmLFFBQUEsT0FBTyxvQkFBb0I7O0lBRzdCOzs7Ozs7SUFNRztJQUNLLElBQUEsT0FBTyxXQUFXLEdBQUE7SUFDeEIsUUFBQSxJQUFJLENBQUMsbUJBQW1CO0lBQUUsWUFBQSxtQkFBbUIsR0FBRyxJQUFJLG9CQUFvQixFQUFFO0lBQzFFLFFBQUEsT0FBTyxtQkFBbUI7O0lBRzVCOzs7Ozs7SUFNRztRQUNILE9BQU8sV0FBVyxDQUFDLGFBQW1DLEVBQUE7WUFDcEQsbUJBQW1CLEdBQUcsYUFBYTs7SUFHckM7Ozs7Ozs7Ozs7SUFVRztJQUNILElBQUEsT0FBTyxRQUFRLENBQ2IsV0FBZ0MsRUFDaEMsSUFBYSxFQUFBO1lBRWIsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7O0lBR3hEOzs7Ozs7Ozs7SUFTRztRQUNILE9BQU8sR0FBRyxDQUFrQixJQUFZLEVBQUE7WUFDdEMsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzs7SUFHdEM7Ozs7Ozs7Ozs7O0lBV0c7SUFDSCxJQUFBLE9BQU8sS0FBSyxDQUNWLEdBQTJCLEdBQUEsRUFBRSxFQUM3QixLQUFjLEVBQUE7WUFFZCxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQzs7SUFHOUM7Ozs7Ozs7SUFPRztRQUNILE9BQU8sV0FBVyxDQUFrQixLQUFRLEVBQUE7SUFDMUMsUUFBQSxPQUFPLFdBQVcsQ0FBSSxLQUFLLENBQUM7O0lBRzlCOzs7Ozs7O0lBT0c7UUFDSCxPQUFPLGFBQWEsQ0FBa0IsS0FBeUIsRUFBQTtZQUM3RCxNQUFNLE1BQU0sR0FBYSxFQUFFO0lBQzNCLFFBQUEsSUFBSSxTQUFTLEdBQ1gsS0FBSyxZQUFZO0lBQ2YsY0FBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUs7SUFDN0IsY0FBRyxLQUFhLENBQUMsU0FBUztJQUM5QixRQUFBLE9BQU8sU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDeEIsTUFBTSxLQUFLLEdBQWEsU0FBUyxDQUFDSixpQkFBUyxDQUFDLFNBQVMsQ0FBQztnQkFDdEQsSUFBSSxLQUFLLEVBQUU7SUFDVCxnQkFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDOztJQUV2QixZQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQzs7SUFFOUMsUUFBQSxPQUFPLE1BQU07O0lBR2Y7Ozs7Ozs7OztJQVNHO1FBQ0gsT0FBTyxNQUFNLENBQWtCLElBQU8sRUFBRSxJQUFPLEVBQUUsR0FBRyxVQUFpQixFQUFBO1lBQ25FLE9BQU9NLGtCQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQzs7SUFHM0M7Ozs7Ozs7O0lBUUc7SUFDSCxJQUFBLE9BQU8sU0FBUyxDQUFrQixLQUFRLEVBQUUsR0FBRyxhQUF1QixFQUFBO0lBQ3BFLFFBQUEsT0FBTyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsYUFBYSxDQUFDOztJQUcxQzs7Ozs7OztJQU9HO1FBQ0gsT0FBTyxTQUFTLENBQWtCLEtBQVEsRUFBQTtJQUN4QyxRQUFBLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQ2xDLEtBQUssQ0FBQyxHQUFHLENBQUNOLGlCQUFTLENBQUMsYUFBYSxDQUFDLEVBQ2xDLEtBQUssQ0FBQyxXQUFXLENBQ2xCO0lBRUQsUUFBQSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVTtJQUNqQyxZQUFBLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FDNUIsSUFBSSxFQUNKLFFBQVEsQ0FBQyxVQUFVLEVBQ25CLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FDekI7SUFDSCxRQUFBLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7O0lBR3ZDOzs7Ozs7O0lBT0c7UUFDSCxPQUFPLElBQUksQ0FBa0IsS0FBUSxFQUFBO0lBQ25DLFFBQUEsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQ0EsaUJBQVMsQ0FBQyxPQUFPLENBQUMsRUFDNUIsS0FBSyxDQUFDLFdBQVcsQ0FDbEI7SUFFRCxRQUFBLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTO0lBQ2hDLFlBQUEsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxRQUFBLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O0lBRTVCOzs7Ozs7SUFNRztRQUNILE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBQTtJQUNwQixRQUFBLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQzs7SUFHekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBb0JHO1FBQ0gsT0FBTyxPQUFPLENBQUMsTUFBMkIsRUFBQTtJQUN4QyxRQUFBLElBQUk7SUFDRixZQUFBLE9BQU8sTUFBTSxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFhLENBQUM7OztZQUVwRSxPQUFPLENBQU0sRUFBRTtJQUNmLFlBQUEsT0FBTyxLQUFLOzs7SUFJaEI7Ozs7Ozs7Ozs7SUFVRztJQUNILElBQUEsT0FBTyxlQUFlLENBQ3BCLE1BQVMsRUFDVCxTQUFpQixFQUFBO1lBRWpCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBRSxNQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQUUsWUFBQSxPQUFPLElBQUk7SUFDMUUsUUFBQSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDQSxpQkFBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO0lBQ3ZFLFFBQUEsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLFNBQVM7O0lBRTlEOztBQ3JyQk0sVUFBTSwwQkFBMEIsR0FBRztJQUUxQzs7Ozs7Ozs7Ozs7O0lBWUc7VUFDVSxjQUFjLENBQUE7SUFDekIsSUFBQSxXQUFBLEdBQUE7SUFDQTs7Ozs7OztJQU9HO0lBQ08sSUFBQSxZQUFZLENBQUMsS0FBUSxFQUFBOztZQUU3QixNQUFNLFdBQVcsR0FBd0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDO0lBQ2pFLFFBQUEsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUNuQyxRQUFBLFdBQVcsQ0FBQ0EsaUJBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJO0lBQ2xFLFFBQUEsT0FBTyxXQUFXOztJQUdwQjs7Ozs7SUFLRztJQUNILElBQUEsV0FBVyxDQUFDLEdBQVcsRUFBQTtZQUNyQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUN2QyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUNBLGlCQUFTLENBQUMsTUFBTSxDQUFDO0lBQ25ELFFBQUEsSUFBSSxDQUFDLFNBQVM7SUFDWixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUM7WUFDdkUsTUFBTSxLQUFLLEdBQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFpQjtJQUN4RSxRQUFBLE9BQU8sS0FBSzs7SUFHZDs7Ozs7SUFLRztJQUNILElBQUEsU0FBUyxDQUFDLEtBQVEsRUFBQTtZQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFFbEQ7VUFFWSxhQUFhLENBQUE7aUJBQ1QsSUFBTyxDQUFBLE9BQUEsR0FBVywwQkFBMEIsQ0FBQztJQUU3QyxJQUFBLFNBQUEsSUFBQSxDQUFBLEtBQUssR0FBb0M7WUFDdEQsSUFBSSxFQUFFLElBQUksY0FBYyxFQUFFO1NBQzNCLENBQUM7SUFFRixJQUFBLFdBQUEsR0FBQTtRQUVRLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBQTtJQUM1QixRQUFBLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLO0lBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQzdDLFFBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsR0FBRyxDQUFBLENBQUUsQ0FBQzs7UUFHcEUsT0FBTyxRQUFRLENBQ2IsR0FBVyxFQUNYLElBQWtDLEVBQ2xDLFVBQVUsR0FBRyxLQUFLLEVBQUE7SUFFbEIsUUFBQSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSztJQUNuQixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEdBQUcsQ0FBQSxtQkFBQSxDQUFxQixDQUFDO1lBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDNUIsUUFBQSxJQUFJLFVBQVU7SUFBRSxZQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRzs7UUFHcEMsT0FBTyxTQUFTLENBQUMsR0FBUSxFQUFFLE1BQWUsRUFBRSxHQUFHLElBQVcsRUFBQTtJQUN4RCxRQUFBLElBQUksQ0FBQyxNQUFNO0lBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDbEUsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzs7UUFHakQsT0FBTyxXQUFXLENBQUMsR0FBVyxFQUFFLE1BQWUsRUFBRSxHQUFHLElBQVcsRUFBQTtJQUM3RCxRQUFBLElBQUksQ0FBQyxNQUFNO0lBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDcEUsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzs7UUFHbkQsT0FBTyxVQUFVLENBQUMsTUFBYyxFQUFBO1lBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Ozs7SUM5Rm5DOzs7Ozs7Ozs7SUFTRztJQUNhLFNBQUEsU0FBUyxDQUFzQixHQUFHLElBQWMsRUFBQTtJQUM5RCxJQUFBLE9BQU9DLGdCQUFLLEVBQ1QsQ0FBQyxRQUF3QixLQUFJO0lBQzVCLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQVMsS0FBSTtnQkFDekIsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUNsQixnQkFBQSxTQUFTLEVBQUUsUUFBUTtJQUNuQixnQkFBQSxhQUFhLEVBQUUsQ0FBQztJQUNoQixnQkFBQSxJQUFJLEVBQUUsSUFBSTtJQUNZLGFBQUEsQ0FBQztJQUMzQixTQUFDLENBQUM7SUFDRixRQUFBLE9BQU8sUUFBUTtJQUNqQixLQUFDLEdBQ0RDLG1CQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQ3pEO0lBQ0g7O0lDMUJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNDRztBQUVVSyx5QkFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxTQUErQixDQUFBO1FBQ2hFLFdBQVksQ0FBQSxPQUFBLEdBQWtCLHNCQUFzQixDQUFDLElBQUksRUFBQTtJQUN2RCxRQUFBLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7O0lBR3JEOzs7Ozs7Ozs7Ozs7OztJQWNHO0lBQ0ksSUFBQSxTQUFTLENBQ2QsS0FBb0IsRUFDcEIsT0FBQSxHQUFnQyxFQUFFLEVBQUE7WUFFbEMsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRTtZQUV6QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFBRSxZQUFBLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7WUFFdEQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLFlBQUEsTUFBTSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPO2dCQUNoQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7Ozs7QUE5QnhDQSx5QkFBYSxHQUFBQyxnQkFBQSxDQUFBO0lBRHpCLElBQUEsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7O0lBQ2xCLENBQUEsRUFBQUQscUJBQWEsQ0FpQ3pCOztJQ3ZFRDs7Ozs7Ozs7O0lBU0c7QUFFVUUseUJBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsU0FBK0IsQ0FBQTtRQUNoRSxXQUFZLENBQUEsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUE7WUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQzs7SUFHaEI7Ozs7Ozs7Ozs7O0lBV0c7SUFDSSxJQUFBLFNBQVMsQ0FDZCxLQUFVLEVBQ1YsT0FBNkIsRUFDN0IsUUFBd0IsRUFBQTtJQUV4QixRQUFBLElBQUksdUJBQTRCO0lBQ2hDLFFBQUEsSUFBSTtJQUNGLFlBQUEsdUJBQXVCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUNqRCxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUM3Qjs7WUFDRCxPQUFPLENBQU0sRUFBRTtJQUNmLFlBQUEsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQzs7SUFHbkQsUUFBQSxPQUFPSCxrQkFBTyxDQUFDLEtBQUssRUFBRSx1QkFBdUI7SUFDM0MsY0FBRSxJQUFJLENBQUMsVUFBVSxDQUNiLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFDL0IsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7a0JBRTlCLFNBQVM7OztBQXBDSkcseUJBQWEsR0FBQUQsZ0JBQUEsQ0FBQTtJQUR6QixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDOztJQUNsQixDQUFBLEVBQUFDLHFCQUFhLENBc0N6Qjs7SUNuREQ7Ozs7Ozs7OztJQVNHO1VBQ1UsWUFBWSxHQUFXLElBQUksTUFBTSxDQUFDLG9CQUFvQjtJQUVuRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBeURHO0FBRVVDLDRCQUFnQixHQUF0QixNQUFNLGdCQUFpQixTQUFRLFNBQWtDLENBQUE7UUFDdEUsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMsT0FBTyxFQUFBO0lBQzFELFFBQUEsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7O0lBRzFCOzs7Ozs7OztJQVFHO0lBQ0ssSUFBQSxVQUFVLENBQUMsT0FBZSxFQUFBO0lBQ2hDLFFBQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQUUsWUFBQSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMzRCxNQUFNLEtBQUssR0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztJQUM5QyxRQUFBLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFHdkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUJHO1FBQ0ksU0FBUyxDQUNkLEtBQWEsRUFDYixPQUFnQyxFQUFBO0lBRWhDLFFBQUEsSUFBSSxDQUFDLEtBQUs7Z0JBQUU7SUFFWixRQUFBLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPO0lBQ3pCLFFBQUEsSUFBSSxDQUFDLE9BQU87SUFBRSxZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsUUFBQSxPQUFPLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTztJQUMxRSxRQUFBLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLFFBQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSztJQUN4QixjQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTztrQkFDL0MsU0FBUzs7O0FBbERKQSw0QkFBZ0IsR0FBQUYsZ0JBQUEsQ0FBQTtJQUQ1QixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDOztJQUNyQixDQUFBLEVBQUFFLHdCQUFnQixDQW9ENUI7O0lDdkhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNDRztBQUVVQywwQkFBYyxHQUFwQixNQUFNLGNBQWUsU0FBUUQsd0JBQWdCLENBQUE7UUFDbEQsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMsS0FBSyxFQUFBO1lBQ3hELEtBQUssQ0FBQyxPQUFPLENBQUM7O0lBR2hCOzs7Ozs7Ozs7Ozs7OztJQWNHO0lBQ2EsSUFBQSxTQUFTLENBQ3ZCLEtBQWEsRUFDYixPQUFBLEdBQW1DLEVBQUUsRUFBQTtJQUVyQyxRQUFBLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7SUFDNUIsWUFBQSxHQUFHLE9BQU87SUFDVixZQUFBLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPO0lBQ3hDLFlBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsS0FBSztJQUNwRCxTQUFBLENBQUM7OztBQTVCT0MsMEJBQWMsR0FBQUgsZ0JBQUEsQ0FBQTtJQUQxQixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDOztJQUNuQixDQUFBLEVBQUFHLHNCQUFjLENBOEIxQjs7SUN4RUQ7Ozs7Ozs7OztJQVNHO0FBRVVDLDJCQUFlLEdBQXJCLE1BQU0sZUFBZ0IsU0FBUSxTQUFpQyxDQUFBO1FBQ3BFLFdBQVksQ0FBQSxPQUFBLEdBQWtCLHNCQUFzQixDQUFDLE1BQU0sRUFBQTtZQUN6RCxLQUFLLENBQUMsT0FBTyxDQUFDOztJQUdoQjs7Ozs7Ozs7Ozs7SUFXRztJQUNJLElBQUEsU0FBUyxDQUNkLEtBQVUsRUFDVixPQUErQixFQUMvQixRQUF3QixFQUFBO0lBRXhCLFFBQUEsSUFBSSx1QkFBNEI7SUFDaEMsUUFBQSxJQUFJO0lBQ0YsWUFBQSx1QkFBdUIsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQ2pELE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQy9COztZQUNELE9BQU8sQ0FBTSxFQUFFO0lBQ2YsWUFBQSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDOztJQUduRCxRQUFBLE9BQU9OLGtCQUFPLENBQUMsS0FBSyxFQUFFLHVCQUF1QjtJQUMzQyxjQUFFO2tCQUNBLElBQUksQ0FBQyxVQUFVLENBQ2IsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUMvQixPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUMvQjs7O0FBcENJTSwyQkFBZSxHQUFBSixnQkFBQSxDQUFBO0lBRDNCLElBQUEsU0FBUyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7O0lBQ3BCLENBQUEsRUFBQUksdUJBQWUsQ0FzQzNCO0lBRUQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUMzREE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBRUEsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFjLEtBQVk7UUFDN0MsSUFBSSxLQUFLLEtBQUssSUFBSTtJQUFFLFFBQUEsT0FBTyxNQUFNO1FBQ2pDLElBQUksS0FBSyxZQUFZLElBQUk7SUFBRSxRQUFBLE9BQU8sTUFBTTtJQUN4QyxJQUFBLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFBRSxRQUFBLE9BQU8sS0FBSztRQUNyQyxJQUFJLEtBQUssS0FBSyxRQUFRO0lBQUUsUUFBQSxPQUFPLFVBQVU7UUFDekMsSUFBSSxLQUFLLEtBQUssQ0FBQyxRQUFRO0lBQUUsUUFBQSxPQUFPLFdBQVc7SUFDM0MsSUFBQSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQUUsUUFBQSxPQUFPLE9BQU87UUFDeEMsT0FBTyxPQUFPLEtBQUs7SUFDckIsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLENBQ2xCLEtBQWMsS0FDaUM7SUFDL0MsSUFBQSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxZQUFZLElBQUk7SUFBRSxRQUFBLE9BQU8sSUFBSTtRQUU3RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7SUFBRSxRQUFBLE9BQU8sSUFBSTs7UUFHMUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO0lBQUUsUUFBQSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBRTVELElBQUEsT0FBTyxLQUFLO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7SUFZRztJQUNhLFNBQUEsNEJBQTRCLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBQTtRQUN6RCxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQUUsUUFBQSxPQUFPLElBQUk7UUFFakQsTUFBTSxJQUFJLFNBQVMsQ0FDakIsRUFBRSxDQUNBLHlCQUF5QixDQUFDLDRCQUE0QixFQUN0RCxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ2QsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQ0Y7SUFDSDtJQUVBOzs7Ozs7Ozs7Ozs7SUFZRztJQUNhLFNBQUEsVUFBVSxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUE7UUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoRSxRQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsNEJBQTRCLENBQUM7O0lBR3pFLElBQUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0lBQ3RCLElBQUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0lBRXRCLElBQUEsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFOztJQUVuQixRQUFBLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssUUFBUTtJQUMxQyxZQUFBLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFJLENBQVk7SUFDbEMsUUFBQSxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVE7SUFDMUMsWUFBQSxPQUFRLENBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLFFBQUEsTUFBTSxJQUFJLFNBQVMsQ0FDakIsRUFBRSxDQUFDLHlCQUF5QixDQUFDLHdCQUF3QixFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FDckU7O1FBR0gsSUFDRSxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVE7YUFDeEMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQzFDO0lBQ0EsUUFBQSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEMsWUFBQSxNQUFNLElBQUksU0FBUyxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQztZQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDOztRQUdkLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFO0lBQzFDLFFBQUEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMxQyxZQUFBLE1BQU0sSUFBSSxTQUFTLENBQUMseUJBQXlCLENBQUMsdUJBQXVCLENBQUM7WUFDeEUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRTs7UUFHbEMsTUFBTSxJQUFJLFNBQVMsQ0FDakIsRUFBRSxDQUNBLHlCQUF5QixDQUFDLDRCQUE0QixFQUN0RCxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ2QsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQ0Y7SUFDSDtJQUVBOzs7Ozs7Ozs7Ozs7SUFZRztJQUNhLFNBQUEsYUFBYSxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUE7UUFDMUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoRSxRQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsNEJBQTRCLENBQUM7SUFFekUsSUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7SUFDdEIsSUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7SUFFdEIsSUFBQSxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUU7O0lBRW5CLFFBQUEsSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRO0lBQzFDLFlBQUEsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUksQ0FBWTtJQUNsQyxRQUFBLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssUUFBUTtJQUMxQyxZQUFBLE9BQVEsQ0FBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEMsUUFBQSxNQUFNLElBQUksS0FBSyxDQUNiLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQ3JFOztRQUdILElBQ0UsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRO2FBQ3hDLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsQ0FBQyxFQUMxQztJQUNBLFFBQUEsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLFlBQUEsTUFBTSxJQUFJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUM7WUFDL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7UUFHZCxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRTtJQUMxQyxRQUFBLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsWUFBQSxNQUFNLElBQUksU0FBUyxDQUFDLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDO1lBQ3hFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUU7O1FBR2xDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLEVBQUUsQ0FDQSx5QkFBeUIsQ0FBQyw0QkFBNEIsRUFDdEQsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUNkLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUNGO0lBQ0g7O0lDNU5BOzs7Ozs7Ozs7SUFTRztBQUVVQyxnQ0FBb0IsR0FBMUIsTUFBTSxvQkFBcUIsU0FBUSxTQUFzQyxDQUFBO1FBQzlFLFdBQVksQ0FBQSxPQUFBLEdBQWtCLHNCQUFzQixDQUFDLFlBQVksRUFBQTtZQUMvRCxLQUFLLENBQUMsT0FBTyxDQUFDOztJQUdoQjs7Ozs7Ozs7Ozs7SUFXRztJQUNJLElBQUEsU0FBUyxDQUNkLEtBQVUsRUFDVixPQUFvQyxFQUNwQyxRQUF3QixFQUFBO0lBRXhCLFFBQUEsSUFBSSx1QkFBNEI7SUFDaEMsUUFBQSxJQUFJO0lBQ0YsWUFBQSx1QkFBdUIsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQ2pELE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQ3JDOztZQUNELE9BQU8sQ0FBTSxFQUFFO0lBQ2YsWUFBQSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDOztJQUduRCxRQUFBLElBQUk7SUFDRixZQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDO29CQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQzs7WUFDbEQsT0FBTyxDQUFNLEVBQUU7SUFDZixZQUFBLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7O0lBR3pFLFFBQUEsT0FBTyxTQUFTOzs7QUF0Q1BBLGdDQUFvQixHQUFBTCxnQkFBQSxDQUFBO0lBRGhDLElBQUEsU0FBUyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7O0lBQzFCLENBQUEsRUFBQUssNEJBQW9CLENBd0NoQzs7SUNsREQ7Ozs7Ozs7OztJQVNHO0FBRVVDLHVDQUEyQixHQUFqQyxNQUFNLDJCQUE0QixTQUFRLFNBQTZDLENBQUE7UUFDNUYsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMscUJBQXFCLEVBQUE7WUFDeEUsS0FBSyxDQUFDLE9BQU8sQ0FBQzs7SUFHaEI7Ozs7Ozs7Ozs7O0lBV0c7SUFDSSxJQUFBLFNBQVMsQ0FDZCxLQUFVLEVBQ1YsT0FBMkMsRUFDM0MsUUFBd0IsRUFBQTtJQUV4QixRQUFBLElBQUksdUJBQTRCO0lBQ2hDLFFBQUEsSUFBSTtJQUNGLFlBQUEsdUJBQXVCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUNqRCxPQUFPLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQzlDOztZQUNELE9BQU8sQ0FBTSxFQUFFO0lBQ2YsWUFBQSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDOztJQUduRCxRQUFBLElBQUk7SUFDRixZQUFBLElBQ0UsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUM7SUFDM0QsZ0JBQUFSLGtCQUFPLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDO0lBQ3pDLGdCQUFBLGFBQWEsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUM7SUFFN0MsZ0JBQUEsT0FBTyxTQUFTO2dCQUVsQixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQzs7WUFDaEQsT0FBTyxDQUFNLEVBQUU7SUFDZixZQUFBLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FDcEIsQ0FBQyxDQUFDLE9BQU8sRUFDVCxPQUFPLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQzlDOzs7O0FBNUNNUSx1Q0FBMkIsR0FBQU4sZ0JBQUEsQ0FBQTtJQUR2QyxJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUM7O0lBQ25DLENBQUEsRUFBQU0sbUNBQTJCLENBK0N2Qzs7SUMzREQ7Ozs7Ozs7OztJQVNHO0FBRVVDLDZCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLFNBQW1DLENBQUE7UUFDeEUsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMsU0FBUyxFQUFBO1lBQzVELEtBQUssQ0FBQyxPQUFPLENBQUM7O0lBR2hCOzs7Ozs7Ozs7OztJQVdHO0lBQ0ksSUFBQSxTQUFTLENBQ2QsS0FBVSxFQUNWLE9BQWlDLEVBQ2pDLFFBQW1CLEVBQUE7SUFFbkIsUUFBQSxJQUFJLHVCQUE0QjtJQUNoQyxRQUFBLElBQUk7SUFDRixZQUFBLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDakQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FDbEM7O1lBQ0QsT0FBTyxDQUFNLEVBQUU7SUFDZixZQUFBLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7O0lBR25ELFFBQUEsSUFBSTtJQUNGLFlBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUM7b0JBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDOztZQUNsRCxPQUFPLENBQU0sRUFBRTtJQUNmLFlBQUEsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7SUFHdEUsUUFBQSxPQUFPLFNBQVM7OztBQXRDUEEsNkJBQWlCLEdBQUFQLGdCQUFBLENBQUE7SUFEN0IsSUFBQSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQzs7SUFDdkIsQ0FBQSxFQUFBTyx5QkFBaUIsQ0F3QzdCOztJQ2xERDs7Ozs7Ozs7O0lBU0c7QUFFVUMsb0NBQXdCLEdBQTlCLE1BQU0sd0JBQXlCLFNBQVEsU0FBMEMsQ0FBQTtRQUN0RixXQUFZLENBQUEsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBQTtZQUNyRSxLQUFLLENBQUMsT0FBTyxDQUFDOztJQUdoQjs7Ozs7Ozs7Ozs7SUFXRztJQUNJLElBQUEsU0FBUyxDQUNkLEtBQVUsRUFDVixPQUF3QyxFQUN4QyxRQUFtQixFQUFBO0lBRW5CLFFBQUEsSUFBSSx1QkFBNEI7SUFDaEMsUUFBQSxJQUFJO0lBQ0YsWUFBQSx1QkFBdUIsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQ2pELE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FDM0M7O1lBQ0QsT0FBTyxDQUFNLEVBQUU7SUFDZixZQUFBLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7O0lBR25ELFFBQUEsSUFBSTtJQUNGLFlBQUEsSUFDRSxDQUFDLDRCQUE0QixDQUFDLEtBQUssRUFBRSx1QkFBdUIsQ0FBQztJQUMzRCxnQkFBQVYsa0JBQU8sQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUM7SUFDekMsZ0JBQUEsVUFBVSxDQUFDLEtBQUssRUFBRSx1QkFBdUIsQ0FBQztJQUUxQyxnQkFBQSxPQUFPLFNBQVM7Z0JBRWxCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDOztZQUNoRCxPQUFPLENBQU0sRUFBRTtJQUNmLFlBQUEsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixDQUFDLENBQUMsT0FBTyxFQUNULE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FDM0M7Ozs7QUE1Q01VLG9DQUF3QixHQUFBUixnQkFBQSxDQUFBO0lBRHBDLElBQUEsU0FBUyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQzs7SUFDaEMsQ0FBQSxFQUFBUSxnQ0FBd0IsQ0ErQ3BDOztJQzdERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE0Q0c7QUFFVUMseUJBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsU0FBK0IsQ0FBQTtRQUNoRSxXQUFZLENBQUEsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUE7WUFDdkQsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7O0lBR3RDOzs7Ozs7Ozs7Ozs7OztJQWNHO1FBQ0gsU0FBUyxDQUNQLEtBQXVCLEVBQ3ZCLE9BQTZCLEVBQUE7WUFFN0IsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQUU7WUFFcEUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSztrQkFDckMsT0FBTyxDQUFDO0lBQ1YsY0FBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDbkIsUUFBQSxJQUFJLEdBQVEsRUFDVixPQUFPLEdBQUcsSUFBSTtJQUNoQixRQUFBLEtBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNULENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUN0RCxDQUFDLEVBQUUsRUFDSDtJQUNBLFlBQUEsR0FBRyxHQUFJLEtBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLFFBQVEsT0FBTyxHQUFHO0lBQ2hCLGdCQUFBLEtBQUssUUFBUTtJQUNiLGdCQUFBLEtBQUssVUFBVTt3QkFDYixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBRSxHQUFjLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzt3QkFDM0Q7SUFDRixnQkFBQTtJQUNFLG9CQUFBLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxLQUFLLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDbkU7OztJQUlOLFFBQUEsT0FBTztJQUNMLGNBQUU7SUFDRixjQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQzs7O0FBbERsREEseUJBQWEsR0FBQVQsZ0JBQUEsQ0FBQTtJQUR6QixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDOztJQUNsQixDQUFBLEVBQUFTLHFCQUFhLENBb0R6Qjs7SUNsR0Q7Ozs7Ozs7Ozs7SUFVRztBQUVVQyw4QkFBa0IsR0FBeEIsTUFBTSxrQkFBbUIsU0FBUSxTQUFvQyxDQUFBO1FBQzFFLFdBQVksQ0FBQSxPQUFBLEdBQWtCLHNCQUFzQixDQUFDLFVBQVUsRUFBQTtZQUM3RCxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQzs7SUFHekM7Ozs7Ozs7Ozs7O0lBV0c7UUFDSSxTQUFTLENBQ2QsS0FBcUIsRUFDckIsT0FBa0MsRUFBQTtZQUVsQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVc7Z0JBQUU7SUFDbEMsUUFBQSxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQzVCLGNBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVM7a0JBQ2xFLFNBQVM7OztBQXhCSkEsOEJBQWtCLEdBQUFWLGdCQUFBLENBQUE7SUFEOUIsSUFBQSxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQzs7SUFDeEIsQ0FBQSxFQUFBVSwwQkFBa0IsQ0EwQjlCOztJQ3RDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBbURHO0FBRVVDLHdCQUFZLEdBQWxCLE1BQU0sWUFBYSxTQUFRLFNBQThCLENBQUE7UUFDOUQsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMsR0FBRyxFQUFBO1lBQ3RELEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7O0lBRzVDOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztRQUNJLFNBQVMsQ0FDZCxLQUE2QixFQUM3QixPQUE0QixFQUFBO1lBRTVCLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVztnQkFBRTtJQUVsQyxRQUFBLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPO1lBQ3JCLElBQUksS0FBSyxZQUFZLElBQUksSUFBSSxFQUFFLEdBQUcsWUFBWSxJQUFJLENBQUMsRUFBRTtJQUNuRCxZQUFBLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ25CLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsZ0JBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQzs7WUFHaEQsT0FBTyxLQUFLLEdBQUc7SUFDYixjQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUc7a0JBQ3BELFNBQVM7OztBQXBDSkEsd0JBQVksR0FBQVgsZ0JBQUEsQ0FBQTtJQUR4QixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDOztJQUNqQixDQUFBLEVBQUFXLG9CQUFZLENBc0N4Qjs7SUMzRkQ7Ozs7Ozs7Ozs7SUFVRztBQUVVQyw4QkFBa0IsR0FBeEIsTUFBTSxrQkFBbUIsU0FBUSxTQUFvQyxDQUFBO1FBQzFFLFdBQVksQ0FBQSxPQUFBLEdBQWtCLHNCQUFzQixDQUFDLFVBQVUsRUFBQTtZQUM3RCxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQzs7SUFHekM7Ozs7Ozs7Ozs7O0lBV0c7UUFDSSxTQUFTLENBQ2QsS0FBcUIsRUFDckIsT0FBa0MsRUFBQTtZQUVsQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVc7Z0JBQUU7SUFDbEMsUUFBQSxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQzVCLGNBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVM7a0JBQ2xFLFNBQVM7OztBQXhCSkEsOEJBQWtCLEdBQUFaLGdCQUFBLENBQUE7SUFEOUIsSUFBQSxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQzs7SUFDeEIsQ0FBQSxFQUFBWSwwQkFBa0IsQ0EwQjlCOztJQ3RDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBbURHO0FBRVVDLHdCQUFZLEdBQWxCLE1BQU0sWUFBYSxTQUFRLFNBQThCLENBQUE7UUFDOUQsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMsR0FBRyxFQUFBO1lBQ3RELEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7O0lBRzVDOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztRQUNJLFNBQVMsQ0FDZCxLQUE2QixFQUM3QixPQUE0QixFQUFBO1lBRTVCLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVztnQkFBRTtJQUVsQyxRQUFBLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPO1lBQ3JCLElBQUksS0FBSyxZQUFZLElBQUksSUFBSSxFQUFFLEdBQUcsWUFBWSxJQUFJLENBQUMsRUFBRTtJQUNuRCxZQUFBLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ25CLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsZ0JBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQzs7WUFFaEQsT0FBTyxLQUFLLEdBQUc7SUFDYixjQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUc7a0JBQ3BELFNBQVM7OztBQW5DSkEsd0JBQVksR0FBQWIsZ0JBQUEsQ0FBQTtJQUR4QixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDOztJQUNqQixDQUFBLEVBQUFhLG9CQUFZLENBcUN4Qjs7SUN0RkQ7Ozs7Ozs7OztJQVNHO0FBRVVDLDZCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRWix3QkFBZ0IsQ0FBQTtJQUNyRCxJQUFBLFdBQUEsQ0FBWSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxFQUFBO1lBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUM7O0lBR2hCOzs7Ozs7Ozs7OztJQVdHO0lBQ2EsSUFBQSxTQUFTLENBQ3ZCLEtBQWEsRUFDYixPQUFBLEdBQW1DLEVBQUUsRUFBQTtJQUVyQyxRQUFBLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7SUFDNUIsWUFBQSxHQUFHLE9BQU87SUFDVixZQUFBLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPO0lBQ3hDLFlBQUEsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUNyQixPQUFPLEVBQUUsT0FBTyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7SUFDbEUsU0FBQSxDQUFDOzs7QUExQk9ZLDZCQUFpQixHQUFBZCxnQkFBQSxDQUFBO0lBRDdCLElBQUEsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7O0lBQ3RCLENBQUEsRUFBQWMseUJBQWlCLENBNEI3Qjs7SUMzQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW1ERztBQUVVQyw2QkFBaUIsR0FBdkIsTUFBTSxpQkFBa0IsU0FBUSxTQUFTLENBQUE7UUFDOUMsV0FBWSxDQUFBLE9BQUEsR0FBa0Isc0JBQXNCLENBQUMsUUFBUSxFQUFBO1lBQzNELEtBQUssQ0FBQyxPQUFPLENBQUM7O0lBR2hCOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztJQUNJLElBQUEsU0FBUyxDQUNkLEtBQVUsRUFDVixPQUFBLEdBQTRCLEVBQUUsRUFBQTtZQUU5QixRQUFRLE9BQU8sS0FBSztJQUNsQixZQUFBLEtBQUssU0FBUztJQUNkLFlBQUEsS0FBSyxRQUFRO29CQUNYLE9BQU8sT0FBTyxLQUFLLEtBQUs7SUFDdEIsc0JBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPOzBCQUMvQyxTQUFTO0lBQ2YsWUFBQTtJQUNFLGdCQUFBLE9BQU8sQ0FBQztJQUNOLHNCQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTzswQkFDL0MsU0FBUzs7OztBQWxDUkEsNkJBQWlCLEdBQUFmLGdCQUFBLENBQUE7SUFEN0IsSUFBQSxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQzs7SUFDdEIsQ0FBQSxFQUFBZSx5QkFBaUIsQ0FxQzdCOztJQzFGRDs7Ozs7Ozs7O0lBU0c7QUFFVUMseUJBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsU0FBK0IsQ0FBQTtRQUNoRSxXQUFZLENBQUEsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUE7SUFDdkQsUUFBQSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7O0lBR3BDOzs7Ozs7Ozs7Ozs7SUFZRztRQUNJLFNBQVMsQ0FDZCxLQUFzQixFQUN0QixPQUE2QixFQUFBO1lBRTdCLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVztnQkFBRTtJQUNsQyxRQUFBLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUs7SUFDOUMsY0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSTtrQkFDN0QsU0FBUzs7O0FBekJKQSx5QkFBYSxHQUFBaEIsZ0JBQUEsQ0FBQTtJQUR6QixJQUFBLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDOztJQUNsQixDQUFBLEVBQUFnQixxQkFBYSxDQTJCekI7O0lDbkNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF5REc7QUFFVUMseUJBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsU0FBK0IsQ0FBQTtRQUNoRSxXQUFZLENBQUEsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUE7WUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQzs7SUFHaEI7Ozs7Ozs7Ozs7Ozs7O0lBY0c7UUFDSSxTQUFTLENBQ2QsS0FBVSxFQUNWLE9BQTZCLEVBQUE7WUFFN0IsSUFBSSxLQUFLLEtBQUssU0FBUztJQUFFLFlBQUEsT0FBTztJQUNoQyxRQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTztZQUNsQyxJQUFJLENBQUNwQixxQkFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7SUFDL0MsWUFBQSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQ3BCLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUN2QixPQUFPLEtBQUssS0FBSztJQUNmLGtCQUFFO0lBQ0Ysa0JBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLO0lBQ25CLHNCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSTswQkFDZixLQUFLLENBQUMsSUFBSSxFQUNoQixPQUFPLEtBQUssQ0FDYjs7O0FBbkNNb0IseUJBQWEsR0FBQWpCLGdCQUFBLENBQUE7SUFEekIsSUFBQSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzs7SUFDbEIsQ0FBQSxFQUFBaUIscUJBQWEsQ0FxQ3pCO0lBRUQ7Ozs7Ozs7SUFPRztJQUNILFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDbEIsSUFBQSxTQUFTLEVBQUVBLHFCQUFhO1FBQ3hCLGFBQWEsRUFBRXpCLGlCQUFTLENBQUMsSUFBSTtJQUM3QixJQUFBLElBQUksRUFBRSxLQUFLO0lBQ1csQ0FBQSxDQUFDOztJQzdHekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXVDRztBQUVVMEIsd0JBQVksR0FBbEIsTUFBTSxZQUFhLFNBQVFoQix3QkFBZ0IsQ0FBQTtRQUNoRCxXQUFZLENBQUEsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxHQUFHLEVBQUE7WUFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQzs7SUFHaEI7Ozs7Ozs7Ozs7Ozs7O0lBY0c7SUFDYSxJQUFBLFNBQVMsQ0FDdkIsS0FBYSxFQUNiLE9BQUEsR0FBbUMsRUFBRSxFQUFBO0lBRXJDLFFBQUEsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtJQUM1QixZQUFBLEdBQUcsT0FBTztJQUNWLFlBQUEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU87SUFDeEMsWUFBQSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHO0lBQ2pELFNBQUEsQ0FBQzs7O0FBNUJPZ0Isd0JBQVksR0FBQWxCLGdCQUFBLENBQUE7SUFEeEIsSUFBQSxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQzs7SUFDakIsQ0FBQSxFQUFBa0Isb0JBQVksQ0E4QnhCOztJQzFERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNCRzthQUNhLFFBQVEsQ0FBQyxPQUFrQixHQUFBLHNCQUFzQixDQUFDLFFBQVEsRUFBQTtRQUN4RSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7SUFDbkQsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztJQUN0QixTQUFBLE1BQU0sQ0FDTCxZQUFZLENBQXFCLEdBQUcsRUFBRTtJQUNwQyxRQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2pCLEtBQUEsQ0FBQztJQUVILFNBQUEsS0FBSyxFQUFFO0lBQ1o7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1Qkc7SUFDRyxTQUFVLEdBQUcsQ0FDakIsS0FBNkIsRUFDN0IsT0FBa0IsR0FBQSxzQkFBc0IsQ0FBQyxHQUFHLEVBQUE7UUFFNUMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO0lBQzlDLElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUc7SUFDdEIsU0FBQSxNQUFNLENBQ0wsWUFBWSxDQUFxQixHQUFHLEVBQUU7SUFDcEMsUUFBQSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEdBQUcsS0FBSztJQUMzQixRQUFBLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNoQyxLQUFBLENBQUM7SUFFSCxTQUFBLEtBQUssRUFBRTtJQUNaO0lBRUE7Ozs7Ozs7OztJQVNHO0lBQ0csU0FBVSxHQUFHLENBQ2pCLEtBQTZCLEVBQzdCLE9BQWtCLEdBQUEsc0JBQXNCLENBQUMsR0FBRyxFQUFBO1FBRTVDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztJQUM5QyxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0lBQ3RCLFNBQUEsTUFBTSxDQUNMLFlBQVksQ0FBcUIsR0FBRyxFQUFFO0lBQ3BDLFFBQUEsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLEtBQUs7SUFDM0IsUUFBQSxPQUFPLEVBQUUsT0FBTztZQUNoQixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDaEMsS0FBQSxDQUFDO0lBRUgsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7Ozs7SUFTRztJQUNHLFNBQVUsSUFBSSxDQUNsQixLQUFhLEVBQ2IsT0FBa0IsR0FBQSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUE7UUFFN0MsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO0lBQy9DLElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUc7SUFDdEIsU0FBQSxNQUFNLENBQ0wsWUFBWSxDQUFxQixHQUFHLEVBQUU7SUFDcEMsUUFBQSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsS0FBSztJQUM1QixRQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQUEsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNyQixLQUFBLENBQUM7SUFFSCxTQUFBLEtBQUssRUFBRTtJQUNaO0lBRUE7Ozs7Ozs7OztJQVNHO0lBQ0csU0FBVSxTQUFTLENBQ3ZCLEtBQWEsRUFDYixPQUFrQixHQUFBLHNCQUFzQixDQUFDLFVBQVUsRUFBQTtRQUVuRCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7SUFDckQsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztJQUN0QixTQUFBLE1BQU0sQ0FDTCxZQUFZLENBQXFCLEdBQUcsRUFBRTtJQUNwQyxRQUFBLENBQUMsY0FBYyxDQUFDLFVBQVUsR0FBRyxLQUFLO0lBQ2xDLFFBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBQSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQztJQUMzQyxLQUFBLENBQUM7SUFFSCxTQUFBLEtBQUssRUFBRTtJQUNaO0lBRUE7Ozs7Ozs7OztJQVNHO0lBQ0csU0FBVSxTQUFTLENBQ3ZCLEtBQWEsRUFDYixPQUFrQixHQUFBLHNCQUFzQixDQUFDLFVBQVUsRUFBQTtRQUVuRCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7SUFDckQsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztJQUN0QixTQUFBLE1BQU0sQ0FDTCxZQUFZLENBQXFCLEdBQUcsRUFBRTtJQUNwQyxRQUFBLENBQUMsY0FBYyxDQUFDLFVBQVUsR0FBRyxLQUFLO0lBQ2xDLFFBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBQSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQztJQUMzQyxLQUFBLENBQUM7SUFFSCxTQUFBLEtBQUssRUFBRTtJQUNaO0lBRUE7Ozs7Ozs7OztJQVNHO0lBQ0csU0FBVSxPQUFPLENBQ3JCLEtBQXNCLEVBQ3RCLE9BQWtCLEdBQUEsc0JBQXNCLENBQUMsT0FBTyxFQUFBO1FBRWhELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztJQUNsRCxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0lBQ3RCLFNBQUEsTUFBTSxDQUNMLFlBQVksQ0FBcUIsR0FBRyxFQUFFO0lBQ3BDLFFBQUEsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUNyQixPQUFPLEtBQUssS0FBSyxRQUFRLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUU7SUFDdEQsUUFBQSxPQUFPLEVBQUUsT0FBTztJQUNoQixRQUFBLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDckIsS0FBQSxDQUFDO0lBRUgsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7OztJQVFHO2FBQ2EsS0FBSyxDQUFDLE9BQWtCLEdBQUEsc0JBQXNCLENBQUMsS0FBSyxFQUFBO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNoRCxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0lBQ3RCLFNBQUEsTUFBTSxDQUNMLFlBQVksQ0FBcUIsR0FBRyxFQUFFO0lBQ3BDLFFBQUEsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLEtBQUs7SUFDaEQsUUFBQSxPQUFPLEVBQUUsT0FBTztJQUNoQixRQUFBLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDckIsS0FBQSxDQUFDO0lBRUgsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7OztJQVFHO2FBQ2EsR0FBRyxDQUFDLE9BQWtCLEdBQUEsc0JBQXNCLENBQUMsR0FBRyxFQUFBO1FBQzlELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztJQUM5QyxJQUFBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHO0lBQ3RCLFNBQUEsTUFBTSxDQUNMLFlBQVksQ0FBcUIsR0FBRyxFQUFFO0lBQ3BDLFFBQUEsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUc7SUFDOUMsUUFBQSxPQUFPLEVBQUUsT0FBTztJQUNoQixRQUFBLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDckIsS0FBQSxDQUFDO0lBRUgsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7Ozs7SUFTRztJQUNHLFNBQVUsSUFBSSxDQUNsQixLQUF3QixFQUN4QixPQUFrQixHQUFBLHNCQUFzQixDQUFDLElBQUksRUFBQTtRQUU3QyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztJQUN0QixTQUFBLE1BQU0sQ0FDTCxZQUFZLENBQXFCLEdBQUcsRUFBRTtJQUNwQyxRQUFBLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFFBQUEsT0FBTyxFQUFFLE9BQU87SUFDakIsS0FBQSxDQUFDO0lBRUgsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7Ozs7Ozs7SUFZRztJQUNHLFNBQVUsSUFBSSxDQUNsQixNQUFBLEdBQWlCLFlBQVksRUFDN0IsT0FBQSxHQUFrQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUE7UUFFN0MsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO0lBQy9DLElBQUEsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUEyQixFQUFFLFdBQWlCLEtBQVM7WUFDdEUsWUFBWSxDQUFDLEdBQUcsRUFBRTtJQUNoQixZQUFBLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxNQUFNO0lBQy9CLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsWUFBQSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLFNBQUEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUM7SUFFdkIsUUFBQSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRTtJQUU1QixRQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRTtJQUN6QyxZQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQUEsR0FBRyxDQUFZLFFBQXVCLEVBQUE7b0JBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLGdCQUFBLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFlBQVk7SUFDeEMsb0JBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO0lBQ3ZDLHdCQUFBLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLHdCQUFBLFlBQVksRUFBRSxLQUFLOzRCQUNuQixHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUMzQix3QkFBQSxHQUFHLEVBQUUsQ0FBQyxRQUFnQyxLQUFJO0lBQ3hDLDRCQUFBLElBQUksR0FBcUI7SUFDekIsNEJBQUEsSUFBSTtJQUNGLGdDQUFBLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztJQUNqQyxnQ0FBQSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7O2dDQUNyQixPQUFPLENBQU0sRUFBRTtJQUNmLGdDQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7OzZCQUVqRTtJQUNGLHFCQUFBLENBQUM7SUFDSixnQkFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUTtpQkFDN0I7Z0JBQ0QsR0FBRyxHQUFBO0lBQ0QsZ0JBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7aUJBQ3BCO0lBQ0YsU0FBQSxDQUFDO0lBQ0osS0FBQztJQUNELElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUU7SUFDcEQ7SUFFQTs7Ozs7Ozs7OztJQVVHO0lBQ2EsU0FBQSxRQUFRLENBQ3RCLE9BQUEsR0FBa0IsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUM3RCxPQUFrQixHQUFBLHNCQUFzQixDQUFDLFFBQVEsRUFBQTtRQUVqRCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7SUFDbkQsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztJQUN0QixTQUFBLE1BQU0sQ0FDTCxZQUFZLENBQUMsR0FBRyxFQUFFO0lBQ2hCLFFBQUEsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLE9BQU87SUFDakMsUUFBQSxPQUFPLEVBQUUsT0FBTztJQUNoQixRQUFBLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDckIsS0FBQSxDQUFDO0lBRUgsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7Ozs7OztJQVdHO0lBQ0csU0FBVSxJQUFJLENBQ2xCLEtBQXNELEVBQ3RELFVBQThCLEdBQUEsT0FBTyxFQUNyQyxPQUFBLEdBQWtCLHNCQUFzQixDQUFDLElBQUksRUFBQTtRQUU3QyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRztJQUN0QixTQUFBLE1BQU0sQ0FDTCxZQUFZLENBQUMsR0FBRyxFQUFFO0lBQ2hCLFFBQUEsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3JFLFFBQUEsSUFBSSxFQUFFLFVBQVU7SUFDaEIsUUFBQSxPQUFPLEVBQUUsT0FBTztJQUNqQixLQUFBLENBQUM7SUFFSCxTQUFBLEtBQUssRUFBRTtJQUNaO0lBRUE7Ozs7Ozs7Ozs7SUFVRztJQUNHLFNBQVUsR0FBRyxDQUNqQixLQUE0QixFQUM1QixPQUFrQixHQUFBLHNCQUFzQixDQUFDLElBQUksRUFBQTtRQUU3QyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUNwQztJQUVBOzs7Ozs7Ozs7OztJQVdHO0lBQ0csU0FBVSxFQUFFLENBQ2hCLGlCQUF5QixFQUN6QixPQUFrQixHQUFBLHNCQUFzQixDQUFDLE1BQU0sRUFBQTtJQUUvQyxJQUFBLE1BQU0sT0FBTyxHQUEyQjtJQUN0QyxRQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQUEsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLGlCQUFpQjtTQUMzQztJQUVELElBQUEsT0FBTyxZQUFZLENBQ2pCLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUNyQyxPQUE2QixDQUM5QjtJQUNIO0lBRUE7Ozs7Ozs7Ozs7O0lBV0c7SUFDRyxTQUFVLElBQUksQ0FDbEIsaUJBQXlCLEVBQ3pCLE9BQWtCLEdBQUEsc0JBQXNCLENBQUMsSUFBSSxFQUFBO0lBRTdDLElBQUEsTUFBTSxPQUFPLEdBQXlCO0lBQ3BDLFFBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBQSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCO1NBQ3pDO0lBRUQsSUFBQSxPQUFPLFlBQVksQ0FDakIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQ25DLE9BQTZCLENBQzlCO0lBQ0g7SUFFQTs7Ozs7Ozs7Ozs7SUFXRztJQUNHLFNBQVUsRUFBRSxDQUNoQixpQkFBeUIsRUFDekIsT0FBa0IsR0FBQSxzQkFBc0IsQ0FBQyxTQUFTLEVBQUE7SUFFbEQsSUFBQSxNQUFNLE9BQU8sR0FBNkI7SUFDeEMsUUFBQSxPQUFPLEVBQUUsT0FBTztJQUNoQixRQUFBLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxpQkFBaUI7U0FDOUM7SUFFRCxJQUFBLE9BQU8sWUFBWSxDQUNqQixVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFDeEMsT0FBNkIsQ0FDOUI7SUFDSDtJQUVBOzs7Ozs7Ozs7OztJQVdHO0lBQ0csU0FBVSxHQUFHLENBQ2pCLGlCQUF5QixFQUN6QixPQUFrQixHQUFBLHNCQUFzQixDQUFDLGtCQUFrQixFQUFBO0lBRTNELElBQUEsTUFBTSxPQUFPLEdBQW9DO0lBQy9DLFFBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBQSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsR0FBRyxpQkFBaUI7U0FDdkQ7SUFFRCxJQUFBLE9BQU8sWUFBWSxDQUNqQixVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUNqRCxPQUE2QixDQUM5QjtJQUNIO0lBRUE7Ozs7Ozs7Ozs7O0lBV0c7SUFDRyxTQUFVLEVBQUUsQ0FDaEIsaUJBQXlCLEVBQ3pCLE9BQWtCLEdBQUEsc0JBQXNCLENBQUMsWUFBWSxFQUFBO0lBRXJELElBQUEsTUFBTSxPQUFPLEdBQWdDO0lBQzNDLFFBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBQSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEdBQUcsaUJBQWlCO1NBQ2pEO0lBRUQsSUFBQSxPQUFPLFlBQVksQ0FDakIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQzNDLE9BQTZCLENBQzlCO0lBQ0g7SUFFQTs7Ozs7Ozs7Ozs7SUFXRztJQUNHLFNBQVUsR0FBRyxDQUNqQixpQkFBeUIsRUFDekIsT0FBa0IsR0FBQSxzQkFBc0IsQ0FBQyxxQkFBcUIsRUFBQTtJQUU5RCxJQUFBLE1BQU0sT0FBTyxHQUF1QztJQUNsRCxRQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQUEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLEdBQUcsaUJBQWlCO1NBQzFEO0lBRUQsSUFBQSxPQUFPLFlBQVksQ0FDakIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFDcEQsT0FBNkIsQ0FDOUI7SUFDSDs7SUN4a0JBOzs7Ozs7Ozs7OztJQVdHO2FBQ2EsU0FBUyxDQUN2QixXQUFnQixFQUNoQixHQUFHLElBQVcsRUFBQTtJQUVkLElBQUEsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQVcsS0FBSyxJQUFJLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUM1RCxJQUFBLE9BQU8sQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVM7SUFDekMsSUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN6QjtJQUVBOzs7Ozs7SUFNRztJQUNHLFNBQVUseUJBQXlCLENBQUMsR0FBVyxFQUFBO1FBQ25ELElBQUksU0FBUyxHQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO0lBQy9DLElBQUEsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVM7SUFBRSxRQUFBLE9BQU8sR0FBRztJQUM5QyxJQUFBLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUU7SUFDckMsUUFBQSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7SUFDNUMsUUFBQSxJQUFJLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUztJQUFFLFlBQUEsT0FBTyxTQUFTO1lBQ3BELElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUztJQUFFLFlBQUEsT0FBTyxTQUFTOztJQUU3RSxJQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUM7SUFDcEQ7SUFFQTs7Ozs7OztJQU9HO0lBQ0csU0FBVSxrQkFBa0IsQ0FBQyxHQUFZLEVBQUE7UUFDN0MsSUFBSSxHQUFHLFlBQVksS0FBSztZQUFFO0lBRTFCLElBQUEsU0FBUyxhQUFhLENBQUMsYUFBc0IsRUFBRSxTQUFpQixFQUFBO0lBQzlELFFBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDOztRQUdqRCxNQUFNLFNBQVMsR0FBUSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztJQUNqRCxJQUFBLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEMsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7O0lBRTVDLElBQUEsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxRQUFBLElBQ0UsSUFBSSxLQUFLLE1BQU0sQ0FBQyxTQUFTO2dCQUN6QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQ2hEO2dCQUNBLE9BQU8sYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDOzs7SUFHcEQsSUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDO0lBQzVEOztJQ3pEQTs7Ozs7Ozs7Ozs7Ozs7SUFjRztJQUNHLFNBQVUsS0FBSyxDQUFDLGdCQUFtQyxFQUFBO0lBQ3ZELElBQUEsUUFBUSxDQUFDLFFBQWEsS0FBSTs7SUFFeEIsUUFBQSxNQUFNLGNBQWMsR0FBUSxVQUFVLEdBQUcsSUFBVyxFQUFBO2dCQUNsRCxNQUFNLFFBQVEsR0FBZ0MsU0FBUyxDQUNyRCxRQUFRLEVBQ1IsR0FBRyxJQUFJLENBQ1I7Z0JBQ0Qsa0JBQWtCLENBQUMsUUFBUSxDQUFDOztJQUU1QixZQUFBLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUU7SUFDbEMsWUFBQSxJQUFJLE9BQU87SUFBRSxnQkFBQSxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUVqRSxZQUFBeEIsbUJBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDRixpQkFBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBRXpFLFlBQUEsSUFBSSxnQkFBZ0I7SUFBRSxnQkFBQSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFekQsWUFBQSxPQUFPLFFBQVE7SUFDakIsU0FBQzs7SUFHRCxRQUFBLGNBQWMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVM7WUFFN0MsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUk7SUFDaEQsWUFBQSxPQUFPLENBQUMsY0FBYyxDQUNwQixHQUFHLEVBQ0gsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQ2xDLGNBQWMsQ0FDZjtJQUNILFNBQUMsQ0FBQzs7SUFFRixRQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRTtJQUM1QyxZQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2YsWUFBQSxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQUEsS0FBSyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUk7SUFDM0MsU0FBQSxDQUFDO0lBRUYsUUFBQUUsbUJBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDRixpQkFBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFFN0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQzs7SUFHN0MsUUFBQSxPQUFPLGNBQWM7SUFDdkIsS0FBQztJQUNIO0lBRUE7Ozs7Ozs7Ozs7Ozs7O0lBY0c7YUFDYSxRQUFRLENBQUMsU0FBaUIsRUFBRSxHQUFHLElBQVcsRUFBQTtRQUN4RCxPQUFPRSxtQkFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUNGLGlCQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7SUFDNUMsUUFBQSxTQUFTLEVBQUUsU0FBUztJQUNwQixRQUFBLElBQUksRUFBRSxJQUFJO0lBQ1gsS0FBQSxDQUFDO0lBQ0o7SUFFQTs7Ozs7Ozs7SUFRRzthQUNhLFlBQVksQ0FBQyxVQUFrQixFQUFFLEdBQUcsSUFBVyxFQUFBO1FBQzdELE9BQU9FLG1CQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQ0YsaUJBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUNsRCxRQUFBLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFFBQUEsSUFBSSxFQUFFLElBQUk7SUFDWCxLQUFBLENBQUM7SUFDSjs7SUMvR0E7Ozs7OztJQU1HO0lBTUg7Ozs7O0lBS0c7QUFDSSxVQUFNLE9BQU8sR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9
|