@gnwebsoft/ui 3.0.7 → 4.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/dist/AsyncSelectPayload-B9-6l33R.d.cts +10 -0
- package/dist/AsyncSelectPayload-B9-6l33R.d.ts +10 -0
- package/dist/chunk-3OPVOWQK.js +140 -0
- package/dist/chunk-AEOF2TUF.cjs +2273 -0
- package/dist/chunk-ALHC7RLK.js +575 -0
- package/dist/chunk-BRRLB22L.js +72 -0
- package/dist/chunk-CHZU4PZB.js +2273 -0
- package/dist/chunk-EBRUE2WR.cjs +1 -1
- package/dist/chunk-HEHPKM4B.cjs +140 -0
- package/dist/chunk-K2EJ4YKO.cjs +72 -0
- package/dist/chunk-MVPLBJRK.cjs +1 -1
- package/dist/chunk-XY4U6A77.cjs +575 -0
- package/dist/components/index.cjs +1 -1
- package/dist/{enhanced-z-I7EHVS.d.cts → enhanced-CDTkKUlj.d.ts} +5 -5
- package/dist/{enhanced-z-I7EHVS.d.ts → enhanced-ZQoS03Cd.d.cts} +5 -5
- package/dist/events-BcHVCLBz.d.cts +77 -0
- package/dist/events-BcHVCLBz.d.ts +77 -0
- package/dist/hooks/index.cjs +3 -3
- package/dist/hooks/index.d.cts +3 -2
- package/dist/hooks/index.d.ts +3 -2
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +67 -6
- package/dist/index.d.cts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +65 -4
- package/dist/types/index.cjs +31 -2
- package/dist/types/index.d.cts +589 -10
- package/dist/types/index.d.ts +589 -10
- package/dist/types/index.js +30 -1
- package/dist/utils/index.cjs +37 -3
- package/dist/utils/index.d.cts +330 -13
- package/dist/utils/index.d.ts +330 -13
- package/dist/utils/index.js +35 -1
- package/dist/wrappers/index.cjs +4 -4
- package/dist/wrappers/index.d.cts +41 -19
- package/dist/wrappers/index.d.ts +41 -19
- package/dist/wrappers/index.js +2 -2
- package/package.json +15 -14
- package/dist/chunk-4H3AFH7A.js +0 -505
- package/dist/chunk-55VNGODF.cjs +0 -2265
- package/dist/chunk-BWC3LJIB.js +0 -2265
- package/dist/chunk-DE62KYFK.js +0 -122
- package/dist/chunk-DEPJRTVT.js +0 -1
- package/dist/chunk-FD57PCAC.cjs +0 -1
- package/dist/chunk-R2YK4LTT.cjs +0 -122
- package/dist/chunk-ZC7FGYL2.cjs +0 -505
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
// src/utils/api.ts
|
|
2
|
+
var makeRequest = async (url, options) => {
|
|
3
|
+
const response = await fetch(url, options);
|
|
4
|
+
if (response.ok) {
|
|
5
|
+
const apiData = await response.json();
|
|
6
|
+
return {
|
|
7
|
+
apiData,
|
|
8
|
+
status: response.status
|
|
9
|
+
};
|
|
10
|
+
} else if (response.status === 404) {
|
|
11
|
+
const apiData = await response.json();
|
|
12
|
+
const data = {
|
|
13
|
+
status: response.status,
|
|
14
|
+
title: apiData.title
|
|
15
|
+
};
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
const apiResponse = await response.json();
|
|
19
|
+
return apiResponse;
|
|
20
|
+
};
|
|
21
|
+
var api = class {
|
|
22
|
+
static async filter(url, postModel) {
|
|
23
|
+
const alteredOptions = {
|
|
24
|
+
headers: {
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
|
|
29
|
+
method: "POST"
|
|
30
|
+
};
|
|
31
|
+
const apiResponse = await makeRequest(url, alteredOptions);
|
|
32
|
+
return apiResponse;
|
|
33
|
+
}
|
|
34
|
+
static async post(url, body = {}) {
|
|
35
|
+
const alteredOptions = {
|
|
36
|
+
headers: {
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify(body),
|
|
41
|
+
method: "POST"
|
|
42
|
+
};
|
|
43
|
+
const apiResponse = await makeRequest(url, alteredOptions);
|
|
44
|
+
return apiResponse;
|
|
45
|
+
}
|
|
46
|
+
static async get(url) {
|
|
47
|
+
const alteredOptions = {
|
|
48
|
+
headers: {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
51
|
+
},
|
|
52
|
+
method: "GET"
|
|
53
|
+
};
|
|
54
|
+
const data = await makeRequest(url, alteredOptions);
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
static async delete(url) {
|
|
58
|
+
const alteredOptions = {
|
|
59
|
+
headers: {
|
|
60
|
+
"Content-Type": "application/json",
|
|
61
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
62
|
+
},
|
|
63
|
+
method: "DELETE"
|
|
64
|
+
};
|
|
65
|
+
const data = await makeRequest(url, alteredOptions);
|
|
66
|
+
return data;
|
|
67
|
+
}
|
|
68
|
+
static async put(url, body = {}) {
|
|
69
|
+
const alteredOptions = {
|
|
70
|
+
headers: {
|
|
71
|
+
"Content-Type": "application/json",
|
|
72
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
73
|
+
},
|
|
74
|
+
body: JSON.stringify(body),
|
|
75
|
+
method: "PUT"
|
|
76
|
+
};
|
|
77
|
+
const apiResponse = await makeRequest(url, alteredOptions);
|
|
78
|
+
return apiResponse;
|
|
79
|
+
}
|
|
80
|
+
static async fetch(url, options = {}) {
|
|
81
|
+
const alteredOptions = {
|
|
82
|
+
headers: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
85
|
+
},
|
|
86
|
+
...options
|
|
87
|
+
};
|
|
88
|
+
const result = await fetch(url, alteredOptions);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
static async tempFetch(url, options = { method: "GET" }) {
|
|
92
|
+
const alteredOptions = {
|
|
93
|
+
headers: {
|
|
94
|
+
"Content-Type": "application/json"
|
|
95
|
+
},
|
|
96
|
+
...options
|
|
97
|
+
};
|
|
98
|
+
const apiResponse = await makeRequest(url, alteredOptions);
|
|
99
|
+
return apiResponse;
|
|
100
|
+
}
|
|
101
|
+
static async upload(url, formData) {
|
|
102
|
+
const alteredOptions = {
|
|
103
|
+
headers: {
|
|
104
|
+
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
105
|
+
},
|
|
106
|
+
body: formData,
|
|
107
|
+
method: "POST"
|
|
108
|
+
};
|
|
109
|
+
const apiResponse = await makeRequest(url, alteredOptions);
|
|
110
|
+
return apiResponse;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/utils/api2.ts
|
|
115
|
+
var makeRequest2 = async (url, options) => {
|
|
116
|
+
const response = await fetch(url, options);
|
|
117
|
+
if (response.ok) {
|
|
118
|
+
const apiData = await response.json();
|
|
119
|
+
return {
|
|
120
|
+
apiData,
|
|
121
|
+
status: response.status
|
|
122
|
+
};
|
|
123
|
+
} else if (response.status === 404) {
|
|
124
|
+
const apiData = await response.json();
|
|
125
|
+
const data = {
|
|
126
|
+
status: response.status,
|
|
127
|
+
title: apiData.title
|
|
128
|
+
};
|
|
129
|
+
return data;
|
|
130
|
+
}
|
|
131
|
+
const apiResponse = await response.json();
|
|
132
|
+
return apiResponse;
|
|
133
|
+
};
|
|
134
|
+
var api2 = class {
|
|
135
|
+
static async filter(url, postModel) {
|
|
136
|
+
const alteredOptions = {
|
|
137
|
+
headers: {
|
|
138
|
+
"Content-Type": "application/json",
|
|
139
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
140
|
+
},
|
|
141
|
+
body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
|
|
142
|
+
method: "POST"
|
|
143
|
+
};
|
|
144
|
+
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
145
|
+
return apiResponse;
|
|
146
|
+
}
|
|
147
|
+
static async post(url, body = {}) {
|
|
148
|
+
const alteredOptions = {
|
|
149
|
+
headers: {
|
|
150
|
+
"Content-Type": "application/json",
|
|
151
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
152
|
+
},
|
|
153
|
+
body: JSON.stringify(body),
|
|
154
|
+
method: "POST"
|
|
155
|
+
};
|
|
156
|
+
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
157
|
+
return apiResponse;
|
|
158
|
+
}
|
|
159
|
+
static async get(url) {
|
|
160
|
+
const alteredOptions = {
|
|
161
|
+
headers: {
|
|
162
|
+
"Content-Type": "application/json",
|
|
163
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
164
|
+
},
|
|
165
|
+
method: "GET"
|
|
166
|
+
};
|
|
167
|
+
const data = await makeRequest2(url, alteredOptions);
|
|
168
|
+
return data;
|
|
169
|
+
}
|
|
170
|
+
static async delete(url) {
|
|
171
|
+
const alteredOptions = {
|
|
172
|
+
headers: {
|
|
173
|
+
"Content-Type": "application/json",
|
|
174
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
175
|
+
},
|
|
176
|
+
method: "DELETE"
|
|
177
|
+
};
|
|
178
|
+
const data = await makeRequest2(url, alteredOptions);
|
|
179
|
+
return data;
|
|
180
|
+
}
|
|
181
|
+
static async put(url, body = {}) {
|
|
182
|
+
const alteredOptions = {
|
|
183
|
+
headers: {
|
|
184
|
+
"Content-Type": "application/json",
|
|
185
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
186
|
+
},
|
|
187
|
+
body: JSON.stringify(body),
|
|
188
|
+
method: "PUT"
|
|
189
|
+
};
|
|
190
|
+
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
191
|
+
return apiResponse;
|
|
192
|
+
}
|
|
193
|
+
static async fetch(url, options = {}) {
|
|
194
|
+
const alteredOptions = {
|
|
195
|
+
headers: {
|
|
196
|
+
"Content-Type": "application/json",
|
|
197
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
198
|
+
},
|
|
199
|
+
...options
|
|
200
|
+
};
|
|
201
|
+
const result = await fetch(url, alteredOptions);
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
static async tempFetch(url, options = { method: "GET" }) {
|
|
205
|
+
const alteredOptions = {
|
|
206
|
+
headers: {
|
|
207
|
+
"Content-Type": "application/json"
|
|
208
|
+
},
|
|
209
|
+
...options
|
|
210
|
+
};
|
|
211
|
+
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
212
|
+
return apiResponse;
|
|
213
|
+
}
|
|
214
|
+
static async upload(url, formData) {
|
|
215
|
+
const alteredOptions = {
|
|
216
|
+
headers: {
|
|
217
|
+
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
218
|
+
},
|
|
219
|
+
body: formData,
|
|
220
|
+
method: "POST"
|
|
221
|
+
};
|
|
222
|
+
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
223
|
+
return apiResponse;
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// src/utils/flattenObjectKeys.ts
|
|
228
|
+
var isNested = (obj) => typeof obj === "object" && obj !== null && !Array.isArray(obj);
|
|
229
|
+
var isArray = (obj) => Array.isArray(obj);
|
|
230
|
+
var flattenObjectKeys = (obj, prefix = "") => {
|
|
231
|
+
if (!isNested(obj)) {
|
|
232
|
+
return {
|
|
233
|
+
[prefix]: obj
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return Object.keys(obj).reduce((acc, key) => {
|
|
237
|
+
const currentPrefix = prefix.length ? `${prefix}.` : "";
|
|
238
|
+
if (isNested(obj[key]) && Object.keys(obj[key]).length) {
|
|
239
|
+
if (isArray(obj[key]) && obj[key].length) {
|
|
240
|
+
obj[key].forEach((item, index) => {
|
|
241
|
+
Object.assign(
|
|
242
|
+
acc,
|
|
243
|
+
flattenObjectKeys(item, `${currentPrefix + key}.${index}`)
|
|
244
|
+
);
|
|
245
|
+
});
|
|
246
|
+
} else {
|
|
247
|
+
Object.assign(acc, flattenObjectKeys(obj[key], currentPrefix + key));
|
|
248
|
+
}
|
|
249
|
+
acc[currentPrefix + key] = obj[key];
|
|
250
|
+
} else {
|
|
251
|
+
acc[currentPrefix + key] = obj[key];
|
|
252
|
+
}
|
|
253
|
+
return acc;
|
|
254
|
+
}, {});
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// src/utils/getTimezone.ts
|
|
258
|
+
function getTimezone(adapter, value) {
|
|
259
|
+
return value == null || !adapter.utils.isValid(value) ? null : adapter.utils.getTimezone(value);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// src/utils/handleServerErrors.ts
|
|
263
|
+
var handleServerErrors = function handleServerErrors2(args) {
|
|
264
|
+
const { errors, setError } = args;
|
|
265
|
+
for (const key in errors) {
|
|
266
|
+
const isKeyInVariables = Object.keys(flattenObjectKeys(errors)).includes(
|
|
267
|
+
key
|
|
268
|
+
);
|
|
269
|
+
if (!isKeyInVariables) {
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
const fieldError = errors[key];
|
|
273
|
+
let errorMessage = "";
|
|
274
|
+
if (Array.isArray(fieldError)) {
|
|
275
|
+
errorMessage = fieldError.join(" ");
|
|
276
|
+
}
|
|
277
|
+
if (typeof fieldError === "string") {
|
|
278
|
+
errorMessage = fieldError;
|
|
279
|
+
}
|
|
280
|
+
if (typeof fieldError === "boolean" && fieldError) {
|
|
281
|
+
errorMessage = "Field is not valid.";
|
|
282
|
+
}
|
|
283
|
+
setError(key, {
|
|
284
|
+
message: errorMessage
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
// src/utils/propertyExists.ts
|
|
290
|
+
function propertyExists(obj, prop) {
|
|
291
|
+
return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, prop);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// src/utils/readValueAsDate.ts
|
|
295
|
+
function readValueAsDate(adapter, value) {
|
|
296
|
+
if (typeof value === "string") {
|
|
297
|
+
if (value === "") {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
return adapter.utils.date(value);
|
|
301
|
+
}
|
|
302
|
+
return value;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/utils/removeLeadingTrailingSlashes.ts
|
|
306
|
+
var removeLeadingTrailingSlashes = (route) => {
|
|
307
|
+
return route.replace(/^\/|\/$/g, "");
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// src/utils/schemaTools.ts
|
|
311
|
+
import dayjs from "dayjs";
|
|
312
|
+
import { z } from "zod";
|
|
313
|
+
var schemaTools = {
|
|
314
|
+
// Date validations
|
|
315
|
+
date: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" || c === "undefined" ? null : c).refine((c) => !!c, { message: message || "Date is required" }).refine((c) => c ? dayjs(c).isValid() : true, {
|
|
316
|
+
message: message || "Invalid date"
|
|
317
|
+
}),
|
|
318
|
+
nullableDate: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" ? null : c).transform((c) => c === "undefined" ? null : c).refine((c) => !c && c !== null ? dayjs(c).isValid() : true, {
|
|
319
|
+
message: message || "Invalid date"
|
|
320
|
+
}),
|
|
321
|
+
dateRange: ({ message } = {}) => z.object({
|
|
322
|
+
start: z.coerce.date(),
|
|
323
|
+
end: z.coerce.date()
|
|
324
|
+
}).refine((data) => data.start <= data.end, {
|
|
325
|
+
message: message || "Start date must be before or equal to end date"
|
|
326
|
+
}),
|
|
327
|
+
// String validations
|
|
328
|
+
requiredString: ({ message, min, max } = {}) => z.string().trim().min(min || 1, message || `String must be at least ${min || 1} characters`).max(max || 255, message || `String must be at most ${max || 255} characters`),
|
|
329
|
+
email: ({ message } = {}) => z.string().email(message || "Invalid email address").max(254, "Email must be at most 254 characters"),
|
|
330
|
+
url: ({ message } = {}) => z.string().url(message || "Invalid URL format"),
|
|
331
|
+
phone: ({ message } = {}) => z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, message || "Invalid phone number format"),
|
|
332
|
+
alphanumeric: ({ message } = {}) => z.string().regex(/^[a-zA-Z0-9]+$/, message || "Only letters and numbers are allowed"),
|
|
333
|
+
slug: ({ message } = {}) => z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, message || "Invalid slug format"),
|
|
334
|
+
// Number validations
|
|
335
|
+
positiveNumber: ({ message, min, max } = {}) => z.number().positive(message || "Number must be positive").min(min || 0.01, `Number must be at least ${min || 0.01}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
|
|
336
|
+
nonNegativeNumber: ({ message, max } = {}) => z.number().min(0, message || "Number must be non-negative").max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
|
|
337
|
+
integer: ({ message, min, max } = {}) => z.number().int(message || "Must be an integer").min(min || Number.MIN_SAFE_INTEGER, `Number must be at least ${min || Number.MIN_SAFE_INTEGER}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
|
|
338
|
+
percentage: ({ message } = {}) => z.number().min(0, message || "Percentage must be between 0 and 100").max(100, message || "Percentage must be between 0 and 100"),
|
|
339
|
+
// Array validations
|
|
340
|
+
nonEmptyArray: (schema, { message } = {}) => z.array(schema).min(1, message || "At least one item is required"),
|
|
341
|
+
uniqueArray: (schema, { message } = {}) => z.array(schema).refine((items) => new Set(items).size === items.length, {
|
|
342
|
+
message: message || "All items must be unique"
|
|
343
|
+
}),
|
|
344
|
+
// Boolean validations
|
|
345
|
+
requiredBoolean: ({ message } = {}) => z.boolean({
|
|
346
|
+
message: message || "This field is required"
|
|
347
|
+
}),
|
|
348
|
+
// Object validations
|
|
349
|
+
nonEmptyObject: (schema, { message } = {}) => schema.refine((obj) => Object.keys(obj).length > 0, {
|
|
350
|
+
message: message || "Object cannot be empty"
|
|
351
|
+
}),
|
|
352
|
+
// File validations
|
|
353
|
+
fileSize: ({ maxSize, message }) => z.instanceof(File).refine((file) => file.size <= maxSize, {
|
|
354
|
+
message: message || `File size must be less than ${Math.round(maxSize / 1024 / 1024)}MB`
|
|
355
|
+
}),
|
|
356
|
+
fileType: ({ allowedTypes, message }) => z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {
|
|
357
|
+
message: message || `File type must be one of: ${allowedTypes.join(", ")}`
|
|
358
|
+
}),
|
|
359
|
+
// Custom validators
|
|
360
|
+
conditional: (condition, trueSchema, falseSchema) => z.union([trueSchema, falseSchema]).superRefine((data, ctx) => {
|
|
361
|
+
const shouldUseTrue = condition(data);
|
|
362
|
+
const schema = shouldUseTrue ? trueSchema : falseSchema;
|
|
363
|
+
const result = schema.safeParse(data);
|
|
364
|
+
if (!result.success) {
|
|
365
|
+
ctx.addIssue({
|
|
366
|
+
code: z.ZodIssueCode.custom,
|
|
367
|
+
message: result.error.message
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}),
|
|
371
|
+
transform: {
|
|
372
|
+
toLowerCase: z.string().transform((val) => val.toLowerCase()),
|
|
373
|
+
toUpperCase: z.string().transform((val) => val.toUpperCase()),
|
|
374
|
+
trim: z.string().transform((val) => val.trim()),
|
|
375
|
+
toNumber: z.string().transform((val) => Number(val)),
|
|
376
|
+
toBoolean: z.string().transform((val) => val === "true"),
|
|
377
|
+
parseJson: (schema) => z.string().transform((val, ctx) => {
|
|
378
|
+
try {
|
|
379
|
+
const parsed = JSON.parse(val);
|
|
380
|
+
const result = schema.safeParse(parsed);
|
|
381
|
+
if (result.success) return result.data;
|
|
382
|
+
ctx.addIssue({
|
|
383
|
+
code: z.ZodIssueCode.custom,
|
|
384
|
+
message: result.error.message
|
|
385
|
+
});
|
|
386
|
+
return z.NEVER;
|
|
387
|
+
} catch {
|
|
388
|
+
ctx.addIssue({
|
|
389
|
+
code: z.ZodIssueCode.custom,
|
|
390
|
+
message: "Invalid JSON"
|
|
391
|
+
});
|
|
392
|
+
return z.NEVER;
|
|
393
|
+
}
|
|
394
|
+
})
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
// src/utils/watch/core.ts
|
|
399
|
+
import { useWatch } from "react-hook-form";
|
|
400
|
+
var useWatchForm = (control) => useWatch({ control });
|
|
401
|
+
var useWatchField = (control, name) => useWatch({ control, name });
|
|
402
|
+
var useWatchFields = (control, names) => useWatch({ control, name: names });
|
|
403
|
+
|
|
404
|
+
// src/utils/watch/utilities.ts
|
|
405
|
+
import { useMemo, useState, useEffect } from "react";
|
|
406
|
+
import { useWatch as useWatch2 } from "react-hook-form";
|
|
407
|
+
var useWatchTransform = (control, name, transform) => {
|
|
408
|
+
const value = useWatch2({ control, name });
|
|
409
|
+
return useMemo(() => transform(value), [value, transform]);
|
|
410
|
+
};
|
|
411
|
+
var useWatchDefault = (control, name, defaultValue) => {
|
|
412
|
+
const value = useWatch2({ control, name });
|
|
413
|
+
return value ?? defaultValue;
|
|
414
|
+
};
|
|
415
|
+
var useWatchBoolean = (control, name, defaultValue = false) => {
|
|
416
|
+
const value = useWatch2({ control, name });
|
|
417
|
+
return Boolean(value ?? defaultValue);
|
|
418
|
+
};
|
|
419
|
+
var useWatchBatch = (control, fields) => {
|
|
420
|
+
const values = useWatch2({ control, name: fields });
|
|
421
|
+
return useMemo(() => {
|
|
422
|
+
const result = {};
|
|
423
|
+
fields.forEach((field, index) => {
|
|
424
|
+
result[field] = values[index];
|
|
425
|
+
});
|
|
426
|
+
return result;
|
|
427
|
+
}, [values, fields]);
|
|
428
|
+
};
|
|
429
|
+
var useWatchConditional = (control, name, shouldWatch, fallback) => {
|
|
430
|
+
const activeValue = useWatch2({
|
|
431
|
+
control,
|
|
432
|
+
name,
|
|
433
|
+
disabled: !shouldWatch
|
|
434
|
+
});
|
|
435
|
+
return shouldWatch ? activeValue : fallback;
|
|
436
|
+
};
|
|
437
|
+
var useWatchDebounced = (control, name, delay = 300) => {
|
|
438
|
+
const value = useWatch2({ control, name });
|
|
439
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
440
|
+
useEffect(() => {
|
|
441
|
+
const timer = setTimeout(() => {
|
|
442
|
+
setDebouncedValue(value);
|
|
443
|
+
}, delay);
|
|
444
|
+
return () => clearTimeout(timer);
|
|
445
|
+
}, [value, delay]);
|
|
446
|
+
return debouncedValue;
|
|
447
|
+
};
|
|
448
|
+
var useWatchSelector = (control, name, selector, deps = []) => {
|
|
449
|
+
const value = useWatch2({ control, name });
|
|
450
|
+
return useMemo(
|
|
451
|
+
() => selector(value),
|
|
452
|
+
[value, selector, ...deps]
|
|
453
|
+
// eslint-disable-line react-hooks/exhaustive-deps
|
|
454
|
+
);
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
// src/utils/watch/index.ts
|
|
458
|
+
var typedWatch = {
|
|
459
|
+
// === CORE FUNCTIONS ===
|
|
460
|
+
/** Watch entire form */
|
|
461
|
+
form: useWatchForm,
|
|
462
|
+
/** Watch single field */
|
|
463
|
+
field: useWatchField,
|
|
464
|
+
/** Watch multiple fields */
|
|
465
|
+
fields: useWatchFields,
|
|
466
|
+
// === UTILITY FUNCTIONS ===
|
|
467
|
+
/** Watch with transformation */
|
|
468
|
+
transform: useWatchTransform,
|
|
469
|
+
/** Watch with default value */
|
|
470
|
+
withDefault: useWatchDefault,
|
|
471
|
+
/** Watch as boolean */
|
|
472
|
+
boolean: useWatchBoolean,
|
|
473
|
+
/** Watch multiple with custom keys */
|
|
474
|
+
batch: useWatchBatch,
|
|
475
|
+
/** Watch conditionally */
|
|
476
|
+
conditional: useWatchConditional,
|
|
477
|
+
/** Watch with debouncing */
|
|
478
|
+
debounced: useWatchDebounced,
|
|
479
|
+
/** Watch with selector */
|
|
480
|
+
selector: useWatchSelector
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
// src/utils/typeGuards.ts
|
|
484
|
+
function isRecord(value) {
|
|
485
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
486
|
+
}
|
|
487
|
+
function hasProperty(obj, key) {
|
|
488
|
+
return isRecord(obj) && key in obj;
|
|
489
|
+
}
|
|
490
|
+
function isNonEmptyString(value) {
|
|
491
|
+
return typeof value === "string" && value.length > 0;
|
|
492
|
+
}
|
|
493
|
+
function isArray2(value) {
|
|
494
|
+
return Array.isArray(value);
|
|
495
|
+
}
|
|
496
|
+
function isNonEmptyArray(value) {
|
|
497
|
+
return Array.isArray(value) && value.length > 0;
|
|
498
|
+
}
|
|
499
|
+
function isFunction(value) {
|
|
500
|
+
return typeof value === "function";
|
|
501
|
+
}
|
|
502
|
+
function isString(value) {
|
|
503
|
+
return typeof value === "string";
|
|
504
|
+
}
|
|
505
|
+
function isNumber(value) {
|
|
506
|
+
return typeof value === "number" && !isNaN(value);
|
|
507
|
+
}
|
|
508
|
+
function isBoolean(value) {
|
|
509
|
+
return typeof value === "boolean";
|
|
510
|
+
}
|
|
511
|
+
function isNull(value) {
|
|
512
|
+
return value === null;
|
|
513
|
+
}
|
|
514
|
+
function isUndefined(value) {
|
|
515
|
+
return value === void 0;
|
|
516
|
+
}
|
|
517
|
+
function isNullish(value) {
|
|
518
|
+
return value === null || value === void 0;
|
|
519
|
+
}
|
|
520
|
+
function isDefined(value) {
|
|
521
|
+
return value !== null && value !== void 0;
|
|
522
|
+
}
|
|
523
|
+
function isDate(value) {
|
|
524
|
+
return value instanceof Date && !isNaN(value.getTime());
|
|
525
|
+
}
|
|
526
|
+
function isPromise(value) {
|
|
527
|
+
return value instanceof Promise || isRecord(value) && typeof value.then === "function";
|
|
528
|
+
}
|
|
529
|
+
function isError(error) {
|
|
530
|
+
return error instanceof Error;
|
|
531
|
+
}
|
|
532
|
+
function matches(value, validator) {
|
|
533
|
+
return validator(value);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export {
|
|
537
|
+
api,
|
|
538
|
+
api2,
|
|
539
|
+
flattenObjectKeys,
|
|
540
|
+
getTimezone,
|
|
541
|
+
handleServerErrors,
|
|
542
|
+
propertyExists,
|
|
543
|
+
readValueAsDate,
|
|
544
|
+
removeLeadingTrailingSlashes,
|
|
545
|
+
schemaTools,
|
|
546
|
+
useWatchForm,
|
|
547
|
+
useWatchField,
|
|
548
|
+
useWatchFields,
|
|
549
|
+
useWatchTransform,
|
|
550
|
+
useWatchDefault,
|
|
551
|
+
useWatchBoolean,
|
|
552
|
+
useWatchBatch,
|
|
553
|
+
useWatchConditional,
|
|
554
|
+
useWatchDebounced,
|
|
555
|
+
useWatchSelector,
|
|
556
|
+
typedWatch,
|
|
557
|
+
isRecord,
|
|
558
|
+
hasProperty,
|
|
559
|
+
isNonEmptyString,
|
|
560
|
+
isArray2 as isArray,
|
|
561
|
+
isNonEmptyArray,
|
|
562
|
+
isFunction,
|
|
563
|
+
isString,
|
|
564
|
+
isNumber,
|
|
565
|
+
isBoolean,
|
|
566
|
+
isNull,
|
|
567
|
+
isUndefined,
|
|
568
|
+
isNullish,
|
|
569
|
+
isDefined,
|
|
570
|
+
isDate,
|
|
571
|
+
isPromise,
|
|
572
|
+
isError,
|
|
573
|
+
matches
|
|
574
|
+
};
|
|
575
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2FwaS50cyIsICIuLi9zcmMvdXRpbHMvYXBpMi50cyIsICIuLi9zcmMvdXRpbHMvZmxhdHRlbk9iamVjdEtleXMudHMiLCAiLi4vc3JjL3V0aWxzL2dldFRpbWV6b25lLnRzIiwgIi4uL3NyYy91dGlscy9oYW5kbGVTZXJ2ZXJFcnJvcnMudHMiLCAiLi4vc3JjL3V0aWxzL3Byb3BlcnR5RXhpc3RzLnRzIiwgIi4uL3NyYy91dGlscy9yZWFkVmFsdWVBc0RhdGUudHMiLCAiLi4vc3JjL3V0aWxzL3JlbW92ZUxlYWRpbmdUcmFpbGluZ1NsYXNoZXMudHMiLCAiLi4vc3JjL3V0aWxzL3NjaGVtYVRvb2xzLnRzIiwgIi4uL3NyYy91dGlscy93YXRjaC9jb3JlLnRzIiwgIi4uL3NyYy91dGlscy93YXRjaC91dGlsaXRpZXMudHMiLCAiLi4vc3JjL3V0aWxzL3dhdGNoL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy90eXBlR3VhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL0FwaVJlc3BvbnNlXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXNwb25zZSwgUG9zdE1vZGVsIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zLCBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2FwaVwiO1xuXG5cbmNvbnN0IG1ha2VSZXF1ZXN0ID0gYXN5bmMgPFQ+KFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnNcbik6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+ID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuXG4gIGlmIChyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGFwaURhdGE6IFQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBpRGF0YSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIH07XG4gIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICBjb25zdCBhcGlEYXRhOiBBcGlSZXNwb25zZTxUPiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGNvbnN0IGRhdGE6IEFwaVJlc3BvbnNlPFQ+ID0ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICB0aXRsZTogYXBpRGF0YS50aXRsZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdCBhcGlSZXNwb25zZTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgcmV0dXJuIGFwaVJlc3BvbnNlO1xufTs7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGFwaSB7XG4gIHN0YXRpYyBhc3luYyBmaWx0ZXI8VCwgVEZpbHRlcj4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcG9zdE1vZGVsOiBQb3N0TW9kZWw8VEZpbHRlcj5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMaXN0UmVzcG9uc2U8VD4+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IC4uLnBvc3RNb2RlbCwgLi4ucG9zdE1vZGVsLmZpbHRlck1vZGVsIH0pLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxMaXN0UmVzcG9uc2U8VD4+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHk6IEpzb25PYmplY3QgPSB7fSk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0PFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZGVsZXRlPFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBKc29uT2JqZWN0ID0ge30pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZmV0Y2godXJsOiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge30pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2godXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHRlbXBGZXRjaDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiBcIkdFVFwiIH1cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdXBsb2FkPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGZvcm1EYXRhOiBGb3JtRGF0YVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL0FwaVJlc3BvbnNlXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXNwb25zZSwgUG9zdE1vZGVsIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zLCBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2FwaVwiO1xuXG5cbmNvbnN0IG1ha2VSZXF1ZXN0ID0gYXN5bmMgPFQ+KFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnNcbik6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+ID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuXG4gIGlmIChyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGFwaURhdGE6IFQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBpRGF0YSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIH07XG4gIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICBjb25zdCBhcGlEYXRhOiBBcGlSZXNwb25zZTxUPiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGNvbnN0IGRhdGE6IEFwaVJlc3BvbnNlPFQ+ID0ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICB0aXRsZTogYXBpRGF0YS50aXRsZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdCBhcGlSZXNwb25zZTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgcmV0dXJuIGFwaVJlc3BvbnNlO1xufTs7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGFwaTIge1xuICBzdGF0aWMgYXN5bmMgZmlsdGVyPFQsIFRGaWx0ZXI+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIHBvc3RNb2RlbDogUG9zdE1vZGVsPFRGaWx0ZXI+XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8TGlzdFJlc3BvbnNlPFQ+Pj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IC4uLnBvc3RNb2RlbCwgLi4ucG9zdE1vZGVsLmZpbHRlck1vZGVsIH0pLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxMaXN0UmVzcG9uc2U8VD4+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHk6IEpzb25PYmplY3QgPSB7fSk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXQ8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZTxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBKc29uT2JqZWN0ID0ge30pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmZXRjaCh1cmw6IHN0cmluZywgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB0ZW1wRmV0Y2g8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogXCJHRVRcIiB9XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHVwbG9hZDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogRm9ybURhdGFcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgbmVzdGVkIG9iamVjdCAobm90IG51bGwgYW5kIG5vdCBhbiBhcnJheSkuXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBuZXN0ZWQgb2JqZWN0XG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzTmVzdGVkID0gKG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBcbiAgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBpc0FycmF5ID0gKG9iajogdW5rbm93bik6IG9iaiBpcyB1bmtub3duW10gPT4gQXJyYXkuaXNBcnJheShvYmopO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGFuIG9iamVjdCBpbnRvIGEgZmxhdCBzdHJ1Y3R1cmUgd2l0aCBkb3Qtbm90YXRpb24ga2V5cy5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gdGFrZXMgYSBuZXN0ZWQgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgZmxhdCBvYmplY3RcbiAqIHdoZXJlIG5lc3RlZCBwcm9wZXJ0aWVzIGFyZSByZXByZXNlbnRlZCB1c2luZyBkb3Qgbm90YXRpb24uIEl0IGhhbmRsZXMgYm90aFxuICogbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cywgcHJlc2VydmluZyBhbGwgbGV2ZWxzIG9mIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmVcbiAqIGFzIHNlcGFyYXRlIGtleXMgaW4gdGhlIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgb2JqZWN0IGZsYXR0ZW5pbmc6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IG5lc3RlZCA9IHtcbiAqICAgdXNlcjoge1xuICogICAgIG5hbWU6ICdKb2huJyxcbiAqICAgICBhZGRyZXNzOiB7XG4gKiAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICogICAgICAgemlwOiAnMTAwMDEnXG4gKiAgICAgfVxuICogICB9XG4gKiB9O1xuICpcbiAqIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5PYmplY3RLZXlzKG5lc3RlZCk7XG4gKiAvLyBSZXN1bHQ6XG4gKiAvLyB7XG4gKiAvLyAgICd1c2VyJzogeyBuYW1lOiAnSm9obicsIGFkZHJlc3M6IHsgY2l0eTogJ05ldyBZb3JrJywgemlwOiAnMTAwMDEnIH0gfSxcbiAqIC8vICAgJ3VzZXIubmFtZSc6ICdKb2huJyxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcyc6IHsgY2l0eTogJ05ldyBZb3JrJywgemlwOiAnMTAwMDEnIH0sXG4gKiAvLyAgICd1c2VyLmFkZHJlc3MuY2l0eSc6ICdOZXcgWW9yaycsXG4gKiAvLyAgICd1c2VyLmFkZHJlc3MuemlwJzogJzEwMDAxJ1xuICogLy8gfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFycmF5IGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBjb25zdCB3aXRoQXJyYXlzID0ge1xuICogICBpdGVtczogW1xuICogICAgIHsgaWQ6IDEsIG5hbWU6ICdJdGVtIDEnIH0sXG4gKiAgICAgeyBpZDogMiwgbmFtZTogJ0l0ZW0gMicgfVxuICogICBdXG4gKiB9O1xuICpcbiAqIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5PYmplY3RLZXlzKHdpdGhBcnJheXMpO1xuICogLy8gUmVzdWx0IGluY2x1ZGVzOlxuICogLy8ge1xuICogLy8gICAnaXRlbXMnOiBbLi4uXSxcbiAqIC8vICAgJ2l0ZW1zLjAnOiB7IGlkOiAxLCBuYW1lOiAnSXRlbSAxJyB9LFxuICogLy8gICAnaXRlbXMuMC5pZCc6IDEsXG4gKiAvLyAgICdpdGVtcy4wLm5hbWUnOiAnSXRlbSAxJyxcbiAqIC8vICAgJ2l0ZW1zLjEnOiB7IGlkOiAyLCBuYW1lOiAnSXRlbSAyJyB9LFxuICogLy8gICAnaXRlbXMuMS5pZCc6IDIsXG4gKiAvLyAgICdpdGVtcy4xLm5hbWUnOiAnSXRlbSAyJ1xuICogLy8gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gZmxhdHRlblxuICogQHBhcmFtIHByZWZpeCAtIEludGVybmFsIHBhcmFtZXRlciBmb3IgYnVpbGRpbmcga2V5IHBhdGhzICh1c2VkIGluIHJlY3Vyc2lvbilcbiAqIEByZXR1cm5zIEEgZmxhdCBvYmplY3Qgd2l0aCBkb3Qtbm90YXRpb24ga2V5cyByZXByZXNlbnRpbmcgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5PYmplY3RLZXlzID0gKG9iajogdW5rbm93biwgcHJlZml4ID0gXCJcIik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgaWYgKCFpc05lc3RlZChvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtwcmVmaXhdOiBvYmosXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICBjb25zdCBjdXJyZW50UHJlZml4ID0gcHJlZml4Lmxlbmd0aCA/IGAke3ByZWZpeH0uYCA6IFwiXCI7XG5cbiAgICBpZiAoaXNOZXN0ZWQob2JqW2tleV0pICYmIE9iamVjdC5rZXlzKG9ialtrZXldKS5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0FycmF5KG9ialtrZXldKSAmJiBvYmpba2V5XS5sZW5ndGgpIHtcbiAgICAgICAgb2JqW2tleV0uZm9yRWFjaCgoaXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICBhY2MsXG4gICAgICAgICAgICBmbGF0dGVuT2JqZWN0S2V5cyhpdGVtLCBgJHtjdXJyZW50UHJlZml4ICsga2V5fS4ke2luZGV4fWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKGFjYywgZmxhdHRlbk9iamVjdEtleXMob2JqW2tleV0sIGN1cnJlbnRQcmVmaXggKyBrZXkpKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXZlbiBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdCwgaXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBrZXkgYXMgd2VsbFxuICAgICAgYWNjW2N1cnJlbnRQcmVmaXggKyBrZXldID0gb2JqW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY1tjdXJyZW50UHJlZml4ICsga2V5XSA9IG9ialtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IERheWpzIH0gZnJvbSBcImRheWpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogVERhdGVcbik6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhYWRhcHRlci51dGlscy5pc1ZhbGlkKHZhbHVlIGFzIHVua25vd24gYXMgRGF5anMpXG4gICAgPyBudWxsXG4gICAgOiBhZGFwdGVyLnV0aWxzLmdldFRpbWV6b25lKHZhbHVlIGFzIHVua25vd24gYXMgRGF5anMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIFBhdGgsIFVzZUZvcm1TZXRFcnJvciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgZmxhdHRlbk9iamVjdEtleXMgfSBmcm9tIFwiLi9mbGF0dGVuT2JqZWN0S2V5c1wiO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tIFwiQC90eXBlc1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGhhbmRsZVNlcnZlckVycm9ycyBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBIYW5kbGVTZXJ2ZXJFcnJvcnNUeXBlPFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXM+IHtcbiAgLyoqXG4gICAqIFNlcnZlciB2YWxpZGF0aW9uIGVycm9ycyBvYmplY3QgY29udGFpbmluZyBmaWVsZC1zcGVjaWZpYyBlcnJvciBtZXNzYWdlc1xuICAgKiBAZXhhbXBsZSB7IGVtYWlsOiAnRW1haWwgaXMgYWxyZWFkeSB0YWtlbicsIHBhc3N3b3JkOiBbJ1RvbyBzaG9ydCcsICdNdXN0IGNvbnRhaW4gbnVtYmVycyddIH1cbiAgICovXG4gIGVycm9ycz86IFZhbGlkYXRpb25FcnJvcnM7XG4gIC8qKlxuICAgKiBUaGUgc2V0RXJyb3IgZnVuY3Rpb24gZnJvbSByZWFjdC1ob29rLWZvcm0gZm9yIHNldHRpbmcgZmllbGQgZXJyb3JzXG4gICAqL1xuICBzZXRFcnJvcjogVXNlRm9ybVNldEVycm9yPFRGaWVsZFZhbHVlcz47XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHNlcnZlciB2YWxpZGF0aW9uIGVycm9ycyBhbmQgYXBwbGllcyB0aGVtIHRvIHJlYWN0LWhvb2stZm9ybSBmaWVsZHMuXG4gKlxuICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIHRha2VzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYSBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGF1dG9tYXRpY2FsbHlcbiAqIGFwcGxpZXMgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBmb3JtIGZpZWxkcyB1c2luZyByZWFjdC1ob29rLWZvcm0ncyBzZXRFcnJvciBmdW5jdGlvbi5cbiAqIEl0IHN1cHBvcnRzIHZhcmlvdXMgZXJyb3IgZm9ybWF0cyBpbmNsdWRpbmcgc3RyaW5ncywgYXJyYXlzIG9mIHN0cmluZ3MsIGFuZCBib29sZWFuIGZsYWdzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB1c2VzIG9iamVjdCBmbGF0dGVuaW5nIHRvIGhhbmRsZSBuZXN0ZWQgZXJyb3Igc3RydWN0dXJlcyBhbmQgZW5zdXJlc1xuICogdGhhdCBvbmx5IHZhbGlkIGZpZWxkIHBhdGhzIGFyZSBwcm9jZXNzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc2VydmVyIHJlc3BvbnNlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VGb3JtKCk7XG4gKlxuICogdHJ5IHtcbiAqICAgYXdhaXQgc3VibWl0Rm9ybShkYXRhKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGhhbmRsZVNlcnZlckVycm9ycyh7XG4gKiAgICAgZXJyb3JzOiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9ycyxcbiAqICAgICBzZXRFcnJvclxuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGRpZmZlcmVudCBlcnJvciBmb3JtYXRzOlxuICogYGBgdHN4XG4gKiBjb25zdCBzZXJ2ZXJFcnJvcnMgPSB7XG4gKiAgIGVtYWlsOiAnRW1haWwgaXMgYWxyZWFkeSB0YWtlbicsXG4gKiAgIHBhc3N3b3JkOiBbJ1RvbyBzaG9ydCcsICdNdXN0IGNvbnRhaW4gbnVtYmVycyddLFxuICogICB0ZXJtczogdHJ1ZSAvLyBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpbnZhbGlkXG4gKiB9O1xuICpcbiAqIGhhbmRsZVNlcnZlckVycm9ycyh7IGVycm9yczogc2VydmVyRXJyb3JzLCBzZXRFcnJvciB9KTtcbiAqIC8vIFJlc3VsdHMgaW46XG4gKiAvLyAtIGVtYWlsIGZpZWxkIHNob3dzOiBcIkVtYWlsIGlzIGFscmVhZHkgdGFrZW5cIlxuICogLy8gLSBwYXNzd29yZCBmaWVsZCBzaG93czogXCJUb28gc2hvcnQgTXVzdCBjb250YWluIG51bWJlcnNcIlxuICogLy8gLSB0ZXJtcyBmaWVsZCBzaG93czogXCJGaWVsZCBpcyBub3QgdmFsaWQuXCJcbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICpcbiAqIEBwYXJhbSBhcmdzIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBlcnJvcnMgYW5kIHNldEVycm9yIGZ1bmN0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaGFuZGxlU2VydmVyRXJyb3JzID0gZnVuY3Rpb24gaGFuZGxlU2VydmVyRXJyb3JzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzXG4+KGFyZ3M6IEhhbmRsZVNlcnZlckVycm9yc1R5cGU8VEZpZWxkVmFsdWVzPikge1xuICBjb25zdCB7IGVycm9ycywgc2V0RXJyb3IgfSA9IGFyZ3M7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gZXJyb3JzKSB7XG4gICAgY29uc3QgaXNLZXlJblZhcmlhYmxlcyA9IE9iamVjdC5rZXlzKGZsYXR0ZW5PYmplY3RLZXlzKGVycm9ycykpLmluY2x1ZGVzKFxuICAgICAga2V5XG4gICAgKTtcblxuICAgIGlmICghaXNLZXlJblZhcmlhYmxlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRFcnJvciA9IGVycm9yc1trZXldO1xuXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZEVycm9yKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZmllbGRFcnJvci5qb2luKFwiIFwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGZpZWxkRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSBcImJvb2xlYW5cIiAmJiBmaWVsZEVycm9yKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIkZpZWxkIGlzIG5vdCB2YWxpZC5cIjtcbiAgICB9XG5cbiAgICBzZXRFcnJvcihrZXkgYXMgUGF0aDxURmllbGRWYWx1ZXM+LCB7XG4gICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBUeXBlLXNhZmUgcHJvcGVydHkgZXhpc3RlbmNlIGNoZWNrZXIgdGhhdCBhY3RzIGFzIGEgdHlwZSBndWFyZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBwcm9wZXJ0eSBleGlzdHMgb24gYW4gb2JqZWN0IGFuZCBuYXJyb3dzIHRoZSBUeXBlU2NyaXB0IHR5cGVcbiAqIHRvIGluY2x1ZGUgdGhhdCBwcm9wZXJ0eS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNhZmVseSBhY2Nlc3NpbmcgcHJvcGVydGllcyBvblxuICogb2JqZWN0cyBvZiB1bmtub3duIHN0cnVjdHVyZSB3aGlsZSBtYWludGFpbmluZyB0eXBlIHNhZmV0eS5cbiAqXG4gKiBAdGVtcGxhdGUgWCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY2hlY2tlZFxuICogQHRlbXBsYXRlIFkgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkga2V5IChleHRlbmRzIFByb3BlcnR5S2V5KVxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wIC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgZXhpc3RlbmNlXG4gKlxuICogQHJldHVybnMgQSB0eXBlIHByZWRpY2F0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgb2JqZWN0LlxuICogICAgICAgICAgSWYgdHJ1ZSwgdGhlIG9iamVjdCB0eXBlIGlzIG5hcnJvd2VkIHRvIGluY2x1ZGUgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGF0YTogdW5rbm93biA9IHsgbmFtZTogXCJKb2huXCIsIGFnZTogMzAgfTtcbiAqXG4gKiBpZiAocHJvcGVydHlFeGlzdHMoZGF0YSwgXCJuYW1lXCIpKSB7XG4gKiAgIC8vIFR5cGVTY3JpcHQgbm93IGtub3dzIGRhdGEgaGFzIGEgJ25hbWUnIHByb3BlcnR5XG4gKiAgIGNvbnNvbGUubG9nKGRhdGEubmFtZSk7IC8vIFR5cGUtc2FmZSBhY2Nlc3NcbiAqIH1cbiAqXG4gKiAvLyBDaGVjayBmb3IgbmVzdGVkIHByb3BlcnR5IGV4aXN0ZW5jZVxuICogaWYgKHByb3BlcnR5RXhpc3RzKG9iaiwgXCJ1c2VyXCIpICYmIHByb3BlcnR5RXhpc3RzKG9iai51c2VyLCBcImlkXCIpKSB7XG4gKiAgIGNvbnNvbGUubG9nKG9iai51c2VyLmlkKTsgLy8gU2FmZSBuZXN0ZWQgYWNjZXNzXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMi4xOC40NVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlFeGlzdHM8WCwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgICBvYmo6IFgsXG4gICAgcHJvcDogWVxuKTogb2JqIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgb2JqICE9PSBudWxsICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG4gICAgKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiIsICJleHBvcnQgY29uc3QgcmVtb3ZlTGVhZGluZ1RyYWlsaW5nU2xhc2hlcyA9IChyb3V0ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiByb3V0ZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIik7XG59O1xuIiwgImltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBzY2hlbWFUb29scyA9IHtcbiAgLy8gRGF0ZSB2YWxpZGF0aW9uc1xuICBkYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2VcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyYW5zZm9ybSgoYykgPT4gKGMgPT09IFwibnVsbFwiIHx8IGMgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogYykpXG4gICAgICAucmVmaW5lKChjKSA9PiAhIWMsIHsgbWVzc2FnZTogbWVzc2FnZSB8fCBcIkRhdGUgaXMgcmVxdWlyZWRcIiB9KVxuICAgICAgLnJlZmluZSgoYykgPT4gKGMgPyBkYXlqcyhjKS5pc1ZhbGlkKCkgOiB0cnVlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiSW52YWxpZCBkYXRlXCIsXG4gICAgICB9KSxcblxuICBudWxsYWJsZURhdGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZVxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJhbnNmb3JtKChjKSA9PiAoYyA9PT0gXCJudWxsXCIgPyBudWxsIDogYykpXG4gICAgICAudHJhbnNmb3JtKChjKSA9PiAoYyA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBjKSlcbiAgICAgIC5yZWZpbmUoKGMpID0+ICghYyAmJiBjICE9PSBudWxsID8gZGF5anMoYykuaXNWYWxpZCgpIDogdHJ1ZSksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIkludmFsaWQgZGF0ZVwiLFxuICAgICAgfSksXG5cbiAgZGF0ZVJhbmdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5vYmplY3Qoe1xuICAgICAgc3RhcnQ6IHouY29lcmNlLmRhdGUoKSxcbiAgICAgIGVuZDogei5jb2VyY2UuZGF0ZSgpLFxuICAgIH0pLnJlZmluZSgoZGF0YSkgPT4gZGF0YS5zdGFydCA8PSBkYXRhLmVuZCwge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIlN0YXJ0IGRhdGUgbXVzdCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gZW5kIGRhdGVcIixcbiAgICB9KSxcblxuICAvLyBTdHJpbmcgdmFsaWRhdGlvbnNcbiAgcmVxdWlyZWRTdHJpbmc6ICh7IG1lc3NhZ2UsIG1pbiwgbWF4IH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluPzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4obWluIHx8IDEsIG1lc3NhZ2UgfHwgYFN0cmluZyBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IDF9IGNoYXJhY3RlcnNgKVxuICAgICAgLm1heChtYXggfHwgMjU1LCBtZXNzYWdlIHx8IGBTdHJpbmcgbXVzdCBiZSBhdCBtb3N0ICR7bWF4IHx8IDI1NX0gY2hhcmFjdGVyc2ApLFxuXG4gIGVtYWlsOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLmVtYWlsKG1lc3NhZ2UgfHwgXCJJbnZhbGlkIGVtYWlsIGFkZHJlc3NcIilcbiAgICAgIC5tYXgoMjU0LCBcIkVtYWlsIG11c3QgYmUgYXQgbW9zdCAyNTQgY2hhcmFjdGVyc1wiKSxcblxuICB1cmw6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAudXJsKG1lc3NhZ2UgfHwgXCJJbnZhbGlkIFVSTCBmb3JtYXRcIiksXG5cbiAgcGhvbmU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAucmVnZXgoL15bXFwrXT9bMS05XVtcXGRdezAsMTV9JC8sIG1lc3NhZ2UgfHwgXCJJbnZhbGlkIHBob25lIG51bWJlciBmb3JtYXRcIiksXG5cbiAgYWxwaGFudW1lcmljOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KC9eW2EtekEtWjAtOV0rJC8sIG1lc3NhZ2UgfHwgXCJPbmx5IGxldHRlcnMgYW5kIG51bWJlcnMgYXJlIGFsbG93ZWRcIiksXG5cbiAgc2x1ZzogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXlthLXowLTldKyg/Oi1bYS16MC05XSspKiQvLCBtZXNzYWdlIHx8IFwiSW52YWxpZCBzbHVnIGZvcm1hdFwiKSxcblxuICAvLyBOdW1iZXIgdmFsaWRhdGlvbnNcbiAgcG9zaXRpdmVOdW1iZXI6ICh7IG1lc3NhZ2UsIG1pbiwgbWF4IH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluPzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHoubnVtYmVyKClcbiAgICAgIC5wb3NpdGl2ZShtZXNzYWdlIHx8IFwiTnVtYmVyIG11c3QgYmUgcG9zaXRpdmVcIilcbiAgICAgIC5taW4obWluIHx8IDAuMDEsIGBOdW1iZXIgbXVzdCBiZSBhdCBsZWFzdCAke21pbiB8fCAwLjAxfWApXG4gICAgICAubWF4KG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCksXG5cbiAgbm9uTmVnYXRpdmVOdW1iZXI6ICh7IG1lc3NhZ2UsIG1heCB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8IFwiTnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlXCIpXG4gICAgICAubWF4KG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCksXG5cbiAgaW50ZWdlcjogKHsgbWVzc2FnZSwgbWluLCBtYXggfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLmludChtZXNzYWdlIHx8IFwiTXVzdCBiZSBhbiBpbnRlZ2VyXCIpXG4gICAgICAubWluKG1pbiB8fCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSfWApXG4gICAgICAubWF4KG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCksXG5cbiAgcGVyY2VudGFnZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHoubnVtYmVyKClcbiAgICAgIC5taW4oMCwgbWVzc2FnZSB8fCBcIlBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMFwiKVxuICAgICAgLm1heCgxMDAsIG1lc3NhZ2UgfHwgXCJQZXJjZW50YWdlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDBcIiksXG5cbiAgLy8gQXJyYXkgdmFsaWRhdGlvbnNcbiAgbm9uRW1wdHlBcnJheTogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4sIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYXJyYXkoc2NoZW1hKVxuICAgICAgLm1pbigxLCBtZXNzYWdlIHx8IFwiQXQgbGVhc3Qgb25lIGl0ZW0gaXMgcmVxdWlyZWRcIiksXG5cbiAgdW5pcXVlQXJyYXk6IDxUPihzY2hlbWE6IHouWm9kU2NoZW1hPFQ+LCB7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmFycmF5KHNjaGVtYSlcbiAgICAgIC5yZWZpbmUoKGl0ZW1zKSA9PiBuZXcgU2V0KGl0ZW1zKS5zaXplID09PSBpdGVtcy5sZW5ndGgsIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIkFsbCBpdGVtcyBtdXN0IGJlIHVuaXF1ZVwiLFxuICAgICAgfSksXG5cbiAgLy8gQm9vbGVhbiB2YWxpZGF0aW9uc1xuICByZXF1aXJlZEJvb2xlYW46ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmJvb2xlYW4oe1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbiAgICB9KSxcblxuICAvLyBPYmplY3QgdmFsaWRhdGlvbnNcbiAgbm9uRW1wdHlPYmplY3Q6IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4sIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHNjaGVtYS5yZWZpbmUoKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiT2JqZWN0IGNhbm5vdCBiZSBlbXB0eVwiLFxuICAgIH0pLFxuXG4gIC8vIEZpbGUgdmFsaWRhdGlvbnNcbiAgZmlsZVNpemU6ICh7IG1heFNpemUsIG1lc3NhZ2UgfTogeyBtYXhTaXplOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSkgPT5cbiAgICB6Lmluc3RhbmNlb2YoRmlsZSlcbiAgICAgIC5yZWZpbmUoKGZpbGUpID0+IGZpbGUuc2l6ZSA8PSBtYXhTaXplLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgYEZpbGUgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAke01hdGgucm91bmQobWF4U2l6ZSAvIDEwMjQgLyAxMDI0KX1NQmAsXG4gICAgICB9KSxcblxuICBmaWxlVHlwZTogKHsgYWxsb3dlZFR5cGVzLCBtZXNzYWdlIH06IHsgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXTsgbWVzc2FnZT86IHN0cmluZyB9KSA9PlxuICAgIHouaW5zdGFuY2VvZihGaWxlKVxuICAgICAgLnJlZmluZSgoZmlsZSkgPT4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBgRmlsZSB0eXBlIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWRUeXBlcy5qb2luKFwiLCBcIil9YCxcbiAgICAgIH0pLFxuXG4gIC8vIEN1c3RvbSB2YWxpZGF0b3JzXG4gIGNvbmRpdGlvbmFsOiA8VCwgVT4oXG4gICAgY29uZGl0aW9uOiAoZGF0YTogVCkgPT4gYm9vbGVhbixcbiAgICB0cnVlU2NoZW1hOiB6LlpvZFNjaGVtYTxVPixcbiAgICBmYWxzZVNjaGVtYTogei5ab2RTY2hlbWE8VT5cbiAgKSA9PlxuICAgIHoudW5pb24oW3RydWVTY2hlbWEsIGZhbHNlU2NoZW1hXSlcbiAgICAgIC5zdXBlclJlZmluZSgoZGF0YSwgY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNob3VsZFVzZVRydWUgPSBjb25kaXRpb24oZGF0YSBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBzaG91bGRVc2VUcnVlID8gdHJ1ZVNjaGVtYSA6IGZhbHNlU2NoZW1hO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKGRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgdHJhbnNmb3JtOiB7XG4gICAgdG9Mb3dlckNhc2U6IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IHZhbC50b0xvd2VyQ2FzZSgpKSxcbiAgICB0b1VwcGVyQ2FzZTogei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCkgPT4gdmFsLnRvVXBwZXJDYXNlKCkpLFxuICAgIHRyaW06IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IHZhbC50cmltKCkpLFxuICAgIHRvTnVtYmVyOiB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsKSA9PiBOdW1iZXIodmFsKSksXG4gICAgdG9Cb29sZWFuOiB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsKSA9PiB2YWwgPT09IFwidHJ1ZVwiKSxcbiAgICBwYXJzZUpzb246IDxUPihzY2hlbWE6IHouWm9kU2NoZW1hPFQ+KSA9PiBcbiAgICAgIHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgICBcbiAgICAgICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LmVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBKU09OXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgfVxuICAgICAgfSksXG4gIH0sXG59O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgUGF0aCxcbiAgQ29udHJvbCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZFZhbHVlcyxcbiAgRGVlcFBhcnRpYWxTa2lwQXJyYXlLZXksXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7IHVzZVdhdGNoIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIENvcmUgd2F0Y2ggZnVuY3Rpb25zIGZvciBSZWFjdCBIb29rIEZvcm1cbiAqIFRoZXNlIGFyZSB0aGUgcHJpbWFyeSBidWlsZGluZyBibG9ja3MgZm9yIGZvcm0gd2F0Y2hpbmdcbiAqL1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBlbnN1cmUgYXJyYXkgZWxlbWVudHMgYXJlIGFsbCBQYXRoPFQ+XG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhBcnJheTxUIGV4dGVuZHMgRmllbGRWYWx1ZXM+ID0gUmVhZG9ubHlBcnJheTxQYXRoPFQ+PjtcblxuLyoqXG4gKiBIb29rIHRvIHdhdGNoIGVudGlyZSBmb3JtIC0gcmV0dXJucyBhbGwgZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRm9ybSA9IDxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcz4oXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPlxuKTogRGVlcFBhcnRpYWxTa2lwQXJyYXlLZXk8VEZpZWxkVmFsdWVzPiA9PiB1c2VXYXRjaCh7IGNvbnRyb2wgfSk7XG5cbi8qKlxuICogSG9vayB0byB3YXRjaCBzaW5nbGUgZmllbGQgYnkgcGF0aCAtIHN1cHBvcnRzIGFueSBuZXN0ZWQgcGF0aFxuICovXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hGaWVsZCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lXG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4vKipcbiAqIEhvb2sgdG8gd2F0Y2ggbXVsdGlwbGUgZmllbGRzIGJ5IHBhdGhzIC0gcmV0dXJucyBhcnJheSBvZiB2YWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRmllbGRzID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWVzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxQYXRoPFRGaWVsZFZhbHVlcz4+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWVzOiBUTmFtZXNcbik6IEFycmF5PFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lc1tudW1iZXJdPj4gPT4gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lOiBuYW1lcyB9KSBhcyBBcnJheTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZXNbbnVtYmVyXT4+O1xuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGF0aCxcbiAgQ29udHJvbCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHsgdXNlV2F0Y2ggfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogVXRpbGl0eSB3YXRjaCBmdW5jdGlvbnMgZm9yIFJlYWN0IEhvb2sgRm9ybVxuICogRW5oYW5jZWQgZnVuY3Rpb25hbGl0eSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzXG4gKi9cblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIHRyYW5zZm9ybWF0aW9uL3NlbGVjdG9yXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaFRyYW5zZm9ybSA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3V0cHV0XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lLFxuICB0cmFuc2Zvcm06ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3V0cHV0XG4pOiBUT3V0cHV0ID0+IHtcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XG5cbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gdHJhbnNmb3JtKHZhbHVlKSwgW3ZhbHVlLCB0cmFuc2Zvcm1dKTtcbn07XG5cbi8qKlxuICogV2F0Y2ggZmllbGQgd2l0aCBkZWZhdWx0IGZhbGxiYWNrIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlZmF1bHQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgZGVmYXVsdFZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbik6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA/PyBkZWZhdWx0VmFsdWU7XG59O1xuXG4vKipcbiAqIFdhdGNoIGZpZWxkIGFzIGJvb2xlYW4gd2l0aCBndWFyYW50ZWVkIGJvb2xlYW4gcmV0dXJuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJvb2xlYW4gPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgZGVmYXVsdFZhbHVlID0gZmFsc2Vcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSA/PyBkZWZhdWx0VmFsdWUpO1xufTtcblxuLyoqXG4gKiBXYXRjaCBtdWx0aXBsZSBmaWVsZHMgYW5kIHJldHVybiBhbiBvYmplY3Qgd2l0aCBmaWVsZCBwYXRocyBhcyBrZXlzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJhdGNoID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVEZpZWxkcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8UGF0aDxURmllbGRWYWx1ZXM+PlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBmaWVsZHM6IFRGaWVsZHNcbik6IHsgW0sgaW4gVEZpZWxkc1tudW1iZXJdXTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgSz4gfSA9PiB7XG4gIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZTogZmllbGRzIH0pO1xuXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtLIGluIFRGaWVsZHNbbnVtYmVyXV06IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIEs+IH07XG5cbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICByZXN1bHRbZmllbGQgYXMgVEZpZWxkc1tudW1iZXJdXSA9IHZhbHVlc1tpbmRleF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbdmFsdWVzLCBmaWVsZHNdKTtcbn07XG5cbi8qKlxuICogV2F0Y2ggZmllbGQgY29uZGl0aW9uYWxseSBiYXNlZCBvbiBib29sZWFuIGZsYWdcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoQ29uZGl0aW9uYWwgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgc2hvdWxkV2F0Y2g6IGJvb2xlYW4sXG4gIGZhbGxiYWNrPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhY3RpdmVWYWx1ZSA9IHVzZVdhdGNoKHtcbiAgICBjb250cm9sLFxuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQ6ICFzaG91bGRXYXRjaFxuICB9KTtcblxuICByZXR1cm4gc2hvdWxkV2F0Y2ggPyBhY3RpdmVWYWx1ZSA6IGZhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIGRlYm91bmNlZCB1cGRhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlYm91bmNlZCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lLFxuICBkZWxheSA9IDMwMFxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHtcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XG4gIGNvbnN0IFtkZWJvdW5jZWRWYWx1ZSwgc2V0RGVib3VuY2VkVmFsdWVdID0gdXNlU3RhdGU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+Pih2YWx1ZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc2V0RGVib3VuY2VkVmFsdWUodmFsdWUpO1xuICAgIH0sIGRlbGF5KTtcblxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbdmFsdWUsIGRlbGF5XSk7XG5cbiAgcmV0dXJuIGRlYm91bmNlZFZhbHVlO1xufTtcblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIG1lbW9pemVkIHNlbGVjdG9yIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaFNlbGVjdG9yID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPdXRwdXRcbj4oXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcbiAgbmFtZTogVE5hbWUsXG4gIHNlbGVjdG9yOiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE91dHB1dCxcbiAgZGVwczogUmVhY3QuRGVwZW5kZW5jeUxpc3QgPSBbXVxuKTogVE91dHB1dCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHJldHVybiB1c2VNZW1vKFxuICAgICgpID0+IHNlbGVjdG9yKHZhbHVlKSxcbiAgICBbdmFsdWUsIHNlbGVjdG9yLCAuLi5kZXBzXSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICApO1xufTtcbiIsICIvKipcbiAqIEVuaGFuY2VkIFR5cGVTY3JpcHQgdXRpbGl0aWVzIGZvciBSZWFjdCBIb29rIEZvcm0ncyB1c2VXYXRjaFxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YgdHlwZS1zYWZlIHdhdGNoIGZ1bmN0aW9uc1xuICogd2l0aCBiZXR0ZXIgZXJnb25vbWljcyBhbmQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEJvb2xlYW4sIHR5cGVkV2F0Y2ggfSBmcm9tICdzcmMvdXRpbHMvd2F0Y2gnO1xuICpcbiAqIC8vIERpcmVjdCB1c2FnZSAoaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMpXG4gKiBjb25zdCBlbWFpbCA9IHVzZVdhdGNoRmllbGQoY29udHJvbCwgJ3VzZXIuZW1haWwnKTtcbiAqIGNvbnN0IGlzQWRtaW4gPSB1c2VXYXRjaEJvb2xlYW4oY29udHJvbCwgJ3VzZXIuaXNBZG1pbicpO1xuICpcbiAqIC8vIE9iamVjdC1iYXNlZCB1c2FnZSAoaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMpXG4gKiBjb25zdCBlbWFpbCA9IHR5cGVkV2F0Y2guZmllbGQoY29udHJvbCwgJ3VzZXIuZW1haWwnKTtcbiAqIGNvbnN0IGlzQWRtaW4gPSB0eXBlZFdhdGNoLmJvb2xlYW4oY29udHJvbCwgJ3VzZXIuaXNBZG1pbicpO1xuICogYGBgXG4gKi9cblxuLy8gQ29yZSBmdW5jdGlvbnNcbmV4cG9ydCB7IHVzZVdhdGNoRm9ybSwgdXNlV2F0Y2hGaWVsZCwgdXNlV2F0Y2hGaWVsZHMgfSBmcm9tICcuL2NvcmUnO1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgdXNlV2F0Y2hCYXRjaCxcbiAgdXNlV2F0Y2hEZWZhdWx0LFxuICB1c2VXYXRjaEJvb2xlYW4sXG4gIHVzZVdhdGNoU2VsZWN0b3IsXG4gIHVzZVdhdGNoVHJhbnNmb3JtLFxuICB1c2VXYXRjaERlYm91bmNlZCxcbiAgdXNlV2F0Y2hDb25kaXRpb25hbCxcbn0gZnJvbSAnLi91dGlsaXRpZXMnO1xuXG5leHBvcnQgdHlwZSB7IFBhdGhBcnJheSB9IGZyb20gJy4vY29yZSc7XG5cbi8vIEltcG9ydCBhbGwgZnVuY3Rpb25zIGZvciBkZWZhdWx0IGV4cG9ydFxuaW1wb3J0IHsgdXNlV2F0Y2hGb3JtLCB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEZpZWxkcyB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQge1xuICB1c2VXYXRjaEJhdGNoLFxuICB1c2VXYXRjaERlZmF1bHQsXG4gIHVzZVdhdGNoQm9vbGVhbixcbiAgdXNlV2F0Y2hTZWxlY3RvcixcbiAgdXNlV2F0Y2hUcmFuc2Zvcm0sXG4gIHVzZVdhdGNoRGVib3VuY2VkLFxuICB1c2VXYXRjaENvbmRpdGlvbmFsLFxufSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbi8qKlxuICogT3JnYW5pemVkIHV0aWxpdGllcyBieSB1c2UgY2FzZVxuICogUHJvdmlkZXMgYSBjb252ZW5pZW50IG9iamVjdC1iYXNlZCBBUEkgZm9yIGFsbCB3YXRjaCBmdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVkV2F0Y2ggPSB7XG4gIC8vID09PSBDT1JFIEZVTkNUSU9OUyA9PT1cbiAgLyoqIFdhdGNoIGVudGlyZSBmb3JtICovXG4gIGZvcm06IHVzZVdhdGNoRm9ybSxcbiAgLyoqIFdhdGNoIHNpbmdsZSBmaWVsZCAqL1xuICBmaWVsZDogdXNlV2F0Y2hGaWVsZCxcbiAgLyoqIFdhdGNoIG11bHRpcGxlIGZpZWxkcyAqL1xuICBmaWVsZHM6IHVzZVdhdGNoRmllbGRzLFxuXG4gIC8vID09PSBVVElMSVRZIEZVTkNUSU9OUyA9PT1cbiAgLyoqIFdhdGNoIHdpdGggdHJhbnNmb3JtYXRpb24gKi9cbiAgdHJhbnNmb3JtOiB1c2VXYXRjaFRyYW5zZm9ybSxcbiAgLyoqIFdhdGNoIHdpdGggZGVmYXVsdCB2YWx1ZSAqL1xuICB3aXRoRGVmYXVsdDogdXNlV2F0Y2hEZWZhdWx0LFxuICAvKiogV2F0Y2ggYXMgYm9vbGVhbiAqL1xuICBib29sZWFuOiB1c2VXYXRjaEJvb2xlYW4sXG4gIC8qKiBXYXRjaCBtdWx0aXBsZSB3aXRoIGN1c3RvbSBrZXlzICovXG4gIGJhdGNoOiB1c2VXYXRjaEJhdGNoLFxuICAvKiogV2F0Y2ggY29uZGl0aW9uYWxseSAqL1xuICBjb25kaXRpb25hbDogdXNlV2F0Y2hDb25kaXRpb25hbCxcbiAgLyoqIFdhdGNoIHdpdGggZGVib3VuY2luZyAqL1xuICBkZWJvdW5jZWQ6IHVzZVdhdGNoRGVib3VuY2VkLFxuICAvKiogV2F0Y2ggd2l0aCBzZWxlY3RvciAqL1xuICBzZWxlY3RvcjogdXNlV2F0Y2hTZWxlY3Rvcixcbn0gYXMgY29uc3Q7XG4iLCAiLyoqXG4gKiBUeXBlIGd1YXJkIHV0aWxpdGllcyBmb3IgcnVudGltZSB0eXBlIGNoZWNraW5nXG4gKiBcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLW51bGwgb2JqZWN0IChleGNsdWRpbmcgYXJyYXlzKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNSZWNvcmQodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBzcGVjaWZpYyBwcm9wZXJ0eVxuICogXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjaGVja1xuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gbG9vayBmb3JcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaGFzUHJvcGVydHkob2JqLCAnbmFtZScpKSB7XG4gKiAgIC8vIG9iaiBpcyBSZWNvcmQ8J25hbWUnLCB1bmtub3duPlxuICogICBjb25zb2xlLmxvZyhvYmoubmFtZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcGVydHk8SyBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgb2JqOiB1bmtub3duLFxuICBrZXk6IEtcbik6IG9iaiBpcyBSZWNvcmQ8SywgdW5rbm93bj4ge1xuICByZXR1cm4gaXNSZWNvcmQob2JqKSAmJiBrZXkgaW4gb2JqO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc05vbkVtcHR5U3RyaW5nKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBzdHJpbmcgd2l0aCBsZW5ndGggPiAwXG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlLnRvVXBwZXJDYXNlKCkpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyB1bmtub3duW11cbiAqICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IGNvbnNvbGUubG9nKGl0ZW0pKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5PFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBub24tZW1wdHkgYXJyYXlcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBhcnJheVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTm9uRW1wdHlBcnJheShpdGVtcykpIHtcbiAqICAgLy8gaXRlbXMgaXMgW1QsIC4uLlRbXV0gLSBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnRcbiAqICAgY29uc3QgZmlyc3QgPSBpdGVtc1swXTsgIC8vIFNhZmUgYWNjZXNzXG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eUFycmF5PFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgW1QsIC4uLlRbXV0ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBmdW5jdGlvblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICogICAvLyBjYWxsYmFjayBpcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duXG4gKiAgIGNhbGxiYWNrKCk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzICguLi5hcmdzOiByZWFkb25seSB1bmtub3duW10pID0+IHVua25vd24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIChpbmNsdWRpbmcgZW1wdHkgc3RyaW5nKVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBzdHJpbmdcbiAqICAgY29uc29sZS5sb2codmFsdWUubGVuZ3RoKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG51bWJlciAoZXhjbHVkaW5nIE5hTilcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG51bWJlclxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBudW1iZXIgKG5vdCBOYU4pXG4gKiAgIGNvbnN0IGRvdWJsZWQgPSB2YWx1ZSAqIDI7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0Jvb2xlYW4odmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIGJvb2xlYW5cbiAqICAgY29uc29sZS5sb2coIXZhbHVlKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBudWxsXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbnVsbFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVsbCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgbnVsbFxuICogICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG51bGxpc2hcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc051bGxpc2godmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWRcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIFxuICogaWYgKCFpc051bGxpc2godmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIE5vbk51bGxhYmxlPHR5cGVvZiB2YWx1ZT5cbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbGlzaCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgZGVmaW5lZCAobm90IG51bGwgb3IgdW5kZWZpbmVkKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyZWQgPSBpdGVtcy5maWx0ZXIoaXNEZWZpbmVkKTtcbiAqIC8vIGZpbHRlcmVkIGhhcyB0eXBlOiBOb25OdWxsYWJsZTxUPltdXG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkPFQ+KHZhbHVlOiBUKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBEYXRlIG9iamVjdFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgRGF0ZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgRGF0ZVxuICogICBjb25zb2xlLmxvZyh2YWx1ZS50b0lTT1N0cmluZygpKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBQcm9taXNlXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBQcm9taXNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNQcm9taXNlKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBQcm9taXNlPHVua25vd24+XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgIChpc1JlY29yZCh2YWx1ZSkgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnRoZW4gPT09ICdmdW5jdGlvbicpXG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBlcnJvciBpcyBhbiBFcnJvciBpbnN0YW5jZVxuICogXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVycm9yIGlzIGFuIEVycm9yIGluc3RhbmNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICAvLyAuLi5cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICogICAgIC8vIGVycm9yIGlzIEVycm9yXG4gKiAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBtYXRjaGVzIGEgc3BlY2lmaWMgdHlwZSB1c2luZyBhIHZhbGlkYXRvciBmdW5jdGlvblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEBwYXJhbSB2YWxpZGF0b3IgLSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbnRlcmZhY2UgVXNlciB7XG4gKiAgIGlkOiBzdHJpbmc7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqIH1cbiAqIFxuICogY29uc3QgaXNVc2VyID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVXNlciA9PlxuICogICBpc1JlY29yZCh2YWx1ZSkgJiZcbiAqICAgaGFzUHJvcGVydHkodmFsdWUsICdpZCcpICYmXG4gKiAgIGhhc1Byb3BlcnR5KHZhbHVlLCAnbmFtZScpICYmXG4gKiAgIGlzU3RyaW5nKHZhbHVlLmlkKSAmJlxuICogICBpc1N0cmluZyh2YWx1ZS5uYW1lKTtcbiAqIFxuICogaWYgKGlzVXNlcihkYXRhKSkge1xuICogICAvLyBkYXRhIGlzIFVzZXJcbiAqICAgY29uc29sZS5sb2coZGF0YS5uYW1lKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzPFQ+KFxuICB2YWx1ZTogdW5rbm93bixcbiAgdmFsaWRhdG9yOiAodmFsdWU6IHVua25vd24pID0+IHZhbHVlIGlzIFRcbik6IHZhbHVlIGlzIFQge1xuICByZXR1cm4gdmFsaWRhdG9yKHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFLQSxJQUFNLGNBQWMsT0FDbEIsS0FDQSxZQUM0QjtBQUM1QixRQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssT0FBTztBQUV6QyxNQUFJLFNBQVMsSUFBSTtBQUNmLFVBQU0sVUFBYSxNQUFNLFNBQVMsS0FBSztBQUV2QyxXQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0EsUUFBUSxTQUFTO0FBQUEsSUFDbkI7QUFBQSxFQUNGLFdBQVcsU0FBUyxXQUFXLEtBQUs7QUFDbEMsVUFBTSxVQUEwQixNQUFNLFNBQVMsS0FBSztBQUVwRCxVQUFNLE9BQXVCO0FBQUEsTUFDM0IsUUFBUSxTQUFTO0FBQUEsTUFDakIsT0FBTyxRQUFRO0FBQUEsSUFDakI7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBOEIsTUFBTSxTQUFTLEtBQUs7QUFFeEQsU0FBTztBQUNUO0FBRUEsSUFBcUIsTUFBckIsTUFBeUI7QUFBQSxFQUN2QixhQUFhLE9BQ1gsS0FDQSxXQUN1QztBQUN2QyxVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxhQUFhLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDL0Q7QUFBQSxNQUVBLE1BQU0sS0FBSyxVQUFVLEVBQUUsR0FBRyxXQUFXLEdBQUcsVUFBVSxZQUFZLENBQUM7QUFBQSxNQUMvRCxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNLFlBQTZCLEtBQUssY0FBYztBQUUxRSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxLQUFRLEtBQWEsT0FBbUIsQ0FBQyxHQUE0QjtBQUNoRixVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxhQUFhLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDL0Q7QUFBQSxNQUNBLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUN6QixRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLElBQU8sS0FBc0M7QUFDeEQsVUFBTSxpQkFBaUM7QUFBQSxNQUNyQyxTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sT0FBTyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRXJELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE9BQVUsS0FBc0M7QUFDM0QsVUFBTSxpQkFBaUM7QUFBQSxNQUNyQyxTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sT0FBTyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRXJELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLElBQU8sS0FBYSxPQUFtQixDQUFDLEdBQTRCO0FBQy9FLFVBQU0saUJBQWlDO0FBQUEsTUFDckMsU0FBUztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsUUFDaEIsZUFBZSxVQUFVLGFBQWEsUUFBUSxjQUFjLENBQUM7QUFBQSxNQUMvRDtBQUFBLE1BQ0EsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQ3pCLFFBQVE7QUFBQSxJQUNWO0FBRUEsVUFBTSxjQUFjLE1BQU0sWUFBZSxLQUFLLGNBQWM7QUFFNUQsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWEsTUFBTSxLQUFhLFVBQXVCLENBQUMsR0FBc0I7QUFDNUUsVUFBTSxpQkFBOEI7QUFBQSxNQUNsQyxTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxHQUFHO0FBQUEsSUFDTDtBQUVBLFVBQU0sU0FBUyxNQUFNLE1BQU0sS0FBSyxjQUFjO0FBRTlDLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLFVBQ1gsS0FDQSxVQUEwQixFQUFFLFFBQVEsTUFBTSxHQUNqQjtBQUN6QixVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsTUFDQSxHQUFHO0FBQUEsSUFDTDtBQUNBLFVBQU0sY0FBYyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE9BQ1gsS0FDQSxVQUN5QjtBQUN6QixVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGVBQWUsVUFBVSxhQUFhLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDL0Q7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxJQUNWO0FBRUEsVUFBTSxjQUFjLE1BQU0sWUFBZSxLQUFLLGNBQWM7QUFFNUQsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDeEpBLElBQU1BLGVBQWMsT0FDbEIsS0FDQSxZQUM0QjtBQUM1QixRQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssT0FBTztBQUV6QyxNQUFJLFNBQVMsSUFBSTtBQUNmLFVBQU0sVUFBYSxNQUFNLFNBQVMsS0FBSztBQUV2QyxXQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0EsUUFBUSxTQUFTO0FBQUEsSUFDbkI7QUFBQSxFQUNGLFdBQVcsU0FBUyxXQUFXLEtBQUs7QUFDbEMsVUFBTSxVQUEwQixNQUFNLFNBQVMsS0FBSztBQUVwRCxVQUFNLE9BQXVCO0FBQUEsTUFDM0IsUUFBUSxTQUFTO0FBQUEsTUFDakIsT0FBTyxRQUFRO0FBQUEsSUFDakI7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBOEIsTUFBTSxTQUFTLEtBQUs7QUFFeEQsU0FBTztBQUNUO0FBRUEsSUFBcUIsT0FBckIsTUFBMEI7QUFBQSxFQUN4QixhQUFhLE9BQ1gsS0FDQSxXQUN1QztBQUN2QyxVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDakU7QUFBQSxNQUVBLE1BQU0sS0FBSyxVQUFVLEVBQUUsR0FBRyxXQUFXLEdBQUcsVUFBVSxZQUFZLENBQUM7QUFBQSxNQUMvRCxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNQyxhQUE2QixLQUFLLGNBQWM7QUFFMUUsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWEsS0FBUSxLQUFhLE9BQW1CLENBQUMsR0FBNEI7QUFDaEYsVUFBTSxpQkFBaUM7QUFBQSxNQUNyQyxTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFDQSxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDekIsUUFBUTtBQUFBLElBQ1Y7QUFFQSxVQUFNLGNBQWMsTUFBTUEsYUFBZSxLQUFLLGNBQWM7QUFFNUQsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWEsSUFBTyxLQUFzQztBQUN4RCxVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDakU7QUFBQSxNQUNBLFFBQVE7QUFBQSxJQUNWO0FBRUEsVUFBTSxPQUFPLE1BQU1BLGFBQWUsS0FBSyxjQUFjO0FBRXJELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE9BQVUsS0FBc0M7QUFDM0QsVUFBTSxpQkFBaUM7QUFBQSxNQUNyQyxTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sT0FBTyxNQUFNQSxhQUFlLEtBQUssY0FBYztBQUVyRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxJQUFPLEtBQWEsT0FBbUIsQ0FBQyxHQUE0QjtBQUMvRSxVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDakU7QUFBQSxNQUNBLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUN6QixRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNQSxhQUFlLEtBQUssY0FBYztBQUU1RCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxNQUFNLEtBQWEsVUFBdUIsQ0FBQyxHQUFzQjtBQUM1RSxVQUFNLGlCQUE4QjtBQUFBLE1BQ2xDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDakU7QUFBQSxNQUNBLEdBQUc7QUFBQSxJQUNMO0FBRUEsVUFBTSxTQUFTLE1BQU0sTUFBTSxLQUFLLGNBQWM7QUFFOUMsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWEsVUFDWCxLQUNBLFVBQTBCLEVBQUUsUUFBUSxNQUFNLEdBQ2pCO0FBQ3pCLFVBQU0saUJBQWlDO0FBQUEsTUFDckMsU0FBUztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxNQUNBLEdBQUc7QUFBQSxJQUNMO0FBQ0EsVUFBTSxjQUFjLE1BQU1BLGFBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE9BQ1gsS0FDQSxVQUN5QjtBQUN6QixVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGVBQWUsVUFBVSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDakU7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxJQUNWO0FBRUEsVUFBTSxjQUFjLE1BQU1BLGFBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3JKQSxJQUFNLFdBQVcsQ0FBQyxRQUNoQixPQUFPLFFBQVEsWUFBWSxRQUFRLFFBQVEsQ0FBQyxNQUFNLFFBQVEsR0FBRztBQVUvRCxJQUFNLFVBQVUsQ0FBQyxRQUFtQyxNQUFNLFFBQVEsR0FBRztBQStEOUQsSUFBTSxvQkFBb0IsQ0FBQyxLQUFjLFNBQVMsT0FBZ0M7QUFDdkYsTUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFdBQU87QUFBQSxNQUNMLENBQUMsTUFBTSxHQUFHO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLE9BQU8sS0FBSyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssUUFBUTtBQUMzQyxVQUFNLGdCQUFnQixPQUFPLFNBQVMsR0FBRyxNQUFNLE1BQU07QUFFckQsUUFBSSxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssT0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUTtBQUN0RCxVQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFBRSxRQUFRO0FBQ3hDLFlBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLFVBQWtCO0FBQ3hDLGlCQUFPO0FBQUEsWUFDTDtBQUFBLFlBQ0Esa0JBQWtCLE1BQU0sR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBRTtBQUFBLFVBQzNEO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSCxPQUFPO0FBQ0wsZUFBTyxPQUFPLEtBQUssa0JBQWtCLElBQUksR0FBRyxHQUFHLGdCQUFnQixHQUFHLENBQUM7QUFBQSxNQUNyRTtBQUdBLFVBQUksZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEdBQUc7QUFBQSxJQUNwQyxPQUFPO0FBQ0wsVUFBSSxnQkFBZ0IsR0FBRyxJQUFJLElBQUksR0FBRztBQUFBLElBQ3BDO0FBRUEsV0FBTztBQUFBLEVBQ1QsR0FBRyxDQUFDLENBQTRCO0FBQ2xDOzs7QUM1R08sU0FBUyxZQUNkLFNBQ0EsT0FDZTtBQUNmLFNBQU8sU0FBUyxRQUFRLENBQUMsUUFBUSxNQUFNLFFBQVEsS0FBeUIsSUFDcEUsT0FDQSxRQUFRLE1BQU0sWUFBWSxLQUF5QjtBQUN6RDs7O0FDNkRPLElBQU0scUJBQXFCLFNBQVNDLG9CQUV6QyxNQUE0QztBQUM1QyxRQUFNLEVBQUUsUUFBUSxTQUFTLElBQUk7QUFFN0IsYUFBVyxPQUFPLFFBQVE7QUFDeEIsVUFBTSxtQkFBbUIsT0FBTyxLQUFLLGtCQUFrQixNQUFNLENBQUMsRUFBRTtBQUFBLE1BQzlEO0FBQUEsSUFDRjtBQUVBLFFBQUksQ0FBQyxrQkFBa0I7QUFDckI7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhLE9BQU8sR0FBRztBQUU3QixRQUFJLGVBQWU7QUFFbkIsUUFBSSxNQUFNLFFBQVEsVUFBVSxHQUFHO0FBQzdCLHFCQUFlLFdBQVcsS0FBSyxHQUFHO0FBQUEsSUFDcEM7QUFFQSxRQUFJLE9BQU8sZUFBZSxVQUFVO0FBQ2xDLHFCQUFlO0FBQUEsSUFDakI7QUFFQSxRQUFJLE9BQU8sZUFBZSxhQUFhLFlBQVk7QUFDakQscUJBQWU7QUFBQSxJQUNqQjtBQUVBLGFBQVMsS0FBMkI7QUFBQSxNQUNsQyxTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDSDtBQUNGOzs7QUN6RU8sU0FBUyxlQUNaLEtBQ0EsTUFDNkI7QUFDN0IsU0FDSSxPQUFPLFFBQVEsWUFDZixRQUFRLFFBQ1IsT0FBTyxVQUFVLGVBQWUsS0FBSyxLQUFLLElBQUk7QUFFdEQ7OztBQ3ZDTyxTQUFTLGdCQUNkLFNBQ0EsT0FDYztBQUNkLE1BQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsUUFBSSxVQUFVLElBQUk7QUFDaEIsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLFFBQVEsTUFBTSxLQUFLLEtBQUs7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFDVDs7O0FDaEJPLElBQU0sK0JBQStCLENBQUMsVUFBa0I7QUFDN0QsU0FBTyxNQUFNLFFBQVEsWUFBWSxFQUFFO0FBQ3JDOzs7QUNGQSxPQUFPLFdBQVc7QUFDbEIsU0FBUyxTQUFTO0FBRVgsSUFBTSxjQUFjO0FBQUE7QUFBQSxFQUV6QixNQUFNLENBQUMsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDMUMsRUFBRSxPQUNDLE9BQU8sRUFDUCxVQUFVLENBQUMsTUFBTyxNQUFNLFVBQVUsTUFBTSxjQUFjLE9BQU8sQ0FBRSxFQUMvRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsV0FBVyxtQkFBbUIsQ0FBQyxFQUM3RCxPQUFPLENBQUMsTUFBTyxJQUFJLE1BQU0sQ0FBQyxFQUFFLFFBQVEsSUFBSSxNQUFPO0FBQUEsSUFDOUMsU0FBUyxXQUFXO0FBQUEsRUFDdEIsQ0FBQztBQUFBLEVBRUwsY0FBYyxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQ2xELEVBQUUsT0FDQyxPQUFPLEVBQ1AsVUFBVSxDQUFDLE1BQU8sTUFBTSxTQUFTLE9BQU8sQ0FBRSxFQUMxQyxVQUFVLENBQUMsTUFBTyxNQUFNLGNBQWMsT0FBTyxDQUFFLEVBQy9DLE9BQU8sQ0FBQyxNQUFPLENBQUMsS0FBSyxNQUFNLE9BQU8sTUFBTSxDQUFDLEVBQUUsUUFBUSxJQUFJLE1BQU87QUFBQSxJQUM3RCxTQUFTLFdBQVc7QUFBQSxFQUN0QixDQUFDO0FBQUEsRUFFTCxXQUFXLENBQUMsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDL0MsRUFBRSxPQUFPO0FBQUEsSUFDUCxPQUFPLEVBQUUsT0FBTyxLQUFLO0FBQUEsSUFDckIsS0FBSyxFQUFFLE9BQU8sS0FBSztBQUFBLEVBQ3JCLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsS0FBSyxLQUFLO0FBQUEsSUFDMUMsU0FBUyxXQUFXO0FBQUEsRUFDdEIsQ0FBQztBQUFBO0FBQUEsRUFHSCxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsS0FBSyxJQUFJLElBQXNELENBQUMsTUFDMUYsRUFBRSxPQUFPLEVBQ04sS0FBSyxFQUNMLElBQUksT0FBTyxHQUFHLFdBQVcsMkJBQTJCLE9BQU8sQ0FBQyxhQUFhLEVBQ3pFLElBQUksT0FBTyxLQUFLLFdBQVcsMEJBQTBCLE9BQU8sR0FBRyxhQUFhO0FBQUEsRUFFakYsT0FBTyxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQzNDLEVBQUUsT0FBTyxFQUNOLE1BQU0sV0FBVyx1QkFBdUIsRUFDeEMsSUFBSSxLQUFLLHNDQUFzQztBQUFBLEVBRXBELEtBQUssQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUN6QyxFQUFFLE9BQU8sRUFDTixJQUFJLFdBQVcsb0JBQW9CO0FBQUEsRUFFeEMsT0FBTyxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQzNDLEVBQUUsT0FBTyxFQUNOLE1BQU0sMEJBQTBCLFdBQVcsNkJBQTZCO0FBQUEsRUFFN0UsY0FBYyxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQ2xELEVBQUUsT0FBTyxFQUNOLE1BQU0sa0JBQWtCLFdBQVcsc0NBQXNDO0FBQUEsRUFFOUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQzFDLEVBQUUsT0FBTyxFQUNOLE1BQU0sOEJBQThCLFdBQVcscUJBQXFCO0FBQUE7QUFBQSxFQUd6RSxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsS0FBSyxJQUFJLElBQXNELENBQUMsTUFDMUYsRUFBRSxPQUFPLEVBQ04sU0FBUyxXQUFXLHlCQUF5QixFQUM3QyxJQUFJLE9BQU8sTUFBTSwyQkFBMkIsT0FBTyxJQUFJLEVBQUUsRUFDekQsSUFBSSxPQUFPLE9BQU8sa0JBQWtCLDBCQUEwQixPQUFPLE9BQU8sZ0JBQWdCLEVBQUU7QUFBQSxFQUVuRyxtQkFBbUIsQ0FBQyxFQUFFLFNBQVMsSUFBSSxJQUF3QyxDQUFDLE1BQzFFLEVBQUUsT0FBTyxFQUNOLElBQUksR0FBRyxXQUFXLDZCQUE2QixFQUMvQyxJQUFJLE9BQU8sT0FBTyxrQkFBa0IsMEJBQTBCLE9BQU8sT0FBTyxnQkFBZ0IsRUFBRTtBQUFBLEVBRW5HLFNBQVMsQ0FBQyxFQUFFLFNBQVMsS0FBSyxJQUFJLElBQXNELENBQUMsTUFDbkYsRUFBRSxPQUFPLEVBQ04sSUFBSSxXQUFXLG9CQUFvQixFQUNuQyxJQUFJLE9BQU8sT0FBTyxrQkFBa0IsMkJBQTJCLE9BQU8sT0FBTyxnQkFBZ0IsRUFBRSxFQUMvRixJQUFJLE9BQU8sT0FBTyxrQkFBa0IsMEJBQTBCLE9BQU8sT0FBTyxnQkFBZ0IsRUFBRTtBQUFBLEVBRW5HLFlBQVksQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUNoRCxFQUFFLE9BQU8sRUFDTixJQUFJLEdBQUcsV0FBVyxzQ0FBc0MsRUFDeEQsSUFBSSxLQUFLLFdBQVcsc0NBQXNDO0FBQUE7QUFBQSxFQUcvRCxlQUFlLENBQUksUUFBd0IsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDOUUsRUFBRSxNQUFNLE1BQU0sRUFDWCxJQUFJLEdBQUcsV0FBVywrQkFBK0I7QUFBQSxFQUV0RCxhQUFhLENBQUksUUFBd0IsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDNUUsRUFBRSxNQUFNLE1BQU0sRUFDWCxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksS0FBSyxFQUFFLFNBQVMsTUFBTSxRQUFRO0FBQUEsSUFDdkQsU0FBUyxXQUFXO0FBQUEsRUFDdEIsQ0FBQztBQUFBO0FBQUEsRUFHTCxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUNyRCxFQUFFLFFBQVE7QUFBQSxJQUNSLFNBQVMsV0FBVztBQUFBLEVBQ3RCLENBQUM7QUFBQTtBQUFBLEVBR0gsZ0JBQWdCLENBQW9DLFFBQXdCLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQy9HLE9BQU8sT0FBTyxDQUFDLFFBQVEsT0FBTyxLQUFLLEdBQUcsRUFBRSxTQUFTLEdBQUc7QUFBQSxJQUNsRCxTQUFTLFdBQVc7QUFBQSxFQUN0QixDQUFDO0FBQUE7QUFBQSxFQUdILFVBQVUsQ0FBQyxFQUFFLFNBQVMsUUFBUSxNQUM1QixFQUFFLFdBQVcsSUFBSSxFQUNkLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxTQUFTO0FBQUEsSUFDdEMsU0FBUyxXQUFXLCtCQUErQixLQUFLLE1BQU0sVUFBVSxPQUFPLElBQUksQ0FBQztBQUFBLEVBQ3RGLENBQUM7QUFBQSxFQUVMLFVBQVUsQ0FBQyxFQUFFLGNBQWMsUUFBUSxNQUNqQyxFQUFFLFdBQVcsSUFBSSxFQUNkLE9BQU8sQ0FBQyxTQUFTLGFBQWEsU0FBUyxLQUFLLElBQUksR0FBRztBQUFBLElBQ2xELFNBQVMsV0FBVyw2QkFBNkIsYUFBYSxLQUFLLElBQUksQ0FBQztBQUFBLEVBQzFFLENBQUM7QUFBQTtBQUFBLEVBR0wsYUFBYSxDQUNYLFdBQ0EsWUFDQSxnQkFFQSxFQUFFLE1BQU0sQ0FBQyxZQUFZLFdBQVcsQ0FBQyxFQUM5QixZQUFZLENBQUMsTUFBTSxRQUFRO0FBQzFCLFVBQU0sZ0JBQWdCLFVBQVUsSUFBb0I7QUFDcEQsVUFBTSxTQUFTLGdCQUFnQixhQUFhO0FBQzVDLFVBQU0sU0FBUyxPQUFPLFVBQVUsSUFBSTtBQUVwQyxRQUFJLENBQUMsT0FBTyxTQUFTO0FBQ25CLFVBQUksU0FBUztBQUFBLFFBQ1gsTUFBTSxFQUFFLGFBQWE7QUFBQSxRQUNyQixTQUFTLE9BQU8sTUFBTTtBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBQUEsRUFFTCxXQUFXO0FBQUEsSUFDVCxhQUFhLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDO0FBQUEsSUFDNUQsYUFBYSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQztBQUFBLElBQzVELE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7QUFBQSxJQUM5QyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQUEsSUFDbkQsV0FBVyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxRQUFRLE1BQU07QUFBQSxJQUN2RCxXQUFXLENBQUksV0FDYixFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxRQUFRO0FBQ2pDLFVBQUk7QUFDRixjQUFNLFNBQVMsS0FBSyxNQUFNLEdBQUc7QUFDN0IsY0FBTSxTQUFTLE9BQU8sVUFBVSxNQUFNO0FBRXRDLFlBQUksT0FBTyxRQUFTLFFBQU8sT0FBTztBQUVsQyxZQUFJLFNBQVM7QUFBQSxVQUNYLE1BQU0sRUFBRSxhQUFhO0FBQUEsVUFDckIsU0FBUyxPQUFPLE1BQU07QUFBQSxRQUN4QixDQUFDO0FBRUQsZUFBTyxFQUFFO0FBQUEsTUFDWCxRQUFRO0FBQ04sWUFBSSxTQUFTO0FBQUEsVUFDWCxNQUFNLEVBQUUsYUFBYTtBQUFBLFVBQ3JCLFNBQVM7QUFBQSxRQUNYLENBQUM7QUFFRCxlQUFPLEVBQUU7QUFBQSxNQUNYO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDTDtBQUNGOzs7QUNqS0EsU0FBUyxnQkFBZ0I7QUFlbEIsSUFBTSxlQUFlLENBQzFCLFlBQzBDLFNBQVMsRUFBRSxRQUFRLENBQUM7QUFLekQsSUFBTSxnQkFBZ0IsQ0FJM0IsU0FDQSxTQUNtQyxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFLeEQsSUFBTSxpQkFBaUIsQ0FJNUIsU0FDQSxVQUNtRCxTQUFTLEVBQUUsU0FBUyxNQUFNLE1BQU0sQ0FBQzs7O0FDOUN0RixTQUFTLFNBQVMsVUFBVSxpQkFBaUI7QUFPN0MsU0FBUyxZQUFBQyxpQkFBZ0I7QUFVbEIsSUFBTSxvQkFBb0IsQ0FLL0IsU0FDQSxNQUNBLGNBQ1k7QUFDWixRQUFNLFFBQVFBLFVBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUV4QyxTQUFPLFFBQVEsTUFBTSxVQUFVLEtBQUssR0FBRyxDQUFDLE9BQU8sU0FBUyxDQUFDO0FBQzNEO0FBS08sSUFBTSxrQkFBa0IsQ0FJN0IsU0FDQSxNQUNBLGlCQUNtQztBQUNuQyxRQUFNLFFBQVFBLFVBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUV4QyxTQUFPLFNBQVM7QUFDbEI7QUFLTyxJQUFNLGtCQUFrQixDQUk3QixTQUNBLE1BQ0EsZUFBZSxVQUNIO0FBQ1osUUFBTSxRQUFRQSxVQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFeEMsU0FBTyxRQUFRLFNBQVMsWUFBWTtBQUN0QztBQUtPLElBQU0sZ0JBQWdCLENBSTNCLFNBQ0EsV0FDMkQ7QUFDM0QsUUFBTSxTQUFTQSxVQUFTLEVBQUUsU0FBUyxNQUFNLE9BQU8sQ0FBQztBQUVqRCxTQUFPLFFBQVEsTUFBTTtBQUNuQixVQUFNLFNBQVMsQ0FBQztBQUVoQixXQUFPLFFBQVEsQ0FBQyxPQUFPLFVBQVU7QUFDL0IsYUFBTyxLQUF3QixJQUFJLE9BQU8sS0FBSztBQUFBLElBQ2pELENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDVCxHQUFHLENBQUMsUUFBUSxNQUFNLENBQUM7QUFDckI7QUFLTyxJQUFNLHNCQUFzQixDQUlqQyxTQUNBLE1BQ0EsYUFDQSxhQUMrQztBQUMvQyxRQUFNLGNBQWNBLFVBQVM7QUFBQSxJQUMzQjtBQUFBLElBQ0E7QUFBQSxJQUNBLFVBQVUsQ0FBQztBQUFBLEVBQ2IsQ0FBQztBQUVELFNBQU8sY0FBYyxjQUFjO0FBQ3JDO0FBS08sSUFBTSxvQkFBb0IsQ0FJL0IsU0FDQSxNQUNBLFFBQVEsUUFDMkI7QUFDbkMsUUFBTSxRQUFRQSxVQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDeEMsUUFBTSxDQUFDLGdCQUFnQixpQkFBaUIsSUFBSSxTQUF5QyxLQUFLO0FBRTFGLFlBQVUsTUFBTTtBQUNkLFVBQU0sUUFBUSxXQUFXLE1BQU07QUFDN0Isd0JBQWtCLEtBQUs7QUFBQSxJQUN6QixHQUFHLEtBQUs7QUFFUixXQUFPLE1BQU0sYUFBYSxLQUFLO0FBQUEsRUFDakMsR0FBRyxDQUFDLE9BQU8sS0FBSyxDQUFDO0FBRWpCLFNBQU87QUFDVDtBQUtPLElBQU0sbUJBQW1CLENBSzlCLFNBQ0EsTUFDQSxVQUNBLE9BQTZCLENBQUMsTUFDbEI7QUFDWixRQUFNLFFBQVFBLFVBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUV4QyxTQUFPO0FBQUEsSUFDTCxNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BCLENBQUMsT0FBTyxVQUFVLEdBQUcsSUFBSTtBQUFBO0FBQUEsRUFDM0I7QUFDRjs7O0FDbkdPLElBQU0sYUFBYTtBQUFBO0FBQUE7QUFBQSxFQUd4QixNQUFNO0FBQUE7QUFBQSxFQUVOLE9BQU87QUFBQTtBQUFBLEVBRVAsUUFBUTtBQUFBO0FBQUE7QUFBQSxFQUlSLFdBQVc7QUFBQTtBQUFBLEVBRVgsYUFBYTtBQUFBO0FBQUEsRUFFYixTQUFTO0FBQUE7QUFBQSxFQUVULE9BQU87QUFBQTtBQUFBLEVBRVAsYUFBYTtBQUFBO0FBQUEsRUFFYixXQUFXO0FBQUE7QUFBQSxFQUVYLFVBQVU7QUFDWjs7O0FDdERPLFNBQVMsU0FBUyxPQUFrRDtBQUN6RSxTQUFPLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBQzVFO0FBbUJPLFNBQVMsWUFDZCxLQUNBLEtBQzJCO0FBQzNCLFNBQU8sU0FBUyxHQUFHLEtBQUssT0FBTztBQUNqQztBQWtCTyxTQUFTLGlCQUFpQixPQUFpQztBQUNoRSxTQUFPLE9BQU8sVUFBVSxZQUFZLE1BQU0sU0FBUztBQUNyRDtBQWtCTyxTQUFTQyxTQUFxQixPQUE4QjtBQUNqRSxTQUFPLE1BQU0sUUFBUSxLQUFLO0FBQzVCO0FBa0JPLFNBQVMsZ0JBQW1CLE9BQXNDO0FBQ3ZFLFNBQU8sTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLFNBQVM7QUFDaEQ7QUFrQk8sU0FBUyxXQUNkLE9BQ21EO0FBQ25ELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBa0JPLFNBQVMsU0FBUyxPQUFpQztBQUN4RCxTQUFPLE9BQU8sVUFBVTtBQUMxQjtBQWtCTyxTQUFTLFNBQVMsT0FBaUM7QUFDeEQsU0FBTyxPQUFPLFVBQVUsWUFBWSxDQUFDLE1BQU0sS0FBSztBQUNsRDtBQWtCTyxTQUFTLFVBQVUsT0FBa0M7QUFDMUQsU0FBTyxPQUFPLFVBQVU7QUFDMUI7QUFrQk8sU0FBUyxPQUFPLE9BQStCO0FBQ3BELFNBQU8sVUFBVTtBQUNuQjtBQWtCTyxTQUFTLFlBQVksT0FBb0M7QUFDOUQsU0FBTyxVQUFVO0FBQ25CO0FBdUJPLFNBQVMsVUFBVSxPQUEyQztBQUNuRSxTQUFPLFVBQVUsUUFBUSxVQUFVO0FBQ3JDO0FBZ0JPLFNBQVMsVUFBYSxPQUFtQztBQUM5RCxTQUFPLFVBQVUsUUFBUSxVQUFVO0FBQ3JDO0FBa0JPLFNBQVMsT0FBTyxPQUErQjtBQUNwRCxTQUFPLGlCQUFpQixRQUFRLENBQUMsTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUN4RDtBQWtCTyxTQUFTLFVBQVUsT0FBMkM7QUFDbkUsU0FDRSxpQkFBaUIsV0FDaEIsU0FBUyxLQUFLLEtBQ2IsT0FBUSxNQUFrQyxTQUFTO0FBRXpEO0FBc0JPLFNBQVMsUUFBUSxPQUFnQztBQUN0RCxTQUFPLGlCQUFpQjtBQUMxQjtBQStCTyxTQUFTLFFBQ2QsT0FDQSxXQUNZO0FBQ1osU0FBTyxVQUFVLEtBQUs7QUFDeEI7IiwKICAibmFtZXMiOiBbIm1ha2VSZXF1ZXN0IiwgIm1ha2VSZXF1ZXN0IiwgImhhbmRsZVNlcnZlckVycm9ycyIsICJ1c2VXYXRjaCIsICJpc0FycmF5Il0KfQo=
|