sonamu 0.7.10 → 0.7.12
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/api/config.d.ts +10 -3
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -1
- package/dist/api/sonamu.d.ts +4 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +36 -2
- package/dist/bin/cli.js +121 -117
- package/dist/database/base-model.d.ts +10 -50
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +19 -84
- package/dist/database/base-model.types.d.ts +4 -4
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +1 -0
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +24 -13
- package/dist/database/puri-subset.test-d.js +1 -1
- package/dist/database/puri-subset.types.d.ts +1 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +2 -2
- package/dist/database/puri.d.ts +96 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +214 -2
- package/dist/database/puri.types.d.ts +60 -5
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +2 -3
- package/dist/database/puri.types.test-d.js +1 -1
- package/dist/database/upsert-builder.d.ts +3 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +19 -4
- package/dist/entity/entity-manager.d.ts +5 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +8 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +33 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +53 -22
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.d.ts +7 -4
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +45 -21
- package/dist/naite/naite.js +2 -2
- package/dist/stream/sse.d.ts +2 -6
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +9 -3
- package/dist/syncer/api-parser.js +5 -1
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +6 -5
- package/dist/syncer/module-loader.d.ts +5 -0
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +17 -1
- package/dist/syncer/syncer.d.ts +3 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +12 -2
- package/dist/tasks/decorator.d.ts +26 -0
- package/dist/tasks/decorator.d.ts.map +1 -0
- package/dist/tasks/decorator.js +28 -0
- package/dist/tasks/step-wrapper.d.ts +18 -0
- package/dist/tasks/step-wrapper.d.ts.map +1 -0
- package/dist/tasks/step-wrapper.js +38 -0
- package/dist/tasks/workflow-manager.d.ts +40 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -0
- package/dist/tasks/workflow-manager.js +193 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +7 -3
- package/dist/template/implementations/model.template.js +2 -2
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +4 -2
- package/dist/types/types.d.ts +28 -11
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +18 -2
- package/dist/utils/console-util.js +2 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +10 -2
- package/dist/utils/model.d.ts +9 -2
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +16 -1
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +3 -1
- package/dist/vector/embedding.d.ts +2 -5
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +3 -7
- package/dist/vector/types.d.ts.map +1 -1
- package/dist/vector/types.js +1 -1
- package/package.json +4 -2
- package/src/api/config.ts +15 -8
- package/src/api/sonamu.ts +43 -2
- package/src/bin/cli.ts +58 -54
- package/src/database/base-model.ts +21 -128
- package/src/database/base-model.types.ts +3 -4
- package/src/database/db.ts +28 -18
- package/src/database/puri-subset.test-d.ts +1 -0
- package/src/database/puri-subset.types.ts +2 -0
- package/src/database/puri.ts +292 -1
- package/src/database/puri.types.test-d.ts +1 -1
- package/src/database/puri.types.ts +81 -7
- package/src/database/upsert-builder.ts +27 -9
- package/src/entity/entity-manager.ts +9 -0
- package/src/index.ts +1 -1
- package/src/migration/code-generation.ts +40 -1
- package/src/migration/postgresql-schema-reader.ts +53 -22
- package/src/naite/messaging-types.ts +43 -44
- package/src/naite/naite-reporter.ts +51 -20
- package/src/naite/naite.ts +1 -1
- package/src/shared/app.shared.ts.txt +13 -0
- package/src/shared/web.shared.ts.txt +13 -0
- package/src/stream/sse.ts +15 -3
- package/src/syncer/api-parser.ts +4 -0
- package/src/syncer/file-patterns.ts +11 -9
- package/src/syncer/module-loader.ts +35 -0
- package/src/syncer/syncer.ts +14 -0
- package/src/tasks/decorator.ts +71 -0
- package/src/tasks/step-wrapper.ts +84 -0
- package/src/tasks/workflow-manager.ts +330 -0
- package/src/template/implementations/generated.template.ts +19 -6
- package/src/template/implementations/model.template.ts +1 -1
- package/src/template/zod-converter.ts +3 -0
- package/src/types/types.ts +23 -4
- package/src/utils/console-util.ts +1 -1
- package/src/utils/formatter.ts +8 -1
- package/src/utils/model.ts +26 -2
- package/src/utils/type-utils.ts +2 -0
- package/src/vector/embedding.ts +2 -8
- package/src/vector/types.ts +1 -2
- package/dist/vector/vector-search.d.ts +0 -47
- package/dist/vector/vector-search.d.ts.map +0 -1
- package/dist/vector/vector-search.js +0 -176
- package/src/vector/vector-search.ts +0 -261
|
@@ -150,34 +150,65 @@ class PostgreSQLSchemaReaderClass {
|
|
|
150
150
|
if (columns.length === 0) {
|
|
151
151
|
throw new Error(`Table not found: ${tableName}`);
|
|
152
152
|
}
|
|
153
|
-
// Indexes 조회
|
|
153
|
+
// Indexes 조회 (PGroonga 표현식 인덱스 포함)
|
|
154
154
|
const indexesQuery = `
|
|
155
155
|
SELECT
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
156
|
+
i.relname AS index_name,
|
|
157
|
+
CASE
|
|
158
|
+
WHEN am.amname = 'pgroonga' AND u.attnum = 0 THEN
|
|
159
|
+
regexp_replace(
|
|
160
|
+
regexp_replace(
|
|
161
|
+
TRIM(pgroonga_col.column_expr),
|
|
162
|
+
'::text',
|
|
163
|
+
'',
|
|
164
|
+
'g'
|
|
165
|
+
),
|
|
166
|
+
'[()]',
|
|
167
|
+
'',
|
|
168
|
+
'g'
|
|
169
|
+
)
|
|
170
|
+
ELSE a.attname
|
|
171
|
+
END AS column_name,
|
|
172
|
+
ix.indisunique AS is_unique,
|
|
173
|
+
ix.indisprimary AS is_primary,
|
|
174
|
+
am.amname AS index_type,
|
|
175
|
+
COALESCE((u.opt & 2) = 2, FALSE) AS nulls_first,
|
|
176
|
+
CASE
|
|
177
|
+
WHEN (u.opt & 1) = 1 THEN 'DESC'
|
|
178
|
+
ELSE 'ASC'
|
|
179
|
+
END AS sort_order,
|
|
180
|
+
ix.indnullsnotdistinct AS nulls_not_distinct
|
|
169
181
|
FROM pg_class t
|
|
170
182
|
JOIN pg_index ix ON t.oid = ix.indrelid
|
|
171
183
|
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
172
184
|
JOIN pg_am am ON i.relam = am.oid
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
185
|
+
JOIN LATERAL unnest(ix.indkey, ix.indoption)
|
|
186
|
+
WITH ORDINALITY AS u(attnum, opt, ord) ON true
|
|
187
|
+
LEFT JOIN pg_attribute a ON a.attrelid = t.oid
|
|
188
|
+
AND a.attnum = u.attnum
|
|
189
|
+
AND u.attnum > 0
|
|
190
|
+
LEFT JOIN LATERAL (
|
|
191
|
+
SELECT
|
|
192
|
+
unnest(
|
|
193
|
+
CASE
|
|
194
|
+
WHEN pg_get_expr(ix.indexprs, ix.indrelid) ~ '^ARRAY\\[' THEN
|
|
195
|
+
string_to_array(
|
|
196
|
+
regexp_replace(
|
|
197
|
+
pg_get_expr(ix.indexprs, ix.indrelid),
|
|
198
|
+
'^ARRAY\\[(.*)\\]$',
|
|
199
|
+
'\\1'
|
|
200
|
+
),
|
|
201
|
+
', '
|
|
202
|
+
)
|
|
203
|
+
ELSE
|
|
204
|
+
ARRAY[pg_get_expr(ix.indexprs, ix.indrelid)]
|
|
205
|
+
END
|
|
206
|
+
) as column_expr
|
|
207
|
+
) pgroonga_col ON am.amname = 'pgroonga' AND u.attnum = 0
|
|
177
208
|
WHERE t.relname = ?
|
|
178
|
-
|
|
179
|
-
ORDER BY i.relname,
|
|
180
|
-
|
|
209
|
+
AND (u.attnum > 0 OR (am.amname = 'pgroonga' AND u.attnum = 0))
|
|
210
|
+
ORDER BY i.relname, u.ord;
|
|
211
|
+
`;
|
|
181
212
|
const indexes = (await compareDB.raw(indexesQuery, [
|
|
182
213
|
tableName
|
|
183
214
|
])).rows;
|
|
@@ -345,4 +376,4 @@ class PostgreSQLSchemaReaderClass {
|
|
|
345
376
|
}
|
|
346
377
|
export const PostgreSQLSchemaReader = new PostgreSQLSchemaReaderClass();
|
|
347
378
|
|
|
348
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxuICBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgUGdDb2x1bW4gPSB7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGRhdGFfdHlwZTogc3RyaW5nO1xuICB1ZHRfbmFtZTogc3RyaW5nO1xuICBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGg6IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfcHJlY2lzaW9uOiBudW1iZXIgfCBudWxsO1xuICBudW1lcmljX3NjYWxlOiBudW1iZXIgfCBudWxsO1xuICBpc19udWxsYWJsZTogc3RyaW5nO1xuICBjb2x1bW5fZGVmYXVsdDogc3RyaW5nIHwgbnVsbDtcbiAgaXNfZ2VuZXJhdGVkOiBzdHJpbmc7IC8vICdzJyA9IFNUT1JFRCwgJ3YnID0gVklSVFVBTCwgJycgPSBub25lXG4gIGdlbmVyYXRpb25fZXhwcmVzc2lvbjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgUGdJbmRleCA9IHtcbiAgaW5kZXhfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBpc191bmlxdWU6IGJvb2xlYW47XG4gIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gIGluZGV4X3R5cGU6IHN0cmluZztcbiAgbnVsbHNfZmlyc3Q6IGJvb2xlYW47XG4gIHNvcnRfb3JkZXI6IFwiQVNDXCIgfCBcIkRFU0NcIjtcbiAgbnVsbHNfbm90X2Rpc3RpbmN0OiBib29sZWFuO1xufTtcblxudHlwZSBQZ0ZvcmVpZ24gPSB7XG4gIGNvbnN0cmFpbnRfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX3RhYmxlX25hbWU6IHN0cmluZztcbiAgZm9yZWlnbl9jb2x1bW5fbmFtZTogc3RyaW5nO1xuICB1cGRhdGVfcnVsZTogc3RyaW5nO1xuICBkZWxldGVfcnVsZTogc3RyaW5nO1xufTtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgLyoqXG4gICAqIERC7JeQ7IScIO2FjOydtOu4lCDsoJXrs7Trpbwg7J297Ja07IScIE1pZ3JhdGlvblNldOydhCDrp4zrk6TslrTsmLXri4jri6QuXG4gICAqIEBwYXJhbSBjb21wYXJlREIgS25leCDsnbjsiqTthLTsiqRcbiAgICogQHBhcmFtIHRhYmxlIO2FjOydtOu4lCDsnbTrpoRcbiAgICogQHJldHVybnMgTWlncmF0aW9uU2V0IOqwneyytFxuICAgKi9cbiAgYXN5bmMgZ2V0TWlncmF0aW9uU2V0RnJvbURCKGNvbXBhcmVEQjogS25leCwgdGFibGU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uU2V0IHwgbnVsbD4ge1xuICAgIGxldCBkYkNvbHVtbnM6IFBnQ29sdW1uW10sIGRiSW5kZXhlczogUGdJbmRleFtdLCBkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXTtcbiAgICB0cnkge1xuICAgICAgW2RiQ29sdW1ucywgZGJJbmRleGVzLCBkYkZvcmVpZ25zXSA9IGF3YWl0IHRoaXMucmVhZFRhYmxlKGNvbXBhcmVEQiwgdGFibGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKFwiVGFibGUgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9ucyDsobDtmoxcbiAgICBjb25zdCB2ZWN0b3JEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zKGNvbXBhcmVEQiwgdGFibGUpO1xuXG4gICAgY29uc3QgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBkYkNvbHVtbnMubWFwKChkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZGJDb2xUeXBlID0gdGhpcy5yZXNvbHZlREJDb2xUeXBlKGRiQ29sdW1uKTtcblxuICAgICAgLy8gdmVjdG9yIO2DgOyeheyduCDqsr3smrAgZGltZW5zaW9ucyDshKTsoJVcbiAgICAgIGlmIChkYkNvbFR5cGUudHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgICBkYkNvbFR5cGUuZGltZW5zaW9ucyA9IHZlY3RvckRpbWVuc2lvbnNbZGJDb2x1bW4uY29sdW1uX25hbWVdID8/IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRiQ29sdW1uLmNvbHVtbl9uYW1lLFxuICAgICAgICBudWxsYWJsZTogZGJDb2x1bW4uaXNfbnVsbGFibGUgPT09IFwiWUVTXCIsXG4gICAgICAgIC4uLmRiQ29sVHlwZSxcbiAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsspjrpqxcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiID8gXCJTVE9SRURcIiA6IFwiVklSVFVBTFwiLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGRiQ29sdW1uLmdlbmVyYXRpb25fZXhwcmVzc2lvbiA/PyBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAvLyBEZWZhdWx0IOqwkiDsspjrpqwgKEdlbmVyYXRlZCBDb2x1bW7snbQg7JWE64uMIOqyveyasOunjClcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIGRlZmF1bHQg6rCS7J20IOyXhuydjFxuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVTUUwgZGVmYXVsdCDqsJIg7KCV66asIChuZXh0dmFsLCBDVVJSRU5UX1RJTUVTVEFNUCDrk7EpXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQ7XG5cbiAgICAgICAgICAgIC8vIG5leHR2YWwg7KCc6rGwIChTRVJJQUwg7YOA7J6FKVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwibmV4dHZhbChcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDtg4DsnoUg7LqQ7Iqk7YyFIOygnOqxsCAo7JiIOiAnMSc6OmludGVnZXIg4oaSIDEpXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgvOjpbXFx3XFxzXSskL2csIFwiXCIpO1xuXG4gICAgICAgICAgICAvLyDrlLDsmLTtkZzqsIAgc2luZ2xlIHF1b3Rl7J24IOqyveyasCBkb3VibGUgcXVvdGXroZwg67OA7ZmYXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIGRlZmF1bHRWYWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2VBbGwoXCInXCIsICdcIicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0VG86IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQUklNQVJZIEtFWeyZgCBmb3JlaWduIGtleeyaqSDsnbjrjbHsiqQg7KCc7Jm4XG4gICAgY29uc3QgZGJJbmRleGVzR3JvdXAgPSBncm91cChcbiAgICAgIGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgICAgIChkYkluZGV4KSA9PlxuICAgICAgICAgICFkYkluZGV4LmlzX3ByaW1hcnkgJiZcbiAgICAgICAgICAhZGJGb3JlaWducy5maW5kKChkYkZvcmVpZ24pID0+IGRiSW5kZXguaW5kZXhfbmFtZS5pbmNsdWRlcyhkYkZvcmVpZ24uY29uc3RyYWludF9uYW1lKSksXG4gICAgICApLFxuICAgICAgKGRiSW5kZXgpID0+IGRiSW5kZXguaW5kZXhfbmFtZSxcbiAgICApO1xuXG4gICAgLy8gaW5kZXhlcyDsspjrpqxcbiAgICBjb25zdCBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdID0gT2JqZWN0LmtleXMoZGJJbmRleGVzR3JvdXApLm1hcCgoaW5kZXhOYW1lKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IGRiSW5kZXhlc0dyb3VwW2luZGV4TmFtZV07XG4gICAgICBhc3NlcnQoY3VycmVudEluZGV4ZXMpO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gY3VycmVudEluZGV4ZXNbMF07XG4gICAgICBjb25zdCB0eXBlID0gZmlyc3RJbmRleC5pc191bmlxdWUgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwiO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGN1cnJlbnRJbmRleGVzLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGlkeC5jb2x1bW5fbmFtZSxcbiAgICAgICAgICBudWxsc0ZpcnN0OiBpZHgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgc29ydE9yZGVyOiBpZHguc29ydF9vcmRlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBudWxsc05vdERpc3RpbmN0OiBmaXJzdEluZGV4Lm51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgICAgdXNpbmc6IGZpcnN0SW5kZXguaW5kZXhfdHlwZSBhcyBcImJ0cmVlXCIgfCBcImhhc2hcIiB8IFwiZ2luXCIgfCBcImdpc3RcIiB8IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBmb3JlaWducyDsspjrpqxcbiAgICBjb25zdCBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdID0gZGJGb3JlaWducy5tYXAoKGRiRm9yZWlnbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogW2RiRm9yZWlnbi5jb2x1bW5fbmFtZV0sXG4gICAgICAgIHRvOiBgJHtkYkZvcmVpZ24uZm9yZWlnbl90YWJsZV9uYW1lfS4ke2RiRm9yZWlnbi5mb3JlaWduX2NvbHVtbl9uYW1lfWAsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24uZGVsZXRlX3J1bGUpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBpbmRleGVzLFxuICAgICAgZm9yZWlnbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FM7J2YIGNvbnN0cmFpbnQgYWN0aW9u7J2EIEtuZXgg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBtYXBDb25zdHJhaW50QWN0aW9uKGFjdGlvbjogc3RyaW5nKTogUmVsYXRpb25PbiB7XG4gICAgY29uc3QgYWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbk9uPiA9IHtcbiAgICAgIFwiTk8gQUNUSU9OXCI6IFwiTk8gQUNUSU9OXCIsXG4gICAgICBSRVNUUklDVDogXCJSRVNUUklDVFwiLFxuICAgICAgQ0FTQ0FERTogXCJDQVNDQURFXCIsXG4gICAgICBcIlNFVCBOVUxMXCI6IFwiU0VUIE5VTExcIixcbiAgICAgIFwiU0VUIERFRkFVTFRcIjogXCJTRVQgREVGQVVMVFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGFjdGlvbk1hcFthY3Rpb25dID8/IFwiTk8gQUNUSU9OXCI7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IO2FjOydtOu4lCDsnb3slrTshJwgY29scywgaW5kZXhlcywgZm9yZWlnbnMg67CY7ZmYXG4gICAqL1xuICBhc3luYyByZWFkVGFibGUoXG4gICAgY29tcGFyZURCOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFtQZ0NvbHVtbltdLCBQZ0luZGV4W10sIFBnRm9yZWlnbltdXT4ge1xuICAgIC8vIENvbHVtbnMg7KGw7ZqMIChHZW5lcmF0ZWQgQ29sdW1uIOygleuztCDtj6ztlagpXG4gICAgY29uc3QgY29sdW1uc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGMuY29sdW1uX25hbWUsXG4gICAgICAgIGMuZGF0YV90eXBlLFxuICAgICAgICBjLnVkdF9uYW1lLFxuICAgICAgICBjLmNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgYy5udW1lcmljX3ByZWNpc2lvbixcbiAgICAgICAgYy5udW1lcmljX3NjYWxlLFxuICAgICAgICBjLmlzX251bGxhYmxlLFxuICAgICAgICBjLmNvbHVtbl9kZWZhdWx0LFxuICAgICAgICBDT0FMRVNDRShhLmF0dGdlbmVyYXRlZCwgJycpIGFzIGlzX2dlbmVyYXRlZCxcbiAgICAgICAgYy5nZW5lcmF0aW9uX2V4cHJlc3Npb25cbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgY1xuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0bmFtZSA9IGMuY29sdW1uX25hbWVcbiAgICAgICAgQU5EIGEuYXR0cmVsaWQgPSAoXG4gICAgICAgICAgU0VMRUNUIG9pZCBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbG5hbWUgPSBjLnRhYmxlX25hbWVcbiAgICAgICAgICBBTkQgcmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9IGMudGFibGVfc2NoZW1hKVxuICAgICAgICApXG4gICAgICBXSEVSRSBjLnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCBjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgICBPUkRFUiBCWSBjLm9yZGluYWxfcG9zaXRpb25cbiAgICBgO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhjb2x1bW5zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cyBhcyBQZ0NvbHVtbltdO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEluZGV4ZXMg7KGw7ZqMXG4gICAgY29uc3QgaW5kZXhlc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGkucmVsbmFtZSBhcyBpbmRleF9uYW1lLFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGl4LmluZGlzdW5pcXVlIGFzIGlzX3VuaXF1ZSxcbiAgICAgICAgaXguaW5kaXNwcmltYXJ5IGFzIGlzX3ByaW1hcnksXG4gICAgICAgIGFtLmFtbmFtZSBhcyBpbmRleF90eXBlLFxuICAgICAgICAtLSBOVUxMUyBGSVJTVC9MQVNUIO2ZleyduCAo67mE7Yq4IOyXsOyCsClcbiAgICAgICAgKG9wdCAmIDIpID0gMiBBUyBudWxsc19maXJzdCxcbiAgICAgICAgLS0gQVNDL0RFU0Mg7ZmV7J24XG4gICAgICAgIENBU0UgXG4gICAgICAgICAgICBXSEVOIChvcHQgJiAxKSA9IDEgVEhFTiAnREVTQydcbiAgICAgICAgICAgIEVMU0UgJ0FTQydcbiAgICAgICAgRU5EIEFTIHNvcnRfb3JkZXIsXG4gICAgICAgIGl4LmluZG51bGxzbm90ZGlzdGluY3QgQVMgbnVsbHNfbm90X2Rpc3RpbmN0XG4gICAgICBGUk9NIHBnX2NsYXNzIHRcbiAgICAgIEpPSU4gcGdfaW5kZXggaXggT04gdC5vaWQgPSBpeC5pbmRyZWxpZFxuICAgICAgSk9JTiBwZ19jbGFzcyBpIE9OIGkub2lkID0gaXguaW5kZXhyZWxpZFxuICAgICAgSk9JTiBwZ19hbSBhbSBPTiBpLnJlbGFtID0gYW0ub2lkXG4gICAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgICBXSVRIIE9SRElOQUxJVFkgQVMgdShhdHRudW0sIG9wdCwgb3JkKSBPTiB0cnVlXG4gICAgICAgIC0tIHVubmVzdOyXkOyEnCDrgpjsmKggYXR0bnVt7Jy866GcIOyngeygkSDsobDsnbhcbiAgICAgIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRyZWxpZCA9IHQub2lkIEFORCBhLmF0dG51bSA9IHUuYXR0bnVtXG4gICAgICBXSEVSRSB0LnJlbG5hbWUgPSA/XG4gICAgICAgIEFORCBhLmF0dG51bSA9IEFOWShpeC5pbmRrZXkpXG4gICAgICBPUkRFUiBCWSBpLnJlbG5hbWUsIGFycmF5X3Bvc2l0aW9uKGl4LmluZGtleSwgYS5hdHRudW0pXG4gICAgYDtcbiAgICBjb25zdCBpbmRleGVzID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoaW5kZXhlc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIHRjLnRhYmxlX25hbWUgPSA/XG4gICAgYDtcbiAgICBjb25zdCBmb3JlaWducyA9IChhd2FpdCBjb21wYXJlREIucmF3KGZvcmVpZ25zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIHJldHVybiBbY29sdW1ucywgaW5kZXhlcywgZm9yZWlnbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9uc+ulvCDsobDtmoztlanri4jri6QuXG4gICAqIHBnX2F0dHJpYnV0ZeydmCBhdHR0eXBtb2Tsl5DshJwg7LCo7JuQIOyImOulvCDstpTstpztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFZlY3RvckRpbWVuc2lvbnMoXG4gICAgY29tcGFyZURCOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGEuYXR0dHlwbW9kIGFzIGRpbWVuc2lvbnNcbiAgICAgIEZST00gcGdfYXR0cmlidXRlIGFcbiAgICAgIEpPSU4gcGdfY2xhc3MgYyBPTiBhLmF0dHJlbGlkID0gYy5vaWRcbiAgICAgIEpPSU4gcGdfdHlwZSB0IE9OIGEuYXR0dHlwaWQgPSB0Lm9pZFxuICAgICAgV0hFUkUgYy5yZWxuYW1lID0gP1xuICAgICAgICBBTkQgdC50eXBuYW1lID0gJ3ZlY3RvcidcbiAgICAgICAgQU5EIGEuYXR0bnVtID4gMFxuICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGFyZURCLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgLy8gYXR0dHlwbW9k7JeQ7IScIOyLpOygnCBkaW1lbnNpb25zIOqwkiDstpTstpxcbiAgICAgIGRpbWVuc2lvbnNbcm93LmNvbHVtbl9uYW1lXSA9IHJvdy5kaW1lbnNpb25zID4gMCA/IHJvdy5kaW1lbnNpb25zIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6F7J2EIOu2hOyEne2VmOyXrCBNaWdyYXRpb25Db2x1bW4g6rCd7LK066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHJlc29sdmVEQkNvbFR5cGUoXG4gICAgZGJDb2x1bW46IFBnQ29sdW1uLFxuICApOiBQaWNrPFxuICAgIE1pZ3JhdGlvbkNvbHVtbixcbiAgICBcInR5cGVcIiB8IFwibGVuZ3RoXCIgfCBcInByZWNpc2lvblwiIHwgXCJzY2FsZVwiIHwgXCJudW1iZXJUeXBlXCIgfCBcImRpbWVuc2lvbnNcIlxuICA+IHtcbiAgICBjb25zdCB7XG4gICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICBudW1lcmljX3NjYWxlLFxuICAgIH0gPSBkYkNvbHVtbjtcblxuICAgIGNvbnN0IHsgdWR0X25hbWUsIHNpbmdsZU9yQXJyYXkgfSA9ICgoKSA9PiB7XG4gICAgICBpZiAoX3VkdF9uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgc2luZ2xlT3JBcnJheTogXCJbXVwiIGFzIGNvbnN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZSxcbiAgICAgICAgc2luZ2xlT3JBcnJheTogXCJcIiBhcyBjb25zdCxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIC8vIFVVSURcbiAgICBpZiAodWR0X25hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgdXVpZCR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZWdlciB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBpbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJpZ0ludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFN0cmluZyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2YXJjaGFyXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCAmJiB7XG4gICAgICAgICAgbGVuZ3RoOiBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gIH07IC8vIFN0cmluZ1Byb3Agd2l0aG91dCBsZW5ndGhcbiAgICB9XG5cbiAgICAvLyBOdW1iZXJPck51bWVyaWMgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIG51bWJlclR5cGU6IFwibnVtZXJpY1wiLFxuICAgICAgICAuLi4obnVtZXJpY19wcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogbnVtZXJpY19zY2FsZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcInJlYWxcIiB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJkb3VibGUgcHJlY2lzaW9uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBCb29sZWFuXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImJvb2xcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJvb2xlYW4ke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFRpbWVzdGFtcHogdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidGltZXN0YW1wdHpcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGRhdGUke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBEYXRlUHJvcCDihpIgdGltZXN0YW1wdHpcbiAgICB9XG5cbiAgICAvLyBKU09OXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImpzb25cIiB8fCB1ZHRfbmFtZSA9PT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImpzb25cIiB9O1xuICAgIH1cblxuICAgIC8vIFZlY3RvciAocGd2ZWN0b3IpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZlY3RvclwiKSB7XG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J2YIOywqOybkCDsiJjripQgY29sdW1uX2RlZmF1bHTrgpgg67OE64+EIOy/vOumrOuhnCDtmZXsnbjtlbTslbwg7ZWoXG4gICAgICAvLyDtmITsnqzripQg6riw67O46rCSIDDsnLzroZwg7ISk7KCVICjsi6TsoJwgZGltZW5zaW9uc+uKlCBnZXRNaWdyYXRpb25TZXRGcm9tRELsl5DshJwg67OE64+EIOy/vOumrOuhnCDtmZXsnbgpXG4gICAgICByZXR1cm4geyB0eXBlOiBgdmVjdG9yJHtzaW5nbGVPckFycmF5fWAsIGRpbWVuc2lvbnM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyB0c3ZlY3RvciAoUG9zdGdyZVNRTCDsoITrrLgg6rKA7IOJ7JqpIO2DgOyehSlcbiAgICBpZiAodWR0X25hbWUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0c3ZlY3RvclwiIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgOuKpe2VnCBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoU6ICR7dWR0X25hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgPSBuZXcgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiZ3JvdXAiLCJQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MiLCJnZXRNaWdyYXRpb25TZXRGcm9tREIiLCJjb21wYXJlREIiLCJ0YWJsZSIsImRiQ29sdW1ucyIsImRiSW5kZXhlcyIsImRiRm9yZWlnbnMiLCJyZWFkVGFibGUiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJjb25zb2xlIiwiZXJyb3IiLCJ2ZWN0b3JEaW1lbnNpb25zIiwiZ2V0VmVjdG9yRGltZW5zaW9ucyIsImNvbHVtbnMiLCJtYXAiLCJkYkNvbHVtbiIsImRiQ29sVHlwZSIsInJlc29sdmVEQkNvbFR5cGUiLCJ0eXBlIiwiZGltZW5zaW9ucyIsImNvbHVtbl9uYW1lIiwibmFtZSIsIm51bGxhYmxlIiwiaXNfbnVsbGFibGUiLCJpc19nZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJleHByZXNzaW9uIiwiZ2VuZXJhdGlvbl9leHByZXNzaW9uIiwiY29sdW1uX2RlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsImVuZHNXaXRoIiwicmVwbGFjZUFsbCIsImRlZmF1bHRUbyIsImRiSW5kZXhlc0dyb3VwIiwiZmlsdGVyIiwiZGJJbmRleCIsImlzX3ByaW1hcnkiLCJmaW5kIiwiZGJGb3JlaWduIiwiaW5kZXhfbmFtZSIsImNvbnN0cmFpbnRfbmFtZSIsImluZGV4ZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXhOYW1lIiwiY3VycmVudEluZGV4ZXMiLCJmaXJzdEluZGV4IiwiaXNfdW5pcXVlIiwiaWR4IiwibnVsbHNGaXJzdCIsIm51bGxzX2ZpcnN0Iiwic29ydE9yZGVyIiwic29ydF9vcmRlciIsIm51bGxzTm90RGlzdGluY3QiLCJudWxsc19ub3RfZGlzdGluY3QiLCJ1c2luZyIsImluZGV4X3R5cGUiLCJmb3JlaWducyIsInRvIiwiZm9yZWlnbl90YWJsZV9uYW1lIiwiZm9yZWlnbl9jb2x1bW5fbmFtZSIsIm9uVXBkYXRlIiwibWFwQ29uc3RyYWludEFjdGlvbiIsInVwZGF0ZV9ydWxlIiwib25EZWxldGUiLCJkZWxldGVfcnVsZSIsImFjdGlvbiIsImFjdGlvbk1hcCIsIlJFU1RSSUNUIiwiQ0FTQ0FERSIsInRhYmxlTmFtZSIsImNvbHVtbnNRdWVyeSIsInJhdyIsInJvd3MiLCJsZW5ndGgiLCJpbmRleGVzUXVlcnkiLCJmb3JlaWduc1F1ZXJ5IiwicXVlcnkiLCJyZXN1bHQiLCJyb3ciLCJ1ZHRfbmFtZSIsIl91ZHRfbmFtZSIsImNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCIsIm51bWVyaWNfcHJlY2lzaW9uIiwibnVtZXJpY19zY2FsZSIsInNpbmdsZU9yQXJyYXkiLCJzdWJzdHJpbmciLCJudW1iZXJUeXBlIiwicHJlY2lzaW9uIiwic2NhbGUiLCJQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFFNUIsU0FBU0MsS0FBSyxRQUFRLFVBQVU7QUEwQ2hDLE1BQU1DO0lBQ0o7Ozs7O0dBS0MsR0FDRCxNQUFNQyxzQkFBc0JDLFNBQWUsRUFBRUMsS0FBYSxFQUFnQztRQUN4RixJQUFJQyxXQUF1QkMsV0FBc0JDO1FBQ2pELElBQUk7WUFDRixDQUFDRixXQUFXQyxXQUFXQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0wsV0FBV0M7UUFDdkUsRUFBRSxPQUFPSyxHQUFZO1lBQ25CLElBQUlBLGFBQWFDLFNBQVNELEVBQUVFLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLG9CQUFvQjtnQkFDL0QsT0FBTztZQUNUO1lBQ0FDLFFBQVFDLEtBQUssQ0FBQ0w7WUFDZCxPQUFPO1FBQ1Q7UUFFQSwyQkFBMkI7UUFDM0IsTUFBTU0sbUJBQW1CLE1BQU0sSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ2IsV0FBV0M7UUFFbkUsTUFBTWEsVUFBNkJaLFVBQVVhLEdBQUcsQ0FBQyxDQUFDQztZQUNoRCxNQUFNQyxZQUFZLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUNGO1lBRXhDLDhCQUE4QjtZQUM5QixJQUFJQyxVQUFVRSxJQUFJLEtBQUssVUFBVTtnQkFDL0JGLFVBQVVHLFVBQVUsR0FBR1IsZ0JBQWdCLENBQUNJLFNBQVNLLFdBQVcsQ0FBQyxJQUFJO1lBQ25FO1lBRUEsT0FBTztnQkFDTEMsTUFBTU4sU0FBU0ssV0FBVztnQkFDMUJFLFVBQVVQLFNBQVNRLFdBQVcsS0FBSztnQkFDbkMsR0FBR1AsU0FBUztnQkFDWixzQkFBc0I7Z0JBQ3RCLEdBQUcsQUFBQyxDQUFB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
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxuICBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgUGdDb2x1bW4gPSB7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGRhdGFfdHlwZTogc3RyaW5nO1xuICB1ZHRfbmFtZTogc3RyaW5nO1xuICBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGg6IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfcHJlY2lzaW9uOiBudW1iZXIgfCBudWxsO1xuICBudW1lcmljX3NjYWxlOiBudW1iZXIgfCBudWxsO1xuICBpc19udWxsYWJsZTogc3RyaW5nO1xuICBjb2x1bW5fZGVmYXVsdDogc3RyaW5nIHwgbnVsbDtcbiAgaXNfZ2VuZXJhdGVkOiBzdHJpbmc7IC8vICdzJyA9IFNUT1JFRCwgJ3YnID0gVklSVFVBTCwgJycgPSBub25lXG4gIGdlbmVyYXRpb25fZXhwcmVzc2lvbjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgUGdJbmRleCA9IHtcbiAgaW5kZXhfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBpc191bmlxdWU6IGJvb2xlYW47XG4gIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gIGluZGV4X3R5cGU6IHN0cmluZztcbiAgbnVsbHNfZmlyc3Q6IGJvb2xlYW47XG4gIHNvcnRfb3JkZXI6IFwiQVNDXCIgfCBcIkRFU0NcIjtcbiAgbnVsbHNfbm90X2Rpc3RpbmN0OiBib29sZWFuO1xufTtcblxudHlwZSBQZ0ZvcmVpZ24gPSB7XG4gIGNvbnN0cmFpbnRfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX3RhYmxlX25hbWU6IHN0cmluZztcbiAgZm9yZWlnbl9jb2x1bW5fbmFtZTogc3RyaW5nO1xuICB1cGRhdGVfcnVsZTogc3RyaW5nO1xuICBkZWxldGVfcnVsZTogc3RyaW5nO1xufTtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgLyoqXG4gICAqIERC7JeQ7IScIO2FjOydtOu4lCDsoJXrs7Trpbwg7J297Ja07IScIE1pZ3JhdGlvblNldOydhCDrp4zrk6TslrTsmLXri4jri6QuXG4gICAqIEBwYXJhbSBjb21wYXJlREIgS25leCDsnbjsiqTthLTsiqRcbiAgICogQHBhcmFtIHRhYmxlIO2FjOydtOu4lCDsnbTrpoRcbiAgICogQHJldHVybnMgTWlncmF0aW9uU2V0IOqwneyytFxuICAgKi9cbiAgYXN5bmMgZ2V0TWlncmF0aW9uU2V0RnJvbURCKGNvbXBhcmVEQjogS25leCwgdGFibGU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uU2V0IHwgbnVsbD4ge1xuICAgIGxldCBkYkNvbHVtbnM6IFBnQ29sdW1uW10sIGRiSW5kZXhlczogUGdJbmRleFtdLCBkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXTtcbiAgICB0cnkge1xuICAgICAgW2RiQ29sdW1ucywgZGJJbmRleGVzLCBkYkZvcmVpZ25zXSA9IGF3YWl0IHRoaXMucmVhZFRhYmxlKGNvbXBhcmVEQiwgdGFibGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKFwiVGFibGUgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9ucyDsobDtmoxcbiAgICBjb25zdCB2ZWN0b3JEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zKGNvbXBhcmVEQiwgdGFibGUpO1xuXG4gICAgY29uc3QgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBkYkNvbHVtbnMubWFwKChkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZGJDb2xUeXBlID0gdGhpcy5yZXNvbHZlREJDb2xUeXBlKGRiQ29sdW1uKTtcblxuICAgICAgLy8gdmVjdG9yIO2DgOyeheyduCDqsr3smrAgZGltZW5zaW9ucyDshKTsoJVcbiAgICAgIGlmIChkYkNvbFR5cGUudHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgICBkYkNvbFR5cGUuZGltZW5zaW9ucyA9IHZlY3RvckRpbWVuc2lvbnNbZGJDb2x1bW4uY29sdW1uX25hbWVdID8/IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRiQ29sdW1uLmNvbHVtbl9uYW1lLFxuICAgICAgICBudWxsYWJsZTogZGJDb2x1bW4uaXNfbnVsbGFibGUgPT09IFwiWUVTXCIsXG4gICAgICAgIC4uLmRiQ29sVHlwZSxcbiAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsspjrpqxcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiID8gXCJTVE9SRURcIiA6IFwiVklSVFVBTFwiLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGRiQ29sdW1uLmdlbmVyYXRpb25fZXhwcmVzc2lvbiA/PyBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAvLyBEZWZhdWx0IOqwkiDsspjrpqwgKEdlbmVyYXRlZCBDb2x1bW7snbQg7JWE64uMIOqyveyasOunjClcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIGRlZmF1bHQg6rCS7J20IOyXhuydjFxuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVTUUwgZGVmYXVsdCDqsJIg7KCV66asIChuZXh0dmFsLCBDVVJSRU5UX1RJTUVTVEFNUCDrk7EpXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQ7XG5cbiAgICAgICAgICAgIC8vIG5leHR2YWwg7KCc6rGwIChTRVJJQUwg7YOA7J6FKVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwibmV4dHZhbChcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDtg4DsnoUg7LqQ7Iqk7YyFIOygnOqxsCAo7JiIOiAnMSc6OmludGVnZXIg4oaSIDEpXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgvOjpbXFx3XFxzXSskL2csIFwiXCIpO1xuXG4gICAgICAgICAgICAvLyDrlLDsmLTtkZzqsIAgc2luZ2xlIHF1b3Rl7J24IOqyveyasCBkb3VibGUgcXVvdGXroZwg67OA7ZmYXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIGRlZmF1bHRWYWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2VBbGwoXCInXCIsICdcIicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0VG86IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQUklNQVJZIEtFWeyZgCBmb3JlaWduIGtleeyaqSDsnbjrjbHsiqQg7KCc7Jm4XG4gICAgY29uc3QgZGJJbmRleGVzR3JvdXAgPSBncm91cChcbiAgICAgIGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgICAgIChkYkluZGV4KSA9PlxuICAgICAgICAgICFkYkluZGV4LmlzX3ByaW1hcnkgJiZcbiAgICAgICAgICAhZGJGb3JlaWducy5maW5kKChkYkZvcmVpZ24pID0+IGRiSW5kZXguaW5kZXhfbmFtZS5pbmNsdWRlcyhkYkZvcmVpZ24uY29uc3RyYWludF9uYW1lKSksXG4gICAgICApLFxuICAgICAgKGRiSW5kZXgpID0+IGRiSW5kZXguaW5kZXhfbmFtZSxcbiAgICApO1xuXG4gICAgLy8gaW5kZXhlcyDsspjrpqxcbiAgICBjb25zdCBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdID0gT2JqZWN0LmtleXMoZGJJbmRleGVzR3JvdXApLm1hcCgoaW5kZXhOYW1lKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IGRiSW5kZXhlc0dyb3VwW2luZGV4TmFtZV07XG4gICAgICBhc3NlcnQoY3VycmVudEluZGV4ZXMpO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gY3VycmVudEluZGV4ZXNbMF07XG4gICAgICBjb25zdCB0eXBlID0gZmlyc3RJbmRleC5pc191bmlxdWUgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwiO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGN1cnJlbnRJbmRleGVzLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGlkeC5jb2x1bW5fbmFtZSxcbiAgICAgICAgICBudWxsc0ZpcnN0OiBpZHgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgc29ydE9yZGVyOiBpZHguc29ydF9vcmRlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBudWxsc05vdERpc3RpbmN0OiBmaXJzdEluZGV4Lm51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgICAgdXNpbmc6IGZpcnN0SW5kZXguaW5kZXhfdHlwZSBhcyBcImJ0cmVlXCIgfCBcImhhc2hcIiB8IFwiZ2luXCIgfCBcImdpc3RcIiB8IFwicGdyb29uZ2FcIiB8IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBmb3JlaWducyDsspjrpqxcbiAgICBjb25zdCBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdID0gZGJGb3JlaWducy5tYXAoKGRiRm9yZWlnbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogW2RiRm9yZWlnbi5jb2x1bW5fbmFtZV0sXG4gICAgICAgIHRvOiBgJHtkYkZvcmVpZ24uZm9yZWlnbl90YWJsZV9uYW1lfS4ke2RiRm9yZWlnbi5mb3JlaWduX2NvbHVtbl9uYW1lfWAsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24uZGVsZXRlX3J1bGUpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBpbmRleGVzLFxuICAgICAgZm9yZWlnbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FM7J2YIGNvbnN0cmFpbnQgYWN0aW9u7J2EIEtuZXgg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBtYXBDb25zdHJhaW50QWN0aW9uKGFjdGlvbjogc3RyaW5nKTogUmVsYXRpb25PbiB7XG4gICAgY29uc3QgYWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbk9uPiA9IHtcbiAgICAgIFwiTk8gQUNUSU9OXCI6IFwiTk8gQUNUSU9OXCIsXG4gICAgICBSRVNUUklDVDogXCJSRVNUUklDVFwiLFxuICAgICAgQ0FTQ0FERTogXCJDQVNDQURFXCIsXG4gICAgICBcIlNFVCBOVUxMXCI6IFwiU0VUIE5VTExcIixcbiAgICAgIFwiU0VUIERFRkFVTFRcIjogXCJTRVQgREVGQVVMVFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGFjdGlvbk1hcFthY3Rpb25dID8/IFwiTk8gQUNUSU9OXCI7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IO2FjOydtOu4lCDsnb3slrTshJwgY29scywgaW5kZXhlcywgZm9yZWlnbnMg67CY7ZmYXG4gICAqL1xuICBhc3luYyByZWFkVGFibGUoXG4gICAgY29tcGFyZURCOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFtQZ0NvbHVtbltdLCBQZ0luZGV4W10sIFBnRm9yZWlnbltdXT4ge1xuICAgIC8vIENvbHVtbnMg7KGw7ZqMIChHZW5lcmF0ZWQgQ29sdW1uIOygleuztCDtj6ztlagpXG4gICAgY29uc3QgY29sdW1uc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGMuY29sdW1uX25hbWUsXG4gICAgICAgIGMuZGF0YV90eXBlLFxuICAgICAgICBjLnVkdF9uYW1lLFxuICAgICAgICBjLmNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgYy5udW1lcmljX3ByZWNpc2lvbixcbiAgICAgICAgYy5udW1lcmljX3NjYWxlLFxuICAgICAgICBjLmlzX251bGxhYmxlLFxuICAgICAgICBjLmNvbHVtbl9kZWZhdWx0LFxuICAgICAgICBDT0FMRVNDRShhLmF0dGdlbmVyYXRlZCwgJycpIGFzIGlzX2dlbmVyYXRlZCxcbiAgICAgICAgYy5nZW5lcmF0aW9uX2V4cHJlc3Npb25cbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgY1xuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0bmFtZSA9IGMuY29sdW1uX25hbWVcbiAgICAgICAgQU5EIGEuYXR0cmVsaWQgPSAoXG4gICAgICAgICAgU0VMRUNUIG9pZCBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbG5hbWUgPSBjLnRhYmxlX25hbWVcbiAgICAgICAgICBBTkQgcmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9IGMudGFibGVfc2NoZW1hKVxuICAgICAgICApXG4gICAgICBXSEVSRSBjLnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCBjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgICBPUkRFUiBCWSBjLm9yZGluYWxfcG9zaXRpb25cbiAgICBgO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhjb2x1bW5zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cyBhcyBQZ0NvbHVtbltdO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEluZGV4ZXMg7KGw7ZqMIChQR3Jvb25nYSDtkZztmITsi50g7J24642x7IqkIO2PrO2VqClcbiAgICBjb25zdCBpbmRleGVzUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgICBpLnJlbG5hbWUgQVMgaW5kZXhfbmFtZSxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICAgIFdIRU4gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwIFRIRU5cbiAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBUUklNKHBncm9vbmdhX2NvbC5jb2x1bW5fZXhwciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICc6OnRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAnWygpXScsXG4gICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgJ2cnXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIEVMU0UgYS5hdHRuYW1lXG4gICAgICAgICAgRU5EIEFTIGNvbHVtbl9uYW1lLFxuICAgICAgICAgIGl4LmluZGlzdW5pcXVlIEFTIGlzX3VuaXF1ZSxcbiAgICAgICAgICBpeC5pbmRpc3ByaW1hcnkgQVMgaXNfcHJpbWFyeSxcbiAgICAgICAgICBhbS5hbW5hbWUgQVMgaW5kZXhfdHlwZSxcbiAgICAgICAgICBDT0FMRVNDRSgodS5vcHQgJiAyKSA9IDIsIEZBTFNFKSBBUyBudWxsc19maXJzdCxcbiAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICBXSEVOICh1Lm9wdCAmIDEpID0gMSBUSEVOICdERVNDJ1xuICAgICAgICAgICAgICBFTFNFICdBU0MnXG4gICAgICAgICAgRU5EIEFTIHNvcnRfb3JkZXIsXG4gICAgICAgICAgaXguaW5kbnVsbHNub3RkaXN0aW5jdCBBUyBudWxsc19ub3RfZGlzdGluY3RcbiAgICAgIEZST00gcGdfY2xhc3MgdFxuICAgICAgSk9JTiBwZ19pbmRleCBpeCBPTiB0Lm9pZCA9IGl4LmluZHJlbGlkXG4gICAgICBKT0lOIHBnX2NsYXNzIGkgT04gaS5vaWQgPSBpeC5pbmRleHJlbGlkXG4gICAgICBKT0lOIHBnX2FtIGFtIE9OIGkucmVsYW0gPSBhbS5vaWRcbiAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgV0lUSCBPUkRJTkFMSVRZIEFTIHUoYXR0bnVtLCBvcHQsIG9yZCkgT04gdHJ1ZVxuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSB0Lm9pZCBcbiAgICAgICAgICBBTkQgYS5hdHRudW0gPSB1LmF0dG51bSBcbiAgICAgICAgICBBTkQgdS5hdHRudW0gPiAwXG4gICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIFxuICAgICAgICAgICAgICB1bm5lc3QoXG4gICAgICAgICAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKSB+ICdeQVJSQVlcXFxcWycgVEhFTlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fYXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeQVJSQVlcXFxcWyguKilcXFxcXSQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXFxcMSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBFTFNFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZW3BnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCldXG4gICAgICAgICAgICAgICAgICBFTkRcbiAgICAgICAgICAgICAgKSBhcyBjb2x1bW5fZXhwclxuICAgICAgKSBwZ3Jvb25nYV9jb2wgT04gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwXG4gICAgICBXSEVSRSB0LnJlbG5hbWUgPSA/XG4gICAgICAgICAgQU5EICh1LmF0dG51bSA+IDAgT1IgKGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCkpXG4gICAgICBPUkRFUiBCWSBpLnJlbG5hbWUsIHUub3JkO1xuYDtcbiAgICBjb25zdCBpbmRleGVzID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoaW5kZXhlc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIHRjLnRhYmxlX25hbWUgPSA/XG4gICAgYDtcbiAgICBjb25zdCBmb3JlaWducyA9IChhd2FpdCBjb21wYXJlREIucmF3KGZvcmVpZ25zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIHJldHVybiBbY29sdW1ucywgaW5kZXhlcywgZm9yZWlnbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9uc+ulvCDsobDtmoztlanri4jri6QuXG4gICAqIHBnX2F0dHJpYnV0ZeydmCBhdHR0eXBtb2Tsl5DshJwg7LCo7JuQIOyImOulvCDstpTstpztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFZlY3RvckRpbWVuc2lvbnMoXG4gICAgY29tcGFyZURCOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGEuYXR0dHlwbW9kIGFzIGRpbWVuc2lvbnNcbiAgICAgIEZST00gcGdfYXR0cmlidXRlIGFcbiAgICAgIEpPSU4gcGdfY2xhc3MgYyBPTiBhLmF0dHJlbGlkID0gYy5vaWRcbiAgICAgIEpPSU4gcGdfdHlwZSB0IE9OIGEuYXR0dHlwaWQgPSB0Lm9pZFxuICAgICAgV0hFUkUgYy5yZWxuYW1lID0gP1xuICAgICAgICBBTkQgdC50eXBuYW1lID0gJ3ZlY3RvcidcbiAgICAgICAgQU5EIGEuYXR0bnVtID4gMFxuICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGFyZURCLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgLy8gYXR0dHlwbW9k7JeQ7IScIOyLpOygnCBkaW1lbnNpb25zIOqwkiDstpTstpxcbiAgICAgIGRpbWVuc2lvbnNbcm93LmNvbHVtbl9uYW1lXSA9IHJvdy5kaW1lbnNpb25zID4gMCA/IHJvdy5kaW1lbnNpb25zIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6F7J2EIOu2hOyEne2VmOyXrCBNaWdyYXRpb25Db2x1bW4g6rCd7LK066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHJlc29sdmVEQkNvbFR5cGUoXG4gICAgZGJDb2x1bW46IFBnQ29sdW1uLFxuICApOiBQaWNrPFxuICAgIE1pZ3JhdGlvbkNvbHVtbixcbiAgICBcInR5cGVcIiB8IFwibGVuZ3RoXCIgfCBcInByZWNpc2lvblwiIHwgXCJzY2FsZVwiIHwgXCJudW1iZXJUeXBlXCIgfCBcImRpbWVuc2lvbnNcIlxuICA+IHtcbiAgICBjb25zdCB7XG4gICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICBudW1lcmljX3NjYWxlLFxuICAgIH0gPSBkYkNvbHVtbjtcblxuICAgIGNvbnN0IHsgdWR0X25hbWUsIHNpbmdsZU9yQXJyYXkgfSA9ICgoKSA9PiB7XG4gICAgICBpZiAoX3VkdF9uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgc2luZ2xlT3JBcnJheTogXCJbXVwiIGFzIGNvbnN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZSxcbiAgICAgICAgc2luZ2xlT3JBcnJheTogXCJcIiBhcyBjb25zdCxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIC8vIFVVSURcbiAgICBpZiAodWR0X25hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgdXVpZCR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZWdlciB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBpbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJpZ0ludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFN0cmluZyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2YXJjaGFyXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCAmJiB7XG4gICAgICAgICAgbGVuZ3RoOiBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gIH07IC8vIFN0cmluZ1Byb3Agd2l0aG91dCBsZW5ndGhcbiAgICB9XG5cbiAgICAvLyBOdW1iZXJPck51bWVyaWMgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIG51bWJlclR5cGU6IFwibnVtZXJpY1wiLFxuICAgICAgICAuLi4obnVtZXJpY19wcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogbnVtZXJpY19zY2FsZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcInJlYWxcIiB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJkb3VibGUgcHJlY2lzaW9uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBCb29sZWFuXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImJvb2xcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJvb2xlYW4ke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFRpbWVzdGFtcHogdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidGltZXN0YW1wdHpcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGRhdGUke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBEYXRlUHJvcCDihpIgdGltZXN0YW1wdHpcbiAgICB9XG5cbiAgICAvLyBKU09OXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImpzb25cIiB8fCB1ZHRfbmFtZSA9PT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImpzb25cIiB9O1xuICAgIH1cblxuICAgIC8vIFZlY3RvciAocGd2ZWN0b3IpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZlY3RvclwiKSB7XG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J2YIOywqOybkCDsiJjripQgY29sdW1uX2RlZmF1bHTrgpgg67OE64+EIOy/vOumrOuhnCDtmZXsnbjtlbTslbwg7ZWoXG4gICAgICAvLyDtmITsnqzripQg6riw67O46rCSIDDsnLzroZwg7ISk7KCVICjsi6TsoJwgZGltZW5zaW9uc+uKlCBnZXRNaWdyYXRpb25TZXRGcm9tRELsl5DshJwg67OE64+EIOy/vOumrOuhnCDtmZXsnbgpXG4gICAgICByZXR1cm4geyB0eXBlOiBgdmVjdG9yJHtzaW5nbGVPckFycmF5fWAsIGRpbWVuc2lvbnM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyB0c3ZlY3RvciAoUG9zdGdyZVNRTCDsoITrrLgg6rKA7IOJ7JqpIO2DgOyehSlcbiAgICBpZiAodWR0X25hbWUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0c3ZlY3RvclwiIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgOuKpe2VnCBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoU6ICR7dWR0X25hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgPSBuZXcgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiZ3JvdXAiLCJQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MiLCJnZXRNaWdyYXRpb25TZXRGcm9tREIiLCJjb21wYXJlREIiLCJ0YWJsZSIsImRiQ29sdW1ucyIsImRiSW5kZXhlcyIsImRiRm9yZWlnbnMiLCJyZWFkVGFibGUiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJjb25zb2xlIiwiZXJyb3IiLCJ2ZWN0b3JEaW1lbnNpb25zIiwiZ2V0VmVjdG9yRGltZW5zaW9ucyIsImNvbHVtbnMiLCJtYXAiLCJkYkNvbHVtbiIsImRiQ29sVHlwZSIsInJlc29sdmVEQkNvbFR5cGUiLCJ0eXBlIiwiZGltZW5zaW9ucyIsImNvbHVtbl9uYW1lIiwibmFtZSIsIm51bGxhYmxlIiwiaXNfbnVsbGFibGUiLCJpc19nZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJleHByZXNzaW9uIiwiZ2VuZXJhdGlvbl9leHByZXNzaW9uIiwiY29sdW1uX2RlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsImVuZHNXaXRoIiwicmVwbGFjZUFsbCIsImRlZmF1bHRUbyIsImRiSW5kZXhlc0dyb3VwIiwiZmlsdGVyIiwiZGJJbmRleCIsImlzX3ByaW1hcnkiLCJmaW5kIiwiZGJGb3JlaWduIiwiaW5kZXhfbmFtZSIsImNvbnN0cmFpbnRfbmFtZSIsImluZGV4ZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXhOYW1lIiwiY3VycmVudEluZGV4ZXMiLCJmaXJzdEluZGV4IiwiaXNfdW5pcXVlIiwiaWR4IiwibnVsbHNGaXJzdCIsIm51bGxzX2ZpcnN0Iiwic29ydE9yZGVyIiwic29ydF9vcmRlciIsIm51bGxzTm90RGlzdGluY3QiLCJudWxsc19ub3RfZGlzdGluY3QiLCJ1c2luZyIsImluZGV4X3R5cGUiLCJmb3JlaWducyIsInRvIiwiZm9yZWlnbl90YWJsZV9uYW1lIiwiZm9yZWlnbl9jb2x1bW5fbmFtZSIsIm9uVXBkYXRlIiwibWFwQ29uc3RyYWludEFjdGlvbiIsInVwZGF0ZV9ydWxlIiwib25EZWxldGUiLCJkZWxldGVfcnVsZSIsImFjdGlvbiIsImFjdGlvbk1hcCIsIlJFU1RSSUNUIiwiQ0FTQ0FERSIsInRhYmxlTmFtZSIsImNvbHVtbnNRdWVyeSIsInJhdyIsInJvd3MiLCJsZW5ndGgiLCJpbmRleGVzUXVlcnkiLCJmb3JlaWduc1F1ZXJ5IiwicXVlcnkiLCJyZXN1bHQiLCJyb3ciLCJ1ZHRfbmFtZSIsIl91ZHRfbmFtZSIsImNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCIsIm51bWVyaWNfcHJlY2lzaW9uIiwibnVtZXJpY19zY2FsZSIsInNpbmdsZU9yQXJyYXkiLCJzdWJzdHJpbmciLCJudW1iZXJUeXBlIiwicHJlY2lzaW9uIiwic2NhbGUiLCJQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFFNUIsU0FBU0MsS0FBSyxRQUFRLFVBQVU7QUEwQ2hDLE1BQU1DO0lBQ0o7Ozs7O0dBS0MsR0FDRCxNQUFNQyxzQkFBc0JDLFNBQWUsRUFBRUMsS0FBYSxFQUFnQztRQUN4RixJQUFJQyxXQUF1QkMsV0FBc0JDO1FBQ2pELElBQUk7WUFDRixDQUFDRixXQUFXQyxXQUFXQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0wsV0FBV0M7UUFDdkUsRUFBRSxPQUFPSyxHQUFZO1lBQ25CLElBQUlBLGFBQWFDLFNBQVNELEVBQUVFLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLG9CQUFvQjtnQkFDL0QsT0FBTztZQUNUO1lBQ0FDLFFBQVFDLEtBQUssQ0FBQ0w7WUFDZCxPQUFPO1FBQ1Q7UUFFQSwyQkFBMkI7UUFDM0IsTUFBTU0sbUJBQW1CLE1BQU0s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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messaging-types.d.ts","sourceRoot":"","sources":["../../src/naite/messaging-types.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yBAAiB,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"messaging-types.d.ts","sourceRoot":"","sources":["../../src/naite/messaging-types.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yBAAiB,mBAAmB,CAAC;IACnC,KAAY,oBAAoB,GAAG;QACjC,IAAI,EAAE,WAAW,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAY,sBAAsB,GAAG;QACnC,IAAI,EAAE,aAAa,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,UAAU,CAAC;IAEf,KAAY,kBAAkB,GAAG;QAC/B,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,KAAY,YAAY,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;IAE9F,KAAY,UAAU,GAAG;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IAEF,KAAY,SAAS,GAAG;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,KAAY,UAAU,GAAG;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,SAAS,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH"}
|
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
* 이 파일은 cartanova-ai/sonamu와 cartanova-ai/vscode-sonamu에서 공통으로 사용됩니다.
|
|
5
5
|
*/ export { };
|
|
6
6
|
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9tZXNzYWdpbmctdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbi8qKlxuICogU29uYW11IGV4dGVuc2lvbuqzvCDqs7XsnKDtlZjripQgTmFpdGUg66mU7Iuc7KeVIOq0gOugqCDtg4DsnoUg7KCV7J2Y65Ok7J6F64uI64ukLlxuICog7J20IO2MjOydvOydgCBjYXJ0YW5vdmEtYWkvc29uYW117JmAIGNhcnRhbm92YS1haS92c2NvZGUtc29uYW117JeQ7IScIOqzte2GteycvOuhnCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgTmFpdGVNZXNzYWdpbmdUeXBlcyB7XG4gIGV4cG9ydCB0eXBlIE5haXRlUnVuU3RhcnRNZXNzYWdlID0ge1xuICAgIHR5cGU6IFwicnVuL3N0YXJ0XCI7XG4gICAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTmFpdGVUZXN0UmVzdWx0TWVzc2FnZSA9IHtcbiAgICB0eXBlOiBcInRlc3QvcmVzdWx0XCI7XG4gICAgcmVjZWl2ZWRBdDogc3RyaW5nO1xuICB9ICYgVGVzdFJlc3VsdDtcblxuICBleHBvcnQgdHlwZSBOYWl0ZVJ1bkVuZE1lc3NhZ2UgPSB7XG4gICAgdHlwZTogXCJydW4vZW5kXCI7XG4gICAgZW5kZWRBdDogc3RyaW5nO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE5haXRlTWVzc2FnZSA9IE5haXRlUnVuU3RhcnRNZXNzYWdlIHwgTmFpdGVUZXN0UmVzdWx0TWVzc2FnZSB8IE5haXRlUnVuRW5kTWVzc2FnZTtcblxuICBleHBvcnQgdHlwZSBOYWl0ZVRyYWNlID0ge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICBsaW5lTnVtYmVyOiBudW1iZXI7XG4gICAgYXQ6IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBUZXN0RXJyb3IgPSB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHN0YWNrPzogc3RyaW5nO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFRlc3RSZXN1bHQgPSB7XG4gICAgc3VpdGVOYW1lOiBzdHJpbmc7XG4gICAgc3VpdGVGaWxlUGF0aD86IHN0cmluZztcbiAgICB0ZXN0TmFtZTogc3RyaW5nO1xuICAgIHRlc3RGaWxlUGF0aDogc3RyaW5nO1xuICAgIHRlc3RMaW5lOiBudW1iZXI7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgZHVyYXRpb246IG51bWJlcjtcbiAgICBlcnJvcj86IFRlc3RFcnJvcjtcbiAgICB0cmFjZXM6IE5haXRlVHJhY2VbXTtcbiAgICByZWNlaXZlZEF0OiBzdHJpbmc7XG4gIH07XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0ZBQWdGO0FBRWhGOzs7Q0FHQyxHQUNELFdBMkNDIn0=
|
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
* NaiteReporter
|
|
3
3
|
*
|
|
4
4
|
* 테스트 결과와 Trace 정보를 Unix Socket으로 VS Code extension에 전달합니다.
|
|
5
|
-
* extension이 ~/.sonamu/naite.sock에 소켓 서버를 열어둡니다.
|
|
5
|
+
* extension이 ~/.sonamu/naite-{hash}.sock에 소켓 서버를 열어둡니다.
|
|
6
|
+
*
|
|
7
|
+
* 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
|
|
6
8
|
*
|
|
7
9
|
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
8
10
|
*/
|
|
9
11
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */
|
|
10
12
|
import type { NaiteMessagingTypes } from "./messaging-types";
|
|
11
13
|
declare class NaiteReporterClass {
|
|
14
|
+
private socketPath;
|
|
12
15
|
private socket;
|
|
13
16
|
private connected;
|
|
14
17
|
private buffer;
|
|
@@ -24,17 +27,17 @@ declare class NaiteReporterClass {
|
|
|
24
27
|
* beforeAll에서 호출합니다.
|
|
25
28
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
26
29
|
*/
|
|
27
|
-
startTestRun(): void
|
|
30
|
+
startTestRun(): Promise<void>;
|
|
28
31
|
/**
|
|
29
32
|
* afterEach에서 호출합니다.
|
|
30
33
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
31
34
|
*/
|
|
32
|
-
reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): void
|
|
35
|
+
reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): Promise<void>;
|
|
33
36
|
/**
|
|
34
37
|
* afterAll에서 호출합니다.
|
|
35
38
|
* 테스트 run 종료를 알립니다.
|
|
36
39
|
*/
|
|
37
|
-
endTestRun(): void
|
|
40
|
+
endTestRun(): Promise<void>;
|
|
38
41
|
}
|
|
39
42
|
export declare const NaiteReporter: NaiteReporterClass;
|
|
40
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,oFAAoF;AAOpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAyB7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAalB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;IAYhB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
|
|
@@ -2,24 +2,48 @@
|
|
|
2
2
|
* NaiteReporter
|
|
3
3
|
*
|
|
4
4
|
* 테스트 결과와 Trace 정보를 Unix Socket으로 VS Code extension에 전달합니다.
|
|
5
|
-
* extension이 ~/.sonamu/naite.sock에 소켓 서버를 열어둡니다.
|
|
5
|
+
* extension이 ~/.sonamu/naite-{hash}.sock에 소켓 서버를 열어둡니다.
|
|
6
|
+
*
|
|
7
|
+
* 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
|
|
6
8
|
*
|
|
7
9
|
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
8
|
-
*/ /** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */ import {
|
|
10
|
+
*/ /** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */ import { createHash } from "crypto";
|
|
11
|
+
import { connect } from "net";
|
|
9
12
|
import { homedir } from "os";
|
|
10
13
|
import { join } from "path";
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
import { findApiRootPath } from "../utils/utils.js";
|
|
15
|
+
/**
|
|
16
|
+
* sonamu.config.ts 경로를 받아서 프로젝트별 고유 해시를 생성합니다.
|
|
17
|
+
* 익스텐션과 동일한 방식으로 계산해야 합니다.
|
|
18
|
+
*/ function getProjectHash(configPath) {
|
|
19
|
+
return createHash("md5").update(configPath).digest("hex").slice(0, 8);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 현재 프로젝트의 소켓 경로를 계산합니다.
|
|
23
|
+
* Sonamu.apiRootPath가 설정된 후에 호출해야 합니다.
|
|
24
|
+
*/ function getSocketPath() {
|
|
25
|
+
// sonamu.config.ts의 절대 경로 계산
|
|
26
|
+
// apiRootPath는 /project/api 형태이고, config는 /project/api/src/sonamu.config.ts에 있음
|
|
27
|
+
const configPath = join(findApiRootPath(), "src", "sonamu.config.ts");
|
|
28
|
+
const hash = getProjectHash(configPath);
|
|
29
|
+
return process.platform === "win32" ? `\\\\.\\pipe\\naite-${hash}` : join(homedir(), ".sonamu", `naite-${hash}.sock`);
|
|
30
|
+
}
|
|
13
31
|
class NaiteReporterClass {
|
|
32
|
+
socketPath = null;
|
|
14
33
|
socket = null;
|
|
15
34
|
connected = false;
|
|
16
35
|
buffer = [];
|
|
17
36
|
/**
|
|
18
37
|
* 소켓 연결 시도
|
|
19
|
-
*/ ensureConnection() {
|
|
20
|
-
if (this.connected || this.socket)
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
*/ async ensureConnection() {
|
|
39
|
+
if (this.connected || this.socket) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
return new Promise((res, rej)=>{
|
|
43
|
+
if (!this.socketPath) {
|
|
44
|
+
this.socketPath = getSocketPath();
|
|
45
|
+
}
|
|
46
|
+
this.socket = connect(this.socketPath);
|
|
23
47
|
this.socket.on("connect", ()=>{
|
|
24
48
|
this.connected = true;
|
|
25
49
|
// 버퍼에 쌓인 메시지 전송
|
|
@@ -27,25 +51,25 @@ class NaiteReporterClass {
|
|
|
27
51
|
this.socket?.write(msg);
|
|
28
52
|
}
|
|
29
53
|
this.buffer = [];
|
|
54
|
+
res();
|
|
30
55
|
});
|
|
31
|
-
this.socket.on("error", ()=>{
|
|
56
|
+
this.socket.on("error", (e)=>{
|
|
32
57
|
// 연결 실패 무시 (extension이 꺼져있을 수 있음)
|
|
33
58
|
this.connected = false;
|
|
34
59
|
this.socket = null;
|
|
60
|
+
rej(e);
|
|
35
61
|
});
|
|
36
62
|
this.socket.on("close", ()=>{
|
|
37
63
|
this.connected = false;
|
|
38
64
|
this.socket = null;
|
|
39
65
|
});
|
|
40
|
-
}
|
|
41
|
-
// 연결 실패 무시
|
|
42
|
-
}
|
|
66
|
+
});
|
|
43
67
|
}
|
|
44
68
|
/**
|
|
45
69
|
* 메시지 전송 (줄바꿈으로 구분)
|
|
46
|
-
*/ send(data) {
|
|
70
|
+
*/ async send(data) {
|
|
47
71
|
const msg = `${JSON.stringify(data)}\n`;
|
|
48
|
-
this.ensureConnection();
|
|
72
|
+
await this.ensureConnection().catch((_)=>{});
|
|
49
73
|
if (this.connected && this.socket) {
|
|
50
74
|
this.socket.write(msg);
|
|
51
75
|
} else {
|
|
@@ -56,11 +80,11 @@ class NaiteReporterClass {
|
|
|
56
80
|
/**
|
|
57
81
|
* beforeAll에서 호출합니다.
|
|
58
82
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
59
|
-
*/ startTestRun() {
|
|
83
|
+
*/ async startTestRun() {
|
|
60
84
|
if (process.env.CI) {
|
|
61
85
|
return;
|
|
62
86
|
}
|
|
63
|
-
this.send({
|
|
87
|
+
await this.send({
|
|
64
88
|
type: "run/start",
|
|
65
89
|
startedAt: new Date().toISOString()
|
|
66
90
|
});
|
|
@@ -68,11 +92,11 @@ class NaiteReporterClass {
|
|
|
68
92
|
/**
|
|
69
93
|
* afterEach에서 호출합니다.
|
|
70
94
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
71
|
-
*/ reportTestResult(result) {
|
|
95
|
+
*/ async reportTestResult(result) {
|
|
72
96
|
if (process.env.CI) {
|
|
73
97
|
return;
|
|
74
98
|
}
|
|
75
|
-
this.send({
|
|
99
|
+
await this.send({
|
|
76
100
|
type: "test/result",
|
|
77
101
|
receivedAt: new Date().toISOString(),
|
|
78
102
|
...result
|
|
@@ -81,11 +105,11 @@ class NaiteReporterClass {
|
|
|
81
105
|
/**
|
|
82
106
|
* afterAll에서 호출합니다.
|
|
83
107
|
* 테스트 run 종료를 알립니다.
|
|
84
|
-
*/ endTestRun() {
|
|
108
|
+
*/ async endTestRun() {
|
|
85
109
|
if (process.env.CI) {
|
|
86
110
|
return;
|
|
87
111
|
}
|
|
88
|
-
this.send({
|
|
112
|
+
await this.send({
|
|
89
113
|
type: "run/end",
|
|
90
114
|
endedAt: new Date().toISOString()
|
|
91
115
|
});
|
|
@@ -99,4 +123,4 @@ class NaiteReporterClass {
|
|
|
99
123
|
}
|
|
100
124
|
export const NaiteReporter = new NaiteReporterClass();
|
|
101
125
|
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9uYWl0ZS1yZXBvcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5haXRlUmVwb3J0ZXJcbiAqXG4gKiDthYzsiqTtirgg6rKw6rO87JmAIFRyYWNlIOygleuztOulvCBVbml4IFNvY2tldOycvOuhnCBWUyBDb2RlIGV4dGVuc2lvbuyXkCDsoITri6ztlanri4jri6QuXG4gKiBleHRlbnNpb27snbQgfi8uc29uYW11L25haXRlLXtoYXNofS5zb2Nr7JeQIOyGjOy8kyDshJzrsoTrpbwg7Je07Ja065Gh64uI64ukLlxuICpcbiAqIO2UhOuhnOygne2KuOuzhOuhnCDqs6DsnKDtlZwg7IaM7LyT7J2EIOyCrOyaqe2VmOq4sCDsnITtlbQgc29uYW11LmNvbmZpZy50cyDqsr3roZzsnZgg7ZW07Iuc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiBmcyBtb2NrIOy2qeuPjOydhCDtlLztlZjquLAg7JyE7ZW0IG5ldCDrqqjrk4jrp4wg7IKs7Jqp7ZWp64uI64ukLlxuICovXG4vKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBjb25uZWN0LCB0eXBlIFNvY2tldCB9IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IE5haXRlTWVzc2FnaW5nVHlwZXMgfSBmcm9tIFwiLi9tZXNzYWdpbmctdHlwZXNcIjtcblxuLyoqXG4gKiBzb25hbXUuY29uZmlnLnRzIOqyveuhnOulvCDrsJvslYTshJwg7ZSE66Gc7KCd7Yq467OEIOqzoOycoCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog7J217Iqk7YWQ7IWY6rO8IOuPmeydvO2VnCDrsKnsi53snLzroZwg6rOE7IKw7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdEhhc2goY29uZmlnUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGNvbmZpZ1BhdGgpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbn1cblxuLyoqXG4gKiDtmITsnqwg7ZSE66Gc7KCd7Yq47J2YIOyGjOy8kyDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICogU29uYW11LmFwaVJvb3RQYXRo6rCAIOyEpOygleuQnCDtm4Tsl5Ag7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ja2V0UGF0aCgpOiBzdHJpbmcge1xuICAvLyBzb25hbXUuY29uZmlnLnRz7J2YIOygiOuMgCDqsr3roZwg6rOE7IKwXG4gIC8vIGFwaVJvb3RQYXRo64qUIC9wcm9qZWN0L2FwaSDtmJXtg5zsnbTqs6AsIGNvbmZpZ+uKlCAvcHJvamVjdC9hcGkvc3JjL3NvbmFtdS5jb25maWcudHPsl5Ag7J6I7J2MXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGZpbmRBcGlSb290UGF0aCgpLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG4gIGNvbnN0IGhhc2ggPSBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoKTtcblxuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBgXFxcXFxcXFwuXFxcXHBpcGVcXFxcbmFpdGUtJHtoYXNofWBcbiAgICA6IGpvaW4oaG9tZWRpcigpLCBcIi5zb25hbXVcIiwgYG5haXRlLSR7aGFzaH0uc29ja2ApO1xufVxuXG5jbGFzcyBOYWl0ZVJlcG9ydGVyQ2xhc3Mge1xuICBwcml2YXRlIHNvY2tldFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiDshozsvJMg7Jew6rKwIOyLnOuPhFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UGF0aCA9IGdldFNvY2tldFBhdGgoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ja2V0ID0gY29ubmVjdCh0aGlzLnNvY2tldFBhdGgpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIC8vIOuyhO2NvOyXkCDsjJPsnbgg66mU7Iuc7KeAIOyghOyGoVxuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgIHRoaXMuc29ja2V0Py53cml0ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHJlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgICAgLy8g7Jew6rKwIOyLpO2MqCDrrLTsi5wgKGV4dGVuc2lvbuydtCDqurzsoLjsnojsnYQg7IiYIOyeiOydjClcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICByZWooZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDsoITshqEgKOykhOuwlOq/iOycvOuhnCDqtazrtoQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoZGF0YTogTmFpdGVNZXNzYWdpbmdUeXBlcy5OYWl0ZU1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtc2cgPSBgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCkuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQud3JpdGUobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7Jew6rKwIOuMgOq4sCDspJHsnbTrqbQg67KE7Y287JeQIOyggOyepVxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyLnOyekeydhCDslYzrpr3ri4jri6QgKOuNsOydtO2EsCDtgbTrpqzslrQg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIHN0YXJ0VGVzdFJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJydW4vc3RhcnRcIixcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFmdGVyRWFjaOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsvIDsnbTsiqQg6rKw6rO866W8IHRyYWNlc+yZgCDtlajqu5gg7KCE7Iah7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVwb3J0VGVzdFJlc3VsdChcbiAgICByZXN1bHQ6IE9taXQ8TmFpdGVNZXNzYWdpbmdUeXBlcy5UZXN0UmVzdWx0LCBcInJlY2VpdmVkQXRcIj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInRlc3QvcmVzdWx0XCIsXG4gICAgICByZWNlaXZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5yZXN1bHQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYWZ0ZXJBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlUmVwb3J0ZXIgPSBuZXcgTmFpdGVSZXBvcnRlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsImNvbm5lY3QiLCJob21lZGlyIiwiam9pbiIsImZpbmRBcGlSb290UGF0aCIsImdldFByb2plY3RIYXNoIiwiY29uZmlnUGF0aCIsInVwZGF0ZSIsImRpZ2VzdCIsInNsaWNlIiwiZ2V0U29ja2V0UGF0aCIsImhhc2giLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJOYWl0ZVJlcG9ydGVyQ2xhc3MiLCJzb2NrZXRQYXRoIiwic29ja2V0IiwiY29ubmVjdGVkIiwiYnVmZmVyIiwiZW5zdXJlQ29ubmVjdGlvbiIsIlByb21pc2UiLCJyZXMiLCJyZWoiLCJvbiIsIm1zZyIsIndyaXRlIiwiZSIsInNlbmQiLCJkYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImNhdGNoIiwiXyIsInB1c2giLCJzdGFydFRlc3RSdW4iLCJlbnYiLCJDSSIsInR5cGUiLCJzdGFydGVkQXQiLCJEYXRlIiwidG9JU09TdHJpbmciLCJyZXBvcnRUZXN0UmVzdWx0IiwicmVzdWx0IiwicmVjZWl2ZWRBdCIsImVuZFRlc3RSdW4iLCJlbmRlZEF0IiwiZW5kIiwiTmFpdGVSZXBvcnRlciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztDQVNDLEdBQ0Qsa0ZBQWtGLEdBRWxGLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBQ3BDLFNBQVNDLE9BQU8sUUFBcUIsTUFBTTtBQUMzQyxTQUFTQyxPQUFPLFFBQVEsS0FBSztBQUM3QixTQUFTQyxJQUFJLFFBQVEsT0FBTztBQUM1QixTQUFTQyxlQUFlLFFBQVEsb0JBQWlCO0FBR2pEOzs7Q0FHQyxHQUNELFNBQVNDLGVBQWVDLFVBQWtCO0lBQ3hDLE9BQU9OLFdBQVcsT0FBT08sTUFBTSxDQUFDRCxZQUFZRSxNQUFNLENBQUMsT0FBT0MsS0FBSyxDQUFDLEdBQUc7QUFDckU7QUFFQTs7O0NBR0MsR0FDRCxTQUFTQztJQUNQLDZCQUE2QjtJQUM3QixnRkFBZ0Y7SUFD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
|
package/dist/naite/naite.js
CHANGED
|
@@ -266,7 +266,7 @@ export class NaiteClass {
|
|
|
266
266
|
// 이로 인해 "직렬화 가능한 값들만 허용"하는 제약이 생깁니다.
|
|
267
267
|
//
|
|
268
268
|
// 이 제약을 의식하여 Naite.t에 직렬화 가능한 값만 넘기게 할 수도 있었지만, 그렇게 하면 불편해질 것 같아서 하지 않았습니다.
|
|
269
|
-
// 따라서 현재 Naite.t는 모든 값을 받을 수 있게 되어 있습니다.
|
|
269
|
+
// 따라서 현재 Naite.t는 모든 값을 받을 수 있게 되어 있습니다.
|
|
270
270
|
// 대신 이렇게(getAllTraces) 그 값들을 빼낼 때 JSON.stringify를 사용하여 강제로 직렬화 가능하게 만들었습니다,,
|
|
271
271
|
for (const trace of traces){
|
|
272
272
|
const check = isSerializable(trace.data);
|
|
@@ -313,4 +313,4 @@ export class NaiteClass {
|
|
|
313
313
|
}
|
|
314
314
|
export const Naite = new NaiteClass();
|
|
315
315
|
|
|
316
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9uYWl0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5cbmltcG9ydCB7IGdldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgaXNTZXJpYWxpemFibGUgfSBmcm9tIFwiLi4vdXRpbHMvb2JqZWN0LXV0aWxzXCI7XG5cbi8vIFN0YWNrRnJhbWUg7YOA7J6FXG5pbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZmlsZVBhdGg6IHN0cmluZzsgLy8gXCIvVXNlcnMvLi4uL3N5bmNlci50c1wiIOuYkOuKlCBcIm5vZGU6aW50ZXJuYWwvLi4uXCJcbiAgbGluZU51bWJlcjogbnVtYmVyOyAvLyBUUyDtjIzsnbwg6riw7KSAIOudvOyduCDrsojtmLhcbn1cblxuLy8gTmFpdGVUcmFjZSDtg4DsnoVcbmludGVyZmFjZSBOYWl0ZVRyYWNlIHtcbiAga2V5OiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbiAgc3RhY2s6IFN0YWNrRnJhbWVbXTsgLy8g7L2c7Iqk7YOdIOygleuztFxuICBhdDogRGF0ZTtcbn1cblxuLy8gTmFpdGUudOqwgCDsoIDsnqXrkJjripQg7YOA7J6FICjtla3sg4Eg67Cw7Je066GcIO2GteydvClcbmV4cG9ydCB0eXBlIE5haXRlU3RvcmUgPSBNYXA8c3RyaW5nLCBOYWl0ZVRyYWNlW10+O1xuXG4vKipcbiAqIOy9nOyKpO2DneydhCDtjIzsi7HtlZjsl6wgU3RhY2tGcmFtZSDrsLDsl7TroZwg67CY7ZmYXG4gKiAtIGV4dHJhY3RDYWxsU3RhY2sg7J6Q7Iug6rO8IE5haXRlLnTripQg7KCc7Jm4XG4gKiAtIHJ1bldpdGhDb250ZXh0L3J1bldpdGhNb2NrQ29udGV4dCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsooXro4xcbiAqIC0gbm9kZTog64K067aAIOqyveuhnOuKlCDtj6ztlajtlZjrkJgsIGxpbmVOdW1iZXLripQgcGF0aOyXkCA6IO2PrO2VqCDsi5wg67aZ7J207KeAIOyViuydjFxuICovXG5mdW5jdGlvbiBleHRyYWN0Q2FsbFN0YWNrKCk6IFN0YWNrRnJhbWVbXSB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gIGlmICghc3RhY2spIHJldHVybiBbXTtcblxuICBjb25zdCBsaW5lcyA9IHN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuXG4gIC8vIOy9nOyKpO2DnSDqtazsobA6XG4gIC8vIFswXTogXCJFcnJvclwiXG4gIC8vIFsxXTogXCJhdCBleHRyYWN0Q2FsbFN0YWNrXCJcbiAgLy8gWzJdOiBcImF0IE5haXRlLnRcIlxuICAvLyBbM106IOyLpOygnCDtmLjstpwg7JyE7LmY67aA7YSwIOyLnOyekVxuICBjb25zdCBmcmFtZXMgPSBsaW5lc1xuICAgIC5zbGljZSgzKVxuICAgIC5tYXAocGFyc2VTdGFja0ZyYW1lKVxuICAgIC5maWx0ZXIoKGZyYW1lKTogZnJhbWUgaXMgU3RhY2tGcmFtZSA9PiBmcmFtZSAhPT0gbnVsbCk7XG5cbiAgLy8gcnVuV2l0aENvbnRleHQg6rOE7Je0IO2VqOyImCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsnpDrpbTquLBcbiAgY29uc3QgY29udGV4dEluZGV4ID0gZnJhbWVzLmZpbmRJbmRleChcbiAgICAoZikgPT5cbiAgICAgIGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhDb250ZXh0XCIpIHx8IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhNb2NrQ29udGV4dFwiKSxcbiAgKTtcblxuICByZXR1cm4gY29udGV4dEluZGV4ID49IDAgPyBmcmFtZXMuc2xpY2UoMCwgY29udGV4dEluZGV4ICsgMSkgOiBmcmFtZXM7XG59XG5cbi8qKlxuICog7L2c7Iqk7YOdIO2VnCDspITsnYQg7YyM7IuxXG4gKiDtmJXsi50xOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAqIO2YleyLnTI6IFwiYXQgZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXJcIiAo7J2166qFIO2VqOyImC/rqqjrk4gg66CI67KoKVxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWNrRnJhbWUobGluZTogc3RyaW5nKTogU3RhY2tGcmFtZSB8IG51bGwge1xuICAvLyDtjKjthLQxOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAgY29uc3QgbWF0Y2hXaXRoRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pXFxzK1xcKCguKz8pOihcXGQrKTpcXGQrXFwpLyk7XG4gIGlmIChtYXRjaFdpdGhGdW5jKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbWF0Y2hXaXRoRnVuY1sxXTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoV2l0aEZ1bmNbMl07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoV2l0aEZ1bmNbM107XG5cbiAgICAvLyBmaWxlUGF0aOyXkCDsnbTrr7ggOuqwgCDtj6ztlajrkJjslrQg7J6I7Jy866m0ICjsmIg6IFwibm9kZTppbnRlcm5hbC8uLi5cIilcbiAgICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgICByZXR1cm4geyBmdW5jdGlvbk5hbWUsIGZpbGVQYXRoLCBsaW5lTnVtYmVyOiAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g7Yyo7YS0MjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjtlajsiJjrqoUg7JeG7J2MKVxuICBjb25zdCBtYXRjaE5vRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pOihcXGQrKTpcXGQrJC8pO1xuICBpZiAobWF0Y2hOb0Z1bmMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoTm9GdW5jWzFdO1xuICAgIGNvbnN0IGxpbmVOdW1iZXJTdHIgPSBtYXRjaE5vRnVuY1syXTtcblxuICAgIHJldHVybiB7XG4gICAgICBmdW5jdGlvbk5hbWU6IG51bGwsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGxpbmVOdW1iZXI6IE51bWJlci5wYXJzZUludChsaW5lTnVtYmVyU3RyLCAxMCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAqIOyYiOyLnDpcbiAqIC0gXCJzeW5jZXI6KlwiIOKGkiBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6Kjp1c2VyXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnVzZXJcIiDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6KlwiIOKGkiBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZTpzZXJ2aWNlXCIg66ek7LmtXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKGtleTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5UGFydHMgPSBrZXkuc3BsaXQoXCI6XCIpO1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiOlwiKTtcblxuICAvLyDrp4jsp4Drp4nsnbQgKiDihpIgcHJlZml4IOunpOy5rSAo6ri47J20IOustOq0gClcbiAgLy8g7JiIOiBcInN5bmNlcjoqXCLripQgXCJzeW5jZXI6YVwiLCBcInN5bmNlcjphOmJcIiDrqqjrkZAg66ek7LmtXG4gIGlmIChwYXR0ZXJuUGFydHNbcGF0dGVyblBhcnRzLmxlbmd0aCAtIDFdID09PSBcIipcIikge1xuICAgIGNvbnN0IHByZWZpeFBhcnRzID0gcGF0dGVyblBhcnRzLnNsaWNlKDAsIC0xKTtcbiAgICAvLyBwcmVmaXjqsIAg66qo65GQIOydvOy5mO2VmOuKlOyngCDtmZXsnbhcbiAgICByZXR1cm4gcHJlZml4UGFydHMuZXZlcnkoKHBhcnQsIGkpID0+IHBhcnQgPT09IGtleVBhcnRzW2ldKTtcbiAgfVxuXG4gIC8vIOq4uOydtOqwgCDqsJnslYTslbwg7ZWoXG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSBrZXlQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDqsIEg7YyM7Yq46rCAICog65iQ64qUIOygle2Zle2eiCDsnbzsuZhcbiAgcmV0dXJuIHBhdHRlcm5QYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0gXCIqXCIgfHwgcGFydCA9PT0ga2V5UGFydHNbaV0pO1xufVxuXG4vKipcbiAqIE5haXRlUXVlcnkg7YG0656Y7IqkXG4gKiDssrTsnbTri53snYQg7Ya17ZWcIHRyYWNlIO2VhO2EsOungSDrsI8g7KGw7ZqMXG4gKi9cbmV4cG9ydCBjbGFzcyBOYWl0ZVF1ZXJ5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFjZXM6IE5haXRlVHJhY2VbXSkge31cblxuICAvKipcbiAgICog7YyM7J2866qF7Jy866GcIO2VhO2EsOungVxuICAgKiBAcGFyYW0gZmlsZU5hbWUg7YyM7J2866qFICjsmIg6IFwic3luY2VyLnRlc3QudHNcIilcbiAgICovXG4gIGZyb21GaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodCkgPT5cbiAgICAgIHQuc3RhY2suc29tZSgoZnJhbWUpID0+IGZyYW1lLmZpbGVQYXRoLmVuZHNXaXRoKGAvJHtmaWxlTmFtZX1gKSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZ1bmNOYW1lIO2VqOyImOuqhSAoaW5jbHVkZXMg7LK07YGsKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5mcm9tICdkaXJlY3QnID0g7KeB7KCRIO2YuOy2nOunjCwgJ2luZGlyZWN0JyA9IOqwhOygkSDtmLjstpzrp4wsICdib3RoJyA9IOuqqOuRkFxuICAgKi9cbiAgZnJvbUZ1bmN0aW9uKFxuICAgIGZ1bmNOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBmcm9tOiBcImRpcmVjdFwiIHwgXCJpbmRpcmVjdFwiIHwgXCJib3RoXCIgfSA9IHsgZnJvbTogXCJib3RoXCIgfSxcbiAgKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmZyb20gPT09IFwiZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMF3rp4wg7ZmV7J24ICjsp4HsoJEg7Zi47LacKVxuICAgICAgICByZXR1cm4gdC5zdGFja1swXT8uZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImluZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMStd7JeQ7IScIO2ZleyduCAo6rCE7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2suc2xpY2UoMSkuc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgICB9XG4gICAgICAvLyDsoITssrQg7Iqk7YOd7JeQ7IScIO2ZleyduFxuICAgICAgcmV0dXJuIHQuc3RhY2suc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjbDsnbTthLAg6rK966GcIOq4sOuwmCDtlYTthLDrp4FcbiAgICogQHBhcmFtIHBhdGggcmFkYXNoIGdldCDqsr3roZwgKOyYiDogXCJkYXRhLnVzZXJJZFwiKVxuICAgKiBAcGFyYW0gb3BlcmF0b3Ig67mE6rWQIOyXsOyCsOyekFxuICAgKiBAcGFyYW0gdmFsdWUg67mE6rWQ6rCSXG4gICAqL1xuICB3aGVyZShwYXRoOiBzdHJpbmcsIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IgfCBcImluY2x1ZGVzXCIsIHZhbHVlOiBhbnkpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodHJhY2UpID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGdldCh0cmFjZSwgcGF0aCkgYXMgYW55O1xuXG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA+IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgIHJldHVybiBhY3R1YWwgPCB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj49XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA+PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA8PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIiE9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCAhPT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJpbmNsdWRlc1wiOlxuICAgICAgICAgIHJldHVybiB0eXBlb2YgYWN0dWFsID09PSBcInN0cmluZ1wiICYmIGFjdHVhbC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShmaWx0ZXJlZCk7XG4gIH1cblxuICAvKipcbiAgICog7KCE7LK0IOuNsOydtO2EsCDrsLDsl7Qg67CY7ZmYXG4gICAqL1xuICByZXN1bHQoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnRyYWNlcy5tYXAoKHQpID0+IHQuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICog7LKrIOuyiOynuCDrjbDsnbTthLAg67CY7ZmYXG4gICAqL1xuICBmaXJzdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1swXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsp4Drp4kg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgbGFzdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1t0aGlzLnRyYWNlcy5sZW5ndGggLSAxXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBu67KI7Ke4IOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1tpbmRleF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog7JuQ67O4IHRyYWNlIOuwsOyXtCDrsJjtmZggKOuUlOuyhOq5hS9OYWl0ZVZpZXdlcuyaqSlcbiAgICovXG4gIGdldFRyYWNlcygpOiBOYWl0ZVRyYWNlW10ge1xuICAgIHJldHVybiB0aGlzLnRyYWNlcztcbiAgfVxufVxuXG4vLyBOYWl0ZSDsi7HquIDthLQg6rCd7LK0ICjstpTtm4QgbG9nZ2VyIOyXsOqysCDrk7HsnZgg7IOB7YOcIOq0gOumrCDtlYTsmpTshLEg6rOg66CkKVxuZXhwb3J0IGNsYXNzIE5haXRlQ2xhc3Mge1xuICAvLyDthYzsiqTtirgg66Gc6re4IOq4sOuhnVxuICB0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55IC8q7J2066CH6rKMIOuwm+ydgCDqsJLsnbQgTmFpdGVUcmFjZeuhnCDsoIDsnqXrkJjslrQg7J6I64uk6rCAIOy2lO2bhOyXkCB2aXRlc3Tsl5DqsowgbWV0YeulvCDthrXtlbQg64SY6rKo7KC4IO2UhOuhnOyEuOyKpOqwhCDthrXsi6DsnYQg7Ya17ZW0IOyngeugrO2ZlOuQmOyWtOyVvCDtlZjripQg7KCQ7J2EIOqzoOugpO2VmOyYgOydhCDrlYwg7Jes6riw7JeQIFNlcmlhbGl6YWJsZeydhCDsjajshJwg7KCc7ZWc7J2EIOuRmCDsiJjrj4Qg7J6I7KeA66eMLCDsgqzsmqnsg4HsnZgg7Y647J2Y66W8IOyDneqwge2VmOyXrCBhbnnroZwg67Cb7Iq164uI64ukLiovLFxuICApIHtcbiAgICAvLyDsnbQgdCDtlajsiJjripQg7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOunjCDsnpHrj5ntlbTslbwg7ZWp64uI64ukLlxuICAgIC8vIOq3uOumrOqzoCDthYzsiqTtirgg7ZmY6rK9IO2MkOuLqOyXkCDsmZwgaXNUZXN0KCkg7ZWo7IiY66W8IOyCrOyaqe2VmOyngCDslYrslZjrg5DrqbTsmpQsLFxuICAgIC8vIOydtOugh+qyjCDtlZjripTqsowg7Jyg7Yu4IO2VqOyImCDrtojrn6zsmYDshJwg7IKs7Jqp7ZWY64qUIOqyg+uztOuLpCDsobDquIjsnbTrgpjrp4gg67mg66W8IOqygyDqsJnslZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDsvZzsiqTtg50g7IiY7KeRXG4gICAgICBjb25zdCBzdGFjayA9IGV4dHJhY3RDYWxsU3RhY2soKTtcblxuICAgICAgY29uc3QgdHJhY2U6IE5haXRlVHJhY2UgPSB7XG4gICAgICAgIGtleTogbmFtZSxcbiAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBhdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIO2VreyDgSDrsLDsl7TroZwg6rSA66asXG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0b3JlLmdldChuYW1lKSA/PyBbXTtcbiAgICAgIHN0b3JlLnNldChuYW1lLCBbLi4uZXhpc3RpbmcsIHRyYWNlXSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250ZXh0IOyXhuuKlCDsg4Htmansl5DshJwgTmFpdGUudCDtmLjstpxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICoga2V5IOuYkOuKlCB3aWxkY2FyZCDtjKjthLTsnLzroZwgdHJhY2Ug7KGw7ZqMXG4gICAqIO2VreyDgSBOYWl0ZVF1ZXJ5IOuwmO2ZmO2VmOyXrCDssrTsnbTri50g6rCA64qlXG4gICAqL1xuICBnZXQoa2V5UGF0dGVybjogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KFtdKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDsl4bsnLzrqbQgZXhhY3QgbWF0Y2hcbiAgICBpZiAoIWtleVBhdHRlcm4uaW5jbHVkZXMoXCIqXCIpKSB7XG4gICAgICBjb25zdCB0cmFjZXMgPSBzdG9yZS5nZXQoa2V5UGF0dGVybikgPz8gW107XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkodHJhY2VzKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDtjKjthLQg66ek7LmtXG4gICAgY29uc3QgYWxsVHJhY2VzOiBOYWl0ZVRyYWNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2Ygc3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAobWF0Y2hlc1BhdHRlcm4oa2V5LCBrZXlQYXR0ZXJuKSkge1xuICAgICAgICBhbGxUcmFjZXMucHVzaCguLi50cmFjZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShhbGxUcmFjZXMpO1xuICB9XG5cbiAgLy8g7KCE7LK0IOumrOyKpO2KuCDqsIDsoLjsmKTquLBcbiAgZ2V0QWxsKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvLyBOYWl0ZVRyYWNlIOuwsOyXtOydhCBkYXRh66eMIOy2lOy2nO2VmOyXrCDrsJjtmZhcbiAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2YgY29udGV4dC5uYWl0ZVN0b3JlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwibW9jazpcIikpIHtcbiAgICAgICAgLy8gTW9jayDshKTsoJXsnYAg6re464yA66GcIOuwmO2ZmFxuICAgICAgICByZXN1bHRba2V5XSA9IHRyYWNlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2AIGRhdGHrp4wg7LaU7LacXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzLm1hcCgodDogTmFpdGVUcmFjZSkgPT4gdC5kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsiqTthqDslrTsl5Ag65Ok7Ja07J6I642YIO2KuOugiOydtOyKpOulvCDqs6DrjIDroZwg6rq864K07Ji164uI64ukLlxuICAgKiDsnbTrlYwg6rCS65Ok7J2AIOuqqOuRkCDsp4HroKztmZQg6rCA64ql7ZWcIOyDge2DnOuhnCDrgpjqsIDqsowg65Cp64uI64ukLlxuICAgKiDthYzsiqTtirgg7KCV67O07JmAIO2VqOq7mCBleHRlbnNpb25z7JeQIOuztOuCvCDsmqnrj4TroZwg66eM65Ok7JeI7Iq164uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVHJhY2VzKCk6IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogYW55O1xuICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgbGluZU51bWJlcjogbnVtYmVyO1xuICAgIGF0OiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2VzID0gQXJyYXkuZnJvbShjb250ZXh0Lm5haXRlU3RvcmUudmFsdWVzKCkpLmZsYXQoKTtcblxuICAgIC8vIOyngeugrO2ZlCDrtojqsIDriqXtlZwg6rCS7J20IOyhtOyerO2VnOuLpOuptCDsnbTrpbwg64yA66y47Ked66eM7ZWY6rKMIOyVjOugpOykjeuLiOuLpCEg6re47LmY66eMIOyVjOumrOq4sOunjCDtlZjqs6Ag6re464OlIOyngOuCmOqwkeuLiOuLpCDjhY7jhY5cbiAgICAvLyDsmZwg7KeB66Cs7ZmU6rCAIOykkeyalO2VnOqwgD8g7J20KGdldEFsbFRyYWNlcykg7Zi47Lac7J2YIOqysOqzvOuKlCDsmbjrtoDroZwg64KY6rCA6rKMIOuQmOuKlOuNsCxcbiAgICAvLyDsnbTrlYwg7KO8IOyaqeuPhOqwgCB2aXRlc3TsnZggdGFzay5tZXRhIO2VhOuTnOulvCDthrXtlbQgYWZ0ZXJFYWNo7JeQ7IScIFNvbmFtdSBleHRlbnNpb27snLzroZwg7KCE64us7ZWY64qUIOqyg+yeheuLiOuLpC5cbiAgICAvLyDsl6zquLDshJwgbWV0YSDtlYTrk5zsl5Ag64u06ri0IOuCtOyaqeydgCDtlITroZzshLjsiqTqsIQg7Ya17IugKHByb2Nlc3Muc2VuZCkg65iQ64qUIOyKpOugiOuTnOqwhCDthrXsi6AobWVzc2FnZSBwb3J0KeydhCDthrXtlbQg7KCE64us65CY7Ja07JW8IO2VmOuKlOuNsCxcbiAgICAvLyDsnbTroZwg7J247ZW0IFwi7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsJLrk6Trp4wg7ZeI7JqpXCLtlZjripQg7KCc7JW97J20IOyDneq5geuLiOuLpC5cbiAgICAvL1xuICAgIC8vIOydtCDsoJzslb3snYQg7J2Y7Iud7ZWY7JesIE5haXRlLnTsl5Ag7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsJLrp4wg64SY6riw6rKMIO2VoCDsiJjrj4Qg7J6I7JeI7KeA66eMLCDqt7jroIfqsowg7ZWY66m0IOu2iO2OuO2VtOyniCDqsoMg6rCZ7JWE7IScIO2VmOyngCDslYrslZjsirXri4jri6QuXG4gICAgLy8g65Sw65287IScIO2YhOyerCBOYWl0ZS5064qUIOuqqOuToCDqsJLsnYQg67Cb7J2EIOyImCDsnojqsowg65CY7Ja0IOyeiOyKteuLiOuLpC4gXG4gICAgLy8g64yA7IugIOydtOugh+qyjChnZXRBbGxUcmFjZXMpIOq3uCDqsJLrk6TsnYQg67m864K8IOuVjCBKU09OLnN0cmluZ2lmeeulvCDsgqzsmqntlZjsl6wg6rCV7KCc66GcIOyngeugrO2ZlCDqsIDriqXtlZjqsowg66eM65Ok7JeI7Iq164uI64ukLCxcbiAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgY29uc3QgY2hlY2sgPSBpc1NlcmlhbGl6YWJsZSh0cmFjZS5kYXRhKTtcbiAgICAgIGlmICghY2hlY2sudmFsaWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgXCLilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZdcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgW05haXRlXSBOb24tc2VyaWFsaXphYmxlIHZhbHVlIGRldGVjdGVkISAgICAgICAgICAgICAgICAgICAgICDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIGDilZEgIEtleTogJHt0cmFjZS5rZXkucGFkRW5kKDU3KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIFJlYXNvbjogJHsoY2hlY2sucmVhc29uID8/IFwidW5rbm93blwiKS5zbGljZSgwLCA1NCkucGFkRW5kKDU0KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExvY2F0aW9uOiAkeyh0cmFjZS5zdGFja1swXT8uZmlsZVBhdGggPz8gXCJ1bmtub3duXCIpLnNsaWNlKC01MSkucGFkRW5kKDUyKX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExpbmU6ICR7U3RyaW5nKHRyYWNlLnN0YWNrWzBdPy5saW5lTnVtYmVyID8/IDApLnBhZEVuZCg1Nil94pWRXFxuYCArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBOYWl0ZS50KCkgYWNjZXB0cyBhbnkgdHlwZSBvZiB2YWx1ZS4gSG93ZXZlciwgdmFsdWVzIHdpbGwgICAgIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBiZSBzZXJpYWxpemVkIHRvIEpTT04gd2hlbiBleHBvcnRlZCB2aWEgTmFpdGUuZ2V0QWxsVHJhY2VzKCkuIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdXFxuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlcy5tYXAoKHRyYWNlKSA9PiAoe1xuICAgICAga2V5OiB0cmFjZS5rZXksXG4gICAgICB2YWx1ZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmFjZS5kYXRhID8/IFwiXCIpKSwgLy8g7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsoPrp4wg64Ko6riw66Ck64qUIOuIiOusvOqyqOyatCDrhbjroKUsLCDslYjqt7jrn6zrqbQgdGFzay5tZXRh7JeQIOuTpOyWtOqwgOyEnCDtlITroZzshLjsiqTqsIQg7Ya17IugIO2VoCDrlYwg66y47KCcIOyDneq4sOqxsOuToOyalCwsXG4gICAgICBmaWxlUGF0aDogdHJhY2Uuc3RhY2tbMF0/LmZpbGVQYXRoID8/IFwiXCIsXG4gICAgICBsaW5lTnVtYmVyOiB0cmFjZS5zdGFja1swXT8ubGluZU51bWJlciA/PyAwLFxuICAgICAgYXQ6IHRyYWNlLmF0LnRvSVNPU3RyaW5nKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLy8g7Yq57KCVIO2CpCDsgq3soJztlZjquLBcbiAgZGVsKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRleHQubmFpdGVTdG9yZS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIGNyZWF0ZVN0b3JlKCk6IE5haXRlU3RvcmUge1xuICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPigpO1xuICB9XG5cbiAgLy8g7J2867CYIOuhnOq3uCDroIjrsqhcbiAgZChfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbREVCVUddICR7X21lc3NhZ2V9YCk7XG4gIH1cbiAgaShfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbSU5GT10gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICB3KF9tZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBMb2dnZXIg7Jew6rKwXG4gICAgY29uc29sZS5sb2coYFtXQVJOXSAke19tZXNzYWdlfWApO1xuICB9XG4gIGUoX21lc3NhZ2U6IHN0cmluZykge1xuICAgIC8vIFRPRE86IExvZ2dlciDsl7DqsrBcbiAgICBjb25zb2xlLmxvZyhgW0VSUk9SXSAke19tZXNzYWdlfWApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBOYWl0ZSA9IG5ldyBOYWl0ZUNsYXNzKCk7XG4iXSwibmFtZXMiOlsiZ2V0IiwiU29uYW11IiwiaXNTZXJpYWxpemFibGUiLCJleHRyYWN0Q2FsbFN0YWNrIiwic3RhY2siLCJFcnJvciIsImxpbmVzIiwic3BsaXQiLCJmcmFtZXMiLCJzbGljZSIsIm1hcCIsInBhcnNlU3RhY2tGcmFtZSIsImZpbHRlciIsImZyYW1lIiwiY29udGV4dEluZGV4IiwiZmluZEluZGV4IiwiZiIsImZ1bmN0aW9uTmFtZSIsImluY2x1ZGVzIiwibGluZSIsIm1hdGNoV2l0aEZ1bmMiLCJtYXRjaCIsImZpbGVQYXRoIiwibGluZU51bWJlclN0ciIsImxpbmVOdW1iZXIiLCJOdW1iZXIiLCJwYXJzZUludCIsIm1hdGNoTm9GdW5jIiwibWF0Y2hlc1BhdHRlcm4iLCJrZXkiLCJwYXR0ZXJuIiwia2V5UGFydHMiLCJwYXR0ZXJuUGFydHMiLCJsZW5ndGgiLCJwcmVmaXhQYXJ0cyIsImV2ZXJ5IiwicGFydCIsImkiLCJOYWl0ZVF1ZXJ5IiwidHJhY2VzIiwiZnJvbUZpbGUiLCJmaWxlTmFtZSIsImZpbHRlcmVkIiwidCIsInNvbWUiLCJlbmRzV2l0aCIsImZyb21GdW5jdGlvbiIsImZ1bmNOYW1lIiwib3B0aW9ucyIsImZyb20iLCJ3aGVyZSIsInBhdGgiLCJvcGVyYXRvciIsInZhbHVlIiwidHJhY2UiLCJhY3R1YWwiLCJyZXN1bHQiLCJkYXRhIiwiZmlyc3QiLCJsYXN0IiwiYXQiLCJpbmRleCIsImdldFRyYWNlcyIsIk5haXRlQ2xhc3MiLCJuYW1lIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY29udGV4dCIsImdldENvbnRleHQiLCJzdG9yZSIsIm5haXRlU3RvcmUiLCJEYXRlIiwiZXhpc3RpbmciLCJzZXQiLCJrZXlQYXR0ZXJuIiwiYWxsVHJhY2VzIiwiZW50cmllcyIsInB1c2giLCJnZXRBbGwiLCJzdGFydHNXaXRoIiwiZ2V0QWxsVHJhY2VzIiwiQXJyYXkiLCJ2YWx1ZXMiLCJmbGF0IiwiY2hlY2siLCJ2YWxpZCIsImNvbnNvbGUiLCJ3YXJuIiwicGFkRW5kIiwicmVhc29uIiwiU3RyaW5nIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwidG9JU09TdHJpbmciLCJkZWwiLCJkZWxldGUiLCJjcmVhdGVTdG9yZSIsIk1hcCIsImQiLCJfbWVzc2FnZSIsImxvZyIsInciLCJlIiwiTmFpdGUiXSwibWFwcGluZ3MiOiJBQUFBLGtGQUFrRixHQUVsRixTQUFTQSxHQUFHLFFBQVEsVUFBVTtBQUM5QixTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBRXZDLFNBQVNDLGNBQWMsUUFBUSwyQkFBd0I7QUFvQnZEOzs7OztDQUtDLEdBQ0QsU0FBU0M7SUFDUCxNQUFNQyxRQUFRLElBQUlDLFFBQVFELEtBQUs7SUFDL0IsSUFBSSxDQUFDQSxPQUFPLE9BQU8sRUFBRTtJQUVyQixNQUFNRSxRQUFRRixNQUFNRyxLQUFLLENBQUM7SUFFMUIsVUFBVTtJQUNWLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixNQUFNQyxTQUFTRixNQUNaRyxLQUFLLENBQUMsR0FDTkMsR0FBRyxDQUFDQyxpQkFDSkMsTUFBTSxDQUFDLENBQUNDLFFBQStCQSxVQUFVO0lBRXBELG9DQUFvQztJQUNwQyxNQUFNQyxlQUFlTixPQUFPTyxTQUFTLENBQ25DLENBQUNDLElBQ0NBLEVBQUVDLFlBQVksRUFBRUMsU0FBUyxxQkFBcUJGLEVBQUVDLFlBQVksRUFBRUMsU0FBUztJQUczRSxPQUFPSixnQkFBZ0IsSUFBSU4sT0FBT0MsS0FBSyxDQUFDLEdBQUdLLGVBQWUsS0FBS047QUFDakU7QUFFQTs7OztDQUlDLEdBQ0QsU0FBU0csZ0JBQWdCUSxJQUFZO0lBQ25DLDREQUE0RDtJQUM1RCxNQUFNQyxnQkFBZ0JELEtBQUtFLEtBQUssQ0FBQztJQUNqQyxJQUFJRCxlQUFlO1FBQ2pCLE1BQU1ILGVBQWVHLGFBQWEs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
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9uYWl0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5cbmltcG9ydCB7IGdldCB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgaXNTZXJpYWxpemFibGUgfSBmcm9tIFwiLi4vdXRpbHMvb2JqZWN0LXV0aWxzXCI7XG5cbi8vIFN0YWNrRnJhbWUg7YOA7J6FXG5pbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZmlsZVBhdGg6IHN0cmluZzsgLy8gXCIvVXNlcnMvLi4uL3N5bmNlci50c1wiIOuYkOuKlCBcIm5vZGU6aW50ZXJuYWwvLi4uXCJcbiAgbGluZU51bWJlcjogbnVtYmVyOyAvLyBUUyDtjIzsnbwg6riw7KSAIOudvOyduCDrsojtmLhcbn1cblxuLy8gTmFpdGVUcmFjZSDtg4DsnoVcbmludGVyZmFjZSBOYWl0ZVRyYWNlIHtcbiAga2V5OiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbiAgc3RhY2s6IFN0YWNrRnJhbWVbXTsgLy8g7L2c7Iqk7YOdIOygleuztFxuICBhdDogRGF0ZTtcbn1cblxuLy8gTmFpdGUudOqwgCDsoIDsnqXrkJjripQg7YOA7J6FICjtla3sg4Eg67Cw7Je066GcIO2GteydvClcbmV4cG9ydCB0eXBlIE5haXRlU3RvcmUgPSBNYXA8c3RyaW5nLCBOYWl0ZVRyYWNlW10+O1xuXG4vKipcbiAqIOy9nOyKpO2DneydhCDtjIzsi7HtlZjsl6wgU3RhY2tGcmFtZSDrsLDsl7TroZwg67CY7ZmYXG4gKiAtIGV4dHJhY3RDYWxsU3RhY2sg7J6Q7Iug6rO8IE5haXRlLnTripQg7KCc7Jm4XG4gKiAtIHJ1bldpdGhDb250ZXh0L3J1bldpdGhNb2NrQ29udGV4dCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsooXro4xcbiAqIC0gbm9kZTog64K067aAIOqyveuhnOuKlCDtj6ztlajtlZjrkJgsIGxpbmVOdW1iZXLripQgcGF0aOyXkCA6IO2PrO2VqCDsi5wg67aZ7J207KeAIOyViuydjFxuICovXG5mdW5jdGlvbiBleHRyYWN0Q2FsbFN0YWNrKCk6IFN0YWNrRnJhbWVbXSB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gIGlmICghc3RhY2spIHJldHVybiBbXTtcblxuICBjb25zdCBsaW5lcyA9IHN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuXG4gIC8vIOy9nOyKpO2DnSDqtazsobA6XG4gIC8vIFswXTogXCJFcnJvclwiXG4gIC8vIFsxXTogXCJhdCBleHRyYWN0Q2FsbFN0YWNrXCJcbiAgLy8gWzJdOiBcImF0IE5haXRlLnRcIlxuICAvLyBbM106IOyLpOygnCDtmLjstpwg7JyE7LmY67aA7YSwIOyLnOyekVxuICBjb25zdCBmcmFtZXMgPSBsaW5lc1xuICAgIC5zbGljZSgzKVxuICAgIC5tYXAocGFyc2VTdGFja0ZyYW1lKVxuICAgIC5maWx0ZXIoKGZyYW1lKTogZnJhbWUgaXMgU3RhY2tGcmFtZSA9PiBmcmFtZSAhPT0gbnVsbCk7XG5cbiAgLy8gcnVuV2l0aENvbnRleHQg6rOE7Je0IO2VqOyImCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsnpDrpbTquLBcbiAgY29uc3QgY29udGV4dEluZGV4ID0gZnJhbWVzLmZpbmRJbmRleChcbiAgICAoZikgPT5cbiAgICAgIGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhDb250ZXh0XCIpIHx8IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhNb2NrQ29udGV4dFwiKSxcbiAgKTtcblxuICByZXR1cm4gY29udGV4dEluZGV4ID49IDAgPyBmcmFtZXMuc2xpY2UoMCwgY29udGV4dEluZGV4ICsgMSkgOiBmcmFtZXM7XG59XG5cbi8qKlxuICog7L2c7Iqk7YOdIO2VnCDspITsnYQg7YyM7IuxXG4gKiDtmJXsi50xOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAqIO2YleyLnTI6IFwiYXQgZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXJcIiAo7J2166qFIO2VqOyImC/rqqjrk4gg66CI67KoKVxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWNrRnJhbWUobGluZTogc3RyaW5nKTogU3RhY2tGcmFtZSB8IG51bGwge1xuICAvLyDtjKjthLQxOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAgY29uc3QgbWF0Y2hXaXRoRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pXFxzK1xcKCguKz8pOihcXGQrKTpcXGQrXFwpLyk7XG4gIGlmIChtYXRjaFdpdGhGdW5jKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbWF0Y2hXaXRoRnVuY1sxXTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoV2l0aEZ1bmNbMl07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoV2l0aEZ1bmNbM107XG5cbiAgICAvLyBmaWxlUGF0aOyXkCDsnbTrr7ggOuqwgCDtj6ztlajrkJjslrQg7J6I7Jy866m0ICjsmIg6IFwibm9kZTppbnRlcm5hbC8uLi5cIilcbiAgICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgICByZXR1cm4geyBmdW5jdGlvbk5hbWUsIGZpbGVQYXRoLCBsaW5lTnVtYmVyOiAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g7Yyo7YS0MjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjtlajsiJjrqoUg7JeG7J2MKVxuICBjb25zdCBtYXRjaE5vRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pOihcXGQrKTpcXGQrJC8pO1xuICBpZiAobWF0Y2hOb0Z1bmMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoTm9GdW5jWzFdO1xuICAgIGNvbnN0IGxpbmVOdW1iZXJTdHIgPSBtYXRjaE5vRnVuY1syXTtcblxuICAgIHJldHVybiB7XG4gICAgICBmdW5jdGlvbk5hbWU6IG51bGwsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGxpbmVOdW1iZXI6IE51bWJlci5wYXJzZUludChsaW5lTnVtYmVyU3RyLCAxMCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAqIOyYiOyLnDpcbiAqIC0gXCJzeW5jZXI6KlwiIOKGkiBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6Kjp1c2VyXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnVzZXJcIiDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6KlwiIOKGkiBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZTpzZXJ2aWNlXCIg66ek7LmtXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKGtleTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5UGFydHMgPSBrZXkuc3BsaXQoXCI6XCIpO1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiOlwiKTtcblxuICAvLyDrp4jsp4Drp4nsnbQgKiDihpIgcHJlZml4IOunpOy5rSAo6ri47J20IOustOq0gClcbiAgLy8g7JiIOiBcInN5bmNlcjoqXCLripQgXCJzeW5jZXI6YVwiLCBcInN5bmNlcjphOmJcIiDrqqjrkZAg66ek7LmtXG4gIGlmIChwYXR0ZXJuUGFydHNbcGF0dGVyblBhcnRzLmxlbmd0aCAtIDFdID09PSBcIipcIikge1xuICAgIGNvbnN0IHByZWZpeFBhcnRzID0gcGF0dGVyblBhcnRzLnNsaWNlKDAsIC0xKTtcbiAgICAvLyBwcmVmaXjqsIAg66qo65GQIOydvOy5mO2VmOuKlOyngCDtmZXsnbhcbiAgICByZXR1cm4gcHJlZml4UGFydHMuZXZlcnkoKHBhcnQsIGkpID0+IHBhcnQgPT09IGtleVBhcnRzW2ldKTtcbiAgfVxuXG4gIC8vIOq4uOydtOqwgCDqsJnslYTslbwg7ZWoXG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSBrZXlQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDqsIEg7YyM7Yq46rCAICog65iQ64qUIOygle2Zle2eiCDsnbzsuZhcbiAgcmV0dXJuIHBhdHRlcm5QYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0gXCIqXCIgfHwgcGFydCA9PT0ga2V5UGFydHNbaV0pO1xufVxuXG4vKipcbiAqIE5haXRlUXVlcnkg7YG0656Y7IqkXG4gKiDssrTsnbTri53snYQg7Ya17ZWcIHRyYWNlIO2VhO2EsOungSDrsI8g7KGw7ZqMXG4gKi9cbmV4cG9ydCBjbGFzcyBOYWl0ZVF1ZXJ5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFjZXM6IE5haXRlVHJhY2VbXSkge31cblxuICAvKipcbiAgICog7YyM7J2866qF7Jy866GcIO2VhO2EsOungVxuICAgKiBAcGFyYW0gZmlsZU5hbWUg7YyM7J2866qFICjsmIg6IFwic3luY2VyLnRlc3QudHNcIilcbiAgICovXG4gIGZyb21GaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodCkgPT5cbiAgICAgIHQuc3RhY2suc29tZSgoZnJhbWUpID0+IGZyYW1lLmZpbGVQYXRoLmVuZHNXaXRoKGAvJHtmaWxlTmFtZX1gKSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZ1bmNOYW1lIO2VqOyImOuqhSAoaW5jbHVkZXMg7LK07YGsKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5mcm9tICdkaXJlY3QnID0g7KeB7KCRIO2YuOy2nOunjCwgJ2luZGlyZWN0JyA9IOqwhOygkSDtmLjstpzrp4wsICdib3RoJyA9IOuqqOuRkFxuICAgKi9cbiAgZnJvbUZ1bmN0aW9uKFxuICAgIGZ1bmNOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBmcm9tOiBcImRpcmVjdFwiIHwgXCJpbmRpcmVjdFwiIHwgXCJib3RoXCIgfSA9IHsgZnJvbTogXCJib3RoXCIgfSxcbiAgKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmZyb20gPT09IFwiZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMF3rp4wg7ZmV7J24ICjsp4HsoJEg7Zi47LacKVxuICAgICAgICByZXR1cm4gdC5zdGFja1swXT8uZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImluZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMStd7JeQ7IScIO2ZleyduCAo6rCE7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2suc2xpY2UoMSkuc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgICB9XG4gICAgICAvLyDsoITssrQg7Iqk7YOd7JeQ7IScIO2ZleyduFxuICAgICAgcmV0dXJuIHQuc3RhY2suc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjbDsnbTthLAg6rK966GcIOq4sOuwmCDtlYTthLDrp4FcbiAgICogQHBhcmFtIHBhdGggcmFkYXNoIGdldCDqsr3roZwgKOyYiDogXCJkYXRhLnVzZXJJZFwiKVxuICAgKiBAcGFyYW0gb3BlcmF0b3Ig67mE6rWQIOyXsOyCsOyekFxuICAgKiBAcGFyYW0gdmFsdWUg67mE6rWQ6rCSXG4gICAqL1xuICB3aGVyZShwYXRoOiBzdHJpbmcsIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IgfCBcImluY2x1ZGVzXCIsIHZhbHVlOiBhbnkpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodHJhY2UpID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGdldCh0cmFjZSwgcGF0aCkgYXMgYW55O1xuXG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA+IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgIHJldHVybiBhY3R1YWwgPCB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj49XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA+PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA8PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIiE9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCAhPT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJpbmNsdWRlc1wiOlxuICAgICAgICAgIHJldHVybiB0eXBlb2YgYWN0dWFsID09PSBcInN0cmluZ1wiICYmIGFjdHVhbC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShmaWx0ZXJlZCk7XG4gIH1cblxuICAvKipcbiAgICog7KCE7LK0IOuNsOydtO2EsCDrsLDsl7Qg67CY7ZmYXG4gICAqL1xuICByZXN1bHQoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnRyYWNlcy5tYXAoKHQpID0+IHQuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICog7LKrIOuyiOynuCDrjbDsnbTthLAg67CY7ZmYXG4gICAqL1xuICBmaXJzdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1swXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsp4Drp4kg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgbGFzdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1t0aGlzLnRyYWNlcy5sZW5ndGggLSAxXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBu67KI7Ke4IOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1tpbmRleF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog7JuQ67O4IHRyYWNlIOuwsOyXtCDrsJjtmZggKOuUlOuyhOq5hS9OYWl0ZVZpZXdlcuyaqSlcbiAgICovXG4gIGdldFRyYWNlcygpOiBOYWl0ZVRyYWNlW10ge1xuICAgIHJldHVybiB0aGlzLnRyYWNlcztcbiAgfVxufVxuXG4vLyBOYWl0ZSDsi7HquIDthLQg6rCd7LK0ICjstpTtm4QgbG9nZ2VyIOyXsOqysCDrk7HsnZgg7IOB7YOcIOq0gOumrCDtlYTsmpTshLEg6rOg66CkKVxuZXhwb3J0IGNsYXNzIE5haXRlQ2xhc3Mge1xuICAvLyDthYzsiqTtirgg66Gc6re4IOq4sOuhnVxuICB0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55IC8q7J2066CH6rKMIOuwm+ydgCDqsJLsnbQgTmFpdGVUcmFjZeuhnCDsoIDsnqXrkJjslrQg7J6I64uk6rCAIOy2lO2bhOyXkCB2aXRlc3Tsl5DqsowgbWV0YeulvCDthrXtlbQg64SY6rKo7KC4IO2UhOuhnOyEuOyKpOqwhCDthrXsi6DsnYQg7Ya17ZW0IOyngeugrO2ZlOuQmOyWtOyVvCDtlZjripQg7KCQ7J2EIOqzoOugpO2VmOyYgOydhCDrlYwg7Jes6riw7JeQIFNlcmlhbGl6YWJsZeydhCDsjajshJwg7KCc7ZWc7J2EIOuRmCDsiJjrj4Qg7J6I7KeA66eMLCDsgqzsmqnsg4HsnZgg7Y647J2Y66W8IOyDneqwge2VmOyXrCBhbnnroZwg67Cb7Iq164uI64ukLiovLFxuICApIHtcbiAgICAvLyDsnbQgdCDtlajsiJjripQg7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOunjCDsnpHrj5ntlbTslbwg7ZWp64uI64ukLlxuICAgIC8vIOq3uOumrOqzoCDthYzsiqTtirgg7ZmY6rK9IO2MkOuLqOyXkCDsmZwgaXNUZXN0KCkg7ZWo7IiY66W8IOyCrOyaqe2VmOyngCDslYrslZjrg5DrqbTsmpQsLFxuICAgIC8vIOydtOugh+qyjCDtlZjripTqsowg7Jyg7Yu4IO2VqOyImCDrtojrn6zsmYDshJwg7IKs7Jqp7ZWY64qUIOqyg+uztOuLpCDsobDquIjsnbTrgpjrp4gg67mg66W8IOqygyDqsJnslZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDsvZzsiqTtg50g7IiY7KeRXG4gICAgICBjb25zdCBzdGFjayA9IGV4dHJhY3RDYWxsU3RhY2soKTtcblxuICAgICAgY29uc3QgdHJhY2U6IE5haXRlVHJhY2UgPSB7XG4gICAgICAgIGtleTogbmFtZSxcbiAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBhdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIO2VreyDgSDrsLDsl7TroZwg6rSA66asXG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0b3JlLmdldChuYW1lKSA/PyBbXTtcbiAgICAgIHN0b3JlLnNldChuYW1lLCBbLi4uZXhpc3RpbmcsIHRyYWNlXSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250ZXh0IOyXhuuKlCDsg4Htmansl5DshJwgTmFpdGUudCDtmLjstpxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICoga2V5IOuYkOuKlCB3aWxkY2FyZCDtjKjthLTsnLzroZwgdHJhY2Ug7KGw7ZqMXG4gICAqIO2VreyDgSBOYWl0ZVF1ZXJ5IOuwmO2ZmO2VmOyXrCDssrTsnbTri50g6rCA64qlXG4gICAqL1xuICBnZXQoa2V5UGF0dGVybjogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KFtdKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDsl4bsnLzrqbQgZXhhY3QgbWF0Y2hcbiAgICBpZiAoIWtleVBhdHRlcm4uaW5jbHVkZXMoXCIqXCIpKSB7XG4gICAgICBjb25zdCB0cmFjZXMgPSBzdG9yZS5nZXQoa2V5UGF0dGVybikgPz8gW107XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkodHJhY2VzKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDtjKjthLQg66ek7LmtXG4gICAgY29uc3QgYWxsVHJhY2VzOiBOYWl0ZVRyYWNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2Ygc3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAobWF0Y2hlc1BhdHRlcm4oa2V5LCBrZXlQYXR0ZXJuKSkge1xuICAgICAgICBhbGxUcmFjZXMucHVzaCguLi50cmFjZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShhbGxUcmFjZXMpO1xuICB9XG5cbiAgLy8g7KCE7LK0IOumrOyKpO2KuCDqsIDsoLjsmKTquLBcbiAgZ2V0QWxsKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvLyBOYWl0ZVRyYWNlIOuwsOyXtOydhCBkYXRh66eMIOy2lOy2nO2VmOyXrCDrsJjtmZhcbiAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2YgY29udGV4dC5uYWl0ZVN0b3JlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwibW9jazpcIikpIHtcbiAgICAgICAgLy8gTW9jayDshKTsoJXsnYAg6re464yA66GcIOuwmO2ZmFxuICAgICAgICByZXN1bHRba2V5XSA9IHRyYWNlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2AIGRhdGHrp4wg7LaU7LacXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzLm1hcCgodDogTmFpdGVUcmFjZSkgPT4gdC5kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsiqTthqDslrTsl5Ag65Ok7Ja07J6I642YIO2KuOugiOydtOyKpOulvCDqs6DrjIDroZwg6rq864K07Ji164uI64ukLlxuICAgKiDsnbTrlYwg6rCS65Ok7J2AIOuqqOuRkCDsp4HroKztmZQg6rCA64ql7ZWcIOyDge2DnOuhnCDrgpjqsIDqsowg65Cp64uI64ukLlxuICAgKiDthYzsiqTtirgg7KCV67O07JmAIO2VqOq7mCBleHRlbnNpb25z7JeQIOuztOuCvCDsmqnrj4TroZwg66eM65Ok7JeI7Iq164uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVHJhY2VzKCk6IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogYW55O1xuICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgbGluZU51bWJlcjogbnVtYmVyO1xuICAgIGF0OiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2VzID0gQXJyYXkuZnJvbShjb250ZXh0Lm5haXRlU3RvcmUudmFsdWVzKCkpLmZsYXQoKTtcblxuICAgIC8vIOyngeugrO2ZlCDrtojqsIDriqXtlZwg6rCS7J20IOyhtOyerO2VnOuLpOuptCDsnbTrpbwg64yA66y47Ked66eM7ZWY6rKMIOyVjOugpOykjeuLiOuLpCEg6re47LmY66eMIOyVjOumrOq4sOunjCDtlZjqs6Ag6re464OlIOyngOuCmOqwkeuLiOuLpCDjhY7jhY5cbiAgICAvLyDsmZwg7KeB66Cs7ZmU6rCAIOykkeyalO2VnOqwgD8g7J20KGdldEFsbFRyYWNlcykg7Zi47Lac7J2YIOqysOqzvOuKlCDsmbjrtoDroZwg64KY6rCA6rKMIOuQmOuKlOuNsCxcbiAgICAvLyDsnbTrlYwg7KO8IOyaqeuPhOqwgCB2aXRlc3TsnZggdGFzay5tZXRhIO2VhOuTnOulvCDthrXtlbQgYWZ0ZXJFYWNo7JeQ7IScIFNvbmFtdSBleHRlbnNpb27snLzroZwg7KCE64us7ZWY64qUIOqyg+yeheuLiOuLpC5cbiAgICAvLyDsl6zquLDshJwgbWV0YSDtlYTrk5zsl5Ag64u06ri0IOuCtOyaqeydgCDtlITroZzshLjsiqTqsIQg7Ya17IugKHByb2Nlc3Muc2VuZCkg65iQ64qUIOyKpOugiOuTnOqwhCDthrXsi6AobWVzc2FnZSBwb3J0KeydhCDthrXtlbQg7KCE64us65CY7Ja07JW8IO2VmOuKlOuNsCxcbiAgICAvLyDsnbTroZwg7J247ZW0IFwi7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsJLrk6Trp4wg7ZeI7JqpXCLtlZjripQg7KCc7JW97J20IOyDneq5geuLiOuLpC5cbiAgICAvL1xuICAgIC8vIOydtCDsoJzslb3snYQg7J2Y7Iud7ZWY7JesIE5haXRlLnTsl5Ag7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsJLrp4wg64SY6riw6rKMIO2VoCDsiJjrj4Qg7J6I7JeI7KeA66eMLCDqt7jroIfqsowg7ZWY66m0IOu2iO2OuO2VtOyniCDqsoMg6rCZ7JWE7IScIO2VmOyngCDslYrslZjsirXri4jri6QuXG4gICAgLy8g65Sw65287IScIO2YhOyerCBOYWl0ZS5064qUIOuqqOuToCDqsJLsnYQg67Cb7J2EIOyImCDsnojqsowg65CY7Ja0IOyeiOyKteuLiOuLpC5cbiAgICAvLyDrjIDsi6Ag7J2066CH6rKMKGdldEFsbFRyYWNlcykg6re4IOqwkuuTpOydhCDrubzrgrwg65WMIEpTT04uc3RyaW5naWZ566W8IOyCrOyaqe2VmOyXrCDqsJXsoJzroZwg7KeB66Cs7ZmUIOqwgOuKpe2VmOqyjCDrp4zrk6Tsl4jsirXri4jri6QsLFxuICAgIGZvciAoY29uc3QgdHJhY2Ugb2YgdHJhY2VzKSB7XG4gICAgICBjb25zdCBjaGVjayA9IGlzU2VyaWFsaXphYmxlKHRyYWNlLmRhdGEpO1xuICAgICAgaWYgKCFjaGVjay52YWxpZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICBcIuKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVl1xcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBbTmFpdGVdIE5vbi1zZXJpYWxpemFibGUgdmFsdWUgZGV0ZWN0ZWQhICAgICAgICAgICAgICAgICAgICAgIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjXFxuXCIgK1xuICAgICAgICAgICAgYOKVkSAgS2V5OiAke3RyYWNlLmtleS5wYWRFbmQoNTcpfeKVkVxcbmAgK1xuICAgICAgICAgICAgYOKVkSAgUmVhc29uOiAkeyhjaGVjay5yZWFzb24gPz8gXCJ1bmtub3duXCIpLnNsaWNlKDAsIDU0KS5wYWRFbmQoNTQpfeKVkVxcbmAgK1xuICAgICAgICAgICAgYOKVkSAgTG9jYXRpb246ICR7KHRyYWNlLnN0YWNrWzBdPy5maWxlUGF0aCA/PyBcInVua25vd25cIikuc2xpY2UoLTUxKS5wYWRFbmQoNTIpfeKVkVxcbmAgK1xuICAgICAgICAgICAgYOKVkSAgTGluZTogJHtTdHJpbmcodHJhY2Uuc3RhY2tbMF0/LmxpbmVOdW1iZXIgPz8gMCkucGFkRW5kKDU2KX3ilZFcXG5gICtcbiAgICAgICAgICAgIFwi4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjXFxuXCIgK1xuICAgICAgICAgICAgXCLilZEgIE5haXRlLnQoKSBhY2NlcHRzIGFueSB0eXBlIG9mIHZhbHVlLiBIb3dldmVyLCB2YWx1ZXMgd2lsbCAgICAg4pWRXFxuXCIgK1xuICAgICAgICAgICAgXCLilZEgIGJlIHNlcmlhbGl6ZWQgdG8gSlNPTiB3aGVuIGV4cG9ydGVkIHZpYSBOYWl0ZS5nZXRBbGxUcmFjZXMoKS4g4pWRXFxuXCIgK1xuICAgICAgICAgICAgXCLilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ1cXG5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2VzLm1hcCgodHJhY2UpID0+ICh7XG4gICAgICBrZXk6IHRyYWNlLmtleSxcbiAgICAgIHZhbHVlOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRyYWNlLmRhdGEgPz8gXCJcIikpLCAvLyDsp4HroKztmZQg6rCA64ql7ZWcIOqyg+unjCDrgqjquLDroKTripQg64iI66y86rKo7Jq0IOuFuOugpSwsIOyViOq3uOufrOuptCB0YXNrLm1ldGHsl5Ag65Ok7Ja06rCA7IScIO2UhOuhnOyEuOyKpOqwhCDthrXsi6Ag7ZWgIOuVjCDrrLjsoJwg7IOd6riw6rGw65Og7JqULCxcbiAgICAgIGZpbGVQYXRoOiB0cmFjZS5zdGFja1swXT8uZmlsZVBhdGggPz8gXCJcIixcbiAgICAgIGxpbmVOdW1iZXI6IHRyYWNlLnN0YWNrWzBdPy5saW5lTnVtYmVyID8/IDAsXG4gICAgICBhdDogdHJhY2UuYXQudG9JU09TdHJpbmcoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvLyDtirnsoJUg7YKkIOyCreygnO2VmOq4sFxuICBkZWwoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC5uYWl0ZVN0b3JlLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgY3JlYXRlU3RvcmUoKTogTmFpdGVTdG9yZSB7XG4gICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBOYWl0ZVRyYWNlW10+KCk7XG4gIH1cblxuICAvLyDsnbzrsJgg66Gc6re4IOugiOuyqFxuICBkKF9tZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBMb2dnZXIg7Jew6rKwXG4gICAgY29uc29sZS5sb2coYFtERUJVR10gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBpKF9tZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBMb2dnZXIg7Jew6rKwXG4gICAgY29uc29sZS5sb2coYFtJTkZPXSAke19tZXNzYWdlfWApO1xuICB9XG4gIHcoX21lc3NhZ2U6IHN0cmluZykge1xuICAgIC8vIFRPRE86IExvZ2dlciDsl7DqsrBcbiAgICBjb25zb2xlLmxvZyhgW1dBUk5dICR7X21lc3NhZ2V9YCk7XG4gIH1cbiAgZShfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbRVJST1JdICR7X21lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlID0gbmV3IE5haXRlQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJnZXQiLCJTb25hbXUiLCJpc1NlcmlhbGl6YWJsZSIsImV4dHJhY3RDYWxsU3RhY2siLCJzdGFjayIsIkVycm9yIiwibGluZXMiLCJzcGxpdCIsImZyYW1lcyIsInNsaWNlIiwibWFwIiwicGFyc2VTdGFja0ZyYW1lIiwiZmlsdGVyIiwiZnJhbWUiLCJjb250ZXh0SW5kZXgiLCJmaW5kSW5kZXgiLCJmIiwiZnVuY3Rpb25OYW1lIiwiaW5jbHVkZXMiLCJsaW5lIiwibWF0Y2hXaXRoRnVuYyIsIm1hdGNoIiwiZmlsZVBhdGgiLCJsaW5lTnVtYmVyU3RyIiwibGluZU51bWJlciIsIk51bWJlciIsInBhcnNlSW50IiwibWF0Y2hOb0Z1bmMiLCJtYXRjaGVzUGF0dGVybiIsImtleSIsInBhdHRlcm4iLCJrZXlQYXJ0cyIsInBhdHRlcm5QYXJ0cyIsImxlbmd0aCIsInByZWZpeFBhcnRzIiwiZXZlcnkiLCJwYXJ0IiwiaSIsIk5haXRlUXVlcnkiLCJ0cmFjZXMiLCJmcm9tRmlsZSIsImZpbGVOYW1lIiwiZmlsdGVyZWQiLCJ0Iiwic29tZSIsImVuZHNXaXRoIiwiZnJvbUZ1bmN0aW9uIiwiZnVuY05hbWUiLCJvcHRpb25zIiwiZnJvbSIsIndoZXJlIiwicGF0aCIsIm9wZXJhdG9yIiwidmFsdWUiLCJ0cmFjZSIsImFjdHVhbCIsInJlc3VsdCIsImRhdGEiLCJmaXJzdCIsImxhc3QiLCJhdCIsImluZGV4IiwiZ2V0VHJhY2VzIiwiTmFpdGVDbGFzcyIsIm5hbWUiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInN0b3JlIiwibmFpdGVTdG9yZSIsIkRhdGUiLCJleGlzdGluZyIsInNldCIsImtleVBhdHRlcm4iLCJhbGxUcmFjZXMiLCJlbnRyaWVzIiwicHVzaCIsImdldEFsbCIsInN0YXJ0c1dpdGgiLCJnZXRBbGxUcmFjZXMiLCJBcnJheSIsInZhbHVlcyIsImZsYXQiLCJjaGVjayIsInZhbGlkIiwiY29uc29sZSIsIndhcm4iLCJwYWRFbmQiLCJyZWFzb24iLCJTdHJpbmciLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJ0b0lTT1N0cmluZyIsImRlbCIsImRlbGV0ZSIsImNyZWF0ZVN0b3JlIiwiTWFwIiwiZCIsIl9tZXNzYWdlIiwibG9nIiwidyIsImUiLCJOYWl0ZSJdLCJtYXBwaW5ncyI6IkFBQUEsa0ZBQWtGLEdBRWxGLFNBQVNBLEdBQUcsUUFBUSxVQUFVO0FBQzlCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFFdkMsU0FBU0MsY0FBYyxRQUFRLDJCQUF3QjtBQW9CdkQ7Ozs7O0NBS0MsR0FDRCxTQUFTQztJQUNQLE1BQU1DLFFBQVEsSUFBSUMsUUFBUUQsS0FBSztJQUMvQixJQUFJLENBQUNBLE9BQU8sT0FBTyxFQUFFO0lBRXJCLE1BQU1FLFFBQVFGLE1BQU1HLEtBQUssQ0FBQztJQUUxQixVQUFVO0lBQ1YsZUFBZTtJQUNmLDZCQUE2QjtJQUM3QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLE1BQU1DLFNBQVNGLE1BQ1pHLEtBQUssQ0FBQyxHQUNOQyxHQUFHLENBQUNDLGlCQUNKQyxNQUFNLENBQUMsQ0FBQ0MsUUFBK0JBLFVBQVU7SUFFcEQsb0NBQW9DO0lBQ3BDLE1BQU1DLGVBQWVOLE9BQU9PLFNBQVMsQ0FDbkMsQ0FBQ0MsSUFDQ0EsRUFBRUMsWUFBWSxFQUFFQyxTQUFTLHFCQUFxQkYsRUFBRUMsWUFBWSxFQUFFQyxTQUFTO0lBRzNFLE9BQU9KLGdCQUFnQixJQUFJTixPQUFPQyxLQUFLLENBQUMsR0FBR0ssZUFBZSxLQUFLTjtBQUNqRTtBQUVBOzs7O0NBSUMsR0FDRCxTQUFTRyxnQkFBZ0JRLElBQVk7SUFDbkMsNERBQTREO0lBQzVELE1BQU1DLGdCQUFnQkQsS0FBS0UsS0FBSyxDQUFDO0lBQ2pDLElBQUlELGVBQWU7UUFDakIsTUFBTUgsZUFBZUcsYUFBYSxD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
|