@dbx-tools/shared-core 0.9.43 → 0.9.47
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/index.ts +3 -2
- package/lib/index.d.ts +3 -2
- package/lib/index.js +3 -2
- package/lib/src/bindings.d.ts +10 -0
- package/lib/src/bindings.js +15 -0
- package/lib/src/log.d.ts +2 -0
- package/lib/src/log.js +2 -2
- package/lib/src/options.d.ts +39 -8
- package/lib/src/options.js +127 -79
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -2
- package/src/bindings.ts +17 -0
- package/src/log.ts +1 -1
- package/src/options.ts +230 -83
package/lib/src/options.js
CHANGED
|
@@ -52,64 +52,60 @@ export const normalizedUrlSchema = z
|
|
|
52
52
|
.overwrite(normalizeUrl)
|
|
53
53
|
.describe("URL normalized through the shared URL builder.");
|
|
54
54
|
const databricksText = (description) => z.string().trim().min(1).optional().describe(description);
|
|
55
|
+
const databricksOptionMeta = (env, flag = true) => ({
|
|
56
|
+
env,
|
|
57
|
+
flag,
|
|
58
|
+
helpDefault: false,
|
|
59
|
+
});
|
|
55
60
|
export const DatabricksOptionsSchema = z
|
|
56
61
|
.object({
|
|
57
|
-
profile: databricksText("Databricks CLI profile.").meta(
|
|
58
|
-
env: databricksEnvironmentNames.profile,
|
|
59
|
-
}),
|
|
62
|
+
profile: databricksText("Databricks CLI profile.").meta(databricksOptionMeta(databricksEnvironmentNames.profile)),
|
|
60
63
|
host: normalizedUrlSchema
|
|
61
64
|
.optional()
|
|
62
65
|
.describe("Databricks host.")
|
|
63
|
-
.meta(
|
|
64
|
-
accountId: databricksText("Databricks account ID.").meta(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
flag: false,
|
|
79
|
-
}),
|
|
80
|
-
clientSecret: databricksText("Databricks OAuth client secret.").meta({
|
|
81
|
-
env: databricksEnvironmentNames.clientSecret,
|
|
82
|
-
flag: false,
|
|
83
|
-
}),
|
|
84
|
-
accessToken: databricksText("Databricks access token.").meta({
|
|
85
|
-
env: databricksEnvironmentNames.accessToken,
|
|
86
|
-
flag: false,
|
|
87
|
-
}),
|
|
88
|
-
groupId: databricksText("Databricks group ID.").meta({
|
|
89
|
-
env: databricksEnvironmentNames.groupId,
|
|
90
|
-
flag: false,
|
|
91
|
-
}),
|
|
92
|
-
authType: databricksText("Databricks authentication type.").meta({
|
|
93
|
-
env: databricksEnvironmentNames.authType,
|
|
94
|
-
flag: false,
|
|
95
|
-
}),
|
|
96
|
-
appName: databricksText("Databricks App name.").meta({
|
|
97
|
-
env: databricksEnvironmentNames.appName,
|
|
98
|
-
flag: false,
|
|
99
|
-
}),
|
|
100
|
-
appPort: tcpPortSchema.optional().describe("Databricks App port.").meta({
|
|
101
|
-
env: databricksEnvironmentNames.appPort,
|
|
102
|
-
flag: false,
|
|
103
|
-
}),
|
|
104
|
-
lakebaseEndpoint: databricksText("Lakebase endpoint.").meta({
|
|
105
|
-
env: databricksEnvironmentNames.lakebaseEndpoint,
|
|
106
|
-
flag: false,
|
|
107
|
-
}),
|
|
66
|
+
.meta(databricksOptionMeta(databricksEnvironmentNames.host, false)),
|
|
67
|
+
accountId: databricksText("Databricks account ID.").meta(databricksOptionMeta(databricksEnvironmentNames.accountId, false)),
|
|
68
|
+
workspaceId: databricksText("Databricks workspace ID.").meta(databricksOptionMeta(databricksEnvironmentNames.workspaceId, false)),
|
|
69
|
+
configFile: databricksText("Databricks CLI config file.").meta(databricksOptionMeta(databricksEnvironmentNames.configFile, false)),
|
|
70
|
+
clientId: databricksText("Databricks OAuth client ID.").meta(databricksOptionMeta(databricksEnvironmentNames.clientId, false)),
|
|
71
|
+
clientSecret: databricksText("Databricks OAuth client secret.").meta(databricksOptionMeta(databricksEnvironmentNames.clientSecret, false)),
|
|
72
|
+
accessToken: databricksText("Databricks access token.").meta(databricksOptionMeta(databricksEnvironmentNames.accessToken, false)),
|
|
73
|
+
groupId: databricksText("Databricks group ID.").meta(databricksOptionMeta(databricksEnvironmentNames.groupId, false)),
|
|
74
|
+
authType: databricksText("Databricks authentication type.").meta(databricksOptionMeta(databricksEnvironmentNames.authType, false)),
|
|
75
|
+
appName: databricksText("Databricks App name.").meta(databricksOptionMeta(databricksEnvironmentNames.appName, false)),
|
|
76
|
+
appPort: tcpPortSchema
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Databricks App port.")
|
|
79
|
+
.meta(databricksOptionMeta(databricksEnvironmentNames.appPort, false)),
|
|
80
|
+
lakebaseEndpoint: databricksText("Lakebase endpoint.").meta(databricksOptionMeta(databricksEnvironmentNames.lakebaseEndpoint, false)),
|
|
108
81
|
})
|
|
109
82
|
.strict()
|
|
110
83
|
.describe("Common Databricks CLI, SDK, Apps, and Lakebase options.");
|
|
111
84
|
/** Serialize complete parsed options as JSON keyed by flags or environment names. */
|
|
112
85
|
export function serializeOpts(schema, values, format) {
|
|
86
|
+
return JSON.stringify(serializedOpts(schema, values, format), null, 2);
|
|
87
|
+
}
|
|
88
|
+
/** Serialize complete parsed options as a process environment map. */
|
|
89
|
+
export function serializeOptsEnvironment(schema, values) {
|
|
90
|
+
return Object.fromEntries(Object.entries(serializedOpts(schema, values, "env")).map(([key, value]) => [
|
|
91
|
+
key,
|
|
92
|
+
environmentOptionValue(value),
|
|
93
|
+
]));
|
|
94
|
+
}
|
|
95
|
+
/** Namespace a reusable option schema so composed CLI flags render as `--<namespace>-<field>`. */
|
|
96
|
+
export function namespaceOpts(schema, prefix) {
|
|
97
|
+
const shape = Object.fromEntries(Object.entries(schema.shape).map(([key, field]) => [namespacedOptionKey(prefix, key), field]));
|
|
98
|
+
return z.object(shape).strict();
|
|
99
|
+
}
|
|
100
|
+
/** Parse namespaced option values back through their owning schema. */
|
|
101
|
+
export function unnamespaceOpts(schema, values, prefix) {
|
|
102
|
+
const source = values;
|
|
103
|
+
return schema.parse(Object.fromEntries(Object.keys(schema.shape).map((key) => [key, source[namespacedOptionKey(prefix, key)]])));
|
|
104
|
+
}
|
|
105
|
+
function namespacedOptionKey(prefix, key) {
|
|
106
|
+
return `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;
|
|
107
|
+
}
|
|
108
|
+
function serializedOpts(schema, values, format) {
|
|
113
109
|
const parsed = schema.parse(values);
|
|
114
110
|
const entries = optionProperties(schema).flatMap((property) => {
|
|
115
111
|
if (format === "flag" && property.flag === false)
|
|
@@ -122,7 +118,7 @@ export function serializeOpts(schema, values, format) {
|
|
|
122
118
|
const value = parsed[property.key];
|
|
123
119
|
return value === undefined ? [] : [[key, serializedOptionValue(value)]];
|
|
124
120
|
});
|
|
125
|
-
return
|
|
121
|
+
return Object.fromEntries(entries);
|
|
126
122
|
}
|
|
127
123
|
const optionalText = (description, env) => z.string().trim().min(1).optional().describe(description).meta({ env, flag: false });
|
|
128
124
|
export const LakebaseOptionsSchema = z
|
|
@@ -137,50 +133,90 @@ export function parseOpts(schema, flags = null, environment = null) {
|
|
|
137
133
|
const parsed = schema.parse(configured);
|
|
138
134
|
return Object.fromEntries(Object.keys(configured).map((key) => [key, parsed[key]]));
|
|
139
135
|
}
|
|
140
|
-
/** Build a listener
|
|
136
|
+
/** Build a transport-aware listener schema. Bare addresses use the configured default scheme. */
|
|
141
137
|
export function listenAddressSchema(options) {
|
|
142
138
|
const defaults = {
|
|
139
|
+
scheme: "tcp",
|
|
143
140
|
host: options.host ?? "localhost",
|
|
144
141
|
port: options.port,
|
|
145
142
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
143
|
+
const allowed = new Set(options.schemes ?? ["tcp"]);
|
|
144
|
+
const schema = z
|
|
145
|
+
.preprocess((value) => parseListenAddress(value, defaults, options.scheme ?? "tcp"), z.discriminatedUnion("scheme", [
|
|
146
|
+
z
|
|
147
|
+
.object({
|
|
148
|
+
scheme: z.literal("tcp"),
|
|
149
|
+
host: z.string().trim().toLowerCase().min(1).default(defaults.host),
|
|
150
|
+
port: tcpPortOrZeroSchema.default(defaults.port),
|
|
151
|
+
})
|
|
152
|
+
.strict(),
|
|
153
|
+
z
|
|
154
|
+
.object({
|
|
155
|
+
scheme: z.literal("unix"),
|
|
156
|
+
path: z.string().trim().min(1),
|
|
157
|
+
})
|
|
158
|
+
.strict(),
|
|
159
|
+
]))
|
|
160
|
+
.refine((address) => allowed.has(address.scheme), "Listener scheme is not allowed.")
|
|
161
|
+
.refine((address) => address.scheme !== "tcp" || !options.loopback || isLoopbackHost(address.host), "Listener host must be loopback.")
|
|
162
|
+
.describe("TCP or Unix-domain listener address.");
|
|
163
|
+
return options.withDefault === false ? schema : schema.default(defaults);
|
|
156
164
|
}
|
|
157
|
-
/** Render a listener address as `
|
|
165
|
+
/** Render a listener address as a `tcp://` or `unix://` URL. */
|
|
158
166
|
export function formatListenAddress(address) {
|
|
167
|
+
if (address.scheme === "unix") {
|
|
168
|
+
return `unix://${address.path.startsWith("/") ? "" : "/"}${address.path}`;
|
|
169
|
+
}
|
|
159
170
|
const host = address.host.includes(":") ? `[${address.host}]` : address.host;
|
|
160
|
-
return
|
|
171
|
+
return `tcp://${host}:${address.port}`;
|
|
161
172
|
}
|
|
162
|
-
function parseListenAddress(value, defaults) {
|
|
163
|
-
if (
|
|
164
|
-
|
|
173
|
+
function parseListenAddress(value, defaults, defaultScheme) {
|
|
174
|
+
if (isRecord(value) && value.scheme === undefined) {
|
|
175
|
+
if (typeof value.host === "string" && value.port !== undefined) {
|
|
176
|
+
return { ...value, scheme: "tcp" };
|
|
177
|
+
}
|
|
178
|
+
if (typeof value.path === "string") {
|
|
179
|
+
return { ...value, scheme: "unix" };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (typeof value === "number") {
|
|
183
|
+
return defaultScheme === "tcp"
|
|
184
|
+
? { scheme: "tcp", host: defaults.host, port: value }
|
|
185
|
+
: { scheme: "unix", path: String(value) };
|
|
186
|
+
}
|
|
165
187
|
if (typeof value !== "string")
|
|
166
188
|
return value;
|
|
167
189
|
const text = value.trim();
|
|
168
|
-
if (
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const
|
|
190
|
+
if (text.startsWith("unix://")) {
|
|
191
|
+
const path = text.slice("unix://".length);
|
|
192
|
+
return { scheme: "unix", path: path.startsWith("/") ? path : `/${path}` };
|
|
193
|
+
}
|
|
194
|
+
const tcp = text.startsWith("tcp://") ? text.slice("tcp://".length) : text;
|
|
195
|
+
if (defaultScheme === "unix" && !text.startsWith("tcp://")) {
|
|
196
|
+
return { scheme: "unix", path: text };
|
|
197
|
+
}
|
|
198
|
+
if (/^\d+$/.test(tcp))
|
|
199
|
+
return { scheme: "tcp", host: defaults.host, port: tcp };
|
|
200
|
+
if (/^:\d+$/.test(tcp)) {
|
|
201
|
+
return { scheme: "tcp", host: defaults.host, port: tcp.slice(1) };
|
|
202
|
+
}
|
|
203
|
+
const bracketed = tcp.match(/^\[([^\]]+)\](?::(\d+))?$/);
|
|
173
204
|
if (bracketed) {
|
|
174
|
-
return {
|
|
205
|
+
return {
|
|
206
|
+
scheme: "tcp",
|
|
207
|
+
host: bracketed[1],
|
|
208
|
+
port: bracketed[2] ?? defaults.port,
|
|
209
|
+
};
|
|
175
210
|
}
|
|
176
|
-
const separator =
|
|
177
|
-
if (separator > 0 && !
|
|
211
|
+
const separator = tcp.lastIndexOf(":");
|
|
212
|
+
if (separator > 0 && !tcp.slice(0, separator).includes(":")) {
|
|
178
213
|
return {
|
|
179
|
-
|
|
180
|
-
|
|
214
|
+
scheme: "tcp",
|
|
215
|
+
host: tcp.slice(0, separator),
|
|
216
|
+
port: tcp.slice(separator + 1),
|
|
181
217
|
};
|
|
182
218
|
}
|
|
183
|
-
return { host:
|
|
219
|
+
return { scheme: "tcp", host: tcp || defaults.host, port: defaults.port };
|
|
184
220
|
}
|
|
185
221
|
function optionProperties(schema) {
|
|
186
222
|
const document = z.toJSONSchema(schema);
|
|
@@ -202,11 +238,23 @@ function optionProperties(schema) {
|
|
|
202
238
|
});
|
|
203
239
|
}
|
|
204
240
|
function serializedOptionValue(value) {
|
|
205
|
-
if (isRecord(value) &&
|
|
206
|
-
|
|
241
|
+
if (isRecord(value) && value.scheme === "tcp") {
|
|
242
|
+
if (typeof value.host === "string" && typeof value.port === "number") {
|
|
243
|
+
return formatListenAddress({ scheme: "tcp", host: value.host, port: value.port });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (isRecord(value) && value.scheme === "unix" && typeof value.path === "string") {
|
|
247
|
+
return formatListenAddress({ scheme: "unix", path: value.path });
|
|
207
248
|
}
|
|
208
249
|
return value;
|
|
209
250
|
}
|
|
251
|
+
function environmentOptionValue(value) {
|
|
252
|
+
if (Array.isArray(value))
|
|
253
|
+
return value.map(String).join(",");
|
|
254
|
+
if (typeof value === "object" && value !== null)
|
|
255
|
+
return JSON.stringify(value);
|
|
256
|
+
return String(value);
|
|
257
|
+
}
|
|
210
258
|
function optionValues(schema, values, environment) {
|
|
211
259
|
const document = z.toJSONSchema(schema);
|
|
212
260
|
const properties = isRecord(document.properties) ? document.properties : {};
|
|
@@ -259,4 +307,4 @@ function normalizeUrl(value) {
|
|
|
259
307
|
const normalized = url.toString();
|
|
260
308
|
return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
|
|
261
309
|
}
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0UsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxD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QUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBvcHRpb24gcHJpbWl0aXZlcyBzaGFyZWQgYWNyb3NzIGRieC10b29scyBwYWNrYWdlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGlzTG9vcGJhY2tIb3N0LCB1cmxCdWlsZGVyIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyBpc1JlY29yZCwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRvSWRlbnRpZmllcldpdGhPcHRpb25zLCB0b1NsdWcgfSBmcm9tIFwiLi9zdHJpbmctdXRpbHMudHNcIjtcblxuY29uc3QgZW52aXJvbm1lbnROYW1lID0gPFQgZXh0ZW5kcyBzdHJpbmc+KG5hbWU6IFQsIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHoubGl0ZXJhbChuYW1lKS5kZWZhdWx0KG5hbWUpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFXCIsIFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZSBlbnZpcm9ubWVudC5cIiksXG4gICAgaG9zdDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19IT1NUXCIsIFwiRGF0YWJyaWNrcyBob3N0IGVudmlyb25tZW50LlwiKSxcbiAgICBhY2NvdW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiLCBcIkRhdGFicmlja3MgYWNjb3VudCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgd29ya3NwYWNlSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfV09SS1NQQUNFX0lEXCIsIFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNvbmZpZ0ZpbGU6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DT05GSUdfRklMRVwiLFxuICAgICAgXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZSBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGNsaWVudElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiLCBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICBjbGllbnRTZWNyZXQ6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DTElFTlRfU0VDUkVUXCIsXG4gICAgICBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IHNlY3JldCBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX1RPS0VOXCIsIFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4gZW52aXJvbm1lbnQuXCIpLFxuICAgIGdyb3VwSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfR1JPVVBfSURcIiwgXCJEYXRhYnJpY2tzIGdyb3VwIElEIGVudmlyb25tZW50LlwiKSxcbiAgICBhdXRoVHlwZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BVVRIX1RZUEVcIiwgXCJEYXRhYnJpY2tzIGF1dGggdHlwZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwTmFtZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfTkFNRVwiLCBcIkRhdGFicmlja3MgQXBwIG5hbWUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFwcFBvcnQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVBQX1BPUlRcIiwgXCJEYXRhYnJpY2tzIEFwcCBwb3J0IGVudmlyb25tZW50LlwiKSxcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBlbnZpcm9ubWVudE5hbWUoXCJMQUtFQkFTRV9FTkRQT0lOVFwiLCBcIkxha2ViYXNlIGVuZHBvaW50IGVudmlyb25tZW50LlwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNhbm9uaWNhbCBEYXRhYnJpY2tzIENMSSwgU0RLLCBBcHBzLCBhbmQgTGFrZWJhc2UgZW52aXJvbm1lbnQgbmFtZXMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IHoub3V0cHV0PHR5cGVvZiBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYT47XG5cbi8qKiBDYW5vbmljYWwgRGF0YWJyaWNrcyBlbnZpcm9ubWVudCBuYW1lcyBkZXJpdmVkIGZyb20gdGhlIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgY29uc3QgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMgPSBPYmplY3QuZnJlZXplKERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hLnBhcnNlKHt9KSk7XG5cbi8qKiBIaWdoZXN0IHZhbGlkIFRDUCBwb3J0IG51bWJlci4gKi9cbmV4cG9ydCBjb25zdCBNQVhfVENQX1BPUlQgPSA2NV81MzU7XG5cbmV4cG9ydCBjb25zdCB0Y3BQb3J0U2NoZW1hID0gei5jb2VyY2VcbiAgLm51bWJlcjxudW1iZXI+KClcbiAgLmludCgpXG4gIC5taW4oMSlcbiAgLm1heChNQVhfVENQX1BPUlQpXG4gIC5kZXNjcmliZShcIlRDUCBwb3J0IGZyb20gMSB0aHJvdWdoIDY1NTM1LlwiKTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRPclplcm9TY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigwKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAwIHRocm91Z2ggNjU1MzUsIHdoZXJlIHplcm8gcmVxdWVzdHMgYXV0b21hdGljIGFsbG9jYXRpb24uXCIpO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplZFVybFNjaGVtYSA9IHpcbiAgLnN0cmluZygpXG4gIC50cmltKClcbiAgLm1pbigxKVxuICAucmVmaW5lKCh2YWx1ZSkgPT4gdXJsQnVpbGRlcih2YWx1ZSkgIT09IHVuZGVmaW5lZCwge1xuICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgYSB2YWxpZCBVUkwgb3IgaG9zdC5cIixcbiAgfSlcbiAgLm92ZXJ3cml0ZShub3JtYWxpemVVcmwpXG4gIC5kZXNjcmliZShcIlVSTCBub3JtYWxpemVkIHRocm91Z2ggdGhlIHNoYXJlZCBVUkwgYnVpbGRlci5cIik7XG5cbmNvbnN0IGRhdGFicmlja3NUZXh0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIHByb2ZpbGUuXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5wcm9maWxlLFxuICAgIH0pLFxuICAgIGhvc3Q6IG5vcm1hbGl6ZWRVcmxTY2hlbWFcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGhvc3QuXCIpXG4gICAgICAubWV0YSh7IGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuaG9zdCwgZmxhZzogZmFsc2UgfSksXG4gICAgYWNjb3VudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjb3VudCBJRC5cIikubWV0YSh7XG4gICAgICBlbnY6IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY291bnRJZCxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIHdvcmtzcGFjZUlkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3Mgd29ya3NwYWNlIElELlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMud29ya3NwYWNlSWQsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBjb25maWdGaWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIGNvbmZpZyBmaWxlLlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY29uZmlnRmlsZSxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGNsaWVudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElELlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50SWQsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBjbGllbnRTZWNyZXQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0LlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50U2VjcmV0LFxuICAgICAgZmxhZzogZmFsc2UsXG4gICAgfSksXG4gICAgYWNjZXNzVG9rZW46IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4uXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hY2Nlc3NUb2tlbixcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGdyb3VwSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBncm91cCBJRC5cIikubWV0YSh7XG4gICAgICBlbnY6IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmdyb3VwSWQsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBhdXRoVHlwZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIHR5cGUuXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hdXRoVHlwZSxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGFwcE5hbWU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBBcHAgbmFtZS5cIikubWV0YSh7XG4gICAgICBlbnY6IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcE5hbWUsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBhcHBQb3J0OiB0Y3BQb3J0U2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEFwcCBwb3J0LlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYXBwUG9ydCxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGRhdGFicmlja3NUZXh0KFwiTGFrZWJhc2UgZW5kcG9pbnQuXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICAgZmxhZzogZmFsc2UsXG4gICAgfSksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gRGF0YWJyaWNrcyBDTEksIFNESywgQXBwcywgYW5kIExha2ViYXNlIG9wdGlvbnMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIERhdGFicmlja3NPcHRpb25zU2NoZW1hPjtcblxuLyoqIEtleSBmb3JtYXQgZW1pdHRlZCBieSB7QGxpbmsgc2VyaWFsaXplT3B0c30uICovXG5leHBvcnQgdHlwZSBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0ID0gXCJmbGFnXCIgfCBcImVudlwiO1xuXG5pbnRlcmZhY2UgT3B0aW9uUHJvcGVydHkge1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGZsYWc/OiBib29sZWFuO1xufVxuXG4vKiogU2VyaWFsaXplIGNvbXBsZXRlIHBhcnNlZCBvcHRpb25zIGFzIEpTT04ga2V5ZWQgYnkgZmxhZ3Mgb3IgZW52aXJvbm1lbnQgbmFtZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogei5pbnB1dDx6LlpvZE9iamVjdDxUPj4sXG4gIGZvcm1hdDogT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5wYXJzZSh2YWx1ZXMpIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgY29uc3QgZW50cmllcyA9IG9wdGlvblByb3BlcnRpZXMoc2NoZW1hKS5mbGF0TWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgIGlmIChmb3JtYXQgPT09IFwiZmxhZ1wiICYmIHByb3BlcnR5LmZsYWcgPT09IGZhbHNlKSByZXR1cm4gW107XG4gICAgY29uc3Qga2V5ID1cbiAgICAgIGZvcm1hdCA9PT0gXCJmbGFnXCJcbiAgICAgICAgPyBgLS0ke3RvU2x1Zyhwcm9wZXJ0eS5rZXkpfWBcbiAgICAgICAgOiAob3B0aW9uRW52aXJvbm1lbnROYW1lcyhwcm9wZXJ0eS5rZXksIHByb3BlcnR5LmVudilbMF0gPz8gXCJcIik7XG4gICAgaWYgKCFrZXkpIHJldHVybiBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlZFtwcm9wZXJ0eS5rZXldO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gW10gOiBbW2tleSwgc2VyaWFsaXplZE9wdGlvblZhbHVlKHZhbHVlKV0gYXMgY29uc3RdO1xuICB9KTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSwgbnVsbCwgMik7XG59XG5cbmNvbnN0IG9wdGlvbmFsVGV4dCA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCBlbnY6IHN0cmluZykgPT5cbiAgei5zdHJpbmcoKS50cmltKCkubWluKDEpLm9wdGlvbmFsKCkuZGVzY3JpYmUoZGVzY3JpcHRpb24pLm1ldGEoeyBlbnYsIGZsYWc6IGZhbHNlIH0pO1xuXG5leHBvcnQgY29uc3QgTGFrZWJhc2VPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBvcHRpb25hbFRleHQoXG4gICAgICBcIkxha2ViYXNlIHByb2plY3QsIHJlc291cmNlIHBhdGgsIGhvc3QsIG9yIFVSTC5cIixcbiAgICAgIGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsXG4gICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNvbW1vbiBMYWtlYmFzZSBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgTGFrZWJhc2VPcHRpb25zID0gei5pbnB1dDx0eXBlb2YgTGFrZWJhc2VPcHRpb25zU2NoZW1hPjtcblxuLyoqIEV4cGxpY2l0IG9wdGlvbiB2YWx1ZXMgb3IgZW52aXJvbm1lbnQgZW50cmllcyBjb25zdW1lZCBieSBvcHRpb24gcGFyc2luZyBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uVmFsdWVNYXAgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCBudWxsO1xuXG4vKiogUGFyc2Ugb25seSBzdXBwbGllZCBmbGFnIGFuZCBlbnZpcm9ubWVudCB2YWx1ZXMgdGhyb3VnaCBhbiBvd25pbmcgWm9kIG9iamVjdCBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgZmxhZ3M6IE9wdGlvblZhbHVlTWFwID0gbnVsbCxcbiAgZW52aXJvbm1lbnQ6IE9wdGlvblZhbHVlTWFwID0gbnVsbCxcbik6IFBhcnRpYWw8ei5vdXRwdXQ8ei5ab2RPYmplY3Q8VD4+PiB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBvcHRpb25WYWx1ZXMoc2NoZW1hLCBmbGFncywgZW52aXJvbm1lbnQpO1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEucGFyc2UoY29uZmlndXJlZCk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmtleXMoY29uZmlndXJlZCkubWFwKChrZXkpID0+IFtrZXksIHBhcnNlZFtrZXkgYXMga2V5b2YgdHlwZW9mIHBhcnNlZF1dKSxcbiAgKSBhcyBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj47XG59XG5cbi8qKiBIb3N0IGFuZCBUQ1AgcG9ydCByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3Mge1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHRzIGFuZCB2YWxpZGF0aW9uIHBvbGljeSBmb3Ige0BsaW5rIGxpc3RlbkFkZHJlc3NTY2hlbWF9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5BZGRyZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgcmVhZG9ubHkgbG9vcGJhY2s/OiBib29sZWFuO1xufVxuXG4vKiogQnVpbGQgYSBsaXN0ZW5lciBhZGRyZXNzIHNjaGVtYSBhY2NlcHRpbmcgYSBwb3J0LCBgOnBvcnRgLCBgaG9zdDpwb3J0YCwgb3Igb2JqZWN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEob3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdHM6IExpc3RlbkFkZHJlc3MgPSB7XG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICByZXR1cm4gelxuICAgIC5wcmVwcm9jZXNzKFxuICAgICAgKHZhbHVlKSA9PiBwYXJzZUxpc3RlbkFkZHJlc3ModmFsdWUsIGRlZmF1bHRzKSxcbiAgICAgIHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgaG9zdDogei5zdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKS5taW4oMSkuZGVmYXVsdChkZWZhdWx0cy5ob3N0KSxcbiAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgIH0pXG4gICAgICAgIC5zdHJpY3QoKVxuICAgICAgICAucmVmaW5lKFxuICAgICAgICAgIChhZGRyZXNzKSA9PiAhb3B0aW9ucy5sb29wYmFjayB8fCBpc0xvb3BiYWNrSG9zdChhZGRyZXNzLmhvc3QpLFxuICAgICAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgICAgICApLFxuICAgIClcbiAgICAuZGVmYXVsdChkZWZhdWx0cylcbiAgICAuZGVzY3JpYmUoXCJMaXN0ZW5lciBob3N0IGFuZCBwb3J0LlwiKTtcbn1cblxuLyoqIFJlbmRlciBhIGxpc3RlbmVyIGFkZHJlc3MgYXMgYGhvc3Q6cG9ydGAsIHdpdGggSVB2NiBob3N0cyBicmFja2V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzOiBMaXN0ZW5BZGRyZXNzKTogc3RyaW5nIHtcbiAgY29uc3QgaG9zdCA9IGFkZHJlc3MuaG9zdC5pbmNsdWRlcyhcIjpcIikgPyBgWyR7YWRkcmVzcy5ob3N0fV1gIDogYWRkcmVzcy5ob3N0O1xuICByZXR1cm4gYCR7aG9zdH06JHthZGRyZXNzLnBvcnR9YDtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXN0ZW5BZGRyZXNzKHZhbHVlOiB1bmtub3duLCBkZWZhdWx0czogTGlzdGVuQWRkcmVzcyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4geyBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9O1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZS50cmltKCk7XG4gIGlmICgvXlxcZCskLy50ZXN0KHRleHQpKSByZXR1cm4geyBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0ZXh0IH07XG4gIGlmICgvXjpcXGQrJC8udGVzdCh0ZXh0KSkgcmV0dXJuIHsgaG9zdDogZGVmYXVsdHMuaG9zdCwgcG9ydDogdGV4dC5zbGljZSgxKSB9O1xuICBjb25zdCBicmFja2V0ZWQgPSB0ZXh0Lm1hdGNoKC9eXFxbKFteXFxdXSspXFxdKD86OihcXGQrKSk/JC8pO1xuICBpZiAoYnJhY2tldGVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogYnJhY2tldGVkWzFdLCBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRleHQubGFzdEluZGV4T2YoXCI6XCIpO1xuICBpZiAoc2VwYXJhdG9yID4gMCAmJiAhdGV4dC5zbGljZSgwLCBzZXBhcmF0b3IpLmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIHJldHVybiB7XG4gICAgICBob3N0OiB0ZXh0LnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0ZXh0LnNsaWNlKHNlcGFyYXRvciArIDEpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsgaG9zdDogdGV4dCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUuaG9zdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUucG9ydCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgaG9zdDogdmFsdWUuaG9zdCwgcG9ydDogdmFsdWUucG9ydCB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIG9wdGlvblZhbHVlczxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogT3B0aW9uVmFsdWVNYXAsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZG9jdW1lbnQgPSB6LnRvSlNPTlNjaGVtYShzY2hlbWEpO1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykgPyBkb2N1bWVudC5wcm9wZXJ0aWVzIDoge307XG4gIGNvbnN0IGNvbmZpZ3VyZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcHJvcGVydHldIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgaWYgKCFpc1JlY29yZChwcm9wZXJ0eSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4cGxpY2l0ID0gZmlyc3RPcHRpb25WYWx1ZSh2YWx1ZXMsIFtrZXksIGAtLSR7dG9TbHVnKGtleSl9YF0pO1xuICAgIGlmIChleHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWd1cmVkW2tleV0gPSBvcHRpb25FbnZpcm9ubWVudFZhbHVlKHByb3BlcnR5LnR5cGUsIGV4cGxpY2l0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5LCBwcm9wZXJ0eS5lbnYpO1xuICAgIGNvbnN0IHNvdXJjZWQgPSBmaXJzdE9wdGlvblZhbHVlKGVudmlyb25tZW50LCBuYW1lcyk7XG4gICAgaWYgKHNvdXJjZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBzb3VyY2VkKTtcbiAgfVxuICByZXR1cm4gY29uZmlndXJlZDtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnROYW1lcyhrZXk6IHN0cmluZywgY29uZmlndXJlZDogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcInN0cmluZ1wiKSByZXR1cm4gW2NvbmZpZ3VyZWRdO1xuICBpZiAoQXJyYXkuaXNBcnJheShjb25maWd1cmVkKSkge1xuICAgIHJldHVybiBjb25maWd1cmVkLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKTtcbiAgfVxuICByZXR1cm4gW3RvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgZGVsaW1pdGVyOiBcIl9cIiB9LCBrZXkpLnRvVXBwZXJDYXNlKCldO1xufVxuXG5mdW5jdGlvbiBvcHRpb25FbnZpcm9ubWVudFZhbHVlKHR5cGU6IHVua25vd24sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRvQm9vbGVhbih2YWx1ZSkgPz8gdmFsdWU7XG4gIGlmICh0eXBlID09PSBcImFycmF5XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcGFyc2VMaXN0KHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBmaXJzdE9wdGlvblZhbHVlKHNvdXJjZTogT3B0aW9uVmFsdWVNYXAsIGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gXCJcIikgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVybCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gdXJsQnVpbGRlcih2YWx1ZSk7XG4gIGlmICghdXJsKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB1cmwudG9TdHJpbmcoKTtcbiAgcmV0dXJuIHVybC5wYXRobmFtZSA9PT0gXCIvXCIgJiYgIXVybC5zZWFyY2ggJiYgIXVybC5oYXNoID8gbm9ybWFsaXplZC5zbGljZSgwLCAtMSkgOiBub3JtYWxpemVkO1xufVxuIl19
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0UsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixFQUFFLHNDQUFzQyxDQUFDO0lBQ3hGLE9BQU8sRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLENBQUM7SUFDbkYsUUFBUSxFQUFFLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxtQ0FBbUMsQ0FBQztJQUN0RixPQUFPLEVBQUUsZUFBZSxDQUFDLHFCQUFxQixFQUFFLGtDQUFrQyxDQUFDO0lBQ25GLE9BQU8sRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLENBQUM7SUFDbkYsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLGdDQUFnQyxDQUFDO0NBQ3pGLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsc0VBQXNFLENBQUMsQ0FBQztBQUlwRiw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUVuQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU07S0FDbEMsTUFBTSxFQUFVO0tBQ2hCLEdBQUcsRUFBRTtLQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixHQUFHLENBQUMsWUFBWSxDQUFDO0tBQ2pCLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxNQUFNO0tBQ3hDLE1BQU0sRUFBVTtLQUNoQixHQUFHLEVBQUU7S0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ04sR0FBRyxDQUFDLFlBQVksQ0FBQztLQUNqQixRQUFRLENBQUMsMEVBQTBFLENBQUMsQ0FBQztBQUV4RixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDO0tBQ2pDLE1BQU0sRUFBRTtLQUNSLElBQUksRUFBRTtLQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUU7SUFDbEQsT0FBTyxFQUFFLCtCQUErQjtDQUN6QyxDQUFDO0tBQ0QsU0FBUyxDQUFDLFlBQVksQ0FBQztLQUN2QixRQUFRLENBQUMsZ0RBQWdELENBQUMsQ0FBQztBQUU5RCxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUM3QyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1RCxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsR0FBRztJQUNILElBQUk7SUFDSixXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxjQUFjLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQ3JELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUN6RDtJQUNELElBQUksRUFBRSxtQkFBbUI7U0FDdEIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1NBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsU0FBUyxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FDdEQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUNsRTtJQUNELFdBQVcsRUFBRSxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQzFELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FDcEU7SUFDRCxVQUFVLEVBQUUsY0FBYyxDQUFDLDZCQUE2QixDQUFDLENBQUMsSUFBSSxDQUM1RCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQ25FO0lBQ0QsUUFBUSxFQUFFLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLElBQUksQ0FDMUQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUNqRTtJQUNELFlBQVksRUFBRSxjQUFjLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQ2xFLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FDckU7SUFDRCxXQUFXLEVBQUUsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUMxRCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQ3BFO0lBQ0QsT0FBTyxFQUFFLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FDbEQsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUNoRTtJQUNELFFBQVEsRUFBRSxjQUFjLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQzlELG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FDakU7SUFDRCxPQUFPLEVBQUUsY0FBYyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUNsRCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQ2hFO0lBQ0QsT0FBTyxFQUFFLGFBQWE7U0FDbkIsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1NBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUN6RCxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FDekU7Q0FDRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFtQnZFLHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUFzQixFQUN0QixNQUErQixFQUMvQixNQUFpQztJQUVqQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxNQUFzQixFQUN0QixNQUErQjtJQUUvQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUUsR0FBRztRQUNILHNCQUFzQixDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxrR0FBa0c7QUFDbEcsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsTUFBc0IsRUFDdEIsTUFBYztJQUVkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQzlCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUM5RixDQUFDO0lBQ0YsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBbUQsQ0FBQztBQUNuRixDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxlQUFlLENBQzdCLE1BQXNCLEVBQ3RCLE1BQWMsRUFDZCxNQUFjO0lBRWQsTUFBTSxNQUFNLEdBQUcsTUFBMkMsQ0FBQztJQUMzRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQ2pCLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEYsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsTUFBYyxFQUFFLEdBQVc7SUFDdEQsT0FBTyxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQ3JCLE1BQXNCLEVBQ3RCLE1BQStCLEVBQy9CLE1BQWlDO0lBRWpDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFzQyxDQUFDO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQzVELElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FDUCxNQUFNLEtBQUssTUFBTTtZQUNmLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFVLENBQUMsQ0FBQztJQUNuRixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxXQUFtQixFQUFFLEdBQVcsRUFBRSxFQUFFLENBQ3hELENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUV2RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDO0tBQ25DLE1BQU0sQ0FBQztJQUNOLGdCQUFnQixFQUFFLFlBQVksQ0FDNUIsZ0RBQWdELEVBQ2hELDBCQUEwQixDQUFDLGdCQUFnQixDQUM1QztDQUNGLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQU94QywyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsTUFBc0IsRUFDdEIsUUFBd0IsSUFBSSxFQUM1QixjQUE4QixJQUFJO0lBRWxDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQTBCLENBQUMsQ0FBQyxDQUFDLENBQzNDLENBQUM7QUFDekMsQ0FBQztBQXFERCxpR0FBaUc7QUFDakcsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxPQUE2QjtJQUU3QixNQUFNLFFBQVEsR0FBcUI7UUFDakMsTUFBTSxFQUFFLEtBQUs7UUFDYixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXO1FBQ2pDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtLQUNuQixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQWUsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsQ0FBQztTQUNiLFVBQVUsQ0FDVCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUN2RSxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO1FBQzdCLENBQUM7YUFDRSxNQUFNLENBQUM7WUFDTixNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDeEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbkUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ2pELENBQUM7YUFDRCxNQUFNLEVBQUU7UUFDWCxDQUFDO2FBQ0UsTUFBTSxDQUFDO1lBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3pCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMvQixDQUFDO2FBQ0QsTUFBTSxFQUFFO0tBQ1osQ0FBQyxDQUNIO1NBQ0EsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQztTQUNuRixNQUFNLENBQ0wsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUMxRixpQ0FBaUMsQ0FDbEM7U0FDQSxRQUFRLENBQUMsc0NBQXNDLENBQXNDLENBQUM7SUFDekYsT0FBTyxPQUFPLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxnRUFBZ0U7QUFDaEUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE9BQXNCO0lBQ3hELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QixPQUFPLFVBQVUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzdFLE9BQU8sU0FBUyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUN6QixLQUFjLEVBQ2QsUUFBMEIsRUFDMUIsYUFBMkI7SUFFM0IsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsRCxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvRCxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLGFBQWEsS0FBSyxLQUFLO1lBQzVCLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUNyRCxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxJQUFJLGFBQWEsS0FBSyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2hGLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN6RCxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSTtTQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztZQUM3QixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQy9CLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBa0M7SUFDMUQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM5QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7UUFDbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNoQyxPQUFPO1lBQ0w7Z0JBQ0UsR0FBRztnQkFDSCxJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDN0QsR0FBRyxFQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUN2RCxDQUFDLENBQUUsS0FBSyxDQUFDLEdBQWtDO29CQUMzQyxDQUFDLENBQUMsU0FBUztnQkFDZixJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUzthQUMvRDtTQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQWM7SUFDM0MsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNqRixPQUFPLG1CQUFtQixDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYztJQUM1QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLE1BQXNCLEVBQ3RCLE1BQXNCLEVBQ3RCLFdBQTJCO0lBRTNCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLE1BQU0sVUFBVSxHQUE0QixFQUFFLENBQUM7SUFDL0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUFFLFNBQVM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsSUFBSSxPQUFPLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDcEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEdBQVcsRUFBRSxVQUFtQjtJQUM5RCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLElBQWEsRUFBRSxLQUFjO0lBQzNELElBQUksSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDekQsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQXNCLEVBQUUsSUFBdUI7SUFDdkUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEMsT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDakcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIG9wdGlvbiBwcmltaXRpdmVzIHNoYXJlZCBhY3Jvc3MgZGJ4LXRvb2xzIHBhY2thZ2VzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgaXNMb29wYmFja0hvc3QsIHVybEJ1aWxkZXIgfSBmcm9tIFwiLi9uZXQudHNcIjtcbmltcG9ydCB7IGlzUmVjb3JkLCB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcbmltcG9ydCB7IHBhcnNlTGlzdCwgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMsIHRvU2x1ZyB9IGZyb20gXCIuL3N0cmluZy11dGlscy50c1wiO1xuXG5jb25zdCBlbnZpcm9ubWVudE5hbWUgPSA8VCBleHRlbmRzIHN0cmluZz4obmFtZTogVCwgZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5saXRlcmFsKG5hbWUpLmRlZmF1bHQobmFtZSkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEVcIiwgXCJEYXRhYnJpY2tzIENMSSBwcm9maWxlIGVudmlyb25tZW50LlwiKSxcbiAgICBob3N0OiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0hPU1RcIiwgXCJEYXRhYnJpY2tzIGhvc3QgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFjY291bnRJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BQ0NPVU5UX0lEXCIsIFwiRGF0YWJyaWNrcyBhY2NvdW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICB3b3Jrc3BhY2VJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIiwgXCJEYXRhYnJpY2tzIHdvcmtzcGFjZSBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgY29uZmlnRmlsZTogZW52aXJvbm1lbnROYW1lKFxuICAgICAgXCJEQVRBQlJJQ0tTX0NPTkZJR19GSUxFXCIsXG4gICAgICBcIkRhdGFicmlja3MgQ0xJIGNvbmZpZyBmaWxlIGVudmlyb25tZW50LlwiLFxuICAgICksXG4gICAgY2xpZW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQ0xJRU5UX0lEXCIsIFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNsaWVudFNlY3JldDogZW52aXJvbm1lbnROYW1lKFxuICAgICAgXCJEQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVRcIixcbiAgICAgIFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0IGVudmlyb25tZW50LlwiLFxuICAgICksXG4gICAgYWNjZXNzVG9rZW46IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfVE9LRU5cIiwgXCJEYXRhYnJpY2tzIGFjY2VzcyB0b2tlbiBlbnZpcm9ubWVudC5cIiksXG4gICAgZ3JvdXBJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19HUk9VUF9JRFwiLCBcIkRhdGFicmlja3MgZ3JvdXAgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGF1dGhUeXBlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FVVEhfVFlQRVwiLCBcIkRhdGFicmlja3MgYXV0aCB0eXBlIGVudmlyb25tZW50LlwiKSxcbiAgICBhcHBOYW1lOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FQUF9OQU1FXCIsIFwiRGF0YWJyaWNrcyBBcHAgbmFtZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwUG9ydDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfUE9SVFwiLCBcIkRhdGFicmlja3MgQXBwIHBvcnQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGVudmlyb25tZW50TmFtZShcIkxBS0VCQVNFX0VORFBPSU5UXCIsIFwiTGFrZWJhc2UgZW5kcG9pbnQgZW52aXJvbm1lbnQuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ2Fub25pY2FsIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBlbnZpcm9ubWVudCBuYW1lcy5cIik7XG5cbmV4cG9ydCB0eXBlIERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzID0gei5vdXRwdXQ8dHlwZW9mIERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hPjtcblxuLyoqIENhbm9uaWNhbCBEYXRhYnJpY2tzIGVudmlyb25tZW50IG5hbWVzIGRlcml2ZWQgZnJvbSB0aGUgb3duaW5nIHNjaGVtYS4gKi9cbmV4cG9ydCBjb25zdCBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IE9iamVjdC5mcmVlemUoRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEucGFyc2Uoe30pKTtcblxuLyoqIEhpZ2hlc3QgdmFsaWQgVENQIHBvcnQgbnVtYmVyLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UQ1BfUE9SVCA9IDY1XzUzNTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRTY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigxKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAxIHRocm91Z2ggNjU1MzUuXCIpO1xuXG5leHBvcnQgY29uc3QgdGNwUG9ydE9yWmVyb1NjaGVtYSA9IHouY29lcmNlXG4gIC5udW1iZXI8bnVtYmVyPigpXG4gIC5pbnQoKVxuICAubWluKDApXG4gIC5tYXgoTUFYX1RDUF9QT1JUKVxuICAuZGVzY3JpYmUoXCJUQ1AgcG9ydCBmcm9tIDAgdGhyb3VnaCA2NTUzNSwgd2hlcmUgemVybyByZXF1ZXN0cyBhdXRvbWF0aWMgYWxsb2NhdGlvbi5cIik7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVkVXJsU2NoZW1hID0gelxuICAuc3RyaW5nKClcbiAgLnRyaW0oKVxuICAubWluKDEpXG4gIC5yZWZpbmUoKHZhbHVlKSA9PiB1cmxCdWlsZGVyKHZhbHVlKSAhPT0gdW5kZWZpbmVkLCB7XG4gICAgbWVzc2FnZTogXCJFeHBlY3RlZCBhIHZhbGlkIFVSTCBvciBob3N0LlwiLFxuICB9KVxuICAub3ZlcndyaXRlKG5vcm1hbGl6ZVVybClcbiAgLmRlc2NyaWJlKFwiVVJMIG5vcm1hbGl6ZWQgdGhyb3VnaCB0aGUgc2hhcmVkIFVSTCBidWlsZGVyLlwiKTtcblxuY29uc3QgZGF0YWJyaWNrc1RleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5zdHJpbmcoKS50cmltKCkubWluKDEpLm9wdGlvbmFsKCkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuY29uc3QgZGF0YWJyaWNrc09wdGlvbk1ldGEgPSAoZW52OiBzdHJpbmcsIGZsYWcgPSB0cnVlKSA9PiAoe1xuICBlbnYsXG4gIGZsYWcsXG4gIGhlbHBEZWZhdWx0OiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLnByb2ZpbGUpLFxuICAgICksXG4gICAgaG9zdDogbm9ybWFsaXplZFVybFNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkRhdGFicmlja3MgaG9zdC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmhvc3QsIGZhbHNlKSksXG4gICAgYWNjb3VudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjb3VudCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY291bnRJZCwgZmFsc2UpLFxuICAgICksXG4gICAgd29ya3NwYWNlSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy53b3Jrc3BhY2VJZCwgZmFsc2UpLFxuICAgICksXG4gICAgY29uZmlnRmlsZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNvbmZpZ0ZpbGUsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50SWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudFNlY3JldDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBzZWNyZXQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jbGllbnRTZWNyZXQsIGZhbHNlKSxcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjZXNzIHRva2VuLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYWNjZXNzVG9rZW4sIGZhbHNlKSxcbiAgICApLFxuICAgIGdyb3VwSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBncm91cCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmdyb3VwSWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGF1dGhUeXBlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYXV0aGVudGljYXRpb24gdHlwZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmF1dGhUeXBlLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBOYW1lOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQXBwIG5hbWUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hcHBOYW1lLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBQb3J0OiB0Y3BQb3J0U2NoZW1hXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBBcHAgcG9ydC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcFBvcnQsIGZhbHNlKSksXG4gICAgbGFrZWJhc2VFbmRwb2ludDogZGF0YWJyaWNrc1RleHQoXCJMYWtlYmFzZSBlbmRwb2ludC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsIGZhbHNlKSxcbiAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ29tbW9uIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc09wdGlvbnMgPSB6LmlucHV0PHR5cGVvZiBEYXRhYnJpY2tzT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBLZXkgZm9ybWF0IGVtaXR0ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZU9wdHN9LiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCA9IFwiZmxhZ1wiIHwgXCJlbnZcIjtcblxuLyoqIE5hbWVzcGFjZSBldmVyeSBvcHRpb24gZmllbGQgd2hpbGUgcmV0YWluaW5nIGl0cyBvd25pbmcgWm9kIGZpZWxkIHNjaGVtYXMuICovXG5leHBvcnQgdHlwZSBOYW1lc3BhY2VkT3B0aW9uU2hhcGU8VCBleHRlbmRzIHouWm9kUmF3U2hhcGUsIFByZWZpeCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVCBhcyBLZXkgZXh0ZW5kcyBzdHJpbmcgPyBgJHtQcmVmaXh9JHtDYXBpdGFsaXplPEtleT59YCA6IG5ldmVyXTogVFtLZXldO1xufTtcblxuaW50ZXJmYWNlIE9wdGlvblByb3BlcnR5IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBmbGFnPzogYm9vbGVhbjtcbn1cblxuLyoqIFNlcmlhbGl6ZSBjb21wbGV0ZSBwYXJzZWQgb3B0aW9ucyBhcyBKU09OIGtleWVkIGJ5IGZsYWdzIG9yIGVudmlyb25tZW50IG5hbWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9wdHM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IHouaW5wdXQ8ei5ab2RPYmplY3Q8VD4+LFxuICBmb3JtYXQ6IE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE9wdHMoc2NoZW1hLCB2YWx1ZXMsIGZvcm1hdCksIG51bGwsIDIpO1xufVxuXG4vKiogU2VyaWFsaXplIGNvbXBsZXRlIHBhcnNlZCBvcHRpb25zIGFzIGEgcHJvY2VzcyBlbnZpcm9ubWVudCBtYXAuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT3B0c0Vudmlyb25tZW50PFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhzZXJpYWxpemVkT3B0cyhzY2hlbWEsIHZhbHVlcywgXCJlbnZcIikpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICBrZXksXG4gICAgICBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlKSxcbiAgICBdKSxcbiAgKTtcbn1cblxuLyoqIE5hbWVzcGFjZSBhIHJldXNhYmxlIG9wdGlvbiBzY2hlbWEgc28gY29tcG9zZWQgQ0xJIGZsYWdzIHJlbmRlciBhcyBgLS08bmFtZXNwYWNlPi08ZmllbGQ+YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlLCBQcmVmaXggZXh0ZW5kcyBzdHJpbmc+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICBwcmVmaXg6IFByZWZpeCxcbik6IHouWm9kT2JqZWN0PE5hbWVzcGFjZWRPcHRpb25TaGFwZTxULCBQcmVmaXg+PiB7XG4gIGNvbnN0IHNoYXBlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5zaGFwZSkubWFwKChba2V5LCBmaWVsZF0pID0+IFtuYW1lc3BhY2VkT3B0aW9uS2V5KHByZWZpeCwga2V5KSwgZmllbGRdKSxcbiAgKTtcbiAgcmV0dXJuIHoub2JqZWN0KHNoYXBlKS5zdHJpY3QoKSBhcyB6LlpvZE9iamVjdDxOYW1lc3BhY2VkT3B0aW9uU2hhcGU8VCwgUHJlZml4Pj47XG59XG5cbi8qKiBQYXJzZSBuYW1lc3BhY2VkIG9wdGlvbiB2YWx1ZXMgYmFjayB0aHJvdWdoIHRoZWlyIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gdW5uYW1lc3BhY2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiBvYmplY3QsXG4gIHByZWZpeDogc3RyaW5nLFxuKTogei5vdXRwdXQ8ei5ab2RPYmplY3Q8VD4+IHtcbiAgY29uc3Qgc291cmNlID0gdmFsdWVzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmV0dXJuIHNjaGVtYS5wYXJzZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3Qua2V5cyhzY2hlbWEuc2hhcGUpLm1hcCgoa2V5KSA9PiBba2V5LCBzb3VyY2VbbmFtZXNwYWNlZE9wdGlvbktleShwcmVmaXgsIGtleSldXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbmFtZXNwYWNlZE9wdGlvbktleShwcmVmaXg6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJlZml4fSR7a2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7a2V5LnNsaWNlKDEpfWA7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWRPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCBlbnRyaWVzID0gb3B0aW9uUHJvcGVydGllcyhzY2hlbWEpLmZsYXRNYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gXCJmbGFnXCIgJiYgcHJvcGVydHkuZmxhZyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgZm9ybWF0ID09PSBcImZsYWdcIlxuICAgICAgICA/IGAtLSR7dG9TbHVnKHByb3BlcnR5LmtleSl9YFxuICAgICAgICA6IChvcHRpb25FbnZpcm9ubWVudE5hbWVzKHByb3BlcnR5LmtleSwgcHJvcGVydHkuZW52KVswXSA/PyBcIlwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3Byb3BlcnR5LmtleV07XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IFtba2V5LCBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWUpXSBhcyBjb25zdF07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuXG5jb25zdCBvcHRpb25hbFRleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZywgZW52OiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKS5tZXRhKHsgZW52LCBmbGFnOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IExha2ViYXNlT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbGFrZWJhc2VFbmRwb2ludDogb3B0aW9uYWxUZXh0KFxuICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0LCByZXNvdXJjZSBwYXRoLCBob3N0LCBvciBVUkwuXCIsXG4gICAgICBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIExha2ViYXNlT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIExha2ViYXNlT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBFeHBsaWNpdCBvcHRpb24gdmFsdWVzIG9yIGVudmlyb25tZW50IGVudHJpZXMgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblZhbHVlTWFwID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcblxuLyoqIFBhcnNlIG9ubHkgc3VwcGxpZWQgZmxhZyBhbmQgZW52aXJvbm1lbnQgdmFsdWVzIHRocm91Z2ggYW4gb3duaW5nIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIGZsYWdzOiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4pOiBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj4ge1xuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9uVmFsdWVzKHNjaGVtYSwgZmxhZ3MsIGVudmlyb25tZW50KTtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKGNvbmZpZ3VyZWQpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZ3VyZWQpLm1hcCgoa2V5KSA9PiBba2V5LCBwYXJzZWRba2V5IGFzIGtleW9mIHR5cGVvZiBwYXJzZWRdXSksXG4gICkgYXMgUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+O1xufVxuXG4vKiogU3VwcG9ydGVkIGxpc3RlbmVyIHRyYW5zcG9ydCBzY2hlbWVzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuU2NoZW1lID0gXCJ0Y3BcIiB8IFwidW5peFwiO1xuXG4vKiogVENQIGxpc3RlbmVyIHJldHVybmVkIGJ5IHtAbGluayBsaXN0ZW5BZGRyZXNzU2NoZW1hfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGNwTGlzdGVuQWRkcmVzcyB7XG4gIHJlYWRvbmx5IHNjaGVtZTogXCJ0Y3BcIjtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbi8qKiBVbml4LWRvbWFpbiBsaXN0ZW5lciByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXhMaXN0ZW5BZGRyZXNzIHtcbiAgcmVhZG9ubHkgc2NoZW1lOiBcInVuaXhcIjtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKiogVHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIGFkZHJlc3MuICovXG5leHBvcnQgdHlwZSBMaXN0ZW5BZGRyZXNzID0gVGNwTGlzdGVuQWRkcmVzcyB8IFVuaXhMaXN0ZW5BZGRyZXNzO1xuXG4vKiogRGVmYXVsdHMgYW5kIHZhbGlkYXRpb24gcG9saWN5IGZvciB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBsb29wYmFjaz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNjaGVtZT86IExpc3RlblNjaGVtZTtcbiAgcmVhZG9ubHkgc2NoZW1lcz86IHJlYWRvbmx5IExpc3RlblNjaGVtZVtdO1xuICByZWFkb25seSB3aXRoRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKiBSYXcgbGlzdGVuZXIgaW5wdXQgYWNjZXB0ZWQgYmVmb3JlIHRyYW5zcG9ydC1hd2FyZSBub3JtYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzc0lucHV0ID0gTGlzdGVuQWRkcmVzcyB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl07XG4gICAgcmVhZG9ubHkgd2l0aERlZmF1bHQ6IGZhbHNlO1xuICB9LFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl0gfSxcbik6IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZSB9LFxuKTogei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMsXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuLyoqIEJ1aWxkIGEgdHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIHNjaGVtYS4gQmFyZSBhZGRyZXNzZXMgdXNlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgc2NoZW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+IHwgei5ab2REZWZhdWx0PHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj4ge1xuICBjb25zdCBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyA9IHtcbiAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxMaXN0ZW5TY2hlbWU+KG9wdGlvbnMuc2NoZW1lcyA/PyBbXCJ0Y3BcIl0pO1xuICBjb25zdCBzY2hlbWEgPSB6XG4gICAgLnByZXByb2Nlc3MoXG4gICAgICAodmFsdWUpID0+IHBhcnNlTGlzdGVuQWRkcmVzcyh2YWx1ZSwgZGVmYXVsdHMsIG9wdGlvbnMuc2NoZW1lID8/IFwidGNwXCIpLFxuICAgICAgei5kaXNjcmltaW5hdGVkVW5pb24oXCJzY2hlbWVcIiwgW1xuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICBzY2hlbWU6IHoubGl0ZXJhbChcInRjcFwiKSxcbiAgICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkubWluKDEpLmRlZmF1bHQoZGVmYXVsdHMuaG9zdCksXG4gICAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3RyaWN0KCksXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHNjaGVtZTogei5saXRlcmFsKFwidW5peFwiKSxcbiAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdHJpY3QoKSxcbiAgICAgIF0pLFxuICAgIClcbiAgICAucmVmaW5lKChhZGRyZXNzKSA9PiBhbGxvd2VkLmhhcyhhZGRyZXNzLnNjaGVtZSksIFwiTGlzdGVuZXIgc2NoZW1lIGlzIG5vdCBhbGxvd2VkLlwiKVxuICAgIC5yZWZpbmUoXG4gICAgICAoYWRkcmVzcykgPT4gYWRkcmVzcy5zY2hlbWUgIT09IFwidGNwXCIgfHwgIW9wdGlvbnMubG9vcGJhY2sgfHwgaXNMb29wYmFja0hvc3QoYWRkcmVzcy5ob3N0KSxcbiAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgIClcbiAgICAuZGVzY3JpYmUoXCJUQ1Agb3IgVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIikgYXMgei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9ucy53aXRoRGVmYXVsdCA9PT0gZmFsc2UgPyBzY2hlbWEgOiBzY2hlbWEuZGVmYXVsdChkZWZhdWx0cyk7XG59XG5cbi8qKiBSZW5kZXIgYSBsaXN0ZW5lciBhZGRyZXNzIGFzIGEgYHRjcDovL2Agb3IgYHVuaXg6Ly9gIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0ZW5BZGRyZXNzKGFkZHJlc3M6IExpc3RlbkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAoYWRkcmVzcy5zY2hlbWUgPT09IFwidW5peFwiKSB7XG4gICAgcmV0dXJuIGB1bml4Oi8vJHthZGRyZXNzLnBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCJ9JHthZGRyZXNzLnBhdGh9YDtcbiAgfVxuICBjb25zdCBob3N0ID0gYWRkcmVzcy5ob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHthZGRyZXNzLmhvc3R9XWAgOiBhZGRyZXNzLmhvc3Q7XG4gIHJldHVybiBgdGNwOi8vJHtob3N0fToke2FkZHJlc3MucG9ydH1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RlbkFkZHJlc3MoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyxcbiAgZGVmYXVsdFNjaGVtZTogTGlzdGVuU2NoZW1lLFxuKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSwgc2NoZW1lOiBcInRjcFwiIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUucGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ1bml4XCIgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBkZWZhdWx0U2NoZW1lID09PSBcInRjcFwiXG4gICAgICA/IHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9XG4gICAgICA6IHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogU3RyaW5nKHZhbHVlKSB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRleHQuc3RhcnRzV2l0aChcInVuaXg6Ly9cIikpIHtcbiAgICBjb25zdCBwYXRoID0gdGV4dC5zbGljZShcInVuaXg6Ly9cIi5sZW5ndGgpO1xuICAgIHJldHVybiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YCB9O1xuICB9XG4gIGNvbnN0IHRjcCA9IHRleHQuc3RhcnRzV2l0aChcInRjcDovL1wiKSA/IHRleHQuc2xpY2UoXCJ0Y3A6Ly9cIi5sZW5ndGgpIDogdGV4dDtcbiAgaWYgKGRlZmF1bHRTY2hlbWUgPT09IFwidW5peFwiICYmICF0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB0ZXh0IH07XG4gIH1cbiAgaWYgKC9eXFxkKyQvLnRlc3QodGNwKSkgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3AgfTtcbiAgaWYgKC9eOlxcZCskLy50ZXN0KHRjcCkpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IGRlZmF1bHRzLmhvc3QsIHBvcnQ6IHRjcC5zbGljZSgxKSB9O1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IHRjcC5tYXRjaCgvXlxcWyhbXlxcXV0rKVxcXSg/OjooXFxkKykpPyQvKTtcbiAgaWYgKGJyYWNrZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgICBob3N0OiBicmFja2V0ZWRbMV0sXG4gICAgICBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRjcC5sYXN0SW5kZXhPZihcIjpcIik7XG4gIGlmIChzZXBhcmF0b3IgPiAwICYmICF0Y3Auc2xpY2UoMCwgc2VwYXJhdG9yKS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogdGNwLnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0Y3Auc2xpY2Uoc2VwYXJhdG9yICsgMSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IHRjcCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidGNwXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHZhbHVlLnBhdGggfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKFN0cmluZykuam9pbihcIixcIik7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25WYWx1ZXM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IE9wdGlvblZhbHVlTWFwLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHt9O1xuICBjb25zdCBjb25maWd1cmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgIGlmICghaXNSZWNvcmQocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBsaWNpdCA9IGZpcnN0T3B0aW9uVmFsdWUodmFsdWVzLCBba2V5LCBgLS0ke3RvU2x1ZyhrZXkpfWBdKTtcbiAgICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBleHBsaWNpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleSwgcHJvcGVydHkuZW52KTtcbiAgICBjb25zdCBzb3VyY2VkID0gZmlyc3RPcHRpb25WYWx1ZShlbnZpcm9ubWVudCwgbmFtZXMpO1xuICAgIGlmIChzb3VyY2VkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgc291cmNlZCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5OiBzdHJpbmcsIGNvbmZpZ3VyZWQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFtjb25maWd1cmVkXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlndXJlZCkpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgcmV0dXJuIFt0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwga2V5KS50b1VwcGVyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZSh0eXBlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpID8/IHZhbHVlO1xuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBhcnNlTGlzdCh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZmlyc3RPcHRpb25WYWx1ZShzb3VyY2U6IE9wdGlvblZhbHVlTWFwLCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IFwiXCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IHVybEJ1aWxkZXIodmFsdWUpO1xuICBpZiAoIXVybCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBub3JtYWxpemVkID0gdXJsLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmICF1cmwuc2VhcmNoICYmICF1cmwuaGFzaCA/IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpIDogbm9ybWFsaXplZDtcbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/options.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/async-utils.ts","../src/bindings.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/options.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
"projen": "projen"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@dbx-tools/test-polyglot": "^0.9.43",
|
|
23
22
|
"typescript": "^5.9.3"
|
|
24
23
|
},
|
|
25
24
|
"dependencies": {
|
|
@@ -40,6 +39,10 @@
|
|
|
40
39
|
"types": "./lib/src/async-utils.d.ts",
|
|
41
40
|
"default": "./lib/src/async-utils.js"
|
|
42
41
|
},
|
|
42
|
+
"./bindings": {
|
|
43
|
+
"types": "./lib/src/bindings.d.ts",
|
|
44
|
+
"default": "./lib/src/bindings.js"
|
|
45
|
+
},
|
|
43
46
|
"./brand-utils": {
|
|
44
47
|
"types": "./lib/src/brand-utils.d.ts",
|
|
45
48
|
"default": "./lib/src/brand-utils.js"
|
|
@@ -107,7 +110,7 @@
|
|
|
107
110
|
"./package.json": "./package.json"
|
|
108
111
|
}
|
|
109
112
|
},
|
|
110
|
-
"version": "0.9.
|
|
113
|
+
"version": "0.9.47",
|
|
111
114
|
"types": "./lib/index.d.ts",
|
|
112
115
|
"dbxToolsConfig": {
|
|
113
116
|
"tags": [
|
|
@@ -124,6 +127,10 @@
|
|
|
124
127
|
"types": "./lib/src/async-utils.d.ts",
|
|
125
128
|
"default": "./lib/src/async-utils.js"
|
|
126
129
|
},
|
|
130
|
+
"./bindings": {
|
|
131
|
+
"types": "./lib/src/bindings.d.ts",
|
|
132
|
+
"default": "./lib/src/bindings.js"
|
|
133
|
+
},
|
|
127
134
|
"./brand-utils": {
|
|
128
135
|
"types": "./lib/src/brand-utils.d.ts",
|
|
129
136
|
"default": "./lib/src/brand-utils.js"
|
package/src/bindings.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding-safe access to the shared logging threshold.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { activeLevel, isLevelEnabled, type LogLevel } from "./log.ts";
|
|
8
|
+
|
|
9
|
+
/** Return the active logging threshold. */
|
|
10
|
+
export function logActiveLevel(): LogLevel {
|
|
11
|
+
return activeLevel();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Return whether the current logging threshold enables `level`. */
|
|
15
|
+
export function logLevelEnabled(level: LogLevel): boolean {
|
|
16
|
+
return isLevelEnabled(level);
|
|
17
|
+
}
|
package/src/log.ts
CHANGED
|
@@ -319,7 +319,7 @@ function parseLogLevel(raw: unknown): LogLevel | undefined {
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
/** Active threshold from `process.env.LOG_LEVEL`, default {@link DEFAULT_LEVEL}. */
|
|
322
|
-
function activeLevel(): LogLevel {
|
|
322
|
+
export function activeLevel(): LogLevel {
|
|
323
323
|
return parseLogLevel(globalProcess?.env?.LOG_LEVEL) ?? DEFAULT_LEVEL;
|
|
324
324
|
}
|
|
325
325
|
|