sonamu 0.9.4 → 0.9.5
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/ai/providers/rtzr/utils.js +2 -2
- package/dist/database/upsert-builder.js +4 -4
- package/dist/dict/sonamu-dictionary.js +2 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +2 -3
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +5 -3
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +3 -2
- package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
- package/dist/ui-web/assets/{index-C5KUjXm0.js → index-DzZ7vBk4.js} +4 -4
- package/dist/ui-web/index.html +2 -2
- package/package.json +4 -4
- package/src/ai/providers/rtzr/utils.ts +1 -1
- package/src/database/upsert-builder.ts +3 -3
- package/src/dict/sonamu-dictionary.ts +1 -1
- package/src/migration/code-generation.ts +1 -6
- package/src/shared/app.shared.ts.txt +58 -3
- package/src/shared/web.shared.ts.txt +58 -3
- package/src/testing/data-explorer.ts +3 -2
- package/src/ui/api.ts +10 -1
- package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
|
@@ -9,7 +9,7 @@ function handleFetchError({ error, url, requestBodyValues }) {
|
|
|
9
9
|
}
|
|
10
10
|
if (error instanceof TypeError && FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())) {
|
|
11
11
|
const cause = error.cause;
|
|
12
|
-
if (cause
|
|
12
|
+
if (cause) {
|
|
13
13
|
return new APICallError({
|
|
14
14
|
message: `Cannot connect to API: ${cause.message}`,
|
|
15
15
|
cause,
|
|
@@ -85,4 +85,4 @@ const getFromApi = async ({ url, headers = {}, successfulResponseHandler, failed
|
|
|
85
85
|
|
|
86
86
|
//#endregion
|
|
87
87
|
export { getFromApi, handleFetchError };
|
|
88
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6WyJlcnJvckluZm9ybWF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBFcnJvcjtcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICAgIH0iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWkvcHJvdmlkZXJzL3J0enIvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBJQ2FsbEVycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMsIGlzQWJvcnRFcnJvciwgd2l0aFVzZXJBZ2VudFN1ZmZpeCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEZldGNoRnVuY3Rpb24sIHR5cGUgUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuY29uc3QgRkVUQ0hfRkFJTEVEX0VSUk9SX01FU1NBR0VTID0gW1wiZmV0Y2ggZmFpbGVkXCIsIFwiZmFpbGVkIHRvIGZldGNoXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRmV0Y2hFcnJvcih7XG4gIGVycm9yLFxuICB1cmwsXG4gIHJlcXVlc3RCb2R5VmFsdWVzLFxufToge1xuICBlcnJvcjogdW5rbm93bjtcbiAgdXJsOiBzdHJpbmc7XG4gIHJlcXVlc3RCb2R5VmFsdWVzOiB1bmtub3duO1xufSkge1xuICBpZiAoaXNBYm9ydEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgIEZFVENIX0ZBSUxFRF9FUlJPUl9NRVNTQUdFUy5pbmNsdWRlcyhlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkpXG4gICkge1xuICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIHsgY2F1c2U/
|
|
88
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6WyJlcnJvckluZm9ybWF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBFcnJvcjtcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICAgIH0iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWkvcHJvdmlkZXJzL3J0enIvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBJQ2FsbEVycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMsIGlzQWJvcnRFcnJvciwgd2l0aFVzZXJBZ2VudFN1ZmZpeCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEZldGNoRnVuY3Rpb24sIHR5cGUgUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuY29uc3QgRkVUQ0hfRkFJTEVEX0VSUk9SX01FU1NBR0VTID0gW1wiZmV0Y2ggZmFpbGVkXCIsIFwiZmFpbGVkIHRvIGZldGNoXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRmV0Y2hFcnJvcih7XG4gIGVycm9yLFxuICB1cmwsXG4gIHJlcXVlc3RCb2R5VmFsdWVzLFxufToge1xuICBlcnJvcjogdW5rbm93bjtcbiAgdXJsOiBzdHJpbmc7XG4gIHJlcXVlc3RCb2R5VmFsdWVzOiB1bmtub3duO1xufSkge1xuICBpZiAoaXNBYm9ydEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgIEZFVENIX0ZBSUxFRF9FUlJPUl9NRVNTQUdFUy5pbmNsdWRlcyhlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkpXG4gICkge1xuICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIHsgY2F1c2U/OiBFcnJvciB9KS5jYXVzZTtcblxuICAgIGlmIChjYXVzZSkge1xuICAgICAgcmV0dXJuIG5ldyBBUElDYWxsRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlOiBgQ2Fubm90IGNvbm5lY3QgdG8gQVBJOiAke2NhdXNlLm1lc3NhZ2V9YCxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXMsXG4gICAgICAgIGlzUmV0cnlhYmxlOiB0cnVlLCAvLyByZXRyeSB3aGVuIG5ldHdvcmsgZXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcjtcbn1cblxuLy8gdXNlIGZ1bmN0aW9uIHRvIGFsbG93IGZvciBtb2NraW5nIGluIHRlc3RzOlxuY29uc3QgZ2V0T3JpZ2luYWxGZXRjaCA9ICgpID0+IGdsb2JhbFRoaXMuZmV0Y2g7XG5cbmV4cG9ydCBjb25zdCBnZXRGcm9tQXBpID0gYXN5bmMgPFQ+KHtcbiAgdXJsLFxuICBoZWFkZXJzID0ge30sXG4gIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXIsXG4gIGZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgYWJvcnRTaWduYWwsXG4gIGZldGNoID0gZ2V0T3JpZ2luYWxGZXRjaCgpLFxufToge1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogUmVzcG9uc2VIYW5kbGVyPEVycm9yPjtcbiAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogUmVzcG9uc2VIYW5kbGVyPFQ+O1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBmZXRjaD86IEZldGNoRnVuY3Rpb247XG59KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhlYWRlcnM6IHdpdGhVc2VyQWdlbnRTdWZmaXgoaGVhZGVycywgYGNhcnRhbm92YS1haS9ydHpyLWFwaS1wcm92aWRlcmApLFxuICAgICAgc2lnbmFsOiBhYm9ydFNpZ25hbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UpO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbGV0IGVycm9ySW5mb3JtYXRpb246IHtcbiAgICAgICAgdmFsdWU6IEVycm9yO1xuICAgICAgICByZXNwb25zZUhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZXJyb3JJbmZvcm1hdGlvbiA9IGF3YWl0IGZhaWxlZFJlc3BvbnNlSGFuZGxlcih7XG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzOiB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNBYm9ydEVycm9yKGVycm9yKSB8fCBBUElDYWxsRXJyb3IuaXNJbnN0YW5jZShlcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBBUElDYWxsRXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIHByb2Nlc3MgZXJyb3IgcmVzcG9uc2VcIixcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXM6IHt9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JJbmZvcm1hdGlvbi52YWx1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXIoe1xuICAgICAgICByZXNwb25zZSxcbiAgICAgICAgdXJsLFxuICAgICAgICByZXF1ZXN0Qm9keVZhbHVlczoge30sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnJvcikgfHwgQVBJQ2FsbEVycm9yLmlzSW5zdGFuY2UoZXJyb3IpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bCByZXNwb25zZVwiLFxuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgdXJsLFxuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIHJlcXVlc3RCb2R5VmFsdWVzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBoYW5kbGVGZXRjaEVycm9yKHsgZXJyb3IsIHVybCwgcmVxdWVzdEJvZHlWYWx1ZXM6IHt9IH0pO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBSUEsTUFBTSw4QkFBOEIsQ0FBQyxnQkFBZ0Isa0JBQWtCO0FBRXZFLFNBQWdCLGlCQUFpQixFQUMvQixPQUNBLEtBQ0EscUJBS0M7QUFDRCxLQUFJLGFBQWEsTUFBTSxFQUFFO0FBQ3ZCLFNBQU87O0FBR1QsS0FDRSxpQkFBaUIsYUFDakIsNEJBQTRCLFNBQVMsTUFBTSxRQUFRLGFBQWEsQ0FBQyxFQUNqRTtFQUNBLE1BQU0sUUFBUyxNQUE0QjtBQUUzQyxNQUFJLE9BQU87QUFDVCxVQUFPLElBQUksYUFBYTtJQUN0QixTQUFTLDBCQUEwQixNQUFNO0lBQ3pDO0lBQ0E7SUFDQTtJQUNBLGFBQWE7SUFDZCxDQUFDOzs7QUFJTixRQUFPOztBQUlULE1BQU0seUJBQXlCLFdBQVc7QUFFMUMsTUFBYSxhQUFhLE9BQVUsRUFDbEMsS0FDQSxVQUFVLEVBQUUsRUFDWiwyQkFDQSx1QkFDQSxhQUNBLFFBQVEsa0JBQWtCLE9BUXRCO0FBQ0osS0FBSTtFQUNGLE1BQU0sV0FBVyxNQUFNLE1BQU0sS0FBSztHQUNoQyxRQUFRO0dBQ1IsU0FBUyxvQkFBb0IsU0FBUyxpQ0FBaUM7R0FDdkUsUUFBUTtHQUNULENBQUM7RUFFRixNQUFNLGtCQUFrQix1QkFBdUIsU0FBUztBQUV4RCxNQUFJLENBQUMsU0FBUyxJQUFJO0dBQ2hCLElBQUlBO0FBS0osT0FBSTtBQUNGLHVCQUFtQixNQUFNLHNCQUFzQjtLQUM3QztLQUNBO0tBQ0EsbUJBQW1CLEVBQUU7S0FDdEIsQ0FBQztZQUNLLE9BQU87QUFDZCxRQUFJLGFBQWEsTUFBTSxJQUFJLGFBQWEsV0FBVyxNQUFNLEVBQUU7QUFDekQsV0FBTTs7QUFHUixVQUFNLElBQUksYUFBYTtLQUNyQixTQUFTO0tBQ1QsT0FBTztLQUNQLFlBQVksU0FBUztLQUNyQjtLQUNBO0tBQ0EsbUJBQW1CLEVBQUU7S0FDdEIsQ0FBQzs7QUFHSixTQUFNLGlCQUFpQjs7QUFHekIsTUFBSTtBQUNGLFVBQU8sTUFBTSwwQkFBMEI7SUFDckM7SUFDQTtJQUNBLG1CQUFtQixFQUFFO0lBQ3RCLENBQUM7V0FDSyxPQUFPO0FBQ2QsT0FBSSxpQkFBaUIsT0FBTztBQUMxQixRQUFJLGFBQWEsTUFBTSxJQUFJLGFBQWEsV0FBVyxNQUFNLEVBQUU7QUFDekQsV0FBTTs7O0FBSVYsU0FBTSxJQUFJLGFBQWE7SUFDckIsU0FBUztJQUNULE9BQU87SUFDUCxZQUFZLFNBQVM7SUFDckI7SUFDQTtJQUNBLG1CQUFtQixFQUFFO0lBQ3RCLENBQUM7O1VBRUcsT0FBTztBQUNkLFFBQU0saUJBQWlCO0dBQUU7R0FBTztHQUFLLG1CQUFtQixFQUFFO0dBQUUsQ0FBQyJ9
|
|
@@ -193,7 +193,7 @@ var init_upsert_builder = __esmMin((() => {
|
|
|
193
193
|
total: levelChunks.length
|
|
194
194
|
});
|
|
195
195
|
const originalUuids = dataChunk.map((r) => r.uuid);
|
|
196
|
-
const dataForDb = dataChunk.map(({ uuid, ...rest }) => rest);
|
|
196
|
+
const dataForDb = dataChunk.map(({ uuid: _, ...rest }) => rest);
|
|
197
197
|
let resultRows;
|
|
198
198
|
if (mode === "insert") {
|
|
199
199
|
resultRows = await wdb.insert(dataForDb).into(tableName).returning(selectFields);
|
|
@@ -205,7 +205,7 @@ var init_upsert_builder = __esmMin((() => {
|
|
|
205
205
|
const conditions = [];
|
|
206
206
|
for (const row of rowsWithoutId) {
|
|
207
207
|
const values = columns.map((col) => row[col]);
|
|
208
|
-
if (!values.some((v) => v
|
|
208
|
+
if (!values.some((v) => v === null || v === undefined)) {
|
|
209
209
|
conditions.push(values);
|
|
210
210
|
}
|
|
211
211
|
}
|
|
@@ -287,7 +287,7 @@ var init_upsert_builder = __esmMin((() => {
|
|
|
287
287
|
const cleanOrphans = options.cleanOrphans;
|
|
288
288
|
const fkColumns = isArray(cleanOrphans) ? cleanOrphans : [cleanOrphans];
|
|
289
289
|
const fkConditions = fkColumns.map((fkCol) => {
|
|
290
|
-
const fkValues = [...new Set(table.rows.map((row) => row[fkCol]).filter(
|
|
290
|
+
const fkValues = [...new Set(table.rows.map((row) => row[fkCol]).filter(Boolean))];
|
|
291
291
|
return {
|
|
292
292
|
column: fkCol,
|
|
293
293
|
values: fkValues
|
|
@@ -406,4 +406,4 @@ var init_upsert_builder = __esmMin((() => {
|
|
|
406
406
|
//#endregion
|
|
407
407
|
init_upsert_builder();
|
|
408
408
|
export { UpsertBuilder, init_upsert_builder, isRefField };
|
|
409
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBzZXJ0LWJ1aWxkZXIuanMiLCJuYW1lcyI6WyJyZXN1bHQ6IFVCUmVmIiwidGFibGUiLCJhbGxJZHM6IChudW1iZXIgfCBzdHJpbmcpW10iLCJyZXN1bHRSb3dzOiB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdIiwiY29uZGl0aW9uczogdW5rbm93bltdW10iLCJsZXZlbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W11bXSIsImN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSIsIm5leHRQZW5kaW5nOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2x1c3RlciwgaXNBcnJheSwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFiYXNlRm9yZWlnbktleXMsXG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGJhdGNoVXBkYXRlIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuaW1wb3J0IHsgdHlwZSBSb3dXaXRoSWQgfSBmcm9tIFwiLi9fYmF0Y2hfdXBkYXRlXCI7XG5pbXBvcnQgeyB0eXBlIENvbHVtbktleXMsIHR5cGUgRm9yZWlnbktleUNvbHVtbnMsIHR5cGUgSWRUeXBlLCB0eXBlIFRhYmxlTmFtZSB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInNvbmFtdVwiLCBcImludGVybmFsXCIsIFwidXBzZXJ0LWJ1aWxkZXJcIl0pO1xuXG4vKipcbiAqIEZLIO2DgOyehSDstpTroaDsnYQg7JyE7ZW0IERhdGFiYXNlRm9yZWlnbktleXMgZXhwb3J0XG4gKiAobW9kdWxlIGF1Z21lbnRhdGlvbiDsnpDrj5kg66Gc65OcIOuztOyepSlcbiAqL1xuZXhwb3J0IHR5cGUgeyBEYXRhYmFzZUZvcmVpZ25LZXlzIH07XG5cbnR5cGUgSW5oZXJpdGFibGVDb2x1bW5zPFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+ID1cbiAgVFRhYmxlIGV4dGVuZHMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQgPyBDb2x1bW5LZXlzPERhdGFiYXNlU2NoZW1hRXh0ZW5kW1RUYWJsZV0+IDogbmV2ZXI7XG5cbi8vIO2FjOydtOu4lCDrjbDsnbTthLAg7YOA7J6FXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHVuaXF1ZXNNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5cbi8vIOywuOyhsCDtlYTrk5wg7YOA7J6FXG5leHBvcnQgdHlwZSBVQlJlZiA9IHtcbiAgdXVpZDogc3RyaW5nO1xuICBvZjogc3RyaW5nO1xuICB1c2U/OiBzdHJpbmc7XG59O1xuXG4vLyB1cHNlcnQg7Ji17IWYXG5leHBvcnQgdHlwZSBVcHNlcnRPcHRpb25zPFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+ID0ge1xuICBjaHVua1NpemU/OiBudW1iZXI7XG4gIGNsZWFuT3JwaGFucz86IEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT4gfCBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+W107XG4gIGluaGVyaXQ/OiBJbmhlcml0YWJsZUNvbHVtbnM8VFRhYmxlPltdO1xufTtcblxuLy8gaW5zZXJ0T25seSDsmLXshZhcbmV4cG9ydCB0eXBlIEluc2VydE9ubHlPcHRpb25zID0ge1xuICBjaHVua1NpemU/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZGaWVsZChmaWVsZDogdW5rbm93bik6IGZpZWxkIGlzIFVCUmVmIHtcbiAgcmV0dXJuIChcbiAgICBmaWVsZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZmllbGQgIT09IG51bGwgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy5vZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8udXVpZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBVcHNlcnRCdWlsZGVyIHtcbiAgdGFibGVzOiBNYXA8c3RyaW5nLCBUYWJsZURhdGE+O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVEYXRhIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlU3BlYyA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0ge1xuICAgICAgcmVmZXJlbmNlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICByb3dzOiBbXSxcbiAgICAgIHVuaXF1ZUluZGV4ZXM6IHRhYmxlU3BlYz8udW5pcXVlSW5kZXhlcyA/PyBbXSxcbiAgICAgIHVuaXF1ZXNNYXA6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgICBqc29uQ29sdW1uczogdGFibGVTcGVjPy5qc29uQ29sdW1ucyA/PyBbXSxcbiAgICB9O1xuICAgIHRoaXMudGFibGVzLnNldCh0YWJsZU5hbWUsIHRhYmxlRGF0YSk7XG4gICAgcmV0dXJuIHRhYmxlRGF0YTtcbiAgfVxuXG4gIGhhc1RhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVzLmhhcyh0YWJsZU5hbWUpO1xuICB9XG5cbiAgcmVnaXN0ZXI8VCBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcm93OiB7XG4gICAgICBba2V5IGluIFRdPzogVUJSZWYgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgbnVsbCB8IG9iamVjdCB8IHVua25vd247XG4gICAgfSxcbiAgKTogVUJSZWYge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCB1bmlxdWUg7J24642x7Iqk66W8IOyInO2ajO2VmOupsCDtgqQg7IOd7ISxXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9IHRhYmxlLnVuaXF1ZUluZGV4ZXNcbiAgICAgIC5tYXAoKHVucUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUtleUFycmF5ID0gdW5xSW5kZXguY29sdW1ucy5tYXAoKHVucUNvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHJvd1t1bnFDb2wubmFtZSBhcyBrZXlvZiB0eXBlb2Ygcm93XTtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnV1aWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb3dbdW5xQ29sLm5hbWUgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodGFibGUuanNvbkNvbHVtbnMuaW5jbHVkZXMocm93S2V5KSAmJiByb3dWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIEpTT04g7Lus65+87J24IOqyveyasCBKU09OLnN0cmluZ2lmeSDsspjrpqwgKEtuZXjripQgSlNPTiDtg4DsnoXsnYQg7KeA7JuQ7ZWY7KeAIOyViuydjClcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJvd1ZhbHVlKSkge1xuICAgICAgICAgIC8vIOuwsOyXtOydgCDqt7jrjIDroZwg7KCA7J6lXG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQ8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4oXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zPFRUYWJsZT4sXG4gICk6IFByb21pc2U8SWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRPckluc2VydCh3ZGIsIHRhYmxlTmFtZSwgXCJ1cHNlcnRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRPbmx5PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBvcHRpb25zPzogSW5zZXJ0T25seU9wdGlvbnMsXG4gICk6IFByb21pc2U8SWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRPckluc2VydCh3ZGIsIHRhYmxlTmFtZSwgXCJpbnNlcnRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyB1cHNlcnRPckluc2VydDxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PihcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBUVGFibGUsXG4gICAgbW9kZTogXCJ1cHNlcnRcIiB8IFwiaW5zZXJ0XCIsXG4gICAgb3B0aW9ucz86IFVwc2VydE9wdGlvbnM8VFRhYmxlPixcbiAgKTogUHJvbWlzZTxJZFR5cGU8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFRUYWJsZT5bXT4ge1xuICAgIGlmICghdGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdXVpZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGNvbnN0IGFsbElkczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGxldCBsZXZlbElkeCA9IDA7IGxldmVsSWR4IDwgbGV2ZWxzLmxlbmd0aDsgbGV2ZWxJZHgrKykge1xuICAgICAgY29uc3QgbGV2ZWxSb3dzID0gbGV2ZWxzW2xldmVsSWR4XTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlByb2Nlc3NpbmcgUXVlcnkgTGV2ZWw6IHtjdXJyZW50fSAvIHt0b3RhbH1cIiwge1xuICAgICAgICBjdXJyZW50OiBsZXZlbElkeCArIDEsXG4gICAgICAgIHRvdGFsOiBsZXZlbHMubGVuZ3RoLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBvcHRpb25zPy5jaHVua1NpemU7XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNsdXN0ZXIocmVzb2x2ZWRSb3dzLCBjaHVua1NpemUpIDogW3Jlc29sdmVkUm93c107XG4gICAgICBjb25zdCBzZWxlY3RGaWVsZHMgPSB1bmlxdWUoW1wiaWRcIiwgLi4uZXh0cmFjdEZpZWxkc10pO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGV2ZWxDaHVua3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGFDaHVuayA9IGxldmVsQ2h1bmtzW2luZGV4XTtcbiAgICAgICAgaWYgKGRhdGFDaHVuay5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJQcm9jZXNzaW5nIENodW5rOiB7Y3VycmVudH0gLyB7dG90YWx9XCIsIHtcbiAgICAgICAgICBjdXJyZW50OiBpbmRleCArIDEsXG4gICAgICAgICAgdG90YWw6IGxldmVsQ2h1bmtzLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdXVpZOulvCDrs4Trj4TroZwg67O06rSA7ZWY6rOgLCBEQuyXkCDsoIDsnqXtlaAg642w7J207YSw7JeQ7IScIOygnOqxsFxuICAgICAgICBjb25zdCBvcmlnaW5hbFV1aWRzID0gZGF0YUNodW5rLm1hcCgocikgPT4gci51dWlkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGRhdGFGb3JEYiA9IGRhdGFDaHVuay5tYXAoKHsgdXVpZCwgLi4ucmVzdCB9KSA9PiByZXN0KTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1bXTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgICAgIC8vIElOU0VSVCDrqqjrk5wgLSBSRVRVUk5JTkcg7IKs7JqpXG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYi5pbnNlcnQoZGF0YUZvckRiKS5pbnRvKHRhYmxlTmFtZSkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAtIGlkIOyXhuuKlCByb3frk6TsnZggaWTrpbwg7IKs7KCEIOyhsO2ajOuhnCDssYTsmrDquLBcbiAgICAgICAgICBjb25zdCByb3dzV2l0aG91dElkID0gZGF0YUZvckRiLmZpbHRlcigocm93KSA9PiAhcm93LmlkKTtcblxuICAgICAgICAgIGlmIChyb3dzV2l0aG91dElkLmxlbmd0aCA+IDAgJiYgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyDrqqjrk6AgdW5pcXVlSW5kZXhlc+uhnCDquLDsobQg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICAgICAgZm9yIChjb25zdCB1bmlxdWVJbmRleCBvZiB0YWJsZS51bmlxdWVJbmRleGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB1bmlxdWVJbmRleC5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsobDtmoztlaAg7KGw6rG065OkIOy2lOy2nCAo6rCBIHJvd+ydmCB1bmlxdWUg7Lus65+8IOqwkuuTpClcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uczogdW5rbm93bltdW10gPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93c1dpdGhvdXRJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGNvbHVtbnMubWFwKChjb2wpID0+IHJvd1tjb2xdKTtcbiAgICAgICAgICAgICAgICAvLyBudWxs7J20IO2PrO2VqOuQnCDsobDqsbTsnYAg7KCc7Jm4IChQb3N0Z3JlU1FMIFVOSVFVReuKlCBOVUxMIOustOyLnClcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlcy5zb21lKCh2KSA9PiB2ID09IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2godmFsdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgIC8vIOuwsOy5mCBTRUxFQ1RcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdSb3dzID0gKGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgICAgICAgICAgLndoZXJlSW4oY29sdW1ucywgY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10pXG4gICAgICAgICAgICAgICAgLnNlbGVjdChcImlkXCIsIC4uLmNvbHVtbnMpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXG4gICAgICAgICAgICAgIC8vIE1hcCDsg53shLE6IHVuaXF1ZSDsu6zrn7wg7KGw7ZWpIOKGkiBpZFxuICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ01hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZXhpc3Rpbmcgb2YgZXhpc3RpbmdSb3dzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uc1xuICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBTdHJpbmcoZXhpc3RpbmdbY29sXSA/PyBcIlwiKSlcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLS0tZGVsaW1pdGVyLS0tXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZXhpc3RpbmcuaWQ7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTWFwLnNldChrZXksIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBpZCDsl4bripQgcm9365Ok7JeQIOunpOy5reuQmOuKlCBpZCDssYTsmrDquLBcbiAgICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93c1dpdGhvdXRJZCkge1xuICAgICAgICAgICAgICAgIGlmIChyb3cuaWQpIGNvbnRpbnVlOyAvLyDsnbTrr7gg64uk66W4IHVuaXF1ZUluZGV47JeQ7IScIOyxhOybjOynhCDqsr3smrAg7Iqk7YK1XG5cbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW5zLm1hcCgoY29sKSA9PiBTdHJpbmcocm93W2NvbF0gPz8gXCJcIikpLmpvaW4oXCItLS1kZWxpbWl0ZXItLS1cIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGV4aXN0aW5nTWFwLmdldChrZXkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nSWQpIHtcbiAgICAgICAgICAgICAgICAgIHJvdy5pZCA9IGV4aXN0aW5nSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gb25Db25mbGljdOuKlCBpZOunjCDsgqzsmqkgKOuqqOuToCB1bmlxdWVJbmRleGVz64qUIOydtOuvuCDsgqzsoIQg7KGw7ZqM66GcIOyymOumrOuQqClcbiAgICAgICAgICBjb25zdCBjb25mbGljdENvbHVtbnMgPSBbXCJpZFwiXTtcblxuICAgICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhRm9yRGJbMF0pO1xuICAgICAgICAgIGxldCB1cGRhdGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMgIT09IFwiaWRcIik7XG5cbiAgICAgICAgICAvLyBpbmhlcml0IOyYteyFmCDsspjrpqwgLSBpbmhlcml0IOy7rOufvOydgCB1cGRhdGUg64yA7IOB7JeQ7IScIOygnOyZuFxuICAgICAgICAgIGlmIChvcHRpb25zPy5pbmhlcml0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaGVyaXRDb2x1bW5zID0gb3B0aW9ucy5pbmhlcml0IGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICBjb25zdCBleGNsdWRlZEZyb21VcGRhdGUgPSB1cGRhdGVDb2x1bW5zLmZpbHRlcigoYykgPT4gaW5oZXJpdENvbHVtbnMuaW5jbHVkZXMoYykpO1xuICAgICAgICAgICAgdXBkYXRlQ29sdW1ucyA9IHVwZGF0ZUNvbHVtbnMuZmlsdGVyKChjKSA9PiAhaW5oZXJpdENvbHVtbnMuaW5jbHVkZXMoYykpO1xuXG4gICAgICAgICAgICAvLyDsi6TsoJzroZwg7KCc7Jm465CcIOy7rOufvCDroZzquYVcbiAgICAgICAgICAgIGlmIChleGNsdWRlZEZyb21VcGRhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIE5haXRlLnQoXCJwdXJpOnViLWluaGVyaXRcIiwge1xuICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICBpbmhlcml0Q29sdW1ucyxcbiAgICAgICAgICAgICAgICBleGNsdWRlZEZyb21VcGRhdGUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHVwZGF0ZUNvbHVtbnPqsIAg67mE7Ja07J6I7Ja064+EIG1lcmdlKCnrpbwg7IKs7Jqp7ZWY7JesIOuqqOuToCDtlonsnbQgUkVUVVJOSU5H65CY64+E66GdIOuztOyepVxuICAgICAgICAgIGNvbnN0IG1lcmdlQ29sdW1ucyA9IHVwZGF0ZUNvbHVtbnMubGVuZ3RoID8gdXBkYXRlQ29sdW1ucyA6IGNvbmZsaWN0Q29sdW1ucztcblxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgICAgICAgIC5pbnNlcnQoZGF0YUZvckRiKVxuICAgICAgICAgICAgLmludG8odGFibGVOYW1lKVxuICAgICAgICAgICAgLm9uQ29uZmxpY3QoY29uZmxpY3RDb2x1bW5zKVxuICAgICAgICAgICAgLm1lcmdlKG1lcmdlQ29sdW1ucylcbiAgICAgICAgICAgIC5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmlnaW5hbFV1aWRzLmxlbmd0aCAhPT0gcmVzdWx0Um93cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfTogcmVnaXN0ZXIvcmV0dXJuaW5nIOu2iOydvOy5mGApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQob3JpZ2luYWxVdWlkc1tpXSwgcmVzdWx0Um93c1tpXSk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocmVzdWx0Um93c1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5jbGVhbk9ycGhhbnMpIHtcbiAgICAgIGNvbnN0IGNsZWFuT3JwaGFucyA9IG9wdGlvbnMuY2xlYW5PcnBoYW5zO1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gaXNBcnJheShjbGVhbk9ycGhhbnMpXG4gICAgICAgID8gKGNsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+W10pXG4gICAgICAgIDogW2NsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+XTtcblxuICAgICAgLy8g7ZiE7J6sIHJlZ2lzdGVy65CcIOugiOy9lOuTnOuTpOydmCBGSyDqsJLrk6Qg7LaU7LacXG4gICAgICBjb25zdCBma0NvbmRpdGlvbnMgPSBma0NvbHVtbnMubWFwKChma0NvbCkgPT4ge1xuICAgICAgICBjb25zdCBma1ZhbHVlcyA9IFsuLi5uZXcgU2V0KHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvd1tma0NvbF0pLmZpbHRlcigodikgPT4gdiAhPSBudWxsKSldO1xuICAgICAgICByZXR1cm4geyBjb2x1bW46IGZrQ29sLCB2YWx1ZXM6IGZrVmFsdWVzIH07XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo65OgIEZLIOy7rOufvOyXkCDqsJLsnbQg7J6I64qUIOqyveyasOyXkOunjCDsgq3soJwg7Iuk7ZaJXG4gICAgICBpZiAoZmtDb25kaXRpb25zLmV2ZXJ5KChmYykgPT4gZmMudmFsdWVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIGxldCBkZWxldGVRdWVyeSA9IHdkYih0YWJsZU5hbWUpO1xuXG4gICAgICAgIC8vIOqwgSBGSyDsu6zrn7zsl5Ag64yA7ZWcIFdIRVJFIElOIOyhsOqxtCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCB7IGNvbHVtbiwgdmFsdWVzIH0gb2YgZmtDb25kaXRpb25zKSB7XG4gICAgICAgICAgZGVsZXRlUXVlcnkgPSBkZWxldGVRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzIGFzIEtuZXguVmFsdWVbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrsKnquIggdXBzZXJ07ZWcIElE64qUIOygnOyZuFxuICAgICAgICBkZWxldGVRdWVyeSA9IGRlbGV0ZVF1ZXJ5LndoZXJlTm90SW4oXCJpZFwiLCBhbGxJZHMpO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb3VudCA9IGF3YWl0IGRlbGV0ZVF1ZXJ5LmRlbGV0ZSgpO1xuXG4gICAgICAgIE5haXRlLnQoXCJwdXJpOnViLWNsZWFuLW9ycGhhbnNcIiwge1xuICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICBjbGVhbk9ycGhhbnM6IGZrQ29sdW1ucyxcbiAgICAgICAgICBkZWxldGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZgg642w7J207YSwIOy0iOq4sO2ZlFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItdXBzZXJ0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHJvd0NvdW50OiBhbGxJZHMubGVuZ3RoLFxuICAgICAgcmV0dXJuZWRJZHM6IGFsbElkcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxJZHMgYXMgSWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W107XG4gIH1cblxuICBhc3luYyB1cGRhdGVCYXRjaChcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgICAgIHdoZXJlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjaHVua1NpemU6IG9wdGlvbnM/LmNodW5rU2l6ZSA/PyA1MDAsXG4gICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUgPz8gXCJpZFwiLFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuaGFzVGFibGUodGFibGVOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg65Ox66Gd65CY7KeAIOyViuydgCDthYzsnbTruJQgJHt0YWJsZU5hbWV97JeQIHVwZGF0ZUJhdGNoIOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNvbHVtbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMud2hlcmUpID8gb3B0aW9ucy53aGVyZSA6IFtvcHRpb25zLndoZXJlID8/IFwiaWRcIl07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKChfcm93KSA9PiB7XG4gICAgICBjb25zdCB7IHV1aWQ6IF8sIC4uLnJvdyB9ID0gX3JvdzsgLy8gdXVpZCDsoJzsmbhcbiAgICAgIHJldHVybiByb3cgYXMgUm93V2l0aElkPHN0cmluZz47XG4gICAgfSk7XG5cbiAgICBhd2FpdCBiYXRjaFVwZGF0ZSh3ZGIsIHRhYmxlTmFtZSwgd2hlcmVDb2x1bW5zLCByb3dzLCBvcHRpb25zLmNodW5rU2l6ZSk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1iYXRjaC11cGRhdGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgIHdoZXJlQ29sdW1ucyxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUJhdGNoIOyZhOujjCDtm4Qg7LKY66as65CcIOuNsOydtO2EsCDsoJzqsbBcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIHJvd3Prpbwg7J2Y7KG07ISxIOyInOyEnOyXkCDrlLDrnbwg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKiAtIOyekOq4sCDssLjsobAg7JeG64qUIOqyveyasCA6IOuqqOuToCByb3dz6rCAIExldmVsIDBcbiAgICogLSDsnpDquLAg7LC47KGwIOyeiOuKlCDqsr3smrAgOiDsnpDquLAg7LC47KGwIOq0gOqzhOulvCDsnITsg4Eg7KCV66Cs7ZWY7JesIOugiOuyqOuzhOuhnCDqt7jro7ntmZRcbiAgICovXG4gIHByaXZhdGUgYnVpbGRJbnNlcnRMZXZlbHMoXG4gICAgcm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogeyBsZXZlbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W11bXTsgaGFzQ2lyY3VsYXI6IGJvb2xlYW4gfSB7XG4gICAgLy8gMS4g7J6Q6riwIOywuOyhsOqwgCDsl4bsnLzrqbQg7ZWcIOugiOuyqOuhnCDsspjrpqxcbiAgICBjb25zdCBoYXNTZWxmUmVmID0gcm93c1xuICAgICAgLmZsYXRNYXAoKHJvdykgPT4gT2JqZWN0LnZhbHVlcyhyb3cpKVxuICAgICAgLnNvbWUoKHZhbHVlKSA9PiBpc1JlZkZpZWxkKHZhbHVlKSAmJiB2YWx1ZS5vZiA9PT0gdGFibGVOYW1lKTtcbiAgICBpZiAoIWhhc1NlbGZSZWYpIHJldHVybiB7IGxldmVsczogW3Jvd3NdLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcblxuICAgIC8vIDIuIHV1aWQg4oaSIHJvdyDrp6TtlZEgKOykkeuztSB1dWlkIOuwqeyngClcbiAgICBjb25zdCByb3dCeVV1aWQgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgdXVpZCA9IHJvdy51dWlkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghdXVpZCkgdGhyb3cgbmV3IEVycm9yKGBidWlsZEluc2VydExldmVsczogdXVpZOqwgCDsl4bripQgcm93IC0tIGluICR7dGFibGVOYW1lfWApO1xuICAgICAgcm93QnlVdWlkLnNldCh1dWlkLCByb3cpO1xuICAgIH1cblxuICAgIGxldCBwZW5kaW5nID0gQXJyYXkuZnJvbShyb3dCeVV1aWQudmFsdWVzKCkpO1xuICAgIGNvbnN0IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdID0gW107XG4gICAgY29uc3QgaW5zZXJ0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIC8vIDMuIOugiOuyqOuzhCDrtoTrpZhcbiAgICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50TGV2ZWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcbiAgICAgIGNvbnN0IG5leHRQZW5kaW5nOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBlbmRpbmcpIHtcbiAgICAgICAgLy8g7J20IHJvd+qwgCDssLjsobDtlZjripQg7J6Q6riwIOywuOyhsOuTpFxuICAgICAgICBjb25zdCBzZWxmUmVmcyA9IE9iamVjdC52YWx1ZXMocm93KS5maWx0ZXIoXG4gICAgICAgICAgKHZhbHVlKSA9PiBpc1JlZkZpZWxkKHZhbHVlKSAmJiB2YWx1ZS5vZiA9PT0gdGFibGVOYW1lLFxuICAgICAgICApIGFzIFVCUmVmW107XG5cbiAgICAgICAgLy8g7LC47KGw7ZWY64qUIOuqqOuToCB1dWlk6rCAIOydtOuvuCBpbnNlcnRlZOyXkCDsnojslrTslbwg7J2067KIIOugiOuyqOyXkCDtj6ztlahcbiAgICAgICAgY29uc3QgY2FuSW5zZXJ0ID0gc2VsZlJlZnMuZXZlcnkoKHJlZikgPT4ge1xuICAgICAgICAgIGlmICghcm93QnlVdWlkLmhhcyhyZWYudXVpZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cmVmLnV1aWR9IC0tIGluICR7dGFibGVOYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5zZXJ0ZWQuaGFzKHJlZi51dWlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhbkluc2VydCkge1xuICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKHJvdyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFBlbmRpbmcucHVzaChyb3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOyInO2ZmCDssLjsobAg6rCQ7KeAXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbGV2ZWxzOiBbXSwgaGFzQ2lyY3VsYXI6IHRydWUgfTtcblxuICAgICAgLy8g66CI67KoIO2ZleyglSArIGluc2VydGVkIOqwseyLoFxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGN1cnJlbnRMZXZlbCkge1xuICAgICAgICBpbnNlcnRlZC5hZGQocm93LnV1aWQgYXMgc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZyA9IG5leHRQZW5kaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB7IGxldmVscywgaGFzQ2lyY3VsYXI6IGZhbHNlIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQXlEQSxTQUFnQixXQUFXLE9BQWdDO0FBQ3pELFFBQ0UsVUFBVSxhQUNWLFVBQVUsUUFDVCxPQUFpQixPQUFPLGFBQ3hCLE9BQWlCLFNBQVM7Ozs7c0JBeEQwQjthQUNsQjthQU1xQjtxQkFDZDtDQUl4QyxTQUFTLFVBQVU7RUFBQztFQUFVO0VBQVk7RUFBaUIsQ0FBQztDQWdEckQsZ0JBQWIsTUFBMkI7RUFDekI7RUFDQSxjQUFjO0FBQ1osUUFBSyxTQUFTLElBQUksS0FBSzs7RUFHekIsU0FBUyxXQUE4QjtHQUNyQyxNQUFNLFFBQVEsS0FBSyxPQUFPLElBQUksVUFBVTtBQUN4QyxPQUFJLE9BQU87QUFDVCxXQUFPOztHQUdULE1BQU0sbUJBQW1CO0FBQ3ZCLFFBQUk7QUFDRixZQUFPLGNBQWMsYUFBYSxVQUFVO1lBQ3RDO0FBQ04sWUFBTzs7T0FFUDtHQUVKLE1BQU0sWUFBWTtJQUNo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
|
|
409
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBzZXJ0LWJ1aWxkZXIuanMiLCJuYW1lcyI6WyJyZXN1bHQ6IFVCUmVmIiwidGFibGUiLCJhbGxJZHM6IChudW1iZXIgfCBzdHJpbmcpW10iLCJyZXN1bHRSb3dzOiB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdIiwiY29uZGl0aW9uczogdW5rbm93bltdW10iLCJsZXZlbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W11bXSIsImN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSIsIm5leHRQZW5kaW5nOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgY2x1c3RlciwgaXNBcnJheSwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFiYXNlRm9yZWlnbktleXMsXG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGJhdGNoVXBkYXRlIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuaW1wb3J0IHsgdHlwZSBSb3dXaXRoSWQgfSBmcm9tIFwiLi9fYmF0Y2hfdXBkYXRlXCI7XG5pbXBvcnQgeyB0eXBlIENvbHVtbktleXMsIHR5cGUgRm9yZWlnbktleUNvbHVtbnMsIHR5cGUgSWRUeXBlLCB0eXBlIFRhYmxlTmFtZSB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInNvbmFtdVwiLCBcImludGVybmFsXCIsIFwidXBzZXJ0LWJ1aWxkZXJcIl0pO1xuXG4vKipcbiAqIEZLIO2DgOyehSDstpTroaDsnYQg7JyE7ZW0IERhdGFiYXNlRm9yZWlnbktleXMgZXhwb3J0XG4gKiAobW9kdWxlIGF1Z21lbnRhdGlvbiDsnpDrj5kg66Gc65OcIOuztOyepSlcbiAqL1xuZXhwb3J0IHR5cGUgeyBEYXRhYmFzZUZvcmVpZ25LZXlzIH07XG5cbnR5cGUgSW5oZXJpdGFibGVDb2x1bW5zPFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+ID1cbiAgVFRhYmxlIGV4dGVuZHMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQgPyBDb2x1bW5LZXlzPERhdGFiYXNlU2NoZW1hRXh0ZW5kW1RUYWJsZV0+IDogbmV2ZXI7XG5cbi8vIO2FjOydtOu4lCDrjbDsnbTthLAg7YOA7J6FXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHVuaXF1ZXNNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5cbi8vIOywuOyhsCDtlYTrk5wg7YOA7J6FXG5leHBvcnQgdHlwZSBVQlJlZiA9IHtcbiAgdXVpZDogc3RyaW5nO1xuICBvZjogc3RyaW5nO1xuICB1c2U/OiBzdHJpbmc7XG59O1xuXG4vLyB1cHNlcnQg7Ji17IWYXG5leHBvcnQgdHlwZSBVcHNlcnRPcHRpb25zPFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+ID0ge1xuICBjaHVua1NpemU/OiBudW1iZXI7XG4gIGNsZWFuT3JwaGFucz86IEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT4gfCBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+W107XG4gIGluaGVyaXQ/OiBJbmhlcml0YWJsZUNvbHVtbnM8VFRhYmxlPltdO1xufTtcblxuLy8gaW5zZXJ0T25seSDsmLXshZhcbmV4cG9ydCB0eXBlIEluc2VydE9ubHlPcHRpb25zID0ge1xuICBjaHVua1NpemU/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZGaWVsZChmaWVsZDogdW5rbm93bik6IGZpZWxkIGlzIFVCUmVmIHtcbiAgcmV0dXJuIChcbiAgICBmaWVsZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZmllbGQgIT09IG51bGwgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy5vZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8udXVpZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBVcHNlcnRCdWlsZGVyIHtcbiAgdGFibGVzOiBNYXA8c3RyaW5nLCBUYWJsZURhdGE+O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVEYXRhIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlU3BlYyA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0ge1xuICAgICAgcmVmZXJlbmNlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICByb3dzOiBbXSxcbiAgICAgIHVuaXF1ZUluZGV4ZXM6IHRhYmxlU3BlYz8udW5pcXVlSW5kZXhlcyA/PyBbXSxcbiAgICAgIHVuaXF1ZXNNYXA6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgICBqc29uQ29sdW1uczogdGFibGVTcGVjPy5qc29uQ29sdW1ucyA/PyBbXSxcbiAgICB9O1xuICAgIHRoaXMudGFibGVzLnNldCh0YWJsZU5hbWUsIHRhYmxlRGF0YSk7XG4gICAgcmV0dXJuIHRhYmxlRGF0YTtcbiAgfVxuXG4gIGhhc1RhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVzLmhhcyh0YWJsZU5hbWUpO1xuICB9XG5cbiAgcmVnaXN0ZXI8VCBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcm93OiB7XG4gICAgICBba2V5IGluIFRdPzogVUJSZWYgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgbnVsbCB8IG9iamVjdCB8IHVua25vd247XG4gICAgfSxcbiAgKTogVUJSZWYge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCB1bmlxdWUg7J24642x7Iqk66W8IOyInO2ajO2VmOupsCDtgqQg7IOd7ISxXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9IHRhYmxlLnVuaXF1ZUluZGV4ZXNcbiAgICAgIC5tYXAoKHVucUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUtleUFycmF5ID0gdW5xSW5kZXguY29sdW1ucy5tYXAoKHVucUNvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHJvd1t1bnFDb2wubmFtZSBhcyBrZXlvZiB0eXBlb2Ygcm93XTtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnV1aWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb3dbdW5xQ29sLm5hbWUgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodGFibGUuanNvbkNvbHVtbnMuaW5jbHVkZXMocm93S2V5KSAmJiByb3dWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIEpTT04g7Lus65+87J24IOqyveyasCBKU09OLnN0cmluZ2lmeSDsspjrpqwgKEtuZXjripQgSlNPTiDtg4DsnoXsnYQg7KeA7JuQ7ZWY7KeAIOyViuydjClcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJvd1ZhbHVlKSkge1xuICAgICAgICAgIC8vIOuwsOyXtOydgCDqt7jrjIDroZwg7KCA7J6lXG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQ8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4oXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zPFRUYWJsZT4sXG4gICk6IFByb21pc2U8SWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRPckluc2VydCh3ZGIsIHRhYmxlTmFtZSwgXCJ1cHNlcnRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRPbmx5PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBvcHRpb25zPzogSW5zZXJ0T25seU9wdGlvbnMsXG4gICk6IFByb21pc2U8SWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRPckluc2VydCh3ZGIsIHRhYmxlTmFtZSwgXCJpbnNlcnRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyB1cHNlcnRPckluc2VydDxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PihcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBUVGFibGUsXG4gICAgbW9kZTogXCJ1cHNlcnRcIiB8IFwiaW5zZXJ0XCIsXG4gICAgb3B0aW9ucz86IFVwc2VydE9wdGlvbnM8VFRhYmxlPixcbiAgKTogUHJvbWlzZTxJZFR5cGU8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFRUYWJsZT5bXT4ge1xuICAgIGlmICghdGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdXVpZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGNvbnN0IGFsbElkczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGxldCBsZXZlbElkeCA9IDA7IGxldmVsSWR4IDwgbGV2ZWxzLmxlbmd0aDsgbGV2ZWxJZHgrKykge1xuICAgICAgY29uc3QgbGV2ZWxSb3dzID0gbGV2ZWxzW2xldmVsSWR4XTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlByb2Nlc3NpbmcgUXVlcnkgTGV2ZWw6IHtjdXJyZW50fSAvIHt0b3RhbH1cIiwge1xuICAgICAgICBjdXJyZW50OiBsZXZlbElkeCArIDEsXG4gICAgICAgIHRvdGFsOiBsZXZlbHMubGVuZ3RoLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBvcHRpb25zPy5jaHVua1NpemU7XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNsdXN0ZXIocmVzb2x2ZWRSb3dzLCBjaHVua1NpemUpIDogW3Jlc29sdmVkUm93c107XG4gICAgICBjb25zdCBzZWxlY3RGaWVsZHMgPSB1bmlxdWUoW1wiaWRcIiwgLi4uZXh0cmFjdEZpZWxkc10pO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGV2ZWxDaHVua3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGFDaHVuayA9IGxldmVsQ2h1bmtzW2luZGV4XTtcbiAgICAgICAgaWYgKGRhdGFDaHVuay5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJQcm9jZXNzaW5nIENodW5rOiB7Y3VycmVudH0gLyB7dG90YWx9XCIsIHtcbiAgICAgICAgICBjdXJyZW50OiBpbmRleCArIDEsXG4gICAgICAgICAgdG90YWw6IGxldmVsQ2h1bmtzLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdXVpZOulvCDrs4Trj4TroZwg67O06rSA7ZWY6rOgLCBEQuyXkCDsoIDsnqXtlaAg642w7J207YSw7JeQ7IScIOygnOqxsFxuICAgICAgICBjb25zdCBvcmlnaW5hbFV1aWRzID0gZGF0YUNodW5rLm1hcCgocikgPT4gci51dWlkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGRhdGFGb3JEYiA9IGRhdGFDaHVuay5tYXAoKHsgdXVpZDogXywgLi4ucmVzdCB9KSA9PiByZXN0KTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1bXTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgICAgIC8vIElOU0VSVCDrqqjrk5wgLSBSRVRVUk5JTkcg7IKs7JqpXG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYi5pbnNlcnQoZGF0YUZvckRiKS5pbnRvKHRhYmxlTmFtZSkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAtIGlkIOyXhuuKlCByb3frk6TsnZggaWTrpbwg7IKs7KCEIOyhsO2ajOuhnCDssYTsmrDquLBcbiAgICAgICAgICBjb25zdCByb3dzV2l0aG91dElkID0gZGF0YUZvckRiLmZpbHRlcigocm93KSA9PiAhcm93LmlkKTtcblxuICAgICAgICAgIGlmIChyb3dzV2l0aG91dElkLmxlbmd0aCA+IDAgJiYgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyDrqqjrk6AgdW5pcXVlSW5kZXhlc+uhnCDquLDsobQg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICAgICAgZm9yIChjb25zdCB1bmlxdWVJbmRleCBvZiB0YWJsZS51bmlxdWVJbmRleGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB1bmlxdWVJbmRleC5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsobDtmoztlaAg7KGw6rG065OkIOy2lOy2nCAo6rCBIHJvd+ydmCB1bmlxdWUg7Lus65+8IOqwkuuTpClcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uczogdW5rbm93bltdW10gPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93c1dpdGhvdXRJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGNvbHVtbnMubWFwKChjb2wpID0+IHJvd1tjb2xdKTtcbiAgICAgICAgICAgICAgICAvLyBudWxs7J20IO2PrO2VqOuQnCDsobDqsbTsnYAg7KCc7Jm4IChQb3N0Z3JlU1FMIFVOSVFVReuKlCBOVUxMIOustOyLnClcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlcy5zb21lKCh2KSA9PiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMucHVzaCh2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgLy8g67Cw7LmYIFNFTEVDVFxuICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Jvd3MgPSAoYXdhaXQgd2RiKHRhYmxlTmFtZSlcbiAgICAgICAgICAgICAgICAud2hlcmVJbihjb2x1bW5zLCBjb25kaXRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W11bXSlcbiAgICAgICAgICAgICAgICAuc2VsZWN0KFwiaWRcIiwgLi4uY29sdW1ucykpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cbiAgICAgICAgICAgICAgLy8gTWFwIOyDneyEsTogdW5pcXVlIOy7rOufvCDsobDtlakg4oaSIGlkXG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBleGlzdGluZyBvZiBleGlzdGluZ1Jvd3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IFN0cmluZyhleGlzdGluZ1tjb2xdID8/IFwiXCIpKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oXCItLS1kZWxpbWl0ZXItLS1cIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBleGlzdGluZy5pZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KGtleSwgaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGlkIOyXhuuKlCByb3frk6Tsl5Ag66ek7Lmt65CY64qUIGlkIOyxhOyasOq4sFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzV2l0aG91dElkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5pZCkgY29udGludWU7IC8vIOydtOuvuCDri6TrpbggdW5pcXVlSW5kZXjsl5DshJwg7LGE7JuM7KeEIOqyveyasCDsiqTtgrVcblxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbnMubWFwKChjb2wpID0+IFN0cmluZyhyb3dbY29sXSA/PyBcIlwiKSkuam9pbihcIi0tLWRlbGltaXRlci0tLVwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZXhpc3RpbmdNYXAuZ2V0KGtleSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgICAgICAgcm93LmlkID0gZXhpc3RpbmdJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBvbkNvbmZsaWN064qUIGlk66eMIOyCrOyaqSAo66qo65OgIHVuaXF1ZUluZGV4ZXPripQg7J2066+4IOyCrOyghCDsobDtmozroZwg7LKY66as65CoKVxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0Q29sdW1ucyA9IFtcImlkXCJdO1xuXG4gICAgICAgICAgY29uc3QgYWxsQ29sdW1ucyA9IE9iamVjdC5rZXlzKGRhdGFGb3JEYlswXSk7XG4gICAgICAgICAgbGV0IHVwZGF0ZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcigoYykgPT4gYyAhPT0gXCJpZFwiKTtcblxuICAgICAgICAgIC8vIGluaGVyaXQg7Ji17IWYIOyymOumrCAtIGluaGVyaXQg7Lus65+87J2AIHVwZGF0ZSDrjIDsg4Hsl5DshJwg7KCc7Jm4XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmluaGVyaXQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgaW5oZXJpdENvbHVtbnMgPSBvcHRpb25zLmluaGVyaXQgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkRnJvbVVwZGF0ZSA9IHVwZGF0ZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBpbmhlcml0Q29sdW1ucy5pbmNsdWRlcyhjKSk7XG4gICAgICAgICAgICB1cGRhdGVDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5maWx0ZXIoKGMpID0+ICFpbmhlcml0Q29sdW1ucy5pbmNsdWRlcyhjKSk7XG5cbiAgICAgICAgICAgIC8vIOyLpOygnOuhnCDsoJzsmbjrkJwg7Lus65+8IOuhnOq5hVxuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkRnJvbVVwZGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgTmFpdGUudChcInB1cmk6dWItaW5oZXJpdFwiLCB7XG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGluaGVyaXRDb2x1bW5zLFxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRnJvbVVwZGF0ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPyB1cGRhdGVDb2x1bW5zIDogY29uZmxpY3RDb2x1bW5zO1xuXG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYlxuICAgICAgICAgICAgLmluc2VydChkYXRhRm9yRGIpXG4gICAgICAgICAgICAuaW50byh0YWJsZU5hbWUpXG4gICAgICAgICAgICAub25Db25mbGljdChjb25mbGljdENvbHVtbnMpXG4gICAgICAgICAgICAubWVyZ2UobWVyZ2VDb2x1bW5zKVxuICAgICAgICAgICAgLnJldHVybmluZyhzZWxlY3RGaWVsZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsVXVpZHMubGVuZ3RoICE9PSByZXN1bHRSb3dzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV9OiByZWdpc3Rlci9yZXR1cm5pbmcg67aI7J287LmYYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB1dWlkTWFwLnNldChvcmlnaW5hbFV1aWRzW2ldLCByZXN1bHRSb3dzW2ldKTtcbiAgICAgICAgICBhbGxJZHMucHVzaChyZXN1bHRSb3dzW2ldLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJQg7LC47KGw66W8IOyLpOygnCDrsLjrpZjroZwg67OA6rK9XG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiByZWZUYWJsZXMpIHtcbiAgICAgIHRhYmxlLnJvd3MgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gcm93W2tleV07XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQocHJvcCkgJiYgcHJvcC5vZiA9PT0gdGFibGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB1dWlkTWFwLmdldChwcm9wLnV1aWQpO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihwcm9wKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtwcm9wLnV1aWR9IC0tIGluICR7dGFibGVOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3AudXNlID8/IFwiaWRcIl07XG4gICAgICAgICAgICByb3dba2V5XSA9IHJlc29sdmVkVmFsdWU7XG5cbiAgICAgICAgICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiLCB7XG4gICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgZnJvbTogeyBvZjogcHJvcC5vZiwgdXVpZDogcHJvcC51dWlkLCB1c2U6IHByb3AudXNlID8/IFwiaWRcIiB9LFxuICAgICAgICAgICAgICB0bzogcmVzb2x2ZWRWYWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmNsZWFuT3JwaGFucykge1xuICAgICAgY29uc3QgY2xlYW5PcnBoYW5zID0gb3B0aW9ucy5jbGVhbk9ycGhhbnM7XG4gICAgICBjb25zdCBma0NvbHVtbnMgPSBpc0FycmF5KGNsZWFuT3JwaGFucylcbiAgICAgICAgPyAoY2xlYW5PcnBoYW5zIGFzIEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5bXSlcbiAgICAgICAgOiBbY2xlYW5PcnBoYW5zIGFzIEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5dO1xuXG4gICAgICAvLyDtmITsnqwgcmVnaXN0ZXLrkJwg66CI7L2U65Oc65Ok7J2YIEZLIOqwkuuTpCDstpTstpxcbiAgICAgIGNvbnN0IGZrQ29uZGl0aW9ucyA9IGZrQ29sdW1ucy5tYXAoKGZrQ29sKSA9PiB7XG4gICAgICAgIGNvbnN0IGZrVmFsdWVzID0gWy4uLm5ldyBTZXQodGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93W2ZrQ29sXSkuZmlsdGVyKEJvb2xlYW4pKV07XG4gICAgICAgIHJldHVybiB7IGNvbHVtbjogZmtDb2wsIHZhbHVlczogZmtWYWx1ZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrk6AgRksg7Lus65+87JeQIOqwkuydtCDsnojripQg6rK97Jqw7JeQ66eMIOyCreygnCDsi6TtlolcbiAgICAgIGlmIChma0NvbmRpdGlvbnMuZXZlcnkoKGZjKSA9PiBmYy52YWx1ZXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgbGV0IGRlbGV0ZVF1ZXJ5ID0gd2RiKHRhYmxlTmFtZSk7XG5cbiAgICAgICAgLy8g6rCBIEZLIOy7rOufvOyXkCDrjIDtlZwgV0hFUkUgSU4g7KGw6rG0IOy2lOqwgFxuICAgICAgICBmb3IgKGNvbnN0IHsgY29sdW1uLCB2YWx1ZXMgfSBvZiBma0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICBkZWxldGVRdWVyeSA9IGRlbGV0ZVF1ZXJ5LndoZXJlSW4oY29sdW1uLCB2YWx1ZXMgYXMgS25leC5WYWx1ZVtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuwqeq4iCB1cHNlcnTtlZwgSUTripQg7KCc7Jm4XG4gICAgICAgIGRlbGV0ZVF1ZXJ5ID0gZGVsZXRlUXVlcnkud2hlcmVOb3RJbihcImlkXCIsIGFsbElkcyk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZENvdW50ID0gYXdhaXQgZGVsZXRlUXVlcnkuZGVsZXRlKCk7XG5cbiAgICAgICAgTmFpdGUudChcInB1cmk6dWItY2xlYW4tb3JwaGFuc1wiLCB7XG4gICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgIGNsZWFuT3JwaGFuczogZmtDb2x1bW5zLFxuICAgICAgICAgIGRlbGV0ZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCDrjbDsnbTthLAg7LSI6riw7ZmUXG4gICAgdGFibGUucm93cyA9IFtdO1xuICAgIHRhYmxlLnJlZmVyZW5jZXMuY2xlYXIoKTtcbiAgICB0YWJsZS51bmlxdWVzTWFwLmNsZWFyKCk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi11cHNlcnRlZFwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgcm93Q291bnQ6IGFsbElkcy5sZW5ndGgsXG4gICAgICByZXR1cm5lZElkczogYWxsSWRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbElkcyBhcyBJZFR5cGU8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFRUYWJsZT5bXTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUJhdGNoKFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgY2h1bmtTaXplPzogbnVtYmVyO1xuICAgICAgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNodW5rU2l6ZTogb3B0aW9ucz8uY2h1bmtTaXplID8/IDUwMCxcbiAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSA/PyBcImlkXCIsXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrk7HroZ3rkJjsp4Ag7JWK7J2AIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBkYXRlQmF0Y2gg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ29sdW1ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy53aGVyZSkgPyBvcHRpb25zLndoZXJlIDogW29wdGlvbnMud2hlcmUgPz8gXCJpZFwiXTtcbiAgICBjb25zdCByb3dzID0gdGFibGUucm93cy5tYXAoKF9yb3cpID0+IHtcbiAgICAgIGNvbnN0IHsgdXVpZDogXywgLi4ucm93IH0gPSBfcm93OyAvLyB1dWlkIOygnOyZuFxuICAgICAgcmV0dXJuIHJvdyBhcyBSb3dXaXRoSWQ8c3RyaW5nPjtcbiAgICB9KTtcblxuICAgIGF3YWl0IGJhdGNoVXBkYXRlKHdkYiwgdGFibGVOYW1lLCB3aGVyZUNvbHVtbnMsIHJvd3MsIG9wdGlvbnMuY2h1bmtTaXplKTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgd2hlcmVDb2x1bW5zLFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlQmF0Y2gg7JmE66OMIO2bhCDsspjrpqzrkJwg642w7J207YSwIOygnOqxsFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBeURBLFNBQWdCLFdBQVcsT0FBZ0M7QUFDekQsUUFDRSxVQUFVLGFBQ1YsVUFBVSxRQUNULE9BQWlCLE9BQU8sYUFDeEIsT0FBaUIsU0FBUzs7OztzQkF4RDBCO2FBQ2xCO2FBTXFCO3FCQUNkO0NBSXhDLFNBQVMsVUFBVTtFQUFDO0VBQVU7RUFBWTtFQUFpQixDQUFDO0NBZ0RyRCxnQkFBYixNQUEyQjtFQUN6QjtFQUNBLGNBQWM7QUFDWixRQUFLLFNBQVMsSUFBSSxLQUFLOztFQUd6QixTQUFTLFdBQThCO0dBQ3JDLE1BQU0sUUFBUSxLQUFLLE9BQU8sSUFBSSxVQUFVO0FBQ3hDLE9BQUksT0FBTztBQUNULFdBQU87O0dBR1QsTUFBTSxtQkFBbUI7QUFDdkIsUUFBSTtBQUNGLFlBQU8sY0FBYyxhQUFhLFVBQVU7WUFDdEM7QUFDTixZQUFPOztPQUVQO0dBRUos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
|
|
@@ -504,7 +504,7 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
504
504
|
const stats = {};
|
|
505
505
|
const total = rows.length;
|
|
506
506
|
for (const locale of locales) {
|
|
507
|
-
const filled = rows.filter((row) => row[locale]
|
|
507
|
+
const filled = rows.filter((row) => !!row[locale]).length;
|
|
508
508
|
const percent = total > 0 ? Math.round(filled / total * 100) : 0;
|
|
509
509
|
stats[locale] = {
|
|
510
510
|
total,
|
|
@@ -889,4 +889,4 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
889
889
|
//#endregion
|
|
890
890
|
init_sonamu_dictionary();
|
|
891
891
|
export { SonamuDictionary, init_sonamu_dictionary, sonamuDictionary };
|
|
892
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6WyJlbnRyaWVzOiBEaWN0RW50cnlbXSIsImhlbHBlcnM6IHN0cmluZ1tdIiwibGluZXM6IHN0cmluZ1tdIiwicm93czogRGljdGlvbmFyeVJvd1tdIiwicm93OiBEaWN0aW9uYXJ5Um93Iiwic3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiIsImNvbHVtbldpZHRoczogbnVtYmVyW10iLCJwcm9qZWN0RGljdEVudHJpZXM6IFJlY29yZDxzdHJpbmcsIERpY3RFbnRyeVtdPiIsImNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+Iiwicm93VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IiwibmV3RW50cnk6IERpY3RFbnRyeSIsInNnUGF0aDogc3RyaW5nIHwgbnVsbCIsInNlYXJjaFBhdGhzOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSBcIkBzaGVldGtpdC9ub2RlXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4vc2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGljdEVudHJ5LFxuICB0eXBlIERpY3Rpb25hcnlSZXN1bHQsXG4gIHR5cGUgRGljdGlvbmFyeVJvdyxcbiAgdHlwZSBFbnRpdHlLZXlJbmZvLFxuICB0eXBlIEkxOG5Db25maWcsXG4gIHR5cGUgSW1wb3J0UmVzdWx0LFxuICB0eXBlIFVzYWdlUmVzdWx0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIDAtYmFzZWQg7Lus65+8IOyduOuNseyKpOulvCDsl5HshYAg7Lus65+8IOusuOyekOuhnCDrs4DtmZggKDAgLT4gXCJBXCIsIDI1IC0+IFwiWlwiLCAyNiAtPiBcIkFBXCIpXG4gKi9cbmZ1bmN0aW9uIGNvbExldHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBuID0gaW5kZXg7XG4gIHdoaWxlIChuID49IDApIHtcbiAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgKG4gJSAyNikpICsgcmVzdWx0O1xuICAgIG4gPSBNYXRoLmZsb29yKG4gLyAyNikgLSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg6rSA66asIO2BtOuemOyKpFxuICogaTE4biDrlJXshZTrhIjrpqzsnZggQ1JVRCDrsI8gRXhjZWwgaW1wb3J0L2V4cG9ydOulvCDri7Tri7ntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb25hbXVEaWN0aW9uYXJ5IHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgQ29tcGlsZXIgQVBJ66W8IOyCrOyaqe2VmOyXrCBkaWN0IO2MjOydvCDtjIzsi7FcbiAgICpcbiAgICog7KeA7JuQIO2MqO2EtDpcbiAgICogLSBleHBvcnQgZGVmYXVsdCB7IC4uLiB9IGFzIGNvbnN0O1xuICAgKiAtIGV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7IC4uLiB9KTtcbiAgICogLSDrrLjsnpDsl7Qg6rCSOiBcImtleVwiOiBcInZhbHVlXCIg65iQ64qUIGtleTogYHZhbHVlYFxuICAgKiAtIO2VqOyImCDqsJI6IFwia2V5XCI6IChwYXJhbTogVHlwZSkgPT4gYHRlbXBsYXRlYFxuICAgKi9cbiAgcGFyc2VEaWN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J287JeQ7IScIO2KueyglSDsnbTrpoTsnZggY29uc3Qg7ISg7Ja47J2EIOywvuyVhCBPYmplY3RMaXRlcmFsIO2MjOyLsVxuICAgKiDsmIg6IGNvbnN0IGVudGl0eUxhYmVscyA9IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqL1xuICBwYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oZmlsZVBhdGg6IHN0cmluZywgdmFyTmFtZTogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoZGVjbC5uYW1lKSAmJiBkZWNsLm5hbWUudGV4dCA9PT0gdmFyTmFtZSAmJiBkZWNsLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZGVjbC5pbml0aWFsaXplcik7XG4gICAgICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOusuOyekOyXtOydtCDtmZTsgrTtkZwg7ZWo7IiYIOuYkOuKlCDtlajsiJgg7ZGc7ZiE7Iud7J247KeAIO2MkOuzhFxuICAgKi9cbiAgaXNFeHByZXNzaW9uRnVuY3Rpb24oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8g67mIIOusuOyekOyXtOydtOuCmCDqs7XrsLHrp4wg7J6I64qUIOqyveyasFxuICAgIGlmICghY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBBUlJPV19GVU5DVElPTl9QQVRURVJOID0gL15cXHMqXFwoW14pXSpcXClcXHMqPT4vO1xuXG4gICAgcmV0dXJuIEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4udGVzdChjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHBvcnQgZGVmYXVsdCDtkZztmITsi53sl5DshJwgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24g7LaU7LacXG4gICAqIC0gYXMgY29uc3Qg7LKY66asXG4gICAqIC0gZGVmaW5lTG9jYWxlKHsgLi4uIH0pIO2YuOy2nCDsspjrpqxcbiAgICovXG4gIHByaXZhdGUgdW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHI6IHRzLkV4cHJlc3Npb24pOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IG51bGwge1xuICAgIC8vIGFzIGNvbnN0IOyymOumrFxuICAgIGlmICh0cy5pc0FzRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIHRoaXMudW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHIuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIC8vIOyngeygkSDqsJ3ssrQg66as7YSw65+0XG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICAvLyBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacXG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJnID0gZXhwci5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbuyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChcbiAgICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZXh0cmFjdERpY3RFbnRyeShwcm9wLCBzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eU5hbWXsl5DshJwg7YKkIOusuOyekOyXtCDstpTstpxcbiAgICogLSDrrLjsnpDsl7Qg66as7YSw65+0OiBcImtleVwiXG4gICAqIC0g7Iud67OE7J6QOiBrZXkgKHVucXVvdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUtleShuYW1lOiB0cy5Qcm9wZXJ0eU5hbWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZztjbzti7Dsl5DshJwgRGljdEVudHJ5IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtDog7Iuk7KCcIOusuOyekOyXtCDqsJJcbiAgICogLSDtlajsiJg6IOybkOuzuCDshozsiqQgKOyXrOufrCDspITsnYAg7ZWcIOykhOuhnCDsoJXqt5ztmZQpXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3REaWN0RW50cnkoXG4gICAgcHJvcDogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICk6IERpY3RFbnRyeSB8IG51bGwge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJvcGVydHlLZXkocHJvcC5uYW1lKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBpbml0ID0gcHJvcC5pbml0aWFsaXplcjtcblxuICAgIC8vIO2ZlOyCtO2RnCDtlajsiJhcbiAgICBpZiAodHMuaXNBcnJvd0Z1bmN0aW9uKGluaXQpKSB7XG4gICAgICBjb25zdCBmdW5jVGV4dCA9IGluaXQuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmdW5jVGV4dC5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9ybWFsaXplZCwgaXNGdW5jdGlvbjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g7YWc7ZSM66a/IOumrO2EsOuftCAo67OA7IiYIOyXhuydjClcbiAgICBpZiAodHMuaXNOb1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbChpbml0KSkge1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogaW5pdC50ZXh0LCBpc0Z1bmN0aW9uOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIOq4sO2DgCAo7JiIOiDtlajsiJgg7ZGc7ZiE7IudKVxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpLFxuICAgICAgaXNGdW5jdGlvbjogdHMuaXNGdW5jdGlvbkV4cHJlc3Npb24oaW5pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZzsoJ3tirjsnZggaTE4biBkaWN0IO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0g7YOA6rKfIOuUlOugie2GoOumrCAoYXBpLCB3ZWIsIGFwcClcbiAgICovXG4gIGdldFByb2plY3REaWN0UGF0aChsb2NhbGU6IHN0cmluZywgdGFyZ2V0OiBcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIgPSBcImFwaVwiKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIGRpciwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUg64K07J6lIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFNvbmFtdURpY3RQYXRoKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIik7XG4gICAgcmV0dXJuIHBhdGguam9pbihwYWNrYWdlUm9vdCwgXCJzcmNcIiwgXCJkaWN0XCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTsmpTtlZwgZGljdCDtgqTqsIAg7ZSE66Gc7KCd7Yq47JeQIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlZjqs6AsIOyXhuycvOuptCDstpTqsIDtlanri4jri6QuXG4gICAqIGRlZmF1bHRMb2NhbGXsl5Drp4wg7LaU6rCA7ZWY66mwLCDri6TrpbggbG9jYWxl7J2AIOyCrOyaqeyekOqwgCDsp4HsoJEg67KI7Jet7ZW07JW8IO2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVpcmVkS2V5cyAtIO2VhOyalO2VnCDtgqQg66qp66GdXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKiBAcmV0dXJucyDstpTqsIDrkJwg7YKkIOuqqeuhnVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRGljdEtleXMoXG4gICAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXSxcbiAgICB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IFNvbmFtdS5jb25maWcuaTE4bjtcbiAgICBjb25zdCBwcm9qZWN0RGljdFBhdGggPSB0aGlzLmdldFByb2plY3REaWN0UGF0aChkZWZhdWx0TG9jYWxlLCB0YXJnZXQpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287J20IOyXhuycvOuptCDslYTrrLTqsoPrj4Qg7ZWY7KeAIOyViuydjFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9qZWN0RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Tsl5DshJwg6riw7KG0IO2CpCDtjIzsi7FcbiAgICBjb25zdCBwcm9qZWN0RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShwcm9qZWN0RGljdFBhdGgpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQocHJvamVjdEVudHJpZXMubWFwKChlKSA9PiBlLmtleSkpO1xuXG4gICAgLy8g64iE652965CcIO2CpCDssL7quLBcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWV4aXN0aW5nS2V5cy5oYXMoa2V5KSk7XG5cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gc29uYW11IGRpY3Tsl5DshJwg6riw67O46rCSIOqwgOyguOyYpOq4sFxuICAgIGNvbnN0IHNvbmFtdURpY3RQYXRoID0gdGhpcy5nZXRTb25hbXVEaWN0UGF0aChkZWZhdWx0TG9jYWxlKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc29uYW11RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYW11RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShzb25hbXVEaWN0UGF0aCk7XG4gICAgY29uc3Qgc29uYW11RGljdCA9IG5ldyBNYXAoc29uYW11RW50cmllcy5tYXAoKGUpID0+IFtlLmtleSwgZV0pKTtcblxuICAgIC8vIOy2lOqwgO2VoCDsl5Ttirjrpqwg7IOd7ISxXG4gICAgY29uc3QgZW50cmllc1RvQWRkID0gbWlzc2luZ0tleXNcbiAgICAgIC5tYXAoKGtleSkgPT4gc29uYW11RGljdC5nZXQoa2V5KSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgTm9uTnVsbGFibGU8dHlwZW9mIGVudHJ5PiA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGlmIChlbnRyaWVzVG9BZGQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287JeQIOy2lOqwgFxuICAgIGF3YWl0IHRoaXMuYXBwZW5kRW50cmllc1RvRGljdEZpbGUocHJvamVjdERpY3RQYXRoLCBlbnRyaWVzVG9BZGQsIGRlZmF1bHRMb2NhbGUsIHRydWUpO1xuXG4gICAgcmV0dXJuIGVudHJpZXNUb0FkZC5tYXAoKGUpID0+IGUua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOyXkCDsl5Ttirjrpqzrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgKiDquLDsobQg7YyM7J287J2EIO2MjOyLse2VmOqzoCwg7IOIIOyXlO2KuOumrOulvCDstpTqsIDtlZwg65KkLCDsoITssrQg7YyM7J287J2EIOyerOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kRW50cmllc1RvRGljdEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOq4sOyhtCBlbnRyaWVzIO2MjOyLsVxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShmaWxlUGF0aCk7XG5cbiAgICAvLyDsg4ggZW50cmllcyDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbwg7J6s7IOd7ISxXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGV4aXN0aW5nRW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIFwidHlwZXNjcmlwdFwiLCBmaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImCDqsJLrk6Tsl5DshJwg7IKs7Jqp65CY64qUIO2XrO2NvCDtlajsiJjrpbwg6rCQ7KeA7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVc2VkSGVscGVycyhlbnRyaWVzOiBEaWN0RW50cnlbXSk6IHtcbiAgICBoZWxwZXJzOiBzdHJpbmdbXTtcbiAgICB1c2VzRm9ybWF0OiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBmdW5jdGlvbkVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5pc0Z1bmN0aW9uKTtcbiAgICBjb25zdCBoZWxwZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBoZWxwZXIgb2YgW1wicGx1cmFsXCIsIFwiam9zYVwiXSkge1xuICAgICAgLy8g7ZWo7IiY66qF7J20IOuLqOyWtCDqsr3qs4TroZwg7IKs7Jqp65CY64qU7KeAIO2ZleyduCAo7JiIOiBwbHVyYWwoIOuYkOuKlCBwbHVyYWwsKVxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYFxcXFxiJHtoZWxwZXJ9XFxcXHMqXFxcXChgKTtcbiAgICAgIGlmIChmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gcGF0dGVybi50ZXN0KGUudmFsdWUpKSkge1xuICAgICAgICBoZWxwZXJzLnB1c2goaGVscGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXQg7IKs7JqpIOyXrOu2gCDrs4Trj4Qg6rCQ7KeAIChmb3JtYXQubnVtYmVyKC4uLiksIGZvcm1hdC5kYXRlKC4uLikg65OxKVxuICAgIGNvbnN0IGZvcm1hdFBhdHRlcm4gPSAvXFxiZm9ybWF0XFwuXFx3K1xccypcXCgvO1xuICAgIGNvbnN0IHVzZXNGb3JtYXQgPSBmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gZm9ybWF0UGF0dGVybi50ZXN0KGUudmFsdWUpKTtcblxuICAgIHJldHVybiB7IGhlbHBlcnMsIHVzZXNGb3JtYXQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgKi9cbiAgZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZywgZW50cmllczogRGljdEVudHJ5W10sIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8ga2V5IOyVjO2MjOuysyDsiJwg7KCV66CsXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnRvU29ydGVkKChhLCBiKSA9PiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIO2VqOyImCDqsJLsl5DshJwg7IKs7Jqp65CY64qUIO2XrO2NvCDtlajsiJgg6rCQ7KeAXG4gICAgY29uc3QgeyBoZWxwZXJzLCB1c2VzRm9ybWF0IH0gPSB0aGlzLmRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXMpO1xuXG4gICAgLy8g7Zes7Y28IO2VqOyImCBpbXBvcnQg7LaU6rCAXG4gICAgY29uc3QgaW1wb3J0cyA9IFsuLi5oZWxwZXJzXTtcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgaW1wb3J0cy5wdXNoKFwiY3JlYXRlRm9ybWF0XCIpO1xuICAgIH1cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGBpbXBvcnQgeyAke2ltcG9ydHMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJzb25hbXUvZGljdFwiO2ApO1xuICAgIH1cblxuICAgIGlmICghaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKCdpbXBvcnQgeyBkZWZpbmVMb2NhbGUgfSBmcm9tIFwiLi9zZC5nZW5lcmF0ZWRcIjsnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwIHx8ICFpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsi5wgY3JlYXRlRm9ybWF0IO2YuOy2nCDstpTqsIBcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgbGluZXMucHVzaChgY29uc3QgZm9ybWF0ID0gY3JlYXRlRm9ybWF0KFwiJHtsb2NhbGV9XCIpO2ApO1xuICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKFwiLyoqXCIpO1xuICAgIGxpbmVzLnB1c2goYCAqIFByb2plY3QgJHtsb2NhbGUudG9VcHBlckNhc2UoKX0gRGljdGlvbmFyeWApO1xuICAgIGxpbmVzLnB1c2goXCIgKi9cIik7XG5cbiAgICBpZiAoaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiZXhwb3J0IGRlZmF1bHQge1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7XCIpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgICBpZiAoZW50cnkuaXNGdW5jdGlvbikge1xuICAgICAgICAvLyDtlajsiJjsnbgg6rK97JqwOiDsm5DtmJUg6re464yA66GcIOy2nOugpVxuICAgICAgICBsaW5lcy5wdXNoKGAgIFwiJHtlbnRyeS5rZXl9XCI6ICR7ZW50cnkudmFsdWV9LGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke0pTT04uc3RyaW5naWZ5KGVudHJ5LnZhbHVlKX0sYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcIn0gYXMgY29uc3Q7XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKFwifSk7XCIpO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKFwiXCIpO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogaTE4biDshKTsoJXsnYQg6rCA7KC47Ji164uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJMThuQ29uZmlnKCk6IEkxOG5Db25maWcge1xuICAgIHJldHVybiBTb25hbXUuY29uZmlnLmkxOG47XG4gIH1cblxuICAvKipcbiAgICogaTE4biDrlJTroInthqDrpqwg6rK966Gc66W8IOuwmO2ZmO2VmOqzoCwg7JeG7Jy866m0IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlSTE4bkRpcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGkxOG5EaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGkxOG5EaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoaTE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBpMThuRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287J2EIOyggOyepe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZURpY3RGaWxlKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaTE4bkRpciA9IHRoaXMuZW5zdXJlSTE4bkRpcigpO1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKGkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIFwidHlwZXNjcmlwdFwiLCBkaWN0UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkaWN0UGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4ga2V566W8IO2MjOyLse2VmOyXrCBlbnRpdHkg6rSA66CoIOygleuztCDstpTstpxcbiAgICovXG4gIHBhcnNlRW50aXR5S2V5KGtleTogc3RyaW5nKTogRW50aXR5S2V5SW5mbyB7XG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0gKGxpc3QsIGNyZWF0ZSwgZWRpdCDsoJzsmbgpXG4gICAgY29uc3QgZW50aXR5VGl0bGVNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKikkLyk7XG4gICAgaWYgKFxuICAgICAgZW50aXR5VGl0bGVNYXRjaCAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5saXN0XCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmNyZWF0ZVwiKSAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5lZGl0XCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudGl0eVRpdGxlXCIsIGVudGl0eUlkOiBlbnRpdHlUaXRsZU1hdGNoWzFdIH07XG4gICAgfVxuXG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0ue3Byb3BOYW1lfVxuICAgIGNvbnN0IHByb3BEZXNjTWF0Y2ggPSBrZXkubWF0Y2goL15lbnRpdHlcXC4oW0EtWl1bYS16QS1aMC05XSopXFwuKFthLXpfXVthLXowLTlfXSopJC8pO1xuICAgIGlmIChwcm9wRGVzY01hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInByb3BEZXNjXCIsIGVudGl0eUlkOiBwcm9wRGVzY01hdGNoWzFdLCBwcm9wTmFtZTogcHJvcERlc2NNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIC8vIGVudW0ue0VudW1JZH0ue3ZhbHVlfVxuICAgIGNvbnN0IGVudW1MYWJlbE1hdGNoID0ga2V5Lm1hdGNoKC9eZW51bVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oLispJC8pO1xuICAgIGlmIChlbnVtTGFiZWxNYXRjaCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtTGFiZWxcIiwgZW51bUlkOiBlbnVtTGFiZWxNYXRjaFsxXSwgZW51bVZhbHVlOiBlbnVtTGFiZWxNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eSBrZXnsl5Ag64yA7ZW0IGVudGl0eS5qc29uIOyXheuNsOydtO2KuCDsiJjtlolcbiAgICogQHJldHVybnMg7JeF642w7J207Yq4IOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50aXR5QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXlJbmZvID0gdGhpcy5wYXJzZUVudGl0eUtleShrZXkpO1xuXG4gICAgc3dpdGNoIChrZXlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbnRpdHlUaXRsZVwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoa2V5SW5mby5lbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS50aXRsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS50aXRsZSA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZW50aXR5IG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb3BEZXNjXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBwcm9wSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IGtleUluZm8ucHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wSW5kZXggIT09IC0xICYmIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbnRpdHkucHJvcHNbcHJvcEluZGV4XS5kZXNjID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZW51bUxhYmVsXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF0pIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKC5saXN0LCAuY3JlYXRlLCAuZWRpdCDsoJzsmbgpXG4gICAqL1xuICBleHRyYWN0RW50aXR5TGFiZWxzKCk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oc2RQYXRoLCBcImVudGl0eUxhYmVsc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgcmMta2V5cyDstpTstpxcbiAgICogcmVhY3QtY29tcG9uZW50c+yXkOyEnCDqtIDrpqzrkJjripQgaTE4biDtgqTrk6RcbiAgICogQHBhcmFtIGxvY2FsZSAtIOuhnOy8gOydvCAoa28sIGVuIOuTsSlcbiAgICovXG4gIGV4dHJhY3RSQ0tleXMobG9jYWxlOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3Qgc2RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIFwic2QuZ2VuZXJhdGVkLnRzXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzZFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gbG9jYWxl67OEIOuzgOyImOuqhSDrp6TtlZEgKHNkLnRlbXBsYXRlLnRz7J2YIGdldFJDS2V5c1Zhck5hbWXqs7wg64+Z7J28KVxuICAgIGNvbnN0IHZhck5hbWUgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiKSByZXR1cm4gXCJyY0tleXNLb1wiO1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJlblwiKSByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgICAgLy8g64uk66W4IGxvY2FsZeydgCBlbuydhCBmYWxsYmFja+ycvOuhnCDsgqzsmqlcbiAgICAgIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIHZhck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZGljdCDtjIzsnbwoW2xvY2FsZV0udHMp7JeQ7IScIOuUleyFlOuEiOumrCDroZzrk5xcbiAgICovXG4gIGxvYWRQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZyk6IHsgZW50cmllczogRGljdEVudHJ5W10gfSB7XG4gICAgY29uc3QgZGljdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXM6IHRoaXMucGFyc2VEaWN0RmlsZShkaWN0UGF0aCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg642w7J207YSwIOyImOynkSAoc29uYW11ICsgZW50aXR5ICsgcHJvamVjdClcbiAgICovXG4gIGFzeW5jIGNvbGxlY3REaWN0aW9uYXJ5KCk6IFByb21pc2U8RGljdGlvbmFyeVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICBjb25zdCByb3dzOiBEaWN0aW9uYXJ5Um93W10gPSBbXTtcbiAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPHN0cmluZywgRGljdGlvbmFyeVJvdz4oKTtcblxuICAgIC8vIDEuIFJDIEtleXMgKHNvbmFtdSBzb3VyY2UsIOqwgSBsb2NhbGXrs4QpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgcmNLZXlzID0gdGhpcy5leHRyYWN0UkNLZXlzKGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IHJjS2V5IG9mIHJjS2V5cykge1xuICAgICAgICBsZXQgcm93ID0gcm93TWFwLmdldChyY0tleS5rZXkpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIGtleTogcmNLZXkua2V5LFxuICAgICAgICAgICAgc291cmNlOiBcInNvbmFtdVwiLFxuICAgICAgICAgICAgaXNGdW5jdGlvbjogcmNLZXkuaXNGdW5jdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJvd01hcC5zZXQocmNLZXkua2V5LCByb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd1tsb2NhbGVdID0gcmNLZXkudmFsdWU7XG4gICAgICAgIGlmIChyY0tleS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgcm93LmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRW50aXR5IGxhYmVscyAoZGVmYXVsdCBsb2NhbGUg6riw7KSAKVxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgZW50aXR5TGFiZWxzKSB7XG4gICAgICBjb25zdCByb3c6IERpY3Rpb25hcnlSb3cgPSB7XG4gICAgICAgIGtleTogbGFiZWwua2V5LFxuICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIsXG4gICAgICAgIGlzRnVuY3Rpb246IGxhYmVsLmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIFtkZWZhdWx0TG9jYWxlXTogbGFiZWwudmFsdWUsXG4gICAgICB9O1xuICAgICAgcm93TWFwLnNldChsYWJlbC5rZXksIHJvdyk7XG4gICAgfVxuXG4gICAgLy8gMy4gUHJvamVjdCBkaWN0ICjqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgLy8gc29uYW11LCBlbnRpdHkgc291cmNl6rCAIOyeiOycvOuptCDtlbTri7kgbG9jYWxlIOqwkuunjCDstpTqsIBcbiAgICAgICAgICBleGlzdGluZ1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcm9qZWN0IHNvdXJjZeuhnCDsg4jroZwg7LaU6rCAXG4gICAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgICBrZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICAgICAgc291cmNlOiBcInByb2plY3RcIixcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZW50cnkuaXNGdW5jdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByb3dNYXAuc2V0KGVudHJ5LmtleSwgcm93KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93W2xvY2FsZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MucHVzaCguLi5yb3dNYXAudmFsdWVzKCkpO1xuICAgIHJvd3Muc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgLy8g7Ya16rOEIOqzhOyCsDogbG9jYWxl67OEICjssYTsm4zsp4Qg6rCSIC8g7KCE7LK0IO2CpCDsiJgpXG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiA9IHt9O1xuICAgIGNvbnN0IHRvdGFsID0gcm93cy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgZmlsbGVkID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93W2xvY2FsZV0gIT0gbnVsbCAmJiByb3dbbG9jYWxlXSAhPT0gXCJcIikubGVuZ3RoO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGZpbGxlZCAvIHRvdGFsKSAqIDEwMCkgOiAwO1xuICAgICAgc3RhdHNbbG9jYWxlXSA9IHsgdG90YWwsIGZpbGxlZCwgcGVyY2VudCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHJvd3MsIGxvY2FsZXMsIGRlZmF1bHRMb2NhbGUsIHN0YXRzIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2Vs66GcIOuCtOuztOuCtOq4sFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCgpOiBQcm9taXNlPHsgZmlsZW5hbWU6IHN0cmluZzsgYnVmZmVyOiBCdWZmZXIgfT4ge1xuICAgIGNvbnN0IHsgcm93cywgbG9jYWxlcyB9ID0gYXdhaXQgdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuXG4gICAgY29uc3Qgd2IgPSBuZXcgV29ya2Jvb2soKTtcbiAgICBjb25zdCBzaGVldCA9IFwiaTE4blwiO1xuICAgIHdiLnNldFNoZWV0TmFtZShcIlNoZWV0MVwiLCBzaGVldCk7XG5cbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGAke1NvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJTb25hbXVcIn0gRGljdGlvbmFyeWA7XG4gICAgY29uc3QgaGVhZGVycyA9IFtcImtleVwiLCBcInNvdXJjZVwiLCAuLi5sb2NhbGVzXTtcblxuICAgIC8vIOyKpO2DgOydvCDsoJXsnZhcbiAgICBjb25zdCB0aXRsZVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDIzIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG4gICAgY29uc3QgaGVhZGVyU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyBob3Jpem9udGFsOiBcImNlbnRlclwiLCB2ZXJ0aWNhbDogXCJjZW50ZXJcIiB9LFxuICAgICAgZmlsbDogeyBwYXR0ZXJuOiBcInNvbGlkXCIsIGZnQ29sb3I6IFwiRjFGMUYxXCIgfSxcbiAgICAgIGJvcmRlcjoge1xuICAgICAgICB0b3A6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyB2ZXJ0aWNhbDogXCJjZW50ZXJcIiwgaG9yaXpvbnRhbDogXCJsZWZ0XCIgfSxcbiAgICB9KTtcblxuICAgIC8vIO2WiSAxOiDtlITroZzsoJ3tirjrqoVcbiAgICB3Yi5zZXRDZWxsVmFsdWUoc2hlZXQsIFwiQTFcIiwgcHJvamVjdE5hbWUpO1xuICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgXCJBMVwiLCB0aXRsZVN0eWxlSWQpO1xuICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgMSwgMjgpO1xuXG4gICAgLy8g7ZaJIDI6IOu5iCDtlokgKOq4sOuzuOqwkilcblxuICAgIC8vIO2WiSAzOiDtl6TrjZRcbiAgICB3Yi5zZXRSb3dWYWx1ZXMoc2hlZXQsIDMsIFwiQVwiLCBoZWFkZXJzKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDMsIDI2KTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBoZWFkZXJzLmxlbmd0aDsgY29sKyspIHtcbiAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9M2AsIGhlYWRlclN0eWxlSWQpO1xuICAgIH1cblxuICAgIC8vIO2WiSA0IOydtO2bhDog642w7J207YSwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIGNvbnN0IHJvd051bSA9IGkgKyA0O1xuICAgICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCByb3dOdW0sIFwiQVwiLCB2YWx1ZXMpO1xuICAgICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCByb3dOdW0sIDI0KTtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHZhbHVlcy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9JHtyb3dOdW19YCwgZGF0YVN0eWxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOy7rOufvCDrhIjruYQg6rOE7IKwXG4gICAgY29uc3QgTUFYX1dJRFRIID0gNTA7XG4gICAgY29uc3QgTUlOX1dJRFRIID0gMTA7XG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBudW1iZXJbXSA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IE1hdGgubWF4KGhlYWRlci5sZW5ndGgsIE1JTl9XSURUSCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbiAgICAgICAgY29sdW1uV2lkdGhzW2lkeF0gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW5XaWR0aHNbaWR4XSwgdGV4dExlbmd0aCksIE1BWF9XSURUSCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOyggeyaqVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHVtbldpZHRocy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDb2xXaWR0aChzaGVldCwgY29sTGV0dGVyKGNvbCksIGNvbHVtbldpZHRoc1tjb2xdICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBgJHtwcm9qZWN0TmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfS54bHN4YCxcbiAgICAgIGJ1ZmZlcjogd2Iud3JpdGVCdWZmZXJTeW5jKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOyXkOyEnCDqsIDsoLjsmKTquLBcbiAgICpcbiAgICog7ZiV7IudOlxuICAgKiAtIDHtlok6IO2UhOuhnOygne2KuOuqhVxuICAgKiAtIDLtlok6IOu5iCDtlolcbiAgICogLSAz7ZaJOiDtl6TrjZQgKGtleSwgc291cmNlLCBsb2NhbGVzLi4uKVxuICAgKiAtIDTtlokg7J207ZuEOiDrjbDsnbTthLBcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21FeGNlbChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8SW1wb3J0UmVzdWx0PiB7XG4gICAgY29uc3Qgd2IgPSBXb3JrYm9vay5vcGVuQnVmZmVyU3luYyhidWZmZXIpO1xuICAgIGNvbnN0IHNoZWV0ID0gd2Iuc2hlZXROYW1lc1swXTtcbiAgICBjb25zdCBhbGxSb3dzID0gd2IuZ2V0Um93cyhzaGVldCk7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IHVwZGF0ZWRFbnRpdGllcyA9IDA7XG4gICAgbGV0IHVwZGF0ZWRMb2NhbGVzID0gMDtcblxuICAgIC8vIGxvY2FsZeuzhCBwcm9qZWN0IGRpY3QgZW50cmllc1xuICAgIGNvbnN0IHByb2plY3REaWN0RW50cmllczogUmVjb3JkPHN0cmluZywgRGljdEVudHJ5W10+ID0ge307XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyDtl6TrjZQg7ZaJIOywvuq4sDog7LKrIOuyiOynuCDsu6zrn7woQSnsnbQgXCJrZXlcIuyduCDtlolcbiAgICBsZXQgaGVhZGVyUm93TnVtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2YgYWxsUm93cykge1xuICAgICAgY29uc3QgZmlyc3RDZWxsID0gcm93RGF0YS5jZWxscy5maW5kKChjKSA9PiBjLmNvbHVtbiA9PT0gXCJBXCIpO1xuICAgICAgY29uc3QgZmlyc3RDZWxsVmFsdWUgPSBTdHJpbmcoZmlyc3RDZWxsPy52YWx1ZSA/PyBcIlwiKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZpcnN0Q2VsbFZhbHVlID09PSBcImtleVwiKSB7XG4gICAgICAgIGhlYWRlclJvd051bSA9IHJvd0RhdGEucm93O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyUm93TnVtID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5oZWFkZXJSb3dOb3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WieyXkOyEnCDsu6zrn7wg66ek7ZWRIOq1rOyEsVxuICAgIGNvbnN0IGhlYWRlclJvd0RhdGEgPSBhbGxSb3dzLmZpbmQoKHIpID0+IHIucm93ID09PSBoZWFkZXJSb3dOdW0pO1xuICAgIGNvbnN0IGNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICAgIGlmIChoZWFkZXJSb3dEYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgaGVhZGVyUm93RGF0YS5jZWxscykge1xuICAgICAgICBjb2xUb0hlYWRlci5zZXQoY2VsbC5jb2x1bW4sIFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDrjbDsnbTthLAg7ZaJIOydveq4sCAo7Zek642UIOuLpOydjCDtlonrtoDthLApXG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGlmIChyb3dEYXRhLnJvdyA8PSBoZWFkZXJSb3dOdW0pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByb3dWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3dEYXRhLmNlbGxzKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBjb2xUb0hlYWRlci5nZXQoY2VsbC5jb2x1bW4pO1xuICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJvd1ZhbHVlc1toZWFkZXJOYW1lXSA9IFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHJvd1ZhbHVlcy5rZXk7XG4gICAgICBjb25zdCBzb3VyY2UgPSByb3dWYWx1ZXMuc291cmNlIGFzIFwiZW50aXR5XCIgfCBcInByb2plY3RcIjtcblxuICAgICAgaWYgKCFrZXkgfHwgIXNvdXJjZSkgY29udGludWU7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgLy8gZW50aXR5IHNvdXJjZTogZGVmYXVsdCBsb2NhbGXrp4wgZW50aXR5Lmpzb27sl5Ag7KCA7J6lXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJvd1ZhbHVlc1tkZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZUVudGl0eUJ5S2V5KGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdXBkYXRlZEVudGl0aWVzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9uLWRlZmF1bHQgbG9jYWxl7J2AIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGlmIChsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gXCJwcm9qZWN0XCIpIHtcbiAgICAgICAgLy8gcHJvamVjdCBzb3VyY2U6IOuqqOuToCBsb2NhbGXsnYQgcHJvamVjdCBkaWN07JeQIOyggOyepVxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gcm93VmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlKSB7XG4gICAgICAgICAgICBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgICB1cGRhdGVkTG9jYWxlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXBkYXRlZEVudGl0aWVzLFxuICAgICAgdXBkYXRlZExvY2FsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOyImOyglVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50cnkocGFyYW1zOiB7XG4gICAgb2xkS2V5OiBzdHJpbmc7XG4gICAgbmV3S2V5OiBzdHJpbmc7XG4gICAgc291cmNlOiBcImVudGl0eVwiIHwgXCJwcm9qZWN0XCIgfCBcInNvbmFtdVwiO1xuICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgb2xkS2V5LCBuZXdLZXksIHNvdXJjZSwgdmFsdWVzIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZSDsspjrpqxcbiAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShuZXdLZXksIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSk7XG4gICAgfVxuXG4gICAgLy8gcHJvamVjdCBkaWN0IOyXheuNsOydtO2KuFxuICAgIC8vIC0gZW50aXR57J2YIG5vbi1kZWZhdWx0IGxvY2FsZVxuICAgIC8vIC0gcHJvamVjdCBzb3VyY2XsnZgg66qo65OgIGxvY2FsZVxuICAgIC8vIC0gc29uYW11IHNvdXJjZeydmCDrqqjrk6AgbG9jYWxlIChvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAvLyBlbnRpdHkgc291cmNl7J2YIGRlZmF1bHQgbG9jYWxl7J2AIGVudGl0eS5qc29u7JeQ7IScIOyymOumrO2WiOycvOuvgOuhnCDsiqTtgrVcbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIgJiYgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY2VsbFZhbHVlID0gdmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgIGlmICghY2VsbFZhbHVlKSBjb250aW51ZTtcblxuICAgICAgLy8g6riw7KG0IGRpY3Qg66Gc65OcXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG5cbiAgICAgIC8vIGtleSDrs4Dqsr0g7IucIOq4sOyhtCBrZXkg7KCc6rGwXG4gICAgICBpZiAob2xkS2V5ICE9PSBuZXdLZXkpIHtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG9sZEtleSk7XG4gICAgICAgIGlmIChvbGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7IOIIOqwkiDsl4XrjbDsnbTtirgg65iQ64qUIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0gbmV3S2V5KTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5OiBEaWN0RW50cnkgPSB7XG4gICAgICAgIGtleTogbmV3S2V5LFxuICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllc1tleGlzdGluZ0luZGV4XSA9IG5ld0VudHJ5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cblxuICAgICAgLy8gZGljdCDtjIzsnbwg7KCA7J6lXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7LaU6rCAXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRyeShwYXJhbXM6IHsga2V5OiBzdHJpbmc7IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFrZXk/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5UmVxdWlyZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICAvLyDspJHrs7Ug7YKkIOyytO2BrFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleUFscmVhZHlFeGlzdHNcIikoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6rCBIGxvY2FsZeyXkCDsg4gg7YKkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsgq3soJxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFkZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlOb3RGb3VuZFwiKShrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66+47IKs7JqpIO2CpCDqsoDsgqwgKGFzdC1ncmVwIOyCrOyaqSlcbiAgICovXG4gIGFzeW5jIGNoZWNrVXNhZ2Uoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFVzYWdlUmVzdWx0PiB7XG4gICAgLy8gYXN0LWdyZXAg7ISk7LmYIO2ZleyduFxuICAgIGxldCBzZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIHNnXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIGFzdC1ncmVwXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYXN0LWdyZXAgbm90IGluc3RhbGxlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2dQYXRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjpcbiAgICAgICAgICBcImFzdC1ncmVw7J20IOyEpOy5mOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLiBicmV3IGluc3RhbGwgYXN0LWdyZXAg65iQ64qUIG5wbSBpbnN0YWxsIC1nIEBhc3QtZ3JlcC9jbGnroZwg7ISk7LmY7ZW07KO87IS47JqULlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBbXCJhcGlcIiwgXCJ3ZWJcIiwgXCJhcHBcIl0pIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBlbnRyeSwgXCJzcmNcIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhzcmNQYXRoKSkge1xuICAgICAgICBzZWFyY2hQYXRocy5wdXNoKHNyY1BhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2hQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBcIuqygOyDie2VoCBzcmMg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBhc3QtZ3JlcOycvOuhnCBTRChcIi4uLlwiKSDtjKjthLQg6rKA7IOJXG4gICAgICAvLyDtjKjthLQ6IFNEKFwiS0VZXCIpIOuYkOuKlCBTRCgnS0VZJykg7ZiV7YOcXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IFsnU0QoXCIkS0VZXCIpJywgXCJTRCgnJEtFWScpXCJdO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGAke3NnUGF0aH0gLS1wYXR0ZXJuICcke3BhdHRlcm59JyAtLWpzb24gJHtzZWFyY2hQYXRofWAsIHtcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICAgICAgbWF4QnVmZmVyOiA1MCAqIDEwMjQgKiAxMDI0LCAvLyA1ME1CXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gbWV0YVZhcmlhYmxlcy5zaW5nbGUuS0VZLnRleHTsl5DshJwg7YKkIOy2lOy2nFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVRleHQgPSBtYXRjaC5tZXRhVmFyaWFibGVzPy5zaW5nbGU/LktFWT8udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5VGV4dCkge1xuICAgICAgICAgICAgICAgICAgLy8g65Sw7Ji07ZGcIOygnOqxsFxuICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5LZXkgPSBrZXlUZXh0LnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICB1c2VkS2V5cy5hZGQoY2xlYW5LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Yyo7YS0IOunpOy5mCDsl4bsnLzrqbQg7JeQ65+sICjrrLTsi5wpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGtleXMg7KSR7JeQ7IScIHVzZWRLZXlz7JeQIOyXhuuKlCDqsoPrk6TsnbQg66+47IKs7JqpIO2CpFxuICAgICAgY29uc3QgdW51c2VkS2V5cyA9IGtleXMuZmlsdGVyKChrKSA9PiAhdXNlZEtleXMuaGFzKGspKTtcblxuICAgICAgcmV0dXJuIHsgdW51c2VkS2V5cywgdXNlZEtleXNDb3VudDogdXNlZEtleXMuc2l6ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBg6rKA7IOJIOykkSDsmKTrpZgg67Cc7IOdOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzb25hbXVEaWN0aW9uYXJ5ID0gbmV3IFNvbmFtdURpY3Rpb25hcnkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxTQUFTLFVBQVUsT0FBdUI7Q0FDeEMsSUFBSSxTQUFTO0NBQ2IsSUFBSSxJQUFJO0FBQ1IsUUFBTyxLQUFLLEdBQUc7QUFDYixXQUFTLE9BQU8sYUFBYSxLQUFNLElBQUksR0FBSSxHQUFHO0FBQzlDLE1BQUksS0FBSyxNQUFNLElBQUksR0FBRyxHQUFHOztBQUUzQixRQUFPOzs7O2NBekI4QjtzQkFDa0I7cUJBQ1M7aUJBQ2xCO1VBQ3RCO0NBNEJiLG1CQUFiLE1BQThCOzs7Ozs7Ozs7O0VBVTVCLGNBQWMsVUFBK0I7R0FDM0MsTUFB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
|
|
892
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6WyJlbnRyaWVzOiBEaWN0RW50cnlbXSIsImhlbHBlcnM6IHN0cmluZ1tdIiwibGluZXM6IHN0cmluZ1tdIiwicm93czogRGljdGlvbmFyeVJvd1tdIiwicm93OiBEaWN0aW9uYXJ5Um93Iiwic3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiIsImNvbHVtbldpZHRoczogbnVtYmVyW10iLCJwcm9qZWN0RGljdEVudHJpZXM6IFJlY29yZDxzdHJpbmcsIERpY3RFbnRyeVtdPiIsImNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+Iiwicm93VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IiwibmV3RW50cnk6IERpY3RFbnRyeSIsInNnUGF0aDogc3RyaW5nIHwgbnVsbCIsInNlYXJjaFBhdGhzOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSBcIkBzaGVldGtpdC9ub2RlXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4vc2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGljdEVudHJ5LFxuICB0eXBlIERpY3Rpb25hcnlSZXN1bHQsXG4gIHR5cGUgRGljdGlvbmFyeVJvdyxcbiAgdHlwZSBFbnRpdHlLZXlJbmZvLFxuICB0eXBlIEkxOG5Db25maWcsXG4gIHR5cGUgSW1wb3J0UmVzdWx0LFxuICB0eXBlIFVzYWdlUmVzdWx0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIDAtYmFzZWQg7Lus65+8IOyduOuNseyKpOulvCDsl5HshYAg7Lus65+8IOusuOyekOuhnCDrs4DtmZggKDAgLT4gXCJBXCIsIDI1IC0+IFwiWlwiLCAyNiAtPiBcIkFBXCIpXG4gKi9cbmZ1bmN0aW9uIGNvbExldHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBuID0gaW5kZXg7XG4gIHdoaWxlIChuID49IDApIHtcbiAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgKG4gJSAyNikpICsgcmVzdWx0O1xuICAgIG4gPSBNYXRoLmZsb29yKG4gLyAyNikgLSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg6rSA66asIO2BtOuemOyKpFxuICogaTE4biDrlJXshZTrhIjrpqzsnZggQ1JVRCDrsI8gRXhjZWwgaW1wb3J0L2V4cG9ydOulvCDri7Tri7ntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb25hbXVEaWN0aW9uYXJ5IHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgQ29tcGlsZXIgQVBJ66W8IOyCrOyaqe2VmOyXrCBkaWN0IO2MjOydvCDtjIzsi7FcbiAgICpcbiAgICog7KeA7JuQIO2MqO2EtDpcbiAgICogLSBleHBvcnQgZGVmYXVsdCB7IC4uLiB9IGFzIGNvbnN0O1xuICAgKiAtIGV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7IC4uLiB9KTtcbiAgICogLSDrrLjsnpDsl7Qg6rCSOiBcImtleVwiOiBcInZhbHVlXCIg65iQ64qUIGtleTogYHZhbHVlYFxuICAgKiAtIO2VqOyImCDqsJI6IFwia2V5XCI6IChwYXJhbTogVHlwZSkgPT4gYHRlbXBsYXRlYFxuICAgKi9cbiAgcGFyc2VEaWN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J287JeQ7IScIO2KueyglSDsnbTrpoTsnZggY29uc3Qg7ISg7Ja47J2EIOywvuyVhCBPYmplY3RMaXRlcmFsIO2MjOyLsVxuICAgKiDsmIg6IGNvbnN0IGVudGl0eUxhYmVscyA9IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqL1xuICBwYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oZmlsZVBhdGg6IHN0cmluZywgdmFyTmFtZTogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoZGVjbC5uYW1lKSAmJiBkZWNsLm5hbWUudGV4dCA9PT0gdmFyTmFtZSAmJiBkZWNsLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZGVjbC5pbml0aWFsaXplcik7XG4gICAgICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOusuOyekOyXtOydtCDtmZTsgrTtkZwg7ZWo7IiYIOuYkOuKlCDtlajsiJgg7ZGc7ZiE7Iud7J247KeAIO2MkOuzhFxuICAgKi9cbiAgaXNFeHByZXNzaW9uRnVuY3Rpb24oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8g67mIIOusuOyekOyXtOydtOuCmCDqs7XrsLHrp4wg7J6I64qUIOqyveyasFxuICAgIGlmICghY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBBUlJPV19GVU5DVElPTl9QQVRURVJOID0gL15cXHMqXFwoW14pXSpcXClcXHMqPT4vO1xuXG4gICAgcmV0dXJuIEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4udGVzdChjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHBvcnQgZGVmYXVsdCDtkZztmITsi53sl5DshJwgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24g7LaU7LacXG4gICAqIC0gYXMgY29uc3Qg7LKY66asXG4gICAqIC0gZGVmaW5lTG9jYWxlKHsgLi4uIH0pIO2YuOy2nCDsspjrpqxcbiAgICovXG4gIHByaXZhdGUgdW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHI6IHRzLkV4cHJlc3Npb24pOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IG51bGwge1xuICAgIC8vIGFzIGNvbnN0IOyymOumrFxuICAgIGlmICh0cy5pc0FzRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIHRoaXMudW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHIuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIC8vIOyngeygkSDqsJ3ssrQg66as7YSw65+0XG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICAvLyBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacXG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJnID0gZXhwci5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbuyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChcbiAgICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZXh0cmFjdERpY3RFbnRyeShwcm9wLCBzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eU5hbWXsl5DshJwg7YKkIOusuOyekOyXtCDstpTstpxcbiAgICogLSDrrLjsnpDsl7Qg66as7YSw65+0OiBcImtleVwiXG4gICAqIC0g7Iud67OE7J6QOiBrZXkgKHVucXVvdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUtleShuYW1lOiB0cy5Qcm9wZXJ0eU5hbWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZztjbzti7Dsl5DshJwgRGljdEVudHJ5IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtDog7Iuk7KCcIOusuOyekOyXtCDqsJJcbiAgICogLSDtlajsiJg6IOybkOuzuCDshozsiqQgKOyXrOufrCDspITsnYAg7ZWcIOykhOuhnCDsoJXqt5ztmZQpXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3REaWN0RW50cnkoXG4gICAgcHJvcDogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICk6IERpY3RFbnRyeSB8IG51bGwge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJvcGVydHlLZXkocHJvcC5uYW1lKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBpbml0ID0gcHJvcC5pbml0aWFsaXplcjtcblxuICAgIC8vIO2ZlOyCtO2RnCDtlajsiJhcbiAgICBpZiAodHMuaXNBcnJvd0Z1bmN0aW9uKGluaXQpKSB7XG4gICAgICBjb25zdCBmdW5jVGV4dCA9IGluaXQuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmdW5jVGV4dC5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9ybWFsaXplZCwgaXNGdW5jdGlvbjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g7YWc7ZSM66a/IOumrO2EsOuftCAo67OA7IiYIOyXhuydjClcbiAgICBpZiAodHMuaXNOb1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbChpbml0KSkge1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogaW5pdC50ZXh0LCBpc0Z1bmN0aW9uOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIOq4sO2DgCAo7JiIOiDtlajsiJgg7ZGc7ZiE7IudKVxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpLFxuICAgICAgaXNGdW5jdGlvbjogdHMuaXNGdW5jdGlvbkV4cHJlc3Npb24oaW5pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZzsoJ3tirjsnZggaTE4biBkaWN0IO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0g7YOA6rKfIOuUlOugie2GoOumrCAoYXBpLCB3ZWIsIGFwcClcbiAgICovXG4gIGdldFByb2plY3REaWN0UGF0aChsb2NhbGU6IHN0cmluZywgdGFyZ2V0OiBcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIgPSBcImFwaVwiKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIGRpciwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUg64K07J6lIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFNvbmFtdURpY3RQYXRoKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIik7XG4gICAgcmV0dXJuIHBhdGguam9pbihwYWNrYWdlUm9vdCwgXCJzcmNcIiwgXCJkaWN0XCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTsmpTtlZwgZGljdCDtgqTqsIAg7ZSE66Gc7KCd7Yq47JeQIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlZjqs6AsIOyXhuycvOuptCDstpTqsIDtlanri4jri6QuXG4gICAqIGRlZmF1bHRMb2NhbGXsl5Drp4wg7LaU6rCA7ZWY66mwLCDri6TrpbggbG9jYWxl7J2AIOyCrOyaqeyekOqwgCDsp4HsoJEg67KI7Jet7ZW07JW8IO2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVpcmVkS2V5cyAtIO2VhOyalO2VnCDtgqQg66qp66GdXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKiBAcmV0dXJucyDstpTqsIDrkJwg7YKkIOuqqeuhnVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRGljdEtleXMoXG4gICAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXSxcbiAgICB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IFNvbmFtdS5jb25maWcuaTE4bjtcbiAgICBjb25zdCBwcm9qZWN0RGljdFBhdGggPSB0aGlzLmdldFByb2plY3REaWN0UGF0aChkZWZhdWx0TG9jYWxlLCB0YXJnZXQpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287J20IOyXhuycvOuptCDslYTrrLTqsoPrj4Qg7ZWY7KeAIOyViuydjFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9qZWN0RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Tsl5DshJwg6riw7KG0IO2CpCDtjIzsi7FcbiAgICBjb25zdCBwcm9qZWN0RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShwcm9qZWN0RGljdFBhdGgpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQocHJvamVjdEVudHJpZXMubWFwKChlKSA9PiBlLmtleSkpO1xuXG4gICAgLy8g64iE652965CcIO2CpCDssL7quLBcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWV4aXN0aW5nS2V5cy5oYXMoa2V5KSk7XG5cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gc29uYW11IGRpY3Tsl5DshJwg6riw67O46rCSIOqwgOyguOyYpOq4sFxuICAgIGNvbnN0IHNvbmFtdURpY3RQYXRoID0gdGhpcy5nZXRTb25hbXVEaWN0UGF0aChkZWZhdWx0TG9jYWxlKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc29uYW11RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYW11RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShzb25hbXVEaWN0UGF0aCk7XG4gICAgY29uc3Qgc29uYW11RGljdCA9IG5ldyBNYXAoc29uYW11RW50cmllcy5tYXAoKGUpID0+IFtlLmtleSwgZV0pKTtcblxuICAgIC8vIOy2lOqwgO2VoCDsl5Ttirjrpqwg7IOd7ISxXG4gICAgY29uc3QgZW50cmllc1RvQWRkID0gbWlzc2luZ0tleXNcbiAgICAgIC5tYXAoKGtleSkgPT4gc29uYW11RGljdC5nZXQoa2V5KSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgTm9uTnVsbGFibGU8dHlwZW9mIGVudHJ5PiA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGlmIChlbnRyaWVzVG9BZGQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287JeQIOy2lOqwgFxuICAgIGF3YWl0IHRoaXMuYXBwZW5kRW50cmllc1RvRGljdEZpbGUocHJvamVjdERpY3RQYXRoLCBlbnRyaWVzVG9BZGQsIGRlZmF1bHRMb2NhbGUsIHRydWUpO1xuXG4gICAgcmV0dXJuIGVudHJpZXNUb0FkZC5tYXAoKGUpID0+IGUua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOyXkCDsl5Ttirjrpqzrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgKiDquLDsobQg7YyM7J287J2EIO2MjOyLse2VmOqzoCwg7IOIIOyXlO2KuOumrOulvCDstpTqsIDtlZwg65KkLCDsoITssrQg7YyM7J287J2EIOyerOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kRW50cmllc1RvRGljdEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOq4sOyhtCBlbnRyaWVzIO2MjOyLsVxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShmaWxlUGF0aCk7XG5cbiAgICAvLyDsg4ggZW50cmllcyDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbwg7J6s7IOd7ISxXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGV4aXN0aW5nRW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIFwidHlwZXNjcmlwdFwiLCBmaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImCDqsJLrk6Tsl5DshJwg7IKs7Jqp65CY64qUIO2XrO2NvCDtlajsiJjrpbwg6rCQ7KeA7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVc2VkSGVscGVycyhlbnRyaWVzOiBEaWN0RW50cnlbXSk6IHtcbiAgICBoZWxwZXJzOiBzdHJpbmdbXTtcbiAgICB1c2VzRm9ybWF0OiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBmdW5jdGlvbkVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5pc0Z1bmN0aW9uKTtcbiAgICBjb25zdCBoZWxwZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBoZWxwZXIgb2YgW1wicGx1cmFsXCIsIFwiam9zYVwiXSkge1xuICAgICAgLy8g7ZWo7IiY66qF7J20IOuLqOyWtCDqsr3qs4TroZwg7IKs7Jqp65CY64qU7KeAIO2ZleyduCAo7JiIOiBwbHVyYWwoIOuYkOuKlCBwbHVyYWwsKVxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYFxcXFxiJHtoZWxwZXJ9XFxcXHMqXFxcXChgKTtcbiAgICAgIGlmIChmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gcGF0dGVybi50ZXN0KGUudmFsdWUpKSkge1xuICAgICAgICBoZWxwZXJzLnB1c2goaGVscGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXQg7IKs7JqpIOyXrOu2gCDrs4Trj4Qg6rCQ7KeAIChmb3JtYXQubnVtYmVyKC4uLiksIGZvcm1hdC5kYXRlKC4uLikg65OxKVxuICAgIGNvbnN0IGZvcm1hdFBhdHRlcm4gPSAvXFxiZm9ybWF0XFwuXFx3K1xccypcXCgvO1xuICAgIGNvbnN0IHVzZXNGb3JtYXQgPSBmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gZm9ybWF0UGF0dGVybi50ZXN0KGUudmFsdWUpKTtcblxuICAgIHJldHVybiB7IGhlbHBlcnMsIHVzZXNGb3JtYXQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgKi9cbiAgZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZywgZW50cmllczogRGljdEVudHJ5W10sIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8ga2V5IOyVjO2MjOuysyDsiJwg7KCV66CsXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnRvU29ydGVkKChhLCBiKSA9PiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIO2VqOyImCDqsJLsl5DshJwg7IKs7Jqp65CY64qUIO2XrO2NvCDtlajsiJgg6rCQ7KeAXG4gICAgY29uc3QgeyBoZWxwZXJzLCB1c2VzRm9ybWF0IH0gPSB0aGlzLmRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXMpO1xuXG4gICAgLy8g7Zes7Y28IO2VqOyImCBpbXBvcnQg7LaU6rCAXG4gICAgY29uc3QgaW1wb3J0cyA9IFsuLi5oZWxwZXJzXTtcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgaW1wb3J0cy5wdXNoKFwiY3JlYXRlRm9ybWF0XCIpO1xuICAgIH1cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGBpbXBvcnQgeyAke2ltcG9ydHMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJzb25hbXUvZGljdFwiO2ApO1xuICAgIH1cblxuICAgIGlmICghaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKCdpbXBvcnQgeyBkZWZpbmVMb2NhbGUgfSBmcm9tIFwiLi9zZC5nZW5lcmF0ZWRcIjsnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwIHx8ICFpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsi5wgY3JlYXRlRm9ybWF0IO2YuOy2nCDstpTqsIBcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgbGluZXMucHVzaChgY29uc3QgZm9ybWF0ID0gY3JlYXRlRm9ybWF0KFwiJHtsb2NhbGV9XCIpO2ApO1xuICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKFwiLyoqXCIpO1xuICAgIGxpbmVzLnB1c2goYCAqIFByb2plY3QgJHtsb2NhbGUudG9VcHBlckNhc2UoKX0gRGljdGlvbmFyeWApO1xuICAgIGxpbmVzLnB1c2goXCIgKi9cIik7XG5cbiAgICBpZiAoaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiZXhwb3J0IGRlZmF1bHQge1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7XCIpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgICBpZiAoZW50cnkuaXNGdW5jdGlvbikge1xuICAgICAgICAvLyDtlajsiJjsnbgg6rK97JqwOiDsm5DtmJUg6re464yA66GcIOy2nOugpVxuICAgICAgICBsaW5lcy5wdXNoKGAgIFwiJHtlbnRyeS5rZXl9XCI6ICR7ZW50cnkudmFsdWV9LGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke0pTT04uc3RyaW5naWZ5KGVudHJ5LnZhbHVlKX0sYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcIn0gYXMgY29uc3Q7XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKFwifSk7XCIpO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKFwiXCIpO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogaTE4biDshKTsoJXsnYQg6rCA7KC47Ji164uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJMThuQ29uZmlnKCk6IEkxOG5Db25maWcge1xuICAgIHJldHVybiBTb25hbXUuY29uZmlnLmkxOG47XG4gIH1cblxuICAvKipcbiAgICogaTE4biDrlJTroInthqDrpqwg6rK966Gc66W8IOuwmO2ZmO2VmOqzoCwg7JeG7Jy866m0IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlSTE4bkRpcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGkxOG5EaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGkxOG5EaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoaTE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBpMThuRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287J2EIOyggOyepe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZURpY3RGaWxlKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaTE4bkRpciA9IHRoaXMuZW5zdXJlSTE4bkRpcigpO1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKGkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIFwidHlwZXNjcmlwdFwiLCBkaWN0UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkaWN0UGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4ga2V566W8IO2MjOyLse2VmOyXrCBlbnRpdHkg6rSA66CoIOygleuztCDstpTstpxcbiAgICovXG4gIHBhcnNlRW50aXR5S2V5KGtleTogc3RyaW5nKTogRW50aXR5S2V5SW5mbyB7XG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0gKGxpc3QsIGNyZWF0ZSwgZWRpdCDsoJzsmbgpXG4gICAgY29uc3QgZW50aXR5VGl0bGVNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKikkLyk7XG4gICAgaWYgKFxuICAgICAgZW50aXR5VGl0bGVNYXRjaCAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5saXN0XCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmNyZWF0ZVwiKSAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5lZGl0XCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudGl0eVRpdGxlXCIsIGVudGl0eUlkOiBlbnRpdHlUaXRsZU1hdGNoWzFdIH07XG4gICAgfVxuXG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0ue3Byb3BOYW1lfVxuICAgIGNvbnN0IHByb3BEZXNjTWF0Y2ggPSBrZXkubWF0Y2goL15lbnRpdHlcXC4oW0EtWl1bYS16QS1aMC05XSopXFwuKFthLXpfXVthLXowLTlfXSopJC8pO1xuICAgIGlmIChwcm9wRGVzY01hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInByb3BEZXNjXCIsIGVudGl0eUlkOiBwcm9wRGVzY01hdGNoWzFdLCBwcm9wTmFtZTogcHJvcERlc2NNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIC8vIGVudW0ue0VudW1JZH0ue3ZhbHVlfVxuICAgIGNvbnN0IGVudW1MYWJlbE1hdGNoID0ga2V5Lm1hdGNoKC9eZW51bVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oLispJC8pO1xuICAgIGlmIChlbnVtTGFiZWxNYXRjaCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtTGFiZWxcIiwgZW51bUlkOiBlbnVtTGFiZWxNYXRjaFsxXSwgZW51bVZhbHVlOiBlbnVtTGFiZWxNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eSBrZXnsl5Ag64yA7ZW0IGVudGl0eS5qc29uIOyXheuNsOydtO2KuCDsiJjtlolcbiAgICogQHJldHVybnMg7JeF642w7J207Yq4IOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50aXR5QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXlJbmZvID0gdGhpcy5wYXJzZUVudGl0eUtleShrZXkpO1xuXG4gICAgc3dpdGNoIChrZXlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbnRpdHlUaXRsZVwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoa2V5SW5mby5lbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS50aXRsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS50aXRsZSA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZW50aXR5IG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb3BEZXNjXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBwcm9wSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IGtleUluZm8ucHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wSW5kZXggIT09IC0xICYmIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbnRpdHkucHJvcHNbcHJvcEluZGV4XS5kZXNjID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZW51bUxhYmVsXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF0pIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKC5saXN0LCAuY3JlYXRlLCAuZWRpdCDsoJzsmbgpXG4gICAqL1xuICBleHRyYWN0RW50aXR5TGFiZWxzKCk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oc2RQYXRoLCBcImVudGl0eUxhYmVsc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgcmMta2V5cyDstpTstpxcbiAgICogcmVhY3QtY29tcG9uZW50c+yXkOyEnCDqtIDrpqzrkJjripQgaTE4biDtgqTrk6RcbiAgICogQHBhcmFtIGxvY2FsZSAtIOuhnOy8gOydvCAoa28sIGVuIOuTsSlcbiAgICovXG4gIGV4dHJhY3RSQ0tleXMobG9jYWxlOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3Qgc2RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIFwic2QuZ2VuZXJhdGVkLnRzXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzZFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gbG9jYWxl67OEIOuzgOyImOuqhSDrp6TtlZEgKHNkLnRlbXBsYXRlLnRz7J2YIGdldFJDS2V5c1Zhck5hbWXqs7wg64+Z7J28KVxuICAgIGNvbnN0IHZhck5hbWUgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiKSByZXR1cm4gXCJyY0tleXNLb1wiO1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJlblwiKSByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgICAgLy8g64uk66W4IGxvY2FsZeydgCBlbuydhCBmYWxsYmFja+ycvOuhnCDsgqzsmqlcbiAgICAgIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIHZhck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZGljdCDtjIzsnbwoW2xvY2FsZV0udHMp7JeQ7IScIOuUleyFlOuEiOumrCDroZzrk5xcbiAgICovXG4gIGxvYWRQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZyk6IHsgZW50cmllczogRGljdEVudHJ5W10gfSB7XG4gICAgY29uc3QgZGljdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXM6IHRoaXMucGFyc2VEaWN0RmlsZShkaWN0UGF0aCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg642w7J207YSwIOyImOynkSAoc29uYW11ICsgZW50aXR5ICsgcHJvamVjdClcbiAgICovXG4gIGFzeW5jIGNvbGxlY3REaWN0aW9uYXJ5KCk6IFByb21pc2U8RGljdGlvbmFyeVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICBjb25zdCByb3dzOiBEaWN0aW9uYXJ5Um93W10gPSBbXTtcbiAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPHN0cmluZywgRGljdGlvbmFyeVJvdz4oKTtcblxuICAgIC8vIDEuIFJDIEtleXMgKHNvbmFtdSBzb3VyY2UsIOqwgSBsb2NhbGXrs4QpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgcmNLZXlzID0gdGhpcy5leHRyYWN0UkNLZXlzKGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IHJjS2V5IG9mIHJjS2V5cykge1xuICAgICAgICBsZXQgcm93ID0gcm93TWFwLmdldChyY0tleS5rZXkpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIGtleTogcmNLZXkua2V5LFxuICAgICAgICAgICAgc291cmNlOiBcInNvbmFtdVwiLFxuICAgICAgICAgICAgaXNGdW5jdGlvbjogcmNLZXkuaXNGdW5jdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJvd01hcC5zZXQocmNLZXkua2V5LCByb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd1tsb2NhbGVdID0gcmNLZXkudmFsdWU7XG4gICAgICAgIGlmIChyY0tleS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgcm93LmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRW50aXR5IGxhYmVscyAoZGVmYXVsdCBsb2NhbGUg6riw7KSAKVxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgZW50aXR5TGFiZWxzKSB7XG4gICAgICBjb25zdCByb3c6IERpY3Rpb25hcnlSb3cgPSB7XG4gICAgICAgIGtleTogbGFiZWwua2V5LFxuICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIsXG4gICAgICAgIGlzRnVuY3Rpb246IGxhYmVsLmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIFtkZWZhdWx0TG9jYWxlXTogbGFiZWwudmFsdWUsXG4gICAgICB9O1xuICAgICAgcm93TWFwLnNldChsYWJlbC5rZXksIHJvdyk7XG4gICAgfVxuXG4gICAgLy8gMy4gUHJvamVjdCBkaWN0ICjqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgLy8gc29uYW11LCBlbnRpdHkgc291cmNl6rCAIOyeiOycvOuptCDtlbTri7kgbG9jYWxlIOqwkuunjCDstpTqsIBcbiAgICAgICAgICBleGlzdGluZ1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcm9qZWN0IHNvdXJjZeuhnCDsg4jroZwg7LaU6rCAXG4gICAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgICBrZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICAgICAgc291cmNlOiBcInByb2plY3RcIixcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZW50cnkuaXNGdW5jdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByb3dNYXAuc2V0KGVudHJ5LmtleSwgcm93KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93W2xvY2FsZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MucHVzaCguLi5yb3dNYXAudmFsdWVzKCkpO1xuICAgIHJvd3Muc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgLy8g7Ya16rOEIOqzhOyCsDogbG9jYWxl67OEICjssYTsm4zsp4Qg6rCSIC8g7KCE7LK0IO2CpCDsiJgpXG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiA9IHt9O1xuICAgIGNvbnN0IHRvdGFsID0gcm93cy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgZmlsbGVkID0gcm93cy5maWx0ZXIoKHJvdykgPT4gISFyb3dbbG9jYWxlXSkubGVuZ3RoO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGZpbGxlZCAvIHRvdGFsKSAqIDEwMCkgOiAwO1xuICAgICAgc3RhdHNbbG9jYWxlXSA9IHsgdG90YWwsIGZpbGxlZCwgcGVyY2VudCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHJvd3MsIGxvY2FsZXMsIGRlZmF1bHRMb2NhbGUsIHN0YXRzIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2Vs66GcIOuCtOuztOuCtOq4sFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCgpOiBQcm9taXNlPHsgZmlsZW5hbWU6IHN0cmluZzsgYnVmZmVyOiBCdWZmZXIgfT4ge1xuICAgIGNvbnN0IHsgcm93cywgbG9jYWxlcyB9ID0gYXdhaXQgdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuXG4gICAgY29uc3Qgd2IgPSBuZXcgV29ya2Jvb2soKTtcbiAgICBjb25zdCBzaGVldCA9IFwiaTE4blwiO1xuICAgIHdiLnNldFNoZWV0TmFtZShcIlNoZWV0MVwiLCBzaGVldCk7XG5cbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGAke1NvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJTb25hbXVcIn0gRGljdGlvbmFyeWA7XG4gICAgY29uc3QgaGVhZGVycyA9IFtcImtleVwiLCBcInNvdXJjZVwiLCAuLi5sb2NhbGVzXTtcblxuICAgIC8vIOyKpO2DgOydvCDsoJXsnZhcbiAgICBjb25zdCB0aXRsZVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDIzIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG4gICAgY29uc3QgaGVhZGVyU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyBob3Jpem9udGFsOiBcImNlbnRlclwiLCB2ZXJ0aWNhbDogXCJjZW50ZXJcIiB9LFxuICAgICAgZmlsbDogeyBwYXR0ZXJuOiBcInNvbGlkXCIsIGZnQ29sb3I6IFwiRjFGMUYxXCIgfSxcbiAgICAgIGJvcmRlcjoge1xuICAgICAgICB0b3A6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyB2ZXJ0aWNhbDogXCJjZW50ZXJcIiwgaG9yaXpvbnRhbDogXCJsZWZ0XCIgfSxcbiAgICB9KTtcblxuICAgIC8vIO2WiSAxOiDtlITroZzsoJ3tirjrqoVcbiAgICB3Yi5zZXRDZWxsVmFsdWUoc2hlZXQsIFwiQTFcIiwgcHJvamVjdE5hbWUpO1xuICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgXCJBMVwiLCB0aXRsZVN0eWxlSWQpO1xuICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgMSwgMjgpO1xuXG4gICAgLy8g7ZaJIDI6IOu5iCDtlokgKOq4sOuzuOqwkilcblxuICAgIC8vIO2WiSAzOiDtl6TrjZRcbiAgICB3Yi5zZXRSb3dWYWx1ZXMoc2hlZXQsIDMsIFwiQVwiLCBoZWFkZXJzKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDMsIDI2KTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBoZWFkZXJzLmxlbmd0aDsgY29sKyspIHtcbiAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9M2AsIGhlYWRlclN0eWxlSWQpO1xuICAgIH1cblxuICAgIC8vIO2WiSA0IOydtO2bhDog642w7J207YSwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIGNvbnN0IHJvd051bSA9IGkgKyA0O1xuICAgICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCByb3dOdW0sIFwiQVwiLCB2YWx1ZXMpO1xuICAgICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCByb3dOdW0sIDI0KTtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHZhbHVlcy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9JHtyb3dOdW19YCwgZGF0YVN0eWxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOy7rOufvCDrhIjruYQg6rOE7IKwXG4gICAgY29uc3QgTUFYX1dJRFRIID0gNTA7XG4gICAgY29uc3QgTUlOX1dJRFRIID0gMTA7XG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBudW1iZXJbXSA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IE1hdGgubWF4KGhlYWRlci5sZW5ndGgsIE1JTl9XSURUSCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbiAgICAgICAgY29sdW1uV2lkdGhzW2lkeF0gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW5XaWR0aHNbaWR4XSwgdGV4dExlbmd0aCksIE1BWF9XSURUSCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOyggeyaqVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHVtbldpZHRocy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDb2xXaWR0aChzaGVldCwgY29sTGV0dGVyKGNvbCksIGNvbHVtbldpZHRoc1tjb2xdICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBgJHtwcm9qZWN0TmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfS54bHN4YCxcbiAgICAgIGJ1ZmZlcjogd2Iud3JpdGVCdWZmZXJTeW5jKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOyXkOyEnCDqsIDsoLjsmKTquLBcbiAgICpcbiAgICog7ZiV7IudOlxuICAgKiAtIDHtlok6IO2UhOuhnOygne2KuOuqhVxuICAgKiAtIDLtlok6IOu5iCDtlolcbiAgICogLSAz7ZaJOiDtl6TrjZQgKGtleSwgc291cmNlLCBsb2NhbGVzLi4uKVxuICAgKiAtIDTtlokg7J207ZuEOiDrjbDsnbTthLBcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21FeGNlbChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8SW1wb3J0UmVzdWx0PiB7XG4gICAgY29uc3Qgd2IgPSBXb3JrYm9vay5vcGVuQnVmZmVyU3luYyhidWZmZXIpO1xuICAgIGNvbnN0IHNoZWV0ID0gd2Iuc2hlZXROYW1lc1swXTtcbiAgICBjb25zdCBhbGxSb3dzID0gd2IuZ2V0Um93cyhzaGVldCk7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IHVwZGF0ZWRFbnRpdGllcyA9IDA7XG4gICAgbGV0IHVwZGF0ZWRMb2NhbGVzID0gMDtcblxuICAgIC8vIGxvY2FsZeuzhCBwcm9qZWN0IGRpY3QgZW50cmllc1xuICAgIGNvbnN0IHByb2plY3REaWN0RW50cmllczogUmVjb3JkPHN0cmluZywgRGljdEVudHJ5W10+ID0ge307XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyDtl6TrjZQg7ZaJIOywvuq4sDog7LKrIOuyiOynuCDsu6zrn7woQSnsnbQgXCJrZXlcIuyduCDtlolcbiAgICBsZXQgaGVhZGVyUm93TnVtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2YgYWxsUm93cykge1xuICAgICAgY29uc3QgZmlyc3RDZWxsID0gcm93RGF0YS5jZWxscy5maW5kKChjKSA9PiBjLmNvbHVtbiA9PT0gXCJBXCIpO1xuICAgICAgY29uc3QgZmlyc3RDZWxsVmFsdWUgPSBTdHJpbmcoZmlyc3RDZWxsPy52YWx1ZSA/PyBcIlwiKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZpcnN0Q2VsbFZhbHVlID09PSBcImtleVwiKSB7XG4gICAgICAgIGhlYWRlclJvd051bSA9IHJvd0RhdGEucm93O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyUm93TnVtID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5oZWFkZXJSb3dOb3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WieyXkOyEnCDsu6zrn7wg66ek7ZWRIOq1rOyEsVxuICAgIGNvbnN0IGhlYWRlclJvd0RhdGEgPSBhbGxSb3dzLmZpbmQoKHIpID0+IHIucm93ID09PSBoZWFkZXJSb3dOdW0pO1xuICAgIGNvbnN0IGNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICAgIGlmIChoZWFkZXJSb3dEYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgaGVhZGVyUm93RGF0YS5jZWxscykge1xuICAgICAgICBjb2xUb0hlYWRlci5zZXQoY2VsbC5jb2x1bW4sIFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDrjbDsnbTthLAg7ZaJIOydveq4sCAo7Zek642UIOuLpOydjCDtlonrtoDthLApXG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGlmIChyb3dEYXRhLnJvdyA8PSBoZWFkZXJSb3dOdW0pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByb3dWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3dEYXRhLmNlbGxzKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBjb2xUb0hlYWRlci5nZXQoY2VsbC5jb2x1bW4pO1xuICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJvd1ZhbHVlc1toZWFkZXJOYW1lXSA9IFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHJvd1ZhbHVlcy5rZXk7XG4gICAgICBjb25zdCBzb3VyY2UgPSByb3dWYWx1ZXMuc291cmNlIGFzIFwiZW50aXR5XCIgfCBcInByb2plY3RcIjtcblxuICAgICAgaWYgKCFrZXkgfHwgIXNvdXJjZSkgY29udGludWU7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgLy8gZW50aXR5IHNvdXJjZTogZGVmYXVsdCBsb2NhbGXrp4wgZW50aXR5Lmpzb27sl5Ag7KCA7J6lXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJvd1ZhbHVlc1tkZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZUVudGl0eUJ5S2V5KGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdXBkYXRlZEVudGl0aWVzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9uLWRlZmF1bHQgbG9jYWxl7J2AIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGlmIChsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gXCJwcm9qZWN0XCIpIHtcbiAgICAgICAgLy8gcHJvamVjdCBzb3VyY2U6IOuqqOuToCBsb2NhbGXsnYQgcHJvamVjdCBkaWN07JeQIOyggOyepVxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gcm93VmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlKSB7XG4gICAgICAgICAgICBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgICB1cGRhdGVkTG9jYWxlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXBkYXRlZEVudGl0aWVzLFxuICAgICAgdXBkYXRlZExvY2FsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOyImOyglVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50cnkocGFyYW1zOiB7XG4gICAgb2xkS2V5OiBzdHJpbmc7XG4gICAgbmV3S2V5OiBzdHJpbmc7XG4gICAgc291cmNlOiBcImVudGl0eVwiIHwgXCJwcm9qZWN0XCIgfCBcInNvbmFtdVwiO1xuICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgb2xkS2V5LCBuZXdLZXksIHNvdXJjZSwgdmFsdWVzIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZSDsspjrpqxcbiAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShuZXdLZXksIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSk7XG4gICAgfVxuXG4gICAgLy8gcHJvamVjdCBkaWN0IOyXheuNsOydtO2KuFxuICAgIC8vIC0gZW50aXR57J2YIG5vbi1kZWZhdWx0IGxvY2FsZVxuICAgIC8vIC0gcHJvamVjdCBzb3VyY2XsnZgg66qo65OgIGxvY2FsZVxuICAgIC8vIC0gc29uYW11IHNvdXJjZeydmCDrqqjrk6AgbG9jYWxlIChvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAvLyBlbnRpdHkgc291cmNl7J2YIGRlZmF1bHQgbG9jYWxl7J2AIGVudGl0eS5qc29u7JeQ7IScIOyymOumrO2WiOycvOuvgOuhnCDsiqTtgrVcbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIgJiYgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY2VsbFZhbHVlID0gdmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgIGlmICghY2VsbFZhbHVlKSBjb250aW51ZTtcblxuICAgICAgLy8g6riw7KG0IGRpY3Qg66Gc65OcXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG5cbiAgICAgIC8vIGtleSDrs4Dqsr0g7IucIOq4sOyhtCBrZXkg7KCc6rGwXG4gICAgICBpZiAob2xkS2V5ICE9PSBuZXdLZXkpIHtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG9sZEtleSk7XG4gICAgICAgIGlmIChvbGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7IOIIOqwkiDsl4XrjbDsnbTtirgg65iQ64qUIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0gbmV3S2V5KTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5OiBEaWN0RW50cnkgPSB7XG4gICAgICAgIGtleTogbmV3S2V5LFxuICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllc1tleGlzdGluZ0luZGV4XSA9IG5ld0VudHJ5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cblxuICAgICAgLy8gZGljdCDtjIzsnbwg7KCA7J6lXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7LaU6rCAXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRyeShwYXJhbXM6IHsga2V5OiBzdHJpbmc7IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFrZXk/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5UmVxdWlyZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICAvLyDspJHrs7Ug7YKkIOyytO2BrFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleUFscmVhZHlFeGlzdHNcIikoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6rCBIGxvY2FsZeyXkCDsg4gg7YKkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsgq3soJxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFkZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlOb3RGb3VuZFwiKShrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66+47IKs7JqpIO2CpCDqsoDsgqwgKGFzdC1ncmVwIOyCrOyaqSlcbiAgICovXG4gIGFzeW5jIGNoZWNrVXNhZ2Uoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFVzYWdlUmVzdWx0PiB7XG4gICAgLy8gYXN0LWdyZXAg7ISk7LmYIO2ZleyduFxuICAgIGxldCBzZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIHNnXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIGFzdC1ncmVwXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYXN0LWdyZXAgbm90IGluc3RhbGxlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2dQYXRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjpcbiAgICAgICAgICBcImFzdC1ncmVw7J20IOyEpOy5mOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLiBicmV3IGluc3RhbGwgYXN0LWdyZXAg65iQ64qUIG5wbSBpbnN0YWxsIC1nIEBhc3QtZ3JlcC9jbGnroZwg7ISk7LmY7ZW07KO87IS47JqULlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBbXCJhcGlcIiwgXCJ3ZWJcIiwgXCJhcHBcIl0pIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBlbnRyeSwgXCJzcmNcIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhzcmNQYXRoKSkge1xuICAgICAgICBzZWFyY2hQYXRocy5wdXNoKHNyY1BhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2hQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBcIuqygOyDie2VoCBzcmMg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBhc3QtZ3JlcOycvOuhnCBTRChcIi4uLlwiKSDtjKjthLQg6rKA7IOJXG4gICAgICAvLyDtjKjthLQ6IFNEKFwiS0VZXCIpIOuYkOuKlCBTRCgnS0VZJykg7ZiV7YOcXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IFsnU0QoXCIkS0VZXCIpJywgXCJTRCgnJEtFWScpXCJdO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGAke3NnUGF0aH0gLS1wYXR0ZXJuICcke3BhdHRlcm59JyAtLWpzb24gJHtzZWFyY2hQYXRofWAsIHtcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICAgICAgbWF4QnVmZmVyOiA1MCAqIDEwMjQgKiAxMDI0LCAvLyA1ME1CXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gbWV0YVZhcmlhYmxlcy5zaW5nbGUuS0VZLnRleHTsl5DshJwg7YKkIOy2lOy2nFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVRleHQgPSBtYXRjaC5tZXRhVmFyaWFibGVzPy5zaW5nbGU/LktFWT8udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5VGV4dCkge1xuICAgICAgICAgICAgICAgICAgLy8g65Sw7Ji07ZGcIOygnOqxsFxuICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5LZXkgPSBrZXlUZXh0LnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICB1c2VkS2V5cy5hZGQoY2xlYW5LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Yyo7YS0IOunpOy5mCDsl4bsnLzrqbQg7JeQ65+sICjrrLTsi5wpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGtleXMg7KSR7JeQ7IScIHVzZWRLZXlz7JeQIOyXhuuKlCDqsoPrk6TsnbQg66+47IKs7JqpIO2CpFxuICAgICAgY29uc3QgdW51c2VkS2V5cyA9IGtleXMuZmlsdGVyKChrKSA9PiAhdXNlZEtleXMuaGFzKGspKTtcblxuICAgICAgcmV0dXJuIHsgdW51c2VkS2V5cywgdXNlZEtleXNDb3VudDogdXNlZEtleXMuc2l6ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBg6rKA7IOJIOykkSDsmKTrpZgg67Cc7IOdOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzb25hbXVEaWN0aW9uYXJ5ID0gbmV3IFNvbmFtdURpY3Rpb25hcnkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxTQUFTLFVBQVUsT0FBdUI7Q0FDeEMsSUFBSSxTQUFTO0NBQ2IsSUFBSSxJQUFJO0FBQ1IsUUFBTyxLQUFLLEdBQUc7QUFDYixXQUFTLE9BQU8sYUFBYSxLQUFNLElBQUksR0FBSSxHQUFHO0FBQzlDLE1BQUksS0FBSyxNQUFNLElBQUksR0FBRyxHQUFHOztBQUUzQixRQUFPOzs7O2NBekI4QjtzQkFDa0I7cUJBQ1M7aUJBQ2xCO1VBQ3RCO0NBNEJiLG1CQUFiLE1BQThCOzs7Ozs7Ozs7O0VBVTVCLGNBQWMsVUFBK0I7R0FDM0MsTUFBTSxVQUFVLEdBQUcsYUFBYSxVQUFVLFFBQVE7R0FD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generation.d.ts","sourceRoot":"","sources":["../../src/migration/code-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"code-generation.d.ts","sourceRoot":"","sources":["../../src/migration/code-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAqhDxB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAG/E,cAAc,EAAE;UACf,cAAc,EAAE;EAuC/B;AAWD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAoB/E;AAuHD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS7F;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0G7B"}
|