@mnaoumov/typescript-lib 0.0.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@types/debug/package.json +4 -0
- package/LICENSE +21 -0
- package/README.md +7 -1
- package/dist/lib/cjs/@types/debug.d.cts +21 -0
- package/dist/lib/cjs/abort-controller.cjs +202 -0
- package/dist/lib/cjs/abort-controller.d.cts +135 -0
- package/dist/lib/cjs/aggregate-error.cjs +98 -0
- package/dist/lib/cjs/aggregate-error.d.cts +24 -0
- package/dist/lib/cjs/array-buffer.cjs +96 -0
- package/dist/lib/cjs/array-buffer.d.cts +16 -0
- package/dist/lib/cjs/array.cjs +134 -0
- package/dist/lib/cjs/array.d.cts +46 -0
- package/dist/lib/cjs/async-events.cjs +466 -0
- package/dist/lib/cjs/async-events.d.cts +456 -0
- package/dist/lib/cjs/async-operation-hook.cjs +113 -0
- package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
- package/dist/lib/cjs/async.cjs +521 -0
- package/dist/lib/cjs/async.d.cts +414 -0
- package/dist/lib/cjs/beeper.cjs +126 -0
- package/dist/lib/cjs/beeper.d.cts +21 -0
- package/dist/lib/cjs/blob.cjs +160 -0
- package/dist/lib/cjs/blob.d.cts +59 -0
- package/dist/lib/cjs/bytes.cjs +114 -0
- package/dist/lib/cjs/bytes.d.cts +17 -0
- package/dist/lib/cjs/debug-controller.cjs +80 -0
- package/dist/lib/cjs/debug-controller.d.cts +87 -0
- package/dist/lib/cjs/debug.cjs +235 -0
- package/dist/lib/cjs/debug.d.cts +66 -0
- package/dist/lib/cjs/desktop-zip-extractor.cjs +215 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +95 -0
- package/dist/lib/cjs/disposable.cjs +414 -0
- package/dist/lib/cjs/disposable.d.cts +387 -0
- package/dist/lib/cjs/enum.cjs +100 -0
- package/dist/lib/cjs/enum.d.cts +24 -0
- package/dist/lib/cjs/error.cjs +297 -0
- package/dist/lib/cjs/error.d.cts +181 -0
- package/dist/lib/cjs/function.cjs +141 -0
- package/dist/lib/cjs/function.d.cts +128 -0
- package/dist/lib/cjs/html-element.cjs +341 -0
- package/dist/lib/cjs/html-element.d.cts +199 -0
- package/dist/lib/cjs/index.cjs +195 -0
- package/dist/lib/cjs/index.d.cts +33 -0
- package/dist/lib/cjs/jpeg-metadata.cjs +228 -0
- package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
- package/dist/lib/cjs/library.cjs +158 -0
- package/dist/lib/cjs/library.d.cts +96 -0
- package/dist/lib/cjs/object-utils.cjs +617 -0
- package/dist/lib/cjs/object-utils.d.cts +298 -0
- package/dist/lib/cjs/path.cjs +202 -0
- package/dist/lib/cjs/path.d.cts +154 -0
- package/dist/lib/cjs/reg-exp.cjs +254 -0
- package/dist/lib/cjs/reg-exp.d.cts +87 -0
- package/dist/lib/cjs/string.cjs +326 -0
- package/dist/lib/cjs/string.d.cts +361 -0
- package/dist/lib/cjs/transformers/date-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/group-transformer.cjs +173 -0
- package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/index.cjs +123 -0
- package/dist/lib/cjs/transformers/index.d.cts +9 -0
- package/dist/lib/cjs/transformers/map-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
- package/dist/lib/cjs/transformers/set-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +127 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
- package/dist/lib/cjs/transformers/transformer.cjs +170 -0
- package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +130 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
- package/dist/lib/cjs/transformers/typed-transformer.cjs +94 -0
- package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
- package/dist/lib/cjs/two-way-map.cjs +208 -0
- package/dist/lib/cjs/two-way-map.d.cts +101 -0
- package/dist/lib/cjs/type-guards.cjs +128 -0
- package/dist/lib/cjs/type-guards.d.cts +84 -0
- package/dist/lib/cjs/type.cjs +121 -0
- package/dist/lib/cjs/type.d.cts +122 -0
- package/dist/lib/cjs/typescript-lib-state.cjs +126 -0
- package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
- package/dist/lib/cjs/url.cjs +136 -0
- package/dist/lib/cjs/url.d.cts +74 -0
- package/dist/lib/cjs/value-provider.cjs +100 -0
- package/dist/lib/cjs/value-provider.d.cts +28 -0
- package/dist/lib/cjs/value-wrapper.cjs +144 -0
- package/dist/lib/cjs/value-wrapper.d.cts +47 -0
- package/dist/lib/esm/@types/debug.d.mts +21 -0
- package/dist/lib/esm/abort-controller.d.mts +135 -0
- package/dist/lib/esm/abort-controller.mjs +159 -0
- package/dist/lib/esm/aggregate-error.d.mts +24 -0
- package/dist/lib/esm/aggregate-error.mjs +60 -0
- package/dist/lib/esm/array-buffer.d.mts +16 -0
- package/dist/lib/esm/array-buffer.mjs +58 -0
- package/dist/lib/esm/array.d.mts +46 -0
- package/dist/lib/esm/array.mjs +93 -0
- package/dist/lib/esm/async-events.d.mts +456 -0
- package/dist/lib/esm/async-events.mjs +427 -0
- package/dist/lib/esm/async-operation-hook.d.mts +59 -0
- package/dist/lib/esm/async-operation-hook.mjs +71 -0
- package/dist/lib/esm/async.d.mts +414 -0
- package/dist/lib/esm/async.mjs +479 -0
- package/dist/lib/esm/beeper.d.mts +21 -0
- package/dist/lib/esm/beeper.mjs +88 -0
- package/dist/lib/esm/blob.d.mts +59 -0
- package/dist/lib/esm/blob.mjs +121 -0
- package/dist/lib/esm/bytes.d.mts +17 -0
- package/dist/lib/esm/bytes.mjs +76 -0
- package/dist/lib/esm/debug-controller.d.mts +87 -0
- package/dist/lib/esm/debug-controller.mjs +50 -0
- package/dist/lib/esm/debug.d.mts +66 -0
- package/dist/lib/esm/debug.mjs +185 -0
- package/dist/lib/esm/desktop-zip-extractor.d.mts +95 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +180 -0
- package/dist/lib/esm/disposable.d.mts +387 -0
- package/dist/lib/esm/disposable.mjs +360 -0
- package/dist/lib/esm/enum.d.mts +24 -0
- package/dist/lib/esm/enum.mjs +61 -0
- package/dist/lib/esm/error.d.mts +181 -0
- package/dist/lib/esm/error.mjs +248 -0
- package/dist/lib/esm/function.d.mts +128 -0
- package/dist/lib/esm/function.mjs +96 -0
- package/dist/lib/esm/html-element.d.mts +199 -0
- package/dist/lib/esm/html-element.mjs +291 -0
- package/dist/lib/esm/index.d.mts +33 -0
- package/dist/lib/esm/index.mjs +116 -0
- package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
- package/dist/lib/esm/jpeg-metadata.mjs +189 -0
- package/dist/lib/esm/library.d.mts +96 -0
- package/dist/lib/esm/library.mjs +118 -0
- package/dist/lib/esm/object-utils.d.mts +298 -0
- package/dist/lib/esm/object-utils.mjs +567 -0
- package/dist/lib/esm/path.d.mts +154 -0
- package/dist/lib/esm/path.mjs +139 -0
- package/dist/lib/esm/reg-exp.d.mts +87 -0
- package/dist/lib/esm/reg-exp.mjs +213 -0
- package/dist/lib/esm/string.d.mts +361 -0
- package/dist/lib/esm/string.mjs +274 -0
- package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/date-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/group-transformer.mjs +138 -0
- package/dist/lib/esm/transformers/index.d.mts +9 -0
- package/dist/lib/esm/transformers/index.mjs +68 -0
- package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
- package/dist/lib/esm/transformers/map-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/set-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +89 -0
- package/dist/lib/esm/transformers/transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/transformer.mjs +132 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +92 -0
- package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/typed-transformer.mjs +56 -0
- package/dist/lib/esm/two-way-map.d.mts +101 -0
- package/dist/lib/esm/two-way-map.mjs +170 -0
- package/dist/lib/esm/type-guards.d.mts +84 -0
- package/dist/lib/esm/type-guards.mjs +85 -0
- package/dist/lib/esm/type.d.mts +122 -0
- package/dist/lib/esm/type.mjs +83 -0
- package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
- package/dist/lib/esm/typescript-lib-state.mjs +84 -0
- package/dist/lib/esm/url.d.mts +74 -0
- package/dist/lib/esm/url.mjs +94 -0
- package/dist/lib/esm/value-provider.d.mts +28 -0
- package/dist/lib/esm/value-provider.mjs +62 -0
- package/dist/lib/esm/value-wrapper.d.mts +47 -0
- package/dist/lib/esm/value-wrapper.mjs +106 -0
- package/package.json +111 -13
- package/transformers/date-transformer/package.json +6 -0
- package/transformers/group-transformer/package.json +6 -0
- package/transformers/index/package.json +6 -0
- package/transformers/map-transformer/package.json +6 -0
- package/transformers/package.json +6 -0
- package/transformers/set-transformer/package.json +6 -0
- package/transformers/skip-private-property-transformer/package.json +6 -0
- package/transformers/transformer/package.json +6 -0
- package/transformers/two-way-map-transformer/package.json +6 -0
- package/transformers/typed-transformer/package.json +6 -0
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
|
+
const existingProcess = globalThis.process;
|
|
24
|
+
|
|
25
|
+
if (!existingProcess) {
|
|
26
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
|
+
globalThis.process = browserProcess;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (existingProcess.versions?.node) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const existingProcessRecord = existingProcess;
|
|
36
|
+
|
|
37
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
|
+
existingProcessRecord[key] ??= value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
existingProcessRecord['browser'] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function keepName($unknown) {
|
|
45
|
+
return $unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
(function initCjs() {
|
|
49
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
50
|
+
const globalThisRecord = globalThis;
|
|
51
|
+
ensureDisposeSymbols();
|
|
52
|
+
globalThisRecord['__name'] ??= keepName;
|
|
53
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
54
|
+
|
|
55
|
+
ensureBrowserProcess();
|
|
56
|
+
|
|
57
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
|
|
58
|
+
function extractDefault(module) {
|
|
59
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
60
|
+
}
|
|
61
|
+
})();
|
|
62
|
+
})();
|
|
63
|
+
|
|
64
|
+
"use strict";
|
|
65
|
+
var __defProp = Object.defineProperty;
|
|
66
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
67
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
68
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
69
|
+
var __export = (target, all) => {
|
|
70
|
+
for (var name in all)
|
|
71
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
72
|
+
};
|
|
73
|
+
var __copyProps = (to, from, except, desc) => {
|
|
74
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
75
|
+
for (let key of __getOwnPropNames(from))
|
|
76
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
77
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
78
|
+
}
|
|
79
|
+
return to;
|
|
80
|
+
};
|
|
81
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
82
|
+
var object_utils_exports = {};
|
|
83
|
+
__export(object_utils_exports, {
|
|
84
|
+
FunctionHandlingMode: () => FunctionHandlingMode,
|
|
85
|
+
assignWithNonEnumerableProperties: () => assignWithNonEnumerableProperties,
|
|
86
|
+
castTo: () => castTo,
|
|
87
|
+
cloneWithNonEnumerableProperties: () => cloneWithNonEnumerableProperties,
|
|
88
|
+
deleteProperties: () => deleteProperties,
|
|
89
|
+
deleteProperty: () => deleteProperty,
|
|
90
|
+
extractDefaultExportInterop: () => extractDefaultExportInterop,
|
|
91
|
+
getAllEntries: () => getAllEntries,
|
|
92
|
+
getAllKeys: () => getAllKeys,
|
|
93
|
+
getNestedPropertyValue: () => getNestedPropertyValue,
|
|
94
|
+
getPrototypeOf: () => getPrototypeOf,
|
|
95
|
+
isDeepEqual: () => isDeepEqual,
|
|
96
|
+
nameof: () => nameof,
|
|
97
|
+
normalizeOptionalProperties: () => normalizeOptionalProperties,
|
|
98
|
+
removeUndefinedProperties: () => removeUndefinedProperties,
|
|
99
|
+
setNestedPropertyValue: () => setNestedPropertyValue,
|
|
100
|
+
toJson: () => toJson
|
|
101
|
+
});
|
|
102
|
+
module.exports = __toCommonJS(object_utils_exports);
|
|
103
|
+
var import_error = require('./error.cjs');
|
|
104
|
+
var import_function = require('./function.cjs');
|
|
105
|
+
var import_reg_exp = require('./reg-exp.cjs');
|
|
106
|
+
var import_string = require('./string.cjs');
|
|
107
|
+
var import_type_guards = require('./type-guards.cjs');
|
|
108
|
+
var FunctionHandlingMode = /* @__PURE__ */ ((FunctionHandlingMode2) => {
|
|
109
|
+
FunctionHandlingMode2["Exclude"] = "exclude";
|
|
110
|
+
FunctionHandlingMode2["Full"] = "full";
|
|
111
|
+
FunctionHandlingMode2["NameOnly"] = "nameOnly";
|
|
112
|
+
return FunctionHandlingMode2;
|
|
113
|
+
})(FunctionHandlingMode || {});
|
|
114
|
+
const KEY_SEPARATOR = ".";
|
|
115
|
+
const PLACEHOLDER_KEY_PREFIX = "toJson:";
|
|
116
|
+
const equalityComparerEntries = [
|
|
117
|
+
createEqualityComparerEntry(ArrayBuffer, isDeepEqualArrayBuffer),
|
|
118
|
+
createEqualityComparerEntry(Date, isDeepEqualDate),
|
|
119
|
+
createEqualityComparerEntry(RegExp, isDeepEqualRegExp),
|
|
120
|
+
createEqualityComparerEntry(Map, isDeepEqualMap),
|
|
121
|
+
createEqualityComparerEntry(Set, isDeepEqualSet)
|
|
122
|
+
];
|
|
123
|
+
class ToJsonConverter {
|
|
124
|
+
fullOptions;
|
|
125
|
+
functionTexts = [];
|
|
126
|
+
usedObjects = /* @__PURE__ */ new WeakSet();
|
|
127
|
+
/**
|
|
128
|
+
* Creates a new converter, resolving the provided options against the defaults.
|
|
129
|
+
*
|
|
130
|
+
* @param options - The options for the JSON conversion.
|
|
131
|
+
*/
|
|
132
|
+
constructor(options) {
|
|
133
|
+
const DEFAULT_OPTIONS = {
|
|
134
|
+
functionHandlingMode: "exclude" /* Exclude */,
|
|
135
|
+
maxDepth: -1,
|
|
136
|
+
shouldCatchToJSONErrors: false,
|
|
137
|
+
shouldHandleCircularReferences: false,
|
|
138
|
+
shouldHandleErrors: false,
|
|
139
|
+
shouldHandleUndefined: false,
|
|
140
|
+
shouldSortKeys: false,
|
|
141
|
+
// eslint-disable-next-line no-magic-numbers -- Extracting magic number as a constant would be repetitive, as the value is used only once and its name would be the same as the property.
|
|
142
|
+
space: 2,
|
|
143
|
+
tokenSubstitutions: {
|
|
144
|
+
circularReference: makeObjectTokenSubstitution("CircularReference" /* CircularReference */),
|
|
145
|
+
maxDepthLimitReached: makeObjectTokenSubstitution("MaxDepthLimitReached" /* MaxDepthLimitReached */),
|
|
146
|
+
toJSONFailed: makeObjectTokenSubstitution("ToJSONFailed" /* ToJSONFailed */)
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const fullOptions = {
|
|
150
|
+
...DEFAULT_OPTIONS,
|
|
151
|
+
...options,
|
|
152
|
+
tokenSubstitutions: {
|
|
153
|
+
...DEFAULT_OPTIONS.tokenSubstitutions,
|
|
154
|
+
...options.tokenSubstitutions
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
if (fullOptions.maxDepth === -1) {
|
|
158
|
+
fullOptions.maxDepth = Infinity;
|
|
159
|
+
}
|
|
160
|
+
this.fullOptions = fullOptions;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Converts the given value to a JSON string, applying the configured token substitutions.
|
|
164
|
+
*
|
|
165
|
+
* @param value - The value to convert.
|
|
166
|
+
* @returns The JSON string representation of the value.
|
|
167
|
+
*/
|
|
168
|
+
convert(value) {
|
|
169
|
+
const plainObject = this.toPlainObject({
|
|
170
|
+
canUseToJSON: true,
|
|
171
|
+
depth: 0,
|
|
172
|
+
key: "",
|
|
173
|
+
value
|
|
174
|
+
});
|
|
175
|
+
let json = (0, import_type_guards.ensureNonNullable)(JSON.stringify(plainObject, null, this.fullOptions.space));
|
|
176
|
+
const placeholderRegExp = new RegExp(String.raw`"\[\[${(0, import_reg_exp.escapeRegExp)(PLACEHOLDER_KEY_PREFIX)}(?<Key>[A-Za-z]+)(?<Index>\d*)\]\]"`, "g");
|
|
177
|
+
json = (0, import_string.replaceAll)({
|
|
178
|
+
$string: json,
|
|
179
|
+
replacer: ({ capturedGroupArguments: [key = "", indexString = ""] }) => applySubstitutions({
|
|
180
|
+
functionTexts: this.functionTexts,
|
|
181
|
+
index: indexString ? parseInt(indexString, 10) : 0,
|
|
182
|
+
key: castTo(key),
|
|
183
|
+
substitutions: this.fullOptions.tokenSubstitutions
|
|
184
|
+
}),
|
|
185
|
+
searchValue: placeholderRegExp
|
|
186
|
+
});
|
|
187
|
+
return json;
|
|
188
|
+
}
|
|
189
|
+
handleArray(params) {
|
|
190
|
+
const {
|
|
191
|
+
canUseToJSON,
|
|
192
|
+
depth,
|
|
193
|
+
value
|
|
194
|
+
} = params;
|
|
195
|
+
return depth > this.fullOptions.maxDepth ? makePlaceholder("MaxDepthLimitReachedArray" /* MaxDepthLimitReachedArray */, value.length) : value.map(
|
|
196
|
+
(item, index) => this.toPlainObject({
|
|
197
|
+
canUseToJSON,
|
|
198
|
+
depth: depth + 1,
|
|
199
|
+
key: String(index),
|
|
200
|
+
value: item
|
|
201
|
+
})
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
handleCircularReference(value, key) {
|
|
205
|
+
if (this.fullOptions.shouldHandleCircularReferences) {
|
|
206
|
+
return makePlaceholder("CircularReference" /* CircularReference */);
|
|
207
|
+
}
|
|
208
|
+
const valueConstructorName = value.constructor.name || "Object";
|
|
209
|
+
throw new TypeError(`Converting circular structure to JSON
|
|
210
|
+
--> starting at object with constructor '${valueConstructorName}'
|
|
211
|
+
--- property '${key}' closes the circle`);
|
|
212
|
+
}
|
|
213
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- We need to use `Function` type to handle them separately.
|
|
214
|
+
handleFunction(value) {
|
|
215
|
+
if (this.fullOptions.functionHandlingMode === "exclude" /* Exclude */) {
|
|
216
|
+
return void 0;
|
|
217
|
+
}
|
|
218
|
+
const index = this.functionTexts.length;
|
|
219
|
+
const functionText = this.fullOptions.functionHandlingMode === "full" /* Full */ ? (0, import_function.getFunctionExpressionString)(value) : `function ${value.name || "anonymous"}() { /* ... */ }`;
|
|
220
|
+
this.functionTexts.push(functionText);
|
|
221
|
+
return makePlaceholder("Function" /* Function */, index);
|
|
222
|
+
}
|
|
223
|
+
handleObject(params) {
|
|
224
|
+
const {
|
|
225
|
+
canUseToJSON,
|
|
226
|
+
depth,
|
|
227
|
+
key,
|
|
228
|
+
value
|
|
229
|
+
} = params;
|
|
230
|
+
if (this.usedObjects.has(value)) {
|
|
231
|
+
return this.handleCircularReference(value, key);
|
|
232
|
+
}
|
|
233
|
+
this.usedObjects.add(value);
|
|
234
|
+
if (canUseToJSON) {
|
|
235
|
+
const toJSONResult = this.tryHandleToJSON({
|
|
236
|
+
depth,
|
|
237
|
+
key,
|
|
238
|
+
value
|
|
239
|
+
});
|
|
240
|
+
if (toJSONResult !== void 0) {
|
|
241
|
+
return toJSONResult;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (Array.isArray(value)) {
|
|
245
|
+
return this.handleArray({
|
|
246
|
+
canUseToJSON,
|
|
247
|
+
depth,
|
|
248
|
+
value
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
if (depth > this.fullOptions.maxDepth) {
|
|
252
|
+
return makePlaceholder("MaxDepthLimitReached" /* MaxDepthLimitReached */);
|
|
253
|
+
}
|
|
254
|
+
return value instanceof Error && this.fullOptions.shouldHandleErrors ? (0, import_error.errorToString)(value) : this.handlePlainObject({
|
|
255
|
+
canUseToJSON,
|
|
256
|
+
depth,
|
|
257
|
+
value
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
handlePlainObject(params) {
|
|
261
|
+
const {
|
|
262
|
+
canUseToJSON,
|
|
263
|
+
depth,
|
|
264
|
+
value
|
|
265
|
+
} = params;
|
|
266
|
+
const entries = Object.entries(value);
|
|
267
|
+
if (this.fullOptions.shouldSortKeys) {
|
|
268
|
+
entries.sort(([key1], [key2]) => key1.localeCompare(key2));
|
|
269
|
+
}
|
|
270
|
+
return Object.fromEntries(
|
|
271
|
+
entries.map(([key2, value2]) => [
|
|
272
|
+
key2,
|
|
273
|
+
this.toPlainObject({
|
|
274
|
+
canUseToJSON,
|
|
275
|
+
depth: depth + 1,
|
|
276
|
+
key: key2,
|
|
277
|
+
value: value2
|
|
278
|
+
})
|
|
279
|
+
])
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
toPlainObject(params) {
|
|
283
|
+
const {
|
|
284
|
+
canUseToJSON,
|
|
285
|
+
depth,
|
|
286
|
+
key,
|
|
287
|
+
value
|
|
288
|
+
} = params;
|
|
289
|
+
if (value === void 0) {
|
|
290
|
+
return depth === 0 || this.fullOptions.shouldHandleUndefined ? makePlaceholder("Undefined" /* Undefined */) : void 0;
|
|
291
|
+
}
|
|
292
|
+
if (typeof value === "function") {
|
|
293
|
+
return this.handleFunction(value);
|
|
294
|
+
}
|
|
295
|
+
return typeof value !== "object" || value === null ? value : this.handleObject({
|
|
296
|
+
canUseToJSON,
|
|
297
|
+
depth,
|
|
298
|
+
key,
|
|
299
|
+
value
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
tryHandleToJSON(params) {
|
|
303
|
+
const {
|
|
304
|
+
depth,
|
|
305
|
+
key,
|
|
306
|
+
value
|
|
307
|
+
} = params;
|
|
308
|
+
const toJSON = value.toJSON;
|
|
309
|
+
if (typeof toJSON === "function") {
|
|
310
|
+
try {
|
|
311
|
+
const newValue = toJSON.call(value, key);
|
|
312
|
+
return this.toPlainObject({
|
|
313
|
+
canUseToJSON: false,
|
|
314
|
+
depth,
|
|
315
|
+
key,
|
|
316
|
+
value: newValue
|
|
317
|
+
});
|
|
318
|
+
} catch (error) {
|
|
319
|
+
if (this.fullOptions.shouldCatchToJSONErrors) {
|
|
320
|
+
return makePlaceholder("ToJSONFailed" /* ToJSONFailed */);
|
|
321
|
+
}
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return void 0;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function assignWithNonEnumerableProperties(target, ...sources) {
|
|
329
|
+
return assignWithNonEnumerablePropertiesImpl(target, ...sources);
|
|
330
|
+
}
|
|
331
|
+
function castTo(value) {
|
|
332
|
+
return value;
|
|
333
|
+
}
|
|
334
|
+
function cloneWithNonEnumerableProperties($object) {
|
|
335
|
+
return Object.create(getPrototypeOf($object), Object.getOwnPropertyDescriptors($object));
|
|
336
|
+
}
|
|
337
|
+
function deleteProperties($object, propertyNames) {
|
|
338
|
+
let hasDeletedAny = false;
|
|
339
|
+
for (const propertyName of propertyNames) {
|
|
340
|
+
hasDeletedAny = deleteProperty($object, propertyName) || hasDeletedAny;
|
|
341
|
+
}
|
|
342
|
+
return hasDeletedAny;
|
|
343
|
+
}
|
|
344
|
+
function deleteProperty($object, propertyName) {
|
|
345
|
+
if (!Object.hasOwn($object, propertyName)) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
delete $object[propertyName];
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
function extractDefaultExportInterop(module2) {
|
|
352
|
+
if (typeof module2 !== "object" || module2 === null) {
|
|
353
|
+
return module2;
|
|
354
|
+
}
|
|
355
|
+
return "default" in module2 ? module2.default : module2;
|
|
356
|
+
}
|
|
357
|
+
function getAllEntries($object) {
|
|
358
|
+
return getAllKeys($object).map((key) => [key, $object[key]]);
|
|
359
|
+
}
|
|
360
|
+
function getAllKeys($object) {
|
|
361
|
+
const keys = [];
|
|
362
|
+
let current = $object;
|
|
363
|
+
while (current) {
|
|
364
|
+
const descriptors = Object.getOwnPropertyDescriptors(current);
|
|
365
|
+
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
366
|
+
if (key === "__proto__" || typeof descriptor.value === "function") {
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
const hasGetter = typeof descriptor.get === "function";
|
|
370
|
+
const hasSetter = typeof descriptor.set === "function";
|
|
371
|
+
if (hasGetter || hasSetter) {
|
|
372
|
+
if (hasGetter && hasSetter) {
|
|
373
|
+
keys.push(key);
|
|
374
|
+
}
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
if (descriptor.enumerable && descriptor.writable) {
|
|
378
|
+
keys.push(key);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
current = Object.getPrototypeOf(current);
|
|
382
|
+
}
|
|
383
|
+
return keys.sort();
|
|
384
|
+
}
|
|
385
|
+
function getNestedPropertyValue($object, path) {
|
|
386
|
+
let node = $object;
|
|
387
|
+
const keys = path.split(KEY_SEPARATOR);
|
|
388
|
+
for (const key of keys) {
|
|
389
|
+
if (node === void 0) {
|
|
390
|
+
return void 0;
|
|
391
|
+
}
|
|
392
|
+
node = node[key];
|
|
393
|
+
}
|
|
394
|
+
return node;
|
|
395
|
+
}
|
|
396
|
+
function getPrototypeOf(instance) {
|
|
397
|
+
return instance === void 0 || instance === null ? instance : Object.getPrototypeOf(instance);
|
|
398
|
+
}
|
|
399
|
+
function isDeepEqual(a, b) {
|
|
400
|
+
if (a === b) {
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
const aConstructor = a.constructor;
|
|
407
|
+
const bConstructor = b.constructor;
|
|
408
|
+
if (aConstructor !== bConstructor) {
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
if (aConstructor !== Object) {
|
|
412
|
+
const result = deepEqualTyped(a, b);
|
|
413
|
+
if (result !== void 0) {
|
|
414
|
+
return result;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const keysA = getAllKeys(a);
|
|
418
|
+
const keysB = getAllKeys(b);
|
|
419
|
+
if (keysA.length !== keysB.length) {
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
const aRecord = (0, import_type_guards.ensureGenericObject)(a);
|
|
423
|
+
const bRecord = (0, import_type_guards.ensureGenericObject)(b);
|
|
424
|
+
for (const key of keysA) {
|
|
425
|
+
if (!keysB.includes(key) || !isDeepEqual(aRecord[key], bRecord[key])) {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
function nameof(name) {
|
|
432
|
+
return name;
|
|
433
|
+
}
|
|
434
|
+
function normalizeOptionalProperties($object) {
|
|
435
|
+
return $object;
|
|
436
|
+
}
|
|
437
|
+
function removeUndefinedProperties($object, keysToKeep) {
|
|
438
|
+
for (const [key, value] of Object.entries($object)) {
|
|
439
|
+
if (value === void 0 && !keysToKeep?.includes(key)) {
|
|
440
|
+
delete $object[key];
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return $object;
|
|
444
|
+
}
|
|
445
|
+
function setNestedPropertyValue(params) {
|
|
446
|
+
const {
|
|
447
|
+
$object,
|
|
448
|
+
path,
|
|
449
|
+
value
|
|
450
|
+
} = params;
|
|
451
|
+
const error = new Error(`Property path ${path} not found`);
|
|
452
|
+
let node = $object;
|
|
453
|
+
const keys = path.split(KEY_SEPARATOR);
|
|
454
|
+
for (const key of keys.slice(0, -1)) {
|
|
455
|
+
if (node === void 0) {
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
node = node[key];
|
|
459
|
+
}
|
|
460
|
+
const lastKey = (0, import_type_guards.ensureNonNullable)(keys.at(-1));
|
|
461
|
+
if (node === void 0) {
|
|
462
|
+
throw error;
|
|
463
|
+
}
|
|
464
|
+
node[lastKey] = value;
|
|
465
|
+
}
|
|
466
|
+
function toJson(value, options = {}) {
|
|
467
|
+
return new ToJsonConverter(options).convert(value);
|
|
468
|
+
}
|
|
469
|
+
function applySubstitutions(params) {
|
|
470
|
+
switch (params.key) {
|
|
471
|
+
case "CircularReference" /* CircularReference */: {
|
|
472
|
+
return params.substitutions.circularReference;
|
|
473
|
+
}
|
|
474
|
+
case "Function" /* Function */: {
|
|
475
|
+
return (0, import_type_guards.ensureNonNullable)(params.functionTexts[params.index], `Function with index ${String(params.index)} not found`);
|
|
476
|
+
}
|
|
477
|
+
case "MaxDepthLimitReached" /* MaxDepthLimitReached */: {
|
|
478
|
+
return params.substitutions.maxDepthLimitReached;
|
|
479
|
+
}
|
|
480
|
+
case "MaxDepthLimitReachedArray" /* MaxDepthLimitReachedArray */: {
|
|
481
|
+
return `Array(${String(params.index)})`;
|
|
482
|
+
}
|
|
483
|
+
case "ToJSONFailed" /* ToJSONFailed */: {
|
|
484
|
+
return params.substitutions.toJSONFailed;
|
|
485
|
+
}
|
|
486
|
+
case "Undefined" /* Undefined */: {
|
|
487
|
+
return "undefined";
|
|
488
|
+
}
|
|
489
|
+
/* v8 ignore start -- Exhaustive switch guard; default branch is unreachable. */
|
|
490
|
+
default: {
|
|
491
|
+
(0, import_type_guards.assertNever)(params.key);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
function assignWithNonEnumerablePropertiesImpl(target, ...sources) {
|
|
496
|
+
for (const source of sources) {
|
|
497
|
+
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
498
|
+
for (const [key, descriptor] of Object.entries(descriptors)) {
|
|
499
|
+
try {
|
|
500
|
+
if (key === "prototype" || Object.getOwnPropertyDescriptor(target, key)?.writable === false && !Object.getOwnPropertyDescriptor(target, key)?.configurable) {
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
Object.defineProperty(target, key, descriptor);
|
|
504
|
+
} catch {
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
const sourcePrototypes = sources.map((source) => getPrototypeOf(source)).filter((prototype) => !!prototype);
|
|
509
|
+
if (sourcePrototypes.length > 0) {
|
|
510
|
+
const targetPrototype = assignWithNonEnumerablePropertiesImpl({}, getPrototypeOf(target), ...sourcePrototypes);
|
|
511
|
+
try {
|
|
512
|
+
Object.setPrototypeOf(target, targetPrototype);
|
|
513
|
+
} catch {
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return target;
|
|
517
|
+
}
|
|
518
|
+
function createEqualityComparerEntry(constructor, checkIsEqual) {
|
|
519
|
+
return {
|
|
520
|
+
constructor,
|
|
521
|
+
equalityComparer: (a, b) => checkIsEqual(a, b)
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
function deepEqualTyped(a, b) {
|
|
525
|
+
for (const entry of equalityComparerEntries) {
|
|
526
|
+
const result = tryEntryEquality({
|
|
527
|
+
a,
|
|
528
|
+
b,
|
|
529
|
+
entry
|
|
530
|
+
});
|
|
531
|
+
if (result !== void 0) {
|
|
532
|
+
return result;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return void 0;
|
|
536
|
+
}
|
|
537
|
+
function isDeepEqualArrayBuffer(a, b) {
|
|
538
|
+
if (a.byteLength !== b.byteLength) {
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
const viewA = new Uint8Array(a);
|
|
542
|
+
const viewB = new Uint8Array(b);
|
|
543
|
+
return isDeepEqual(viewA, viewB);
|
|
544
|
+
}
|
|
545
|
+
function isDeepEqualDate(a, b) {
|
|
546
|
+
return a.getTime() === b.getTime();
|
|
547
|
+
}
|
|
548
|
+
function isDeepEqualMap(a, b) {
|
|
549
|
+
if (a.size !== b.size) {
|
|
550
|
+
return false;
|
|
551
|
+
}
|
|
552
|
+
for (const [key, value] of a) {
|
|
553
|
+
if (!b.has(key) || !isDeepEqual(value, b.get(key))) {
|
|
554
|
+
return false;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
function isDeepEqualRegExp(a, b) {
|
|
560
|
+
return a.source === b.source && a.flags === b.flags;
|
|
561
|
+
}
|
|
562
|
+
function isDeepEqualSet(a, b) {
|
|
563
|
+
if (a.size !== b.size) {
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
for (const valueA of a) {
|
|
567
|
+
if (b.has(valueA)) {
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
let hasMatch = false;
|
|
571
|
+
for (const valueB of b) {
|
|
572
|
+
if (isDeepEqual(valueA, valueB)) {
|
|
573
|
+
hasMatch = true;
|
|
574
|
+
break;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
if (!hasMatch) {
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
function makeObjectTokenSubstitution(key) {
|
|
584
|
+
return `{ "[[${key}]]": null }`;
|
|
585
|
+
}
|
|
586
|
+
function makePlaceholder(key, index) {
|
|
587
|
+
return `[[${PLACEHOLDER_KEY_PREFIX}${key}${index ? String(index) : ""}]]`;
|
|
588
|
+
}
|
|
589
|
+
function tryEntryEquality(params) {
|
|
590
|
+
const {
|
|
591
|
+
a,
|
|
592
|
+
b,
|
|
593
|
+
entry
|
|
594
|
+
} = params;
|
|
595
|
+
return a instanceof entry.constructor && b instanceof entry.constructor ? entry.equalityComparer(a, b) : void 0;
|
|
596
|
+
}
|
|
597
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
598
|
+
0 && (module.exports = {
|
|
599
|
+
FunctionHandlingMode,
|
|
600
|
+
assignWithNonEnumerableProperties,
|
|
601
|
+
castTo,
|
|
602
|
+
cloneWithNonEnumerableProperties,
|
|
603
|
+
deleteProperties,
|
|
604
|
+
deleteProperty,
|
|
605
|
+
extractDefaultExportInterop,
|
|
606
|
+
getAllEntries,
|
|
607
|
+
getAllKeys,
|
|
608
|
+
getNestedPropertyValue,
|
|
609
|
+
getPrototypeOf,
|
|
610
|
+
isDeepEqual,
|
|
611
|
+
nameof,
|
|
612
|
+
normalizeOptionalProperties,
|
|
613
|
+
removeUndefinedProperties,
|
|
614
|
+
setNestedPropertyValue,
|
|
615
|
+
toJson
|
|
616
|
+
});
|
|
617
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29iamVjdC11dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBPYmplY3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFJlcXVpcmVkS2V5c09mLFxuICBVbmRlZmluZWRPblBhcnRpYWxEZWVwXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFeGFjdE1lbWJlcnMsXG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4vdHlwZS50cyc7XG5cbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLnRzJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi9yZWctZXhwLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgZW5zdXJlR2VuZXJpY09iamVjdCxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyBmdW5jdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIEpTT04gb3V0cHV0LlxuICovXG5leHBvcnQgZW51bSBGdW5jdGlvbkhhbmRsaW5nTW9kZSB7XG4gIC8qKlxuICAgKiBFeGNsdWRlcyBmdW5jdGlvbnMgZnJvbSB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBFeGNsdWRlID0gJ2V4Y2x1ZGUnLFxuICAvKipcbiAgICogSW5jbHVkZXMgdGhlIGZ1bGwgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBGdWxsID0gJ2Z1bGwnLFxuICAvKipcbiAgICogSW5jbHVkZXMgb25seSB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBOYW1lT25seSA9ICduYW1lT25seSdcbn1cblxuZW51bSBUb2tlblN1YnN0aXR1dGlvbktleSB7XG4gIENpcmN1bGFyUmVmZXJlbmNlID0gJ0NpcmN1bGFyUmVmZXJlbmNlJyxcbiAgRnVuY3Rpb24gPSAnRnVuY3Rpb24nLFxuICBNYXhEZXB0aExpbWl0UmVhY2hlZCA9ICdNYXhEZXB0aExpbWl0UmVhY2hlZCcsXG4gIE1heERlcHRoTGltaXRSZWFjaGVkQXJyYXkgPSAnTWF4RGVwdGhMaW1pdFJlYWNoZWRBcnJheScsXG4gIFRvSlNPTkZhaWxlZCA9ICdUb0pTT05GYWlsZWQnLFxuICBVbmRlZmluZWQgPSAnVW5kZWZpbmVkJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0pzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvSnNvbk9wdGlvbnMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBmdW5jdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRnVuY3Rpb25IYW5kbGluZ01vZGUuRXhjbHVkZX1cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3RlZCBvYmplY3RzIHRvIGluY2x1ZGUgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKiBVc2UgYC0xYCBmb3Igbm8gbGltaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAtMWBcbiAgICovXG4gIHJlYWRvbmx5IG1heERlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNhdGNoIGVycm9ycyBpbiBgdG9KU09OKClgIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDYXRjaFRvSlNPTkVycm9yczogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaGFuZGxlIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVDaXJjdWxhclJlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSBlcnJvcnMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVFcnJvcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSBgdW5kZWZpbmVkYCB2YWx1ZXMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVVbmRlZmluZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHNvcnQgdGhlIGtleXMgb2YgdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTb3J0S2V5czogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgSlNPTiBvdXRwdXQuIFRoaXMgY2FuIGJlIGEgbnVtYmVyIG9mIHNwYWNlcyBvciBhIHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDJgXG4gICAqL1xuICByZWFkb25seSBzcGFjZTogbnVtYmVyIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHN1YnN0aXR1dGlvbnMgdG8gdXNlIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuU3Vic3RpdHV0aW9uczogUGFydGlhbDxUb2tlblN1YnN0aXR1dGlvbnM+O1xufVxuXG5pbnRlcmZhY2UgQXBwbHlTdWJzdGl0dXRpb25zUGFyYW1zIHtcbiAgcmVhZG9ubHkgZnVuY3Rpb25UZXh0czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGtleTogVG9rZW5TdWJzdGl0dXRpb25LZXk7XG4gIHJlYWRvbmx5IHN1YnN0aXR1dGlvbnM6IFRva2VuU3Vic3RpdHV0aW9ucztcbn1cblxuaW50ZXJmYWNlIEVxdWFsaXR5Q29tcGFyZXJFbnRyeTxUPiB7XG4gIGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPjtcbiAgZXF1YWxpdHlDb21wYXJlcjogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBKU09OU2VyaWFsaXphYmxlIHtcbiAgdG9KU09OOiAoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKSA9PiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgTW9kdWxlV2l0aERlZmF1bHRFeHBvcnQ8VD4ge1xuICBkZWZhdWx0OiBUO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRUb0pzb25PcHRpb25zIGV4dGVuZHMgVG9Kc29uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRva2VuU3Vic3RpdHV0aW9uczogVG9rZW5TdWJzdGl0dXRpb25zO1xufVxuXG5pbnRlcmZhY2UgVG9rZW5TdWJzdGl0dXRpb25zIHtcbiAgY2lyY3VsYXJSZWZlcmVuY2U6IHN0cmluZztcbiAgbWF4RGVwdGhMaW1pdFJlYWNoZWQ6IHN0cmluZztcbiAgdG9KU09ORmFpbGVkOiBzdHJpbmc7XG59XG5cbmNvbnN0IEtFWV9TRVBBUkFUT1IgPSAnLic7XG5jb25zdCBQTEFDRUhPTERFUl9LRVlfUFJFRklYID0gJ3RvSnNvbjonO1xuY29uc3QgZXF1YWxpdHlDb21wYXJlckVudHJpZXM6IHJlYWRvbmx5IEVxdWFsaXR5Q29tcGFyZXJFbnRyeTx1bmtub3duPltdID0gW1xuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnkoQXJyYXlCdWZmZXIsIGlzRGVlcEVxdWFsQXJyYXlCdWZmZXIpLFxuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnkoRGF0ZSwgaXNEZWVwRXF1YWxEYXRlKSxcbiAgY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5KFJlZ0V4cCwgaXNEZWVwRXF1YWxSZWdFeHApLFxuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnk8TWFwPHVua25vd24sIHVua25vd24+PihNYXAsIGlzRGVlcEVxdWFsTWFwKSxcbiAgY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5PFNldDx1bmtub3duPj4oU2V0LCBpc0RlZXBFcXVhbFNldClcbl07XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNldE5lc3RlZFByb3BlcnR5VmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldE5lc3RlZFByb3BlcnR5VmFsdWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG9iamVjdCB0byBzZXQgdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbi5cbiAgICovXG4gIHJlYWRvbmx5ICRvYmplY3Q6IEdlbmVyaWNPYmplY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBuZXN0ZWQgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZUFycmF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFycmF5IHZhbHVlIHRvIGNvbnZlcnQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlT2JqZWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGtleSB1bmRlciB3aGljaCB0aGUgdmFsdWUgaXMgc3RvcmVkIGluIGl0cyBwYXJlbnQuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG9iamVjdDtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZVBsYWluT2JqZWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBsYWluIG9iamVjdCB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG9iamVjdDtcbn1cblxudHlwZSBLZXlzV2l0aFVuZGVmaW5lZDxUPiA9IEtleXNXaXRoVW5kZWZpbmVkTWFwPFQ+W2tleW9mIFRdO1xuXG50eXBlIEtleXNXaXRoVW5kZWZpbmVkTWFwPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiB1bmRlZmluZWQgZXh0ZW5kcyBUW0tdID8gSyA6IG5ldmVyO1xufTtcbnR5cGUgTWFuZGF0b3J5S2V5c1dpdGhVbmRlZmluZWQ8VCBleHRlbmRzIG9iamVjdD4gPSBFeHRyYWN0PFJlcXVpcmVkS2V5c09mPFQ+ICYgU3RyaW5nS2V5czxUPiwgS2V5c1dpdGhVbmRlZmluZWQ8VD4+O1xudHlwZSBSZW1vdmVVbmRlZmluZWRPdmVybG9hZDxUIGV4dGVuZHMgb2JqZWN0PiA9IE1hbmRhdG9yeUtleXNXaXRoVW5kZWZpbmVkPFQ+IGV4dGVuZHMgbmV2ZXIgPyBbb2JqOiBUXVxuICA6IG5ldmVyO1xuXG50eXBlIFJlbW92ZVVuZGVmaW5lZFdpdGhLZXlzT3ZlcmxvYWQ8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdPiA9IFtvYmo6IFQsIGtleXNUb0tlZXA6IEV4YWN0TWVtYmVyczxNYW5kYXRvcnlLZXlzV2l0aFVuZGVmaW5lZDxUPiwgSz5dO1xuXG5pbnRlcmZhY2UgVG9QbGFpbk9iamVjdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGB0b0pTT04oKWAgbWF5IGJlIHVzZWQgZHVyaW5nIGNvbnZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBjYW5Vc2VUb0pTT046IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgcGFyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRyeUVudHJ5RXF1YWxpdHl9LlxuICovXG5pbnRlcmZhY2UgVHJ5RW50cnlFcXVhbGl0eVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IGE6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IGI6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBlcXVhbGl0eSBjb21wYXJlciBlbnRyeSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogRXF1YWxpdHlDb21wYXJlckVudHJ5PHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgVHJ5SGFuZGxlVG9KU09OUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgcGFyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdmFsdWUgdG8gY29udmVydC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBvYmplY3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB2YWx1ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIHBsYWluIG9iamVjdCBhbmQgcmVuZGVycyBpdCBhcyBhIEpTT04gc3RyaW5nLlxuICpcbiAqIEEgZnJlc2ggaW5zdGFuY2UgaXMgY3JlYXRlZCBwZXIge0BsaW5rIHRvSnNvbn0gY2FsbCBzbyB0aGF0IHRoZSBhY2N1bXVsYXRlZCBgZnVuY3Rpb25UZXh0c2BcbiAqIGFuZCB0aGUgYHVzZWRPYmplY3RzYCBjaXJjdWxhci1yZWZlcmVuY2Ugc2V0IG5ldmVyIGxlYWsgYmV0d2VlbiBjb252ZXJzaW9ucy5cbiAqL1xuY2xhc3MgVG9Kc29uQ29udmVydGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsT3B0aW9uczogUmVzb2x2ZWRUb0pzb25PcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uVGV4dHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlZE9iamVjdHMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbnZlcnRlciwgcmVzb2x2aW5nIHRoZSBwcm92aWRlZCBvcHRpb25zIGFnYWluc3QgdGhlIGRlZmF1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgSlNPTiBjb252ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8VG9Kc29uT3B0aW9ucz4pIHtcbiAgICBjb25zdCBERUZBVUxUX09QVElPTlM6IFJlc29sdmVkVG9Kc29uT3B0aW9ucyA9IHtcbiAgICAgIGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZS5FeGNsdWRlLFxuICAgICAgbWF4RGVwdGg6IC0xLFxuICAgICAgc2hvdWxkQ2F0Y2hUb0pTT05FcnJvcnM6IGZhbHNlLFxuICAgICAgc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzOiBmYWxzZSxcbiAgICAgIHNob3VsZEhhbmRsZUVycm9yczogZmFsc2UsXG4gICAgICBzaG91bGRIYW5kbGVVbmRlZmluZWQ6IGZhbHNlLFxuICAgICAgc2hvdWxkU29ydEtleXM6IGZhbHNlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICAgIHNwYWNlOiAyLFxuICAgICAgdG9rZW5TdWJzdGl0dXRpb25zOiB7XG4gICAgICAgIGNpcmN1bGFyUmVmZXJlbmNlOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuQ2lyY3VsYXJSZWZlcmVuY2UpLFxuICAgICAgICBtYXhEZXB0aExpbWl0UmVhY2hlZDogbWFrZU9iamVjdFRva2VuU3Vic3RpdHV0aW9uKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkKSxcbiAgICAgICAgdG9KU09ORmFpbGVkOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBmdWxsT3B0aW9ucyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfT1BUSU9OUyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0b2tlblN1YnN0aXR1dGlvbnM6IHtcbiAgICAgICAgLi4uREVGQVVMVF9PUFRJT05TLnRva2VuU3Vic3RpdHV0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy50b2tlblN1YnN0aXR1dGlvbnNcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGZ1bGxPcHRpb25zLm1heERlcHRoID09PSAtMSkge1xuICAgICAgZnVsbE9wdGlvbnMubWF4RGVwdGggPSBJbmZpbml0eTtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bGxPcHRpb25zID0gZnVsbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIHRvIGEgSlNPTiBzdHJpbmcsIGFwcGx5aW5nIHRoZSBjb25maWd1cmVkIHRva2VuIHN1YnN0aXR1dGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNvbnZlcnQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYWluT2JqZWN0ID0gdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgIGNhblVzZVRvSlNPTjogdHJ1ZSxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gICAgbGV0IGpzb24gPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShwbGFpbk9iamVjdCwgbnVsbCwgdGhpcy5mdWxsT3B0aW9ucy5zcGFjZSkpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUmVnRXhwID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YFwiXFxbXFxbJHtlc2NhcGVSZWdFeHAoUExBQ0VIT0xERVJfS0VZX1BSRUZJWCl9KD88S2V5PltBLVphLXpdKykoPzxJbmRleD5cXGQqKVxcXVxcXVwiYCwgJ2cnKTtcbiAgICBqc29uID0gcmVwbGFjZUFsbCh7XG4gICAgICAkc3RyaW5nOiBqc29uLFxuICAgICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmd1bWVudHM6IFtrZXkgPSAnJywgaW5kZXhTdHJpbmcgPSAnJ10gfSkgPT5cbiAgICAgICAgYXBwbHlTdWJzdGl0dXRpb25zKHtcbiAgICAgICAgICBmdW5jdGlvblRleHRzOiB0aGlzLmZ1bmN0aW9uVGV4dHMsXG4gICAgICAgICAgaW5kZXg6IGluZGV4U3RyaW5nID8gcGFyc2VJbnQoaW5kZXhTdHJpbmcsIDEwKSA6IDAsXG4gICAgICAgICAga2V5OiBjYXN0VG88VG9rZW5TdWJzdGl0dXRpb25LZXk+KGtleSksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uczogdGhpcy5mdWxsT3B0aW9ucy50b2tlblN1YnN0aXR1dGlvbnNcbiAgICAgICAgfSksXG4gICAgICBzZWFyY2hWYWx1ZTogcGxhY2Vob2xkZXJSZWdFeHBcbiAgICB9KTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyYXkocGFyYW1zOiBIYW5kbGVBcnJheVBhcmFtcyk6IHVua25vd24ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgIGRlcHRoLFxuICAgICAgdmFsdWVcbiAgICB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBkZXB0aCA+IHRoaXMuZnVsbE9wdGlvbnMubWF4RGVwdGhcbiAgICAgID8gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkQXJyYXksIHZhbHVlLmxlbmd0aClcbiAgICAgIDogdmFsdWUubWFwKChpdGVtLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgICBrZXk6IFN0cmluZyhpbmRleCksXG4gICAgICAgICAgdmFsdWU6IGl0ZW1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNpcmN1bGFyUmVmZXJlbmNlKHZhbHVlOiBvYmplY3QsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzKSB7XG4gICAgICByZXR1cm4gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5LkNpcmN1bGFyUmVmZXJlbmNlKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3Rvck5hbWUgPSB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT05cbi0tPiBzdGFydGluZyBhdCBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvciAnJHt2YWx1ZUNvbnN0cnVjdG9yTmFtZX0nXG4tLS0gcHJvcGVydHkgJyR7a2V5fScgY2xvc2VzIHRoZSBjaXJjbGVgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgLS0gV2UgbmVlZCB0byB1c2UgYEZ1bmN0aW9uYCB0eXBlIHRvIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkuXG4gIHByaXZhdGUgaGFuZGxlRnVuY3Rpb24odmFsdWU6IEZ1bmN0aW9uKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuZnVsbE9wdGlvbnMuZnVuY3Rpb25IYW5kbGluZ01vZGUgPT09IEZ1bmN0aW9uSGFuZGxpbmdNb2RlLkV4Y2x1ZGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mdW5jdGlvblRleHRzLmxlbmd0aDtcbiAgICBjb25zdCBmdW5jdGlvblRleHQgPSB0aGlzLmZ1bGxPcHRpb25zLmZ1bmN0aW9uSGFuZGxpbmdNb2RlID09PSBGdW5jdGlvbkhhbmRsaW5nTW9kZS5GdWxsXG4gICAgICA/IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyh2YWx1ZSlcbiAgICAgIDogYGZ1bmN0aW9uICR7dmFsdWUubmFtZSB8fCAnYW5vbnltb3VzJ30oKSB7IC8qIC4uLiAqLyB9YDtcbiAgICB0aGlzLmZ1bmN0aW9uVGV4dHMucHVzaChmdW5jdGlvblRleHQpO1xuICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuRnVuY3Rpb24sIGluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT2JqZWN0KHBhcmFtczogSGFuZGxlT2JqZWN0UGFyYW1zKTogdW5rbm93biB7XG4gICAgY29uc3Qge1xuICAgICAgY2FuVXNlVG9KU09OLFxuICAgICAgZGVwdGgsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZVxuICAgIH0gPSBwYXJhbXM7XG4gICAgaWYgKHRoaXMudXNlZE9iamVjdHMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUsIGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VkT2JqZWN0cy5hZGQodmFsdWUpO1xuXG4gICAgaWYgKGNhblVzZVRvSlNPTikge1xuICAgICAgY29uc3QgdG9KU09OUmVzdWx0ID0gdGhpcy50cnlIYW5kbGVUb0pTT04oe1xuICAgICAgICBkZXB0aCxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgICBpZiAodG9KU09OUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvSlNPTlJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFycmF5KHtcbiAgICAgICAgY2FuVXNlVG9KU09OLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkZXB0aCA+IHRoaXMuZnVsbE9wdGlvbnMubWF4RGVwdGgpIHtcbiAgICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlRXJyb3JzXG4gICAgICA/IGVycm9yVG9TdHJpbmcodmFsdWUpXG4gICAgICA6IHRoaXMuaGFuZGxlUGxhaW5PYmplY3Qoe1xuICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgIGRlcHRoLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBsYWluT2JqZWN0KHBhcmFtczogSGFuZGxlUGxhaW5PYmplY3RQYXJhbXMpOiB1bmtub3duIHtcbiAgICBjb25zdCB7XG4gICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICBkZXB0aCxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgIGlmICh0aGlzLmZ1bGxPcHRpb25zLnNob3VsZFNvcnRLZXlzKSB7XG4gICAgICBlbnRyaWVzLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBlbnRyaWVzLm1hcCgoW2tleTIsIHZhbHVlMl0pID0+IFtcbiAgICAgICAga2V5MixcbiAgICAgICAgdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgICBrZXk6IGtleTIsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlMlxuICAgICAgICB9KVxuICAgICAgXSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1BsYWluT2JqZWN0KHBhcmFtczogVG9QbGFpbk9iamVjdFBhcmFtcyk6IHVua25vd24ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgIGRlcHRoLFxuICAgICAga2V5LFxuICAgICAgdmFsdWVcbiAgICB9ID0gcGFyYW1zO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gKGRlcHRoID09PSAwIHx8IHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlVW5kZWZpbmVkKVxuICAgICAgICA/IG1ha2VQbGFjZWhvbGRlcihUb2tlblN1YnN0aXR1dGlvbktleS5VbmRlZmluZWQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZ1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB0aGlzLmhhbmRsZU9iamVjdCh7XG4gICAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlIYW5kbGVUb0pTT04ocGFyYW1zOiBUcnlIYW5kbGVUb0pTT05QYXJhbXMpOiB1bmtub3duIHtcbiAgICBjb25zdCB7XG4gICAgICBkZXB0aCxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0b0pTT04gPSAodmFsdWUgYXMgUGFydGlhbDxKU09OU2VyaWFsaXphYmxlPikudG9KU09OO1xuICAgIGlmICh0eXBlb2YgdG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRvSlNPTi5jYWxsKHZhbHVlLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT046IGZhbHNlLFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5mdWxsT3B0aW9ucy5zaG91bGRDYXRjaFRvSlNPTkVycm9ycykge1xuICAgICAgICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuLyoqXG4gKiBBc3NpZ25zIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhIHRhcmdldCBvYmplY3QsIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgb2JqZWN0IHR5cGUuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgc291cmNlIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IHR5cGUuXG4gKiBAdHlwZVBhcmFtIFYgLSBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2UxIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UyIC0gVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbi8qKlxuICogQXNzaWducyBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYSB0YXJnZXQgb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEB0eXBlUGFyYW0gViAtIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCB0eXBlLlxuICogQHR5cGVQYXJhbSBXIC0gVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2UxIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UyIC0gVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcGFyYW0gc291cmNlMyAtIFRoZSB0aGlyZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFUsIFYsIFc+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogViwgc291cmNlMzogVyk6IFQgJiBVICYgViAmIFc7XG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZXMgLSBUaGUgc291cmNlIG9iamVjdHMgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXModGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IG9iamVjdFtdKTogb2JqZWN0IHtcbiAgcmV0dXJuIGFzc2lnbldpdGhOb25FbnVtZXJhYmxlUHJvcGVydGllc0ltcGwodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cblxuLyoqXG4gKiBDYXN0cyBhIHZhbHVlIHRvIGEgc3BlY2lmaWMgdHlwZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IHR5cGUgdG8gY2FzdCB0by5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjYXN0LlxuICogQHJldHVybnMgVGhlIHZhbHVlIGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byBjYXN0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhc3RUbzxUPih2YWx1ZTogdW5rbm93bik6IFQge1xuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cblxuLyoqXG4gKiBDbG9uZXMgYW4gb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3Q+KCRvYmplY3Q6IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2YoJG9iamVjdCksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKCRvYmplY3QpKSBhcyBUO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgbXVsdGlwbGUgcHJvcGVydGllcyBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZXMgLSBUaGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gZGVsZXRlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGUgcHJvcGVydGllcyB3ZXJlIHByZXNlbnQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBUaGUgbmFtZSBzdGF0ZXMgdGhlIGFjdGlvbjsgdGhlIGJvb2xlYW4gb25seSByZXBvcnRzIHdoZXRoZXIgYW55dGhpbmcgd2FzIGRlbGV0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcGVydGllczxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBULCBwcm9wZXJ0eU5hbWVzOiAoa2V5b2YgVClbXSk6IGJvb2xlYW4ge1xuICBsZXQgaGFzRGVsZXRlZEFueSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHByb3BlcnR5TmFtZXMpIHtcbiAgICBoYXNEZWxldGVkQW55ID0gZGVsZXRlUHJvcGVydHkoJG9iamVjdCwgcHJvcGVydHlOYW1lKSB8fCBoYXNEZWxldGVkQW55O1xuICB9XG5cbiAgcmV0dXJuIGhhc0RlbGV0ZWRBbnk7XG59XG5cbi8qKlxuICogRGVsZXRlcyBhIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eSBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWxldGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IHdhcyBwcmVzZW50LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gVGhlIG5hbWUgc3RhdGVzIHRoZSBhY3Rpb247IHRoZSBib29sZWFuIG9ubHkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSB3YXMgZGVsZXRlZC5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eTxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBULCBwcm9wZXJ0eU5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKCRvYmplY3QsIHByb3BlcnR5TmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgJG9iamVjdFtwcm9wZXJ0eU5hbWVdO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZGVmYXVsdCBleHBvcnQgZnJvbSBhIG1vZHVsZS5cbiAqXG4gKiBVc2VmdWwgdG8gaGFuZGxlIGluY29ycmVjdCBkZWZhdWx0IGV4cG9ydCBpbnRlcm9wIGJldHdlZW4gRVNNIGFuZCBDSlMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGRlZmF1bHQgZXhwb3J0LlxuICogQHBhcmFtIG1vZHVsZSAtIFRoZSBtb2R1bGUgdG8gZXh0cmFjdCB0aGUgZGVmYXVsdCBleHBvcnQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IGV4cG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcDxUPihtb2R1bGU6IE1vZHVsZVdpdGhEZWZhdWx0RXhwb3J0PFQ+IHwgVCk6IFQge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ29iamVjdCcgfHwgbW9kdWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG1vZHVsZTtcbiAgfVxuXG4gIHJldHVybiAnZGVmYXVsdCcgaW4gbW9kdWxlID8gbW9kdWxlLmRlZmF1bHQgOiBtb2R1bGU7XG59XG5cbi8qKlxuICogR2V0cyBhbGwgZW50cmllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGVudHJpZXMgb2YuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgZW50cmllcyBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsRW50cmllczxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUKTogW1N0cmluZ0tleXM8VD4sIFRbU3RyaW5nS2V5czxUPl1dW10ge1xuICByZXR1cm4gZ2V0QWxsS2V5cygkb2JqZWN0KS5tYXAoKGtleSkgPT4gW2tleSwgJG9iamVjdFtrZXldXSk7XG59XG5cbi8qKlxuICogR2V0cyBhbGwga2V5cyBvZiBhbiBvYmplY3QuXG4gKiBJbmNsdWRlcyBmaWVsZHMgYW5kIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGtleXMgb2YuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwga2V5cyBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsS2V5czxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUKTogU3RyaW5nS2V5czxUPltdIHtcbiAgY29uc3Qga2V5czogU3RyaW5nS2V5czxUPltdID0gW107XG4gIGxldCBjdXJyZW50OiBudWxsIHwgb2JqZWN0ID0gJG9iamVjdDtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGN1cnJlbnQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVzY3JpcHRvcl0gb2YgT2JqZWN0LmVudHJpZXMoZGVzY3JpcHRvcnMpKSB7XG4gICAgICBpZiAoKGtleSA9PT0gJ19fcHJvdG9fXycpIHx8ICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0dldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGNvbnN0IGhhc1NldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmIChoYXNHZXR0ZXIgfHwgaGFzU2V0dGVyKSB7XG4gICAgICAgIGlmIChoYXNHZXR0ZXIgJiYgaGFzU2V0dGVyKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSBhcyBTdHJpbmdLZXlzPFQ+KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkgYXMgU3RyaW5nS2V5czxUPik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KSBhcyBudWxsIHwgb2JqZWN0O1xuICB9XG4gIHJldHVybiBrZXlzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIG5lc3RlZCBwcm9wZXJ0eSBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgZnJvbS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbmVzdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSgkb2JqZWN0OiBHZW5lcmljT2JqZWN0LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgbGV0IG5vZGU6IEdlbmVyaWNPYmplY3QgfCB1bmRlZmluZWQgPSAkb2JqZWN0O1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChLRVlfU0VQQVJBVE9SKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlW2tleV0gYXMgR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHByb3RvdHlwZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtIGluc3RhbmNlIC0gVGhlIG9iamVjdCBpbnN0YW5jZSB0byByZXRyaWV2ZSB0aGUgcHJvdG90eXBlIG9mLlxuICogQHJldHVybnMgVGhlIHByb3RvdHlwZSBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2Y8VD4oaW5zdGFuY2U6IFQpOiBUIHtcbiAgcmV0dXJuIGluc3RhbmNlID09PSB1bmRlZmluZWQgfHwgaW5zdGFuY2UgPT09IG51bGwgPyBpbnN0YW5jZSA6IChPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdGFuY2UpIGFzIFQpO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGRlZXBseSBlcXVhbC5cbiAqXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZGVlcGx5IGVxdWFsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnIHx8IGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFDb25zdHJ1Y3RvciA9IGEuY29uc3RydWN0b3I7XG4gIGNvbnN0IGJDb25zdHJ1Y3RvciA9IGIuY29uc3RydWN0b3I7XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gYkNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZGVlcEVxdWFsVHlwZWQoYSwgYik7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gZ2V0QWxsS2V5cyhhKTtcbiAgY29uc3Qga2V5c0IgPSBnZXRBbGxLZXlzKGIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFSZWNvcmQgPSBlbnN1cmVHZW5lcmljT2JqZWN0KGEpO1xuICBjb25zdCBiUmVjb3JkID0gZW5zdXJlR2VuZXJpY09iamVjdChiKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgIGlmICgha2V5c0IuaW5jbHVkZXMoa2V5KSB8fCAhaXNEZWVwRXF1YWwoYVJlY29yZFtrZXldLCBiUmVjb3JkW2tleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IG9mIGEgZ2l2ZW4gdHlwZSBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFzIGEgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZW9mPFQgZXh0ZW5kcyBvYmplY3Q+KG5hbWU6IFN0cmluZ0tleXM8VD4pOiBTdHJpbmdLZXlzPFQ+IHtcbiAgcmV0dXJuIG5hbWU7XG59XG4vKipcbiAqIE5vcm1hbGl6ZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhbGxvdyBgdW5kZWZpbmVkYCBhc3NpZ25tZW50IGluIHN0cmljdCBtb2RlLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwcm92aWRlcyBhIHdvcmthcm91bmQgZm9yIHRoZSBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXNgIFR5cGVTY3JpcHQgZmxhZyxcbiAqIHdoaWNoIHByb2hpYml0cyBkaXJlY3RseSBhc3NpZ25pbmcgYHVuZGVmaW5lZGAgdG8gb3B0aW9uYWwgcHJvcGVydGllcyB3aGVuIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5IG9taXRzIGB1bmRlZmluZWRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBXaXRoIGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlczogdHJ1ZWBcbiAqIGNvbnN0IHg6IHsgcHJvcD86IHN0cmluZyB9ID0geyBwcm9wOiB1bmRlZmluZWQgfTsgLy8gQ29tcGlsZXIgZXJyb3JcbiAqXG4gKiAvLyBVc2luZyB0aGlzIHV0aWxpdHk6XG4gKiBjb25zdCB5OiB7IHByb3A/OiBzdHJpbmcgfSA9IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczx7IHByb3A/OiBzdHJpbmcgfT4oeyBwcm9wOiB1bmRlZmluZWQgfSk7IC8vIFdvcmtzXG4gKiBgYGBcbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IHR5cGUgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZS5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBub3JtYWxpemUsIGFsbG93aW5nIGV4cGxpY2l0IGB1bmRlZmluZWRgIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgb2JqZWN0LCBjb21wYXRpYmxlIHdpdGggYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxUPigkb2JqZWN0OiBVbmRlZmluZWRPblBhcnRpYWxEZWVwPFQ+KTogVCB7XG4gIHJldHVybiAkb2JqZWN0IGFzIFQ7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3Qgd2hlbiB0aGVyZSBhcmUgbm8gbWFuZGF0b3J5IGtleXMgd2l0aCBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggYWxsIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXM8VHlwZSBleHRlbmRzIG9iamVjdD4oXG4gIC4uLiRhcmd1bWVudHM6IFJlbW92ZVVuZGVmaW5lZE92ZXJsb2FkPFR5cGU+XG4pOiBUeXBlO1xuLyoqXG4gKiBSZW1vdmVzIGFsbCBgdW5kZWZpbmVkYCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0IHdoZW4gdGhlcmUgYXJlIG1hbmRhdG9yeSBrZXlzIHdpdGggYHVuZGVmaW5lZGAgdmFsdWVzLlxuICpcbiAqIEB0eXBlUGFyYW0gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAdHlwZVBhcmFtIEtleXNUb0tlZXAgLSBUaGUga2V5cyB0byBrZWVwLlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCBhbGwgYHVuZGVmaW5lZGAgcHJvcGVydGllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxUeXBlIGV4dGVuZHMgb2JqZWN0LCBjb25zdCBLZXlzVG9LZWVwIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10+KFxuICAuLi4kYXJndW1lbnRzOiBSZW1vdmVVbmRlZmluZWRXaXRoS2V5c092ZXJsb2FkPFR5cGUsIEtleXNUb0tlZXA+XG4pOiBUeXBlO1xuLyoqXG4gKiBSZW1vdmVzIGFsbCBgdW5kZWZpbmVkYCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gcmVtb3ZlIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBrZXlzVG9LZWVwIC0gVGhlIGtleXMgdG8ga2VlcC5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCBhbGwgYHVuZGVmaW5lZGAgcHJvcGVydGllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxUeXBlIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUeXBlLCBrZXlzVG9LZWVwPzogcmVhZG9ubHkgc3RyaW5nW10pOiBUeXBlIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoJG9iamVjdCkgYXMgW1N0cmluZ0tleXM8VHlwZT4sIHVua25vd25dW10pIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAha2V5c1RvS2VlcD8uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICAgICAgZGVsZXRlICRvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICRvYmplY3Q7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBuZXN0ZWQgcHJvcGVydHkgaW4gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2V0dGluZyB0aGUgbmVzdGVkIHByb3BlcnR5IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkUHJvcGVydHlWYWx1ZShwYXJhbXM6IFNldE5lc3RlZFByb3BlcnR5VmFsdWVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgICRvYmplY3QsXG4gICAgcGF0aCxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUHJvcGVydHkgcGF0aCAke3BhdGh9IG5vdCBmb3VuZGApO1xuICBsZXQgbm9kZTogR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZCA9ICRvYmplY3Q7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KEtFWV9TRVBBUkFUT1IpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzLnNsaWNlKDAsIC0xKSkge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBub2RlID0gbm9kZVtrZXldIGFzIEdlbmVyaWNPYmplY3QgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBsYXN0S2V5ID0gZW5zdXJlTm9uTnVsbGFibGUoa2V5cy5hdCgtMSkpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBub2RlW2xhc3RLZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiB2YWx1ZSB0byBhIEpTT04gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTi4gVGhpcyBjYW4gYmUgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHRoZSBKU09OIGNvbnZlcnNpb24gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb24odmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFBhcnRpYWw8VG9Kc29uT3B0aW9ucz4gPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVG9Kc29uQ29udmVydGVyKG9wdGlvbnMpLmNvbnZlcnQodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhcHBseVN1YnN0aXR1dGlvbnMocGFyYW1zOiBBcHBseVN1YnN0aXR1dGlvbnNQYXJhbXMpOiBNYXliZVJldHVybjxzdHJpbmc+IHtcbiAgc3dpdGNoIChwYXJhbXMua2V5KSB7XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5DaXJjdWxhclJlZmVyZW5jZToge1xuICAgICAgcmV0dXJuIHBhcmFtcy5zdWJzdGl0dXRpb25zLmNpcmN1bGFyUmVmZXJlbmNlO1xuICAgIH1cbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LkZ1bmN0aW9uOiB7XG4gICAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUocGFyYW1zLmZ1bmN0aW9uVGV4dHNbcGFyYW1zLmluZGV4XSwgYEZ1bmN0aW9uIHdpdGggaW5kZXggJHtTdHJpbmcocGFyYW1zLmluZGV4KX0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQ6IHtcbiAgICAgIHJldHVybiBwYXJhbXMuc3Vic3RpdHV0aW9ucy5tYXhEZXB0aExpbWl0UmVhY2hlZDtcbiAgICB9XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5NYXhEZXB0aExpbWl0UmVhY2hlZEFycmF5OiB7XG4gICAgICByZXR1cm4gYEFycmF5KCR7U3RyaW5nKHBhcmFtcy5pbmRleCl9KWA7XG4gICAgfVxuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkOiB7XG4gICAgICByZXR1cm4gcGFyYW1zLnN1YnN0aXR1dGlvbnMudG9KU09ORmFpbGVkO1xuICAgIH1cbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LlVuZGVmaW5lZDoge1xuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQ7IGRlZmF1bHQgYnJhbmNoIGlzIHVucmVhY2hhYmxlLiAqL1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHBhcmFtcy5rZXkpO1xuICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzSW1wbCh0YXJnZXQ6IG9iamVjdCwgLi4uc291cmNlczogb2JqZWN0W10pOiBvYmplY3Qge1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBkZXNjcmlwdG9yXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdG9ycykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEF2b2lkIHJlZGVmaW5pbmcgcmVhZC1vbmx5IHByb3BlcnRpZXMgKGVzcGVjaWFsbHkgYHByb3RvdHlwZWApXG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09ICdwcm90b3R5cGUnXG4gICAgICAgICAgfHwgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpPy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICYmICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KT8uY29uZmlndXJhYmxlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIGlmIGRlZmluZVByb3BlcnR5IGZhaWxzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc291cmNlUHJvdG90eXBlcyA9IHNvdXJjZXNcbiAgICAubWFwKChzb3VyY2UpID0+IGdldFByb3RvdHlwZU9mPG9iamVjdCB8IHVuZGVmaW5lZD4oc291cmNlKSlcbiAgICAuZmlsdGVyKChwcm90b3R5cGUpOiBwcm90b3R5cGUgaXMgb2JqZWN0ID0+ICEhcHJvdG90eXBlKTtcblxuICBpZiAoc291cmNlUHJvdG90eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdGFyZ2V0UHJvdG90eXBlID0gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzSW1wbCh7fSwgZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSwgLi4uc291cmNlUHJvdG90eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgdGFyZ2V0UHJvdG90eXBlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBpZiBzZXRQcm90b3R5cGVPZiBmYWlsc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qXG4gKiBUaGUgb25lIHBsYWNlIHdoZXJlIHRoZSBsaXN0J3MgaGV0ZXJvZ2VuZWl0eSBpcyBicmlkZ2VkLCBhbmQgaXQgbmVlZHMgYSBjYXN0IGJlY2F1c2UgdGhlIGNvcnJlbGF0aW9uIHRoYXQgbWFrZXMgaXRcbiAqIHNhZmUgaXMgYSBydW50aW1lIG9uZTogYHRyeUVudHJ5RXF1YWxpdHlgIGNhbGxzIHRoZSBjb21wYXJlciBvbmx5IGFmdGVyIGBhIGluc3RhbmNlb2YgZW50cnkuY29uc3RydWN0b3JgIGhhcyBoZWxkIGZvclxuICogYm90aCBvcGVyYW5kcywgYW5kIG5vIHR5cGUgY2FuIHRpZSB0aGF0IGBpbnN0YW5jZW9mYCB0byB0aGlzIGVudHJ5J3MgYFRgLiBDb25maW5pbmcgdGhlIGNhc3QgaGVyZSBidXlzIHRoZSBjaGVjayB0aGVcbiAqIGxpc3QgdXNlZCB0byBsYWNrIC0gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUgY29tcGFyZXIgYXJlIGluZmVycmVkIGZyb20gT05FIGBUYCwgc28gYSBtaXNtYXRjaGVkIHBhaXIgaXMgYSBjb21waWxlXG4gKiBlcnJvciBhdCB0aGUgY2FsbCBzaXRlIGluc3RlYWQgb2YgYmVpbmcgd2F2ZWQgdGhyb3VnaCBieSBhbiBgYW55YC10eXBlZCBlbnRyeSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5PFQ+KGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiwgY2hlY2tJc0VxdWFsOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbik6IEVxdWFsaXR5Q29tcGFyZXJFbnRyeTx1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgY29uc3RydWN0b3IsXG4gICAgZXF1YWxpdHlDb21wYXJlcjogKGEsIGIpID0+IGNoZWNrSXNFcXVhbChhIGFzIFQsIGIgYXMgVClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVlcEVxdWFsVHlwZWQoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVxdWFsaXR5Q29tcGFyZXJFbnRyaWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJ5RW50cnlFcXVhbGl0eSh7XG4gICAgICBhLFxuICAgICAgYixcbiAgICAgIGVudHJ5XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbEFycmF5QnVmZmVyKGE6IEFycmF5QnVmZmVyLCBiOiBBcnJheUJ1ZmZlcik6IGJvb2xlYW4ge1xuICBpZiAoYS5ieXRlTGVuZ3RoICE9PSBiLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2aWV3QSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICBjb25zdCB2aWV3QiA9IG5ldyBVaW50OEFycmF5KGIpO1xuICByZXR1cm4gaXNEZWVwRXF1YWwodmlld0EsIHZpZXdCKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxNYXAoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgIGlmICghYi5oYXMoa2V5KSB8fCAhaXNEZWVwRXF1YWwodmFsdWUsIGIuZ2V0KGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsUmVnRXhwKGE6IFJlZ0V4cCwgYjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxTZXQoYTogU2V0PHVua25vd24+LCBiOiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCB2YWx1ZUEgb2YgYSkge1xuICAgIGlmIChiLmhhcyh2YWx1ZUEpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZUIgb2YgYikge1xuICAgICAgaWYgKGlzRGVlcEVxdWFsKHZhbHVlQSwgdmFsdWVCKSkge1xuICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VPYmplY3RUb2tlblN1YnN0aXR1dGlvbihrZXk6IFRva2VuU3Vic3RpdHV0aW9uS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGB7IFwiW1ske2tleX1dXVwiOiBudWxsIH1gO1xufVxuXG5mdW5jdGlvbiBtYWtlUGxhY2Vob2xkZXIoa2V5OiBUb2tlblN1YnN0aXR1dGlvbktleSwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYFtbJHtQTEFDRUhPTERFUl9LRVlfUFJFRklYfSR7a2V5fSR7aW5kZXggPyBTdHJpbmcoaW5kZXgpIDogJyd9XV1gO1xufVxuXG5mdW5jdGlvbiB0cnlFbnRyeUVxdWFsaXR5KHBhcmFtczogVHJ5RW50cnlFcXVhbGl0eVBhcmFtcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGVudHJ5XG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhIGluc3RhbmNlb2YgZW50cnkuY29uc3RydWN0b3IgJiYgYiBpbnN0YW5jZW9mIGVudHJ5LmNvbnN0cnVjdG9yID8gZW50cnkuZXF1YWxpdHlDb21wYXJlcihhLCBiKSA6IHVuZGVmaW5lZDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxtQkFBOEI7QUFDOUIsc0JBQTRDO0FBQzVDLHFCQUE2QjtBQUM3QixvQkFBMkI7QUFDM0IseUJBSU87QUFLQSxJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLGFBQVU7QUFJVixFQUFBQSxzQkFBQSxVQUFPO0FBSVAsRUFBQUEsc0JBQUEsY0FBVztBQVpELFNBQUFBO0FBQUEsR0FBQTtBQXlIWixNQUFNLGdCQUFnQjtBQUN0QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLDBCQUFxRTtBQUFBLEVBQ3pFLDRCQUE0QixhQUFhLHNCQUFzQjtBQUFBLEVBQy9ELDRCQUE0QixNQUFNLGVBQWU7QUFB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V0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFFBQVEsSUFBSSxXQUFXLENBQUM7QUFDOUIsUUFBTSxRQUFRLElBQUksV0FBVyxDQUFDO0FBQzlCLFNBQU8sWUFBWSxPQUFPLEtBQUs7QUFDakM7QUFFQSxTQUFTLGdCQUFnQixHQUFTLEdBQWtCO0FBQ2xELFNBQU8sRUFBRSxRQUFRLE1BQU0sRUFBRSxRQUFRO0FBQ25DO0FBRUEsU0FBUyxlQUFlLEdBQTBCLEdBQW1DO0FBQ25GLE1BQUksRUFBRSxTQUFTLEVBQUUsTUFBTTtBQUNyQixXQUFPO0FBQUEsRUFDVDtBQUVBLGFBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQzVCLFFBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRztBQUNsRCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGtCQUFrQixHQUFXLEdBQW9CO0FBQ3hELFNBQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRTtBQUNoRDtBQUVBLFNBQVMsZUFBZSxHQUFpQixHQUEwQjtBQUNqRSxNQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU07QUFDckIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxhQUFXLFVBQVUsR0FBRztBQUN0QixRQUFJLEVBQUUsSUFBSSxNQUFNLEdBQUc7QUFDakI7QUFBQSxJQUNGO0FBQ0EsUUFBSSxXQUFXO0FBQ2YsZUFBVyxVQUFVLEdBQUc7QUFDdEIsVUFBSSxZQUFZLFFBQVEsTUFBTSxHQUFHO0FBQy9CLG1CQUFXO0FBQ1g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFFBQUksQ0FBQyxVQUFVO0FBQ2IsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyw0QkFBNEIsS0FBbUM7QUFDdEUsU0FBTyxRQUFRLEdBQUc7QUFDcEI7QUFFQSxTQUFTLGdCQUFnQixLQUEyQixPQUF3QjtBQUMxRSxTQUFPLEtBQUssc0JBQXNCLEdBQUcsR0FBRyxHQUFHLFFBQVEsT0FBTyxLQUFLLElBQUksRUFBRTtBQUN2RTtBQUVBLFNBQVMsaUJBQWlCLFFBQXFEO0FBQzdFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixTQUFPLGFBQWEsTUFBTSxlQUFlLGFBQWEsTUFBTSxjQUFjLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFJO0FBQzNHOyIsCiAgIm5hbWVzIjogWyJGdW5jdGlvbkhhbmRsaW5nTW9kZSIsICJtb2R1bGUiXQp9Cg==
|