dsh-plugin-usage 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -135
- package/icon.svg +11 -0
- package/lib/client/index.js +747 -31
- package/lib/host/query.js +24 -4
- package/lib/host/settings.js +39 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +8 -3
package/lib/client/index.js
CHANGED
|
@@ -58,13 +58,13 @@ const CSS = `
|
|
|
58
58
|
display: inline-flex;
|
|
59
59
|
align-items: center;
|
|
60
60
|
justify-content: center;
|
|
61
|
-
width:
|
|
62
|
-
height:
|
|
61
|
+
width: 28px;
|
|
62
|
+
height: 28px;
|
|
63
63
|
padding: 0;
|
|
64
|
-
border: 1px solid
|
|
65
|
-
background:
|
|
64
|
+
border: 1px solid transparent;
|
|
65
|
+
background: transparent;
|
|
66
66
|
color: var(--dsw-alias-label-secondary);
|
|
67
|
-
border-radius:
|
|
67
|
+
border-radius: 6px;
|
|
68
68
|
cursor: pointer;
|
|
69
69
|
font: inherit;
|
|
70
70
|
}
|
|
@@ -72,6 +72,14 @@ const CSS = `
|
|
|
72
72
|
color: var(--dsw-alias-label-primary);
|
|
73
73
|
background: var(--dsw-alias-interactive-bg-hover);
|
|
74
74
|
}
|
|
75
|
+
.tsd-icon-btn:disabled {
|
|
76
|
+
cursor: default;
|
|
77
|
+
opacity: 0.6;
|
|
78
|
+
}
|
|
79
|
+
.tsd-icon-btn:disabled:hover {
|
|
80
|
+
color: var(--dsw-alias-label-secondary);
|
|
81
|
+
background: transparent;
|
|
82
|
+
}
|
|
75
83
|
.tsd-spinning svg {
|
|
76
84
|
animation: tsd-spin 0.9s linear infinite;
|
|
77
85
|
}
|
|
@@ -179,9 +187,15 @@ const CSS = `
|
|
|
179
187
|
box-shadow: var(--dsw-shadow-lv3);
|
|
180
188
|
}
|
|
181
189
|
.tsd-model-popover {
|
|
190
|
+
box-sizing: border-box;
|
|
182
191
|
width: 320px;
|
|
183
192
|
max-width: calc(100vw - 24px);
|
|
184
193
|
}
|
|
194
|
+
/* 浮层高度由 useFixedPanel 的 maxHeight 决定:只有列表可伸缩,其余部分不压缩 */
|
|
195
|
+
.tsd-model-popover > .tsd-popover-tools,
|
|
196
|
+
.tsd-model-popover > .tsd-search,
|
|
197
|
+
.tsd-model-popover > .tsd-popover-note,
|
|
198
|
+
.tsd-model-popover > .tsd-popover-empty { flex: none; }
|
|
185
199
|
.tsd-range-popover {
|
|
186
200
|
width: 300px;
|
|
187
201
|
max-width: calc(100vw - 24px);
|
|
@@ -289,6 +303,8 @@ const CSS = `
|
|
|
289
303
|
.tsd-model-list {
|
|
290
304
|
display: flex;
|
|
291
305
|
flex-direction: column;
|
|
306
|
+
flex: 1 1 auto;
|
|
307
|
+
min-height: 0;
|
|
292
308
|
gap: 2px;
|
|
293
309
|
max-height: 240px;
|
|
294
310
|
overflow-y: auto;
|
|
@@ -317,6 +333,150 @@ const CSS = `
|
|
|
317
333
|
min-width: 0;
|
|
318
334
|
}
|
|
319
335
|
|
|
336
|
+
/* ============ 币种切换(参考成本卡数值行内) ============ */
|
|
337
|
+
/* 数值行最前只放一个「符号 + 小箭头」的图标式触发器:符号本身就是读数的一部分,
|
|
338
|
+
尺寸/字重/基线继承数值行,读起来像数字前缀而不是一个控件。
|
|
339
|
+
符号只在这里画一次,formatCost 不再重复带符号。 */
|
|
340
|
+
.tsd-cur-anchor {
|
|
341
|
+
position: relative;
|
|
342
|
+
display: inline-flex;
|
|
343
|
+
}
|
|
344
|
+
.tsd-cur-btn {
|
|
345
|
+
display: inline-flex;
|
|
346
|
+
align-items: baseline;
|
|
347
|
+
gap: 3px;
|
|
348
|
+
margin: 0 2px 0 0;
|
|
349
|
+
padding: 0 2px;
|
|
350
|
+
border: none;
|
|
351
|
+
border-radius: 6px;
|
|
352
|
+
background: transparent;
|
|
353
|
+
color: inherit;
|
|
354
|
+
font: inherit;
|
|
355
|
+
line-height: inherit;
|
|
356
|
+
vertical-align: baseline;
|
|
357
|
+
cursor: pointer;
|
|
358
|
+
transition: color 0.15s ease, background 0.15s ease;
|
|
359
|
+
}
|
|
360
|
+
.tsd-cur-btn:hover,
|
|
361
|
+
.tsd-cur-btn-open {
|
|
362
|
+
color: var(--dsw-alias-brand-primary);
|
|
363
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
364
|
+
}
|
|
365
|
+
.tsd-cur-btn:focus-visible {
|
|
366
|
+
outline: 2px solid var(--dsw-alias-brand-primary);
|
|
367
|
+
outline-offset: 1px;
|
|
368
|
+
}
|
|
369
|
+
.tsd-cur-chevron {
|
|
370
|
+
flex: none;
|
|
371
|
+
align-self: center;
|
|
372
|
+
transition: transform 0.15s ease;
|
|
373
|
+
}
|
|
374
|
+
.tsd-cur-btn-open .tsd-cur-chevron { transform: rotate(180deg); }
|
|
375
|
+
.tsd-cur-popover {
|
|
376
|
+
box-sizing: border-box;
|
|
377
|
+
width: 180px;
|
|
378
|
+
max-width: calc(100vw - 24px);
|
|
379
|
+
padding: 6px;
|
|
380
|
+
display: flex;
|
|
381
|
+
flex-direction: column;
|
|
382
|
+
gap: 2px;
|
|
383
|
+
/* 浮层挂在 .tsd-card-value 里,那边为了数值行写了 nowrap;
|
|
384
|
+
浮层里的菜单项与说明必须恢复换行,否则长文案会横着溢出浮层。 */
|
|
385
|
+
white-space: normal;
|
|
386
|
+
}
|
|
387
|
+
.tsd-cur-option {
|
|
388
|
+
display: flex;
|
|
389
|
+
align-items: center;
|
|
390
|
+
gap: 8px;
|
|
391
|
+
padding: 7px 9px;
|
|
392
|
+
border: none;
|
|
393
|
+
border-radius: 8px;
|
|
394
|
+
background: transparent;
|
|
395
|
+
color: var(--dsw-alias-label-primary);
|
|
396
|
+
font: inherit;
|
|
397
|
+
font-size: 13px;
|
|
398
|
+
text-align: left;
|
|
399
|
+
cursor: pointer;
|
|
400
|
+
}
|
|
401
|
+
.tsd-cur-option:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
402
|
+
.tsd-cur-option:focus-visible {
|
|
403
|
+
outline: 2px solid var(--dsw-alias-brand-primary);
|
|
404
|
+
outline-offset: 1px;
|
|
405
|
+
}
|
|
406
|
+
.tsd-cur-symbol {
|
|
407
|
+
flex: none;
|
|
408
|
+
width: 20px;
|
|
409
|
+
text-align: center;
|
|
410
|
+
font-weight: 600;
|
|
411
|
+
}
|
|
412
|
+
.tsd-cur-name {
|
|
413
|
+
min-width: 0;
|
|
414
|
+
overflow: hidden;
|
|
415
|
+
text-overflow: ellipsis;
|
|
416
|
+
white-space: nowrap;
|
|
417
|
+
color: var(--dsw-alias-label-secondary);
|
|
418
|
+
font-size: 12px;
|
|
419
|
+
}
|
|
420
|
+
.tsd-cur-option-active { background: var(--dsw-alias-interactive-bg-hover); }
|
|
421
|
+
.tsd-cur-check {
|
|
422
|
+
margin-left: auto;
|
|
423
|
+
color: var(--dsw-alias-brand-primary);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* ============ 模型占比(KPI 卡第 6 格) ============ */
|
|
427
|
+
/* 主体是占比条,下方模型名与百分比压成脚注(11px tertiary),
|
|
428
|
+
与其它卡的大数字形成层级差,不抢 KPI 的读数位置。 */
|
|
429
|
+
.tsd-card-share-body {
|
|
430
|
+
display: flex;
|
|
431
|
+
flex-direction: column;
|
|
432
|
+
gap: 8px;
|
|
433
|
+
min-width: 0;
|
|
434
|
+
/* 对齐 .tsd-card-value 的上边距,六张卡保持同一基线 */
|
|
435
|
+
margin-top: 8px;
|
|
436
|
+
}
|
|
437
|
+
.tsd-share-track {
|
|
438
|
+
display: flex;
|
|
439
|
+
align-items: stretch;
|
|
440
|
+
width: 100%;
|
|
441
|
+
height: 10px;
|
|
442
|
+
border-radius: 999px;
|
|
443
|
+
overflow: hidden;
|
|
444
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
445
|
+
}
|
|
446
|
+
.tsd-share-seg {
|
|
447
|
+
height: 100%;
|
|
448
|
+
min-width: 2px;
|
|
449
|
+
outline: none;
|
|
450
|
+
opacity: 0.9;
|
|
451
|
+
transition: opacity 0.12s ease;
|
|
452
|
+
}
|
|
453
|
+
.tsd-share-seg:hover,
|
|
454
|
+
.tsd-share-seg:focus-visible,
|
|
455
|
+
.tsd-share-seg[data-active='true'] { opacity: 1; }
|
|
456
|
+
.tsd-share-caption {
|
|
457
|
+
display: flex;
|
|
458
|
+
align-items: baseline;
|
|
459
|
+
gap: 6px;
|
|
460
|
+
font-size: 11px;
|
|
461
|
+
line-height: 16px;
|
|
462
|
+
color: var(--dsw-alias-label-tertiary);
|
|
463
|
+
}
|
|
464
|
+
.tsd-share-cap-name {
|
|
465
|
+
min-width: 0;
|
|
466
|
+
overflow: hidden;
|
|
467
|
+
text-overflow: ellipsis;
|
|
468
|
+
white-space: nowrap;
|
|
469
|
+
}
|
|
470
|
+
.tsd-share-cap-pct {
|
|
471
|
+
flex: none;
|
|
472
|
+
font-variant-numeric: tabular-nums;
|
|
473
|
+
}
|
|
474
|
+
.tsd-share-empty {
|
|
475
|
+
font-size: 14px;
|
|
476
|
+
font-weight: 400;
|
|
477
|
+
color: var(--dsw-alias-label-tertiary);
|
|
478
|
+
}
|
|
479
|
+
|
|
320
480
|
/* ============ 自定义日期浮层 ============ */
|
|
321
481
|
.tsd-range-fields {
|
|
322
482
|
display: flex;
|
|
@@ -973,6 +1133,32 @@ const CSS = `
|
|
|
973
1133
|
font-size: 10px;
|
|
974
1134
|
color: var(--dsw-alias-label-tertiary);
|
|
975
1135
|
}
|
|
1136
|
+
|
|
1137
|
+
/* ============ 输入区成本 pill(composer dock)============ */
|
|
1138
|
+
.tsd-dock {
|
|
1139
|
+
box-sizing: border-box;
|
|
1140
|
+
display: inline-flex;
|
|
1141
|
+
align-items: center;
|
|
1142
|
+
gap: 4px;
|
|
1143
|
+
height: 22px;
|
|
1144
|
+
padding: 0 8px;
|
|
1145
|
+
border-radius: 999px;
|
|
1146
|
+
border: 0.5px solid var(--dsw-alias-border-l1);
|
|
1147
|
+
background: var(--dsw-alias-bg-base);
|
|
1148
|
+
color: var(--dsw-alias-label-secondary);
|
|
1149
|
+
font-size: 12px;
|
|
1150
|
+
line-height: 1;
|
|
1151
|
+
white-space: nowrap;
|
|
1152
|
+
cursor: default;
|
|
1153
|
+
}
|
|
1154
|
+
.tsd-dock-label {
|
|
1155
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1156
|
+
}
|
|
1157
|
+
.tsd-dock-value {
|
|
1158
|
+
font-weight: 600;
|
|
1159
|
+
font-variant-numeric: tabular-nums;
|
|
1160
|
+
color: var(--dsw-alias-label-primary);
|
|
1161
|
+
}
|
|
976
1162
|
`
|
|
977
1163
|
|
|
978
1164
|
// 0.2+ host transport: POST /api/<channel>/<endpoint>, args as the JSON body,
|
|
@@ -1137,10 +1323,16 @@ const ZH = {
|
|
|
1137
1323
|
nav: '用量统计',
|
|
1138
1324
|
subtitle: '查看 AI 模型的使用情况和成本统计',
|
|
1139
1325
|
refresh: '刷新',
|
|
1326
|
+
currencyHint: '参考成本币种(固定汇率 1 USD = 7 CNY)',
|
|
1327
|
+
currencyCNY: '人民币',
|
|
1328
|
+
currencyUSD: '美元',
|
|
1140
1329
|
today: '今日',
|
|
1330
|
+
dockHint: '今日 {cost} · {calls} 次调用 · {tokens} Token',
|
|
1331
|
+
dockUnpriced: '未定价',
|
|
1141
1332
|
last7d: '近7天',
|
|
1142
1333
|
last30d: '近30天',
|
|
1143
1334
|
custom: '自定义',
|
|
1335
|
+
all: '全部',
|
|
1144
1336
|
allModels: '全部模型',
|
|
1145
1337
|
selectedModels: '已选 {count} 个模型',
|
|
1146
1338
|
selectAll: '全选',
|
|
@@ -1153,7 +1345,7 @@ const ZH = {
|
|
|
1153
1345
|
startTime: '开始时间',
|
|
1154
1346
|
endTime: '结束时间',
|
|
1155
1347
|
rangeInvalid: '开始时间不能晚于结束时间',
|
|
1156
|
-
rangeHint: '
|
|
1348
|
+
rangeHint: '支持选择任意日期范围,不限跨度',
|
|
1157
1349
|
cancel: '取消',
|
|
1158
1350
|
confirm: '确定',
|
|
1159
1351
|
dateRangeGroup: '日期范围',
|
|
@@ -1163,7 +1355,7 @@ const ZH = {
|
|
|
1163
1355
|
inputTokens: '输入 Token',
|
|
1164
1356
|
outputTokens: '输出 Token',
|
|
1165
1357
|
calls: '调用次数',
|
|
1166
|
-
cost: '
|
|
1358
|
+
cost: '参考成本',
|
|
1167
1359
|
approxIO: '≈ 输入+输出',
|
|
1168
1360
|
unpricedNote: '{count} 次调用未定价',
|
|
1169
1361
|
dailyTrend: '每日用量趋势',
|
|
@@ -1194,8 +1386,10 @@ const ZH = {
|
|
|
1194
1386
|
colInput: '输入 Token',
|
|
1195
1387
|
colOutput: '输出 Token',
|
|
1196
1388
|
colTotal: '总 Token',
|
|
1197
|
-
colCost: '
|
|
1389
|
+
colCost: '参考成本',
|
|
1198
1390
|
colShare: '占比',
|
|
1391
|
+
modelShare: '模型占比',
|
|
1392
|
+
shareOther: '其它',
|
|
1199
1393
|
unpriced: '未定价',
|
|
1200
1394
|
unpricedRowHint: '该模型未配置定价,按 0 计价',
|
|
1201
1395
|
noData: '暂无数据',
|
|
@@ -1220,10 +1414,16 @@ const EN = {
|
|
|
1220
1414
|
nav: 'Usage Stats',
|
|
1221
1415
|
subtitle: 'View AI model usage and cost statistics',
|
|
1222
1416
|
refresh: 'Refresh',
|
|
1417
|
+
currencyHint: 'Reference-cost currency (fixed rate: 1 USD = 7 CNY)',
|
|
1418
|
+
currencyCNY: 'CNY',
|
|
1419
|
+
currencyUSD: 'USD',
|
|
1223
1420
|
today: 'Today',
|
|
1421
|
+
dockHint: 'Today {cost} · {calls} calls · {tokens} tokens',
|
|
1422
|
+
dockUnpriced: 'unpriced',
|
|
1224
1423
|
last7d: 'Last 7 days',
|
|
1225
1424
|
last30d: 'Last 30 days',
|
|
1226
1425
|
custom: 'Custom',
|
|
1426
|
+
all: 'All',
|
|
1227
1427
|
allModels: 'All models',
|
|
1228
1428
|
selectedModels: '{count} models selected',
|
|
1229
1429
|
selectAll: 'Select all',
|
|
@@ -1236,7 +1436,7 @@ const EN = {
|
|
|
1236
1436
|
startTime: 'Start',
|
|
1237
1437
|
endTime: 'End',
|
|
1238
1438
|
rangeInvalid: 'Start must not be later than end',
|
|
1239
|
-
rangeHint: '
|
|
1439
|
+
rangeHint: 'Any date range — no length limit',
|
|
1240
1440
|
cancel: 'Cancel',
|
|
1241
1441
|
confirm: 'OK',
|
|
1242
1442
|
dateRangeGroup: 'Date range',
|
|
@@ -1246,7 +1446,7 @@ const EN = {
|
|
|
1246
1446
|
inputTokens: 'Input Tokens',
|
|
1247
1447
|
outputTokens: 'Output Tokens',
|
|
1248
1448
|
calls: 'Calls',
|
|
1249
|
-
cost: '
|
|
1449
|
+
cost: 'Est. cost',
|
|
1250
1450
|
approxIO: '≈ input+output',
|
|
1251
1451
|
unpricedNote: '{count} calls unpriced',
|
|
1252
1452
|
dailyTrend: 'Daily usage trend',
|
|
@@ -1277,8 +1477,10 @@ const EN = {
|
|
|
1277
1477
|
colInput: 'Input Tokens',
|
|
1278
1478
|
colOutput: 'Output Tokens',
|
|
1279
1479
|
colTotal: 'Total Tokens',
|
|
1280
|
-
colCost: '
|
|
1480
|
+
colCost: 'Est. cost',
|
|
1281
1481
|
colShare: 'Share',
|
|
1482
|
+
modelShare: 'Model share',
|
|
1483
|
+
shareOther: 'Others',
|
|
1282
1484
|
unpriced: 'Unpriced',
|
|
1283
1485
|
unpricedRowHint: 'No pricing configured; counted as 0',
|
|
1284
1486
|
noData: 'No data',
|
|
@@ -1324,9 +1526,16 @@ function formatTokensShort(n) {
|
|
|
1324
1526
|
function formatInt(n) {
|
|
1325
1527
|
return Number.isFinite(n) ? Math.round(n).toLocaleString() : '--'
|
|
1326
1528
|
}
|
|
1327
|
-
|
|
1529
|
+
/** 只要数字部分:成本卡的符号由币种切换器自己画,再带一次就成了「¥ ¥14.78」。 */
|
|
1530
|
+
function costDigits(n) {
|
|
1328
1531
|
if (!Number.isFinite(n)) return '--'
|
|
1329
|
-
|
|
1532
|
+
// Below half a cent there is nothing to show at 2 decimals; say so instead of
|
|
1533
|
+
// printing a misleading 0.00 (a $0.03 CNY cost becomes $0.004).
|
|
1534
|
+
if (n > 0 && n < 0.005) return '<0.01'
|
|
1535
|
+
return n.toFixed(2)
|
|
1536
|
+
}
|
|
1537
|
+
function formatCost(n, cur) {
|
|
1538
|
+
return (cur || '¥') + costDigits(n)
|
|
1330
1539
|
}
|
|
1331
1540
|
function dayLabel(key) {
|
|
1332
1541
|
const [, m, d] = String(key || '').split('-')
|
|
@@ -1365,13 +1574,17 @@ function fmtDateSlash(s) {
|
|
|
1365
1574
|
return m[1] + '/' + m[2] + '/' + m[3]
|
|
1366
1575
|
}
|
|
1367
1576
|
// 预设 / 自定义 → { from, to }(Unix 毫秒)
|
|
1368
|
-
// 今日 = 当天 00:00 至今;近7/30天 = 含今天往前 N 个自然日 00:00
|
|
1577
|
+
// 今日 = 当天 00:00 至今;近7/30天 = 含今天往前 N 个自然日 00:00 起;全部 = 不限起点;
|
|
1578
|
+
// 自定义 = 起日 00:00 ~ 止日 23:59:59.999
|
|
1369
1579
|
function rangeFor(preset, custom) {
|
|
1370
1580
|
const now = new Date()
|
|
1371
1581
|
const today = startOfDay(now)
|
|
1372
1582
|
if (preset === 'today') return { from: today.getTime(), to: now.getTime() }
|
|
1373
1583
|
if (preset === '7d') return { from: addDays(today, -6).getTime(), to: now.getTime() }
|
|
1374
1584
|
if (preset === '30d') return { from: addDays(today, -29).getTime(), to: now.getTime() }
|
|
1585
|
+
// 全量:0 是有限值,宿主的 fill 判定认它;调用方必须同时传 fill:false,
|
|
1586
|
+
// 否则会去零填充 1970 年至今、撞上 MAX_BUCKETS 退化成只看有数据的桶。
|
|
1587
|
+
if (preset === 'all') return { from: 0, to: now.getTime() }
|
|
1375
1588
|
const from = new Date(custom.from + 'T00:00:00').getTime()
|
|
1376
1589
|
const to = new Date(custom.to + 'T23:59:59.999').getTime()
|
|
1377
1590
|
if (!Number.isFinite(from) || !Number.isFinite(to)) {
|
|
@@ -1448,26 +1661,44 @@ const ICON_PATHS = {
|
|
|
1448
1661
|
up: 'M12 21V9m0 0l-4.5 4.5M12 9l4.5 4.5M4 3h16',
|
|
1449
1662
|
activity: 'M2 12h4l2.5-8 5 16 2.5-8h6',
|
|
1450
1663
|
coins: 'M3 9a2 2 0 012-2h14a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9zm0 5h18M8 5.5V4a2 2 0 012-2h4a2 2 0 012 2v1.5',
|
|
1451
|
-
|
|
1664
|
+
// 刷新图标取自 DSH 原生图形(16 网格、stroke 1.5),与设置页其它图标同一观感;
|
|
1665
|
+
// 其余图标仍是 24 网格(stroke 2),SvgIcon 两种定义都吃。
|
|
1666
|
+
refresh: {
|
|
1667
|
+
viewBox: '0 0 16 16',
|
|
1668
|
+
strokeWidth: 1.5,
|
|
1669
|
+
paths: [
|
|
1670
|
+
'M14.5001 8C14.5 9.28552 14.1188 10.5422 13.4045 11.611C12.6903 12.6799 11.6752 13.5129 10.4875 14.0049C9.29982 14.4968 7.99295 14.6255 6.73212 14.3747C5.4713 14.124 4.31314 13.505 3.4041 12.596C2.49514 11.687 1.87614 10.5288 1.62537 9.26798C1.37459 8.00716 1.50331 6.70028 1.99525 5.51261C2.48719 4.32494 3.32025 3.30981 4.3891 2.59557C5.45795 1.88134 6.71458 1.50008 8.0001 1.5C9.9001 1.5 11.7001 2.3 13.0001 3.6L14.5001 5.1',
|
|
1671
|
+
'M14.4999 1.5V5.1H10.8999',
|
|
1672
|
+
],
|
|
1673
|
+
},
|
|
1452
1674
|
chevron: 'M6 9l6 6 6-6',
|
|
1453
1675
|
inbox: 'M22 12h-6l-2 3h-4l-2-3H2m3.5-6.5L2 12v6a2 2 0 002 2h16a2 2 0 002-2v-6l-3.5-6.5A2 2 0 0016.76 5H7.24a2 2 0 00-1.74 1.5z',
|
|
1454
1676
|
alert: 'M12 9v4m0 4h.01M10.3 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.7 3.86a2 2 0 00-3.4 0z',
|
|
1455
1677
|
search: 'M21 21l-4.35-4.35M17 10.5a6.5 6.5 0 11-13 0 6.5 6.5 0 0113 0z',
|
|
1678
|
+
// 饼图(占比):外圈 + 楔形,与卡片标题的「占比」语义一致
|
|
1679
|
+
share: 'M21.21 15.89A10 10 0 118 2.83M22 12A10 10 0 0012 2v10z',
|
|
1680
|
+
check: 'M20 6L9 17l-5-5',
|
|
1456
1681
|
}
|
|
1457
1682
|
function SvgIcon(props) {
|
|
1458
1683
|
const { name, size, className } = props
|
|
1684
|
+
// 一个名字对应「一串 path + 自己的 viewBox/线宽」;字符串是 24 网格的简写,
|
|
1685
|
+
// 调用方(31 处)无需关心差别。
|
|
1686
|
+
const spec = ICON_PATHS[name] || ICON_PATHS.activity
|
|
1687
|
+
const icon = typeof spec === 'string'
|
|
1688
|
+
? { viewBox: '0 0 24 24', strokeWidth: 2, paths: [spec] }
|
|
1689
|
+
: spec
|
|
1459
1690
|
return h('svg', {
|
|
1460
1691
|
className: className || 'tsd-icon',
|
|
1461
1692
|
width: size || 16,
|
|
1462
1693
|
height: size || 16,
|
|
1463
|
-
viewBox: '0 0 24 24',
|
|
1694
|
+
viewBox: icon.viewBox || '0 0 24 24',
|
|
1464
1695
|
fill: 'none',
|
|
1465
1696
|
stroke: 'currentColor',
|
|
1466
|
-
strokeWidth: 2,
|
|
1697
|
+
strokeWidth: icon.strokeWidth || 2,
|
|
1467
1698
|
strokeLinecap: 'round',
|
|
1468
1699
|
strokeLinejoin: 'round',
|
|
1469
1700
|
'aria-hidden': true,
|
|
1470
|
-
}, h('path', {
|
|
1701
|
+
}, icon.paths.map((d, i) => h('path', { key: i, d })))
|
|
1471
1702
|
}
|
|
1472
1703
|
|
|
1473
1704
|
/* ---------------------------------------------------------------------------
|
|
@@ -1484,6 +1715,58 @@ function useOutsideClick(open, ref, onClose) {
|
|
|
1484
1715
|
}, [open, onClose, ref])
|
|
1485
1716
|
}
|
|
1486
1717
|
|
|
1718
|
+
/* ---------------------------------------------------------------------------
|
|
1719
|
+
* 通用 Hook:浮层定位(viewport 定位 + 空间不足上翻 + 高度封顶)
|
|
1720
|
+
*
|
|
1721
|
+
* 设置面板本身是 `overflow: hidden` 的裁剪容器,贴着过滤栏右端的 absolute
|
|
1722
|
+
* 浮层会被整条裁掉(右侧的「清空」看不见)。CSS 无法感知祖先裁剪,只能量一次
|
|
1723
|
+
* 视口再定位;滚动或缩放时重算,避免浮层留在原地。
|
|
1724
|
+
* ------------------------------------------------------------------------- */
|
|
1725
|
+
const PANEL_MIN_ROOM = 240 // 下方空间小于它且上方更宽裕时上翻
|
|
1726
|
+
const PANEL_MIN_HEIGHT = 160
|
|
1727
|
+
|
|
1728
|
+
function useFixedPanel(anchorRef, open, width, gap = 6, margin = 12) {
|
|
1729
|
+
const [style, setStyle] = React.useState(null)
|
|
1730
|
+
React.useEffect(() => {
|
|
1731
|
+
if (!open) {
|
|
1732
|
+
setStyle(null)
|
|
1733
|
+
return undefined
|
|
1734
|
+
}
|
|
1735
|
+
function measure() {
|
|
1736
|
+
const el = anchorRef.current
|
|
1737
|
+
if (!el) return
|
|
1738
|
+
const r = el.getBoundingClientRect()
|
|
1739
|
+
const boxW = Math.min(width, window.innerWidth - margin * 2)
|
|
1740
|
+
const left = Math.max(margin, Math.min(r.left, window.innerWidth - margin - boxW))
|
|
1741
|
+
const below = window.innerHeight - r.bottom - gap - margin
|
|
1742
|
+
const above = r.top - gap - margin
|
|
1743
|
+
const flip = below < PANEL_MIN_ROOM && above > below
|
|
1744
|
+
setStyle({
|
|
1745
|
+
position: 'fixed',
|
|
1746
|
+
left,
|
|
1747
|
+
width: boxW,
|
|
1748
|
+
maxHeight: Math.max(PANEL_MIN_HEIGHT, flip ? above : below),
|
|
1749
|
+
...(flip
|
|
1750
|
+
? { bottom: window.innerHeight - r.top + gap }
|
|
1751
|
+
: { top: r.bottom + gap }),
|
|
1752
|
+
display: 'flex',
|
|
1753
|
+
flexDirection: 'column',
|
|
1754
|
+
zIndex: 40,
|
|
1755
|
+
})
|
|
1756
|
+
}
|
|
1757
|
+
measure()
|
|
1758
|
+
window.addEventListener('resize', measure)
|
|
1759
|
+
window.addEventListener('scroll', measure, true)
|
|
1760
|
+
return () => {
|
|
1761
|
+
window.removeEventListener('resize', measure)
|
|
1762
|
+
window.removeEventListener('scroll', measure, true)
|
|
1763
|
+
}
|
|
1764
|
+
}, [open, anchorRef, width, gap, margin])
|
|
1765
|
+
if (!open) return null
|
|
1766
|
+
// 首帧还没量到尺寸:先藏起来,否则会闪到左上角
|
|
1767
|
+
return style || { position: 'fixed', top: 0, left: 0, visibility: 'hidden' }
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1487
1770
|
/* ---------------------------------------------------------------------------
|
|
1488
1771
|
* Header:标题 + 副标题 + 刷新按钮
|
|
1489
1772
|
* ------------------------------------------------------------------------- */
|
|
@@ -1498,6 +1781,8 @@ function StatsHeader(props) {
|
|
|
1498
1781
|
type: 'button',
|
|
1499
1782
|
className: 'tsd-icon-btn' + (busy ? ' tsd-spinning' : ''),
|
|
1500
1783
|
onClick: onRefresh,
|
|
1784
|
+
disabled: busy,
|
|
1785
|
+
'aria-busy': busy || undefined,
|
|
1501
1786
|
title: t('refresh'),
|
|
1502
1787
|
'aria-label': t('refresh'),
|
|
1503
1788
|
}, h(SvgIcon, { name: 'refresh' })))
|
|
@@ -1507,8 +1792,9 @@ function StatsHeader(props) {
|
|
|
1507
1792
|
* 自定义日期范围浮层
|
|
1508
1793
|
* ------------------------------------------------------------------------- */
|
|
1509
1794
|
function CustomRangePopover(props) {
|
|
1510
|
-
const { custom, onApply, onClose } = props
|
|
1795
|
+
const { custom, onApply, onClose, anchorRef } = props
|
|
1511
1796
|
const t = useT()
|
|
1797
|
+
const panelStyle = useFixedPanel(anchorRef, true, 300)
|
|
1512
1798
|
const [from, setFrom] = React.useState(custom.from)
|
|
1513
1799
|
const [to, setTo] = React.useState(custom.to)
|
|
1514
1800
|
const invalid = !from || !to || from > to
|
|
@@ -1522,6 +1808,7 @@ function CustomRangePopover(props) {
|
|
|
1522
1808
|
}, [onClose])
|
|
1523
1809
|
return h('div', {
|
|
1524
1810
|
className: 'tsd-popover tsd-range-popover',
|
|
1811
|
+
style: panelStyle,
|
|
1525
1812
|
role: 'dialog',
|
|
1526
1813
|
'aria-label': t('customRangeAria'),
|
|
1527
1814
|
},
|
|
@@ -1561,6 +1848,7 @@ function ModelDropdown(props) {
|
|
|
1561
1848
|
const [open, setOpen] = React.useState(false)
|
|
1562
1849
|
const [query, setQuery] = React.useState('')
|
|
1563
1850
|
const anchorRef = React.useRef(null)
|
|
1851
|
+
const panelStyle = useFixedPanel(anchorRef, open, 320)
|
|
1564
1852
|
|
|
1565
1853
|
React.useEffect(() => {
|
|
1566
1854
|
if (!open) return undefined
|
|
@@ -1579,8 +1867,10 @@ function ModelDropdown(props) {
|
|
|
1579
1867
|
}, [open])
|
|
1580
1868
|
|
|
1581
1869
|
// 只列出当前范围有数据的模型;已选但掉出候选列表的「补回」,保证可渲染、可清除
|
|
1870
|
+
// 候选键直接用宿主给好的 `key`(compositeModelKey 的结果):客户端不再自己拼
|
|
1871
|
+
// `provider + '/' + model`,provider 为空时那种拼法会得到 `/model` 而永远选不中。
|
|
1582
1872
|
const candidates = React.useMemo(() => {
|
|
1583
|
-
const set = new Set((options || []).map((m) => m.provider + '/' + m.model))
|
|
1873
|
+
const set = new Set((options || []).map((m) => m.key || (m.provider ? m.provider + '/' + m.model : m.model)))
|
|
1584
1874
|
;(selected || []).forEach((m) => set.add(m))
|
|
1585
1875
|
const list = Array.from(set)
|
|
1586
1876
|
list.sort()
|
|
@@ -1605,6 +1895,7 @@ function ModelDropdown(props) {
|
|
|
1605
1895
|
open
|
|
1606
1896
|
? h('div', {
|
|
1607
1897
|
className: 'tsd-popover tsd-model-popover',
|
|
1898
|
+
style: panelStyle,
|
|
1608
1899
|
role: 'listbox',
|
|
1609
1900
|
'aria-label': t('modelFilterGroup'),
|
|
1610
1901
|
'aria-multiselectable': true,
|
|
@@ -1654,6 +1945,7 @@ function FilterBar(props) {
|
|
|
1654
1945
|
} = props
|
|
1655
1946
|
const t = useT()
|
|
1656
1947
|
const segRef = React.useRef(null)
|
|
1948
|
+
const customBtnRef = React.useRef(null)
|
|
1657
1949
|
useOutsideClick(customOpen, segRef, onCustomClose)
|
|
1658
1950
|
|
|
1659
1951
|
const customLabel = fmtDateSlash(custom.from) + ' - ' + fmtDateSlash(custom.to)
|
|
@@ -1661,6 +1953,7 @@ function FilterBar(props) {
|
|
|
1661
1953
|
{ key: 'today', label: t('today') },
|
|
1662
1954
|
{ key: '7d', label: t('last7d') },
|
|
1663
1955
|
{ key: '30d', label: t('last30d') },
|
|
1956
|
+
{ key: 'all', label: t('all') },
|
|
1664
1957
|
{ key: 'custom', label: t('custom') },
|
|
1665
1958
|
]
|
|
1666
1959
|
|
|
@@ -1674,6 +1967,7 @@ function FilterBar(props) {
|
|
|
1674
1967
|
return h('button', {
|
|
1675
1968
|
key: p.key,
|
|
1676
1969
|
type: 'button',
|
|
1970
|
+
ref: isCustom ? customBtnRef : undefined,
|
|
1677
1971
|
className: 'tsd-seg-btn' + (active ? ' tsd-seg-active' : '') + (isCustom ? ' tsd-seg-custom' : ''),
|
|
1678
1972
|
'aria-pressed': active,
|
|
1679
1973
|
title: isCustom && active ? customLabel : undefined,
|
|
@@ -1681,15 +1975,232 @@ function FilterBar(props) {
|
|
|
1681
1975
|
},
|
|
1682
1976
|
h('span', { className: 'tsd-seg-label' }, label))
|
|
1683
1977
|
})),
|
|
1684
|
-
customOpen
|
|
1978
|
+
customOpen
|
|
1979
|
+
? h(CustomRangePopover, { custom, onApply: onCustomApply, onClose: onCustomClose, anchorRef: customBtnRef })
|
|
1980
|
+
: null),
|
|
1685
1981
|
h(ModelDropdown, { options: modelOptions, selected: models, onChange: onModelsChange }))
|
|
1686
1982
|
}
|
|
1687
1983
|
|
|
1688
1984
|
/* ---------------------------------------------------------------------------
|
|
1689
|
-
*
|
|
1985
|
+
* 参考成本币种切换(人民币 / 美元,固定 1 USD = 7 CNY)
|
|
1986
|
+
*
|
|
1987
|
+
* 换算在宿主侧完成(价目表是美元价,绝不回写),所以这里只负责选择与持久化:
|
|
1988
|
+
* 换币种即换查询,不重查数字不会变。
|
|
1989
|
+
* ------------------------------------------------------------------------- */
|
|
1990
|
+
const CURRENCY_SYMBOLS = { CNY: '¥', USD: '$' }
|
|
1991
|
+
const CURRENCY_STORE_KEY = 'dsh-plugin-usage:display-currency'
|
|
1992
|
+
|
|
1993
|
+
function readStoredCurrency() {
|
|
1994
|
+
try {
|
|
1995
|
+
return window.localStorage.getItem(CURRENCY_STORE_KEY) === 'USD' ? 'USD' : 'CNY'
|
|
1996
|
+
} catch (e) {
|
|
1997
|
+
return 'CNY' // 无痕模式 / 存储被禁:退回默认
|
|
1998
|
+
}
|
|
1999
|
+
}
|
|
2000
|
+
function storeCurrency(code) {
|
|
2001
|
+
try {
|
|
2002
|
+
window.localStorage.setItem(CURRENCY_STORE_KEY, code)
|
|
2003
|
+
} catch (e) {
|
|
2004
|
+
// 存不下就只影响下次打开,不影响本次显示
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
|
|
2008
|
+
function CurrencyPicker(props) {
|
|
2009
|
+
const { code, onChange } = props
|
|
2010
|
+
const t = useT()
|
|
2011
|
+
const [open, setOpen] = React.useState(false)
|
|
2012
|
+
const ref = React.useRef(null)
|
|
2013
|
+
const panelStyle = useFixedPanel(ref, open, 180)
|
|
2014
|
+
useOutsideClick(open, ref, () => setOpen(false))
|
|
2015
|
+
const active = CURRENCY_SYMBOLS[code] ? code : 'CNY'
|
|
2016
|
+
const options = ['CNY', 'USD']
|
|
2017
|
+
// 收起时 ↑↓ 直接换值(像原生 select),展开时在两项间移动;Esc 关菜单。
|
|
2018
|
+
const move = (step) => {
|
|
2019
|
+
const i = options.indexOf(active)
|
|
2020
|
+
onChange(options[(i + step + options.length) % options.length])
|
|
2021
|
+
}
|
|
2022
|
+
const onKeyDown = (e) => {
|
|
2023
|
+
if (e.key === 'Escape') { setOpen(false); return }
|
|
2024
|
+
if (!open) {
|
|
2025
|
+
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { e.preventDefault(); move(e.key === 'ArrowDown' ? 1 : -1); return }
|
|
2026
|
+
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpen(true) }
|
|
2027
|
+
return
|
|
2028
|
+
}
|
|
2029
|
+
if (e.key === 'ArrowDown') { e.preventDefault(); move(1) }
|
|
2030
|
+
else if (e.key === 'ArrowUp') { e.preventDefault(); move(-1) }
|
|
2031
|
+
}
|
|
2032
|
+
return h('span', { className: 'tsd-cur-anchor', ref },
|
|
2033
|
+
h('button', {
|
|
2034
|
+
type: 'button',
|
|
2035
|
+
className: 'tsd-cur-btn' + (open ? ' tsd-cur-btn-open' : ''),
|
|
2036
|
+
title: t('currencyHint'),
|
|
2037
|
+
'aria-label': t('currencyHint'),
|
|
2038
|
+
'aria-haspopup': 'listbox',
|
|
2039
|
+
'aria-expanded': open,
|
|
2040
|
+
onClick: () => setOpen((v) => !v),
|
|
2041
|
+
onKeyDown,
|
|
2042
|
+
},
|
|
2043
|
+
h('span', null, CURRENCY_SYMBOLS[active]),
|
|
2044
|
+
h(SvgIcon, { name: 'chevron', size: 10, className: 'tsd-cur-chevron' })),
|
|
2045
|
+
open
|
|
2046
|
+
? h('div', {
|
|
2047
|
+
className: 'tsd-popover tsd-cur-popover',
|
|
2048
|
+
style: panelStyle,
|
|
2049
|
+
role: 'listbox',
|
|
2050
|
+
'aria-label': t('currencyHint'),
|
|
2051
|
+
onKeyDown,
|
|
2052
|
+
},
|
|
2053
|
+
options.map((c) => h('button', {
|
|
2054
|
+
key: c,
|
|
2055
|
+
type: 'button',
|
|
2056
|
+
role: 'option',
|
|
2057
|
+
'aria-selected': c === active,
|
|
2058
|
+
className: 'tsd-cur-option' + (c === active ? ' tsd-cur-option-active' : ''),
|
|
2059
|
+
onClick: () => { onChange(c); setOpen(false) },
|
|
2060
|
+
},
|
|
2061
|
+
h('span', { className: 'tsd-cur-symbol' }, CURRENCY_SYMBOLS[c]),
|
|
2062
|
+
h('span', { className: 'tsd-cur-name' }, t(c === 'CNY' ? 'currencyCNY' : 'currencyUSD')),
|
|
2063
|
+
c === active ? h(SvgIcon, { name: 'check', size: 12, className: 'tsd-cur-check' }) : null)),
|
|
2064
|
+
h('div', { className: 'tsd-popover-note' }, t('currencyHint')))
|
|
2065
|
+
: null)
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
/* ---------------------------------------------------------------------------
|
|
2069
|
+
* 模型占比(KPI 网格里的第 6 格)
|
|
2070
|
+
*
|
|
2071
|
+
* 数据直接吃宿主 `byModel` 的行(与「按模型明细」表同一份),不另算一遍。
|
|
2072
|
+
* 明细放在各段的原生 title 上而不是浮层:KPI 卡贴着设置面板的裁剪边界,
|
|
2073
|
+
* 再叠一层浮层只会把之前修好的裁剪问题带回来。
|
|
2074
|
+
* ------------------------------------------------------------------------- */
|
|
2075
|
+
const SHARE_COLORS = [
|
|
2076
|
+
// 只用主题里真实存在、且彼此分得开的彩色族:深蓝、绿、琥珀、红。
|
|
2077
|
+
// 不用 neutral / 白 / 黑 —— 它们在深浅两套主题里一边会糊进背景,一边会被读成禁用态。
|
|
2078
|
+
'var(--dsw-static-deepseek-500)',
|
|
2079
|
+
'var(--dsw-static-green-500)',
|
|
2080
|
+
'var(--dsw-static-amber-500)',
|
|
2081
|
+
'var(--dsw-static-red-400)',
|
|
2082
|
+
]
|
|
2083
|
+
const SHARE_TOP = 4
|
|
2084
|
+
const SHARE_REST_KEY = '__rest__'
|
|
2085
|
+
|
|
2086
|
+
/** `provider/model` → 裸模型名;色带格位放不下全名,全名留给 title 与 aria。 */
|
|
2087
|
+
function shortModelName(key) {
|
|
2088
|
+
const s = String(key == null ? '' : key)
|
|
2089
|
+
const i = s.lastIndexOf('/')
|
|
2090
|
+
return i === -1 ? s : s.slice(i + 1)
|
|
2091
|
+
}
|
|
2092
|
+
/** 宿主行是 `totalTokens`;兼容已映射成 `total` 的形状,空行也不能抛。 */
|
|
2093
|
+
function rowTotal(r) {
|
|
2094
|
+
return r ? (r.totalTokens || r.total || 0) : 0
|
|
2095
|
+
}
|
|
2096
|
+
/** 降序取前 4 段,其余并成「其它」;无数据时返回空段。 */
|
|
2097
|
+
function shareSegments(rows) {
|
|
2098
|
+
const list = (rows || []).slice().sort((a, b) => rowTotal(b) - rowTotal(a))
|
|
2099
|
+
const total = list.reduce((s, r) => s + rowTotal(r), 0)
|
|
2100
|
+
if (total <= 0) return { total: 0, segs: [] }
|
|
2101
|
+
const numbers = (r) => ({
|
|
2102
|
+
tokens: rowTotal(r),
|
|
2103
|
+
calls: r.calls || 0,
|
|
2104
|
+
// 与明细表同一口径:输入含缓存读写
|
|
2105
|
+
input: (r.inputTokens || 0) + (r.cacheReadTokens || 0) + (r.cacheWriteTokens || 0),
|
|
2106
|
+
output: r.outputTokens || 0,
|
|
2107
|
+
cost: r.cost || 0,
|
|
2108
|
+
})
|
|
2109
|
+
const segs = list.slice(0, SHARE_TOP).map((r, i) => Object.assign({
|
|
2110
|
+
key: String(r.key),
|
|
2111
|
+
label: shortModelName(r.key),
|
|
2112
|
+
pct: rowTotal(r) / total,
|
|
2113
|
+
color: SHARE_COLORS[i % SHARE_COLORS.length],
|
|
2114
|
+
}, numbers(r)))
|
|
2115
|
+
const restRows = list.slice(SHARE_TOP)
|
|
2116
|
+
const restTokens = restRows.reduce((s, r) => s + rowTotal(r), 0)
|
|
2117
|
+
if (restTokens > 0) {
|
|
2118
|
+
const agg = restRows.reduce((a, r) => {
|
|
2119
|
+
const n = numbers(r)
|
|
2120
|
+
return {
|
|
2121
|
+
tokens: a.tokens + n.tokens,
|
|
2122
|
+
calls: a.calls + n.calls,
|
|
2123
|
+
input: a.input + n.input,
|
|
2124
|
+
output: a.output + n.output,
|
|
2125
|
+
cost: a.cost + n.cost,
|
|
2126
|
+
}
|
|
2127
|
+
}, { tokens: 0, calls: 0, input: 0, output: 0, cost: 0 })
|
|
2128
|
+
segs.push(Object.assign({
|
|
2129
|
+
key: SHARE_REST_KEY,
|
|
2130
|
+
label: null, // 「其它」的文案由渲染层取词典
|
|
2131
|
+
pct: restTokens / total,
|
|
2132
|
+
// 「其它」用同色系的淡色(浅蓝),不用灰/白:那两种在深色卡片上会被读成禁用
|
|
2133
|
+
color: 'var(--dsw-static-deepseek-300)',
|
|
2134
|
+
}, agg))
|
|
2135
|
+
}
|
|
2136
|
+
return { total, segs }
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
function ModelShareBar(props) {
|
|
2140
|
+
const { rows, currency } = props
|
|
2141
|
+
const t = useT()
|
|
2142
|
+
const [tip, setTip] = React.useState(null) // { key, left, top } in viewport coords
|
|
2143
|
+
const occ = shareSegments(rows)
|
|
2144
|
+
if (occ.total <= 0) return h('div', { className: 'tsd-card-value tsd-share-empty' }, t('noData'))
|
|
2145
|
+
const find = (key) => occ.segs.filter((s) => s.key === key)[0] || null
|
|
2146
|
+
const shown = (tip && find(tip.key)) || occ.segs[0]
|
|
2147
|
+
const labelOf = (s) => (s.key === SHARE_REST_KEY ? t('shareOther') : s.label)
|
|
2148
|
+
const fullOf = (s) => (s.key === SHARE_REST_KEY ? t('shareOther') : s.key)
|
|
2149
|
+
const costOf = (s) => (s.tokens > 0 && !(s.cost > 0) ? t('unpriced') : formatCost(s.cost, currency))
|
|
2150
|
+
// 悬停/聚焦:从段的视口矩形推开,fixed 定位不受设置面板 overflow 裁剪
|
|
2151
|
+
const showTip = (e, s) => {
|
|
2152
|
+
const r = e.currentTarget.getBoundingClientRect()
|
|
2153
|
+
setTip({ key: s.key, left: r.left + r.width / 2, top: r.top })
|
|
2154
|
+
}
|
|
2155
|
+
const hideTip = () => setTip(null)
|
|
2156
|
+
const tipBox = shown && tip
|
|
2157
|
+
? h('div', {
|
|
2158
|
+
className: 'tsd-tooltip tsd-share-tip',
|
|
2159
|
+
style: { position: 'fixed', left: tip.left + 'px', top: tip.top + 'px', transform: 'translate(-50%, -110%)' },
|
|
2160
|
+
},
|
|
2161
|
+
h('div', { className: 'tsd-tooltip-date' }, fullOf(shown)),
|
|
2162
|
+
h('div', { className: 'tsd-tooltip-row' },
|
|
2163
|
+
h('span', { className: 'tsd-tooltip-dot', style: { background: shown.color } }),
|
|
2164
|
+
h('span', null, t('totalTokens')),
|
|
2165
|
+
h('span', { className: 'tsd-tooltip-val' }, formatInt(shown.tokens))),
|
|
2166
|
+
h('div', { className: 'tsd-tooltip-row' },
|
|
2167
|
+
h('span', null, t('legendInput')),
|
|
2168
|
+
h('span', { className: 'tsd-tooltip-val' }, formatInt(shown.input))),
|
|
2169
|
+
h('div', { className: 'tsd-tooltip-row' },
|
|
2170
|
+
h('span', null, t('legendOutput')),
|
|
2171
|
+
h('span', { className: 'tsd-tooltip-val' }, formatInt(shown.output))),
|
|
2172
|
+
h('div', { className: 'tsd-tooltip-row' },
|
|
2173
|
+
h('span', null, t('cost')),
|
|
2174
|
+
h('span', { className: 'tsd-tooltip-val' }, costOf(shown))))
|
|
2175
|
+
: null
|
|
2176
|
+
return h('div', { className: 'tsd-card-share-body' },
|
|
2177
|
+
h('div', { className: 'tsd-share-track', onMouseLeave: hideTip },
|
|
2178
|
+
occ.segs.map((s) => h('div', {
|
|
2179
|
+
key: s.key,
|
|
2180
|
+
className: 'tsd-share-seg',
|
|
2181
|
+
'data-share-key': s.key,
|
|
2182
|
+
'data-active': shown && shown.key === s.key ? 'true' : undefined,
|
|
2183
|
+
style: { width: s.pct * 100 + '%', background: s.color },
|
|
2184
|
+
role: 'img',
|
|
2185
|
+
tabIndex: 0,
|
|
2186
|
+
'aria-label': fullOf(s) + ' · ' + fmtPct(s.pct) + ' · ' + formatInt(s.tokens) + ' ' + t('totalTokens'),
|
|
2187
|
+
onMouseEnter: (e) => showTip(e, s),
|
|
2188
|
+
onFocus: (e) => showTip(e, s),
|
|
2189
|
+
onBlur: hideTip,
|
|
2190
|
+
}))),
|
|
2191
|
+
// 条下只留一行低调脚注(当前悬浮的那段,否则最大的那段);
|
|
2192
|
+
// 全名与明细都在悬浮卡片里,所以这里不挂 title。
|
|
2193
|
+
h('div', { className: 'tsd-share-caption' },
|
|
2194
|
+
h('span', { className: 'tsd-share-cap-name' }, labelOf(shown)),
|
|
2195
|
+
h('span', { className: 'tsd-share-cap-pct' }, fmtPct(shown.pct))),
|
|
2196
|
+
tipBox)
|
|
2197
|
+
}
|
|
2198
|
+
|
|
2199
|
+
/* ---------------------------------------------------------------------------
|
|
2200
|
+
* 汇总指标卡 ×6
|
|
1690
2201
|
* ------------------------------------------------------------------------- */
|
|
1691
2202
|
function SummaryCards(props) {
|
|
1692
|
-
const { total, currency, unpricedCalls } = props
|
|
2203
|
+
const { total, currency, unpricedCalls, currencyCode, onCurrencyChange, byModel } = props
|
|
1693
2204
|
const tt = useT()
|
|
1694
2205
|
const d = total || {}
|
|
1695
2206
|
const inputTotal = (d.inputTokens || 0) + (d.cacheReadTokens || 0) + (d.cacheWriteTokens || 0)
|
|
@@ -1716,8 +2227,15 @@ function SummaryCards(props) {
|
|
|
1716
2227
|
},
|
|
1717
2228
|
{
|
|
1718
2229
|
key: 'cost', icon: 'coins', label: tt('cost'),
|
|
1719
|
-
|
|
2230
|
+
// 符号由 prefix 的币种切换器画(它显示当前币种符号),这里只给数字
|
|
2231
|
+
value: costDigits(d.cost), title: formatCost(d.cost, currency),
|
|
1720
2232
|
color: 'var(--dsw-static-green-500)',
|
|
2233
|
+
prefix: h(CurrencyPicker, { code: currencyCode, onChange: onCurrencyChange }),
|
|
2234
|
+
},
|
|
2235
|
+
{
|
|
2236
|
+
key: 'share', icon: 'share', label: tt('modelShare'),
|
|
2237
|
+
color: 'var(--dsw-alias-brand-primary)',
|
|
2238
|
+
content: h(ModelShareBar, { rows: byModel, currency }),
|
|
1721
2239
|
},
|
|
1722
2240
|
]
|
|
1723
2241
|
return h('div', { className: 'tsd-cards' },
|
|
@@ -1727,7 +2245,9 @@ function SummaryCards(props) {
|
|
|
1727
2245
|
h('span', { className: 'tsd-card-icon', style: { color: c.color } },
|
|
1728
2246
|
h(SvgIcon, { name: c.icon, size: 14 })),
|
|
1729
2247
|
h('span', { className: 'tsd-card-label' }, c.label)),
|
|
1730
|
-
|
|
2248
|
+
c.content
|
|
2249
|
+
? c.content
|
|
2250
|
+
: h('div', { className: 'tsd-card-value', title: c.title }, c.prefix || null, c.value),
|
|
1731
2251
|
c.sub ? h('div', { className: 'tsd-card-sub' }, c.sub) : null,
|
|
1732
2252
|
c.key === 'cost' && unpricedCalls > 0
|
|
1733
2253
|
? h('div', { className: 'tsd-card-note' }, tt('unpricedNote', { count: formatInt(unpricedCalls) }))
|
|
@@ -2267,6 +2787,9 @@ function StatsDashboard(props) {
|
|
|
2267
2787
|
const [data, setData] = React.useState(null)
|
|
2268
2788
|
const [error, setError] = React.useState(null)
|
|
2269
2789
|
const [prices, setPrices] = React.useState({ prices: {}, currency: '¥' })
|
|
2790
|
+
// 展示币种:宿主按它换算成本,所以换币种必须重查;选择记在本地(展示偏好,
|
|
2791
|
+
// 不写插件设置,免得每次取数都在改写用户配置)。
|
|
2792
|
+
const [displayCurrency, setDisplayCurrency] = React.useState(readStoredCurrency)
|
|
2270
2793
|
// P1-6 backfill 轮询状态:queryKey 变化时重置,仅对同一查询串轮询
|
|
2271
2794
|
const queryKeyRef = React.useRef(null)
|
|
2272
2795
|
const backfillSeenRef = React.useRef(false)
|
|
@@ -2284,7 +2807,7 @@ function StatsDashboard(props) {
|
|
|
2284
2807
|
React.useEffect(() => {
|
|
2285
2808
|
let current = true
|
|
2286
2809
|
let backfillTimer = null
|
|
2287
|
-
const queryKey = eff.from + '|' + eff.to + '|' + models.join(',') + '|' + effGran + '|' + stepDays
|
|
2810
|
+
const queryKey = eff.from + '|' + eff.to + '|' + models.join(',') + '|' + effGran + '|' + stepDays + '|' + displayCurrency
|
|
2288
2811
|
if (queryKeyRef.current !== queryKey) {
|
|
2289
2812
|
queryKeyRef.current = queryKey
|
|
2290
2813
|
backfillSeenRef.current = false
|
|
@@ -2297,10 +2820,12 @@ function StatsDashboard(props) {
|
|
|
2297
2820
|
from: eff.from,
|
|
2298
2821
|
to: eff.to,
|
|
2299
2822
|
models: models.slice(),
|
|
2300
|
-
|
|
2823
|
+
// 「全部」不做零填充:真实边界是输出桶数(宿主 MAX_BUCKETS),不是天数。
|
|
2824
|
+
fill: range !== 'all',
|
|
2301
2825
|
granularity: effGran,
|
|
2302
2826
|
stepDays,
|
|
2303
2827
|
heatmap: true,
|
|
2828
|
+
currency: displayCurrency,
|
|
2304
2829
|
})
|
|
2305
2830
|
.then((r) => {
|
|
2306
2831
|
if (!current) return
|
|
@@ -2328,7 +2853,7 @@ function StatsDashboard(props) {
|
|
|
2328
2853
|
current = false
|
|
2329
2854
|
if (backfillTimer !== null) clearTimeout(backfillTimer)
|
|
2330
2855
|
}
|
|
2331
|
-
}, [eff.from, eff.to, models, effGran, stepDays, retry])
|
|
2856
|
+
}, [eff.from, eff.to, models, effGran, stepDays, displayCurrency, retry])
|
|
2332
2857
|
|
|
2333
2858
|
// 价格表:进入页面拉一次 + 每次刷新同步。
|
|
2334
2859
|
// P0-1:优先官方 settings scope(usage.prices 命名空间),不可用时回退 RPC。
|
|
@@ -2379,6 +2904,15 @@ function StatsDashboard(props) {
|
|
|
2379
2904
|
setRange('today')
|
|
2380
2905
|
}, [])
|
|
2381
2906
|
|
|
2907
|
+
const changeCurrency = React.useCallback((code) => {
|
|
2908
|
+
storeCurrency(code)
|
|
2909
|
+
setDisplayCurrency(code)
|
|
2910
|
+
}, [])
|
|
2911
|
+
// 符号以宿主回传的实际币种为准(切换后立刻重查,不会出现「换了标志没换数字」);
|
|
2912
|
+
// 老宿主没有该字段时按本地选择兜底。
|
|
2913
|
+
const currencySymbol = (data && data.currency && data.currency.symbol)
|
|
2914
|
+
|| CURRENCY_SYMBOLS[displayCurrency] || prices.currency || '¥'
|
|
2915
|
+
|
|
2382
2916
|
const busy = status === 'loading' || status === 'refreshing'
|
|
2383
2917
|
const ready = data !== null
|
|
2384
2918
|
const isError = status === 'error'
|
|
@@ -2417,8 +2951,11 @@ function StatsDashboard(props) {
|
|
|
2417
2951
|
? h('div', { className: 'tsd-content', 'data-busy': busy ? 'true' : undefined },
|
|
2418
2952
|
h(SummaryCards, {
|
|
2419
2953
|
total: data.total,
|
|
2420
|
-
currency:
|
|
2954
|
+
currency: currencySymbol,
|
|
2421
2955
|
unpricedCalls: data.unpricedCalls || 0,
|
|
2956
|
+
currencyCode: displayCurrency,
|
|
2957
|
+
onCurrencyChange: changeCurrency,
|
|
2958
|
+
byModel: data.byModel,
|
|
2422
2959
|
}),
|
|
2423
2960
|
h(DailyChart, {
|
|
2424
2961
|
daily: data.daily,
|
|
@@ -2427,10 +2964,177 @@ function StatsDashboard(props) {
|
|
|
2427
2964
|
granLabel,
|
|
2428
2965
|
}),
|
|
2429
2966
|
h(HeatmapCard, { days: data.heatmap || [] }),
|
|
2430
|
-
h(ModelTable, { rows: data.byModel, currency:
|
|
2967
|
+
h(ModelTable, { rows: data.byModel, currency: currencySymbol }))
|
|
2431
2968
|
: null))
|
|
2432
2969
|
}
|
|
2433
2970
|
|
|
2971
|
+
/* ---------------------------------------------------------------------------
|
|
2972
|
+
* 设置页导航图标
|
|
2973
|
+
*
|
|
2974
|
+
* `settings.section` 只投影 id/order/label,导航图标由设置页按 id 白名单自己
|
|
2975
|
+
* 决定(dsh-client-ui-settings-general 的 navIcon),第三方没有插口。所以这里
|
|
2976
|
+
* 给「自己那一行」打一个属性标记,再用 CSS mask 把兜底的齿轮换成用量图标:
|
|
2977
|
+
* 不替换节点、不碰 React 管的 svg(替换会让 React 卸载时抛 NotFoundError),
|
|
2978
|
+
* 只加属性、只用 ::before 画字形。
|
|
2979
|
+
*
|
|
2980
|
+
* 认行只能按可见文本:类名是 CSS Modules 哈希,账号行还会条件出现。
|
|
2981
|
+
* 官方一旦给 settings.section 加上 icon 字段,这个模块应整体删除。
|
|
2982
|
+
* ------------------------------------------------------------------------- */
|
|
2983
|
+
const NAV_ICON_MASK = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(
|
|
2984
|
+
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">'
|
|
2985
|
+
+ '<rect x="2.5" y="9" width="2.5" height="5" rx="1"/>'
|
|
2986
|
+
+ '<rect x="6.75" y="5.5" width="2.5" height="8.5" rx="1"/>'
|
|
2987
|
+
+ '<rect x="11" y="2.5" width="2.5" height="11.5" rx="1"/></svg>',
|
|
2988
|
+
)
|
|
2989
|
+
// mask 只读 alpha 通道,所以字形必须是纯色实心(icon.svg 的渐变与半透明在这里会丢)
|
|
2990
|
+
const NAV_ICON_CSS = [
|
|
2991
|
+
'[data-tsd-nav] > svg { display: none; }',
|
|
2992
|
+
'[data-tsd-nav]::before {',
|
|
2993
|
+
" content: '';",
|
|
2994
|
+
' flex: none;',
|
|
2995
|
+
' width: 16px;',
|
|
2996
|
+
' height: 16px;',
|
|
2997
|
+
' background: currentColor;',
|
|
2998
|
+
' -webkit-mask-image: url("' + NAV_ICON_MASK + '");',
|
|
2999
|
+
' mask-image: url("' + NAV_ICON_MASK + '");',
|
|
3000
|
+
' -webkit-mask-size: 16px 16px;',
|
|
3001
|
+
' mask-size: 16px 16px;',
|
|
3002
|
+
' -webkit-mask-repeat: no-repeat;',
|
|
3003
|
+
' mask-repeat: no-repeat;',
|
|
3004
|
+
'}',
|
|
3005
|
+
].join('\n')
|
|
3006
|
+
|
|
3007
|
+
/** 认不出行、拿不到 DOM,都只是退化成齿轮,绝不抛出。返回 disposer。 */
|
|
3008
|
+
function installSettingsNavIcon(label) {
|
|
3009
|
+
if (typeof document === 'undefined' || typeof MutationObserver !== 'function') return null
|
|
3010
|
+
let styleEl = null
|
|
3011
|
+
try {
|
|
3012
|
+
styleEl = document.createElement('style')
|
|
3013
|
+
styleEl.setAttribute('data-plugin', 'dsh-plugin-usage')
|
|
3014
|
+
styleEl.textContent = NAV_ICON_CSS
|
|
3015
|
+
document.head.appendChild(styleEl)
|
|
3016
|
+
} catch (e) {
|
|
3017
|
+
console.warn('[usage] settings nav icon: styles unavailable')
|
|
3018
|
+
return null
|
|
3019
|
+
}
|
|
3020
|
+
const mark = () => {
|
|
3021
|
+
const rows = document.querySelectorAll('[role="dialog"] button')
|
|
3022
|
+
const want = label()
|
|
3023
|
+
for (let i = 0; i < rows.length; i++) {
|
|
3024
|
+
const row = rows[i]
|
|
3025
|
+
if (row.getAttribute('data-tsd-nav') !== null) continue
|
|
3026
|
+
if (!row.querySelector('svg')) continue // 只标带图标的导航行,别误标普通按钮
|
|
3027
|
+
if ((row.textContent || '').trim() !== want) continue
|
|
3028
|
+
row.setAttribute('data-tsd-nav', '')
|
|
3029
|
+
}
|
|
3030
|
+
}
|
|
3031
|
+
let observer = null
|
|
3032
|
+
try {
|
|
3033
|
+
mark()
|
|
3034
|
+
observer = new MutationObserver(() => { try { mark() } catch (e) {} })
|
|
3035
|
+
observer.observe(document.body, { childList: true, subtree: true })
|
|
3036
|
+
} catch (e) {
|
|
3037
|
+
console.warn('[usage] settings nav icon: observer unavailable', e)
|
|
3038
|
+
}
|
|
3039
|
+
return () => {
|
|
3040
|
+
if (observer) observer.disconnect()
|
|
3041
|
+
if (styleEl) styleEl.remove()
|
|
3042
|
+
const marked = document.querySelectorAll('[data-tsd-nav]')
|
|
3043
|
+
for (let i = 0; i < marked.length; i++) marked[i].removeAttribute('data-tsd-nav')
|
|
3044
|
+
}
|
|
3045
|
+
}
|
|
3046
|
+
|
|
3047
|
+
/* ---------------------------------------------------------------------------
|
|
3048
|
+
* 输入区成本 pill(composer dock)
|
|
3049
|
+
*
|
|
3050
|
+
* DSH 0.2.1-rc.1 把输入区统计拆成 `activity` / `usage` 两个 composer dock 条目,
|
|
3051
|
+
* 宿主自己的 `usage` pill 显示 token 数(读官方 `tokenUsage` 投影)。官方投影只有
|
|
3052
|
+
* 会话内合计、**不带模型归因**,而成本必须按模型单价算(本插件自 v0.3 起坚持
|
|
3053
|
+
* 不混价),所以这里不走投影,改走本插件自己的 `query`:记录里带 provider/model,
|
|
3054
|
+
* 宿主侧按模型精确计价。
|
|
3055
|
+
*
|
|
3056
|
+
* 口径取「今日」而不是「本会话」:dock 条目拿不到会话标识(宿主渲染这个 slot 时
|
|
3057
|
+
* 是 `renderSlot("conversation.composer.dock", {})`,不传 props),而今日成本与
|
|
3058
|
+
* 宿主的 token pill 正好互补。
|
|
3059
|
+
* ------------------------------------------------------------------------- */
|
|
3060
|
+
const DOCK_REFRESH_MS = 30000
|
|
3061
|
+
/** 回填(backfill)进行中的快重试间隔,与设置页一致。 */
|
|
3062
|
+
const DOCK_BACKFILL_RETRY_MS = 3000
|
|
3063
|
+
|
|
3064
|
+
function CostPill(props) {
|
|
3065
|
+
const tr = props && typeof props.t === 'function' ? props.t : fallbackT
|
|
3066
|
+
const [state, setState] = React.useState({ status: 'loading' })
|
|
3067
|
+
React.useEffect(() => {
|
|
3068
|
+
let alive = true
|
|
3069
|
+
let timer = null
|
|
3070
|
+
const schedule = (ms) => {
|
|
3071
|
+
if (timer !== null) clearTimeout(timer)
|
|
3072
|
+
timer = setTimeout(load, ms)
|
|
3073
|
+
}
|
|
3074
|
+
const load = () => {
|
|
3075
|
+
if (!alive) return
|
|
3076
|
+
const now = new Date()
|
|
3077
|
+
hostCall('usage/query', {
|
|
3078
|
+
from: startOfDay(now).getTime(),
|
|
3079
|
+
to: now.getTime(),
|
|
3080
|
+
// 「今日」是有限区间,但不需零填充:空桶对成本没意义。
|
|
3081
|
+
fill: false,
|
|
3082
|
+
granularity: 'day',
|
|
3083
|
+
currency: readStoredCurrency(),
|
|
3084
|
+
})
|
|
3085
|
+
.then((r) => {
|
|
3086
|
+
if (!alive) return
|
|
3087
|
+
const total = (r && r.total) || null
|
|
3088
|
+
setState({
|
|
3089
|
+
status: 'ready',
|
|
3090
|
+
calls: total ? total.calls : 0,
|
|
3091
|
+
tokens: total ? total.totalTokens : 0,
|
|
3092
|
+
cost: total ? total.cost : 0,
|
|
3093
|
+
symbol: (r && r.currency && r.currency.symbol)
|
|
3094
|
+
|| CURRENCY_SYMBOLS[readStoredCurrency()]
|
|
3095
|
+
|| '¥',
|
|
3096
|
+
})
|
|
3097
|
+
const backfilling = Boolean(r && r.backfill && r.backfill.status === 'running')
|
|
3098
|
+
schedule(backfilling ? DOCK_BACKFILL_RETRY_MS : DOCK_REFRESH_MS)
|
|
3099
|
+
})
|
|
3100
|
+
.catch(() => {
|
|
3101
|
+
// 路由不可用 / 宿主未就绪:不猜数字,也不报错弹窗(dock 常驻,不能刷屏)。
|
|
3102
|
+
if (alive) {
|
|
3103
|
+
setState({ status: 'error' })
|
|
3104
|
+
schedule(DOCK_REFRESH_MS)
|
|
3105
|
+
}
|
|
3106
|
+
})
|
|
3107
|
+
}
|
|
3108
|
+
load()
|
|
3109
|
+
const onVisible = () => {
|
|
3110
|
+
if (typeof document !== 'undefined' && document.visibilityState === 'visible') load()
|
|
3111
|
+
}
|
|
3112
|
+
if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisible)
|
|
3113
|
+
return () => {
|
|
3114
|
+
alive = false
|
|
3115
|
+
if (timer !== null) clearTimeout(timer)
|
|
3116
|
+
if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisible)
|
|
3117
|
+
}
|
|
3118
|
+
}, [])
|
|
3119
|
+
// 今日无调用(或还没查到)就不占位:dock 是常驻区,空 pill 比没有更吵。
|
|
3120
|
+
if (state.status !== 'ready' || !state.calls) return null
|
|
3121
|
+
const priced = state.cost > 0
|
|
3122
|
+
const value = priced ? state.symbol + costDigits(state.cost) : tr('dockUnpriced')
|
|
3123
|
+
const hint = tr('dockHint', {
|
|
3124
|
+
cost: value,
|
|
3125
|
+
calls: formatInt(state.calls),
|
|
3126
|
+
tokens: formatInt(state.tokens),
|
|
3127
|
+
})
|
|
3128
|
+
return h('span', {
|
|
3129
|
+
className: 'tsd-dock',
|
|
3130
|
+
title: hint,
|
|
3131
|
+
'aria-label': hint,
|
|
3132
|
+
'data-usage-cost': true,
|
|
3133
|
+
},
|
|
3134
|
+
h('span', { className: 'tsd-dock-label' }, tr('today')),
|
|
3135
|
+
h('span', { className: 'tsd-dock-value' }, value))
|
|
3136
|
+
}
|
|
3137
|
+
|
|
2434
3138
|
/* ---------------------------------------------------------------------------
|
|
2435
3139
|
* 注册:settings.section 页面
|
|
2436
3140
|
* ------------------------------------------------------------------------- */
|
|
@@ -2451,6 +3155,7 @@ function apply(ctx) {
|
|
|
2451
3155
|
}, 'usage: styles')
|
|
2452
3156
|
ctx.effect(() => ctx.locale.register(NS, { zh: ZH, en: EN }), 'usage: dictionaries')
|
|
2453
3157
|
const t0 = ctx.locale ? ctx.locale.bind(NS) : fallbackT
|
|
3158
|
+
ctx.effect(() => installSettingsNavIcon(() => t0('nav')), 'usage: nav-icon')
|
|
2454
3159
|
// cordis ctx is a strict proxy: DIRECT property access on an un-injected
|
|
2455
3160
|
// service throws ("cannot get property X without inject"), so a bare
|
|
2456
3161
|
// `ctx.slots ?? ...` would throw and skip the fallback. Probe via the safe
|
|
@@ -2477,6 +3182,17 @@ function apply(ctx) {
|
|
|
2477
3182
|
{ name: 'settings.section', id: 'token-stats', order: 20, label: () => t0('nav'), locale: NS },
|
|
2478
3183
|
(props) => h(StatsDashboard, props),
|
|
2479
3184
|
))
|
|
3185
|
+
|
|
3186
|
+
// 输入区成本 pill。0.2.1 的 composer dock 是 list slot,宿主自己占了 activity(0)
|
|
3187
|
+
// 与 usage(1),插件排在它们之后;0.2.0 没有这个 slot,注入失败不能拖垮设置页。
|
|
3188
|
+
try {
|
|
3189
|
+
slots.inject('conversation.composer.dock', () => slots.register(
|
|
3190
|
+
{ name: 'conversation.composer.dock', id: 'usage-cost', order: 2, locale: NS },
|
|
3191
|
+
(props) => h(CostPill, props),
|
|
3192
|
+
))
|
|
3193
|
+
} catch (e) {
|
|
3194
|
+
console.warn('[usage] composer dock slot unavailable', e)
|
|
3195
|
+
}
|
|
2480
3196
|
}
|
|
2481
3197
|
|
|
2482
3198
|
return { inject: ['locale', 'slots'], apply }
|
|
@@ -2490,4 +3206,4 @@ return { inject: ['locale', 'slots'], apply }
|
|
|
2490
3206
|
return module.exports;
|
|
2491
3207
|
}
|
|
2492
3208
|
});
|
|
2493
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC9kc2gtcGx1Z2luLXVzYWdlL3NyYy9jbGllbnQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG9rZW4g55So6YeP57uf6K6hIOKAlCBzZXR0aW5ncy5zZWN0aW9uIENsaWVudCBVSe+8iOe6ryBKU++8jOWKqOaAgeaPkuS7tuaymeeuse+8iVxuLy8g5Y+v55So5YWo5bGA77yaUmVhY3QgLyBjdHggLyBzdHlsZXMgLyBob3N0IC8gY29uc29sZe+8m+a1j+iniOWZqOWFqOWxgCBEYXRlIC8gSW50bCDnrYnjgIJcbi8vIENTUyDluLjph4/lhoXogZToh6ogc3R5bGVzLmpz77yI5Yqo5oCB5o+S5Lu25rKZ566x5pegIGltcG9ydO+8jOagt+W8j+maj+acrOaWh+S7tuWKoOi9ve+8ieOAglxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgQ1NTID0gYFxuLyogPT09PT09PT09PT09IOW4g+WxgCA9PT09PT09PT09PT0gKi9cbi50c2Qtc2VjdGlvbiB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDE2cHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGFuaW1hdGlvbjogdHNkLWZhZGUtaW4gMC40cyB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG5Aa2V5ZnJhbWVzIHRzZC1mYWRlLWluIHtcbiAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XG4gIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9XG59XG5cbi8qID09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09ICovXG4udHNkLWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBnYXA6IDEycHg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbn1cbi50c2QtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyZW07XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXN1YnRpdGxlIHtcbiAgbWFyZ2luOiA0cHggMCAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbn1cbi50c2QtaWNvbi1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQ6IGluaGVyaXQ7XG59XG4udHNkLWljb24tYnRuOmhvdmVyIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbn1cbi50c2Qtc3Bpbm5pbmcgc3ZnIHtcbiAgYW5pbWF0aW9uOiB0c2Qtc3BpbiAwLjlzIGxpbmVhciBpbmZpbml0ZTtcbn1cbkBrZXlmcmFtZXMgdHNkLXNwaW4ge1xuICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbn1cblxuLyogPT09PT09PT09PT09IOetm+mAieagjyA9PT09PT09PT09PT0gKi9cbi50c2QtZmlsdGVyYmFyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbn1cbi50c2Qtc2VnLXdyYXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1zZWcge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IDRweDtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSkgMTIlLCB0cmFuc3BhcmVudCk7XG59XG4udHNkLXNlZy1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAyOHB4O1xuICBwYWRkaW5nOiAwIDEycHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLXNlZy1idG46aG92ZXIge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpO1xufVxuLnRzZC1zZWctYWN0aXZlIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpO1xuICBmb250LXdlaWdodDogNjAwO1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2MSk7XG59XG4udHNkLXNlZy1jdXN0b20ge1xuICBtYXgtd2lkdGg6IDIyMHB4O1xufVxuLnRzZC1zZWctY3VzdG9tIC50c2Qtc2VnLWxhYmVsIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLXNlZy1jdXN0b20udHNkLXNlZy1hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeS1pbnZlcnRlZCwgI2ZmZik7XG59XG4udHNkLXNlZy1jdXN0b20udHNkLXNlZy1hY3RpdmU6aG92ZXIge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktaG92ZXIpO1xufVxuXG4vKiA9PT09PT09PT09PT0g6YCa55So5oyJ6ZKuID09PT09PT09PT09PSAqL1xuLnRzZC1idG4ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDAgMTRweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtYnRuOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC1idG46ZGlzYWJsZWQgeyBvcGFjaXR5OiAwLjU7IGN1cnNvcjogbm90LWFsbG93ZWQ7IH1cbi50c2QtYnRuLXByaW1hcnkge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktZmlsbCk7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeS1pbnZlcnRlZCwgI2ZmZik7XG59XG4udHNkLWJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJ1dHRvbi1wcmltYXJ5LWhvdmVyKTsgfVxuLnRzZC1idG4tZ2hvc3QgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuLnRzZC1idG4tZ2hvc3Q6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG5cbi8qID09PT09PT09PT09PSDmta7lsYIgUG9wb3ZlciA9PT09PT09PT09PT0gKi9cbi50c2QtcG9wb3Zlci1hbmNob3Ige1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IGNhbGMoMTAwJSArIDZweCk7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDQwO1xuICBwYWRkaW5nOiAxMnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLW92ZXJsYXkpO1xuICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2Myk7XG59XG4udHNkLW1vZGVsLXBvcG92ZXIge1xuICB3aWR0aDogMzIwcHg7XG4gIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDI0cHgpO1xufVxuLnRzZC1yYW5nZS1wb3BvdmVyIHtcbiAgd2lkdGg6IDMwMHB4O1xuICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAyNHB4KTtcbn1cbi50c2QtcG9wb3Zlci10aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbn1cbi50c2QtcG9wb3Zlci10b29scyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLnRzZC1saW5rLWJ0biB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi50c2QtbGluay1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLXBvcG92ZXItYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIGdhcDogOHB4O1xuICBtYXJnaW4tdG9wOiAxMnB4O1xufVxuLnRzZC1wb3BvdmVyLW5vdGUge1xuICBtYXJnaW46IDhweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG4udHNkLXBvcG92ZXItZW1wdHkge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuXG4vKiA9PT09PT09PT09PT0g5qih5Z6L5LiL5ouJ5pCc57SiID09PT09PT09PT09PSAqL1xuLnRzZC1zZWxlY3QtYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBtaW4td2lkdGg6IDEyMHB4O1xuICBtYXgtd2lkdGg6IDI2MHB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50c2Qtc2VsZWN0LWJ0bjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMyk7IH1cbi50c2Qtc2VsZWN0LWhhcyB7IGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KSA0NSUsIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpKTsgfVxuLnRzZC1zZWxlY3QtbGFiZWwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWluLXdpZHRoOiAwO1xufVxuLnRzZC1jaGV2cm9uIHtcbiAgZmxleDogbm9uZTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuLnRzZC1jaGV2cm9uLW9wZW4geyB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9XG4udHNkLXNlYXJjaCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLnRzZC1zZWFyY2gtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogOHB4O1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLXNlYXJjaCBpbnB1dCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgOHB4IDAgMjhweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIG91dGxpbmU6IG5vbmU7XG59XG4udHNkLXNlYXJjaCBpbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KSAxOCUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2QtbW9kZWwtbGlzdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xuICBtYXgtaGVpZ2h0OiAyNDBweDtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWJnLWwyKTtcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iLWhvdmVyOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWhvdmVyLWwyKTtcbn1cbi50c2QtbW9kZWwtaXRlbSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogOHB4O1xuICBwYWRkaW5nOiA1cHggNnB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLW1vZGVsLWl0ZW06aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLW1vZGVsLWl0ZW0gaW5wdXQgeyBtYXJnaW46IDA7IGFjY2VudC1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpOyB9XG4udHNkLW1vZGVsLW5hbWUge1xuICBmb250LWZhbWlseTogdmFyKC0tZHMtZm9udC1mYW1pbHktY29kZSk7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1pbi13aWR0aDogMDtcbn1cblxuLyogPT09PT09PT09PT09IOiHquWumuS5ieaXpeacn+a1ruWxgiA9PT09PT09PT09PT0gKi9cbi50c2QtcmFuZ2UtZmllbGRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMHB4O1xufVxuLnRzZC1maWVsZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xufVxuLnRzZC1maWVsZC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xufVxuLnRzZC1maWVsZCBpbnB1dCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3V0bGluZTogbm9uZTtcbn1cbi50c2QtZmllbGQgaW5wdXQ6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSkgMTglLCB0cmFuc3BhcmVudCk7XG59XG4udHNkLWZpZWxkLWVycm9yIHtcbiAgbWFyZ2luOiA2cHggMCAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSk7XG59XG4udHNkLWZpZWxkLWhpbnQge1xuICBtYXJnaW46IDZweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDmsYfmgLvmjIfmoIfljaEgPT09PT09PT09PT09ICovXG4udHNkLWNhcmRzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNTBweCwgMWZyKSk7XG4gIGdhcDogMTBweDtcbn1cbi50c2QtY2FyZCB7XG4gIG1pbi13aWR0aDogMDtcbiAgcGFkZGluZzogMTRweCAxNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpO1xuICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2MSk7XG59XG4udHNkLWNhcmQtaGVhZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xufVxuLnRzZC1jYXJkLWljb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cbi50c2QtY2FyZC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtY2FyZC12YWx1ZSB7XG4gIG1hcmdpbi10b3A6IDhweDtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLWNhcmQtc3ViIHtcbiAgbWFyZ2luLXRvcDogNHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuLnRzZC1jYXJkLW5vdGUge1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS13YXJuLXByaW1hcnkpO1xufVxuXG4vKiA9PT09PT09PT09PT0g5Y2h54mH5aS06YOo77yI5Zu+6KGoIC8g6KGo5qC85YWx55So77yJID09PT09PT09PT09PSAqL1xuLnRzZC1jYXJkLWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZ2FwOiA4cHg7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG4udHNkLWNhcmQtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtY2FyZC10YWcge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLyogPT09PT09PT09PT09IOavj+aXpeeUqOmHj+afseeKtuWbviA9PT09PT09PT09PT0gKi9cbi50c2QtY2hhcnQtY2FyZCB7IHBhZGRpbmc6IDE0cHggMTZweCAxMHB4OyB9XG4udHNkLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMTRweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLnRzZC1sZWdlbmQtaXRlbSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWxlZ2VuZC1kb3QsXG4udHNkLXRvb2x0aXAtZG90IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLWxlZ2VuZC1pbiB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTsgfVxuLnRzZC1sZWdlbmQtb3V0IHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApOyB9XG4udHNkLWxlZ2VuZC10b3RhbCB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpOyB9XG5cbi50c2QtY2hhcnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBnYXA6IDJweDtcbiAgaGVpZ2h0OiAyNDBweDtcbiAgcGFkZGluZzogMCA0cHg7XG59XG4udHNkLWNoYXJ0LWNvbCB7XG4gIGZsZXg6IDE7XG4gIG1pbi13aWR0aDogMDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tZHMtdHJhbnNpdGlvbi1kdXJhdGlvbi1mYXN0KSB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG4udHNkLWNoYXJ0LWNvbDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cbi50c2QtY2hhcnQ6aG92ZXIgLnRzZC1jaGFydC1jb2wgeyBvcGFjaXR5OiAwLjQ7IH1cbi50c2QtY2hhcnQ6aG92ZXIgLnRzZC1jaGFydC1jb2w6aG92ZXIsXG4udHNkLWNoYXJ0OmZvY3VzLXdpdGhpbiAudHNkLWNoYXJ0LWNvbDpmb2N1cyB7IG9wYWNpdHk6IDE7IH1cblxuLnRzZC1jaGFydC1wbG90IHtcbiAgZmxleDogMTtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMSkgMXB4LCB0cmFuc3BhcmVudCAxcHgpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMjUlO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xufVxuLnRzZC1jaGFydC1zdGFjayB7XG4gIHdpZHRoOiA2MiU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi50c2QtY2hhcnQtc2VnIHtcbiAgd2lkdGg6IDEwMCU7XG59XG4udHNkLXNlZy1pbiB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTtcbn1cbi50c2Qtc2VnLW91dCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1zdGF0aWMtZ3JlZW4tNTAwKTtcbiAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7XG59XG4udHNkLWNoYXJ0LWxhYmVsIHtcbiAgaGVpZ2h0OiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgbWFyZ2luLXRvcDogNnB4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1jaGFydC1sYWJlbC1oaWRkZW4geyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuLyogdG9vbHRpcCAqL1xuLnRzZC10b29sdGlwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgei1pbmRleDogNjtcbiAgbWluLXdpZHRoOiAxNTZweDtcbiAgcGFkZGluZzogOHB4IDEwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctb3ZlcmxheSk7XG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYzKTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLXRvb2x0aXAtZGF0ZSB7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC10b29sdGlwLXJvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBtYXJnaW46IDJweCAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbi50c2QtdG9vbHRpcC12YWwge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC10b29sdGlwLXRvdGFsIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW4tdG9wOiA2cHg7XG4gIHBhZGRpbmctdG9wOiA2cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuXG4vKiA9PT09PT09PT09PT0g5oyJ5qih5Z6L5piO57uG6KGoID09PT09PT09PT09PSAqL1xuLnRzZC10YWJsZS1jYXJkIHsgcGFkZGluZzogMDsgfVxuLnRzZC10YWJsZS1jYXJkIC50c2QtY2FyZC1oZWFkZXIgeyBwYWRkaW5nOiAxNHB4IDE2cHggMDsgfVxuLnRzZC10YWJsZS13cmFwIHtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWJnLWwyKTtcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iLWhvdmVyOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWhvdmVyLWwyKTtcbn1cbi50c2QtdGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLnRzZC10aCB7XG4gIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtdGgtbnVtIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50c2Qtc29ydC1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogaW5oZXJpdDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnRzZC1zb3J0LWJ0bjpob3ZlciB7IGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7IH1cbi50c2Qtc29ydC1hY3RpdmUgeyBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpOyB9XG4udHNkLXNvcnQtYXJyb3cge1xuICBmb250LXNpemU6IDEwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuLnRzZC10cjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtdGQge1xuICBwYWRkaW5nOiA5cHggMTJweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLXRkLW1vZGVsIHsgbWF4LXdpZHRoOiAyNDBweDsgfVxuLnRzZC1tb2RlbC1tb25vIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1heC13aWR0aDogMjIwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBmb250LWZhbWlseTogdmFyKC0tZHMtZm9udC1mYW1pbHktY29kZSk7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtbnVtIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG4udHNkLXRvdGFsIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtdW5wcmljZWQge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuLnRzZC10ZC1yYXRpbyB7IHRleHQtYWxpZ246IHJpZ2h0OyB9XG4udHNkLXJhdGlvIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIGdhcDogOHB4O1xufVxuLnRzZC1yYXRpby1iYXIge1xuICB3aWR0aDogNjBweDtcbiAgaGVpZ2h0OiA2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBmbGV4OiBub25lO1xufVxuLnRzZC1yYXRpby1maWxsIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApIDU1JSwgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay0zMDApKSk7XG59XG4udHNkLXJhdGlvLXBjdCB7XG4gIG1pbi13aWR0aDogNDJweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuXG4vKiA9PT09PT09PT09PT0g5LiJ5oCB77ya56m6IC8g6ZSZ6K+vIC8g5Yqg6L29ID09PT09PT09PT09PSAqL1xuLnRzZC1lbXB0eSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBwYWRkaW5nOiA0MHB4IDE2cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi50c2QtZW1wdHktaWNvbiB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBtYXJnaW4tYm90dG9tOiA0cHg7XG59XG4udHNkLWVtcHR5LXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLWVtcHR5LWRlc2Mge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xufVxuLnRzZC1lbXB0eS1ibG9jayB7XG4gIHBhZGRpbmc6IDI0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLnRzZC1lcnJvciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbiAgcGFkZGluZzogMjBweCAxNnB4O1xuICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSkgNDAlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3Itc2Vjb25kYXJ5KSAzMCUsIHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0zKSk7XG59XG4udHNkLWVycm9yLWljb24ge1xuICBmbGV4OiBub25lO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpO1xufVxuLnRzZC1lcnJvci10ZXh0IHtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xufVxuLnRzZC1lcnJvci10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1lcnJvci1kZXRhaWwge1xuICBtYXJnaW46IDJweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnRzZC1hbGVydC1iYW5uZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEwcHg7XG4gIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KSA0MCUsIHRyYW5zcGFyZW50KTtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1zZWNvbmRhcnkpIDMwJSwgdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuXG4udHNkLWxvYWRpbmcge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDE2cHg7XG59XG4udHNkLWNhcmQtc2tlbGV0b24geyBtaW4taGVpZ2h0OiA4NHB4OyB9XG4udHNkLXNrZWxldG9uIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLXNrZWxldG9uKTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBhbmltYXRpb246IHRzZC1wdWxzZSAxLjZzIHZhcigtLWRzLWVhc2UtaW4tb3V0KSBpbmZpbml0ZTtcbn1cbi50c2Qtc2tlbGV0b24tcm93IHtcbiAgaGVpZ2h0OiAxNHB4O1xuICBtYXJnaW46IDEycHggMDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLXNrZWxldG9uKTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBhbmltYXRpb246IHRzZC1wdWxzZSAxLjZzIHZhcigtLWRzLWVhc2UtaW4tb3V0KSBpbmZpbml0ZTtcbn1cbkBrZXlmcmFtZXMgdHNkLXB1bHNlIHtcbiAgMCUsIDEwMCUgeyBvcGFjaXR5OiAxOyB9XG4gIDUwJSB7IG9wYWNpdHk6IDAuNDU7IH1cbn1cblxuLyogPT09PT09PT09PT09IOWIt+aWsOaXtueahOWGheWuueaAgSA9PT09PT09PT09PT0gKi9cbi50c2QtY29udGVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uKSB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG4udHNkLWNvbnRlbnRbZGF0YS1idXN5PXRydWVdIHsgb3BhY2l0eTogMC41NTsgfVxuXG4vKiA9PT09PT09PT09PT0g5peg6Zqc56KNID09PT09PT09PT09PSAqL1xuLnRzZC12aXN1YWxseS1oaWRkZW4ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJvcmRlcjogMDtcbn1cbi50c2QtaWNvbiB7XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLXNlZy1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2Qtc2VsZWN0LWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2QtaWNvbi1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2QtbGluay1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2Qtc29ydC1idG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSk7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XG4vKiA9PT09PT09PT09PT0g57KS5bqm5YiH5o2iID09PT09PT09PT09PSAqL1xuLnRzZC1jYXJkLWFjdGlvbnMge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG59XG4udHNkLWdyYW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IDJweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG59XG4udHNkLWdyYW4tYnRuIHtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgcGFkZGluZzogMnB4IDhweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnRzZC1ncmFuLWJ0bltkYXRhLWFjdGl2ZT1cInRydWVcIl0ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMyk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2QtZ3Jhbi1idG46ZGlzYWJsZWQge1xuICBvcGFjaXR5OiAwLjQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG4vKiA9PT09PT09PT09PT0g5oqY57q/5Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1saW5lY2hhcnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmc6IDZweCAxMHB4IDhweDtcbn1cbi50c2QtbGluZWNoYXJ0IHN2ZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWdyaWQge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBzdHJva2Utd2lkdGg6IDE7XG4gIHN0cm9rZS1kYXNoYXJyYXk6IDMgMztcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1heGlzIHtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgc3Ryb2tlLXdpZHRoOiAxO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWluIHtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCk7XG4gIHN0cm9rZS13aWR0aDogMjtcbiAgZmlsbDogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1vdXQge1xuICBzdHJva2U6IHZhcigtLWRzdy1zdGF0aWMtZ3JlZW4tNTAwKTtcbiAgc3Ryb2tlLXdpZHRoOiAyO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLXRvdGFsIHtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgc3Ryb2tlLXdpZHRoOiAxLjU7XG4gIHN0cm9rZS1kYXNoYXJyYXk6IDQgMztcbiAgZmlsbDogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1kb3Qge1xuICBmaWxsOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMik7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHN0cm9rZS13aWR0aDogMTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1ob3ZlciB7XG4gIGZpbGw6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IGNyb3NzaGFpcjtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1jdXJzb3Ige1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDMpO1xuICBzdHJva2Utd2lkdGg6IDE7XG4gIHN0cm9rZS1kYXNoYXJyYXk6IDMgMztcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1iZy1iYXNlKTtcbiAgc3Ryb2tlLXdpZHRoOiAxLjU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWhsLWluIHsgZmlsbDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtb3V0IHsgZmlsbDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtdG90YWwgeyBmaWxsOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTsgfVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLXRleHQge1xuICBmaWxsOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXNpemU6IDEwcHg7XG59XG4vKiA9PT09PT09PT09PT0g5bm05bqm54Ot5Yqb5Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1oZWF0bWFwIHtcbiAgcGFkZGluZzogNnB4IDE0cHggMTRweDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbn1cbi50c2QtaGVhdG1hcC1pbm5lciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDRweDtcbiAgbWluLXdpZHRoOiBtaW4tY29udGVudDtcbn1cbi50c2QtaGVhdG1hcC1tb250aHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBtYXJnaW4tbGVmdDogMjZweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udHNkLWhlYXRtYXAtbW9udGgge1xuICBmb250LXNpemU6IDlweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbn1cbi50c2QtaGVhdG1hcC1ib2R5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA0cHg7XG59XG4udHNkLWhlYXRtYXAtZGF5cyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xuICB3aWR0aDogMjJweDtcbiAgZmxleDogbm9uZTtcbn1cbi50c2QtaGVhdG1hcC1kYXkge1xuICBoZWlnaHQ6IDEwcHg7XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBsaW5lLWhlaWdodDogMTBweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG59XG4udHNkLWhlYXRtYXAtZ3JpZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMnB4O1xufVxuLnRzZC1oZWF0bWFwLWNvbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xufVxuLnRzZC1oZWF0bWFwLWNlbGwge1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KSwgYm94LXNoYWRvdyB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtaGVhdG1hcC1jZWxsOmhvdmVyIHtcbiAgb3V0bGluZTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2Mik7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbn1cbi50c2QtaGVhdG1hcC1sZWdlbmQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDRweDtcbiAgbWFyZ2luOiA4cHggMTRweCAwO1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG5gXG5cbi8vIDAuMisgaG9zdCB0cmFuc3BvcnQ6IFBPU1QgL2FwaS88Y2hhbm5lbD4vPGVuZHBvaW50PiwgYXJncyBhcyB0aGUgSlNPTiBib2R5LFxuLy8gYW5zd2VyaW5nIHsgb2ssIHZhbHVlIH0gfCB7IG9rLCBlcnJvciB9IChzZWUgc3JjL2hvc3QvcnBjLmpzKS4gVGhlIHJvdXRlIGlzXG4vLyBtb3VudGVkIG9uIENvbm5lY3Rpb24ncyBzaGFyZWQgQVBJIGNoYW5uZWwsIHNvIGl0IG5ldmVyIG5lZWRzIHRoZSBwbHVnaW4nc1xuLy8gZmliZXIgdG8gb3duIGB3ZWJTZXJ2ZXJgLlxuZnVuY3Rpb24gY2FsbEZldGNoKGNoYW5uZWwsIGVuZHBvaW50LCBhcmdzKSB7XG4gIGNvbnN0IHBhdGggPSAnL2FwaS8nICsgU3RyaW5nKGNoYW5uZWwpLnJlcGxhY2UoL15cXC8rLywgJycpICsgJy8nICsgZW5kcG9pbnRcbiAgcmV0dXJuIGZldGNoKHBhdGgsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShhcmdzID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJncyksXG4gIH0pLnRoZW4oKHJlcykgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8ICcnXG4gICAgLy8gUm91dGUgbWlzc2luZyBvbiB0aGlzIGhvc3Q6IDQwNC80MDUgZnJvbSB0aGUgc2hhcmVkIGRpc3BhdGNoZXIsIG9yIHRoZVxuICAgIC8vIFNQQSBIVE1MIHdoZW4gbm8gdHJhbnNwb3J0IHJvdXRlIG1hdGNoZWQgdGhlIHBhdGggYXQgYWxsLlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQgfHwgcmVzLnN0YXR1cyA9PT0gNDA1IHx8IHR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID09PSAtMSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ3VzYWdlIEZldGNoIHJvdXRlIHVuYXZhaWxhYmxlIChIVFRQICcgKyByZXMuc3RhdHVzICsgJyknKVxuICAgICAgZXJyb3IuY29kZSA9ICd1c2FnZS1yb3V0ZS1taXNzaW5nJ1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qc29uKCkudGhlbigoYm9keSkgPT4ge1xuICAgICAgaWYgKGJvZHkgJiYgYm9keS5vaykgcmV0dXJuIGJvZHkudmFsdWVcbiAgICAgIHRocm93IG5ldyBFcnJvcigoYm9keSAmJiBib2R5LmVycm9yICYmIGJvZHkuZXJyb3IubWVzc2FnZSkgfHwgKCdSUEMgJyArIGVuZHBvaW50ICsgJyBmYWlsZWQnKSlcbiAgICB9KVxuICB9KVxufVxuXG4vLyBSUEMgYnJpZGdlOiBkeW5hbWljLXBsdWdpbiBydW5zIHByb3ZpZGUgYSBgaG9zdGAgZ2xvYmFsOyBzdGF0aWMgKGJ1bmRsZSlcbi8vIGluc3RhbGxzIHByb3ZpZGUgY3R4LmdldCgnY29ubmVjdGlvbicpLiBLZWVwIG9uZSBVSSBzb3VyY2UgZm9yIGJvdGguXG5mdW5jdGlvbiBob3N0Q2FsbChtZXRob2QsIGFyZ3MpIHtcbiAgLy8gUDAtMzogcHJlZmVyIHRoZSBvZmZpY2lhbCBgcmVtb3RlYCBzZXJ2aWNlIHdoZW4gaXQgZXhwb3NlcyB0aGUgdXNhZ2UgQVBJO1xuICAvLyBvdGhlcndpc2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBob3N0L2Nvbm5lY3Rpb24gZmFsbGJhY2tzIHVuY2hhbmdlZC5cbiAgY29uc3QgcmVtb3RlU2NvcGUgPSAodHlwZW9mIGN0eCAhPT0gJ3VuZGVmaW5lZCcgJiYgY3R4ICYmIHR5cGVvZiBjdHguZ2V0ID09PSAnZnVuY3Rpb24nKVxuICAgID8gY3R4XG4gICAgOiAodHlwZW9mIF91c2FnZUN0eCAhPT0gJ3VuZGVmaW5lZCcgJiYgX3VzYWdlQ3R4ICYmIHR5cGVvZiBfdXNhZ2VDdHguZ2V0ID09PSAnZnVuY3Rpb24nID8gX3VzYWdlQ3R4IDogbnVsbClcbiAgaWYgKHJlbW90ZVNjb3BlICYmIHR5cGVvZiByZW1vdGVTY29wZS5nZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtb3RlID0gcmVtb3RlU2NvcGUuZ2V0KCdyZW1vdGUnKVxuICAgICAgaWYgKHJlbW90ZSAmJiByZW1vdGUudXNhZ2UpIHtcbiAgICAgICAgY29uc3Qgck5hbWUgPSBTdHJpbmcobWV0aG9kKVxuICAgICAgICBjb25zdCByU2xhc2ggPSByTmFtZS5pbmRleE9mKCcvJylcbiAgICAgICAgY29uc3QgckVwID0gclNsYXNoID09PSAtMSA/IHJOYW1lIDogck5hbWUuc2xpY2UoclNsYXNoICsgMSlcbiAgICAgICAgY29uc3QgckNhbWVsID0gckVwLnJlcGxhY2UoLy0oW2Etel0pL2csIChtLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgIGNvbnN0IGZuID0gKHR5cGVvZiByZW1vdGUudXNhZ2VbckNhbWVsXSA9PT0gJ2Z1bmN0aW9uJyAmJiByZW1vdGUudXNhZ2VbckNhbWVsXSlcbiAgICAgICAgICB8fCAodHlwZW9mIHJlbW90ZS51c2FnZVtyRXBdID09PSAnZnVuY3Rpb24nICYmIHJlbW90ZS51c2FnZVtyRXBdKVxuICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBmbihhcmdzKSkudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5vaykgcmV0dXJuIHJlcy52YWx1ZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChyZXMgJiYgcmVzLmVycm9yICYmIHJlcy5lcnJvci5tZXNzYWdlKSB8fCAoJ1JQQyAnICsgbWV0aG9kICsgJyBmYWlsZWQnKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gcmVtb3RlIHByb2JpbmcgZmFpbGVkIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIGV4aXN0aW5nIGZhbGxiYWNrc1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIGhvc3QgIT09ICd1bmRlZmluZWQnICYmIGhvc3QgJiYgdHlwZW9mIGhvc3QuY2FsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaG9zdC5jYWxsKG1ldGhvZCwgYXJncykpXG4gIH1cbiAgLy8gU3RhdGljIGJ1bmRsZSBpbnN0YWxscyBoYXZlIG5vIGN0eC9ob3N0IGdsb2JhbHM6IHRoZSBlbnRyeSBhcHBseSgpIHN0b3Jlc1xuICAvLyB0aGUgcmVhbCBjb250ZXh0IGluIF91c2FnZUN0eCAoZGVjbGFyZWQgYnkgdGhlIGJ1aWxkIHdyYXBwZXIpLlxuICBjb25zdCBzY29wZSA9ICh0eXBlb2YgY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBjdHggJiYgdHlwZW9mIGN0eC5nZXQgPT09ICdmdW5jdGlvbicpXG4gICAgPyBjdHhcbiAgICA6ICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyA/IF91c2FnZUN0eCA6IG51bGwpXG4gIGlmIChzY29wZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc2NvcGUuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignY29udGV4dCB1bmF2YWlsYWJsZScpKVxuICB9XG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcobWV0aG9kKVxuICBjb25zdCBzbGFzaCA9IG5hbWUuaW5kZXhPZignLycpXG4gIGNvbnN0IGNoYW5uZWwgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZSgwLCBzbGFzaClcbiAgY29uc3QgZW5kcG9pbnQgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZShzbGFzaCArIDEpXG4gIC8vIExlZ2FjeSBwcmUtMC4yIHRyYW5zcG9ydDogYSBgL3VzYWdlYCBwcmVmaXggUlBDIGNoYW5uZWwgb3duZWQgYnkgdGhlIGhvc3RcbiAgLy8gcGx1Z2luIGl0c2VsZi5cbiAgY29uc3QgY2FsbFJwYyA9ICgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gc2NvcGUuZ2V0KCdjb25uZWN0aW9uJylcbiAgICBpZiAoY29ubmVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbm5lY3Rpb24ucnBjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Nvbm5lY3Rpb24gc2VydmljZSB1bmF2YWlsYWJsZScpKVxuICAgIH1cbiAgICByZXR1cm4gY29ubmVjdGlvbi5ycGMuY2FsbCgnLycgKyBjaGFubmVsLnJlcGxhY2UoL15cXC8rLywgJycpLCBlbmRwb2ludCwgYXJncykudGhlbigocmVzKSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcy5vaykgcmV0dXJuIHJlcy52YWx1ZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKChyZXMgJiYgcmVzLmVycm9yICYmIHJlcy5lcnJvci5tZXNzYWdlKSB8fCAoJ1JQQyAnICsgbWV0aG9kICsgJyBmYWlsZWQnKSlcbiAgICB9KVxuICB9XG4gIC8vIFByZWZlciB0aGUgc2hhcmVkLWNoYW5uZWwgRmV0Y2ggcm91dGU7IGFuIG9sZGVyIGhvc3QgYW5zd2VycyBcInJvdXRlXG4gIC8vIG1pc3NpbmdcIiBhbmQgd2UgZmFsbCBiYWNrIHRvIHRoZSBsZWdhY3kgY2hhbm5lbCBpdCBkb2VzIGltcGxlbWVudC5cbiAgY29uc3QgZmV0Y2hVc2FibGUgPSB0eXBlb2YgZmV0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAmJiAhKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT09ICdmaWxlOicpXG4gIGlmICghZmV0Y2hVc2FibGUpIHJldHVybiBjYWxsUnBjKClcbiAgcmV0dXJuIGNhbGxGZXRjaChjaGFubmVsLCBlbmRwb2ludCwgYXJncykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yICYmIGVycm9yLmNvZGUgPT09ICd1c2FnZS1yb3V0ZS1taXNzaW5nJykgcmV0dXJuIGNhbGxScGMoKVxuICAgIHRocm93IGVycm9yXG4gIH0pXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog6K6+572u5Z+f5a6a5Lu377ya5a6Y5pa5IGBjdHguY29uZmlnRm9ybXMuZ2V0KCd1c2FnZScpYO+8iGRzaC1jbGllbnQtdWktc2V0dGluZ3PvvInkvJjlhYjvvIxcbiAqIOS4jeWPr+eUqOaXtuWbnumAgCB1c2FnZS9wcmljZXMgUlBD44CC57uR5a6a5Y+q5YGa5LiA5qyh77yM6K+75YaZ5YWx55So5ZCM5LiAIGZvcm3jgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmxldCB1c2FnZUN0eCA9IG51bGxcbmxldCBfdXNhZ2VQcmljZXNTY29wZSA9IG51bGxcblxuZnVuY3Rpb24gcmVzb2x2ZVVzYWdlQ3R4KCkge1xuICBpZiAodXNhZ2VDdHggJiYgdHlwZW9mIHVzYWdlQ3R4LmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVzYWdlQ3R4XG4gIGlmICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicpIHJldHVybiBfdXNhZ2VDdHhcbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0VXNhZ2VQcmljZXNTY29wZSgpIHtcbiAgaWYgKF91c2FnZVByaWNlc1Njb3BlKSByZXR1cm4gX3VzYWdlUHJpY2VzU2NvcGVcbiAgY29uc3QgYyA9IHJlc29sdmVVc2FnZUN0eCgpXG4gIGlmICghYyB8fCB0eXBlb2YgYy5nZXQgIT09ICdmdW5jdGlvbicpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgLy8gMC4yLng6IHRoZSBvZmZpY2lhbCBjb25maWctZm9ybSBzdXJmYWNlIGZvciB0aGlzIHBsdWdpbidzIGVudHJ5IGlkXG4gICAgLy8gKGB1c2FnZWAsIHRoZSBidW5kbGUgcGF0Y2ggcm93IGlkKS4gYHNldHRpbmdzU2NvcGVgIGZyb20gMC4xLnggZG9lcyBub3RcbiAgICAvLyBleGlzdCBpbiB0aGUgc2hpcHBlZCBjbGllbnQsIHNvIHByb2JpbmcgaXQgb25seSBldmVyIHJldHVybmVkIG51bGwuXG4gICAgY29uc3QgZm9ybXMgPSBjLmdldCgnY29uZmlnRm9ybXMnKVxuICAgIGlmICghZm9ybXMgfHwgdHlwZW9mIGZvcm1zLmdldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGxcbiAgICBfdXNhZ2VQcmljZXNTY29wZSA9IGZvcm1zLmdldCgndXNhZ2UnKVxuICAgIHJldHVybiBfdXNhZ2VQcmljZXNTY29wZVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vLyDku7fmoLzlhpnlhaXlj6PvvJpzZXR0aW5ncyBzY29wZSDlj6/nlKjml7blhpkgdXNhZ2UucHJpY2VzIOWRveWQjeepuumXtOWtl+aute+8jFxuLy8g5ZCm5YiZ5Zue6YCAIHVzYWdlL3ByaWNlcyBSUEPvvIjlvZPliY0gVUkg5peg5Lu35qC857yW6L6R5Zmo77yM5L+d55WZ5q2k5YaZ5YWlIHNlYW0g5L6b5ZCO57ut5L2/55So77yJ44CCXG5mdW5jdGlvbiB1c2FnZVNhdmVQcmljZXMobmV4dCkge1xuICBjb25zdCBhcmdzID0ge31cbiAgaWYgKG5leHQgJiYgdHlwZW9mIG5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG5leHQucHJpY2VzICE9PSB1bmRlZmluZWQpIGFyZ3MucHJpY2VzID0gbmV4dC5wcmljZXNcbiAgICBpZiAobmV4dC5jdXJyZW5jeSAhPT0gdW5kZWZpbmVkKSBhcmdzLmN1cnJlbmN5ID0gbmV4dC5jdXJyZW5jeVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc2NvcGUgPSBnZXRVc2FnZVByaWNlc1Njb3BlKClcbiAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIHNjb3BlLnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgam9icyA9IFtdXG4gICAgICBpZiAoYXJncy5wcmljZXMgIT09IHVuZGVmaW5lZCkgam9icy5wdXNoKHNjb3BlLnNldCgncHJpY2VzJywgYXJncy5wcmljZXMpKVxuICAgICAgaWYgKGFyZ3MuY3VycmVuY3kgIT09IHVuZGVmaW5lZCkgam9icy5wdXNoKHNjb3BlLnNldCgnY3VycmVuY3knLCBhcmdzLmN1cnJlbmN5KSlcbiAgICAgIGlmIChqb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGpvYnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSB0eXBlb2Ygc2NvcGUuZ2V0U25hcHNob3QgPT09ICdmdW5jdGlvbicgPyBzY29wZS5nZXRTbmFwc2hvdCgpIDogbnVsbFxuICAgICAgICAgIHJldHVybiBzbmFwICYmIHNuYXAudmFsdWUgPyBzbmFwLnZhbHVlIDogbnVsbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgUlBDIHdyaXRlIHBhdGhcbiAgfVxuICByZXR1cm4gaG9zdENhbGwoJ3VzYWdlL3ByaWNlcycsIGFyZ3MpXG59XG5cbjtcbmNvbnN0IGggPSBSZWFjdC5jcmVhdGVFbGVtZW50XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5Zu96ZmF5YyW77yaemgvZW4g5a2X5YW4ICsgQ29udGV4dO+8iGxvY2FsZSDmnI3liqHnu48gc2xvdCDms6jlhozms6jlhaUgdO+8jOWtkOe7hOS7tue7jyBDb250ZXh0IOWPlueUqO+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgTlMgPSAndXNhZ2UnXG5jb25zdCBaSCA9IHtcbiAgbmF2OiAn55So6YeP57uf6K6hJyxcbiAgc3VidGl0bGU6ICfmn6XnnIsgQUkg5qih5Z6L55qE5L2/55So5oOF5Ya15ZKM5oiQ5pys57uf6K6hJyxcbiAgcmVmcmVzaDogJ+WIt+aWsCcsXG4gIHRvZGF5OiAn5LuK5pelJyxcbiAgbGFzdDdkOiAn6L+RN+WkqScsXG4gIGxhc3QzMGQ6ICfov5EzMOWkqScsXG4gIGN1c3RvbTogJ+iHquWumuS5iScsXG4gIGFsbE1vZGVsczogJ+WFqOmDqOaooeWeiycsXG4gIHNlbGVjdGVkTW9kZWxzOiAn5bey6YCJIHtjb3VudH0g5Liq5qih5Z6LJyxcbiAgc2VsZWN0QWxsOiAn5YWo6YCJJyxcbiAgY2xlYXI6ICfmuIXnqbonLFxuICBzZWFyY2hNb2RlbHM6ICfmkJzntKLmqKHlnosnLFxuICBub01hdGNoTW9kZWxzOiAn5peg5Yy56YWN5qih5Z6LJyxcbiAgbW9kZWxGaWx0ZXJIaW50OiAn5Yu+6YCJ5Y2z5pe255Sf5pWI77yM5LuF5YiX5Ye65b2T5YmN6IyD5Zu05YaF5pyJ5pWw5o2u55qE5qih5Z6LJyxcbiAgY3VzdG9tUmFuZ2VUaXRsZTogJ+iHquWumuS5ieaXtumXtOiMg+WbtCcsXG4gIGN1c3RvbVJhbmdlQXJpYTogJ+iHquWumuS5ieaXpeacn+iMg+WbtCcsXG4gIHN0YXJ0VGltZTogJ+W8gOWni+aXtumXtCcsXG4gIGVuZFRpbWU6ICfnu5PmnZ/ml7bpl7QnLFxuICByYW5nZUludmFsaWQ6ICflvIDlp4vml7bpl7TkuI3og73mmZrkuo7nu5PmnZ/ml7bpl7QnLFxuICByYW5nZUhpbnQ6ICfmlK/mjIHpgInmi6nml6XmnJ/vvIzmnIDplb8gMzAg5aSpJyxcbiAgY2FuY2VsOiAn5Y+W5raIJyxcbiAgY29uZmlybTogJ+ehruWumicsXG4gIGRhdGVSYW5nZUdyb3VwOiAn5pel5pyf6IyD5Zu0JyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ+aooeWei+etm+mAiScsXG4gIGNoYXJ0VHlwZUdyb3VwOiAn5Zu+6KGo57G75Z6LJyxcbiAgdG90YWxUb2tlbnM6ICfmgLsgVG9rZW4nLFxuICBpbnB1dFRva2VuczogJ+i+k+WFpSBUb2tlbicsXG4gIG91dHB1dFRva2VuczogJ+i+k+WHuiBUb2tlbicsXG4gIGNhbGxzOiAn6LCD55So5qyh5pWwJyxcbiAgY29zdDogJ+aIkOacrCcsXG4gIGFwcHJveElPOiAn4omIIOi+k+WFpSvovpPlh7onLFxuICB1bnByaWNlZE5vdGU6ICd7Y291bnR9IOasoeiwg+eUqOacquWumuS7tycsXG4gIGRhaWx5VHJlbmQ6ICfmr4/ml6XnlKjph4/otovlir8nLFxuICBiYXJWaWV3OiAn5p+x54q25Zu+JyxcbiAgbGluZVZpZXc6ICfmipjnur/lm74nLFxuICBieUhvdXI6ICfmjInlsI/ml7YnLFxuICBieURheTogJ+aMieWkqScsXG4gIGV2ZXJ5TkRheXM6ICfmr48ge259IOWkqScsXG4gIGxlZ2VuZElucHV0OiAn6L6T5YWlJyxcbiAgbGVnZW5kT3V0cHV0OiAn6L6T5Ye6JyxcbiAgbGVnZW5kVG90YWw6ICfmgLsgVG9rZW4nLFxuICB0b29sdGlwVG90YWw6ICflkIjorqEnLFxuICBzdGFydE5EYXlzOiAn6LW3IHtufSDlpKknLFxuICBsaW5lQ2hhcnRBcmlhOiAnVG9rZW4g55So6YeP6LaL5Yq/5oqY57q/5Zu+JyxcbiAgeWVhcmx5SGVhdG1hcDogJ+W5tOW6pueUqOmHj+eDreWKm+WbvicsXG4gIHllYXJEYWlseTogJ3t5ZWFyfSDlubTmr4/ml6UgVG9rZW4g55So6YePJyxcbiAgbW9udGhMYWJlbDogJ3tufeaciCcsXG4gIHdlZWtkYXlNb246ICfkuIAnLFxuICB3ZWVrZGF5V2VkOiAn5LiJJyxcbiAgd2Vla2RheUZyaTogJ+S6lCcsXG4gIGxlc3M6ICflsJEnLFxuICBtb3JlOiAn5aSaJyxcbiAgYnlNb2RlbFRpdGxlOiAn5oyJ5qih5Z6L5piO57uGJyxcbiAgbW9kZWxDb3VudDogJ+WFsSB7bn0g5Liq5qih5Z6LJyxcbiAgbW9kZWxUYWJsZUNhcHRpb246ICfmjInmqKHlnovnlKjph4/mmI7nu4YnLFxuICBjb2xNb2RlbDogJ+aooeWeiycsXG4gIGNvbENhbGxzOiAn6K+35rGC5pWwJyxcbiAgY29sSW5wdXQ6ICfovpPlhaUgVG9rZW4nLFxuICBjb2xPdXRwdXQ6ICfovpPlh7ogVG9rZW4nLFxuICBjb2xUb3RhbDogJ+aAuyBUb2tlbicsXG4gIGNvbENvc3Q6ICfmiJDmnKwnLFxuICBjb2xTaGFyZTogJ+WNoOavlCcsXG4gIHVucHJpY2VkOiAn5pyq5a6a5Lu3JyxcbiAgdW5wcmljZWRSb3dIaW50OiAn6K+l5qih5Z6L5pyq6YWN572u5a6a5Lu377yM5oyJIDAg6K6h5Lu3JyxcbiAgbm9EYXRhOiAn5pqC5peg5pWw5o2uJyxcbiAgZW1wdHlEZXNjOiAn6K+l5pe26Ze05q615YaF5rKh5pyJ6LCD55So6K6w5b2VJyxcbiAgZW1wdHlGaWx0ZXJlZDogJ+W9k+WJjeetm+mAieadoeS7tuS4i+ayoeacieaVsOaNru+8jOivleivleiwg+aVtOaXtumXtOiMg+WbtOaIluaooeWeiycsXG4gIHJlc2V0RmlsdGVyczogJ+mHjee9ruetm+mAiScsXG4gIGxvYWRGYWlsZWQ6ICfmlbDmja7liqDovb3lpLHotKXvvJp7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICfmlbDmja7liqDovb3lpLHotKUnLFxuICByZXRyeTogJ+mHjeivlScsXG4gIGJhckFyaWE6ICd7a2V5fe+8jOi+k+WFpSB7aW59IFRva2Vu77yM6L6T5Ye6IHtvdXR9IFRva2Vu77yM5ZCI6K6hIHt0b3R9IFRva2VuJyxcbiAgaG1UaXRsZTogJ3trZXl977yae3Rva2Vuc30gVG9rZW57Y2FsbHN9JyxcbiAgaG1DYWxsczogJ++8jHtjb3VudH0g5qyh6LCD55SoJyxcbiAgd2QwOiAn5ZGo5pelJyxcbiAgd2QxOiAn5ZGo5LiAJyxcbiAgd2QyOiAn5ZGo5LqMJyxcbiAgd2QzOiAn5ZGo5LiJJyxcbiAgd2Q0OiAn5ZGo5ZubJyxcbiAgd2Q1OiAn5ZGo5LqUJyxcbiAgd2Q2OiAn5ZGo5YWtJyxcbn1cbmNvbnN0IEVOID0ge1xuICBuYXY6ICdVc2FnZSBTdGF0cycsXG4gIHN1YnRpdGxlOiAnVmlldyBBSSBtb2RlbCB1c2FnZSBhbmQgY29zdCBzdGF0aXN0aWNzJyxcbiAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuICB0b2RheTogJ1RvZGF5JyxcbiAgbGFzdDdkOiAnTGFzdCA3IGRheXMnLFxuICBsYXN0MzBkOiAnTGFzdCAzMCBkYXlzJyxcbiAgY3VzdG9tOiAnQ3VzdG9tJyxcbiAgYWxsTW9kZWxzOiAnQWxsIG1vZGVscycsXG4gIHNlbGVjdGVkTW9kZWxzOiAne2NvdW50fSBtb2RlbHMgc2VsZWN0ZWQnLFxuICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsJyxcbiAgY2xlYXI6ICdDbGVhcicsXG4gIHNlYXJjaE1vZGVsczogJ1NlYXJjaCBtb2RlbHMnLFxuICBub01hdGNoTW9kZWxzOiAnTm8gbWF0Y2hpbmcgbW9kZWxzJyxcbiAgbW9kZWxGaWx0ZXJIaW50OiAnQXBwbGllcyBpbnN0YW50bHk7IGxpc3RzIG9ubHkgbW9kZWxzIHdpdGggZGF0YSBpbiB0aGUgcmFuZ2UnLFxuICBjdXN0b21SYW5nZVRpdGxlOiAnQ3VzdG9tIHRpbWUgcmFuZ2UnLFxuICBjdXN0b21SYW5nZUFyaWE6ICdDdXN0b20gZGF0ZSByYW5nZScsXG4gIHN0YXJ0VGltZTogJ1N0YXJ0JyxcbiAgZW5kVGltZTogJ0VuZCcsXG4gIHJhbmdlSW52YWxpZDogJ1N0YXJ0IG11c3Qgbm90IGJlIGxhdGVyIHRoYW4gZW5kJyxcbiAgcmFuZ2VIaW50OiAnRGF0ZSBvbmx5LCB1cCB0byAzMCBkYXlzJyxcbiAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgY29uZmlybTogJ09LJyxcbiAgZGF0ZVJhbmdlR3JvdXA6ICdEYXRlIHJhbmdlJyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ01vZGVsIGZpbHRlcicsXG4gIGNoYXJ0VHlwZUdyb3VwOiAnQ2hhcnQgdHlwZScsXG4gIHRvdGFsVG9rZW5zOiAnVG90YWwgVG9rZW5zJyxcbiAgaW5wdXRUb2tlbnM6ICdJbnB1dCBUb2tlbnMnLFxuICBvdXRwdXRUb2tlbnM6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY2FsbHM6ICdDYWxscycsXG4gIGNvc3Q6ICdDb3N0JyxcbiAgYXBwcm94SU86ICfiiYggaW5wdXQrb3V0cHV0JyxcbiAgdW5wcmljZWROb3RlOiAne2NvdW50fSBjYWxscyB1bnByaWNlZCcsXG4gIGRhaWx5VHJlbmQ6ICdEYWlseSB1c2FnZSB0cmVuZCcsXG4gIGJhclZpZXc6ICdCYXJzJyxcbiAgbGluZVZpZXc6ICdMaW5lJyxcbiAgYnlIb3VyOiAnSG91cmx5JyxcbiAgYnlEYXk6ICdEYWlseScsXG4gIGV2ZXJ5TkRheXM6ICdFdmVyeSB7bn0gZGF5cycsXG4gIGxlZ2VuZElucHV0OiAnSW5wdXQnLFxuICBsZWdlbmRPdXRwdXQ6ICdPdXRwdXQnLFxuICBsZWdlbmRUb3RhbDogJ1RvdGFsJyxcbiAgdG9vbHRpcFRvdGFsOiAnVG90YWwnLFxuICBzdGFydE5EYXlzOiAnZm9yIHtufSBkYXlzJyxcbiAgbGluZUNoYXJ0QXJpYTogJ1Rva2VuIHVzYWdlIHRyZW5kIGxpbmUgY2hhcnQnLFxuICB5ZWFybHlIZWF0bWFwOiAnWWVhcmx5IGhlYXRtYXAnLFxuICB5ZWFyRGFpbHk6ICdEYWlseSB0b2tlbnMgaW4ge3llYXJ9JyxcbiAgbW9udGhMYWJlbDogJ3tufScsXG4gIHdlZWtkYXlNb246ICdNb24nLFxuICB3ZWVrZGF5V2VkOiAnV2VkJyxcbiAgd2Vla2RheUZyaTogJ0ZyaScsXG4gIGxlc3M6ICdMZXNzJyxcbiAgbW9yZTogJ01vcmUnLFxuICBieU1vZGVsVGl0bGU6ICdCeSBtb2RlbCcsXG4gIG1vZGVsQ291bnQ6ICd7bn0gbW9kZWxzJyxcbiAgbW9kZWxUYWJsZUNhcHRpb246ICdUb2tlbiB1c2FnZSBieSBtb2RlbCcsXG4gIGNvbE1vZGVsOiAnTW9kZWwnLFxuICBjb2xDYWxsczogJ0NhbGxzJyxcbiAgY29sSW5wdXQ6ICdJbnB1dCBUb2tlbnMnLFxuICBjb2xPdXRwdXQ6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY29sVG90YWw6ICdUb3RhbCBUb2tlbnMnLFxuICBjb2xDb3N0OiAnQ29zdCcsXG4gIGNvbFNoYXJlOiAnU2hhcmUnLFxuICB1bnByaWNlZDogJ1VucHJpY2VkJyxcbiAgdW5wcmljZWRSb3dIaW50OiAnTm8gcHJpY2luZyBjb25maWd1cmVkOyBjb3VudGVkIGFzIDAnLFxuICBub0RhdGE6ICdObyBkYXRhJyxcbiAgZW1wdHlEZXNjOiAnTm8gY2FsbHMgaW4gdGhpcyBwZXJpb2QnLFxuICBlbXB0eUZpbHRlcmVkOiAnTm8gZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmlsdGVycywgdHJ5IGFkanVzdGluZyB0aGUgcmFuZ2Ugb3IgbW9kZWxzJyxcbiAgcmVzZXRGaWx0ZXJzOiAnUmVzZXQgZmlsdGVycycsXG4gIGxvYWRGYWlsZWQ6ICdGYWlsZWQgdG8gbG9hZCBkYXRhOiB7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICdGYWlsZWQgdG8gbG9hZCBkYXRhJyxcbiAgcmV0cnk6ICdSZXRyeScsXG4gIGJhckFyaWE6ICd7a2V5fSwgaW5wdXQge2lufSB0b2tlbnMsIG91dHB1dCB7b3V0fSB0b2tlbnMsIHRvdGFsIHt0b3R9IHRva2VucycsXG4gIGhtVGl0bGU6ICd7a2V5fToge3Rva2Vuc30gdG9rZW5ze2NhbGxzfScsXG4gIGhtQ2FsbHM6ICcsIHtjb3VudH0gY2FsbHMnLFxuICB3ZDA6ICdTdW4nLFxuICB3ZDE6ICdNb24nLFxuICB3ZDI6ICdUdWUnLFxuICB3ZDM6ICdXZWQnLFxuICB3ZDQ6ICdUaHUnLFxuICB3ZDU6ICdGcmknLFxuICB3ZDY6ICdTYXQnLFxufVxuY29uc3QgVCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQobnVsbClcbmZ1bmN0aW9uIHVzZVQoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KFQpXG59XG5mdW5jdGlvbiBmYWxsYmFja1Qoa2V5LCBwYXJhbXMpIHtcbiAgbGV0IHMgPSBaSFtrZXldXG4gIGlmIChzID09PSB1bmRlZmluZWQpIHJldHVybiBrZXlcbiAgaWYgKHBhcmFtcykge1xuICAgIHMgPSBzLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAobSwgbikgPT4gKHBhcmFtc1tuXSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHBhcmFtc1tuXSkgOiBtKSlcbiAgfVxuICByZXR1cm4gc1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaVsOWtl+agvOW8j+WMlu+8iOinhOagvOesrCA1IOiKgu+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gZm9ybWF0VG9rZW5zU2hvcnQobikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuICctLSdcbiAgaWYgKG4gPj0gMWU2KSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMWU0KSAvIDEwMCArICdNJyAvLyAxLjIzTVxuICBpZiAobiA+PSAxZTMpIHJldHVybiBNYXRoLnJvdW5kKG4gLyAxZTIpIC8gMTAgKyAnSycgLy8gMTIuM0tcbiAgcmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKG4pKVxufVxuZnVuY3Rpb24gZm9ybWF0SW50KG4pIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IE1hdGgucm91bmQobikudG9Mb2NhbGVTdHJpbmcoKSA6ICctLSdcbn1cbmZ1bmN0aW9uIGZvcm1hdENvc3QobiwgY3VyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gKGN1ciB8fCAnwqUnKSArIG4udG9GaXhlZCgyKVxufVxuZnVuY3Rpb24gZGF5TGFiZWwoa2V5KSB7XG4gIGNvbnN0IFssIG0sIGRdID0gU3RyaW5nKGtleSB8fCAnJykuc3BsaXQoJy0nKVxuICBpZiAobSA9PT0gdW5kZWZpbmVkIHx8IGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuICctLSdcbiAgcmV0dXJuIG0gKyAnLScgKyBkXG59XG5mdW5jdGlvbiBmbXRQY3QocmF0aW8pIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF0aW8pKSByZXR1cm4gJzAlJ1xuICBjb25zdCBwID0gcmF0aW8gKiAxMDBcbiAgaWYgKHAgPj0gOTkuOTUpIHJldHVybiAnMTAwJSdcbiAgcmV0dXJuIHAudG9GaXhlZCgxKSArICclJ1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaXpeacn+W3peWFt1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gc3RhcnRPZkRheShkKSB7XG4gIGNvbnN0IHggPSBuZXcgRGF0ZShkKVxuICB4LnNldEhvdXJzKDAsIDAsIDAsIDApXG4gIHJldHVybiB4XG59XG5mdW5jdGlvbiBhZGREYXlzKGQsIG4pIHtcbiAgY29uc3QgeCA9IG5ldyBEYXRlKGQpXG4gIHguc2V0RGF0ZSh4LmdldERhdGUoKSArIG4pXG4gIHJldHVybiB4XG59XG5mdW5jdGlvbiBmbXREYXRlSW5wdXQoZCkge1xuICBjb25zdCB5ID0gZC5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBkYXkgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgcmV0dXJuIHkgKyAnLScgKyBtICsgJy0nICsgZGF5XG59XG5mdW5jdGlvbiBmbXREYXRlU2xhc2gocykge1xuICBjb25zdCBtID0gU3RyaW5nKHMgfHwgJycpLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLylcbiAgaWYgKCFtKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gbVsxXSArICcvJyArIG1bMl0gKyAnLycgKyBtWzNdXG59XG4vLyDpooTorr4gLyDoh6rlrprkuYkg4oaSIHsgZnJvbSwgdG8gfe+8iFVuaXgg5q+r56eS77yJXG4vLyDku4rml6UgPSDlvZPlpKkgMDA6MDAg6Iez5LuK77yb6L+RNy8zMOWkqSA9IOWQq+S7iuWkqeW+gOWJjSBOIOS4quiHqueEtuaXpSAwMDowMCDotbfvvJvoh6rlrprkuYkgPSDotbfml6UgMDA6MDAgfiDmraLml6UgMjM6NTk6NTkuOTk5XG5mdW5jdGlvbiByYW5nZUZvcihwcmVzZXQsIGN1c3RvbSkge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IHRvZGF5ID0gc3RhcnRPZkRheShub3cpXG4gIGlmIChwcmVzZXQgPT09ICd0b2RheScpIHJldHVybiB7IGZyb206IHRvZGF5LmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBpZiAocHJlc2V0ID09PSAnN2QnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtNikuZ2V0VGltZSgpLCB0bzogbm93LmdldFRpbWUoKSB9XG4gIGlmIChwcmVzZXQgPT09ICczMGQnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtMjkpLmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBjb25zdCBmcm9tID0gbmV3IERhdGUoY3VzdG9tLmZyb20gKyAnVDAwOjAwOjAwJykuZ2V0VGltZSgpXG4gIGNvbnN0IHRvID0gbmV3IERhdGUoY3VzdG9tLnRvICsgJ1QyMzo1OTo1OS45OTknKS5nZXRUaW1lKClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZnJvbSkgfHwgIU51bWJlci5pc0Zpbml0ZSh0bykpIHtcbiAgICByZXR1cm4geyBmcm9tOiB0b2RheS5nZXRUaW1lKCksIHRvOiBub3cuZ2V0VGltZSgpIH1cbiAgfVxuICByZXR1cm4geyBmcm9tLCB0byB9XG59XG5mdW5jdGlvbiB3ZWVrZGF5T2Yoa2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGtleSArICdUMDA6MDA6MDAnKS50b0xvY2FsZURhdGVTdHJpbmcoJ3poLUNOJywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuLyoqIFdlZWtkYXkgZm9yIGEgZGF5L2hvdXIvbWludXRlIGJ1Y2tldCBrZXkgKGBZWVlZLU1NLUREYCBvciBgWVlZWS1NTS1ERCBISDptbWApLiAqL1xuZnVuY3Rpb24gd2Vla2RheU5hbWUoa2V5LCB0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKFN0cmluZyhrZXkpLnJlcGxhY2UoJyAnLCAnVCcpKVxuICAgIHJldHVybiB0KFsnd2QwJywgJ3dkMScsICd3ZDInLCAnd2QzJywgJ3dkNCcsICd3ZDUnLCAnd2Q2J11bZC5nZXREYXkoKV0gfHwgJ3dkMCcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuLyoqIFgtYXhpcyBsYWJlbCBmb3IgYSBidWNrZXQga2V5IHVuZGVyIGEgZ3JhbnVsYXJpdHkuICovXG5mdW5jdGlvbiB4TGFiZWwoa2V5LCBnKSB7XG4gIGNvbnN0IHMgPSBTdHJpbmcoa2V5KVxuICBjb25zdCBzcCA9IHMuc3BsaXQoJyAnKVxuICBpZiAoZyA9PT0gJ21pbnV0ZScpIHJldHVybiBzcC5sZW5ndGggPiAxID8gc3BbMV0uc2xpY2UoMCwgNSkgOiBzLnNsaWNlKDUpXG4gIGlmIChnID09PSAnaG91cicpIHJldHVybiBzcC5sZW5ndGggPiAxID8gc3BbMV0uc2xpY2UoMCwgMikgKyAnOjAwJyA6IHMuc2xpY2UoNSlcbiAgcmV0dXJuIGRheUxhYmVsKGtleSlcbn1cbi8qKiBGaXhlZCBncmFudWxhcml0eSBwb2xpY3k6IHRvZGF5IGlzIGhvdXJseSwgZXZlcnl0aGluZyBlbHNlIGlzIGRhaWx5LiAqL1xuZnVuY3Rpb24gZWZmR3JhbnVsYXJpdHkocmFuZ2UpIHtcbiAgcmV0dXJuIHJhbmdlID09PSAndG9kYXknID8gJ2hvdXInIDogJ2RheSc7XG59XG4vKiogU3RhYmxlIHN0ZXAgc3RyYXRlZ3kgZm9yIGN1c3RvbSByYW5nZXM6IHRhcmdldCB+MTUtMjUgYnVja2V0cy4gKi9cbmZ1bmN0aW9uIHBpY2tTdGVwRGF5cyhzcGFuTXMpIHtcbiAgY29uc3QgZGF5cyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHNwYW5NcyB8fCAwKSAvIDg2NDAwMDAwKSlcbiAgaWYgKGRheXMgPD0gMzEpIHJldHVybiAxXG4gIGlmIChkYXlzIDw9IDYyKSByZXR1cm4gM1xuICBpZiAoZGF5cyA8PSAxNTApIHJldHVybiA1XG4gIHJldHVybiA3XG59XG4vKiogSHVtYW4gbGFiZWwgZm9yIHRoZSBjdXJyZW50IHN0ZXAgcG9saWN5LiAqL1xuZnVuY3Rpb24gc3RlcExhYmVsKHQsIHJhbmdlLCBzdGVwRGF5cykge1xuICBpZiAocmFuZ2UgPT09ICd0b2RheScpIHJldHVybiB0KCdieUhvdXInKVxuICByZXR1cm4gc3RlcERheXMgPiAxID8gdCgnZXZlcnlORGF5cycsIHsgbjogc3RlcERheXMgfSkgOiB0KCdieURheScpXG59XG4vKiogSGVhdG1hcCBjZWxsIGNvbG9yIGJ5IHJlbGF0aXZlIHRva2VuIHZvbHVtZS4gKi9cbmZ1bmN0aW9uIGhlYXRDb2xvcih0b3RhbCwgbWF4KSB7XG4gIGlmICghdG90YWwpIHJldHVybiAndmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKSdcbiAgY29uc3QgciA9IHRvdGFsIC8gbWF4XG4gIGNvbnN0IHBjdCA9IHIgPCAwLjI1ID8gMjIgOiByIDwgMC41ID8gNDUgOiByIDwgMC43NSA/IDcwIDogMTAwXG4gIHJldHVybiAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKSAnICsgcGN0ICsgJyUsIHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKSknXG59XG5mdW5jdGlvbiBuaWNlQ2VpbCh2KSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpIHx8IHYgPD0gMCkgcmV0dXJuIDFcbiAgY29uc3QgbWFnID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2cxMCh2KSkpXG4gIGNvbnN0IG5vcm0gPSB2IC8gbWFnXG4gIGNvbnN0IG5pY2UgPSBub3JtIDw9IDEgPyAxIDogbm9ybSA8PSAyID8gMiA6IG5vcm0gPD0gNSA/IDUgOiAxMFxuICByZXR1cm4gbmljZSAqIG1hZ1xufVxuZnVuY3Rpb24gZGVmYXVsdEN1c3RvbSgpIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICByZXR1cm4geyBmcm9tOiBmbXREYXRlSW5wdXQoYWRkRGF5cyhub3csIC02KSksIHRvOiBmbXREYXRlSW5wdXQobm93KSB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5YaF6IGUIFNWRyDlm77moIfvvIjml6Dlm77moIflupPvvIzmiYvlhpkgZmVhdGhlciDpo47moLwgc3Ryb2tlIOWbvuagh++8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgSUNPTl9QQVRIUyA9IHtcbiAgbGF5ZXJzOiAnTTEyIDJsOCA0LjUtOCA0LjUtOC00LjVMMTIgMnptMCA4bDggNC41LTggNC41LTgtNC41TDEyIDEwem0wIDhsOCA0LjUtOCA0LjUtOC00LjVMMTIgMTh6JyxcbiAgZG93bjogJ00xMiAzdjEybTAgMGwtNC41LTQuNU0xMiAxNWw0LjUtNC41TTQgMjFoMTYnLFxuICB1cDogJ00xMiAyMVY5bTAgMGwtNC41IDQuNU0xMiA5bDQuNSA0LjVNNCAzaDE2JyxcbiAgYWN0aXZpdHk6ICdNMiAxMmg0bDIuNS04IDUgMTYgMi41LThoNicsXG4gIGNvaW5zOiAnTTMgOWEyIDIgMCAwMTItMmgxNGEyIDIgMCAwMTIgMnY5YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMlY5em0wIDVoMThNOCA1LjVWNGEyIDIgMCAwMTItMmg0YTIgMiAwIDAxMiAydjEuNScsXG4gIHJlZnJlc2g6ICdNMjEgMTJhOSA5IDAgMTEtMi42NC02LjM2TTIxIDR2NmgtNicsXG4gIGNoZXZyb246ICdNNiA5bDYgNiA2LTYnLFxuICBpbmJveDogJ00yMiAxMmgtNmwtMiAzaC00bC0yLTNIMm0zLjUtNi41TDIgMTJ2NmEyIDIgMCAwMDIgMmgxNmEyIDIgMCAwMDItMnYtNmwtMy41LTYuNUEyIDIgMCAwMDE2Ljc2IDVINy4yNGEyIDIgMCAwMC0xLjc0IDEuNXonLFxuICBhbGVydDogJ00xMiA5djRtMCA0aC4wMU0xMC4zIDMuODZMMS44MiAxOGEyIDIgMCAwMDEuNzEgM2gxNi45NGEyIDIgMCAwMDEuNzEtM0wxMy43IDMuODZhMiAyIDAgMDAtMy40IDB6JyxcbiAgc2VhcmNoOiAnTTIxIDIxbC00LjM1LTQuMzVNMTcgMTAuNWE2LjUgNi41IDAgMTEtMTMgMCA2LjUgNi41IDAgMDExMyAweicsXG59XG5mdW5jdGlvbiBTdmdJY29uKHByb3BzKSB7XG4gIGNvbnN0IHsgbmFtZSwgc2l6ZSwgY2xhc3NOYW1lIH0gPSBwcm9wc1xuICByZXR1cm4gaCgnc3ZnJywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lIHx8ICd0c2QtaWNvbicsXG4gICAgd2lkdGg6IHNpemUgfHwgMTYsXG4gICAgaGVpZ2h0OiBzaXplIHx8IDE2LFxuICAgIHZpZXdCb3g6ICcwIDAgMjQgMjQnLFxuICAgIGZpbGw6ICdub25lJyxcbiAgICBzdHJva2U6ICdjdXJyZW50Q29sb3InLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIHN0cm9rZUxpbmVjYXA6ICdyb3VuZCcsXG4gICAgc3Ryb2tlTGluZWpvaW46ICdyb3VuZCcsXG4gICAgJ2FyaWEtaGlkZGVuJzogdHJ1ZSxcbiAgfSwgaCgncGF0aCcsIHsgZDogSUNPTl9QQVRIU1tuYW1lXSB8fCBJQ09OX1BBVEhTLmFjdGl2aXR5IH0pKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmAmueUqCBIb29r77ya5aSW6YOo54K55Ye75YWz6ZetXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiB1c2VPdXRzaWRlQ2xpY2sob3BlbiwgcmVmLCBvbkNsb3NlKSB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAocmVmLmN1cnJlbnQgJiYgIXJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgb25DbG9zZSgpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICB9LCBbb3Blbiwgb25DbG9zZSwgcmVmXSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBIZWFkZXLvvJrmoIfpopggKyDlia/moIfpopggKyDliLfmlrDmjInpkq5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIFN0YXRzSGVhZGVyKHByb3BzKSB7XG4gIGNvbnN0IHsgYnVzeSwgb25SZWZyZXNoIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWFkZXInIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhZGVyLXRleHQnIH0sXG4gICAgICBoKCdoMicsIHsgY2xhc3NOYW1lOiAndHNkLXRpdGxlJyB9LCB0KCduYXYnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2Qtc3VidGl0bGUnIH0sIHQoJ3N1YnRpdGxlJykpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1pY29uLWJ0bicgKyAoYnVzeSA/ICcgdHNkLXNwaW5uaW5nJyA6ICcnKSxcbiAgICAgIG9uQ2xpY2s6IG9uUmVmcmVzaCxcbiAgICAgIHRpdGxlOiB0KCdyZWZyZXNoJyksXG4gICAgICAnYXJpYS1sYWJlbCc6IHQoJ3JlZnJlc2gnKSxcbiAgICB9LCBoKFN2Z0ljb24sIHsgbmFtZTogJ3JlZnJlc2gnIH0pKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDoh6rlrprkuYnml6XmnJ/ojIPlm7Tmta7lsYJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEN1c3RvbVJhbmdlUG9wb3Zlcihwcm9wcykge1xuICBjb25zdCB7IGN1c3RvbSwgb25BcHBseSwgb25DbG9zZSB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbZnJvbSwgc2V0RnJvbV0gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20uZnJvbSlcbiAgY29uc3QgW3RvLCBzZXRUb10gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20udG8pXG4gIGNvbnN0IGludmFsaWQgPSAhZnJvbSB8fCAhdG8gfHwgZnJvbSA+IHRvXG4gIC8vIFAyLTEx77yaZGlhbG9nIOS7pSBFc2NhcGUg5YWz6ZetXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIG9uQ2xvc2UoKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgfSwgW29uQ2xvc2VdKVxuICByZXR1cm4gaCgnZGl2Jywge1xuICAgIGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyIHRzZC1yYW5nZS1wb3BvdmVyJyxcbiAgICByb2xlOiAnZGlhbG9nJyxcbiAgICAnYXJpYS1sYWJlbCc6IHQoJ2N1c3RvbVJhbmdlQXJpYScpLFxuICB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdGl0bGUnIH0sIHQoJ2N1c3RvbVJhbmdlVGl0bGUnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmFuZ2UtZmllbGRzJyB9LFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdzdGFydFRpbWUnKSksXG4gICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgIHR5cGU6ICdkYXRlJywgdmFsdWU6IGZyb20sICdhcmlhLWxhYmVsJzogdCgnc3RhcnRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRGcm9tKGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgfSkpLFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdlbmRUaW1lJykpLFxuICAgICAgICBoKCdpbnB1dCcsIHtcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsIHZhbHVlOiB0bywgJ2FyaWEtbGFiZWwnOiB0KCdlbmRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRUbyhlLnRhcmdldC52YWx1ZSksXG4gICAgICAgIH0pKSksXG4gICAgaW52YWxpZFxuICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZmllbGQtZXJyb3InLCByb2xlOiAnYWxlcnQnIH0sIHQoJ3JhbmdlSW52YWxpZCcpKVxuICAgICAgOiBudWxsLFxuICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZC1oaW50JyB9LCB0KCdyYW5nZUhpbnQnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1hY3Rpb25zJyB9LFxuICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWJ0biB0c2QtYnRuLWdob3N0Jywgb25DbGljazogb25DbG9zZSB9LCB0KCdjYW5jZWwnKSksXG4gICAgICBoKCdidXR0b24nLCB7XG4gICAgICAgIHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tcHJpbWFyeScsXG4gICAgICAgIGRpc2FibGVkOiBpbnZhbGlkLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7IGlmICghaW52YWxpZCkgb25BcHBseSh7IGZyb20sIHRvIH0pIH0sXG4gICAgICB9LCB0KCdjb25maXJtJykpKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmqKHlnovlpJrpgInkuIvmi4lcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIE1vZGVsRHJvcGRvd24ocHJvcHMpIHtcbiAgY29uc3QgeyBvcHRpb25zLCBzZWxlY3RlZCwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gUmVhY3QudXNlU3RhdGUoJycpXG4gIGNvbnN0IGFuY2hvclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAoYW5jaG9yUmVmLmN1cnJlbnQgJiYgIWFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgc2V0T3BlbihmYWxzZSlcbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIHNldE9wZW4oZmFsc2UpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgICB9XG4gIH0sIFtvcGVuXSlcblxuICAvLyDlj6rliJflh7rlvZPliY3ojIPlm7TmnInmlbDmja7nmoTmqKHlnovvvJvlt7LpgInkvYbmjonlh7rlgJnpgInliJfooajnmoTjgIzooaXlm57jgI3vvIzkv53or4Hlj6/muLLmn5PjgIHlj6/muIXpmaRcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKG9wdGlvbnMgfHwgW10pLm1hcCgobSkgPT4gbS5wcm92aWRlciArICcvJyArIG0ubW9kZWwpKVxuICAgIDsoc2VsZWN0ZWQgfHwgW10pLmZvckVhY2goKG0pID0+IHNldC5hZGQobSkpXG4gICAgY29uc3QgbGlzdCA9IEFycmF5LmZyb20oc2V0KVxuICAgIGxpc3Quc29ydCgpXG4gICAgcmV0dXJuIGxpc3RcbiAgfSwgW29wdGlvbnMsIHNlbGVjdGVkXSlcblxuICBjb25zdCBxID0gcXVlcnkudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgY29uc3QgZmlsdGVyZWQgPSBxID09PSAnJyA/IGNhbmRpZGF0ZXMgOiBjYW5kaWRhdGVzLmZpbHRlcigoYykgPT4gYy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YocSkgPj0gMClcbiAgY29uc3QgbGFiZWwgPSBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyB0KCdhbGxNb2RlbHMnKSA6IHQoJ3NlbGVjdGVkTW9kZWxzJywgeyBjb3VudDogc2VsZWN0ZWQubGVuZ3RoIH0pXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItYW5jaG9yJywgcmVmOiBhbmNob3JSZWYgfSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWxlY3QtYnRuJyArIChzZWxlY3RlZC5sZW5ndGggPiAwID8gJyB0c2Qtc2VsZWN0LWhhcycgOiAnJyksXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7IHNldE9wZW4oKHYpID0+ICF2KTsgc2V0UXVlcnkoJycpIH0sXG4gICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4sXG4gICAgICAnYXJpYS1oYXNwb3B1cCc6ICdsaXN0Ym94JyxcbiAgICAgIHRpdGxlOiBsYWJlbCxcbiAgICB9LFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNlbGVjdC1sYWJlbCcgfSwgbGFiZWwpLFxuICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdjaGV2cm9uJywgc2l6ZTogMTQsIGNsYXNzTmFtZTogJ3RzZC1jaGV2cm9uJyArIChvcGVuID8gJyB0c2QtY2hldnJvbi1vcGVuJyA6ICcnKSB9KSksXG4gICAgb3BlblxuICAgICAgPyBoKCdkaXYnLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXIgdHNkLW1vZGVsLXBvcG92ZXInLFxuICAgICAgICAgIHJvbGU6ICdsaXN0Ym94JyxcbiAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQoJ21vZGVsRmlsdGVyR3JvdXAnKSxcbiAgICAgICAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdG9vbHMnIH0sXG4gICAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtbGluay1idG4nLCBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShjYW5kaWRhdGVzLnNsaWNlKCkpIH0sIHQoJ3NlbGVjdEFsbCcpKSxcbiAgICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1saW5rLWJ0bicsIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKFtdKSB9LCB0KCdjbGVhcicpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2VhcmNoJyB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdzZWFyY2gnLCBzaXplOiAxNCwgY2xhc3NOYW1lOiAndHNkLXNlYXJjaC1pY29uJyB9KSxcbiAgICAgICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgICAgICB0eXBlOiAnc2VhcmNoJywgdmFsdWU6IHF1ZXJ5LCBwbGFjZWhvbGRlcjogdCgnc2VhcmNoTW9kZWxzJyksXG4gICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnc2VhcmNoTW9kZWxzJyksXG4gICAgICAgICAgICAgIG9uQ2hhbmdlOiAoZSkgPT4gc2V0UXVlcnkoZS50YXJnZXQudmFsdWUpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLW1vZGVsLWxpc3QnIH0sXG4gICAgICAgICAgICBmaWx0ZXJlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1lbXB0eScgfSwgdCgnbm9NYXRjaE1vZGVscycpKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXJlZC5tYXAoKGtleSkgPT5cbiAgICAgICAgICAgICAgaCgnbGFiZWwnLCB7IGtleSwgY2xhc3NOYW1lOiAndHNkLW1vZGVsLWl0ZW0nIH0sXG4gICAgICAgICAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWQuaW5kZXhPZihrZXkpID49IDAsXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHNlbGVjdGVkLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5pbmRleE9mKGtleSkgPCAwKSBuZXh0LnB1c2goa2V5KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXh0LmluZGV4T2Yoa2V5KVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIG5leHQuc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UobmV4dCkgLy8g5Yu+6YCJ5Y2z5pe255Sf5pWIXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1uYW1lJywgdGl0bGU6IGtleSB9LCBrZXkpKSkpLFxuICAgICAgICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLW5vdGUnIH0sIHQoJ21vZGVsRmlsdGVySGludCcpKSlcbiAgICAgIDogbnVsbClcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDnrZvpgInmoI/vvJrml6XmnJ/pooTorr7vvIjliIbmrrXmjInpkq7vvIkrIOiHquWumuS5iea1ruWxgiArIOaooeWei+WkmumAiVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gRmlsdGVyQmFyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICByYW5nZSwgY3VzdG9tLCBtb2RlbHMsIGN1c3RvbU9wZW4sIG1vZGVsT3B0aW9ucyxcbiAgICBvblByZXNldCwgb25DdXN0b21PcGVuLCBvbkN1c3RvbUFwcGx5LCBvbkN1c3RvbUNsb3NlLCBvbk1vZGVsc0NoYW5nZSxcbiAgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3Qgc2VnUmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIHVzZU91dHNpZGVDbGljayhjdXN0b21PcGVuLCBzZWdSZWYsIG9uQ3VzdG9tQ2xvc2UpXG5cbiAgY29uc3QgY3VzdG9tTGFiZWwgPSBmbXREYXRlU2xhc2goY3VzdG9tLmZyb20pICsgJyAtICcgKyBmbXREYXRlU2xhc2goY3VzdG9tLnRvKVxuICBjb25zdCBwcmVzZXRzID0gW1xuICAgIHsga2V5OiAndG9kYXknLCBsYWJlbDogdCgndG9kYXknKSB9LFxuICAgIHsga2V5OiAnN2QnLCBsYWJlbDogdCgnbGFzdDdkJykgfSxcbiAgICB7IGtleTogJzMwZCcsIGxhYmVsOiB0KCdsYXN0MzBkJykgfSxcbiAgICB7IGtleTogJ2N1c3RvbScsIGxhYmVsOiB0KCdjdXN0b20nKSB9LFxuICBdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWZpbHRlcmJhcicgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWctd3JhcCcsIHJlZjogc2VnUmVmIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWcnLCByb2xlOiAnZ3JvdXAnLCAnYXJpYS1sYWJlbCc6IHQoJ2RhdGVSYW5nZUdyb3VwJykgfSxcbiAgICAgICAgcHJlc2V0cy5tYXAoKHApID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSByYW5nZSA9PT0gcC5rZXlcbiAgICAgICAgICBjb25zdCBpc0N1c3RvbSA9IHAua2V5ID09PSAnY3VzdG9tJ1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNDdXN0b20gJiYgYWN0aXZlID8gY3VzdG9tTGFiZWwgOiBwLmxhYmVsXG4gICAgICAgICAgcmV0dXJuIGgoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIGtleTogcC5rZXksXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWctYnRuJyArIChhY3RpdmUgPyAnIHRzZC1zZWctYWN0aXZlJyA6ICcnKSArIChpc0N1c3RvbSA/ICcgdHNkLXNlZy1jdXN0b20nIDogJycpLFxuICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IGFjdGl2ZSxcbiAgICAgICAgICAgIHRpdGxlOiBpc0N1c3RvbSAmJiBhY3RpdmUgPyBjdXN0b21MYWJlbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgaWYgKGlzQ3VzdG9tKSBvbkN1c3RvbU9wZW4oIWN1c3RvbU9wZW4pOyBlbHNlIG9uUHJlc2V0KHAua2V5KSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2Qtc2VnLWxhYmVsJyB9LCBsYWJlbCkpXG4gICAgICAgIH0pKSxcbiAgICAgIGN1c3RvbU9wZW4gPyBoKEN1c3RvbVJhbmdlUG9wb3ZlciwgeyBjdXN0b20sIG9uQXBwbHk6IG9uQ3VzdG9tQXBwbHksIG9uQ2xvc2U6IG9uQ3VzdG9tQ2xvc2UgfSkgOiBudWxsKSxcbiAgICBoKE1vZGVsRHJvcGRvd24sIHsgb3B0aW9uczogbW9kZWxPcHRpb25zLCBzZWxlY3RlZDogbW9kZWxzLCBvbkNoYW5nZTogb25Nb2RlbHNDaGFuZ2UgfSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5rGH5oC75oyH5qCH5Y2hIMOXNVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3VtbWFyeUNhcmRzKHByb3BzKSB7XG4gIGNvbnN0IHsgdG90YWwsIGN1cnJlbmN5LCB1bnByaWNlZENhbGxzIH0gPSBwcm9wc1xuICBjb25zdCB0dCA9IHVzZVQoKVxuICBjb25zdCBkID0gdG90YWwgfHwge31cbiAgY29uc3QgaW5wdXRUb3RhbCA9IChkLmlucHV0VG9rZW5zIHx8IDApICsgKGQuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKGQuY2FjaGVXcml0ZVRva2VucyB8fCAwKVxuICBjb25zdCBjYXJkcyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICd0b3RhbCcsIGljb246ICdsYXllcnMnLCBsYWJlbDogdHQoJ3RvdGFsVG9rZW5zJyksXG4gICAgICB2YWx1ZTogZm9ybWF0VG9rZW5zU2hvcnQoZC50b3RhbFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC50b3RhbFRva2VucyksXG4gICAgICBzdWI6IHR0KCdhcHByb3hJTycpLCBjb2xvcjogJ3ZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdpbnB1dCcsIGljb246ICdkb3duJywgbGFiZWw6IHR0KCdpbnB1dFRva2VucycpLFxuICAgICAgdmFsdWU6IGZvcm1hdFRva2Vuc1Nob3J0KGlucHV0VG90YWwpLCB0aXRsZTogZm9ybWF0SW50KGlucHV0VG90YWwpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnb3V0cHV0JywgaWNvbjogJ3VwJywgbGFiZWw6IHR0KCdvdXRwdXRUb2tlbnMnKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRUb2tlbnNTaG9ydChkLm91dHB1dFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC5vdXRwdXRUb2tlbnMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY2FsbHMnLCBpY29uOiAnYWN0aXZpdHknLCBsYWJlbDogdHQoJ2NhbGxzJyksXG4gICAgICB2YWx1ZTogZm9ybWF0SW50KGQuY2FsbHMpLCB0aXRsZTogZm9ybWF0SW50KGQuY2FsbHMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY29zdCcsIGljb246ICdjb2lucycsIGxhYmVsOiB0dCgnY29zdCcpLFxuICAgICAgdmFsdWU6IGZvcm1hdENvc3QoZC5jb3N0LCBjdXJyZW5jeSksIHRpdGxlOiBmb3JtYXRDb3N0KGQuY29zdCwgY3VycmVuY3kpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmRzJyB9LFxuICAgIGNhcmRzLm1hcCgoYykgPT5cbiAgICAgIGgoJ2RpdicsIHsga2V5OiBjLmtleSwgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1pY29uJywgc3R5bGU6IHsgY29sb3I6IGMuY29sb3IgfSB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6IGMuaWNvbiwgc2l6ZTogMTQgfSkpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWxhYmVsJyB9LCBjLmxhYmVsKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdmFsdWUnLCB0aXRsZTogYy50aXRsZSB9LCBjLnZhbHVlKSxcbiAgICAgICAgYy5zdWIgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXN1YicgfSwgYy5zdWIpIDogbnVsbCxcbiAgICAgICAgYy5rZXkgPT09ICdjb3N0JyAmJiB1bnByaWNlZENhbGxzID4gMFxuICAgICAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1ub3RlJyB9LCB0dCgndW5wcmljZWROb3RlJywgeyBjb3VudDogZm9ybWF0SW50KHVucHJpY2VkQ2FsbHMpIH0pKVxuICAgICAgICAgIDogbnVsbCkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOavj+aXpeeUqOmHj+afseeKtuWbvu+8iOaJi+WGmSBkaXYg5aCG5Y+g5p+x77ya5LiL5q616L6T5YWl6JOdIC8g5LiK5q616L6T5Ye657u/77yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBEYWlseUNoYXJ0KHByb3BzKSB7XG4gIGNvbnN0IHsgZGFpbHksIGdyYW4sIHN0ZXBEYXlzLCBncmFuTGFiZWwgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgY2hhcnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbClcbiAgY29uc3QgW3RpcCwgc2V0VGlwXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpIC8vIHsgcm93LCB4IH1cbiAgY29uc3QgW3ZpZXcsIHNldFZpZXddID0gUmVhY3QudXNlU3RhdGUoJ2JhcicpIC8vIGJhciB8IGxpbmVcbiAgY29uc3Qgcm93cyA9IGRhaWx5IHx8IFtdXG5cbiAgY29uc3QgaW5PZiA9IChyKSA9PiAoci5pbnB1dFRva2VucyB8fCAwKSArIChyLmNhY2hlUmVhZFRva2VucyB8fCAwKSArIChyLmNhY2hlV3JpdGVUb2tlbnMgfHwgMClcbiAgY29uc3Qgb3V0T2YgPSAocikgPT4gci5vdXRwdXRUb2tlbnMgfHwgMFxuICBjb25zdCB0b3RPZiA9IChyKSA9PiByLnRvdGFsVG9rZW5zIHx8IDBcblxuICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtY2hhcnQtY2FyZCcgfSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZGVyJyB9LFxuICAgICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2RhaWx5VHJlbmQnKSksXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgdCgnbm9EYXRhJykpKSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWJsb2NrJyB9LCB0KCdub0RhdGEnKSkpXG4gIH1cblxuICBjb25zdCBtYXggPSBNYXRoLm1heCgxLCAuLi5yb3dzLm1hcCgoZCkgPT4gZC50b3RhbFRva2VucyB8fCAwKSlcbiAgY29uc3QgbGFiZWxFdmVyeSA9IHJvd3MubGVuZ3RoID4gMjggPyA0IDogcm93cy5sZW5ndGggPiAxNCA/IDIgOiAxXG4gIGNvbnN0IGZpcnN0TGFiZWwgPSB4TGFiZWwocm93c1swXS5rZXksIGdyYW4pXG4gIGNvbnN0IGxhc3RMYWJlbCA9IHhMYWJlbChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0ua2V5LCBncmFuKVxuICBjb25zdCByYW5nZUxhYmVsID0gZmlyc3RMYWJlbCArICcgLSAnICsgbGFzdExhYmVsXG5cbiAgZnVuY3Rpb24gc2hvd1RpcChlLCByb3cpIHtcbiAgICBjb25zdCBjaGFydFJlY3QgPSBjaGFydFJlZi5jdXJyZW50ID8gY2hhcnRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGxcbiAgICBpZiAoIWNoYXJ0UmVjdCkgcmV0dXJuXG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgeCA9IE1hdGgubWluKE1hdGgubWF4KGVsUmVjdC5sZWZ0ICsgZWxSZWN0LndpZHRoIC8gMiAtIGNoYXJ0UmVjdC5sZWZ0LCA3MiksIGNoYXJ0UmVjdC53aWR0aCAtIDcyKVxuICAgIHNldFRpcCh7IHJvdywgeCB9KVxuICB9XG5cbiAgY29uc3Qgdmlld1N3aXRjaGVyID0gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtZ3JhbicsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogdCgnY2hhcnRUeXBlR3JvdXAnKSB9LFxuICAgIGgoJ2J1dHRvbicsIHtcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgY2xhc3NOYW1lOiAndHNkLWdyYW4tYnRuJyxcbiAgICAgICdkYXRhLWFjdGl2ZSc6IHZpZXcgPT09ICdiYXInID8gJ3RydWUnIDogdW5kZWZpbmVkLFxuICAgICAgb25DbGljazogKCkgPT4geyBzZXRUaXAobnVsbCk7IHNldFZpZXcoJ2JhcicpIH0sXG4gICAgfSwgdCgnYmFyVmlldycpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1ncmFuLWJ0bicsXG4gICAgICAnZGF0YS1hY3RpdmUnOiB2aWV3ID09PSAnbGluZScgPyAndHJ1ZScgOiB1bmRlZmluZWQsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7IHNldFRpcChudWxsKTsgc2V0VmlldygnbGluZScpIH0sXG4gICAgfSwgdCgnbGluZVZpZXcnKSkpXG5cbiAgY29uc3QgYmFyVGlwID0gdGlwXG4gICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwJywgc3R5bGU6IHsgbGVmdDogdGlwLnggKyAncHgnIH0gfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kYXRlJyB9LCB0aXAucm93LmtleSArICcgJyArIHdlZWtkYXlOYW1lKHRpcC5yb3cua2V5LCB0KSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLWluJyB9KSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kSW5wdXQnKSksXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaW5PZih0aXAucm93KSkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90IHRzZC1sZWdlbmQtb3V0JyB9KSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KG91dE9mKHRpcC5yb3cpKSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXRvdGFsJyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b29sdGlwVG90YWwnKSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIGZvcm1hdEludCh0b3RPZih0aXAucm93KSkpKSlcbiAgICA6IG51bGxcblxuICBjb25zdCBib2R5ID0gdmlldyA9PT0gJ2xpbmUnXG4gICAgPyBoKExpbmVDaGFydCwgeyByb3dzLCBncmFuLCBzdGVwRGF5cywgc2hvd1RpcCwgdGlwLCBzZXRUaXAsIGNoYXJ0UmVmIH0pXG4gICAgOiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jaGFydCcsIHJlZjogY2hhcnRSZWYgfSxcbiAgICAgICAgcm93cy5tYXAoKHJvdywgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluVCA9IGluT2Yocm93KVxuICAgICAgICAgIGNvbnN0IG91dFQgPSBvdXRPZihyb3cpXG4gICAgICAgICAgY29uc3QgdG90VCA9IHRvdE9mKHJvdylcbiAgICAgICAgICBjb25zdCBwY3RJbiA9IChpblQgLyBtYXgpICogMTAwXG4gICAgICAgICAgY29uc3QgcGN0T3V0ID0gKG91dFQgLyBtYXgpICogMTAwXG4gICAgICAgICAgY29uc3Qgc2hvd0xhYmVsID0gaSAlIGxhYmVsRXZlcnkgPT09IDAgfHwgaSA9PT0gcm93cy5sZW5ndGggLSAxXG4gICAgICAgICAgcmV0dXJuIGgoJ2RpdicsIHtcbiAgICAgICAgICAgIGtleTogcm93LmtleSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1jaGFydC1jb2wnLFxuICAgICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgICBvbk1vdXNlRW50ZXI6IChlKSA9PiBzaG93VGlwKGUsIHJvdyksXG4gICAgICAgICAgICBvbk1vdXNlTGVhdmU6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93VGlwKGUsIHJvdyksXG4gICAgICAgICAgICBvbkJsdXI6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnYmFyQXJpYScsIHsga2V5OiByb3cua2V5LCBpbjogZm9ybWF0SW50KGluVCksIG91dDogZm9ybWF0SW50KG91dFQpLCB0b3Q6IGZvcm1hdEludCh0b3RUKSB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtcGxvdCcgfSxcbiAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc3RhY2snIH0sXG4gICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc2VnIHRzZC1zZWctb3V0Jywgc3R5bGU6IHsgaGVpZ2h0OiBwY3RPdXQgKyAnJScgfSB9KSxcbiAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jaGFydC1zZWcgdHNkLXNlZy1pbicsIHN0eWxlOiB7IGhlaWdodDogcGN0SW4gKyAnJScgfSB9KSkpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWNoYXJ0LWxhYmVsJyArIChzaG93TGFiZWwgPyAnJyA6ICcgdHNkLWNoYXJ0LWxhYmVsLWhpZGRlbicpLFxuICAgICAgICAgICAgfSwgeExhYmVsKHJvdy5rZXksIGdyYW4pKSlcbiAgICAgICAgfSksXG4gICAgICAgIGJhclRpcClcblxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtY2hhcnQtY2FyZCcgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgIGgoJ2gzJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10aXRsZScgfSwgdCgnZGFpbHlUcmVuZCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWFjdGlvbnMnIH0sXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgZ3JhbkxhYmVsICsgJyDCtyAnICsgcmFuZ2VMYWJlbCksXG4gICAgICAgIHZpZXdTd2l0Y2hlcikpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZCcgfSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC1pbicgfSksIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1pdGVtJyB9LFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbGVnZW5kLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksIHQoJ2xlZ2VuZE91dHB1dCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC10b3RhbCcgfSksIHQoJ2xlZ2VuZFRvdGFsJykpKSxcbiAgICBib2R5KVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaKmOe6v+Wbvu+8iFNWR++8mui+k+WFpSAvIOi+k+WHuiAvIOaAuyBUb2tlbu+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyoqIENhdG11bGwtUm9tIC0+IGN1YmljIGJlemllciBzbW9vdGggcGF0aCB0aHJvdWdoIHRoZSBnaXZlbiBwb2ludHMuICovXG5mdW5jdGlvbiBzbW9vdGhQYXRoKHB0cykge1xuICBpZiAoIXB0cyB8fCBwdHMubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIGNvbnN0IGYgPSAodikgPT4gTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMFxuICBsZXQgZCA9ICdNICcgKyBmKHB0c1swXS54KSArICcgJyArIGYocHRzWzBdLnkpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHAwID0gcHRzW2kgLSAxXSB8fCBwdHNbaV1cbiAgICBjb25zdCBwMSA9IHB0c1tpXVxuICAgIGNvbnN0IHAyID0gcHRzW2kgKyAxXVxuICAgIGNvbnN0IHAzID0gcHRzW2kgKyAyXSB8fCBwMlxuICAgIGNvbnN0IGMxeCA9IHAxLnggKyAocDIueCAtIHAwLngpIC8gNlxuICAgIGNvbnN0IGMxeSA9IHAxLnkgKyAocDIueSAtIHAwLnkpIC8gNlxuICAgIGNvbnN0IGMyeCA9IHAyLnggLSAocDMueCAtIHAxLngpIC8gNlxuICAgIGNvbnN0IGMyeSA9IHAyLnkgLSAocDMueSAtIHAxLnkpIC8gNlxuICAgIGQgKz0gJyBDICcgKyBmKGMxeCkgKyAnICcgKyBmKGMxeSkgKyAnLCAnICsgZihjMngpICsgJyAnICsgZihjMnkpICsgJywgJyArIGYocDIueCkgKyAnICcgKyBmKHAyLnkpXG4gIH1cbiAgcmV0dXJuIGRcbn1cblxuZnVuY3Rpb24gTGluZUNoYXJ0KHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgZ3Jhbiwgc3RlcERheXMsIHNob3dUaXAsIHRpcCwgc2V0VGlwLCBjaGFydFJlZiB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBXID0gNjIwXG4gIGNvbnN0IEggPSAyNDBcbiAgY29uc3QgUEFEID0geyB0OiAxNCwgcjogMTQsIGI6IDI2LCBsOiA0OCB9XG4gIGNvbnN0IGlubmVyVyA9IFcgLSBQQUQubCAtIFBBRC5yXG4gIGNvbnN0IGlubmVySCA9IEggLSBQQUQudCAtIFBBRC5iXG4gIGNvbnN0IG4gPSByb3dzLmxlbmd0aFxuXG4gIGNvbnN0IGluT2YgPSAocikgPT4gKHIuaW5wdXRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVJlYWRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVdyaXRlVG9rZW5zIHx8IDApXG4gIGNvbnN0IG91dE9mID0gKHIpID0+IHIub3V0cHV0VG9rZW5zIHx8IDBcbiAgY29uc3QgdG90T2YgPSAocikgPT4gci50b3RhbFRva2VucyB8fCAwXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KDEsIC4uLnJvd3MubWFwKChkKSA9PiBkLnRvdGFsVG9rZW5zIHx8IDApKVxuICBjb25zdCBuaWNlTWF4ID0gbmljZUNlaWwobWF4KVxuXG4gIGNvbnN0IHggPSAoaSkgPT4gUEFELmwgKyAobiA9PT0gMSA/IGlubmVyVyAvIDIgOiAoaSAvIChuIC0gMSkpICogaW5uZXJXKVxuICBjb25zdCB5ID0gKHYpID0+IFBBRC50ICsgaW5uZXJIIC0gKHYgLyBuaWNlTWF4KSAqIGlubmVySFxuICBjb25zdCBjb2xXID0gaW5uZXJXIC8gblxuXG4gIC8vIEhvdmVyIHN0YXRlOiBwaXhlbCB4IGZvciB0aGUgdG9vbHRpcCwgdmlld0JveCB4IGZvciB0aGUgY3Vyc29yICsgZG90cy5cbiAgZnVuY3Rpb24gc2hvd1RpcExpbmUoZSwgcm93KSB7XG4gICAgY29uc3QgcmVjdCA9IGNoYXJ0UmVmLmN1cnJlbnQgPyBjaGFydFJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbFxuICAgIGlmICghcmVjdCB8fCByZWN0LndpZHRoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBlbFJlY3QgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCB4UHggPSBlbFJlY3QubGVmdCArIGVsUmVjdC53aWR0aCAvIDIgLSByZWN0LmxlZnRcbiAgICBjb25zdCBzdmdYID0gKHhQeCAvIHJlY3Qud2lkdGgpICogV1xuICAgIGNvbnN0IHggPSBNYXRoLm1pbihNYXRoLm1heCh4UHgsIDcyKSwgcmVjdC53aWR0aCAtIDcyKVxuICAgIHNldFRpcCh7IHJvdywgeCwgc3ZnWCB9KVxuICB9XG4gIGNvbnN0IHRyb3cgPSB0aXAgPyB0aXAucm93IDogbnVsbFxuICBjb25zdCBjdXJzb3IgPSB0aXBcbiAgICA/IGgoJ2xpbmUnLCB7XG4gICAgICAgIGtleTogJ2N1cnNvcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLWN1cnNvcicsXG4gICAgICAgIHgxOiB0aXAuc3ZnWCwgeTE6IFBBRC50LCB4MjogdGlwLnN2Z1gsIHkyOiBIIC0gUEFELmIsXG4gICAgICB9KVxuICAgIDogbnVsbFxuICBjb25zdCBkb3RzID0gdGlwXG4gICAgPyBbXG4gICAgICAgIGgoJ2NpcmNsZScsIHsga2V5OiAnaGwtaW4nLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC1pbicsIGN4OiB0aXAuc3ZnWCwgY3k6IHkoaW5PZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgICAgaCgnY2lyY2xlJywgeyBrZXk6ICdobC1vdXQnLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC1vdXQnLCBjeDogdGlwLnN2Z1gsIGN5OiB5KG91dE9mKHRyb3cpKSwgcjogMy41IH0pLFxuICAgICAgICBoKCdjaXJjbGUnLCB7IGtleTogJ2hsLXRvdCcsIGNsYXNzTmFtZTogJ3RzZC1saW5lLWhsIHRzZC1saW5lLWhsLXRvdGFsJywgY3g6IHRpcC5zdmdYLCBjeTogeSh0b3RPZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgIF1cbiAgICA6IG51bGxcblxuICBjb25zdCBpblB0cyA9IHNtb290aFBhdGgocm93cy5tYXAoKHIsIGkpID0+ICh7IHg6IHgoaSksIHk6IHkoaW5PZihyKSkgfSkpKVxuICBjb25zdCBvdXRQdHMgPSBzbW9vdGhQYXRoKHJvd3MubWFwKChyLCBpKSA9PiAoeyB4OiB4KGkpLCB5OiB5KG91dE9mKHIpKSB9KSkpXG4gIGNvbnN0IHRvdFB0cyA9IHNtb290aFBhdGgocm93cy5tYXAoKHIsIGkpID0+ICh7IHg6IHgoaSksIHk6IHkodG90T2YocikpIH0pKSlcbiAgY29uc3QgZ3JpZEYgPSBbMCwgMC4yNSwgMC41LCAwLjc1LCAxXVxuICBjb25zdCBsYWJlbEV2ZXJ5ID0gcm93cy5sZW5ndGggPiAyOCA/IDQgOiByb3dzLmxlbmd0aCA+IDE0ID8gMiA6IDFcbiAgY29uc3Qgc2hvd0xhYmVsID0gKGkpID0+IGkgJSBsYWJlbEV2ZXJ5ID09PSAwIHx8IGkgPT09IHJvd3MubGVuZ3RoIC0gMVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lY2hhcnQnLCByZWY6IGNoYXJ0UmVmIH0sXG4gICAgaCgnc3ZnJywgeyB2aWV3Qm94OiAnMCAwICcgKyBXICsgJyAnICsgSCwgcm9sZTogJ2ltZycsICdhcmlhLWxhYmVsJzogdCgnbGluZUNoYXJ0QXJpYScpIH0sXG4gICAgICAvLyBncmlkICsgYXhpc1xuICAgICAgZ3JpZEYubWFwKChmKSA9PlxuICAgICAgICBoKCdsaW5lJywge1xuICAgICAgICAgIGtleTogJ2cnICsgZixcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1ncmlkJyxcbiAgICAgICAgICB4MTogUEFELmwsIHkxOiB5KGYgKiBuaWNlTWF4KSwgeDI6IFcgLSBQQUQuciwgeTI6IHkoZiAqIG5pY2VNYXgpLFxuICAgICAgICB9KSksXG4gICAgICBoKCdsaW5lJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1heGlzJywgeDE6IFBBRC5sLCB5MTogUEFELnQsIHgyOiBQQUQubCwgeTI6IEggLSBQQUQuYiB9KSxcbiAgICAgIGgoJ2xpbmUnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lLWF4aXMnLCB4MTogUEFELmwsIHkxOiBIIC0gUEFELmIsIHgyOiBXIC0gUEFELnIsIHkyOiBIIC0gUEFELmIgfSksXG4gICAgICAvLyB5IGxhYmVsc1xuICAgICAgZ3JpZEYubWFwKChmKSA9PlxuICAgICAgICBoKCd0ZXh0Jywge1xuICAgICAgICAgIGtleTogJ3l0JyArIGYsXG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWxpbmUtdGV4dCcsXG4gICAgICAgICAgeDogUEFELmwgLSA2LFxuICAgICAgICAgIHk6IHkoZiAqIG5pY2VNYXgpICsgMyxcbiAgICAgICAgICB0ZXh0QW5jaG9yOiAnZW5kJyxcbiAgICAgICAgfSwgZm9ybWF0VG9rZW5zU2hvcnQoZiAqIG5pY2VNYXgpKSksXG4gICAgICAvLyBzZXJpZXMgKHNtb290aCBjdXJ2ZXMpXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS10b3RhbCcsIGQ6IHRvdFB0cyB9KSxcbiAgICAgIGgoJ3BhdGgnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lLWluJywgZDogaW5QdHMgfSksXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1vdXQnLCBkOiBvdXRQdHMgfSksXG4gICAgICBjdXJzb3IsXG4gICAgICBkb3RzLFxuICAgICAgLy8geCBsYWJlbHNcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBzaG93TGFiZWwoaSlcbiAgICAgICAgICA/IGgoJ3RleHQnLCB7XG4gICAgICAgICAgICAgIGtleTogJ3hsJyArIGksXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLXRleHQnLFxuICAgICAgICAgICAgICB4OiB4KGkpLFxuICAgICAgICAgICAgICB5OiBIIC0gOCxcbiAgICAgICAgICAgICAgdGV4dEFuY2hvcjogaSA9PT0gMCA/ICdzdGFydCcgOiBpID09PSBuIC0gMSA/ICdlbmQnIDogJ21pZGRsZScsXG4gICAgICAgICAgICB9LCB4TGFiZWwoci5rZXksIGdyYW4pKVxuICAgICAgICAgIDogbnVsbCksXG4gICAgICAvLyBob3ZlciB0YXJnZXRzOiBhIGZ1bGwtaGVpZ2h0IGNvbHVtbiBwZXIgYnVja2V0LCBtYXRjaGluZyB0aGUgYmFyIGNoYXJ0IGZlZWxcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBoKCdyZWN0Jywge1xuICAgICAgICAgIGtleTogJ2gnICsgaSxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1ob3ZlcicsXG4gICAgICAgICAgeDogeChpKSAtIGNvbFcgLyAyLFxuICAgICAgICAgIHk6IFBBRC50LFxuICAgICAgICAgIHdpZHRoOiBjb2xXLFxuICAgICAgICAgIGhlaWdodDogaW5uZXJILFxuICAgICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAgIG9uTW91c2VFbnRlcjogKGUpID0+IHNob3dUaXBMaW5lKGUsIHIpLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZTogKCkgPT4gc2V0VGlwKG51bGwpLFxuICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93VGlwTGluZShlLCByKSxcbiAgICAgICAgICBvbkJsdXI6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgfSkpLFxuICAgICAgLy8gdmlzaWJsZSBkb3RzIG9uIHNwYXJzZSBwb2ludHNcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBpICUgbGFiZWxFdmVyeSA9PT0gMCB8fCBpID09PSBuIC0gMVxuICAgICAgICAgID8gaCgnY2lyY2xlJywge1xuICAgICAgICAgICAgICBrZXk6ICdkJyArIGksXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLWRvdCcsXG4gICAgICAgICAgICAgIGN4OiB4KGkpLFxuICAgICAgICAgICAgICBjeTogeSh0b3RPZihyKSksXG4gICAgICAgICAgICAgIHI6IDIuNSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBudWxsKSksXG4gICAgdGlwXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAnLCBzdHlsZTogeyBsZWZ0OiB0aXAueCArICdweCcgfSB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZGF0ZScgfSwgdGlwLnJvdy5rZXkgKyAoc3RlcERheXMgPiAxID8gJyAnICsgdCgnc3RhcnRORGF5cycsIHsgbjogc3RlcERheXMgfSkgOiAnJykgKyAnICcgKyB3ZWVrZGF5TmFtZSh0aXAucm93LmtleSwgdCkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90IHRzZC1sZWdlbmQtaW4nIH0pLFxuICAgICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaW5PZih0aXAucm93KSkpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQob3V0T2YodGlwLnJvdykpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC10b3RhbCcgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b29sdGlwVG90YWwnKSksXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgZm9ybWF0SW50KHRvdE9mKHRpcC5yb3cpKSkpKVxuICAgICAgOiBudWxsKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOW5tOW6pueUqOmHj+eDreWKm+Wbvu+8iEdpdEh1YiDpo47moLzvvIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEhlYXRtYXBDYXJkKHByb3BzKSB7XG4gIGNvbnN0IHsgZGF5cyB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbaHRpcCwgc2V0SHRpcF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKSAvLyB7IGNlbGwsIGxlZnQsIHRvcCB9IGluIHZpZXdwb3J0IGNvb3Jkc1xuICBjb25zdCBncmlkID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGRheXMgfHwgW11cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMSwgLi4ubGlzdC5tYXAoKGQpID0+IGQudG90YWxUb2tlbnMgfHwgMCkpXG4gICAgY29uc3QgZmlyc3QgPSBuZXcgRGF0ZShsaXN0WzBdLmtleSArICdUMDA6MDA6MDAnKVxuICAgIGNvbnN0IG9mZnNldCA9IGZpcnN0LmdldERheSgpIC8vIDAgPSBTdW5kYXlcbiAgICBjb25zdCB3ZWVrcyA9IFtdXG4gICAgbGV0IGN1ciA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgY3VyLnB1c2gobnVsbClcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgY3VyLnB1c2goZClcbiAgICAgIGlmIChjdXIubGVuZ3RoID09PSA3KSB7XG4gICAgICAgIHdlZWtzLnB1c2goY3VyKVxuICAgICAgICBjdXIgPSBbXVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VyLmxlbmd0aCA+IDApIHtcbiAgICAgIHdoaWxlIChjdXIubGVuZ3RoIDwgNykgY3VyLnB1c2gobnVsbClcbiAgICAgIHdlZWtzLnB1c2goY3VyKVxuICAgIH1cbiAgICAvLyDmnIjku73moIforrDvvJrmn5DmnIggMSDml6XmiYDlnKjnmoTliJdcbiAgICBjb25zdCBtb250aE1hcmtzID0gW11cbiAgICB3ZWVrcy5mb3JFYWNoKCh3aywgY29sKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygd2spIHtcbiAgICAgICAgaWYgKGMgJiYgYy5rZXkuZW5kc1dpdGgoJy0wMScpKSB7XG4gICAgICAgICAgbW9udGhNYXJrcy5wdXNoKHsgY29sLCBuYW1lOiB0KCdtb250aExhYmVsJywgeyBuOiBOdW1iZXIoYy5rZXkuc2xpY2UoNSwgNykpIH0pIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHsgd2Vla3MsIG1heCwgbW9udGhNYXJrcyB9XG4gIH0sIFtkYXlzXSlcblxuICBpZiAoZ3JpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICBmdW5jdGlvbiBzaG93Q2VsbFRpcChlLCBjKSB7XG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgc2V0SHRpcCh7IGNlbGw6IGMsIGxlZnQ6IGVsUmVjdC5sZWZ0ICsgZWxSZWN0LndpZHRoIC8gMiwgdG9wOiBlbFJlY3QudG9wIH0pXG4gIH1cblxuICBjb25zdCBoZWF0VGlwID0gaHRpcFxuICAgID8gaCgnZGl2Jywge1xuICAgICAgICBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcCB0c2QtaGVhdC10aXAnLFxuICAgICAgICBzdHlsZTogeyBwb3NpdGlvbjogJ2ZpeGVkJywgbGVmdDogaHRpcC5sZWZ0ICsgJ3B4JywgdG9wOiBodGlwLnRvcCArICdweCcsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtMTEwJSknIH0sXG4gICAgICB9LFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRhdGUnIH0sIGh0aXAuY2VsbC5rZXkgKyAnICcgKyB3ZWVrZGF5TmFtZShodGlwLmNlbGwua2V5LCB0KSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCcsIHN0eWxlOiB7IGJhY2tncm91bmQ6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknIH0gfSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ3RvdGFsVG9rZW5zJykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KGh0aXAuY2VsbC50b3RhbFRva2VucyB8fCAwKSkpLFxuICAgICAgICBodGlwLmNlbGwuY2FsbHMgPiAwXG4gICAgICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90Jywgc3R5bGU6IHsgYmFja2dyb3VuZDogJ3ZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSknIH0gfSksXG4gICAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdjYWxscycpKSxcbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaHRpcC5jZWxsLmNhbGxzKSkpXG4gICAgICAgICAgOiBudWxsKVxuICAgIDogbnVsbFxuXG4gIGNvbnN0IGRheU5hbWVzID0gWycnLCB0KCd3ZWVrZGF5TW9uJyksICcnLCB0KCd3ZWVrZGF5V2VkJyksICcnLCB0KCd3ZWVrZGF5RnJpJyksICcnXVxuICBjb25zdCBsZWdlbmRTdGVwcyA9IFswLCAwLjI1LCAwLjUsIDAuNzUsIDFdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWhlYXRtYXAtY2FyZCcgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgIGgoJ2gzJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10aXRsZScgfSwgdCgneWVhcmx5SGVhdG1hcCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgdCgneWVhckRhaWx5JywgeyB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgfSkpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwJyB9LFxuICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1pbm5lcicgfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1tb250aHMnIH0sXG4gICAgICAgICAgZ3JpZC5tb250aE1hcmtzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgIGtleTogbS5jb2wsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLW1vbnRoJyxcbiAgICAgICAgICAgICAgc3R5bGU6IHsgbGVmdDogKG0uY29sICogMTIpICsgJ3B4JyB9LFxuICAgICAgICAgICAgfSwgbS5uYW1lKSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWJvZHknIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1kYXlzJyB9LFxuICAgICAgICAgICAgZGF5TmFtZXMubWFwKChuLCBpKSA9PlxuICAgICAgICAgICAgICBoKCdzcGFuJywgeyBrZXk6IGksIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWRheScgfSwgbikpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWdyaWQnIH0sXG4gICAgICAgICAgICBncmlkLndlZWtzLm1hcCgod2ssIGNvbCkgPT5cbiAgICAgICAgICAgICAgaCgnZGl2JywgeyBrZXk6IGNvbCwgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY29sJyB9LFxuICAgICAgICAgICAgICAgIHdrLm1hcCgoYywgcm93KSA9PlxuICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGMua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kOiBoZWF0Q29sb3IoYy50b3RhbFRva2VucyB8fCAwLCBncmlkLm1heCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0KCdobVRpdGxlJywgeyBrZXk6IGMua2V5LCB0b2tlbnM6IGZvcm1hdEludChjLnRvdGFsVG9rZW5zIHx8IDApLCBjYWxsczogYy5jYWxscyA/IHQoJ2htQ2FsbHMnLCB7IGNvdW50OiBmb3JtYXRJbnQoYy5jYWxscykgfSkgOiAnJyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcjogKGUpID0+IHNob3dDZWxsVGlwKGUsIGMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiAoKSA9PiBzZXRIdGlwKG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Gb2N1czogKGUpID0+IHNob3dDZWxsVGlwKGUsIGMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAoKSA9PiBzZXRIdGlwKG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBoKCdzcGFuJywgeyBrZXk6ICdlJyArIGNvbCArICctJyArIHJvdywgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsIHN0eWxlOiB7IHZpc2liaWxpdHk6ICdoaWRkZW4nIH0gfSkpKSkpKSksXG4gICAgaGVhdFRpcCxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWxlZ2VuZCcgfSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdsZXNzJykpLFxuICAgICAgbGVnZW5kU3RlcHMubWFwKChzKSA9PlxuICAgICAgICBoKCdzcGFuJywge1xuICAgICAgICAgIGtleTogcyxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1jZWxsJyxcbiAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kOiBzID09PSAwID8gJ3ZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3ZlciknIDogaGVhdENvbG9yKE1hdGgubWF4KDEsIHMgKiAxMDApLCAxMDApIH0sXG4gICAgICAgIH0pKSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdtb3JlJykpKSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5oyJ5qih5Z6L5piO57uG6KGoXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBNb2RlbFRhYmxlKHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgY3VycmVuY3kgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgYWxsID0gcm93cyB8fCBbXVxuICBjb25zdCBbc29ydEtleSwgc2V0U29ydEtleV0gPSBSZWFjdC51c2VTdGF0ZSgndG90YWwnKVxuICBjb25zdCBbc29ydERpciwgc2V0U29ydERpcl0gPSBSZWFjdC51c2VTdGF0ZSgnZGVzYycpXG5cbiAgY29uc3QgdmlldyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gYWxsLm1hcCgocikgPT4gKHtcbiAgICBrZXk6IHIua2V5LFxuICAgIGNhbGxzOiByLmNhbGxzIHx8IDAsXG4gICAgaW5wdXQ6IChyLmlucHV0VG9rZW5zIHx8IDApICsgKHIuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKHIuY2FjaGVXcml0ZVRva2VucyB8fCAwKSxcbiAgICBvdXRwdXQ6IHIub3V0cHV0VG9rZW5zIHx8IDAsXG4gICAgdG90YWw6IHIudG90YWxUb2tlbnMgfHwgMCxcbiAgICBjb3N0OiByLmNvc3QgfHwgMCxcbiAgICB1bnByaWNlZDogKHIudG90YWxUb2tlbnMgfHwgMCkgPiAwICYmICEoci5jb3N0ID4gMCksXG4gIH0pKSwgW2FsbF0pXG5cbiAgY29uc3Qgc3VtVG90YWwgPSBSZWFjdC51c2VNZW1vKCgpID0+IHZpZXcucmVkdWNlKChzLCByKSA9PiBzICsgci50b3RhbCwgMCksIFt2aWV3XSlcblxuICBjb25zdCBzb3J0ZWQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBsaXN0ID0gdmlldy5zbGljZSgpXG4gICAgY29uc3QgZGlyID0gc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTFcbiAgICBsaXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGF2ID0gYVtzb3J0S2V5XVxuICAgICAgY29uc3QgYnYgPSBiW3NvcnRLZXldXG4gICAgICBpZiAoYXYgPT09IGJ2KSByZXR1cm4gMFxuICAgICAgcmV0dXJuIChhdiA+IGJ2ID8gMSA6IC0xKSAqIGRpclxuICAgIH0pXG4gICAgcmV0dXJuIGxpc3RcbiAgfSwgW3ZpZXcsIHNvcnRLZXksIHNvcnREaXJdKVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZVNvcnQoa2V5KSB7XG4gICAgaWYgKHNvcnRLZXkgPT09IGtleSkgc2V0U29ydERpcigoZCkgPT4gKGQgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYycpKVxuICAgIGVsc2UgeyBzZXRTb3J0S2V5KGtleSk7IHNldFNvcnREaXIoJ2Rlc2MnKSB9XG4gIH1cblxuICBjb25zdCBjb2xzID0gW1xuICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogdCgnY29sTW9kZWwnKSwgc29ydGFibGU6IGZhbHNlIH0sXG4gICAgeyBrZXk6ICdjYWxscycsIGxhYmVsOiB0KCdjb2xDYWxscycpLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAnaW5wdXQnLCBsYWJlbDogdCgnY29sSW5wdXQnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ291dHB1dCcsIGxhYmVsOiB0KCdjb2xPdXRwdXQnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ3RvdGFsJywgbGFiZWw6IHQoJ2NvbFRvdGFsJyksIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdjb3N0JywgbGFiZWw6IHQoJ2NvbENvc3QnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ3JhdGlvJywgbGFiZWw6IHQoJ2NvbFNoYXJlJyksIHNvcnRhYmxlOiBmYWxzZSB9LFxuICBdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLXRhYmxlLWNhcmQnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1oZWFkZXInIH0sXG4gICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2J5TW9kZWxUaXRsZScpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSxcbiAgICAgICAgdCgnbW9kZWxDb3VudCcsIHsgbjogdmlldy5sZW5ndGggfSkgKyAnIMK3ICcgKyB0KCdjb2xUb3RhbCcpICsgJyAnICsgZm9ybWF0SW50KHN1bVRvdGFsKSkpLFxuICAgIHZpZXcubGVuZ3RoID09PSAwXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWJsb2NrJyB9LCB0KCdub0RhdGEnKSlcbiAgICAgIDogaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdGFibGUtd3JhcCcgfSxcbiAgICAgICAgICBoKCd0YWJsZScsIHsgY2xhc3NOYW1lOiAndHNkLXRhYmxlJyB9LFxuICAgICAgICAgICAgaCgnY2FwdGlvbicsIHsgY2xhc3NOYW1lOiAndHNkLXZpc3VhbGx5LWhpZGRlbicgfSwgdCgnbW9kZWxUYWJsZUNhcHRpb24nKSksXG4gICAgICAgICAgICBoKCd0aGVhZCcsIG51bGwsXG4gICAgICAgICAgICAgIGgoJ3RyJywgbnVsbCwgY29scy5tYXAoKGMpID0+XG4gICAgICAgICAgICAgICAgaCgndGgnLCB7XG4gICAgICAgICAgICAgICAgICBrZXk6IGMua2V5LFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXRoJyArIChjLmtleSA9PT0gJ21vZGVsJyA/ICcnIDogJyB0c2QtdGgtbnVtJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGMuc29ydGFibGVcbiAgICAgICAgICAgICAgICAgICAgPyBoKCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zb3J0LWJ0bicgKyAoc29ydEtleSA9PT0gYy5rZXkgPyAnIHRzZC1zb3J0LWFjdGl2ZScgOiAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0b2dnbGVTb3J0KGMua2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYy5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRLZXkgPT09IGMua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNvcnQtYXJyb3cnIH0sIHNvcnREaXIgPT09ICdhc2MnID8gJ+KGkScgOiAn4oaTJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKVxuICAgICAgICAgICAgICAgICAgICA6IGMubGFiZWwpKSkpLFxuICAgICAgICAgICAgaCgndGJvZHknLCBudWxsLCBzb3J0ZWQubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gc3VtVG90YWwgPiAwID8gci50b3RhbCAvIHN1bVRvdGFsIDogMFxuICAgICAgICAgICAgICByZXR1cm4gaCgndHInLCB7IGtleTogci5rZXksIGNsYXNzTmFtZTogJ3RzZC10cicgfSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC10ZC1tb2RlbCcgfSxcbiAgICAgICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1tb25vJywgdGl0bGU6IHIua2V5IH0sIHIua2V5KSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LCBmb3JtYXRJbnQoci5jYWxscykpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bScgfSwgZm9ybWF0SW50KHIuaW5wdXQpKSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC1udW0nIH0sIGZvcm1hdEludChyLm91dHB1dCkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bSB0c2QtdG90YWwnIH0sIGZvcm1hdEludChyLnRvdGFsKSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LFxuICAgICAgICAgICAgICAgICAgci51bnByaWNlZFxuICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC11bnByaWNlZCcsIHRpdGxlOiB0KCd1bnByaWNlZFJvd0hpbnQnKSB9LCB0KCd1bnByaWNlZCcpKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdENvc3Qoci5jb3N0LCBjdXJyZW5jeSkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLXRkLXJhdGlvJyB9LFxuICAgICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8nIH0sXG4gICAgICAgICAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXJhdGlvLWJhcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1yYXRpby1maWxsJywgc3R5bGU6IHsgd2lkdGg6IHJhdGlvICogMTAwICsgJyUnIH0gfSkpLFxuICAgICAgICAgICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8tcGN0JyB9LCBmbXRQY3QocmF0aW8pKSkpKVxuICAgICAgICAgICAgfSkpKSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5LiJ5oCB77ya5Yqg6L29IC8g6ZSZ6K+vIC8g56m6XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBMb2FkaW5nU3RhdGUoKSB7XG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWxvYWRpbmcnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZHMnIH0sXG4gICAgICBbMCwgMSwgMiwgMywgNF0ubWFwKChpKSA9PlxuICAgICAgICBoKCdkaXYnLCB7IGtleTogaSwgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWNhcmQtc2tlbGV0b24nIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzQwJScsIGhlaWdodDogMTIgfSB9KSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbicsIHN0eWxlOiB7IHdpZHRoOiAnNzAlJywgaGVpZ2h0OiAyMiwgbWFyZ2luVG9wOiAxMCB9IH0pKSkpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbicsIHN0eWxlOiB7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogMzAwIH0gfSkpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICBbMCwgMSwgMiwgMywgNCwgNV0ubWFwKChpKSA9PlxuICAgICAgICBoKCdkaXYnLCB7IGtleTogaSwgY2xhc3NOYW1lOiAndHNkLXNrZWxldG9uLXJvdycsIHN0eWxlOiB7IHdpZHRoOiA5NiAtIGkgKiA4ICsgJyUnIH0gfSkpKSlcbn1cblxuZnVuY3Rpb24gRXJyb3JTdGF0ZShwcm9wcykge1xuICBjb25zdCB7IGVycm9yLCBvblJldHJ5IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1lcnJvcicsIHJvbGU6ICdhbGVydCcgfSxcbiAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2FsZXJ0Jywgc2l6ZTogMjIsIGNsYXNzTmFtZTogJ3RzZC1lcnJvci1pY29uJyB9KSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1lcnJvci10ZXh0JyB9LFxuICAgICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWVycm9yLXRpdGxlJyB9LCB0KCdsb2FkRmFpbGVkVGl0bGUnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZXJyb3ItZGV0YWlsJyB9LCBTdHJpbmcoKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKSkpLFxuICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1wcmltYXJ5Jywgb25DbGljazogb25SZXRyeSB9LCB0KCdyZXRyeScpKSlcbn1cblxuZnVuY3Rpb24gRW1wdHlTdGF0ZShwcm9wcykge1xuICBjb25zdCB7IGZpbHRlcmVkLCBvblJlc2V0IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1lbXB0eScgfSxcbiAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2luYm94Jywgc2l6ZTogMjgsIGNsYXNzTmFtZTogJ3RzZC1lbXB0eS1pY29uJyB9KSxcbiAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZW1wdHktdGl0bGUnIH0sIHQoJ25vRGF0YScpKSxcbiAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZW1wdHktZGVzYycgfSxcbiAgICAgIGZpbHRlcmVkID8gdCgnZW1wdHlGaWx0ZXJlZCcpIDogdCgnZW1wdHlEZXNjJykpLFxuICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1naG9zdCcsIG9uQ2xpY2s6IG9uUmVzZXQgfSwgdCgncmVzZXRGaWx0ZXJzJykpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmhtemdoue6p+eKtuaAgeacuiArIOW4g+WxgFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3RhdHNEYXNoYm9hcmQocHJvcHMpIHtcbiAgY29uc3QgdCA9IHByb3BzLnQgfHwgZmFsbGJhY2tUXG4gIGNvbnN0IFtyYW5nZSwgc2V0UmFuZ2VdID0gUmVhY3QudXNlU3RhdGUoJ3RvZGF5JykgLy8gdG9kYXkgfCA3ZCB8IDMwZCB8IGN1c3RvbVxuICBjb25zdCBbY3VzdG9tLCBzZXRDdXN0b21dID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdEN1c3RvbSlcbiAgY29uc3QgW21vZGVscywgc2V0TW9kZWxzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKSAvLyBbXSA9IOWFqOmDqOaooeWei1xuICBjb25zdCBbY3VzdG9tT3Blbiwgc2V0Q3VzdG9tT3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JldHJ5LCBzZXRSZXRyeV0gPSBSZWFjdC51c2VTdGF0ZSgwKVxuICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gUmVhY3QudXNlU3RhdGUoJ2xvYWRpbmcnKSAvLyBsb2FkaW5nIHwgcmVmcmVzaGluZyB8IHJlYWR5IHwgZXJyb3JcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gUmVhY3QudXNlU3RhdGUobnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKVxuICBjb25zdCBbcHJpY2VzLCBzZXRQcmljZXNdID0gUmVhY3QudXNlU3RhdGUoeyBwcmljZXM6IHt9LCBjdXJyZW5jeTogJ8KlJyB9KVxuICAvLyBQMS02IGJhY2tmaWxsIOi9ruivoueKtuaAge+8mnF1ZXJ5S2V5IOWPmOWMluaXtumHjee9ru+8jOS7heWvueWQjOS4gOafpeivouS4sui9ruivolxuICBjb25zdCBxdWVyeUtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBiYWNrZmlsbFNlZW5SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGZpbmFsUmVmcmVzaFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICBjb25zdCBlZmYgPSBSZWFjdC51c2VNZW1vKCgpID0+IHJhbmdlRm9yKHJhbmdlLCBjdXN0b20pLCBbcmFuZ2UsIGN1c3RvbV0pXG4gIC8vIEZpeGVkIHN0ZXAgcG9saWN5OiB0b2RheSA9IGhvdXJseTsgN2QvMzBkL2N1c3RvbSA9IGRhaWx5LCBjdXN0b20gdXNlcyBhXG4gIC8vIHN0YWJsZSBzdGVwICgxLzMvNS83IGRheXMpIGNob3NlbiBieSB0aGUgcmFuZ2UgbGVuZ3RoLlxuICBjb25zdCBlZmZHcmFuID0gZWZmR3JhbnVsYXJpdHkocmFuZ2UpXG4gIGNvbnN0IHN0ZXBEYXlzID0gcmFuZ2UgPT09ICdjdXN0b20nID8gcGlja1N0ZXBEYXlzKChlZmYudG8gfHwgMCkgLSAoZWZmLmZyb20gfHwgMCkpIDogMVxuICBjb25zdCBncmFuTGFiZWwgPSBzdGVwTGFiZWwodCwgcmFuZ2UsIHN0ZXBEYXlzKVxuXG4gIC8vIOafpeivoue7n+iuoe+8iOmmlui9vemqqOaetu+8m+WIt+aWsOS/neeVmeaXp+aVsOaNrui9rCByZWZyZXNoaW5n77ybZmlsbCAwIOWhq+WFhSArIOW5tOW6pueDreWKm+Wbvu+8iVxuICAvLyBQMS0277yaYmFja2ZpbGwgcnVubmluZyDml7bmr48gM3Mg6Ieq5Yqo6YeN5p+l77ybZG9uZSDlkI7ooaXkuIDmrKHmlLblsL7mn6Xor6LljbPlgZzjgIJcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRydWVcbiAgICBsZXQgYmFja2ZpbGxUaW1lciA9IG51bGxcbiAgICBjb25zdCBxdWVyeUtleSA9IGVmZi5mcm9tICsgJ3wnICsgZWZmLnRvICsgJ3wnICsgbW9kZWxzLmpvaW4oJywnKSArICd8JyArIGVmZkdyYW4gKyAnfCcgKyBzdGVwRGF5c1xuICAgIGlmIChxdWVyeUtleVJlZi5jdXJyZW50ICE9PSBxdWVyeUtleSkge1xuICAgICAgcXVlcnlLZXlSZWYuY3VycmVudCA9IHF1ZXJ5S2V5XG4gICAgICBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBmaW5hbFJlZnJlc2hSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGlzRmluYWxSdW4gPSBmaW5hbFJlZnJlc2hSZWYuY3VycmVudFxuICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRTdGF0dXMoKHMpID0+IChzID09PSAncmVhZHknICYmIGRhdGEgIT09IG51bGwgPyAncmVmcmVzaGluZycgOiAnbG9hZGluZycpKVxuICAgIGhvc3RDYWxsKCd1c2FnZS9xdWVyeScsIHtcbiAgICAgIGZyb206IGVmZi5mcm9tLFxuICAgICAgdG86IGVmZi50byxcbiAgICAgIG1vZGVsczogbW9kZWxzLnNsaWNlKCksXG4gICAgICBmaWxsOiB0cnVlLFxuICAgICAgZ3JhbnVsYXJpdHk6IGVmZkdyYW4sXG4gICAgICBzdGVwRGF5cyxcbiAgICAgIGhlYXRtYXA6IHRydWUsXG4gICAgfSlcbiAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldERhdGEocilcbiAgICAgICAgc2V0U3RhdHVzKCdyZWFkeScpXG4gICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgIGNvbnN0IGJzID0gciAmJiByLmJhY2tmaWxsID8gci5iYWNrZmlsbC5zdGF0dXMgOiBudWxsXG4gICAgICAgIGlmIChicyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgYmFja2ZpbGxTZWVuUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgLy8g5ZCM5LiAIGVmZmVjdCDoh7PlpJrmjILkuIDkuKrlrprml7blmajvvJvph43mn6XlpI3nlKggcmV0cnkg6K6h5pWw5Zmo6Kem5Y+RIGVmZmVjdCDph43ot5FcbiAgICAgICAgICBiYWNrZmlsbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCkgc2V0UmV0cnkoKHYpID0+IHYgKyAxKVxuICAgICAgICAgIH0sIDMwMDApXG4gICAgICAgIH0gZWxzZSBpZiAoYnMgPT09ICdkb25lJyAmJiBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCAmJiAhaXNGaW5hbFJ1bikge1xuICAgICAgICAgIC8vIOWbnuWhq+aUtuWwvu+8muaBsOWlveWGjeafpeS4gOasoeaLv+WIsOWujOaVtOaVsOaNruWQjuWBnOatolxuICAgICAgICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIHNldFJldHJ5KCh2KSA9PiB2ICsgMSlcbiAgICAgICAgfVxuICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0RXJyb3IoZSlcbiAgICAgICAgc2V0U3RhdHVzKCdlcnJvcicpXG4gICAgICB9KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChiYWNrZmlsbFRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQoYmFja2ZpbGxUaW1lcilcbiAgICB9XG4gIH0sIFtlZmYuZnJvbSwgZWZmLnRvLCBtb2RlbHMsIGVmZkdyYW4sIHN0ZXBEYXlzLCByZXRyeV0pXG5cbiAgLy8g5Lu35qC86KGo77ya6L+b5YWl6aG16Z2i5ouJ5LiA5qyhICsg5q+P5qyh5Yi35paw5ZCM5q2l44CCXG4gIC8vIFAwLTHvvJrkvJjlhYjlrpjmlrkgc2V0dGluZ3Mgc2NvcGXvvIh1c2FnZS5wcmljZXMg5ZG95ZCN56m66Ze077yJ77yM5LiN5Y+v55So5pe25Zue6YCAIFJQQ+OAglxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdHJ1ZVxuICAgIGxldCBzY29wZURpc3Bvc2UgPSBudWxsXG4gICAgY29uc3QgbG9hZFJwYyA9ICgpID0+IHtcbiAgICAgIGhvc3RDYWxsKCd1c2FnZS9wcmljZXMnKS50aGVuKChwKSA9PiB7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHAgJiYgcC5wcmljZXMpIHNldFByaWNlcyhwKVxuICAgICAgfSwgKCkgPT4ge30pXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY29wZSA9IGdldFVzYWdlUHJpY2VzU2NvcGUoKVxuICAgICAgaWYgKHNjb3BlICYmIHR5cGVvZiBzY29wZS5nZXRTbmFwc2hvdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2NvcGUuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCBhZG9wdGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgYWRvcHQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgICBjb25zdCBzbmFwID0gc2NvcGUuZ2V0U25hcHNob3QoKVxuICAgICAgICAgIGNvbnN0IHYgPSBzbmFwICYmIHNuYXAudmFsdWVcbiAgICAgICAgICBpZiAoc25hcCAmJiBzbmFwLnN0YXR1cyA9PT0gJ3VuYXZhaWxhYmxlJykgcmV0dXJuXG4gICAgICAgICAgaWYgKHYgJiYgKHYucHJpY2VzIHx8IHYuY3VycmVuY3kpKSB7XG4gICAgICAgICAgICBhZG9wdGVkID0gdHJ1ZVxuICAgICAgICAgICAgc2V0UHJpY2VzKHsgcHJpY2VzOiB2LnByaWNlcyB8fCB7fSwgY3VycmVuY3k6IHYuY3VycmVuY3kgfHwgJ8KlJyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZG9wdCgpXG4gICAgICAgIHNjb3BlRGlzcG9zZSA9IHNjb3BlLnN1YnNjcmliZShhZG9wdClcbiAgICAgICAgaWYgKCFhZG9wdGVkKSBsb2FkUnBjKCkgLy8gc2NvcGUg5pyq5bCx57uqL+aXoOWAvO+8muWFiOi1sCBSUEPvvIzorqLpmIXlsLHnu6rlkI4gc2NvcGUg5LyY5YWI6KaG55uWXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkUnBjKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2FkUnBjKCkgLy8g5o6i5rWLL+e7keWumuW8guW4uO+8muWujOaVtOWbnumAgCBSUEPvvIznu53kuI3mipvlh7pcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKHNjb3BlRGlzcG9zZSkge1xuICAgICAgICB0cnkgeyBzY29wZURpc3Bvc2UoKSB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3JldHJ5XSlcblxuICBjb25zdCByZWxvYWQgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZXRSZXRyeSgodikgPT4gdiArIDEpLCBbXSlcblxuICBjb25zdCByZXNldEZpbHRlcnMgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0TW9kZWxzKFtdKVxuICAgIHNldEN1c3RvbShkZWZhdWx0Q3VzdG9tKCkpXG4gICAgc2V0UmFuZ2UoJ3RvZGF5JylcbiAgfSwgW10pXG5cbiAgY29uc3QgYnVzeSA9IHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ3JlZnJlc2hpbmcnXG4gIGNvbnN0IHJlYWR5ID0gZGF0YSAhPT0gbnVsbFxuICBjb25zdCBpc0Vycm9yID0gc3RhdHVzID09PSAnZXJyb3InXG4gIGNvbnN0IGlzRW1wdHkgPSByZWFkeSAmJiBkYXRhLmRhaWx5Lmxlbmd0aCA9PT0gMCAmJiBkYXRhLmJ5TW9kZWwubGVuZ3RoID09PSAwXG5cbiAgcmV0dXJuIGgoVC5Qcm92aWRlciwgeyB2YWx1ZTogdCB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNlY3Rpb24nLCAnYXJpYS1idXN5JzogYnVzeSB8fCB1bmRlZmluZWQgfSxcbiAgICBoKFN0YXRzSGVhZGVyLCB7IGJ1c3ksIG9uUmVmcmVzaDogcmVsb2FkIH0pLFxuICAgIGgoRmlsdGVyQmFyLCB7XG4gICAgICByYW5nZSxcbiAgICAgIGN1c3RvbSxcbiAgICAgIG1vZGVscyxcbiAgICAgIGN1c3RvbU9wZW4sXG4gICAgICBtb2RlbE9wdGlvbnM6IGRhdGEgPyBkYXRhLm1vZGVscyA6IFtdLFxuICAgICAgb25QcmVzZXQ6IChwKSA9PiB7IHNldFJhbmdlKHApOyBzZXRDdXN0b21PcGVuKGZhbHNlKSB9LFxuICAgICAgb25DdXN0b21PcGVuOiAob3BlbikgPT4geyBzZXRSYW5nZSgnY3VzdG9tJyk7IHNldEN1c3RvbU9wZW4ob3BlbikgfSxcbiAgICAgIG9uQ3VzdG9tQXBwbHk6IChjKSA9PiB7IHNldEN1c3RvbShjKTsgc2V0Q3VzdG9tT3BlbihmYWxzZSkgfSxcbiAgICAgIG9uQ3VzdG9tQ2xvc2U6ICgpID0+IHNldEN1c3RvbU9wZW4oZmFsc2UpLFxuICAgICAgb25Nb2RlbHNDaGFuZ2U6IHNldE1vZGVscyxcbiAgICB9KSxcbiAgICBpc0Vycm9yICYmICFyZWFkeVxuICAgICAgPyBoKEVycm9yU3RhdGUsIHsgZXJyb3IsIG9uUmV0cnk6IHJlbG9hZCB9KVxuICAgICAgOiBudWxsLFxuICAgICFyZWFkeSAmJiAhaXNFcnJvclxuICAgICAgPyBoKExvYWRpbmdTdGF0ZSwgbnVsbClcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiBpc0Vycm9yXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWFsZXJ0LWJhbm5lcicsIHJvbGU6ICdhbGVydCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbG9hZEZhaWxlZCcsIHsgbWVzc2FnZTogU3RyaW5nKChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcikgfSkpLFxuICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1naG9zdCcsIG9uQ2xpY2s6IHJlbG9hZCB9LCB0KCdyZXRyeScpKSlcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiAhaXNFcnJvciAmJiBpc0VtcHR5XG4gICAgICA/IGgoRW1wdHlTdGF0ZSwgeyBmaWx0ZXJlZDogbW9kZWxzLmxlbmd0aCA+IDAsIG9uUmVzZXQ6IHJlc2V0RmlsdGVycyB9KVxuICAgICAgOiBudWxsLFxuICAgIHJlYWR5ICYmICFpc0Vycm9yICYmICFpc0VtcHR5XG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNvbnRlbnQnLCAnZGF0YS1idXN5JzogYnVzeSA/ICd0cnVlJyA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIGgoU3VtbWFyeUNhcmRzLCB7XG4gICAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBwcmljZXMuY3VycmVuY3kgfHwgJ8KlJyxcbiAgICAgICAgICAgIHVucHJpY2VkQ2FsbHM6IGRhdGEudW5wcmljZWRDYWxscyB8fCAwLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGgoRGFpbHlDaGFydCwge1xuICAgICAgICAgICAgZGFpbHk6IGRhdGEuZGFpbHksXG4gICAgICAgICAgICBncmFuOiBlZmZHcmFuLFxuICAgICAgICAgICAgc3RlcERheXMsXG4gICAgICAgICAgICBncmFuTGFiZWwsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaChIZWF0bWFwQ2FyZCwgeyBkYXlzOiBkYXRhLmhlYXRtYXAgfHwgW10gfSksXG4gICAgICAgICAgaChNb2RlbFRhYmxlLCB7IHJvd3M6IGRhdGEuYnlNb2RlbCwgY3VycmVuY3k6IHByaWNlcy5jdXJyZW5jeSB8fCAnwqUnIH0pKVxuICAgICAgOiBudWxsKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDms6jlhozvvJpzZXR0aW5ncy5zZWN0aW9uIOmhtemdolxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gIHVzYWdlQ3R4ID0gY3R4XG4gIF91c2FnZVByaWNlc1Njb3BlID0gbnVsbCAvLyDmr4/mrKHmv4DmtLvph43nu5HvvIzpgb/lhY3lpI3nlKjlt7Lph4rmlL7nmoQgc2NvcGVcbiAgY3R4LmVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHlsZXMgIT09ICd1bmRlZmluZWQnICYmIHN0eWxlcyAmJiB0eXBlb2Ygc3R5bGVzLmluc2VydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5pbnNlcnQoQ1NTKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1Z2luJywgJ2RzaC1wbHVnaW4tdXNhZ2UnKVxuICAgICAgZWwudGV4dENvbnRlbnQgPSBDU1NcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICByZXR1cm4gKCkgPT4geyBlbC5yZW1vdmUoKSB9XG4gICAgfVxuICB9LCAndXNhZ2U6IHN0eWxlcycpXG4gIGN0eC5lZmZlY3QoKCkgPT4gY3R4LmxvY2FsZS5yZWdpc3RlcihOUywgeyB6aDogWkgsIGVuOiBFTiB9KSwgJ3VzYWdlOiBkaWN0aW9uYXJpZXMnKVxuICBjb25zdCB0MCA9IGN0eC5sb2NhbGUgPyBjdHgubG9jYWxlLmJpbmQoTlMpIDogZmFsbGJhY2tUXG4gIC8vIGNvcmRpcyBjdHggaXMgYSBzdHJpY3QgcHJveHk6IERJUkVDVCBwcm9wZXJ0eSBhY2Nlc3Mgb24gYW4gdW4taW5qZWN0ZWRcbiAgLy8gc2VydmljZSB0aHJvd3MgKFwiY2Fubm90IGdldCBwcm9wZXJ0eSBYIHdpdGhvdXQgaW5qZWN0XCIpLCBzbyBhIGJhcmVcbiAgLy8gYGN0eC5zbG90cyA/PyAuLi5gIHdvdWxkIHRocm93IGFuZCBza2lwIHRoZSBmYWxsYmFjay4gUHJvYmUgdmlhIHRoZSBzYWZlXG4gIC8vIGN0eC5nZXQoKSBmaXJzdDsgZmFsbCBiYWNrIHRvIHRoZSBpbmplY3RlZCBwcm9wZXJ0eSAoYXZhaWxhYmxlIG9uY2VcbiAgLy8gJ3Nsb3RzJyBpcyBkZWNsYXJlZCBpbiB0aGUgaW5qZWN0IGxpc3QgYmVsb3cpLlxuICBsZXQgc2xvdHMgPSBudWxsXG4gIHRyeSB7XG4gICAgc2xvdHMgPSB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJyA/IGN0eC5nZXQoJ3Nsb3RzJykgOiBudWxsXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzbG90cyA9IG51bGxcbiAgfVxuICBpZiAoIXNsb3RzIHx8IHR5cGVvZiBzbG90cy5pbmplY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGN0eC5zbG90cyAmJiB0eXBlb2YgY3R4LnNsb3RzLmluamVjdCA9PT0gJ2Z1bmN0aW9uJykgc2xvdHMgPSBjdHguc2xvdHNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzbG90cyA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKCFzbG90cyB8fCB0eXBlb2Ygc2xvdHMuaW5qZWN0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBzbG90cy5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUud2FybignW3VzYWdlXSBzZXR0aW5ncy5zZWN0aW9uIHNsb3QgdW5hdmFpbGFibGUnKVxuICAgIHJldHVyblxuICB9XG4gIHNsb3RzLmluamVjdCgnc2V0dGluZ3Muc2VjdGlvbicsICgpID0+IHNsb3RzLnJlZ2lzdGVyKFxuICAgIHsgbmFtZTogJ3NldHRpbmdzLnNlY3Rpb24nLCBpZDogJ3Rva2VuLXN0YXRzJywgb3JkZXI6IDIwLCBsYWJlbDogKCkgPT4gdDAoJ25hdicpLCBsb2NhbGU6IE5TIH0sXG4gICAgKHByb3BzKSA9PiBoKFN0YXRzRGFzaGJvYXJkLCBwcm9wcyksXG4gICkpXG59XG5cbnJldHVybiB7IGluamVjdDogWydsb2NhbGUnLCAnc2xvdHMnXSwgYXBwbHkgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
3209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9ydWFuYncvcHJvamVjdHMvZHNoLXBsdWdpbi11c2FnZS9zcmMvY2xpZW50L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRva2VuIOeUqOmHj+e7n+iuoSDigJQgc2V0dGluZ3Muc2VjdGlvbiBDbGllbnQgVUnvvIjnuq8gSlPvvIzliqjmgIHmj5Lku7bmspnnrrHvvIlcbi8vIOWPr+eUqOWFqOWxgO+8mlJlYWN0IC8gY3R4IC8gc3R5bGVzIC8gaG9zdCAvIGNvbnNvbGXvvJvmtY/op4jlmajlhajlsYAgRGF0ZSAvIEludGwg562J44CCXG4vLyBDU1Mg5bi46YeP5YaF6IGU6IeqIHN0eWxlcy5qc++8iOWKqOaAgeaPkuS7tuaymeeuseaXoCBpbXBvcnTvvIzmoLflvI/pmo/mnKzmlofku7bliqDovb3vvInjgIJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IENTUyA9IGBcbi8qID09PT09PT09PT09PSDluIPlsYAgPT09PT09PT09PT09ICovXG4udHNkLXNlY3Rpb24ge1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxNnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBhbmltYXRpb246IHRzZC1mYWRlLWluIDAuNHMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuQGtleWZyYW1lcyB0c2QtZmFkZS1pbiB7XG4gIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxuICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogbm9uZTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0gSGVhZGVyID09PT09PT09PT09PSAqL1xuLnRzZC1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZ2FwOiAxMnB4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XG4udHNkLXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDI0cHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1zdWJ0aXRsZSB7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWljb24tYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMjhweDtcbiAgaGVpZ2h0OiAyOHB4O1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQ6IGluaGVyaXQ7XG59XG4udHNkLWljb24tYnRuOmhvdmVyIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbn1cbi50c2QtaWNvbi1idG46ZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIG9wYWNpdHk6IDAuNjtcbn1cbi50c2QtaWNvbi1idG46ZGlzYWJsZWQ6aG92ZXIge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuLnRzZC1zcGlubmluZyBzdmcge1xuICBhbmltYXRpb246IHRzZC1zcGluIDAuOXMgbGluZWFyIGluZmluaXRlO1xufVxuQGtleWZyYW1lcyB0c2Qtc3BpbiB7XG4gIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0g562b6YCJ5qCPID09PT09PT09PT09PSAqL1xuLnRzZC1maWx0ZXJiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuLnRzZC1zZWctd3JhcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLXNlZyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KSAxMiUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2Qtc2VnLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDI4cHg7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2Qtc2VnLWJ0bjpob3ZlciB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7XG59XG4udHNkLXNlZy1hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctYmFzZSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2Qtc2VnLWN1c3RvbSB7XG4gIG1heC13aWR0aDogMjIwcHg7XG59XG4udHNkLXNlZy1jdXN0b20gLnRzZC1zZWctbGFiZWwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2Qtc2VnLWN1c3RvbS50c2Qtc2VnLWFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5LWludmVydGVkLCAjZmZmKTtcbn1cbi50c2Qtc2VnLWN1c3RvbS50c2Qtc2VnLWFjdGl2ZTpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1idXR0b24tcHJpbWFyeS1ob3Zlcik7XG59XG5cbi8qID09PT09PT09PT09PSDpgJrnlKjmjInpkq4gPT09PT09PT09PT09ICovXG4udHNkLWJ0biB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogMCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLWJ0bjpkaXNhYmxlZCB7IG9wYWNpdHk6IDAuNTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgfVxuLnRzZC1idG4tcHJpbWFyeSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1idXR0b24tcHJpbWFyeS1maWxsKTtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5LWludmVydGVkLCAjZmZmKTtcbn1cbi50c2QtYnRuLXByaW1hcnk6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktaG92ZXIpOyB9XG4udHNkLWJ0bi1naG9zdCB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4udHNkLWJ0bi1naG9zdDpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cblxuLyogPT09PT09PT09PT09IOa1ruWxgiBQb3BvdmVyID09PT09PT09PT09PSAqL1xuLnRzZC1wb3BvdmVyLWFuY2hvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLXBvcG92ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogY2FsYygxMDAlICsgNnB4KTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogNDA7XG4gIHBhZGRpbmc6IDEycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctb3ZlcmxheSk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYzKTtcbn1cbi50c2QtbW9kZWwtcG9wb3ZlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiAzMjBweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMjRweCk7XG59XG4vKiDmta7lsYLpq5jluqbnlLEgdXNlRml4ZWRQYW5lbCDnmoQgbWF4SGVpZ2h0IOWGs+Wumu+8muWPquacieWIl+ihqOWPr+S8uOe8qe+8jOWFtuS9memDqOWIhuS4jeWOi+e8qSAqL1xuLnRzZC1tb2RlbC1wb3BvdmVyID4gLnRzZC1wb3BvdmVyLXRvb2xzLFxuLnRzZC1tb2RlbC1wb3BvdmVyID4gLnRzZC1zZWFyY2gsXG4udHNkLW1vZGVsLXBvcG92ZXIgPiAudHNkLXBvcG92ZXItbm90ZSxcbi50c2QtbW9kZWwtcG9wb3ZlciA+IC50c2QtcG9wb3Zlci1lbXB0eSB7IGZsZXg6IG5vbmU7IH1cbi50c2QtcmFuZ2UtcG9wb3ZlciB7XG4gIHdpZHRoOiAzMDBweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMjRweCk7XG59XG4udHNkLXBvcG92ZXItdGl0bGUge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIG1hcmdpbjogMCAwIDEwcHg7XG59XG4udHNkLXBvcG92ZXItdG9vbHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi1ib3R0b206IDhweDtcbn1cbi50c2QtbGluay1idG4ge1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSk7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4udHNkLWxpbmstYnRuOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC1wb3BvdmVyLWFjdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICBnYXA6IDhweDtcbiAgbWFyZ2luLXRvcDogMTJweDtcbn1cbi50c2QtcG9wb3Zlci1ub3RlIHtcbiAgbWFyZ2luOiA4cHggMCAwO1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuLnRzZC1wb3BvdmVyLWVtcHR5IHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxMHB4IDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLyogPT09PT09PT09PT09IOaooeWei+S4i+aLieaQnOe0oiA9PT09PT09PT09PT0gKi9cbi50c2Qtc2VsZWN0LWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgbWluLXdpZHRoOiAxMjBweDtcbiAgbWF4LXdpZHRoOiAyNjBweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBwYWRkaW5nOiAwIDEwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLXNlbGVjdC1idG46aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDMpOyB9XG4udHNkLXNlbGVjdC1oYXMgeyBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSkgNDUlLCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKSk7IH1cbi50c2Qtc2VsZWN0LWxhYmVsIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1pbi13aWR0aDogMDtcbn1cbi50c2QtY2hldnJvbiB7XG4gIGZsZXg6IG5vbmU7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY2hldnJvbi1vcGVuIHsgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxuLnRzZC1zZWFyY2gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1ib3R0b206IDhweDtcbn1cbi50c2Qtc2VhcmNoLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDhweDtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLnRzZC1zZWFyY2ggaW5wdXQge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiAwIDhweCAwIDI4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdXRsaW5lOiBub25lO1xufVxuLnRzZC1zZWFyY2ggaW5wdXQ6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSkgMTglLCB0cmFuc3BhcmVudCk7XG59XG4udHNkLW1vZGVsLWxpc3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4OiAxIDEgYXV0bztcbiAgbWluLWhlaWdodDogMDtcbiAgZ2FwOiAycHg7XG4gIG1heC1oZWlnaHQ6IDI0MHB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItYmctbDIpO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWItaG92ZXI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItaG92ZXItbDIpO1xufVxuLnRzZC1tb2RlbC1pdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIHBhZGRpbmc6IDVweCA2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIG1pbi13aWR0aDogMDtcbn1cbi50c2QtbW9kZWwtaXRlbTpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtbW9kZWwtaXRlbSBpbnB1dCB7IG1hcmdpbjogMDsgYWNjZW50LWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7IH1cbi50c2QtbW9kZWwtbmFtZSB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1kcy1mb250LWZhbWlseS1jb2RlKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWluLXdpZHRoOiAwO1xufVxuXG4vKiA9PT09PT09PT09PT0g5biB56eN5YiH5o2i77yI5Y+C6ICD5oiQ5pys5Y2h5pWw5YC86KGM5YaF77yJID09PT09PT09PT09PSAqL1xuLyog5pWw5YC86KGM5pyA5YmN5Y+q5pS+5LiA5Liq44CM56ym5Y+3ICsg5bCP566t5aS044CN55qE5Zu+5qCH5byP6Kem5Y+R5Zmo77ya56ym5Y+35pys6Lqr5bCx5piv6K+75pWw55qE5LiA6YOo5YiG77yMXG4gICDlsLrlr7gv5a2X6YeNL+Wfuue6v+e7p+aJv+aVsOWAvOihjO+8jOivu+i1t+adpeWDj+aVsOWtl+WJjee8gOiAjOS4jeaYr+S4gOS4quaOp+S7tuOAglxuICAg56ym5Y+35Y+q5Zyo6L+Z6YeM55S75LiA5qyh77yMZm9ybWF0Q29zdCDkuI3lho3ph43lpI3luKbnrKblj7fjgIIgKi9cbi50c2QtY3VyLWFuY2hvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLWN1ci1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICBnYXA6IDNweDtcbiAgbWFyZ2luOiAwIDJweCAwIDA7XG4gIHBhZGRpbmc6IDAgMnB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBmb250OiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZTtcbn1cbi50c2QtY3VyLWJ0bjpob3Zlcixcbi50c2QtY3VyLWJ0bi1vcGVuIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbn1cbi50c2QtY3VyLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbn1cbi50c2QtY3VyLWNoZXZyb24ge1xuICBmbGV4OiBub25lO1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlO1xufVxuLnRzZC1jdXItYnRuLW9wZW4gLnRzZC1jdXItY2hldnJvbiB7IHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbi50c2QtY3VyLXBvcG92ZXIge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogMTgwcHg7XG4gIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDI0cHgpO1xuICBwYWRkaW5nOiA2cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xuICAvKiDmta7lsYLmjILlnKggLnRzZC1jYXJkLXZhbHVlIOmHjO+8jOmCo+i+ueS4uuS6huaVsOWAvOihjOWGmeS6hiBub3dyYXDvvJtcbiAgICAg5rWu5bGC6YeM55qE6I+c5Y2V6aG55LiO6K+05piO5b+F6aG75oGi5aSN5o2i6KGM77yM5ZCm5YiZ6ZW/5paH5qGI5Lya5qiq552A5rqi5Ye65rWu5bGC44CCICovXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG4udHNkLWN1ci1vcHRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbiAgcGFkZGluZzogN3B4IDlweDtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50c2QtY3VyLW9wdGlvbjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtY3VyLW9wdGlvbjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbn1cbi50c2QtY3VyLXN5bWJvbCB7XG4gIGZsZXg6IG5vbmU7XG4gIHdpZHRoOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG59XG4udHNkLWN1ci1uYW1lIHtcbiAgbWluLXdpZHRoOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBmb250LXNpemU6IDEycHg7XG59XG4udHNkLWN1ci1vcHRpb24tYWN0aXZlIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC1jdXItY2hlY2sge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbn1cblxuLyogPT09PT09PT09PT09IOaooeWei+WNoOavlO+8iEtQSSDljaHnrKwgNiDmoLzvvIkgPT09PT09PT09PT09ICovXG4vKiDkuLvkvZPmmK/ljaDmr5TmnaHvvIzkuIvmlrnmqKHlnovlkI3kuI7nmb7liIbmr5TljovmiJDohJrms6jvvIgxMXB4IHRlcnRpYXJ577yJ77yMXG4gICDkuI7lhbblroPljaHnmoTlpKfmlbDlrZflvaLmiJDlsYLnuqflt67vvIzkuI3miqIgS1BJIOeahOivu+aVsOS9jee9ruOAgiAqL1xuLnRzZC1jYXJkLXNoYXJlLWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDhweDtcbiAgbWluLXdpZHRoOiAwO1xuICAvKiDlr7npvZAgLnRzZC1jYXJkLXZhbHVlIOeahOS4iui+uei3ne+8jOWFreW8oOWNoeS/neaMgeWQjOS4gOWfuue6vyAqL1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG4udHNkLXNoYXJlLXRyYWNrIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpO1xufVxuLnRzZC1zaGFyZS1zZWcge1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1pbi13aWR0aDogMnB4O1xuICBvdXRsaW5lOiBub25lO1xuICBvcGFjaXR5OiAwLjk7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMgZWFzZTtcbn1cbi50c2Qtc2hhcmUtc2VnOmhvdmVyLFxuLnRzZC1zaGFyZS1zZWc6Zm9jdXMtdmlzaWJsZSxcbi50c2Qtc2hhcmUtc2VnW2RhdGEtYWN0aXZlPSd0cnVlJ10geyBvcGFjaXR5OiAxOyB9XG4udHNkLXNoYXJlLWNhcHRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIGdhcDogNnB4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cbi50c2Qtc2hhcmUtY2FwLW5hbWUge1xuICBtaW4td2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1zaGFyZS1jYXAtcGN0IHtcbiAgZmxleDogbm9uZTtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbi50c2Qtc2hhcmUtZW1wdHkge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuXG4vKiA9PT09PT09PT09PT0g6Ieq5a6a5LmJ5pel5pyf5rWu5bGCID09PT09PT09PT09PSAqL1xuLnRzZC1yYW5nZS1maWVsZHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG4udHNkLWZpZWxkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA0cHg7XG59XG4udHNkLWZpZWxkLWxhYmVsIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWZpZWxkIGlucHV0IHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCA4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdXRsaW5lOiBub25lO1xufVxuLnRzZC1maWVsZCBpbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KSAxOCUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2QtZmllbGQtZXJyb3Ige1xuICBtYXJnaW46IDZweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KTtcbn1cbi50c2QtZmllbGQtaGludCB7XG4gIG1hcmdpbjogNnB4IDAgMDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLyogPT09PT09PT09PT09IOaxh+aAu+aMh+agh+WNoSA9PT09PT09PT09PT0gKi9cbi50c2QtY2FyZHMge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE1MHB4LCAxZnIpKTtcbiAgZ2FwOiAxMHB4O1xufVxuLnRzZC1jYXJkIHtcbiAgbWluLXdpZHRoOiAwO1xuICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMyk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2QtY2FyZC1oZWFkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG59XG4udHNkLWNhcmQtaWNvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1jYXJkLWxhYmVsIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1jYXJkLXZhbHVlIHtcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtY2FyZC1zdWIge1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG4udHNkLWNhcmQtbm90ZSB7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLXdhcm4tcHJpbWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDljaHniYflpLTpg6jvvIjlm77ooaggLyDooajmoLzlhbHnlKjvvIkgPT09PT09PT09PT09ICovXG4udHNkLWNhcmQtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBnYXA6IDhweDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cbi50c2QtY2FyZC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1jYXJkLXRhZyB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4vKiA9PT09PT09PT09PT0g5q+P5pel55So6YeP5p+x54q25Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1jaGFydC1jYXJkIHsgcGFkZGluZzogMTRweCAxNnB4IDEwcHg7IH1cbi50c2QtbGVnZW5kIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLWxlZ2VuZC1pdGVtIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbn1cbi50c2QtbGVnZW5kLWRvdCxcbi50c2QtdG9vbHRpcC1kb3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgZmxleDogbm9uZTtcbn1cbi50c2QtbGVnZW5kLWluIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApOyB9XG4udHNkLWxlZ2VuZC1vdXQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGVnZW5kLXRvdGFsIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7IH1cblxuLnRzZC1jaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIGdhcDogMnB4O1xuICBoZWlnaHQ6IDI0MHB4O1xuICBwYWRkaW5nOiAwIDRweDtcbn1cbi50c2QtY2hhcnQtY29sIHtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY2hhcnQtY29sOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuLnRzZC1jaGFydDpob3ZlciAudHNkLWNoYXJ0LWNvbCB7IG9wYWNpdHk6IDAuNDsgfVxuLnRzZC1jaGFydDpob3ZlciAudHNkLWNoYXJ0LWNvbDpob3Zlcixcbi50c2QtY2hhcnQ6Zm9jdXMtd2l0aGluIC50c2QtY2hhcnQtY29sOmZvY3VzIHsgb3BhY2l0eTogMTsgfVxuXG4udHNkLWNoYXJ0LXBsb3Qge1xuICBmbGV4OiAxO1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwxKSAxcHgsIHRyYW5zcGFyZW50IDFweCk7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAyNSU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG4udHNkLWNoYXJ0LXN0YWNrIHtcbiAgd2lkdGg6IDYyJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxuLnRzZC1jaGFydC1zZWcge1xuICB3aWR0aDogMTAwJTtcbn1cbi50c2Qtc2VnLWluIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApO1xufVxuLnRzZC1zZWctb3V0IHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDtcbn1cbi50c2QtY2hhcnQtbGFiZWwge1xuICBoZWlnaHQ6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICBtYXJnaW4tdG9wOiA2cHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLWNoYXJ0LWxhYmVsLWhpZGRlbiB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuXG4vKiB0b29sdGlwICovXG4udHNkLXRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTBweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB6LWluZGV4OiA2O1xuICBtaW4td2lkdGg6IDE1NnB4O1xuICBwYWRkaW5nOiA4cHggMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1vdmVybGF5KTtcbiAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHN3LXNoYWRvdy1sdjMpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtdG9vbHRpcC1kYXRlIHtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXRvb2x0aXAtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIG1hcmdpbjogMnB4IDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuLnRzZC10b29sdGlwLXZhbCB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXRvb2x0aXAtdG90YWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi10b3A6IDZweDtcbiAgcGFkZGluZy10b3A6IDZweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG5cbi8qID09PT09PT09PT09PSDmjInmqKHlnovmmI7nu4booaggPT09PT09PT09PT09ICovXG4udHNkLXRhYmxlLWNhcmQgeyBwYWRkaW5nOiAwOyB9XG4udHNkLXRhYmxlLWNhcmQgLnRzZC1jYXJkLWhlYWRlciB7IHBhZGRpbmc6IDE0cHggMTZweCAwOyB9XG4udHNkLXRhYmxlLXdyYXAge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItYmctbDIpO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWItaG92ZXI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItaG92ZXItbDIpO1xufVxuLnRzZC10YWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4udHNkLXRoIHtcbiAgcGFkZGluZzogMTBweCAxMnB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC10aC1udW0geyB0ZXh0LWFsaWduOiByaWdodDsgfVxuLnRzZC1zb3J0LWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLXNvcnQtYnRuOmhvdmVyIHsgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTsgfVxuLnRzZC1zb3J0LWFjdGl2ZSB7IGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7IH1cbi50c2Qtc29ydC1hcnJvdyB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG4udHNkLXRyOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC10ZCB7XG4gIHBhZGRpbmc6IDlweCAxMnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtdGQtbW9kZWwgeyBtYXgtd2lkdGg6IDI0MHB4OyB9XG4udHNkLW1vZGVsLW1vbm8ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWF4LXdpZHRoOiAyMjBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1kcy1mb250LWZhbWlseS1jb2RlKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1udW0ge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbi50c2QtdG90YWwge1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC11bnByaWNlZCB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG4udHNkLXRkLXJhdGlvIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50c2QtcmF0aW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgZ2FwOiA4cHg7XG59XG4udHNkLXJhdGlvLWJhciB7XG4gIHdpZHRoOiA2MHB4O1xuICBoZWlnaHQ6IDZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLXJhdGlvLWZpbGwge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCksIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCkgNTUlLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTMwMCkpKTtcbn1cbi50c2QtcmF0aW8tcGN0IHtcbiAgbWluLXdpZHRoOiA0MnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG5cbi8qID09PT09PT09PT09PSDkuInmgIHvvJrnqbogLyDplJnor68gLyDliqDovb0gPT09PT09PT09PT09ICovXG4udHNkLWVtcHR5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIHBhZGRpbmc6IDQwcHggMTZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnRzZC1lbXB0eS1pY29uIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbn1cbi50c2QtZW1wdHktdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtZW1wdHktZGVzYyB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWVtcHR5LWJsb2NrIHtcbiAgcGFkZGluZzogMjRweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuXG4udHNkLWVycm9yIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxMnB4O1xuICBwYWRkaW5nOiAyMHB4IDE2cHg7XG4gIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KSA0MCUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1zZWNvbmRhcnkpIDMwJSwgdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpKTtcbn1cbi50c2QtZXJyb3ItaWNvbiB7XG4gIGZsZXg6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSk7XG59XG4udHNkLWVycm9yLXRleHQge1xuICBmbGV4OiAxO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLWVycm9yLXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLWVycm9yLWRldGFpbCB7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udHNkLWFsZXJ0LWJhbm5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgcGFkZGluZzogMTBweCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpIDQwJSwgdHJhbnNwYXJlbnQpO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXNlY29uZGFyeSkgMzAlLCB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMykpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG5cbi50c2QtbG9hZGluZyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbn1cbi50c2QtY2FyZC1za2VsZXRvbiB7IG1pbi1oZWlnaHQ6IDg0cHg7IH1cbi50c2Qtc2tlbGV0b24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctc2tlbGV0b24pO1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGFuaW1hdGlvbjogdHNkLXB1bHNlIDEuNnMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuLnRzZC1za2VsZXRvbi1yb3cge1xuICBoZWlnaHQ6IDE0cHg7XG4gIG1hcmdpbjogMTJweCAwO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctc2tlbGV0b24pO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGFuaW1hdGlvbjogdHNkLXB1bHNlIDEuNnMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuQGtleWZyYW1lcyB0c2QtcHVsc2Uge1xuICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgNTAlIHsgb3BhY2l0eTogMC40NTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0g5Yi35paw5pe255qE5YaF5a655oCBID09PT09PT09PT09PSAqL1xuLnRzZC1jb250ZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxNnB4O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24pIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY29udGVudFtkYXRhLWJ1c3k9dHJ1ZV0geyBvcGFjaXR5OiAwLjU1OyB9XG5cbi8qID09PT09PT09PT09PSDml6Dpmpznoo0gPT09PT09PT09PT09ICovXG4udHNkLXZpc3VhbGx5LWhpZGRlbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgYm9yZGVyOiAwO1xufVxuLnRzZC1pY29uIHtcbiAgZmxleDogbm9uZTtcbn1cbi50c2Qtc2VnLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1zZWxlY3QtYnRuOmZvY3VzLXZpc2libGUsXG4udHNkLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1pY29uLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1saW5rLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1zb3J0LWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cbi8qID09PT09PT09PT09PSDnspLluqbliIfmjaIgPT09PT09PT09PT09ICovXG4udHNkLWNhcmQtYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbn1cbi50c2QtZ3JhbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogMnB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbn1cbi50c2QtZ3Jhbi1idG4ge1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBsaW5lLWhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBwYWRkaW5nOiAycHggOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLWdyYW4tYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0zKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHN3LXNoYWRvdy1sdjEpO1xufVxuLnRzZC1ncmFuLWJ0bjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi8qID09PT09PT09PT09PSDmipjnur/lm74gPT09PT09PT09PT09ICovXG4udHNkLWxpbmVjaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogNnB4IDEwcHggOHB4O1xufVxuLnRzZC1saW5lY2hhcnQgc3ZnIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtZ3JpZCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWF4aXMge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBzdHJva2Utd2lkdGg6IDE7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaW4ge1xuICBzdHJva2U6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTtcbiAgc3Ryb2tlLXdpZHRoOiAyO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLW91dCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBzdHJva2Utd2lkdGg6IDI7XG4gIGZpbGw6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdG90YWwge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogNCAzO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWRvdCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKTtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgc3Ryb2tlLXdpZHRoOiAxO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWhvdmVyIHtcbiAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWN1cnNvciB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMyk7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtaW4geyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC1vdXQgeyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC10b3RhbCB7IGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdGV4dCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cbi8qID09PT09PT09PT09PSDlubTluqbng63lipvlm74gPT09PT09PT09PT09ICovXG4udHNkLWhlYXRtYXAge1xuICBwYWRkaW5nOiA2cHggMTRweCAxNHB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxuLnRzZC1oZWF0bWFwLWlubmVyIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBtaW4td2lkdGg6IG1pbi1jb250ZW50O1xufVxuLnRzZC1oZWF0bWFwLW1vbnRocyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi1sZWZ0OiAyNnB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50c2QtaGVhdG1hcC1tb250aCB7XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xufVxuLnRzZC1oZWF0bWFwLWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1kYXlzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG4gIHdpZHRoOiAyMnB4O1xuICBmbGV4OiBub25lO1xufVxuLnRzZC1oZWF0bWFwLWRheSB7XG4gIGhlaWdodDogMTBweDtcbiAgZm9udC1zaXplOiA5cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1ncmlkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY29sIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY2VsbCB7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpLCBib3gtc2hhZG93IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuLnRzZC1oZWF0bWFwLWNlbGw6aG92ZXIge1xuICBvdXRsaW5lOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYyKTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xufVxuLnRzZC1oZWF0bWFwLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNHB4O1xuICBtYXJnaW46IDhweCAxNHB4IDA7XG4gIHBhZGRpbmctdG9wOiA4cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLyogPT09PT09PT09PT09IOi+k+WFpeWMuuaIkOacrCBwaWxs77yIY29tcG9zZXIgZG9ja++8iT09PT09PT09PT09PSAqL1xuLnRzZC1kb2NrIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNHB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIHBhZGRpbmc6IDAgOHB4O1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgYm9yZGVyOiAwLjVweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwxKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbi50c2QtZG9jay1sYWJlbCB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuLnRzZC1kb2NrLXZhbHVlIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbmBcblxuLy8gMC4yKyBob3N0IHRyYW5zcG9ydDogUE9TVCAvYXBpLzxjaGFubmVsPi88ZW5kcG9pbnQ+LCBhcmdzIGFzIHRoZSBKU09OIGJvZHksXG4vLyBhbnN3ZXJpbmcgeyBvaywgdmFsdWUgfSB8IHsgb2ssIGVycm9yIH0gKHNlZSBzcmMvaG9zdC9ycGMuanMpLiBUaGUgcm91dGUgaXNcbi8vIG1vdW50ZWQgb24gQ29ubmVjdGlvbidzIHNoYXJlZCBBUEkgY2hhbm5lbCwgc28gaXQgbmV2ZXIgbmVlZHMgdGhlIHBsdWdpbidzXG4vLyBmaWJlciB0byBvd24gYHdlYlNlcnZlcmAuXG5mdW5jdGlvbiBjYWxsRmV0Y2goY2hhbm5lbCwgZW5kcG9pbnQsIGFyZ3MpIHtcbiAgY29uc3QgcGF0aCA9ICcvYXBpLycgKyBTdHJpbmcoY2hhbm5lbCkucmVwbGFjZSgvXlxcLysvLCAnJykgKyAnLycgKyBlbmRwb2ludFxuICByZXR1cm4gZmV0Y2gocGF0aCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGFyZ3MgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmdzKSxcbiAgfSkudGhlbigocmVzKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJydcbiAgICAvLyBSb3V0ZSBtaXNzaW5nIG9uIHRoaXMgaG9zdDogNDA0LzQwNSBmcm9tIHRoZSBzaGFyZWQgZGlzcGF0Y2hlciwgb3IgdGhlXG4gICAgLy8gU1BBIEhUTUwgd2hlbiBubyB0cmFuc3BvcnQgcm91dGUgbWF0Y2hlZCB0aGUgcGF0aCBhdCBhbGwuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCB8fCByZXMuc3RhdHVzID09PSA0MDUgfHwgdHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPT09IC0xKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigndXNhZ2UgRmV0Y2ggcm91dGUgdW5hdmFpbGFibGUgKEhUVFAgJyArIHJlcy5zdGF0dXMgKyAnKScpXG4gICAgICBlcnJvci5jb2RlID0gJ3VzYWdlLXJvdXRlLW1pc3NpbmcnXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKChib2R5KSA9PiB7XG4gICAgICBpZiAoYm9keSAmJiBib2R5Lm9rKSByZXR1cm4gYm9keS52YWx1ZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKChib2R5ICYmIGJvZHkuZXJyb3IgJiYgYm9keS5lcnJvci5tZXNzYWdlKSB8fCAoJ1JQQyAnICsgZW5kcG9pbnQgKyAnIGZhaWxlZCcpKVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIFJQQyBicmlkZ2U6IGR5bmFtaWMtcGx1Z2luIHJ1bnMgcHJvdmlkZSBhIGBob3N0YCBnbG9iYWw7IHN0YXRpYyAoYnVuZGxlKVxuLy8gaW5zdGFsbHMgcHJvdmlkZSBjdHguZ2V0KCdjb25uZWN0aW9uJykuIEtlZXAgb25lIFVJIHNvdXJjZSBmb3IgYm90aC5cbmZ1bmN0aW9uIGhvc3RDYWxsKG1ldGhvZCwgYXJncykge1xuICAvLyBQMC0zOiBwcmVmZXIgdGhlIG9mZmljaWFsIGByZW1vdGVgIHNlcnZpY2Ugd2hlbiBpdCBleHBvc2VzIHRoZSB1c2FnZSBBUEk7XG4gIC8vIG90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIGhvc3QvY29ubmVjdGlvbiBmYWxsYmFja3MgdW5jaGFuZ2VkLlxuICBjb25zdCByZW1vdGVTY29wZSA9ICh0eXBlb2YgY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBjdHggJiYgdHlwZW9mIGN0eC5nZXQgPT09ICdmdW5jdGlvbicpXG4gICAgPyBjdHhcbiAgICA6ICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicgPyBfdXNhZ2VDdHggOiBudWxsKVxuICBpZiAocmVtb3RlU2NvcGUgJiYgdHlwZW9mIHJlbW90ZVNjb3BlLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdGUgPSByZW1vdGVTY29wZS5nZXQoJ3JlbW90ZScpXG4gICAgICBpZiAocmVtb3RlICYmIHJlbW90ZS51c2FnZSkge1xuICAgICAgICBjb25zdCByTmFtZSA9IFN0cmluZyhtZXRob2QpXG4gICAgICAgIGNvbnN0IHJTbGFzaCA9IHJOYW1lLmluZGV4T2YoJy8nKVxuICAgICAgICBjb25zdCByRXAgPSByU2xhc2ggPT09IC0xID8gck5hbWUgOiByTmFtZS5zbGljZShyU2xhc2ggKyAxKVxuICAgICAgICBjb25zdCByQ2FtZWwgPSByRXAucmVwbGFjZSgvLShbYS16XSkvZywgKG0sIGMpID0+IGMudG9VcHBlckNhc2UoKSlcbiAgICAgICAgY29uc3QgZm4gPSAodHlwZW9mIHJlbW90ZS51c2FnZVtyQ2FtZWxdID09PSAnZnVuY3Rpb24nICYmIHJlbW90ZS51c2FnZVtyQ2FtZWxdKVxuICAgICAgICAgIHx8ICh0eXBlb2YgcmVtb3RlLnVzYWdlW3JFcF0gPT09ICdmdW5jdGlvbicgJiYgcmVtb3RlLnVzYWdlW3JFcF0pXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGZuKGFyZ3MpKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLm9rKSByZXR1cm4gcmVzLnZhbHVlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKHJlcyAmJiByZXMuZXJyb3IgJiYgcmVzLmVycm9yLm1lc3NhZ2UpIHx8ICgnUlBDICcgKyBtZXRob2QgKyAnIGZhaWxlZCcpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyByZW1vdGUgcHJvYmluZyBmYWlsZWQg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgZXhpc3RpbmcgZmFsbGJhY2tzXG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgaG9zdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaG9zdCAmJiB0eXBlb2YgaG9zdC5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShob3N0LmNhbGwobWV0aG9kLCBhcmdzKSlcbiAgfVxuICAvLyBTdGF0aWMgYnVuZGxlIGluc3RhbGxzIGhhdmUgbm8gY3R4L2hvc3QgZ2xvYmFsczogdGhlIGVudHJ5IGFwcGx5KCkgc3RvcmVzXG4gIC8vIHRoZSByZWFsIGNvbnRleHQgaW4gX3VzYWdlQ3R4IChkZWNsYXJlZCBieSB0aGUgYnVpbGQgd3JhcHBlcikuXG4gIGNvbnN0IHNjb3BlID0gKHR5cGVvZiBjdHggIT09ICd1bmRlZmluZWQnICYmIGN0eCAmJiB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IGN0eFxuICAgIDogKHR5cGVvZiBfdXNhZ2VDdHggIT09ICd1bmRlZmluZWQnID8gX3VzYWdlQ3R4IDogbnVsbClcbiAgaWYgKHNjb3BlID09PSBudWxsIHx8IHR5cGVvZiBzY29wZS5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdjb250ZXh0IHVuYXZhaWxhYmxlJykpXG4gIH1cbiAgY29uc3QgbmFtZSA9IFN0cmluZyhtZXRob2QpXG4gIGNvbnN0IHNsYXNoID0gbmFtZS5pbmRleE9mKCcvJylcbiAgY29uc3QgY2hhbm5lbCA9IHNsYXNoID09PSAtMSA/IG5hbWUgOiBuYW1lLnNsaWNlKDAsIHNsYXNoKVxuICBjb25zdCBlbmRwb2ludCA9IHNsYXNoID09PSAtMSA/IG5hbWUgOiBuYW1lLnNsaWNlKHNsYXNoICsgMSlcbiAgLy8gTGVnYWN5IHByZS0wLjIgdHJhbnNwb3J0OiBhIGAvdXNhZ2VgIHByZWZpeCBSUEMgY2hhbm5lbCBvd25lZCBieSB0aGUgaG9zdFxuICAvLyBwbHVnaW4gaXRzZWxmLlxuICBjb25zdCBjYWxsUnBjID0gKCkgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBzY29wZS5nZXQoJ2Nvbm5lY3Rpb24nKVxuICAgIGlmIChjb25uZWN0aW9uID09PSB1bmRlZmluZWQgfHwgY29ubmVjdGlvbi5ycGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignY29ubmVjdGlvbiBzZXJ2aWNlIHVuYXZhaWxhYmxlJykpXG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uLnJwYy5jYWxsKCcvJyArIGNoYW5uZWwucmVwbGFjZSgvXlxcLysvLCAnJyksIGVuZHBvaW50LCBhcmdzKS50aGVuKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzLm9rKSByZXR1cm4gcmVzLnZhbHVlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKHJlcyAmJiByZXMuZXJyb3IgJiYgcmVzLmVycm9yLm1lc3NhZ2UpIHx8ICgnUlBDICcgKyBtZXRob2QgKyAnIGZhaWxlZCcpKVxuICAgIH0pXG4gIH1cbiAgLy8gUHJlZmVyIHRoZSBzaGFyZWQtY2hhbm5lbCBGZXRjaCByb3V0ZTsgYW4gb2xkZXIgaG9zdCBhbnN3ZXJzIFwicm91dGVcbiAgLy8gbWlzc2luZ1wiIGFuZCB3ZSBmYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBjaGFubmVsIGl0IGRvZXMgaW1wbGVtZW50LlxuICBjb25zdCBmZXRjaFVzYWJsZSA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmICEodHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2ZpbGU6JylcbiAgaWYgKCFmZXRjaFVzYWJsZSkgcmV0dXJuIGNhbGxScGMoKVxuICByZXR1cm4gY2FsbEZldGNoKGNoYW5uZWwsIGVuZHBvaW50LCBhcmdzKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ3VzYWdlLXJvdXRlLW1pc3NpbmcnKSByZXR1cm4gY2FsbFJwYygpXG4gICAgdGhyb3cgZXJyb3JcbiAgfSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDorr7nva7ln5/lrprku7fvvJrlrpjmlrkgYGN0eC5jb25maWdGb3Jtcy5nZXQoJ3VzYWdlJylg77yIZHNoLWNsaWVudC11aS1zZXR0aW5nc++8ieS8mOWFiO+8jFxuICog5LiN5Y+v55So5pe25Zue6YCAIHVzYWdlL3ByaWNlcyBSUEPjgILnu5Hlrprlj6rlgZrkuIDmrKHvvIzor7vlhpnlhbHnlKjlkIzkuIAgZm9ybeOAglxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xubGV0IHVzYWdlQ3R4ID0gbnVsbFxubGV0IF91c2FnZVByaWNlc1Njb3BlID0gbnVsbFxuXG5mdW5jdGlvbiByZXNvbHZlVXNhZ2VDdHgoKSB7XG4gIGlmICh1c2FnZUN0eCAmJiB0eXBlb2YgdXNhZ2VDdHguZ2V0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdXNhZ2VDdHhcbiAgaWYgKHR5cGVvZiBfdXNhZ2VDdHggIT09ICd1bmRlZmluZWQnICYmIF91c2FnZUN0eCAmJiB0eXBlb2YgX3VzYWdlQ3R4LmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIF91c2FnZUN0eFxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBnZXRVc2FnZVByaWNlc1Njb3BlKCkge1xuICBpZiAoX3VzYWdlUHJpY2VzU2NvcGUpIHJldHVybiBfdXNhZ2VQcmljZXNTY29wZVxuICBjb25zdCBjID0gcmVzb2x2ZVVzYWdlQ3R4KClcbiAgaWYgKCFjIHx8IHR5cGVvZiBjLmdldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICAvLyAwLjIueDogdGhlIG9mZmljaWFsIGNvbmZpZy1mb3JtIHN1cmZhY2UgZm9yIHRoaXMgcGx1Z2luJ3MgZW50cnkgaWRcbiAgICAvLyAoYHVzYWdlYCwgdGhlIGJ1bmRsZSBwYXRjaCByb3cgaWQpLiBgc2V0dGluZ3NTY29wZWAgZnJvbSAwLjEueCBkb2VzIG5vdFxuICAgIC8vIGV4aXN0IGluIHRoZSBzaGlwcGVkIGNsaWVudCwgc28gcHJvYmluZyBpdCBvbmx5IGV2ZXIgcmV0dXJuZWQgbnVsbC5cbiAgICBjb25zdCBmb3JtcyA9IGMuZ2V0KCdjb25maWdGb3JtcycpXG4gICAgaWYgKCFmb3JtcyB8fCB0eXBlb2YgZm9ybXMuZ2V0ICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbFxuICAgIF91c2FnZVByaWNlc1Njb3BlID0gZm9ybXMuZ2V0KCd1c2FnZScpXG4gICAgcmV0dXJuIF91c2FnZVByaWNlc1Njb3BlXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbi8vIOS7t+agvOWGmeWFpeWPo++8mnNldHRpbmdzIHNjb3BlIOWPr+eUqOaXtuWGmSB1c2FnZS5wcmljZXMg5ZG95ZCN56m66Ze05a2X5q6177yMXG4vLyDlkKbliJnlm57pgIAgdXNhZ2UvcHJpY2VzIFJQQ++8iOW9k+WJjSBVSSDml6Dku7fmoLznvJbovpHlmajvvIzkv53nlZnmraTlhpnlhaUgc2VhbSDkvpvlkI7nu63kvb/nlKjvvInjgIJcbmZ1bmN0aW9uIHVzYWdlU2F2ZVByaWNlcyhuZXh0KSB7XG4gIGNvbnN0IGFyZ3MgPSB7fVxuICBpZiAobmV4dCAmJiB0eXBlb2YgbmV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAobmV4dC5wcmljZXMgIT09IHVuZGVmaW5lZCkgYXJncy5wcmljZXMgPSBuZXh0LnByaWNlc1xuICAgIGlmIChuZXh0LmN1cnJlbmN5ICE9PSB1bmRlZmluZWQpIGFyZ3MuY3VycmVuY3kgPSBuZXh0LmN1cnJlbmN5XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBzY29wZSA9IGdldFVzYWdlUHJpY2VzU2NvcGUoKVxuICAgIGlmIChzY29wZSAmJiB0eXBlb2Ygc2NvcGUuc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBqb2JzID0gW11cbiAgICAgIGlmIChhcmdzLnByaWNlcyAhPT0gdW5kZWZpbmVkKSBqb2JzLnB1c2goc2NvcGUuc2V0KCdwcmljZXMnLCBhcmdzLnByaWNlcykpXG4gICAgICBpZiAoYXJncy5jdXJyZW5jeSAhPT0gdW5kZWZpbmVkKSBqb2JzLnB1c2goc2NvcGUuc2V0KCdjdXJyZW5jeScsIGFyZ3MuY3VycmVuY3kpKVxuICAgICAgaWYgKGpvYnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoam9icykudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc25hcCA9IHR5cGVvZiBzY29wZS5nZXRTbmFwc2hvdCA9PT0gJ2Z1bmN0aW9uJyA/IHNjb3BlLmdldFNuYXBzaG90KCkgOiBudWxsXG4gICAgICAgICAgcmV0dXJuIHNuYXAgJiYgc25hcC52YWx1ZSA/IHNuYXAudmFsdWUgOiBudWxsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBSUEMgd3JpdGUgcGF0aFxuICB9XG4gIHJldHVybiBob3N0Q2FsbCgndXNhZ2UvcHJpY2VzJywgYXJncylcbn1cblxuO1xuY29uc3QgaCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnRcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDlm73pmYXljJbvvJp6aC9lbiDlrZflhbggKyBDb250ZXh077yIbG9jYWxlIOacjeWKoee7jyBzbG90IOazqOWGjOazqOWFpSB077yM5a2Q57uE5Lu257uPIENvbnRleHQg5Y+W55So77yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBOUyA9ICd1c2FnZSdcbmNvbnN0IFpIID0ge1xuICBuYXY6ICfnlKjph4/nu5/orqEnLFxuICBzdWJ0aXRsZTogJ+afpeeciyBBSSDmqKHlnovnmoTkvb/nlKjmg4XlhrXlkozmiJDmnKznu5/orqEnLFxuICByZWZyZXNoOiAn5Yi35pawJyxcbiAgY3VycmVuY3lIaW50OiAn5Y+C6ICD5oiQ5pys5biB56eN77yI5Zu65a6a5rGH546HIDEgVVNEID0gNyBDTlnvvIknLFxuICBjdXJyZW5jeUNOWTogJ+S6uuawkeW4gScsXG4gIGN1cnJlbmN5VVNEOiAn576O5YWDJyxcbiAgdG9kYXk6ICfku4rml6UnLFxuICBkb2NrSGludDogJ+S7iuaXpSB7Y29zdH0gwrcge2NhbGxzfSDmrKHosIPnlKggwrcge3Rva2Vuc30gVG9rZW4nLFxuICBkb2NrVW5wcmljZWQ6ICfmnKrlrprku7cnLFxuICBsYXN0N2Q6ICfov5E35aSpJyxcbiAgbGFzdDMwZDogJ+i/kTMw5aSpJyxcbiAgY3VzdG9tOiAn6Ieq5a6a5LmJJyxcbiAgYWxsOiAn5YWo6YOoJyxcbiAgYWxsTW9kZWxzOiAn5YWo6YOo5qih5Z6LJyxcbiAgc2VsZWN0ZWRNb2RlbHM6ICflt7LpgIkge2NvdW50fSDkuKrmqKHlnosnLFxuICBzZWxlY3RBbGw6ICflhajpgIknLFxuICBjbGVhcjogJ+a4heepuicsXG4gIHNlYXJjaE1vZGVsczogJ+aQnOe0ouaooeWeiycsXG4gIG5vTWF0Y2hNb2RlbHM6ICfml6DljLnphY3mqKHlnosnLFxuICBtb2RlbEZpbHRlckhpbnQ6ICfli77pgInljbPml7bnlJ/mlYjvvIzku4XliJflh7rlvZPliY3ojIPlm7TlhoXmnInmlbDmja7nmoTmqKHlnosnLFxuICBjdXN0b21SYW5nZVRpdGxlOiAn6Ieq5a6a5LmJ5pe26Ze06IyD5Zu0JyxcbiAgY3VzdG9tUmFuZ2VBcmlhOiAn6Ieq5a6a5LmJ5pel5pyf6IyD5Zu0JyxcbiAgc3RhcnRUaW1lOiAn5byA5aeL5pe26Ze0JyxcbiAgZW5kVGltZTogJ+e7k+adn+aXtumXtCcsXG4gIHJhbmdlSW52YWxpZDogJ+W8gOWni+aXtumXtOS4jeiDveaZmuS6jue7k+adn+aXtumXtCcsXG4gIHJhbmdlSGludDogJ+aUr+aMgemAieaLqeS7u+aEj+aXpeacn+iMg+WbtO+8jOS4jemZkOi3qOW6picsXG4gIGNhbmNlbDogJ+WPlua2iCcsXG4gIGNvbmZpcm06ICfnoa7lrponLFxuICBkYXRlUmFuZ2VHcm91cDogJ+aXpeacn+iMg+WbtCcsXG4gIG1vZGVsRmlsdGVyR3JvdXA6ICfmqKHlnovnrZvpgIknLFxuICBjaGFydFR5cGVHcm91cDogJ+WbvuihqOexu+WeiycsXG4gIHRvdGFsVG9rZW5zOiAn5oC7IFRva2VuJyxcbiAgaW5wdXRUb2tlbnM6ICfovpPlhaUgVG9rZW4nLFxuICBvdXRwdXRUb2tlbnM6ICfovpPlh7ogVG9rZW4nLFxuICBjYWxsczogJ+iwg+eUqOasoeaVsCcsXG4gIGNvc3Q6ICflj4LogIPmiJDmnKwnLFxuICBhcHByb3hJTzogJ+KJiCDovpPlhaUr6L6T5Ye6JyxcbiAgdW5wcmljZWROb3RlOiAne2NvdW50fSDmrKHosIPnlKjmnKrlrprku7cnLFxuICBkYWlseVRyZW5kOiAn5q+P5pel55So6YeP6LaL5Yq/JyxcbiAgYmFyVmlldzogJ+afseeKtuWbvicsXG4gIGxpbmVWaWV3OiAn5oqY57q/5Zu+JyxcbiAgYnlIb3VyOiAn5oyJ5bCP5pe2JyxcbiAgYnlEYXk6ICfmjInlpKknLFxuICBldmVyeU5EYXlzOiAn5q+PIHtufSDlpKknLFxuICBsZWdlbmRJbnB1dDogJ+i+k+WFpScsXG4gIGxlZ2VuZE91dHB1dDogJ+i+k+WHuicsXG4gIGxlZ2VuZFRvdGFsOiAn5oC7IFRva2VuJyxcbiAgdG9vbHRpcFRvdGFsOiAn5ZCI6K6hJyxcbiAgc3RhcnRORGF5czogJ+i1tyB7bn0g5aSpJyxcbiAgbGluZUNoYXJ0QXJpYTogJ1Rva2VuIOeUqOmHj+i2i+WKv+aKmOe6v+WbvicsXG4gIHllYXJseUhlYXRtYXA6ICflubTluqbnlKjph4/ng63lipvlm74nLFxuICB5ZWFyRGFpbHk6ICd7eWVhcn0g5bm05q+P5pelIFRva2VuIOeUqOmHjycsXG4gIG1vbnRoTGFiZWw6ICd7bn3mnIgnLFxuICB3ZWVrZGF5TW9uOiAn5LiAJyxcbiAgd2Vla2RheVdlZDogJ+S4iScsXG4gIHdlZWtkYXlGcmk6ICfkupQnLFxuICBsZXNzOiAn5bCRJyxcbiAgbW9yZTogJ+WkmicsXG4gIGJ5TW9kZWxUaXRsZTogJ+aMieaooeWei+aYjue7hicsXG4gIG1vZGVsQ291bnQ6ICflhbEge259IOS4quaooeWeiycsXG4gIG1vZGVsVGFibGVDYXB0aW9uOiAn5oyJ5qih5Z6L55So6YeP5piO57uGJyxcbiAgY29sTW9kZWw6ICfmqKHlnosnLFxuICBjb2xDYWxsczogJ+ivt+axguaVsCcsXG4gIGNvbElucHV0OiAn6L6T5YWlIFRva2VuJyxcbiAgY29sT3V0cHV0OiAn6L6T5Ye6IFRva2VuJyxcbiAgY29sVG90YWw6ICfmgLsgVG9rZW4nLFxuICBjb2xDb3N0OiAn5Y+C6ICD5oiQ5pysJyxcbiAgY29sU2hhcmU6ICfljaDmr5QnLFxuICBtb2RlbFNoYXJlOiAn5qih5Z6L5Y2g5q+UJyxcbiAgc2hhcmVPdGhlcjogJ+WFtuWugycsXG4gIHVucHJpY2VkOiAn5pyq5a6a5Lu3JyxcbiAgdW5wcmljZWRSb3dIaW50OiAn6K+l5qih5Z6L5pyq6YWN572u5a6a5Lu377yM5oyJIDAg6K6h5Lu3JyxcbiAgbm9EYXRhOiAn5pqC5peg5pWw5o2uJyxcbiAgZW1wdHlEZXNjOiAn6K+l5pe26Ze05q615YaF5rKh5pyJ6LCD55So6K6w5b2VJyxcbiAgZW1wdHlGaWx0ZXJlZDogJ+W9k+WJjeetm+mAieadoeS7tuS4i+ayoeacieaVsOaNru+8jOivleivleiwg+aVtOaXtumXtOiMg+WbtOaIluaooeWeiycsXG4gIHJlc2V0RmlsdGVyczogJ+mHjee9ruetm+mAiScsXG4gIGxvYWRGYWlsZWQ6ICfmlbDmja7liqDovb3lpLHotKXvvJp7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICfmlbDmja7liqDovb3lpLHotKUnLFxuICByZXRyeTogJ+mHjeivlScsXG4gIGJhckFyaWE6ICd7a2V5fe+8jOi+k+WFpSB7aW59IFRva2Vu77yM6L6T5Ye6IHtvdXR9IFRva2Vu77yM5ZCI6K6hIHt0b3R9IFRva2VuJyxcbiAgaG1UaXRsZTogJ3trZXl977yae3Rva2Vuc30gVG9rZW57Y2FsbHN9JyxcbiAgaG1DYWxsczogJ++8jHtjb3VudH0g5qyh6LCD55SoJyxcbiAgd2QwOiAn5ZGo5pelJyxcbiAgd2QxOiAn5ZGo5LiAJyxcbiAgd2QyOiAn5ZGo5LqMJyxcbiAgd2QzOiAn5ZGo5LiJJyxcbiAgd2Q0OiAn5ZGo5ZubJyxcbiAgd2Q1OiAn5ZGo5LqUJyxcbiAgd2Q2OiAn5ZGo5YWtJyxcbn1cbmNvbnN0IEVOID0ge1xuICBuYXY6ICdVc2FnZSBTdGF0cycsXG4gIHN1YnRpdGxlOiAnVmlldyBBSSBtb2RlbCB1c2FnZSBhbmQgY29zdCBzdGF0aXN0aWNzJyxcbiAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuICBjdXJyZW5jeUhpbnQ6ICdSZWZlcmVuY2UtY29zdCBjdXJyZW5jeSAoZml4ZWQgcmF0ZTogMSBVU0QgPSA3IENOWSknLFxuICBjdXJyZW5jeUNOWTogJ0NOWScsXG4gIGN1cnJlbmN5VVNEOiAnVVNEJyxcbiAgdG9kYXk6ICdUb2RheScsXG4gIGRvY2tIaW50OiAnVG9kYXkge2Nvc3R9IMK3IHtjYWxsc30gY2FsbHMgwrcge3Rva2Vuc30gdG9rZW5zJyxcbiAgZG9ja1VucHJpY2VkOiAndW5wcmljZWQnLFxuICBsYXN0N2Q6ICdMYXN0IDcgZGF5cycsXG4gIGxhc3QzMGQ6ICdMYXN0IDMwIGRheXMnLFxuICBjdXN0b206ICdDdXN0b20nLFxuICBhbGw6ICdBbGwnLFxuICBhbGxNb2RlbHM6ICdBbGwgbW9kZWxzJyxcbiAgc2VsZWN0ZWRNb2RlbHM6ICd7Y291bnR9IG1vZGVscyBzZWxlY3RlZCcsXG4gIHNlbGVjdEFsbDogJ1NlbGVjdCBhbGwnLFxuICBjbGVhcjogJ0NsZWFyJyxcbiAgc2VhcmNoTW9kZWxzOiAnU2VhcmNoIG1vZGVscycsXG4gIG5vTWF0Y2hNb2RlbHM6ICdObyBtYXRjaGluZyBtb2RlbHMnLFxuICBtb2RlbEZpbHRlckhpbnQ6ICdBcHBsaWVzIGluc3RhbnRseTsgbGlzdHMgb25seSBtb2RlbHMgd2l0aCBkYXRhIGluIHRoZSByYW5nZScsXG4gIGN1c3RvbVJhbmdlVGl0bGU6ICdDdXN0b20gdGltZSByYW5nZScsXG4gIGN1c3RvbVJhbmdlQXJpYTogJ0N1c3RvbSBkYXRlIHJhbmdlJyxcbiAgc3RhcnRUaW1lOiAnU3RhcnQnLFxuICBlbmRUaW1lOiAnRW5kJyxcbiAgcmFuZ2VJbnZhbGlkOiAnU3RhcnQgbXVzdCBub3QgYmUgbGF0ZXIgdGhhbiBlbmQnLFxuICByYW5nZUhpbnQ6ICdBbnkgZGF0ZSByYW5nZSDigJQgbm8gbGVuZ3RoIGxpbWl0JyxcbiAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgY29uZmlybTogJ09LJyxcbiAgZGF0ZVJhbmdlR3JvdXA6ICdEYXRlIHJhbmdlJyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ01vZGVsIGZpbHRlcicsXG4gIGNoYXJ0VHlwZUdyb3VwOiAnQ2hhcnQgdHlwZScsXG4gIHRvdGFsVG9rZW5zOiAnVG90YWwgVG9rZW5zJyxcbiAgaW5wdXRUb2tlbnM6ICdJbnB1dCBUb2tlbnMnLFxuICBvdXRwdXRUb2tlbnM6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY2FsbHM6ICdDYWxscycsXG4gIGNvc3Q6ICdFc3QuIGNvc3QnLFxuICBhcHByb3hJTzogJ+KJiCBpbnB1dCtvdXRwdXQnLFxuICB1bnByaWNlZE5vdGU6ICd7Y291bnR9IGNhbGxzIHVucHJpY2VkJyxcbiAgZGFpbHlUcmVuZDogJ0RhaWx5IHVzYWdlIHRyZW5kJyxcbiAgYmFyVmlldzogJ0JhcnMnLFxuICBsaW5lVmlldzogJ0xpbmUnLFxuICBieUhvdXI6ICdIb3VybHknLFxuICBieURheTogJ0RhaWx5JyxcbiAgZXZlcnlORGF5czogJ0V2ZXJ5IHtufSBkYXlzJyxcbiAgbGVnZW5kSW5wdXQ6ICdJbnB1dCcsXG4gIGxlZ2VuZE91dHB1dDogJ091dHB1dCcsXG4gIGxlZ2VuZFRvdGFsOiAnVG90YWwnLFxuICB0b29sdGlwVG90YWw6ICdUb3RhbCcsXG4gIHN0YXJ0TkRheXM6ICdmb3Ige259IGRheXMnLFxuICBsaW5lQ2hhcnRBcmlhOiAnVG9rZW4gdXNhZ2UgdHJlbmQgbGluZSBjaGFydCcsXG4gIHllYXJseUhlYXRtYXA6ICdZZWFybHkgaGVhdG1hcCcsXG4gIHllYXJEYWlseTogJ0RhaWx5IHRva2VucyBpbiB7eWVhcn0nLFxuICBtb250aExhYmVsOiAne259JyxcbiAgd2Vla2RheU1vbjogJ01vbicsXG4gIHdlZWtkYXlXZWQ6ICdXZWQnLFxuICB3ZWVrZGF5RnJpOiAnRnJpJyxcbiAgbGVzczogJ0xlc3MnLFxuICBtb3JlOiAnTW9yZScsXG4gIGJ5TW9kZWxUaXRsZTogJ0J5IG1vZGVsJyxcbiAgbW9kZWxDb3VudDogJ3tufSBtb2RlbHMnLFxuICBtb2RlbFRhYmxlQ2FwdGlvbjogJ1Rva2VuIHVzYWdlIGJ5IG1vZGVsJyxcbiAgY29sTW9kZWw6ICdNb2RlbCcsXG4gIGNvbENhbGxzOiAnQ2FsbHMnLFxuICBjb2xJbnB1dDogJ0lucHV0IFRva2VucycsXG4gIGNvbE91dHB1dDogJ091dHB1dCBUb2tlbnMnLFxuICBjb2xUb3RhbDogJ1RvdGFsIFRva2VucycsXG4gIGNvbENvc3Q6ICdFc3QuIGNvc3QnLFxuICBjb2xTaGFyZTogJ1NoYXJlJyxcbiAgbW9kZWxTaGFyZTogJ01vZGVsIHNoYXJlJyxcbiAgc2hhcmVPdGhlcjogJ090aGVycycsXG4gIHVucHJpY2VkOiAnVW5wcmljZWQnLFxuICB1bnByaWNlZFJvd0hpbnQ6ICdObyBwcmljaW5nIGNvbmZpZ3VyZWQ7IGNvdW50ZWQgYXMgMCcsXG4gIG5vRGF0YTogJ05vIGRhdGEnLFxuICBlbXB0eURlc2M6ICdObyBjYWxscyBpbiB0aGlzIHBlcmlvZCcsXG4gIGVtcHR5RmlsdGVyZWQ6ICdObyBkYXRhIGZvciB0aGUgY3VycmVudCBmaWx0ZXJzLCB0cnkgYWRqdXN0aW5nIHRoZSByYW5nZSBvciBtb2RlbHMnLFxuICByZXNldEZpbHRlcnM6ICdSZXNldCBmaWx0ZXJzJyxcbiAgbG9hZEZhaWxlZDogJ0ZhaWxlZCB0byBsb2FkIGRhdGE6IHttZXNzYWdlfScsXG4gIGxvYWRGYWlsZWRUaXRsZTogJ0ZhaWxlZCB0byBsb2FkIGRhdGEnLFxuICByZXRyeTogJ1JldHJ5JyxcbiAgYmFyQXJpYTogJ3trZXl9LCBpbnB1dCB7aW59IHRva2Vucywgb3V0cHV0IHtvdXR9IHRva2VucywgdG90YWwge3RvdH0gdG9rZW5zJyxcbiAgaG1UaXRsZTogJ3trZXl9OiB7dG9rZW5zfSB0b2tlbnN7Y2FsbHN9JyxcbiAgaG1DYWxsczogJywge2NvdW50fSBjYWxscycsXG4gIHdkMDogJ1N1bicsXG4gIHdkMTogJ01vbicsXG4gIHdkMjogJ1R1ZScsXG4gIHdkMzogJ1dlZCcsXG4gIHdkNDogJ1RodScsXG4gIHdkNTogJ0ZyaScsXG4gIHdkNjogJ1NhdCcsXG59XG5jb25zdCBUID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKVxuZnVuY3Rpb24gdXNlVCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoVClcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrVChrZXksIHBhcmFtcykge1xuICBsZXQgcyA9IFpIW2tleV1cbiAgaWYgKHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGtleVxuICBpZiAocGFyYW1zKSB7XG4gICAgcyA9IHMucmVwbGFjZSgvXFx7KFxcdyspXFx9L2csIChtLCBuKSA9PiAocGFyYW1zW25dICE9PSB1bmRlZmluZWQgPyBTdHJpbmcocGFyYW1zW25dKSA6IG0pKVxuICB9XG4gIHJldHVybiBzXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5pWw5a2X5qC85byP5YyW77yI6KeE5qC856ysIDUg6IqC77yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBmb3JtYXRUb2tlbnNTaG9ydChuKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSByZXR1cm4gJy0tJ1xuICBpZiAobiA+PSAxZTYpIHJldHVybiBNYXRoLnJvdW5kKG4gLyAxZTQpIC8gMTAwICsgJ00nIC8vIDEuMjNNXG4gIGlmIChuID49IDFlMykgcmV0dXJuIE1hdGgucm91bmQobiAvIDFlMikgLyAxMCArICdLJyAvLyAxMi4zS1xuICByZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobikpXG59XG5mdW5jdGlvbiBmb3JtYXRJbnQobikge1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5yb3VuZChuKS50b0xvY2FsZVN0cmluZygpIDogJy0tJ1xufVxuLyoqIOWPquimgeaVsOWtl+mDqOWIhu+8muaIkOacrOWNoeeahOespuWPt+eUseW4geenjeWIh+aNouWZqOiHquW3seeUu++8jOWGjeW4puS4gOasoeWwseaIkOS6huOAjMKlIMKlMTQuNzjjgI3jgIIgKi9cbmZ1bmN0aW9uIGNvc3REaWdpdHMobikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuICctLSdcbiAgLy8gQmVsb3cgaGFsZiBhIGNlbnQgdGhlcmUgaXMgbm90aGluZyB0byBzaG93IGF0IDIgZGVjaW1hbHM7IHNheSBzbyBpbnN0ZWFkIG9mXG4gIC8vIHByaW50aW5nIGEgbWlzbGVhZGluZyAwLjAwIChhICQwLjAzIENOWSBjb3N0IGJlY29tZXMgJDAuMDA0KS5cbiAgaWYgKG4gPiAwICYmIG4gPCAwLjAwNSkgcmV0dXJuICc8MC4wMSdcbiAgcmV0dXJuIG4udG9GaXhlZCgyKVxufVxuZnVuY3Rpb24gZm9ybWF0Q29zdChuLCBjdXIpIHtcbiAgcmV0dXJuIChjdXIgfHwgJ8KlJykgKyBjb3N0RGlnaXRzKG4pXG59XG5mdW5jdGlvbiBkYXlMYWJlbChrZXkpIHtcbiAgY29uc3QgWywgbSwgZF0gPSBTdHJpbmcoa2V5IHx8ICcnKS5zcGxpdCgnLScpXG4gIGlmIChtID09PSB1bmRlZmluZWQgfHwgZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gbSArICctJyArIGRcbn1cbmZ1bmN0aW9uIGZtdFBjdChyYXRpbykge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShyYXRpbykpIHJldHVybiAnMCUnXG4gIGNvbnN0IHAgPSByYXRpbyAqIDEwMFxuICBpZiAocCA+PSA5OS45NSkgcmV0dXJuICcxMDAlJ1xuICByZXR1cm4gcC50b0ZpeGVkKDEpICsgJyUnXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5pel5pyf5bel5YW3XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBzdGFydE9mRGF5KGQpIHtcbiAgY29uc3QgeCA9IG5ldyBEYXRlKGQpXG4gIHguc2V0SG91cnMoMCwgMCwgMCwgMClcbiAgcmV0dXJuIHhcbn1cbmZ1bmN0aW9uIGFkZERheXMoZCwgbikge1xuICBjb25zdCB4ID0gbmV3IERhdGUoZClcbiAgeC5zZXREYXRlKHguZ2V0RGF0ZSgpICsgbilcbiAgcmV0dXJuIHhcbn1cbmZ1bmN0aW9uIGZtdERhdGVJbnB1dChkKSB7XG4gIGNvbnN0IHkgPSBkLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbSA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKVxuICByZXR1cm4geSArICctJyArIG0gKyAnLScgKyBkYXlcbn1cbmZ1bmN0aW9uIGZtdERhdGVTbGFzaChzKSB7XG4gIGNvbnN0IG0gPSBTdHJpbmcocyB8fCAnJykubWF0Y2goL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvKVxuICBpZiAoIW0pIHJldHVybiAnLS0nXG4gIHJldHVybiBtWzFdICsgJy8nICsgbVsyXSArICcvJyArIG1bM11cbn1cbi8vIOmihOiuviAvIOiHquWumuS5iSDihpIgeyBmcm9tLCB0byB977yIVW5peCDmr6vnp5LvvIlcbi8vIOS7iuaXpSA9IOW9k+WkqSAwMDowMCDoh7Pku4rvvJvov5E3LzMw5aSpID0g5ZCr5LuK5aSp5b6A5YmNIE4g5Liq6Ieq54S25pelIDAwOjAwIOi1t++8m+WFqOmDqCA9IOS4jemZkOi1t+eCue+8m1xuLy8g6Ieq5a6a5LmJID0g6LW35pelIDAwOjAwIH4g5q2i5pelIDIzOjU5OjU5Ljk5OVxuZnVuY3Rpb24gcmFuZ2VGb3IocHJlc2V0LCBjdXN0b20pIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCB0b2RheSA9IHN0YXJ0T2ZEYXkobm93KVxuICBpZiAocHJlc2V0ID09PSAndG9kYXknKSByZXR1cm4geyBmcm9tOiB0b2RheS5nZXRUaW1lKCksIHRvOiBub3cuZ2V0VGltZSgpIH1cbiAgaWYgKHByZXNldCA9PT0gJzdkJykgcmV0dXJuIHsgZnJvbTogYWRkRGF5cyh0b2RheSwgLTYpLmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBpZiAocHJlc2V0ID09PSAnMzBkJykgcmV0dXJuIHsgZnJvbTogYWRkRGF5cyh0b2RheSwgLTI5KS5nZXRUaW1lKCksIHRvOiBub3cuZ2V0VGltZSgpIH1cbiAgLy8g5YWo6YeP77yaMCDmmK/mnInpmZDlgLzvvIzlrr/kuLvnmoQgZmlsbCDliKTlrprorqTlroPvvJvosIPnlKjmlrnlv4XpobvlkIzml7bkvKAgZmlsbDpmYWxzZe+8jFxuICAvLyDlkKbliJnkvJrljrvpm7bloavlhYUgMTk3MCDlubToh7Pku4rjgIHmkp7kuIogTUFYX0JVQ0tFVFMg6YCA5YyW5oiQ5Y+q55yL5pyJ5pWw5o2u55qE5qG244CCXG4gIGlmIChwcmVzZXQgPT09ICdhbGwnKSByZXR1cm4geyBmcm9tOiAwLCB0bzogbm93LmdldFRpbWUoKSB9XG4gIGNvbnN0IGZyb20gPSBuZXcgRGF0ZShjdXN0b20uZnJvbSArICdUMDA6MDA6MDAnKS5nZXRUaW1lKClcbiAgY29uc3QgdG8gPSBuZXcgRGF0ZShjdXN0b20udG8gKyAnVDIzOjU5OjU5Ljk5OScpLmdldFRpbWUoKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShmcm9tKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRvKSkge1xuICAgIHJldHVybiB7IGZyb206IHRvZGF5LmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICB9XG4gIHJldHVybiB7IGZyb20sIHRvIH1cbn1cbmZ1bmN0aW9uIHdlZWtkYXlPZihrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IERhdGUoa2V5ICsgJ1QwMDowMDowMCcpLnRvTG9jYWxlRGF0ZVN0cmluZygnemgtQ04nLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG4vKiogV2Vla2RheSBmb3IgYSBkYXkvaG91ci9taW51dGUgYnVja2V0IGtleSAoYFlZWVktTU0tRERgIG9yIGBZWVlZLU1NLUREIEhIOm1tYCkuICovXG5mdW5jdGlvbiB3ZWVrZGF5TmFtZShrZXksIHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoU3RyaW5nKGtleSkucmVwbGFjZSgnICcsICdUJykpXG4gICAgcmV0dXJuIHQoWyd3ZDAnLCAnd2QxJywgJ3dkMicsICd3ZDMnLCAnd2Q0JywgJ3dkNScsICd3ZDYnXVtkLmdldERheSgpXSB8fCAnd2QwJylcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG4vKiogWC1heGlzIGxhYmVsIGZvciBhIGJ1Y2tldCBrZXkgdW5kZXIgYSBncmFudWxhcml0eS4gKi9cbmZ1bmN0aW9uIHhMYWJlbChrZXksIGcpIHtcbiAgY29uc3QgcyA9IFN0cmluZyhrZXkpXG4gIGNvbnN0IHNwID0gcy5zcGxpdCgnICcpXG4gIGlmIChnID09PSAnbWludXRlJykgcmV0dXJuIHNwLmxlbmd0aCA+IDEgPyBzcFsxXS5zbGljZSgwLCA1KSA6IHMuc2xpY2UoNSlcbiAgaWYgKGcgPT09ICdob3VyJykgcmV0dXJuIHNwLmxlbmd0aCA+IDEgPyBzcFsxXS5zbGljZSgwLCAyKSArICc6MDAnIDogcy5zbGljZSg1KVxuICByZXR1cm4gZGF5TGFiZWwoa2V5KVxufVxuLyoqIEZpeGVkIGdyYW51bGFyaXR5IHBvbGljeTogdG9kYXkgaXMgaG91cmx5LCBldmVyeXRoaW5nIGVsc2UgaXMgZGFpbHkuICovXG5mdW5jdGlvbiBlZmZHcmFudWxhcml0eShyYW5nZSkge1xuICByZXR1cm4gcmFuZ2UgPT09ICd0b2RheScgPyAnaG91cicgOiAnZGF5Jztcbn1cbi8qKiBTdGFibGUgc3RlcCBzdHJhdGVneSBmb3IgY3VzdG9tIHJhbmdlczogdGFyZ2V0IH4xNS0yNSBidWNrZXRzLiAqL1xuZnVuY3Rpb24gcGlja1N0ZXBEYXlzKHNwYW5Ncykge1xuICBjb25zdCBkYXlzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCgoc3Bhbk1zIHx8IDApIC8gODY0MDAwMDApKVxuICBpZiAoZGF5cyA8PSAzMSkgcmV0dXJuIDFcbiAgaWYgKGRheXMgPD0gNjIpIHJldHVybiAzXG4gIGlmIChkYXlzIDw9IDE1MCkgcmV0dXJuIDVcbiAgcmV0dXJuIDdcbn1cbi8qKiBIdW1hbiBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgc3RlcCBwb2xpY3kuICovXG5mdW5jdGlvbiBzdGVwTGFiZWwodCwgcmFuZ2UsIHN0ZXBEYXlzKSB7XG4gIGlmIChyYW5nZSA9PT0gJ3RvZGF5JykgcmV0dXJuIHQoJ2J5SG91cicpXG4gIHJldHVybiBzdGVwRGF5cyA+IDEgPyB0KCdldmVyeU5EYXlzJywgeyBuOiBzdGVwRGF5cyB9KSA6IHQoJ2J5RGF5Jylcbn1cbi8qKiBIZWF0bWFwIGNlbGwgY29sb3IgYnkgcmVsYXRpdmUgdG9rZW4gdm9sdW1lLiAqL1xuZnVuY3Rpb24gaGVhdENvbG9yKHRvdGFsLCBtYXgpIHtcbiAgaWYgKCF0b3RhbCkgcmV0dXJuICd2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpJ1xuICBjb25zdCByID0gdG90YWwgLyBtYXhcbiAgY29uc3QgcGN0ID0gciA8IDAuMjUgPyAyMiA6IHIgPCAwLjUgPyA0NSA6IHIgPCAwLjc1ID8gNzAgOiAxMDBcbiAgcmV0dXJuICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApICcgKyBwY3QgKyAnJSwgdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTIpKSdcbn1cbmZ1bmN0aW9uIG5pY2VDZWlsKHYpIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikgfHwgdiA8PSAwKSByZXR1cm4gMVxuICBjb25zdCBtYWcgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZzEwKHYpKSlcbiAgY29uc3Qgbm9ybSA9IHYgLyBtYWdcbiAgY29uc3QgbmljZSA9IG5vcm0gPD0gMSA/IDEgOiBub3JtIDw9IDIgPyAyIDogbm9ybSA8PSA1ID8gNSA6IDEwXG4gIHJldHVybiBuaWNlICogbWFnXG59XG5mdW5jdGlvbiBkZWZhdWx0Q3VzdG9tKCkge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIHJldHVybiB7IGZyb206IGZtdERhdGVJbnB1dChhZGREYXlzKG5vdywgLTYpKSwgdG86IGZtdERhdGVJbnB1dChub3cpIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDlhoXogZQgU1ZHIOWbvuagh++8iOaXoOWbvuagh+W6k++8jOaJi+WGmSBmZWF0aGVyIOmjjuagvCBzdHJva2Ug5Zu+5qCH77yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBJQ09OX1BBVEhTID0ge1xuICBsYXllcnM6ICdNMTIgMmw4IDQuNS04IDQuNS04LTQuNUwxMiAyem0wIDhsOCA0LjUtOCA0LjUtOC00LjVMMTIgMTB6bTAgOGw4IDQuNS04IDQuNS04LTQuNUwxMiAxOHonLFxuICBkb3duOiAnTTEyIDN2MTJtMCAwbC00LjUtNC41TTEyIDE1bDQuNS00LjVNNCAyMWgxNicsXG4gIHVwOiAnTTEyIDIxVjltMCAwbC00LjUgNC41TTEyIDlsNC41IDQuNU00IDNoMTYnLFxuICBhY3Rpdml0eTogJ00yIDEyaDRsMi41LTggNSAxNiAyLjUtOGg2JyxcbiAgY29pbnM6ICdNMyA5YTIgMiAwIDAxMi0yaDE0YTIgMiAwIDAxMiAydjlhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0yVjl6bTAgNWgxOE04IDUuNVY0YTIgMiAwIDAxMi0yaDRhMiAyIDAgMDEyIDJ2MS41JyxcbiAgLy8g5Yi35paw5Zu+5qCH5Y+W6IeqIERTSCDljp/nlJ/lm77lvaLvvIgxNiDnvZHmoLzjgIFzdHJva2UgMS4177yJ77yM5LiO6K6+572u6aG15YW25a6D5Zu+5qCH5ZCM5LiA6KeC5oSf77ybXG4gIC8vIOWFtuS9meWbvuagh+S7jeaYryAyNCDnvZHmoLzvvIhzdHJva2UgMu+8ie+8jFN2Z0ljb24g5Lik56eN5a6a5LmJ6YO95ZCD44CCXG4gIHJlZnJlc2g6IHtcbiAgICB2aWV3Qm94OiAnMCAwIDE2IDE2JyxcbiAgICBzdHJva2VXaWR0aDogMS41LFxuICAgIHBhdGhzOiBbXG4gICAgICAnTTE0LjUwMDEgOEMxNC41IDkuMjg1NTIgMTQuMTE4OCAxMC41NDIyIDEzLjQwNDUgMTEuNjExQzEyLjY5MDMgMTIuNjc5OSAxMS42NzUyIDEzLjUxMjkgMTAuNDg3NSAxNC4wMDQ5QzkuMjk5ODIgMTQuNDk2OCA3Ljk5Mjk1IDE0LjYyNTUgNi43MzIxMiAxNC4zNzQ3QzUuNDcxMyAxNC4xMjQgNC4zMTMxNCAxMy41MDUgMy40MDQxIDEyLjU5NkMyLjQ5NTE0IDExLjY4NyAxLjg3NjE0IDEwLjUyODggMS42MjUzNyA5LjI2Nzk4QzEuMzc0NTkgOC4wMDcxNiAxLjUwMzMxIDYuNzAwMjggMS45OTUyNSA1LjUxMjYxQzIuNDg3MTkgNC4zMjQ5NCAzLjMyMDI1IDMuMzA5ODEgNC4zODkxIDIuNTk1NTdDNS40NTc5NSAxLjg4MTM0IDYuNzE0NTggMS41MDAwOCA4LjAwMDEgMS41QzkuOTAwMSAxLjUgMTEuNzAwMSAyLjMgMTMuMDAwMSAzLjZMMTQuNTAwMSA1LjEnLFxuICAgICAgJ00xNC40OTk5IDEuNVY1LjFIMTAuODk5OScsXG4gICAgXSxcbiAgfSxcbiAgY2hldnJvbjogJ002IDlsNiA2IDYtNicsXG4gIGluYm94OiAnTTIyIDEyaC02bC0yIDNoLTRsLTItM0gybTMuNS02LjVMMiAxMnY2YTIgMiAwIDAwMiAyaDE2YTIgMiAwIDAwMi0ydi02bC0zLjUtNi41QTIgMiAwIDAwMTYuNzYgNUg3LjI0YTIgMiAwIDAwLTEuNzQgMS41eicsXG4gIGFsZXJ0OiAnTTEyIDl2NG0wIDRoLjAxTTEwLjMgMy44NkwxLjgyIDE4YTIgMiAwIDAwMS43MSAzaDE2Ljk0YTIgMiAwIDAwMS43MS0zTDEzLjcgMy44NmEyIDIgMCAwMC0zLjQgMHonLFxuICBzZWFyY2g6ICdNMjEgMjFsLTQuMzUtNC4zNU0xNyAxMC41YTYuNSA2LjUgMCAxMS0xMyAwIDYuNSA2LjUgMCAwMTEzIDB6JyxcbiAgLy8g6aW85Zu+77yI5Y2g5q+U77yJ77ya5aSW5ZyIICsg5qWU5b2i77yM5LiO5Y2h54mH5qCH6aKY55qE44CM5Y2g5q+U44CN6K+t5LmJ5LiA6Ie0XG4gIHNoYXJlOiAnTTIxLjIxIDE1Ljg5QTEwIDEwIDAgMTE4IDIuODNNMjIgMTJBMTAgMTAgMCAwMDEyIDJ2MTB6JyxcbiAgY2hlY2s6ICdNMjAgNkw5IDE3bC01LTUnLFxufVxuZnVuY3Rpb24gU3ZnSWNvbihwcm9wcykge1xuICBjb25zdCB7IG5hbWUsIHNpemUsIGNsYXNzTmFtZSB9ID0gcHJvcHNcbiAgLy8g5LiA5Liq5ZCN5a2X5a+55bqU44CM5LiA5LiyIHBhdGggKyDoh6rlt7HnmoQgdmlld0JveC/nur/lrr3jgI3vvJvlrZfnrKbkuLLmmK8gMjQg572R5qC855qE566A5YaZ77yMXG4gIC8vIOiwg+eUqOaWue+8iDMxIOWkhO+8ieaXoOmcgOWFs+W/g+W3ruWIq+OAglxuICBjb25zdCBzcGVjID0gSUNPTl9QQVRIU1tuYW1lXSB8fCBJQ09OX1BBVEhTLmFjdGl2aXR5XG4gIGNvbnN0IGljb24gPSB0eXBlb2Ygc3BlYyA9PT0gJ3N0cmluZydcbiAgICA/IHsgdmlld0JveDogJzAgMCAyNCAyNCcsIHN0cm9rZVdpZHRoOiAyLCBwYXRoczogW3NwZWNdIH1cbiAgICA6IHNwZWNcbiAgcmV0dXJuIGgoJ3N2ZycsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSB8fCAndHNkLWljb24nLFxuICAgIHdpZHRoOiBzaXplIHx8IDE2LFxuICAgIGhlaWdodDogc2l6ZSB8fCAxNixcbiAgICB2aWV3Qm94OiBpY29uLnZpZXdCb3ggfHwgJzAgMCAyNCAyNCcsXG4gICAgZmlsbDogJ25vbmUnLFxuICAgIHN0cm9rZTogJ2N1cnJlbnRDb2xvcicsXG4gICAgc3Ryb2tlV2lkdGg6IGljb24uc3Ryb2tlV2lkdGggfHwgMixcbiAgICBzdHJva2VMaW5lY2FwOiAncm91bmQnLFxuICAgIHN0cm9rZUxpbmVqb2luOiAncm91bmQnLFxuICAgICdhcmlhLWhpZGRlbic6IHRydWUsXG4gIH0sIGljb24ucGF0aHMubWFwKChkLCBpKSA9PiBoKCdwYXRoJywgeyBrZXk6IGksIGQgfSkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmAmueUqCBIb29r77ya5aSW6YOo54K55Ye75YWz6ZetXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiB1c2VPdXRzaWRlQ2xpY2sob3BlbiwgcmVmLCBvbkNsb3NlKSB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAocmVmLmN1cnJlbnQgJiYgIXJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgb25DbG9zZSgpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICB9LCBbb3Blbiwgb25DbG9zZSwgcmVmXSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDpgJrnlKggSG9va++8mua1ruWxguWumuS9je+8iHZpZXdwb3J0IOWumuS9jSArIOepuumXtOS4jei2s+S4iue/uyArIOmrmOW6puWwgemhtu+8iVxuICpcbiAqIOiuvue9rumdouadv+acrOi6q+aYryBgb3ZlcmZsb3c6IGhpZGRlbmAg55qE6KOB5Ymq5a655Zmo77yM6LS0552A6L+H5ruk5qCP5Y+z56uv55qEIGFic29sdXRlXG4gKiDmta7lsYLkvJrooqvmlbTmnaHoo4HmjonvvIjlj7PkvqfnmoTjgIzmuIXnqbrjgI3nnIvkuI3op4HvvInjgIJDU1Mg5peg5rOV5oSf55+l56WW5YWI6KOB5Ymq77yM5Y+q6IO96YeP5LiA5qyhXG4gKiDop4blj6Plho3lrprkvY3vvJvmu5rliqjmiJbnvKnmlL7ml7bph43nrpfvvIzpgb/lhY3mta7lsYLnlZnlnKjljp/lnLDjgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFBBTkVMX01JTl9ST09NID0gMjQwIC8vIOS4i+aWueepuumXtOWwj+S6juWug+S4lOS4iuaWueabtOWuveijleaXtuS4iue/u1xuY29uc3QgUEFORUxfTUlOX0hFSUdIVCA9IDE2MFxuXG5mdW5jdGlvbiB1c2VGaXhlZFBhbmVsKGFuY2hvclJlZiwgb3Blbiwgd2lkdGgsIGdhcCA9IDYsIG1hcmdpbiA9IDEyKSB7XG4gIGNvbnN0IFtzdHlsZSwgc2V0U3R5bGVdID0gUmVhY3QudXNlU3RhdGUobnVsbClcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHNldFN0eWxlKG51bGwpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIGZ1bmN0aW9uIG1lYXN1cmUoKSB7XG4gICAgICBjb25zdCBlbCA9IGFuY2hvclJlZi5jdXJyZW50XG4gICAgICBpZiAoIWVsKSByZXR1cm5cbiAgICAgIGNvbnN0IHIgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgYm94VyA9IE1hdGgubWluKHdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCAtIG1hcmdpbiAqIDIpXG4gICAgICBjb25zdCBsZWZ0ID0gTWF0aC5tYXgobWFyZ2luLCBNYXRoLm1pbihyLmxlZnQsIHdpbmRvdy5pbm5lcldpZHRoIC0gbWFyZ2luIC0gYm94VykpXG4gICAgICBjb25zdCBiZWxvdyA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHIuYm90dG9tIC0gZ2FwIC0gbWFyZ2luXG4gICAgICBjb25zdCBhYm92ZSA9IHIudG9wIC0gZ2FwIC0gbWFyZ2luXG4gICAgICBjb25zdCBmbGlwID0gYmVsb3cgPCBQQU5FTF9NSU5fUk9PTSAmJiBhYm92ZSA+IGJlbG93XG4gICAgICBzZXRTdHlsZSh7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICBsZWZ0LFxuICAgICAgICB3aWR0aDogYm94VyxcbiAgICAgICAgbWF4SGVpZ2h0OiBNYXRoLm1heChQQU5FTF9NSU5fSEVJR0hULCBmbGlwID8gYWJvdmUgOiBiZWxvdyksXG4gICAgICAgIC4uLihmbGlwXG4gICAgICAgICAgPyB7IGJvdHRvbTogd2luZG93LmlubmVySGVpZ2h0IC0gci50b3AgKyBnYXAgfVxuICAgICAgICAgIDogeyB0b3A6IHIuYm90dG9tICsgZ2FwIH0pLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICB6SW5kZXg6IDQwLFxuICAgICAgfSlcbiAgICB9XG4gICAgbWVhc3VyZSgpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG1lYXN1cmUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG1lYXN1cmUsIHRydWUpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtZWFzdXJlKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG1lYXN1cmUsIHRydWUpXG4gICAgfVxuICB9LCBbb3BlbiwgYW5jaG9yUmVmLCB3aWR0aCwgZ2FwLCBtYXJnaW5dKVxuICBpZiAoIW9wZW4pIHJldHVybiBudWxsXG4gIC8vIOmmluW4p+i/mOayoemHj+WIsOWwuuWvuO+8muWFiOiXj+i1t+adpe+8jOWQpuWImeS8mumXquWIsOW3puS4iuinklxuICByZXR1cm4gc3R5bGUgfHwgeyBwb3NpdGlvbjogJ2ZpeGVkJywgdG9wOiAwLCBsZWZ0OiAwLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSGVhZGVy77ya5qCH6aKYICsg5Ymv5qCH6aKYICsg5Yi35paw5oyJ6ZKuXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBTdGF0c0hlYWRlcihwcm9wcykge1xuICBjb25zdCB7IGJ1c3ksIG9uUmVmcmVzaCB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhZGVyJyB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWhlYWRlci10ZXh0JyB9LFxuICAgICAgaCgnaDInLCB7IGNsYXNzTmFtZTogJ3RzZC10aXRsZScgfSwgdCgnbmF2JykpLFxuICAgICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLXN1YnRpdGxlJyB9LCB0KCdzdWJ0aXRsZScpKSksXG4gICAgaCgnYnV0dG9uJywge1xuICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICBjbGFzc05hbWU6ICd0c2QtaWNvbi1idG4nICsgKGJ1c3kgPyAnIHRzZC1zcGlubmluZycgOiAnJyksXG4gICAgICBvbkNsaWNrOiBvblJlZnJlc2gsXG4gICAgICBkaXNhYmxlZDogYnVzeSxcbiAgICAgICdhcmlhLWJ1c3knOiBidXN5IHx8IHVuZGVmaW5lZCxcbiAgICAgIHRpdGxlOiB0KCdyZWZyZXNoJyksXG4gICAgICAnYXJpYS1sYWJlbCc6IHQoJ3JlZnJlc2gnKSxcbiAgICB9LCBoKFN2Z0ljb24sIHsgbmFtZTogJ3JlZnJlc2gnIH0pKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDoh6rlrprkuYnml6XmnJ/ojIPlm7Tmta7lsYJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEN1c3RvbVJhbmdlUG9wb3Zlcihwcm9wcykge1xuICBjb25zdCB7IGN1c3RvbSwgb25BcHBseSwgb25DbG9zZSwgYW5jaG9yUmVmIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIGNvbnN0IHBhbmVsU3R5bGUgPSB1c2VGaXhlZFBhbmVsKGFuY2hvclJlZiwgdHJ1ZSwgMzAwKVxuICBjb25zdCBbZnJvbSwgc2V0RnJvbV0gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20uZnJvbSlcbiAgY29uc3QgW3RvLCBzZXRUb10gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20udG8pXG4gIGNvbnN0IGludmFsaWQgPSAhZnJvbSB8fCAhdG8gfHwgZnJvbSA+IHRvXG4gIC8vIFAyLTEx77yaZGlhbG9nIOS7pSBFc2NhcGUg5YWz6ZetXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIG9uQ2xvc2UoKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgfSwgW29uQ2xvc2VdKVxuICByZXR1cm4gaCgnZGl2Jywge1xuICAgIGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyIHRzZC1yYW5nZS1wb3BvdmVyJyxcbiAgICBzdHlsZTogcGFuZWxTdHlsZSxcbiAgICByb2xlOiAnZGlhbG9nJyxcbiAgICAnYXJpYS1sYWJlbCc6IHQoJ2N1c3RvbVJhbmdlQXJpYScpLFxuICB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdGl0bGUnIH0sIHQoJ2N1c3RvbVJhbmdlVGl0bGUnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmFuZ2UtZmllbGRzJyB9LFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdzdGFydFRpbWUnKSksXG4gICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgIHR5cGU6ICdkYXRlJywgdmFsdWU6IGZyb20sICdhcmlhLWxhYmVsJzogdCgnc3RhcnRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRGcm9tKGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgfSkpLFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdlbmRUaW1lJykpLFxuICAgICAgICBoKCdpbnB1dCcsIHtcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsIHZhbHVlOiB0bywgJ2FyaWEtbGFiZWwnOiB0KCdlbmRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRUbyhlLnRhcmdldC52YWx1ZSksXG4gICAgICAgIH0pKSksXG4gICAgaW52YWxpZFxuICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZmllbGQtZXJyb3InLCByb2xlOiAnYWxlcnQnIH0sIHQoJ3JhbmdlSW52YWxpZCcpKVxuICAgICAgOiBudWxsLFxuICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZC1oaW50JyB9LCB0KCdyYW5nZUhpbnQnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1hY3Rpb25zJyB9LFxuICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWJ0biB0c2QtYnRuLWdob3N0Jywgb25DbGljazogb25DbG9zZSB9LCB0KCdjYW5jZWwnKSksXG4gICAgICBoKCdidXR0b24nLCB7XG4gICAgICAgIHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tcHJpbWFyeScsXG4gICAgICAgIGRpc2FibGVkOiBpbnZhbGlkLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7IGlmICghaW52YWxpZCkgb25BcHBseSh7IGZyb20sIHRvIH0pIH0sXG4gICAgICB9LCB0KCdjb25maXJtJykpKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmqKHlnovlpJrpgInkuIvmi4lcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIE1vZGVsRHJvcGRvd24ocHJvcHMpIHtcbiAgY29uc3QgeyBvcHRpb25zLCBzZWxlY3RlZCwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gUmVhY3QudXNlU3RhdGUoJycpXG4gIGNvbnN0IGFuY2hvclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBwYW5lbFN0eWxlID0gdXNlRml4ZWRQYW5lbChhbmNob3JSZWYsIG9wZW4sIDMyMClcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbikgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGZ1bmN0aW9uIGhhbmRsZXIoZSkge1xuICAgICAgaWYgKGFuY2hvclJlZi5jdXJyZW50ICYmICFhbmNob3JSZWYuY3VycmVudC5jb250YWlucyhlLnRhcmdldCkpIHNldE9wZW4oZmFsc2UpXG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uS2V5KGUpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnKSBzZXRPcGVuKGZhbHNlKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgfVxuICB9LCBbb3Blbl0pXG5cbiAgLy8g5Y+q5YiX5Ye65b2T5YmN6IyD5Zu05pyJ5pWw5o2u55qE5qih5Z6L77yb5bey6YCJ5L2G5o6J5Ye65YCZ6YCJ5YiX6KGo55qE44CM6KGl5Zue44CN77yM5L+d6K+B5Y+v5riy5p+T44CB5Y+v5riF6ZmkXG4gIC8vIOWAmemAiemUruebtOaOpeeUqOWuv+S4u+e7meWlveeahCBga2V5YO+8iGNvbXBvc2l0ZU1vZGVsS2V5IOeahOe7k+aenO+8ie+8muWuouaIt+err+S4jeWGjeiHquW3seaLvFxuICAvLyBgcHJvdmlkZXIgKyAnLycgKyBtb2RlbGDvvIxwcm92aWRlciDkuLrnqbrml7bpgqPnp43mi7zms5XkvJrlvpfliLAgYC9tb2RlbGAg6ICM5rC46L+c6YCJ5LiN5Lit44CCXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KChvcHRpb25zIHx8IFtdKS5tYXAoKG0pID0+IG0ua2V5IHx8IChtLnByb3ZpZGVyID8gbS5wcm92aWRlciArICcvJyArIG0ubW9kZWwgOiBtLm1vZGVsKSkpXG4gICAgOyhzZWxlY3RlZCB8fCBbXSkuZm9yRWFjaCgobSkgPT4gc2V0LmFkZChtKSlcbiAgICBjb25zdCBsaXN0ID0gQXJyYXkuZnJvbShzZXQpXG4gICAgbGlzdC5zb3J0KClcbiAgICByZXR1cm4gbGlzdFxuICB9LCBbb3B0aW9ucywgc2VsZWN0ZWRdKVxuXG4gIGNvbnN0IHEgPSBxdWVyeS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKVxuICBjb25zdCBmaWx0ZXJlZCA9IHEgPT09ICcnID8gY2FuZGlkYXRlcyA6IGNhbmRpZGF0ZXMuZmlsdGVyKChjKSA9PiBjLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihxKSA+PSAwKVxuICBjb25zdCBsYWJlbCA9IHNlbGVjdGVkLmxlbmd0aCA9PT0gMCA/IHQoJ2FsbE1vZGVscycpIDogdCgnc2VsZWN0ZWRNb2RlbHMnLCB7IGNvdW50OiBzZWxlY3RlZC5sZW5ndGggfSlcblxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1hbmNob3InLCByZWY6IGFuY2hvclJlZiB9LFxuICAgIGgoJ2J1dHRvbicsIHtcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgY2xhc3NOYW1lOiAndHNkLXNlbGVjdC1idG4nICsgKHNlbGVjdGVkLmxlbmd0aCA+IDAgPyAnIHRzZC1zZWxlY3QtaGFzJyA6ICcnKSxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHsgc2V0T3BlbigodikgPT4gIXYpOyBzZXRRdWVyeSgnJykgfSxcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogb3BlbixcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogJ2xpc3Rib3gnLFxuICAgICAgdGl0bGU6IGxhYmVsLFxuICAgIH0sXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2Qtc2VsZWN0LWxhYmVsJyB9LCBsYWJlbCksXG4gICAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2NoZXZyb24nLCBzaXplOiAxNCwgY2xhc3NOYW1lOiAndHNkLWNoZXZyb24nICsgKG9wZW4gPyAnIHRzZC1jaGV2cm9uLW9wZW4nIDogJycpIH0pKSxcbiAgICBvcGVuXG4gICAgICA/IGgoJ2RpdicsIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtcG9wb3ZlciB0c2QtbW9kZWwtcG9wb3ZlcicsXG4gICAgICAgICAgc3R5bGU6IHBhbmVsU3R5bGUsXG4gICAgICAgICAgcm9sZTogJ2xpc3Rib3gnLFxuICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnbW9kZWxGaWx0ZXJHcm91cCcpLFxuICAgICAgICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci10b29scycgfSxcbiAgICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1saW5rLWJ0bicsIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKGNhbmRpZGF0ZXMuc2xpY2UoKSkgfSwgdCgnc2VsZWN0QWxsJykpLFxuICAgICAgICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWxpbmstYnRuJywgb25DbGljazogKCkgPT4gb25DaGFuZ2UoW10pIH0sIHQoJ2NsZWFyJykpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWFyY2gnIH0sXG4gICAgICAgICAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ3NlYXJjaCcsIHNpemU6IDE0LCBjbGFzc05hbWU6ICd0c2Qtc2VhcmNoLWljb24nIH0pLFxuICAgICAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzZWFyY2gnLCB2YWx1ZTogcXVlcnksIHBsYWNlaG9sZGVyOiB0KCdzZWFyY2hNb2RlbHMnKSxcbiAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0KCdzZWFyY2hNb2RlbHMnKSxcbiAgICAgICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRRdWVyeShlLnRhcmdldC52YWx1ZSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtbW9kZWwtbGlzdCcgfSxcbiAgICAgICAgICAgIGZpbHRlcmVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICA/IGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLWVtcHR5JyB9LCB0KCdub01hdGNoTW9kZWxzJykpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGZpbHRlcmVkLm1hcCgoa2V5KSA9PlxuICAgICAgICAgICAgICBoKCdsYWJlbCcsIHsga2V5LCBjbGFzc05hbWU6ICd0c2QtbW9kZWwtaXRlbScgfSxcbiAgICAgICAgICAgICAgICBoKCdpbnB1dCcsIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgICAgICBjaGVja2VkOiBzZWxlY3RlZC5pbmRleE9mKGtleSkgPj0gMCxcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gc2VsZWN0ZWQuc2xpY2UoKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmluZGV4T2Yoa2V5KSA8IDApIG5leHQucHVzaChrZXkpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5leHQuaW5kZXhPZihrZXkpXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgbmV4dC5zcGxpY2UoaSwgMSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZShuZXh0KSAvLyDli77pgInljbPml7bnlJ/mlYhcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLW1vZGVsLW5hbWUnLCB0aXRsZToga2V5IH0sIGtleSkpKSksXG4gICAgICAgICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItbm90ZScgfSwgdCgnbW9kZWxGaWx0ZXJIaW50JykpKVxuICAgICAgOiBudWxsKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOetm+mAieagj++8muaXpeacn+mihOiuvu+8iOWIhuauteaMiemSru+8iSsg6Ieq5a6a5LmJ5rWu5bGCICsg5qih5Z6L5aSa6YCJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBGaWx0ZXJCYXIocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIHJhbmdlLCBjdXN0b20sIG1vZGVscywgY3VzdG9tT3BlbiwgbW9kZWxPcHRpb25zLFxuICAgIG9uUHJlc2V0LCBvbkN1c3RvbU9wZW4sIG9uQ3VzdG9tQXBwbHksIG9uQ3VzdG9tQ2xvc2UsIG9uTW9kZWxzQ2hhbmdlLFxuICB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBzZWdSZWYgPSBSZWFjdC51c2VSZWYobnVsbClcbiAgY29uc3QgY3VzdG9tQnRuUmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIHVzZU91dHNpZGVDbGljayhjdXN0b21PcGVuLCBzZWdSZWYsIG9uQ3VzdG9tQ2xvc2UpXG5cbiAgY29uc3QgY3VzdG9tTGFiZWwgPSBmbXREYXRlU2xhc2goY3VzdG9tLmZyb20pICsgJyAtICcgKyBmbXREYXRlU2xhc2goY3VzdG9tLnRvKVxuICBjb25zdCBwcmVzZXRzID0gW1xuICAgIHsga2V5OiAndG9kYXknLCBsYWJlbDogdCgndG9kYXknKSB9LFxuICAgIHsga2V5OiAnN2QnLCBsYWJlbDogdCgnbGFzdDdkJykgfSxcbiAgICB7IGtleTogJzMwZCcsIGxhYmVsOiB0KCdsYXN0MzBkJykgfSxcbiAgICB7IGtleTogJ2FsbCcsIGxhYmVsOiB0KCdhbGwnKSB9LFxuICAgIHsga2V5OiAnY3VzdG9tJywgbGFiZWw6IHQoJ2N1c3RvbScpIH0sXG4gIF1cblxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtZmlsdGVyYmFyJyB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNlZy13cmFwJywgcmVmOiBzZWdSZWYgfSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNlZycsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogdCgnZGF0ZVJhbmdlR3JvdXAnKSB9LFxuICAgICAgICBwcmVzZXRzLm1hcCgocCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHJhbmdlID09PSBwLmtleVxuICAgICAgICAgIGNvbnN0IGlzQ3VzdG9tID0gcC5rZXkgPT09ICdjdXN0b20nXG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBpc0N1c3RvbSAmJiBhY3RpdmUgPyBjdXN0b21MYWJlbCA6IHAubGFiZWxcbiAgICAgICAgICByZXR1cm4gaCgnYnV0dG9uJywge1xuICAgICAgICAgICAga2V5OiBwLmtleSxcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgcmVmOiBpc0N1c3RvbSA/IGN1c3RvbUJ0blJlZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWctYnRuJyArIChhY3RpdmUgPyAnIHRzZC1zZWctYWN0aXZlJyA6ICcnKSArIChpc0N1c3RvbSA/ICcgdHNkLXNlZy1jdXN0b20nIDogJycpLFxuICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IGFjdGl2ZSxcbiAgICAgICAgICAgIHRpdGxlOiBpc0N1c3RvbSAmJiBhY3RpdmUgPyBjdXN0b21MYWJlbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgaWYgKGlzQ3VzdG9tKSBvbkN1c3RvbU9wZW4oIWN1c3RvbU9wZW4pOyBlbHNlIG9uUHJlc2V0KHAua2V5KSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2Qtc2VnLWxhYmVsJyB9LCBsYWJlbCkpXG4gICAgICAgIH0pKSxcbiAgICAgIGN1c3RvbU9wZW5cbiAgICAgICAgPyBoKEN1c3RvbVJhbmdlUG9wb3ZlciwgeyBjdXN0b20sIG9uQXBwbHk6IG9uQ3VzdG9tQXBwbHksIG9uQ2xvc2U6IG9uQ3VzdG9tQ2xvc2UsIGFuY2hvclJlZjogY3VzdG9tQnRuUmVmIH0pXG4gICAgICAgIDogbnVsbCksXG4gICAgaChNb2RlbERyb3Bkb3duLCB7IG9wdGlvbnM6IG1vZGVsT3B0aW9ucywgc2VsZWN0ZWQ6IG1vZGVscywgb25DaGFuZ2U6IG9uTW9kZWxzQ2hhbmdlIH0pKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOWPguiAg+aIkOacrOW4geenjeWIh+aNou+8iOS6uuawkeW4gSAvIOe+juWFg++8jOWbuuWumiAxIFVTRCA9IDcgQ05Z77yJXG4gKlxuICog5o2i566X5Zyo5a6/5Li75L6n5a6M5oiQ77yI5Lu355uu6KGo5piv576O5YWD5Lu377yM57ud5LiN5Zue5YaZ77yJ77yM5omA5Lul6L+Z6YeM5Y+q6LSf6LSj6YCJ5oup5LiO5oyB5LmF5YyW77yaXG4gKiDmjaLluIHnp43ljbPmjaLmn6Xor6LvvIzkuI3ph43mn6XmlbDlrZfkuI3kvJrlj5jjgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IENVUlJFTkNZX1NZTUJPTFMgPSB7IENOWTogJ8KlJywgVVNEOiAnJCcgfVxuY29uc3QgQ1VSUkVOQ1lfU1RPUkVfS0VZID0gJ2RzaC1wbHVnaW4tdXNhZ2U6ZGlzcGxheS1jdXJyZW5jeSdcblxuZnVuY3Rpb24gcmVhZFN0b3JlZEN1cnJlbmN5KCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oQ1VSUkVOQ1lfU1RPUkVfS0VZKSA9PT0gJ1VTRCcgPyAnVVNEJyA6ICdDTlknXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJ0NOWScgLy8g5peg55eV5qih5byPIC8g5a2Y5YKo6KKr56aB77ya6YCA5Zue6buY6K6kXG4gIH1cbn1cbmZ1bmN0aW9uIHN0b3JlQ3VycmVuY3koY29kZSkge1xuICB0cnkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShDVVJSRU5DWV9TVE9SRV9LRVksIGNvZGUpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDlrZjkuI3kuIvlsLHlj6rlvbHlk43kuIvmrKHmiZPlvIDvvIzkuI3lvbHlk43mnKzmrKHmmL7npLpcbiAgfVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeVBpY2tlcihwcm9wcykge1xuICBjb25zdCB7IGNvZGUsIG9uQ2hhbmdlIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbClcbiAgY29uc3QgcGFuZWxTdHlsZSA9IHVzZUZpeGVkUGFuZWwocmVmLCBvcGVuLCAxODApXG4gIHVzZU91dHNpZGVDbGljayhvcGVuLCByZWYsICgpID0+IHNldE9wZW4oZmFsc2UpKVxuICBjb25zdCBhY3RpdmUgPSBDVVJSRU5DWV9TWU1CT0xTW2NvZGVdID8gY29kZSA6ICdDTlknXG4gIGNvbnN0IG9wdGlvbnMgPSBbJ0NOWScsICdVU0QnXVxuICAvLyDmlLbotbfml7Yg4oaR4oaTIOebtOaOpeaNouWAvO+8iOWDj+WOn+eUnyBzZWxlY3TvvInvvIzlsZXlvIDml7blnKjkuKTpobnpl7Tnp7vliqjvvJtFc2Mg5YWz6I+c5Y2V44CCXG4gIGNvbnN0IG1vdmUgPSAoc3RlcCkgPT4ge1xuICAgIGNvbnN0IGkgPSBvcHRpb25zLmluZGV4T2YoYWN0aXZlKVxuICAgIG9uQ2hhbmdlKG9wdGlvbnNbKGkgKyBzdGVwICsgb3B0aW9ucy5sZW5ndGgpICUgb3B0aW9ucy5sZW5ndGhdKVxuICB9XG4gIGNvbnN0IG9uS2V5RG93biA9IChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBzZXRPcGVuKGZhbHNlKTsgcmV0dXJuIH1cbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicgfHwgZS5rZXkgPT09ICdBcnJvd1VwJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IG1vdmUoZS5rZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKTsgcmV0dXJuIH1cbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnKSB7IGUucHJldmVudERlZmF1bHQoKTsgc2V0T3Blbih0cnVlKSB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IG1vdmUoMSkgfVxuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dVcCcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBtb3ZlKC0xKSB9XG4gIH1cbiAgcmV0dXJuIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jdXItYW5jaG9yJywgcmVmIH0sXG4gICAgaCgnYnV0dG9uJywge1xuICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICBjbGFzc05hbWU6ICd0c2QtY3VyLWJ0bicgKyAob3BlbiA/ICcgdHNkLWN1ci1idG4tb3BlbicgOiAnJyksXG4gICAgICB0aXRsZTogdCgnY3VycmVuY3lIaW50JyksXG4gICAgICAnYXJpYS1sYWJlbCc6IHQoJ2N1cnJlbmN5SGludCcpLFxuICAgICAgJ2FyaWEtaGFzcG9wdXAnOiAnbGlzdGJveCcsXG4gICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4sXG4gICAgICBvbkNsaWNrOiAoKSA9PiBzZXRPcGVuKCh2KSA9PiAhdiksXG4gICAgICBvbktleURvd24sXG4gICAgfSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCBDVVJSRU5DWV9TWU1CT0xTW2FjdGl2ZV0pLFxuICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdjaGV2cm9uJywgc2l6ZTogMTAsIGNsYXNzTmFtZTogJ3RzZC1jdXItY2hldnJvbicgfSkpLFxuICAgIG9wZW5cbiAgICAgID8gaCgnZGl2Jywge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyIHRzZC1jdXItcG9wb3ZlcicsXG4gICAgICAgICAgc3R5bGU6IHBhbmVsU3R5bGUsXG4gICAgICAgICAgcm9sZTogJ2xpc3Rib3gnLFxuICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnY3VycmVuY3lIaW50JyksXG4gICAgICAgICAgb25LZXlEb3duLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLm1hcCgoYykgPT4gaCgnYnV0dG9uJywge1xuICAgICAgICAgIGtleTogYyxcbiAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICByb2xlOiAnb3B0aW9uJyxcbiAgICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IGMgPT09IGFjdGl2ZSxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtY3VyLW9wdGlvbicgKyAoYyA9PT0gYWN0aXZlID8gJyB0c2QtY3VyLW9wdGlvbi1hY3RpdmUnIDogJycpLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgb25DaGFuZ2UoYyk7IHNldE9wZW4oZmFsc2UpIH0sXG4gICAgICAgIH0sXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWN1ci1zeW1ib2wnIH0sIENVUlJFTkNZX1NZTUJPTFNbY10pLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jdXItbmFtZScgfSwgdChjID09PSAnQ05ZJyA/ICdjdXJyZW5jeUNOWScgOiAnY3VycmVuY3lVU0QnKSksXG4gICAgICAgICAgYyA9PT0gYWN0aXZlID8gaChTdmdJY29uLCB7IG5hbWU6ICdjaGVjaycsIHNpemU6IDEyLCBjbGFzc05hbWU6ICd0c2QtY3VyLWNoZWNrJyB9KSA6IG51bGwpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1ub3RlJyB9LCB0KCdjdXJyZW5jeUhpbnQnKSkpXG4gICAgICA6IG51bGwpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5qih5Z6L5Y2g5q+U77yIS1BJIOe9keagvOmHjOeahOesrCA2IOagvO+8iVxuICpcbiAqIOaVsOaNruebtOaOpeWQg+Wuv+S4uyBgYnlNb2RlbGAg55qE6KGM77yI5LiO44CM5oyJ5qih5Z6L5piO57uG44CN6KGo5ZCM5LiA5Lu977yJ77yM5LiN5Y+m566X5LiA6YGN44CCXG4gKiDmmI7nu4bmlL7lnKjlkITmrrXnmoTljp/nlJ8gdGl0bGUg5LiK6ICM5LiN5piv5rWu5bGC77yaS1BJIOWNoei0tOedgOiuvue9rumdouadv+eahOijgeWJqui+ueeVjO+8jFxuICog5YaN5Y+g5LiA5bGC5rWu5bGC5Y+q5Lya5oqK5LmL5YmN5L+u5aW955qE6KOB5Ymq6Zeu6aKY5bim5Zue5p2l44CCXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBTSEFSRV9DT0xPUlMgPSBbXG4gIC8vIOWPqueUqOS4u+mimOmHjOecn+WunuWtmOWcqOOAgeS4lOW9vOatpOWIhuW+l+W8gOeahOW9qeiJsuaXj++8mua3seiTneOAgee7v+OAgeeQpeePgOOAgee6ouOAglxuICAvLyDkuI3nlKggbmV1dHJhbCAvIOeZvSAvIOm7kSDigJTigJQg5a6D5Lus5Zyo5rex5rWF5Lik5aWX5Li76aKY6YeM5LiA6L655Lya57OK6L+b6IOM5pmv77yM5LiA6L655Lya6KKr6K+75oiQ56aB55So5oCB44CCXG4gICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAndmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApJyxcbiAgJ3ZhcigtLWRzdy1zdGF0aWMtYW1iZXItNTAwKScsXG4gICd2YXIoLS1kc3ctc3RhdGljLXJlZC00MDApJyxcbl1cbmNvbnN0IFNIQVJFX1RPUCA9IDRcbmNvbnN0IFNIQVJFX1JFU1RfS0VZID0gJ19fcmVzdF9fJ1xuXG4vKiogYHByb3ZpZGVyL21vZGVsYCDihpIg6KO45qih5Z6L5ZCN77yb6Imy5bim5qC85L2N5pS+5LiN5LiL5YWo5ZCN77yM5YWo5ZCN55WZ57uZIHRpdGxlIOS4jiBhcmlh44CCICovXG5mdW5jdGlvbiBzaG9ydE1vZGVsTmFtZShrZXkpIHtcbiAgY29uc3QgcyA9IFN0cmluZyhrZXkgPT0gbnVsbCA/ICcnIDoga2V5KVxuICBjb25zdCBpID0gcy5sYXN0SW5kZXhPZignLycpXG4gIHJldHVybiBpID09PSAtMSA/IHMgOiBzLnNsaWNlKGkgKyAxKVxufVxuLyoqIOWuv+S4u+ihjOaYryBgdG90YWxUb2tlbnNg77yb5YW85a655bey5pig5bCE5oiQIGB0b3RhbGAg55qE5b2i54q277yM56m66KGM5Lmf5LiN6IO95oqb44CCICovXG5mdW5jdGlvbiByb3dUb3RhbChyKSB7XG4gIHJldHVybiByID8gKHIudG90YWxUb2tlbnMgfHwgci50b3RhbCB8fCAwKSA6IDBcbn1cbi8qKiDpmY3luo/lj5bliY0gNCDmrrXvvIzlhbbkvZnlubbmiJDjgIzlhbblroPjgI3vvJvml6DmlbDmja7ml7bov5Tlm57nqbrmrrXjgIIgKi9cbmZ1bmN0aW9uIHNoYXJlU2VnbWVudHMocm93cykge1xuICBjb25zdCBsaXN0ID0gKHJvd3MgfHwgW10pLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gcm93VG90YWwoYikgLSByb3dUb3RhbChhKSlcbiAgY29uc3QgdG90YWwgPSBsaXN0LnJlZHVjZSgocywgcikgPT4gcyArIHJvd1RvdGFsKHIpLCAwKVxuICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIHsgdG90YWw6IDAsIHNlZ3M6IFtdIH1cbiAgY29uc3QgbnVtYmVycyA9IChyKSA9PiAoe1xuICAgIHRva2Vuczogcm93VG90YWwociksXG4gICAgY2FsbHM6IHIuY2FsbHMgfHwgMCxcbiAgICAvLyDkuI7mmI7nu4booajlkIzkuIDlj6PlvoTvvJrovpPlhaXlkKvnvJPlrZjor7vlhplcbiAgICBpbnB1dDogKHIuaW5wdXRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVJlYWRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVdyaXRlVG9rZW5zIHx8IDApLFxuICAgIG91dHB1dDogci5vdXRwdXRUb2tlbnMgfHwgMCxcbiAgICBjb3N0OiByLmNvc3QgfHwgMCxcbiAgfSlcbiAgY29uc3Qgc2VncyA9IGxpc3Quc2xpY2UoMCwgU0hBUkVfVE9QKS5tYXAoKHIsIGkpID0+IE9iamVjdC5hc3NpZ24oe1xuICAgIGtleTogU3RyaW5nKHIua2V5KSxcbiAgICBsYWJlbDogc2hvcnRNb2RlbE5hbWUoci5rZXkpLFxuICAgIHBjdDogcm93VG90YWwocikgLyB0b3RhbCxcbiAgICBjb2xvcjogU0hBUkVfQ09MT1JTW2kgJSBTSEFSRV9DT0xPUlMubGVuZ3RoXSxcbiAgfSwgbnVtYmVycyhyKSkpXG4gIGNvbnN0IHJlc3RSb3dzID0gbGlzdC5zbGljZShTSEFSRV9UT1ApXG4gIGNvbnN0IHJlc3RUb2tlbnMgPSByZXN0Um93cy5yZWR1Y2UoKHMsIHIpID0+IHMgKyByb3dUb3RhbChyKSwgMClcbiAgaWYgKHJlc3RUb2tlbnMgPiAwKSB7XG4gICAgY29uc3QgYWdnID0gcmVzdFJvd3MucmVkdWNlKChhLCByKSA9PiB7XG4gICAgICBjb25zdCBuID0gbnVtYmVycyhyKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5zOiBhLnRva2VucyArIG4udG9rZW5zLFxuICAgICAgICBjYWxsczogYS5jYWxscyArIG4uY2FsbHMsXG4gICAgICAgIGlucHV0OiBhLmlucHV0ICsgbi5pbnB1dCxcbiAgICAgICAgb3V0cHV0OiBhLm91dHB1dCArIG4ub3V0cHV0LFxuICAgICAgICBjb3N0OiBhLmNvc3QgKyBuLmNvc3QsXG4gICAgICB9XG4gICAgfSwgeyB0b2tlbnM6IDAsIGNhbGxzOiAwLCBpbnB1dDogMCwgb3V0cHV0OiAwLCBjb3N0OiAwIH0pXG4gICAgc2Vncy5wdXNoKE9iamVjdC5hc3NpZ24oe1xuICAgICAga2V5OiBTSEFSRV9SRVNUX0tFWSxcbiAgICAgIGxhYmVsOiBudWxsLCAvLyDjgIzlhbblroPjgI3nmoTmlofmoYjnlLHmuLLmn5PlsYLlj5bor43lhbhcbiAgICAgIHBjdDogcmVzdFRva2VucyAvIHRvdGFsLFxuICAgICAgLy8g44CM5YW25a6D44CN55So5ZCM6Imy57O755qE5reh6Imy77yI5rWF6JOd77yJ77yM5LiN55So54GwL+eZve+8mumCo+S4pOenjeWcqOa3seiJsuWNoeeJh+S4iuS8muiiq+ivu+aIkOemgeeUqFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTMwMCknLFxuICAgIH0sIGFnZykpXG4gIH1cbiAgcmV0dXJuIHsgdG90YWwsIHNlZ3MgfVxufVxuXG5mdW5jdGlvbiBNb2RlbFNoYXJlQmFyKHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgY3VycmVuY3kgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW3RpcCwgc2V0VGlwXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpIC8vIHsga2V5LCBsZWZ0LCB0b3AgfSBpbiB2aWV3cG9ydCBjb29yZHNcbiAgY29uc3Qgb2NjID0gc2hhcmVTZWdtZW50cyhyb3dzKVxuICBpZiAob2NjLnRvdGFsIDw9IDApIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXZhbHVlIHRzZC1zaGFyZS1lbXB0eScgfSwgdCgnbm9EYXRhJykpXG4gIGNvbnN0IGZpbmQgPSAoa2V5KSA9PiBvY2Muc2Vncy5maWx0ZXIoKHMpID0+IHMua2V5ID09PSBrZXkpWzBdIHx8IG51bGxcbiAgY29uc3Qgc2hvd24gPSAodGlwICYmIGZpbmQodGlwLmtleSkpIHx8IG9jYy5zZWdzWzBdXG4gIGNvbnN0IGxhYmVsT2YgPSAocykgPT4gKHMua2V5ID09PSBTSEFSRV9SRVNUX0tFWSA/IHQoJ3NoYXJlT3RoZXInKSA6IHMubGFiZWwpXG4gIGNvbnN0IGZ1bGxPZiA9IChzKSA9PiAocy5rZXkgPT09IFNIQVJFX1JFU1RfS0VZID8gdCgnc2hhcmVPdGhlcicpIDogcy5rZXkpXG4gIGNvbnN0IGNvc3RPZiA9IChzKSA9PiAocy50b2tlbnMgPiAwICYmICEocy5jb3N0ID4gMCkgPyB0KCd1bnByaWNlZCcpIDogZm9ybWF0Q29zdChzLmNvc3QsIGN1cnJlbmN5KSlcbiAgLy8g5oKs5YGcL+iBmueEpu+8muS7juauteeahOinhuWPo+efqeW9ouaOqOW8gO+8jGZpeGVkIOWumuS9jeS4jeWPl+iuvue9rumdouadvyBvdmVyZmxvdyDoo4HliapcbiAgY29uc3Qgc2hvd1RpcCA9IChlLCBzKSA9PiB7XG4gICAgY29uc3QgciA9IGUuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIHNldFRpcCh7IGtleTogcy5rZXksIGxlZnQ6IHIubGVmdCArIHIud2lkdGggLyAyLCB0b3A6IHIudG9wIH0pXG4gIH1cbiAgY29uc3QgaGlkZVRpcCA9ICgpID0+IHNldFRpcChudWxsKVxuICBjb25zdCB0aXBCb3ggPSBzaG93biAmJiB0aXBcbiAgICA/IGgoJ2RpdicsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAgdHNkLXNoYXJlLXRpcCcsXG4gICAgICAgIHN0eWxlOiB7IHBvc2l0aW9uOiAnZml4ZWQnLCBsZWZ0OiB0aXAubGVmdCArICdweCcsIHRvcDogdGlwLnRvcCArICdweCcsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtMTEwJSknIH0sXG4gICAgICB9LFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRhdGUnIH0sIGZ1bGxPZihzaG93bikpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kb3QnLCBzdHlsZTogeyBiYWNrZ3JvdW5kOiBzaG93bi5jb2xvciB9IH0pLFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b3RhbFRva2VucycpKSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC12YWwnIH0sIGZvcm1hdEludChzaG93bi50b2tlbnMpKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdsZWdlbmRJbnB1dCcpKSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC12YWwnIH0sIGZvcm1hdEludChzaG93bi5pbnB1dCkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZE91dHB1dCcpKSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC12YWwnIH0sIGZvcm1hdEludChzaG93bi5vdXRwdXQpKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdjb3N0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgY29zdE9mKHNob3duKSkpKVxuICAgIDogbnVsbFxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1zaGFyZS1ib2R5JyB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNoYXJlLXRyYWNrJywgb25Nb3VzZUxlYXZlOiBoaWRlVGlwIH0sXG4gICAgICBvY2Muc2Vncy5tYXAoKHMpID0+IGgoJ2RpdicsIHtcbiAgICAgICAga2V5OiBzLmtleSxcbiAgICAgICAgY2xhc3NOYW1lOiAndHNkLXNoYXJlLXNlZycsXG4gICAgICAgICdkYXRhLXNoYXJlLWtleSc6IHMua2V5LFxuICAgICAgICAnZGF0YS1hY3RpdmUnOiBzaG93biAmJiBzaG93bi5rZXkgPT09IHMua2V5ID8gJ3RydWUnIDogdW5kZWZpbmVkLFxuICAgICAgICBzdHlsZTogeyB3aWR0aDogcy5wY3QgKiAxMDAgKyAnJScsIGJhY2tncm91bmQ6IHMuY29sb3IgfSxcbiAgICAgICAgcm9sZTogJ2ltZycsXG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAnYXJpYS1sYWJlbCc6IGZ1bGxPZihzKSArICcgwrcgJyArIGZtdFBjdChzLnBjdCkgKyAnIMK3ICcgKyBmb3JtYXRJbnQocy50b2tlbnMpICsgJyAnICsgdCgndG90YWxUb2tlbnMnKSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiAoZSkgPT4gc2hvd1RpcChlLCBzKSxcbiAgICAgICAgb25Gb2N1czogKGUpID0+IHNob3dUaXAoZSwgcyksXG4gICAgICAgIG9uQmx1cjogaGlkZVRpcCxcbiAgICAgIH0pKSksXG4gICAgLy8g5p2h5LiL5Y+q55WZ5LiA6KGM5L2O6LCD6ISa5rOo77yI5b2T5YmN5oKs5rWu55qE6YKj5q6177yM5ZCm5YiZ5pyA5aSn55qE6YKj5q6177yJ77ybXG4gICAgLy8g5YWo5ZCN5LiO5piO57uG6YO95Zyo5oKs5rWu5Y2h54mH6YeM77yM5omA5Lul6L+Z6YeM5LiN5oyCIHRpdGxl44CCXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2hhcmUtY2FwdGlvbicgfSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1zaGFyZS1jYXAtbmFtZScgfSwgbGFiZWxPZihzaG93bikpLFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNoYXJlLWNhcC1wY3QnIH0sIGZtdFBjdChzaG93bi5wY3QpKSksXG4gICAgdGlwQm94KVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaxh+aAu+aMh+agh+WNoSDDlzZcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIFN1bW1hcnlDYXJkcyhwcm9wcykge1xuICBjb25zdCB7IHRvdGFsLCBjdXJyZW5jeSwgdW5wcmljZWRDYWxscywgY3VycmVuY3lDb2RlLCBvbkN1cnJlbmN5Q2hhbmdlLCBieU1vZGVsIH0gPSBwcm9wc1xuICBjb25zdCB0dCA9IHVzZVQoKVxuICBjb25zdCBkID0gdG90YWwgfHwge31cbiAgY29uc3QgaW5wdXRUb3RhbCA9IChkLmlucHV0VG9rZW5zIHx8IDApICsgKGQuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKGQuY2FjaGVXcml0ZVRva2VucyB8fCAwKVxuICBjb25zdCBjYXJkcyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICd0b3RhbCcsIGljb246ICdsYXllcnMnLCBsYWJlbDogdHQoJ3RvdGFsVG9rZW5zJyksXG4gICAgICB2YWx1ZTogZm9ybWF0VG9rZW5zU2hvcnQoZC50b3RhbFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC50b3RhbFRva2VucyksXG4gICAgICBzdWI6IHR0KCdhcHByb3hJTycpLCBjb2xvcjogJ3ZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdpbnB1dCcsIGljb246ICdkb3duJywgbGFiZWw6IHR0KCdpbnB1dFRva2VucycpLFxuICAgICAgdmFsdWU6IGZvcm1hdFRva2Vuc1Nob3J0KGlucHV0VG90YWwpLCB0aXRsZTogZm9ybWF0SW50KGlucHV0VG90YWwpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnb3V0cHV0JywgaWNvbjogJ3VwJywgbGFiZWw6IHR0KCdvdXRwdXRUb2tlbnMnKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRUb2tlbnNTaG9ydChkLm91dHB1dFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC5vdXRwdXRUb2tlbnMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY2FsbHMnLCBpY29uOiAnYWN0aXZpdHknLCBsYWJlbDogdHQoJ2NhbGxzJyksXG4gICAgICB2YWx1ZTogZm9ybWF0SW50KGQuY2FsbHMpLCB0aXRsZTogZm9ybWF0SW50KGQuY2FsbHMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY29zdCcsIGljb246ICdjb2lucycsIGxhYmVsOiB0dCgnY29zdCcpLFxuICAgICAgLy8g56ym5Y+355SxIHByZWZpeCDnmoTluIHnp43liIfmjaLlmajnlLvvvIjlroPmmL7npLrlvZPliY3luIHnp43nrKblj7fvvInvvIzov5nph4zlj6rnu5nmlbDlrZdcbiAgICAgIHZhbHVlOiBjb3N0RGlnaXRzKGQuY29zdCksIHRpdGxlOiBmb3JtYXRDb3N0KGQuY29zdCwgY3VycmVuY3kpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgICAgcHJlZml4OiBoKEN1cnJlbmN5UGlja2VyLCB7IGNvZGU6IGN1cnJlbmN5Q29kZSwgb25DaGFuZ2U6IG9uQ3VycmVuY3lDaGFuZ2UgfSksXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdzaGFyZScsIGljb246ICdzaGFyZScsIGxhYmVsOiB0dCgnbW9kZWxTaGFyZScpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSknLFxuICAgICAgY29udGVudDogaChNb2RlbFNoYXJlQmFyLCB7IHJvd3M6IGJ5TW9kZWwsIGN1cnJlbmN5IH0pLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmRzJyB9LFxuICAgIGNhcmRzLm1hcCgoYykgPT5cbiAgICAgIGgoJ2RpdicsIHsga2V5OiBjLmtleSwgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1pY29uJywgc3R5bGU6IHsgY29sb3I6IGMuY29sb3IgfSB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6IGMuaWNvbiwgc2l6ZTogMTQgfSkpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWxhYmVsJyB9LCBjLmxhYmVsKSksXG4gICAgICAgIGMuY29udGVudFxuICAgICAgICAgID8gYy5jb250ZW50XG4gICAgICAgICAgOiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXZhbHVlJywgdGl0bGU6IGMudGl0bGUgfSwgYy5wcmVmaXggfHwgbnVsbCwgYy52YWx1ZSksXG4gICAgICAgIGMuc3ViID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1zdWInIH0sIGMuc3ViKSA6IG51bGwsXG4gICAgICAgIGMua2V5ID09PSAnY29zdCcgJiYgdW5wcmljZWRDYWxscyA+IDBcbiAgICAgICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtbm90ZScgfSwgdHQoJ3VucHJpY2VkTm90ZScsIHsgY291bnQ6IGZvcm1hdEludCh1bnByaWNlZENhbGxzKSB9KSlcbiAgICAgICAgICA6IG51bGwpKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmr4/ml6XnlKjph4/mn7Hnirblm77vvIjmiYvlhpkgZGl2IOWghuWPoOafse+8muS4i+autei+k+WFpeiTnSAvIOS4iuautei+k+WHuue7v++8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gRGFpbHlDaGFydChwcm9wcykge1xuICBjb25zdCB7IGRhaWx5LCBncmFuLCBzdGVwRGF5cywgZ3JhbkxhYmVsIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIGNvbnN0IGNoYXJ0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIGNvbnN0IFt0aXAsIHNldFRpcF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKSAvLyB7IHJvdywgeCB9XG4gIGNvbnN0IFt2aWV3LCBzZXRWaWV3XSA9IFJlYWN0LnVzZVN0YXRlKCdiYXInKSAvLyBiYXIgfCBsaW5lXG4gIGNvbnN0IHJvd3MgPSBkYWlseSB8fCBbXVxuXG4gIGNvbnN0IGluT2YgPSAocikgPT4gKHIuaW5wdXRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVJlYWRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVdyaXRlVG9rZW5zIHx8IDApXG4gIGNvbnN0IG91dE9mID0gKHIpID0+IHIub3V0cHV0VG9rZW5zIHx8IDBcbiAgY29uc3QgdG90T2YgPSAocikgPT4gci50b3RhbFRva2VucyB8fCAwXG5cbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWNoYXJ0LWNhcmQnIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgICAgaCgnaDMnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRpdGxlJyB9LCB0KCdkYWlseVRyZW5kJykpLFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10YWcnIH0sIHQoJ25vRGF0YScpKSksXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1lbXB0eS1ibG9jaycgfSwgdCgnbm9EYXRhJykpKVxuICB9XG5cbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMSwgLi4ucm93cy5tYXAoKGQpID0+IGQudG90YWxUb2tlbnMgfHwgMCkpXG4gIGNvbnN0IGxhYmVsRXZlcnkgPSByb3dzLmxlbmd0aCA+IDI4ID8gNCA6IHJvd3MubGVuZ3RoID4gMTQgPyAyIDogMVxuICBjb25zdCBmaXJzdExhYmVsID0geExhYmVsKHJvd3NbMF0ua2V5LCBncmFuKVxuICBjb25zdCBsYXN0TGFiZWwgPSB4TGFiZWwocm93c1tyb3dzLmxlbmd0aCAtIDFdLmtleSwgZ3JhbilcbiAgY29uc3QgcmFuZ2VMYWJlbCA9IGZpcnN0TGFiZWwgKyAnIC0gJyArIGxhc3RMYWJlbFxuXG4gIGZ1bmN0aW9uIHNob3dUaXAoZSwgcm93KSB7XG4gICAgY29uc3QgY2hhcnRSZWN0ID0gY2hhcnRSZWYuY3VycmVudCA/IGNoYXJ0UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsXG4gICAgaWYgKCFjaGFydFJlY3QpIHJldHVyblxuICAgIGNvbnN0IGVsUmVjdCA9IGUuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IHggPSBNYXRoLm1pbihNYXRoLm1heChlbFJlY3QubGVmdCArIGVsUmVjdC53aWR0aCAvIDIgLSBjaGFydFJlY3QubGVmdCwgNzIpLCBjaGFydFJlY3Qud2lkdGggLSA3MilcbiAgICBzZXRUaXAoeyByb3csIHggfSlcbiAgfVxuXG4gIGNvbnN0IHZpZXdTd2l0Y2hlciA9IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWdyYW4nLCByb2xlOiAnZ3JvdXAnLCAnYXJpYS1sYWJlbCc6IHQoJ2NoYXJ0VHlwZUdyb3VwJykgfSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1ncmFuLWJ0bicsXG4gICAgICAnZGF0YS1hY3RpdmUnOiB2aWV3ID09PSAnYmFyJyA/ICd0cnVlJyA6IHVuZGVmaW5lZCxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHsgc2V0VGlwKG51bGwpOyBzZXRWaWV3KCdiYXInKSB9LFxuICAgIH0sIHQoJ2JhclZpZXcnKSksXG4gICAgaCgnYnV0dG9uJywge1xuICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICBjbGFzc05hbWU6ICd0c2QtZ3Jhbi1idG4nLFxuICAgICAgJ2RhdGEtYWN0aXZlJzogdmlldyA9PT0gJ2xpbmUnID8gJ3RydWUnIDogdW5kZWZpbmVkLFxuICAgICAgb25DbGljazogKCkgPT4geyBzZXRUaXAobnVsbCk7IHNldFZpZXcoJ2xpbmUnKSB9LFxuICAgIH0sIHQoJ2xpbmVWaWV3JykpKVxuXG4gIGNvbnN0IGJhclRpcCA9IHRpcFxuICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcCcsIHN0eWxlOiB7IGxlZnQ6IHRpcC54ICsgJ3B4JyB9IH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZGF0ZScgfSwgdGlwLnJvdy5rZXkgKyAnICcgKyB3ZWVrZGF5TmFtZSh0aXAucm93LmtleSwgdCkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kb3QgdHNkLWxlZ2VuZC1pbicgfSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KGluT2YodGlwLnJvdykpKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZE91dHB1dCcpKSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC12YWwnIH0sIGZvcm1hdEludChvdXRPZih0aXAucm93KSkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC10b3RhbCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgndG9vbHRpcFRvdGFsJykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCBmb3JtYXRJbnQodG90T2YodGlwLnJvdykpKSkpXG4gICAgOiBudWxsXG5cbiAgY29uc3QgYm9keSA9IHZpZXcgPT09ICdsaW5lJ1xuICAgID8gaChMaW5lQ2hhcnQsIHsgcm93cywgZ3Jhbiwgc3RlcERheXMsIHNob3dUaXAsIHRpcCwgc2V0VGlwLCBjaGFydFJlZiB9KVxuICAgIDogaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQnLCByZWY6IGNoYXJ0UmVmIH0sXG4gICAgICAgIHJvd3MubWFwKChyb3csIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBpblQgPSBpbk9mKHJvdylcbiAgICAgICAgICBjb25zdCBvdXRUID0gb3V0T2Yocm93KVxuICAgICAgICAgIGNvbnN0IHRvdFQgPSB0b3RPZihyb3cpXG4gICAgICAgICAgY29uc3QgcGN0SW4gPSAoaW5UIC8gbWF4KSAqIDEwMFxuICAgICAgICAgIGNvbnN0IHBjdE91dCA9IChvdXRUIC8gbWF4KSAqIDEwMFxuICAgICAgICAgIGNvbnN0IHNob3dMYWJlbCA9IGkgJSBsYWJlbEV2ZXJ5ID09PSAwIHx8IGkgPT09IHJvd3MubGVuZ3RoIC0gMVxuICAgICAgICAgIHJldHVybiBoKCdkaXYnLCB7XG4gICAgICAgICAgICBrZXk6IHJvdy5rZXksXG4gICAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtY2hhcnQtY29sJyxcbiAgICAgICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAgICAgb25Nb3VzZUVudGVyOiAoZSkgPT4gc2hvd1RpcChlLCByb3cpLFxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiAoKSA9PiBzZXRUaXAobnVsbCksXG4gICAgICAgICAgICBvbkZvY3VzOiAoZSkgPT4gc2hvd1RpcChlLCByb3cpLFxuICAgICAgICAgICAgb25CbHVyOiAoKSA9PiBzZXRUaXAobnVsbCksXG4gICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQoJ2JhckFyaWEnLCB7IGtleTogcm93LmtleSwgaW46IGZvcm1hdEludChpblQpLCBvdXQ6IGZvcm1hdEludChvdXRUKSwgdG90OiBmb3JtYXRJbnQodG90VCkgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNoYXJ0LXBsb3QnIH0sXG4gICAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNoYXJ0LXN0YWNrJyB9LFxuICAgICAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNoYXJ0LXNlZyB0c2Qtc2VnLW91dCcsIHN0eWxlOiB7IGhlaWdodDogcGN0T3V0ICsgJyUnIH0gfSksXG4gICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc2VnIHRzZC1zZWctaW4nLCBzdHlsZTogeyBoZWlnaHQ6IHBjdEluICsgJyUnIH0gfSkpKSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1jaGFydC1sYWJlbCcgKyAoc2hvd0xhYmVsID8gJycgOiAnIHRzZC1jaGFydC1sYWJlbC1oaWRkZW4nKSxcbiAgICAgICAgICAgIH0sIHhMYWJlbChyb3cua2V5LCBncmFuKSkpXG4gICAgICAgIH0pLFxuICAgICAgICBiYXJUaXApXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWNoYXJ0LWNhcmQnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1oZWFkZXInIH0sXG4gICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2RhaWx5VHJlbmQnKSksXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1hY3Rpb25zJyB9LFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10YWcnIH0sIGdyYW5MYWJlbCArICcgwrcgJyArIHJhbmdlTGFiZWwpLFxuICAgICAgICB2aWV3U3dpdGNoZXIpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQnIH0sXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbGVnZW5kLWl0ZW0nIH0sXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtZG90IHRzZC1sZWdlbmQtaW4nIH0pLCB0KCdsZWdlbmRJbnB1dCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC1vdXQnIH0pLCB0KCdsZWdlbmRPdXRwdXQnKSksXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbGVnZW5kLWl0ZW0nIH0sXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtZG90IHRzZC1sZWdlbmQtdG90YWwnIH0pLCB0KCdsZWdlbmRUb3RhbCcpKSksXG4gICAgYm9keSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmipjnur/lm77vvIhTVkfvvJrovpPlhaUgLyDovpPlh7ogLyDmgLsgVG9rZW7vvIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8qKiBDYXRtdWxsLVJvbSAtPiBjdWJpYyBiZXppZXIgc21vb3RoIHBhdGggdGhyb3VnaCB0aGUgZ2l2ZW4gcG9pbnRzLiAqL1xuZnVuY3Rpb24gc21vb3RoUGF0aChwdHMpIHtcbiAgaWYgKCFwdHMgfHwgcHRzLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICBjb25zdCBmID0gKHYpID0+IE1hdGgucm91bmQodiAqIDEwMCkgLyAxMDBcbiAgbGV0IGQgPSAnTSAnICsgZihwdHNbMF0ueCkgKyAnICcgKyBmKHB0c1swXS55KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHB0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwMCA9IHB0c1tpIC0gMV0gfHwgcHRzW2ldXG4gICAgY29uc3QgcDEgPSBwdHNbaV1cbiAgICBjb25zdCBwMiA9IHB0c1tpICsgMV1cbiAgICBjb25zdCBwMyA9IHB0c1tpICsgMl0gfHwgcDJcbiAgICBjb25zdCBjMXggPSBwMS54ICsgKHAyLnggLSBwMC54KSAvIDZcbiAgICBjb25zdCBjMXkgPSBwMS55ICsgKHAyLnkgLSBwMC55KSAvIDZcbiAgICBjb25zdCBjMnggPSBwMi54IC0gKHAzLnggLSBwMS54KSAvIDZcbiAgICBjb25zdCBjMnkgPSBwMi55IC0gKHAzLnkgLSBwMS55KSAvIDZcbiAgICBkICs9ICcgQyAnICsgZihjMXgpICsgJyAnICsgZihjMXkpICsgJywgJyArIGYoYzJ4KSArICcgJyArIGYoYzJ5KSArICcsICcgKyBmKHAyLngpICsgJyAnICsgZihwMi55KVxuICB9XG4gIHJldHVybiBkXG59XG5cbmZ1bmN0aW9uIExpbmVDaGFydChwcm9wcykge1xuICBjb25zdCB7IHJvd3MsIGdyYW4sIHN0ZXBEYXlzLCBzaG93VGlwLCB0aXAsIHNldFRpcCwgY2hhcnRSZWYgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgVyA9IDYyMFxuICBjb25zdCBIID0gMjQwXG4gIGNvbnN0IFBBRCA9IHsgdDogMTQsIHI6IDE0LCBiOiAyNiwgbDogNDggfVxuICBjb25zdCBpbm5lclcgPSBXIC0gUEFELmwgLSBQQUQuclxuICBjb25zdCBpbm5lckggPSBIIC0gUEFELnQgLSBQQUQuYlxuICBjb25zdCBuID0gcm93cy5sZW5ndGhcblxuICBjb25zdCBpbk9mID0gKHIpID0+IChyLmlucHV0VG9rZW5zIHx8IDApICsgKHIuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKHIuY2FjaGVXcml0ZVRva2VucyB8fCAwKVxuICBjb25zdCBvdXRPZiA9IChyKSA9PiByLm91dHB1dFRva2VucyB8fCAwXG4gIGNvbnN0IHRvdE9mID0gKHIpID0+IHIudG90YWxUb2tlbnMgfHwgMFxuICBjb25zdCBtYXggPSBNYXRoLm1heCgxLCAuLi5yb3dzLm1hcCgoZCkgPT4gZC50b3RhbFRva2VucyB8fCAwKSlcbiAgY29uc3QgbmljZU1heCA9IG5pY2VDZWlsKG1heClcblxuICBjb25zdCB4ID0gKGkpID0+IFBBRC5sICsgKG4gPT09IDEgPyBpbm5lclcgLyAyIDogKGkgLyAobiAtIDEpKSAqIGlubmVyVylcbiAgY29uc3QgeSA9ICh2KSA9PiBQQUQudCArIGlubmVySCAtICh2IC8gbmljZU1heCkgKiBpbm5lckhcbiAgY29uc3QgY29sVyA9IGlubmVyVyAvIG5cblxuICAvLyBIb3ZlciBzdGF0ZTogcGl4ZWwgeCBmb3IgdGhlIHRvb2x0aXAsIHZpZXdCb3ggeCBmb3IgdGhlIGN1cnNvciArIGRvdHMuXG4gIGZ1bmN0aW9uIHNob3dUaXBMaW5lKGUsIHJvdykge1xuICAgIGNvbnN0IHJlY3QgPSBjaGFydFJlZi5jdXJyZW50ID8gY2hhcnRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGxcbiAgICBpZiAoIXJlY3QgfHwgcmVjdC53aWR0aCA9PT0gMCkgcmV0dXJuXG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgeFB4ID0gZWxSZWN0LmxlZnQgKyBlbFJlY3Qud2lkdGggLyAyIC0gcmVjdC5sZWZ0XG4gICAgY29uc3Qgc3ZnWCA9ICh4UHggLyByZWN0LndpZHRoKSAqIFdcbiAgICBjb25zdCB4ID0gTWF0aC5taW4oTWF0aC5tYXgoeFB4LCA3MiksIHJlY3Qud2lkdGggLSA3MilcbiAgICBzZXRUaXAoeyByb3csIHgsIHN2Z1ggfSlcbiAgfVxuICBjb25zdCB0cm93ID0gdGlwID8gdGlwLnJvdyA6IG51bGxcbiAgY29uc3QgY3Vyc29yID0gdGlwXG4gICAgPyBoKCdsaW5lJywge1xuICAgICAgICBrZXk6ICdjdXJzb3InLFxuICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1jdXJzb3InLFxuICAgICAgICB4MTogdGlwLnN2Z1gsIHkxOiBQQUQudCwgeDI6IHRpcC5zdmdYLCB5MjogSCAtIFBBRC5iLFxuICAgICAgfSlcbiAgICA6IG51bGxcbiAgY29uc3QgZG90cyA9IHRpcFxuICAgID8gW1xuICAgICAgICBoKCdjaXJjbGUnLCB7IGtleTogJ2hsLWluJywgY2xhc3NOYW1lOiAndHNkLWxpbmUtaGwgdHNkLWxpbmUtaGwtaW4nLCBjeDogdGlwLnN2Z1gsIGN5OiB5KGluT2YodHJvdykpLCByOiAzLjUgfSksXG4gICAgICAgIGgoJ2NpcmNsZScsIHsga2V5OiAnaGwtb3V0JywgY2xhc3NOYW1lOiAndHNkLWxpbmUtaGwgdHNkLWxpbmUtaGwtb3V0JywgY3g6IHRpcC5zdmdYLCBjeTogeShvdXRPZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgICAgaCgnY2lyY2xlJywgeyBrZXk6ICdobC10b3QnLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC10b3RhbCcsIGN4OiB0aXAuc3ZnWCwgY3k6IHkodG90T2YodHJvdykpLCByOiAzLjUgfSksXG4gICAgICBdXG4gICAgOiBudWxsXG5cbiAgY29uc3QgaW5QdHMgPSBzbW9vdGhQYXRoKHJvd3MubWFwKChyLCBpKSA9PiAoeyB4OiB4KGkpLCB5OiB5KGluT2YocikpIH0pKSlcbiAgY29uc3Qgb3V0UHRzID0gc21vb3RoUGF0aChyb3dzLm1hcCgociwgaSkgPT4gKHsgeDogeChpKSwgeTogeShvdXRPZihyKSkgfSkpKVxuICBjb25zdCB0b3RQdHMgPSBzbW9vdGhQYXRoKHJvd3MubWFwKChyLCBpKSA9PiAoeyB4OiB4KGkpLCB5OiB5KHRvdE9mKHIpKSB9KSkpXG4gIGNvbnN0IGdyaWRGID0gWzAsIDAuMjUsIDAuNSwgMC43NSwgMV1cbiAgY29uc3QgbGFiZWxFdmVyeSA9IHJvd3MubGVuZ3RoID4gMjggPyA0IDogcm93cy5sZW5ndGggPiAxNCA/IDIgOiAxXG4gIGNvbnN0IHNob3dMYWJlbCA9IChpKSA9PiBpICUgbGFiZWxFdmVyeSA9PT0gMCB8fCBpID09PSByb3dzLmxlbmd0aCAtIDFcblxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtbGluZWNoYXJ0JywgcmVmOiBjaGFydFJlZiB9LFxuICAgIGgoJ3N2ZycsIHsgdmlld0JveDogJzAgMCAnICsgVyArICcgJyArIEgsIHJvbGU6ICdpbWcnLCAnYXJpYS1sYWJlbCc6IHQoJ2xpbmVDaGFydEFyaWEnKSB9LFxuICAgICAgLy8gZ3JpZCArIGF4aXNcbiAgICAgIGdyaWRGLm1hcCgoZikgPT5cbiAgICAgICAgaCgnbGluZScsIHtcbiAgICAgICAgICBrZXk6ICdnJyArIGYsXG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWxpbmUtZ3JpZCcsXG4gICAgICAgICAgeDE6IFBBRC5sLCB5MTogeShmICogbmljZU1heCksIHgyOiBXIC0gUEFELnIsIHkyOiB5KGYgKiBuaWNlTWF4KSxcbiAgICAgICAgfSkpLFxuICAgICAgaCgnbGluZScsIHsgY2xhc3NOYW1lOiAndHNkLWxpbmUtYXhpcycsIHgxOiBQQUQubCwgeTE6IFBBRC50LCB4MjogUEFELmwsIHkyOiBIIC0gUEFELmIgfSksXG4gICAgICBoKCdsaW5lJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1heGlzJywgeDE6IFBBRC5sLCB5MTogSCAtIFBBRC5iLCB4MjogVyAtIFBBRC5yLCB5MjogSCAtIFBBRC5iIH0pLFxuICAgICAgLy8geSBsYWJlbHNcbiAgICAgIGdyaWRGLm1hcCgoZikgPT5cbiAgICAgICAgaCgndGV4dCcsIHtcbiAgICAgICAgICBrZXk6ICd5dCcgKyBmLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLXRleHQnLFxuICAgICAgICAgIHg6IFBBRC5sIC0gNixcbiAgICAgICAgICB5OiB5KGYgKiBuaWNlTWF4KSArIDMsXG4gICAgICAgICAgdGV4dEFuY2hvcjogJ2VuZCcsXG4gICAgICAgIH0sIGZvcm1hdFRva2Vuc1Nob3J0KGYgKiBuaWNlTWF4KSkpLFxuICAgICAgLy8gc2VyaWVzIChzbW9vdGggY3VydmVzKVxuICAgICAgaCgncGF0aCcsIHsgY2xhc3NOYW1lOiAndHNkLWxpbmUtdG90YWwnLCBkOiB0b3RQdHMgfSksXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1pbicsIGQ6IGluUHRzIH0pLFxuICAgICAgaCgncGF0aCcsIHsgY2xhc3NOYW1lOiAndHNkLWxpbmUtb3V0JywgZDogb3V0UHRzIH0pLFxuICAgICAgY3Vyc29yLFxuICAgICAgZG90cyxcbiAgICAgIC8vIHggbGFiZWxzXG4gICAgICByb3dzLm1hcCgociwgaSkgPT5cbiAgICAgICAgc2hvd0xhYmVsKGkpXG4gICAgICAgICAgPyBoKCd0ZXh0Jywge1xuICAgICAgICAgICAgICBrZXk6ICd4bCcgKyBpLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS10ZXh0JyxcbiAgICAgICAgICAgICAgeDogeChpKSxcbiAgICAgICAgICAgICAgeTogSCAtIDgsXG4gICAgICAgICAgICAgIHRleHRBbmNob3I6IGkgPT09IDAgPyAnc3RhcnQnIDogaSA9PT0gbiAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnLFxuICAgICAgICAgICAgfSwgeExhYmVsKHIua2V5LCBncmFuKSlcbiAgICAgICAgICA6IG51bGwpLFxuICAgICAgLy8gaG92ZXIgdGFyZ2V0czogYSBmdWxsLWhlaWdodCBjb2x1bW4gcGVyIGJ1Y2tldCwgbWF0Y2hpbmcgdGhlIGJhciBjaGFydCBmZWVsXG4gICAgICByb3dzLm1hcCgociwgaSkgPT5cbiAgICAgICAgaCgncmVjdCcsIHtcbiAgICAgICAgICBrZXk6ICdoJyArIGksXG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWxpbmUtaG92ZXInLFxuICAgICAgICAgIHg6IHgoaSkgLSBjb2xXIC8gMixcbiAgICAgICAgICB5OiBQQUQudCxcbiAgICAgICAgICB3aWR0aDogY29sVyxcbiAgICAgICAgICBoZWlnaHQ6IGlubmVySCxcbiAgICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgICBvbk1vdXNlRW50ZXI6IChlKSA9PiBzaG93VGlwTGluZShlLCByKSxcbiAgICAgICAgICBvbk1vdXNlTGVhdmU6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICBvbkZvY3VzOiAoZSkgPT4gc2hvd1RpcExpbmUoZSwgciksXG4gICAgICAgICAgb25CbHVyOiAoKSA9PiBzZXRUaXAobnVsbCksXG4gICAgICAgIH0pKSxcbiAgICAgIC8vIHZpc2libGUgZG90cyBvbiBzcGFyc2UgcG9pbnRzXG4gICAgICByb3dzLm1hcCgociwgaSkgPT5cbiAgICAgICAgaSAlIGxhYmVsRXZlcnkgPT09IDAgfHwgaSA9PT0gbiAtIDFcbiAgICAgICAgICA/IGgoJ2NpcmNsZScsIHtcbiAgICAgICAgICAgICAga2V5OiAnZCcgKyBpLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1kb3QnLFxuICAgICAgICAgICAgICBjeDogeChpKSxcbiAgICAgICAgICAgICAgY3k6IHkodG90T2YocikpLFxuICAgICAgICAgICAgICByOiAyLjUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCkpLFxuICAgIHRpcFxuICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwJywgc3R5bGU6IHsgbGVmdDogdGlwLnggKyAncHgnIH0gfSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRhdGUnIH0sIHRpcC5yb3cua2V5ICsgKHN0ZXBEYXlzID4gMSA/ICcgJyArIHQoJ3N0YXJ0TkRheXMnLCB7IG46IHN0ZXBEYXlzIH0pIDogJycpICsgJyAnICsgd2Vla2RheU5hbWUodGlwLnJvdy5rZXksIHQpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLWluJyB9KSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdsZWdlbmRJbnB1dCcpKSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KGluT2YodGlwLnJvdykpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kb3QgdHNkLWxlZ2VuZC1vdXQnIH0pLFxuICAgICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZE91dHB1dCcpKSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KG91dE9mKHRpcC5yb3cpKSkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdG90YWwnIH0sXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgndG9vbHRpcFRvdGFsJykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIG51bGwsIGZvcm1hdEludCh0b3RPZih0aXAucm93KSkpKSlcbiAgICAgIDogbnVsbClcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDlubTluqbnlKjph4/ng63lipvlm77vvIhHaXRIdWIg6aOO5qC877yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBIZWF0bWFwQ2FyZChwcm9wcykge1xuICBjb25zdCB7IGRheXMgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW2h0aXAsIHNldEh0aXBdID0gUmVhY3QudXNlU3RhdGUobnVsbCkgLy8geyBjZWxsLCBsZWZ0LCB0b3AgfSBpbiB2aWV3cG9ydCBjb29yZHNcbiAgY29uc3QgZ3JpZCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBkYXlzIHx8IFtdXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KDEsIC4uLmxpc3QubWFwKChkKSA9PiBkLnRvdGFsVG9rZW5zIHx8IDApKVxuICAgIGNvbnN0IGZpcnN0ID0gbmV3IERhdGUobGlzdFswXS5rZXkgKyAnVDAwOjAwOjAwJylcbiAgICBjb25zdCBvZmZzZXQgPSBmaXJzdC5nZXREYXkoKSAvLyAwID0gU3VuZGF5XG4gICAgY29uc3Qgd2Vla3MgPSBbXVxuICAgIGxldCBjdXIgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIGN1ci5wdXNoKG51bGwpXG4gICAgZm9yIChjb25zdCBkIG9mIGxpc3QpIHtcbiAgICAgIGN1ci5wdXNoKGQpXG4gICAgICBpZiAoY3VyLmxlbmd0aCA9PT0gNykge1xuICAgICAgICB3ZWVrcy5wdXNoKGN1cilcbiAgICAgICAgY3VyID0gW11cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1ci5sZW5ndGggPiAwKSB7XG4gICAgICB3aGlsZSAoY3VyLmxlbmd0aCA8IDcpIGN1ci5wdXNoKG51bGwpXG4gICAgICB3ZWVrcy5wdXNoKGN1cilcbiAgICB9XG4gICAgLy8g5pyI5Lu95qCH6K6w77ya5p+Q5pyIIDEg5pel5omA5Zyo55qE5YiXXG4gICAgY29uc3QgbW9udGhNYXJrcyA9IFtdXG4gICAgd2Vla3MuZm9yRWFjaCgod2ssIGNvbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHdrKSB7XG4gICAgICAgIGlmIChjICYmIGMua2V5LmVuZHNXaXRoKCctMDEnKSkge1xuICAgICAgICAgIG1vbnRoTWFya3MucHVzaCh7IGNvbCwgbmFtZTogdCgnbW9udGhMYWJlbCcsIHsgbjogTnVtYmVyKGMua2V5LnNsaWNlKDUsIDcpKSB9KSB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB7IHdlZWtzLCBtYXgsIG1vbnRoTWFya3MgfVxuICB9LCBbZGF5c10pXG5cbiAgaWYgKGdyaWQgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgZnVuY3Rpb24gc2hvd0NlbGxUaXAoZSwgYykge1xuICAgIGNvbnN0IGVsUmVjdCA9IGUuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIHNldEh0aXAoeyBjZWxsOiBjLCBsZWZ0OiBlbFJlY3QubGVmdCArIGVsUmVjdC53aWR0aCAvIDIsIHRvcDogZWxSZWN0LnRvcCB9KVxuICB9XG5cbiAgY29uc3QgaGVhdFRpcCA9IGh0aXBcbiAgICA/IGgoJ2RpdicsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAgdHNkLWhlYXQtdGlwJyxcbiAgICAgICAgc3R5bGU6IHsgcG9zaXRpb246ICdmaXhlZCcsIGxlZnQ6IGh0aXAubGVmdCArICdweCcsIHRvcDogaHRpcC50b3AgKyAncHgnLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTExMCUpJyB9LFxuICAgICAgfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kYXRlJyB9LCBodGlwLmNlbGwua2V5ICsgJyAnICsgd2Vla2RheU5hbWUoaHRpcC5jZWxsLmtleSwgdCkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kb3QnLCBzdHlsZTogeyBiYWNrZ3JvdW5kOiAndmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApJyB9IH0pLFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b3RhbFRva2VucycpKSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC12YWwnIH0sIGZvcm1hdEludChodGlwLmNlbGwudG90YWxUb2tlbnMgfHwgMCkpKSxcbiAgICAgICAgaHRpcC5jZWxsLmNhbGxzID4gMFxuICAgICAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCcsIHN0eWxlOiB7IGJhY2tncm91bmQ6ICd2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpJyB9IH0pLFxuICAgICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnY2FsbHMnKSksXG4gICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KGh0aXAuY2VsbC5jYWxscykpKVxuICAgICAgICAgIDogbnVsbClcbiAgICA6IG51bGxcblxuICBjb25zdCBkYXlOYW1lcyA9IFsnJywgdCgnd2Vla2RheU1vbicpLCAnJywgdCgnd2Vla2RheVdlZCcpLCAnJywgdCgnd2Vla2RheUZyaScpLCAnJ11cbiAgY29uc3QgbGVnZW5kU3RlcHMgPSBbMCwgMC4yNSwgMC41LCAwLjc1LCAxXVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1oZWF0bWFwLWNhcmQnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1oZWFkZXInIH0sXG4gICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ3llYXJseUhlYXRtYXAnKSksXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10YWcnIH0sIHQoJ3llYXJEYWlseScsIHsgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIH0pKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcCcgfSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtaW5uZXInIH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtbW9udGhzJyB9LFxuICAgICAgICAgIGdyaWQubW9udGhNYXJrcy5tYXAoKG0pID0+XG4gICAgICAgICAgICBoKCdzcGFuJywge1xuICAgICAgICAgICAgICBrZXk6IG0uY29sLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1tb250aCcsXG4gICAgICAgICAgICAgIHN0eWxlOiB7IGxlZnQ6IChtLmNvbCAqIDEyKSArICdweCcgfSxcbiAgICAgICAgICAgIH0sIG0ubmFtZSkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1ib2R5JyB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtZGF5cycgfSxcbiAgICAgICAgICAgIGRheU5hbWVzLm1hcCgobiwgaSkgPT5cbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsga2V5OiBpLCBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1kYXknIH0sIG4pKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1ncmlkJyB9LFxuICAgICAgICAgICAgZ3JpZC53ZWVrcy5tYXAoKHdrLCBjb2wpID0+XG4gICAgICAgICAgICAgIGgoJ2RpdicsIHsga2V5OiBjb2wsIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWNvbCcgfSxcbiAgICAgICAgICAgICAgICB3ay5tYXAoKGMsIHJvdykgPT5cbiAgICAgICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICAgICAgICAgPyBoKCdzcGFuJywge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBjLmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZDogaGVhdENvbG9yKGMudG90YWxUb2tlbnMgfHwgMCwgZ3JpZC5tYXgpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdCgnaG1UaXRsZScsIHsga2V5OiBjLmtleSwgdG9rZW5zOiBmb3JtYXRJbnQoYy50b3RhbFRva2VucyB8fCAwKSwgY2FsbHM6IGMuY2FsbHMgPyB0KCdobUNhbGxzJywgeyBjb3VudDogZm9ybWF0SW50KGMuY2FsbHMpIH0pIDogJycgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI6IChlKSA9PiBzaG93Q2VsbFRpcChlLCBjKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZTogKCkgPT4gc2V0SHRpcChudWxsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93Q2VsbFRpcChlLCBjKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQmx1cjogKCkgPT4gc2V0SHRpcChudWxsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogaCgnc3BhbicsIHsga2V5OiAnZScgKyBjb2wgKyAnLScgKyByb3csIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWNlbGwnLCBzdHlsZTogeyB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9IH0pKSkpKSkpLFxuICAgIGhlYXRUaXAsXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1sZWdlbmQnIH0sXG4gICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVzcycpKSxcbiAgICAgIGxlZ2VuZFN0ZXBzLm1hcCgocykgPT5cbiAgICAgICAgaCgnc3BhbicsIHtcbiAgICAgICAgICBrZXk6IHMsXG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsXG4gICAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZDogcyA9PT0gMCA/ICd2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpJyA6IGhlYXRDb2xvcihNYXRoLm1heCgxLCBzICogMTAwKSwgMTAwKSB9LFxuICAgICAgICB9KSksXG4gICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbW9yZScpKSkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaMieaooeWei+aYjue7huihqFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gTW9kZWxUYWJsZShwcm9wcykge1xuICBjb25zdCB7IHJvd3MsIGN1cnJlbmN5IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIGNvbnN0IGFsbCA9IHJvd3MgfHwgW11cbiAgY29uc3QgW3NvcnRLZXksIHNldFNvcnRLZXldID0gUmVhY3QudXNlU3RhdGUoJ3RvdGFsJylcbiAgY29uc3QgW3NvcnREaXIsIHNldFNvcnREaXJdID0gUmVhY3QudXNlU3RhdGUoJ2Rlc2MnKVxuXG4gIGNvbnN0IHZpZXcgPSBSZWFjdC51c2VNZW1vKCgpID0+IGFsbC5tYXAoKHIpID0+ICh7XG4gICAga2V5OiByLmtleSxcbiAgICBjYWxsczogci5jYWxscyB8fCAwLFxuICAgIGlucHV0OiAoci5pbnB1dFRva2VucyB8fCAwKSArIChyLmNhY2hlUmVhZFRva2VucyB8fCAwKSArIChyLmNhY2hlV3JpdGVUb2tlbnMgfHwgMCksXG4gICAgb3V0cHV0OiByLm91dHB1dFRva2VucyB8fCAwLFxuICAgIHRvdGFsOiByLnRvdGFsVG9rZW5zIHx8IDAsXG4gICAgY29zdDogci5jb3N0IHx8IDAsXG4gICAgdW5wcmljZWQ6IChyLnRvdGFsVG9rZW5zIHx8IDApID4gMCAmJiAhKHIuY29zdCA+IDApLFxuICB9KSksIFthbGxdKVxuXG4gIGNvbnN0IHN1bVRvdGFsID0gUmVhY3QudXNlTWVtbygoKSA9PiB2aWV3LnJlZHVjZSgocywgcikgPT4gcyArIHIudG90YWwsIDApLCBbdmlld10pXG5cbiAgY29uc3Qgc29ydGVkID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IHZpZXcuc2xpY2UoKVxuICAgIGNvbnN0IGRpciA9IHNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xXG4gICAgbGlzdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhdiA9IGFbc29ydEtleV1cbiAgICAgIGNvbnN0IGJ2ID0gYltzb3J0S2V5XVxuICAgICAgaWYgKGF2ID09PSBidikgcmV0dXJuIDBcbiAgICAgIHJldHVybiAoYXYgPiBidiA/IDEgOiAtMSkgKiBkaXJcbiAgICB9KVxuICAgIHJldHVybiBsaXN0XG4gIH0sIFt2aWV3LCBzb3J0S2V5LCBzb3J0RGlyXSlcblxuICBmdW5jdGlvbiB0b2dnbGVTb3J0KGtleSkge1xuICAgIGlmIChzb3J0S2V5ID09PSBrZXkpIHNldFNvcnREaXIoKGQpID0+IChkID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnKSlcbiAgICBlbHNlIHsgc2V0U29ydEtleShrZXkpOyBzZXRTb3J0RGlyKCdkZXNjJykgfVxuICB9XG5cbiAgY29uc3QgY29scyA9IFtcbiAgICB7IGtleTogJ21vZGVsJywgbGFiZWw6IHQoJ2NvbE1vZGVsJyksIHNvcnRhYmxlOiBmYWxzZSB9LFxuICAgIHsga2V5OiAnY2FsbHMnLCBsYWJlbDogdCgnY29sQ2FsbHMnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ2lucHV0JywgbGFiZWw6IHQoJ2NvbElucHV0JyksIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdvdXRwdXQnLCBsYWJlbDogdCgnY29sT3V0cHV0JyksIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICd0b3RhbCcsIGxhYmVsOiB0KCdjb2xUb3RhbCcpLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAnY29zdCcsIGxhYmVsOiB0KCdjb2xDb3N0JyksIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdyYXRpbycsIGxhYmVsOiB0KCdjb2xTaGFyZScpLCBzb3J0YWJsZTogZmFsc2UgfSxcbiAgXVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC10YWJsZS1jYXJkJyB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZGVyJyB9LFxuICAgICAgaCgnaDMnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRpdGxlJyB9LCB0KCdieU1vZGVsVGl0bGUnKSksXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10YWcnIH0sXG4gICAgICAgIHQoJ21vZGVsQ291bnQnLCB7IG46IHZpZXcubGVuZ3RoIH0pICsgJyDCtyAnICsgdCgnY29sVG90YWwnKSArICcgJyArIGZvcm1hdEludChzdW1Ub3RhbCkpKSxcbiAgICB2aWV3Lmxlbmd0aCA9PT0gMFxuICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1lbXB0eS1ibG9jaycgfSwgdCgnbm9EYXRhJykpXG4gICAgICA6IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRhYmxlLXdyYXAnIH0sXG4gICAgICAgICAgaCgndGFibGUnLCB7IGNsYXNzTmFtZTogJ3RzZC10YWJsZScgfSxcbiAgICAgICAgICAgIGgoJ2NhcHRpb24nLCB7IGNsYXNzTmFtZTogJ3RzZC12aXN1YWxseS1oaWRkZW4nIH0sIHQoJ21vZGVsVGFibGVDYXB0aW9uJykpLFxuICAgICAgICAgICAgaCgndGhlYWQnLCBudWxsLFxuICAgICAgICAgICAgICBoKCd0cicsIG51bGwsIGNvbHMubWFwKChjKSA9PlxuICAgICAgICAgICAgICAgIGgoJ3RoJywge1xuICAgICAgICAgICAgICAgICAga2V5OiBjLmtleSxcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC10aCcgKyAoYy5rZXkgPT09ICdtb2RlbCcgPyAnJyA6ICcgdHNkLXRoLW51bScpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjLnNvcnRhYmxlXG4gICAgICAgICAgICAgICAgICAgID8gaCgnYnV0dG9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICd0c2Qtc29ydC1idG4nICsgKHNvcnRLZXkgPT09IGMua2V5ID8gJyB0c2Qtc29ydC1hY3RpdmUnIDogJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdG9nZ2xlU29ydChjLmtleSksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGMubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0S2V5ID09PSBjLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1zb3J0LWFycm93JyB9LCBzb3J0RGlyID09PSAnYXNjJyA/ICfihpEnIDogJ+KGkycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbClcbiAgICAgICAgICAgICAgICAgICAgOiBjLmxhYmVsKSkpKSxcbiAgICAgICAgICAgIGgoJ3Rib2R5JywgbnVsbCwgc29ydGVkLm1hcCgocikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHN1bVRvdGFsID4gMCA/IHIudG90YWwgLyBzdW1Ub3RhbCA6IDBcbiAgICAgICAgICAgICAgcmV0dXJuIGgoJ3RyJywgeyBrZXk6IHIua2V5LCBjbGFzc05hbWU6ICd0c2QtdHInIH0sXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtdGQtbW9kZWwnIH0sXG4gICAgICAgICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbW9kZWwtbW9ubycsIHRpdGxlOiByLmtleSB9LCByLmtleSkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bScgfSwgZm9ybWF0SW50KHIuY2FsbHMpKSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC1udW0nIH0sIGZvcm1hdEludChyLmlucHV0KSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LCBmb3JtYXRJbnQoci5vdXRwdXQpKSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC1udW0gdHNkLXRvdGFsJyB9LCBmb3JtYXRJbnQoci50b3RhbCkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bScgfSxcbiAgICAgICAgICAgICAgICAgIHIudW5wcmljZWRcbiAgICAgICAgICAgICAgICAgICAgPyBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtdW5wcmljZWQnLCB0aXRsZTogdCgndW5wcmljZWRSb3dIaW50JykgfSwgdCgndW5wcmljZWQnKSlcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRDb3N0KHIuY29zdCwgY3VycmVuY3kpKSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC10ZC1yYXRpbycgfSxcbiAgICAgICAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXJhdGlvJyB9LFxuICAgICAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1yYXRpby1iYXInIH0sXG4gICAgICAgICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8tZmlsbCcsIHN0eWxlOiB7IHdpZHRoOiByYXRpbyAqIDEwMCArICclJyB9IH0pKSxcbiAgICAgICAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXJhdGlvLXBjdCcgfSwgZm10UGN0KHJhdGlvKSkpKSlcbiAgICAgICAgICAgIH0pKSkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOS4ieaAge+8muWKoOi9vSAvIOmUmeivryAvIOepulxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gTG9hZGluZ1N0YXRlKCkge1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1sb2FkaW5nJyB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmRzJyB9LFxuICAgICAgWzAsIDEsIDIsIDMsIDRdLm1hcCgoaSkgPT5cbiAgICAgICAgaCgnZGl2JywgeyBrZXk6IGksIGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1jYXJkLXNrZWxldG9uJyB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNrZWxldG9uJywgc3R5bGU6IHsgd2lkdGg6ICc0MCUnLCBoZWlnaHQ6IDEyIH0gfSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzcwJScsIGhlaWdodDogMjIsIG1hcmdpblRvcDogMTAgfSB9KSkpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkJyB9LFxuICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6IDMwMCB9IH0pKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkJyB9LFxuICAgICAgWzAsIDEsIDIsIDMsIDQsIDVdLm1hcCgoaSkgPT5cbiAgICAgICAgaCgnZGl2JywgeyBrZXk6IGksIGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbi1yb3cnLCBzdHlsZTogeyB3aWR0aDogOTYgLSBpICogOCArICclJyB9IH0pKSkpXG59XG5cbmZ1bmN0aW9uIEVycm9yU3RhdGUocHJvcHMpIHtcbiAgY29uc3QgeyBlcnJvciwgb25SZXRyeSB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtZXJyb3InLCByb2xlOiAnYWxlcnQnIH0sXG4gICAgaChTdmdJY29uLCB7IG5hbWU6ICdhbGVydCcsIHNpemU6IDIyLCBjbGFzc05hbWU6ICd0c2QtZXJyb3ItaWNvbicgfSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtZXJyb3ItdGV4dCcgfSxcbiAgICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1lcnJvci10aXRsZScgfSwgdCgnbG9hZEZhaWxlZFRpdGxlJykpLFxuICAgICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWVycm9yLWRldGFpbCcgfSwgU3RyaW5nKChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcikpKSxcbiAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tcHJpbWFyeScsIG9uQ2xpY2s6IG9uUmV0cnkgfSwgdCgncmV0cnknKSkpXG59XG5cbmZ1bmN0aW9uIEVtcHR5U3RhdGUocHJvcHMpIHtcbiAgY29uc3QgeyBmaWx0ZXJlZCwgb25SZXNldCB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtZW1wdHknIH0sXG4gICAgaChTdmdJY29uLCB7IG5hbWU6ICdpbmJveCcsIHNpemU6IDI4LCBjbGFzc05hbWU6ICd0c2QtZW1wdHktaWNvbicgfSksXG4gICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LXRpdGxlJyB9LCB0KCdub0RhdGEnKSksXG4gICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWRlc2MnIH0sXG4gICAgICBmaWx0ZXJlZCA/IHQoJ2VtcHR5RmlsdGVyZWQnKSA6IHQoJ2VtcHR5RGVzYycpKSxcbiAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tZ2hvc3QnLCBvbkNsaWNrOiBvblJlc2V0IH0sIHQoJ3Jlc2V0RmlsdGVycycpKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDpobXpnaLnuqfnirbmgIHmnLogKyDluIPlsYBcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIFN0YXRzRGFzaGJvYXJkKHByb3BzKSB7XG4gIGNvbnN0IHQgPSBwcm9wcy50IHx8IGZhbGxiYWNrVFxuICBjb25zdCBbcmFuZ2UsIHNldFJhbmdlXSA9IFJlYWN0LnVzZVN0YXRlKCd0b2RheScpIC8vIHRvZGF5IHwgN2QgfCAzMGQgfCBjdXN0b21cbiAgY29uc3QgW2N1c3RvbSwgc2V0Q3VzdG9tXSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRDdXN0b20pXG4gIGNvbnN0IFttb2RlbHMsIHNldE1vZGVsc10gPSBSZWFjdC51c2VTdGF0ZShbXSkgLy8gW10gPSDlhajpg6jmqKHlnotcbiAgY29uc3QgW2N1c3RvbU9wZW4sIHNldEN1c3RvbU9wZW5dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtyZXRyeSwgc2V0UmV0cnldID0gUmVhY3QudXNlU3RhdGUoMClcbiAgY29uc3QgW3N0YXR1cywgc2V0U3RhdHVzXSA9IFJlYWN0LnVzZVN0YXRlKCdsb2FkaW5nJykgLy8gbG9hZGluZyB8IHJlZnJlc2hpbmcgfCByZWFkeSB8IGVycm9yXG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpXG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gUmVhY3QudXNlU3RhdGUobnVsbClcbiAgY29uc3QgW3ByaWNlcywgc2V0UHJpY2VzXSA9IFJlYWN0LnVzZVN0YXRlKHsgcHJpY2VzOiB7fSwgY3VycmVuY3k6ICfCpScgfSlcbiAgLy8g5bGV56S65biB56eN77ya5a6/5Li75oyJ5a6D5o2i566X5oiQ5pys77yM5omA5Lul5o2i5biB56eN5b+F6aG76YeN5p+l77yb6YCJ5oup6K6w5Zyo5pys5Zyw77yI5bGV56S65YGP5aW977yMXG4gIC8vIOS4jeWGmeaPkuS7tuiuvue9ru+8jOWFjeW+l+avj+asoeWPluaVsOmDveWcqOaUueWGmeeUqOaIt+mFjee9ru+8ieOAglxuICBjb25zdCBbZGlzcGxheUN1cnJlbmN5LCBzZXREaXNwbGF5Q3VycmVuY3ldID0gUmVhY3QudXNlU3RhdGUocmVhZFN0b3JlZEN1cnJlbmN5KVxuICAvLyBQMS02IGJhY2tmaWxsIOi9ruivoueKtuaAge+8mnF1ZXJ5S2V5IOWPmOWMluaXtumHjee9ru+8jOS7heWvueWQjOS4gOafpeivouS4sui9ruivolxuICBjb25zdCBxdWVyeUtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBiYWNrZmlsbFNlZW5SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGZpbmFsUmVmcmVzaFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICBjb25zdCBlZmYgPSBSZWFjdC51c2VNZW1vKCgpID0+IHJhbmdlRm9yKHJhbmdlLCBjdXN0b20pLCBbcmFuZ2UsIGN1c3RvbV0pXG4gIC8vIEZpeGVkIHN0ZXAgcG9saWN5OiB0b2RheSA9IGhvdXJseTsgN2QvMzBkL2N1c3RvbSA9IGRhaWx5LCBjdXN0b20gdXNlcyBhXG4gIC8vIHN0YWJsZSBzdGVwICgxLzMvNS83IGRheXMpIGNob3NlbiBieSB0aGUgcmFuZ2UgbGVuZ3RoLlxuICBjb25zdCBlZmZHcmFuID0gZWZmR3JhbnVsYXJpdHkocmFuZ2UpXG4gIGNvbnN0IHN0ZXBEYXlzID0gcmFuZ2UgPT09ICdjdXN0b20nID8gcGlja1N0ZXBEYXlzKChlZmYudG8gfHwgMCkgLSAoZWZmLmZyb20gfHwgMCkpIDogMVxuICBjb25zdCBncmFuTGFiZWwgPSBzdGVwTGFiZWwodCwgcmFuZ2UsIHN0ZXBEYXlzKVxuXG4gIC8vIOafpeivoue7n+iuoe+8iOmmlui9vemqqOaetu+8m+WIt+aWsOS/neeVmeaXp+aVsOaNrui9rCByZWZyZXNoaW5n77ybZmlsbCAwIOWhq+WFhSArIOW5tOW6pueDreWKm+Wbvu+8iVxuICAvLyBQMS0277yaYmFja2ZpbGwgcnVubmluZyDml7bmr48gM3Mg6Ieq5Yqo6YeN5p+l77ybZG9uZSDlkI7ooaXkuIDmrKHmlLblsL7mn6Xor6LljbPlgZzjgIJcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRydWVcbiAgICBsZXQgYmFja2ZpbGxUaW1lciA9IG51bGxcbiAgICBjb25zdCBxdWVyeUtleSA9IGVmZi5mcm9tICsgJ3wnICsgZWZmLnRvICsgJ3wnICsgbW9kZWxzLmpvaW4oJywnKSArICd8JyArIGVmZkdyYW4gKyAnfCcgKyBzdGVwRGF5cyArICd8JyArIGRpc3BsYXlDdXJyZW5jeVxuICAgIGlmIChxdWVyeUtleVJlZi5jdXJyZW50ICE9PSBxdWVyeUtleSkge1xuICAgICAgcXVlcnlLZXlSZWYuY3VycmVudCA9IHF1ZXJ5S2V5XG4gICAgICBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBmaW5hbFJlZnJlc2hSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGlzRmluYWxSdW4gPSBmaW5hbFJlZnJlc2hSZWYuY3VycmVudFxuICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRTdGF0dXMoKHMpID0+IChzID09PSAncmVhZHknICYmIGRhdGEgIT09IG51bGwgPyAncmVmcmVzaGluZycgOiAnbG9hZGluZycpKVxuICAgIGhvc3RDYWxsKCd1c2FnZS9xdWVyeScsIHtcbiAgICAgIGZyb206IGVmZi5mcm9tLFxuICAgICAgdG86IGVmZi50byxcbiAgICAgIG1vZGVsczogbW9kZWxzLnNsaWNlKCksXG4gICAgICAvLyDjgIzlhajpg6jjgI3kuI3lgZrpm7bloavlhYXvvJrnnJ/lrp7ovrnnlYzmmK/ovpPlh7rmobbmlbDvvIjlrr/kuLsgTUFYX0JVQ0tFVFPvvInvvIzkuI3mmK/lpKnmlbDjgIJcbiAgICAgIGZpbGw6IHJhbmdlICE9PSAnYWxsJyxcbiAgICAgIGdyYW51bGFyaXR5OiBlZmZHcmFuLFxuICAgICAgc3RlcERheXMsXG4gICAgICBoZWF0bWFwOiB0cnVlLFxuICAgICAgY3VycmVuY3k6IGRpc3BsYXlDdXJyZW5jeSxcbiAgICB9KVxuICAgICAgLnRoZW4oKHIpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0RGF0YShyKVxuICAgICAgICBzZXRTdGF0dXMoJ3JlYWR5JylcbiAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgY29uc3QgYnMgPSByICYmIHIuYmFja2ZpbGwgPyByLmJhY2tmaWxsLnN0YXR1cyA6IG51bGxcbiAgICAgICAgaWYgKGJzID09PSAncnVubmluZycpIHtcbiAgICAgICAgICBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgICAvLyDlkIzkuIAgZWZmZWN0IOiHs+WkmuaMguS4gOS4quWumuaXtuWZqO+8m+mHjeafpeWkjeeUqCByZXRyeSDorqHmlbDlmajop6blj5EgZWZmZWN0IOmHjei3kVxuICAgICAgICAgIGJhY2tmaWxsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50KSBzZXRSZXRyeSgodikgPT4gdiArIDEpXG4gICAgICAgICAgfSwgMzAwMClcbiAgICAgICAgfSBlbHNlIGlmIChicyA9PT0gJ2RvbmUnICYmIGJhY2tmaWxsU2VlblJlZi5jdXJyZW50ICYmICFpc0ZpbmFsUnVuKSB7XG4gICAgICAgICAgLy8g5Zue5aGr5pS25bC+77ya5oGw5aW95YaN5p+l5LiA5qyh5ou/5Yiw5a6M5pW05pWw5o2u5ZCO5YGc5q2iXG4gICAgICAgICAgZmluYWxSZWZyZXNoUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgc2V0UmV0cnkoKHYpID0+IHYgKyAxKVxuICAgICAgICB9XG4gICAgICB9LCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXRFcnJvcihlKVxuICAgICAgICBzZXRTdGF0dXMoJ2Vycm9yJylcbiAgICAgIH0pXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKGJhY2tmaWxsVGltZXIgIT09IG51bGwpIGNsZWFyVGltZW91dChiYWNrZmlsbFRpbWVyKVxuICAgIH1cbiAgfSwgW2VmZi5mcm9tLCBlZmYudG8sIG1vZGVscywgZWZmR3Jhbiwgc3RlcERheXMsIGRpc3BsYXlDdXJyZW5jeSwgcmV0cnldKVxuXG4gIC8vIOS7t+agvOihqO+8mui/m+WFpemhtemdouaLieS4gOasoSArIOavj+asoeWIt+aWsOWQjOatpeOAglxuICAvLyBQMC0x77ya5LyY5YWI5a6Y5pa5IHNldHRpbmdzIHNjb3Bl77yIdXNhZ2UucHJpY2VzIOWRveWQjeepuumXtO+8ie+8jOS4jeWPr+eUqOaXtuWbnumAgCBSUEPjgIJcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRydWVcbiAgICBsZXQgc2NvcGVEaXNwb3NlID0gbnVsbFxuICAgIGNvbnN0IGxvYWRScGMgPSAoKSA9PiB7XG4gICAgICBob3N0Q2FsbCgndXNhZ2UvcHJpY2VzJykudGhlbigocCkgPT4ge1xuICAgICAgICBpZiAoY3VycmVudCAmJiBwICYmIHAucHJpY2VzKSBzZXRQcmljZXMocClcbiAgICAgIH0sICgpID0+IHt9KVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2NvcGUgPSBnZXRVc2FnZVByaWNlc1Njb3BlKClcbiAgICAgIGlmIChzY29wZSAmJiB0eXBlb2Ygc2NvcGUuZ2V0U25hcHNob3QgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNjb3BlLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBsZXQgYWRvcHRlZCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGFkb3B0ID0gKCkgPT4ge1xuICAgICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgY29uc3Qgc25hcCA9IHNjb3BlLmdldFNuYXBzaG90KClcbiAgICAgICAgICBjb25zdCB2ID0gc25hcCAmJiBzbmFwLnZhbHVlXG4gICAgICAgICAgaWYgKHNuYXAgJiYgc25hcC5zdGF0dXMgPT09ICd1bmF2YWlsYWJsZScpIHJldHVyblxuICAgICAgICAgIGlmICh2ICYmICh2LnByaWNlcyB8fCB2LmN1cnJlbmN5KSkge1xuICAgICAgICAgICAgYWRvcHRlZCA9IHRydWVcbiAgICAgICAgICAgIHNldFByaWNlcyh7IHByaWNlczogdi5wcmljZXMgfHwge30sIGN1cnJlbmN5OiB2LmN1cnJlbmN5IHx8ICfCpScgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWRvcHQoKVxuICAgICAgICBzY29wZURpc3Bvc2UgPSBzY29wZS5zdWJzY3JpYmUoYWRvcHQpXG4gICAgICAgIGlmICghYWRvcHRlZCkgbG9hZFJwYygpIC8vIHNjb3BlIOacquWwsee7qi/ml6DlgLzvvJrlhYjotbAgUlBD77yM6K6i6ZiF5bCx57uq5ZCOIHNjb3BlIOS8mOWFiOimhuebllxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZFJwYygpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9hZFJwYygpIC8vIOaOoua1iy/nu5HlrprlvILluLjvvJrlrozmlbTlm57pgIAgUlBD77yM57ud5LiN5oqb5Ye6XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChzY29wZURpc3Bvc2UpIHtcbiAgICAgICAgdHJ5IHsgc2NvcGVEaXNwb3NlKCkgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtyZXRyeV0pXG5cbiAgY29uc3QgcmVsb2FkID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4gc2V0UmV0cnkoKHYpID0+IHYgKyAxKSwgW10pXG5cbiAgY29uc3QgcmVzZXRGaWx0ZXJzID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE1vZGVscyhbXSlcbiAgICBzZXRDdXN0b20oZGVmYXVsdEN1c3RvbSgpKVxuICAgIHNldFJhbmdlKCd0b2RheScpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGNoYW5nZUN1cnJlbmN5ID0gUmVhY3QudXNlQ2FsbGJhY2soKGNvZGUpID0+IHtcbiAgICBzdG9yZUN1cnJlbmN5KGNvZGUpXG4gICAgc2V0RGlzcGxheUN1cnJlbmN5KGNvZGUpXG4gIH0sIFtdKVxuICAvLyDnrKblj7fku6Xlrr/kuLvlm57kvKDnmoTlrp7pmYXluIHnp43kuLrlh4bvvIjliIfmjaLlkI7nq4vliLvph43mn6XvvIzkuI3kvJrlh7rnjrDjgIzmjaLkuobmoIflv5fmsqHmjaLmlbDlrZfjgI3vvInvvJtcbiAgLy8g6ICB5a6/5Li75rKh5pyJ6K+l5a2X5q615pe25oyJ5pys5Zyw6YCJ5oup5YWc5bqV44CCXG4gIGNvbnN0IGN1cnJlbmN5U3ltYm9sID0gKGRhdGEgJiYgZGF0YS5jdXJyZW5jeSAmJiBkYXRhLmN1cnJlbmN5LnN5bWJvbClcbiAgICB8fCBDVVJSRU5DWV9TWU1CT0xTW2Rpc3BsYXlDdXJyZW5jeV0gfHwgcHJpY2VzLmN1cnJlbmN5IHx8ICfCpSdcblxuICBjb25zdCBidXN5ID0gc3RhdHVzID09PSAnbG9hZGluZycgfHwgc3RhdHVzID09PSAncmVmcmVzaGluZydcbiAgY29uc3QgcmVhZHkgPSBkYXRhICE9PSBudWxsXG4gIGNvbnN0IGlzRXJyb3IgPSBzdGF0dXMgPT09ICdlcnJvcidcbiAgY29uc3QgaXNFbXB0eSA9IHJlYWR5ICYmIGRhdGEuZGFpbHkubGVuZ3RoID09PSAwICYmIGRhdGEuYnlNb2RlbC5sZW5ndGggPT09IDBcblxuICByZXR1cm4gaChULlByb3ZpZGVyLCB7IHZhbHVlOiB0IH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2VjdGlvbicsICdhcmlhLWJ1c3knOiBidXN5IHx8IHVuZGVmaW5lZCB9LFxuICAgIGgoU3RhdHNIZWFkZXIsIHsgYnVzeSwgb25SZWZyZXNoOiByZWxvYWQgfSksXG4gICAgaChGaWx0ZXJCYXIsIHtcbiAgICAgIHJhbmdlLFxuICAgICAgY3VzdG9tLFxuICAgICAgbW9kZWxzLFxuICAgICAgY3VzdG9tT3BlbixcbiAgICAgIG1vZGVsT3B0aW9uczogZGF0YSA/IGRhdGEubW9kZWxzIDogW10sXG4gICAgICBvblByZXNldDogKHApID0+IHsgc2V0UmFuZ2UocCk7IHNldEN1c3RvbU9wZW4oZmFsc2UpIH0sXG4gICAgICBvbkN1c3RvbU9wZW46IChvcGVuKSA9PiB7IHNldFJhbmdlKCdjdXN0b20nKTsgc2V0Q3VzdG9tT3BlbihvcGVuKSB9LFxuICAgICAgb25DdXN0b21BcHBseTogKGMpID0+IHsgc2V0Q3VzdG9tKGMpOyBzZXRDdXN0b21PcGVuKGZhbHNlKSB9LFxuICAgICAgb25DdXN0b21DbG9zZTogKCkgPT4gc2V0Q3VzdG9tT3BlbihmYWxzZSksXG4gICAgICBvbk1vZGVsc0NoYW5nZTogc2V0TW9kZWxzLFxuICAgIH0pLFxuICAgIGlzRXJyb3IgJiYgIXJlYWR5XG4gICAgICA/IGgoRXJyb3JTdGF0ZSwgeyBlcnJvciwgb25SZXRyeTogcmVsb2FkIH0pXG4gICAgICA6IG51bGwsXG4gICAgIXJlYWR5ICYmICFpc0Vycm9yXG4gICAgICA/IGgoTG9hZGluZ1N0YXRlLCBudWxsKVxuICAgICAgOiBudWxsLFxuICAgIHJlYWR5ICYmIGlzRXJyb3JcbiAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtYWxlcnQtYmFubmVyJywgcm9sZTogJ2FsZXJ0JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdsb2FkRmFpbGVkJywgeyBtZXNzYWdlOiBTdHJpbmcoKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKSB9KSksXG4gICAgICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWJ0biB0c2QtYnRuLWdob3N0Jywgb25DbGljazogcmVsb2FkIH0sIHQoJ3JldHJ5JykpKVxuICAgICAgOiBudWxsLFxuICAgIHJlYWR5ICYmICFpc0Vycm9yICYmIGlzRW1wdHlcbiAgICAgID8gaChFbXB0eVN0YXRlLCB7IGZpbHRlcmVkOiBtb2RlbHMubGVuZ3RoID4gMCwgb25SZXNldDogcmVzZXRGaWx0ZXJzIH0pXG4gICAgICA6IG51bGwsXG4gICAgcmVhZHkgJiYgIWlzRXJyb3IgJiYgIWlzRW1wdHlcbiAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY29udGVudCcsICdkYXRhLWJ1c3knOiBidXN5ID8gJ3RydWUnIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgaChTdW1tYXJ5Q2FyZHMsIHtcbiAgICAgICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsLFxuICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5U3ltYm9sLFxuICAgICAgICAgICAgdW5wcmljZWRDYWxsczogZGF0YS51bnByaWNlZENhbGxzIHx8IDAsXG4gICAgICAgICAgICBjdXJyZW5jeUNvZGU6IGRpc3BsYXlDdXJyZW5jeSxcbiAgICAgICAgICAgIG9uQ3VycmVuY3lDaGFuZ2U6IGNoYW5nZUN1cnJlbmN5LFxuICAgICAgICAgICAgYnlNb2RlbDogZGF0YS5ieU1vZGVsLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGgoRGFpbHlDaGFydCwge1xuICAgICAgICAgICAgZGFpbHk6IGRhdGEuZGFpbHksXG4gICAgICAgICAgICBncmFuOiBlZmZHcmFuLFxuICAgICAgICAgICAgc3RlcERheXMsXG4gICAgICAgICAgICBncmFuTGFiZWwsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaChIZWF0bWFwQ2FyZCwgeyBkYXlzOiBkYXRhLmhlYXRtYXAgfHwgW10gfSksXG4gICAgICAgICAgaChNb2RlbFRhYmxlLCB7IHJvd3M6IGRhdGEuYnlNb2RlbCwgY3VycmVuY3k6IGN1cnJlbmN5U3ltYm9sIH0pKVxuICAgICAgOiBudWxsKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDorr7nva7pobXlr7zoiKrlm77moIdcbiAqXG4gKiBgc2V0dGluZ3Muc2VjdGlvbmAg5Y+q5oqV5b2xIGlkL29yZGVyL2xhYmVs77yM5a+86Iiq5Zu+5qCH55Sx6K6+572u6aG15oyJIGlkIOeZveWQjeWNleiHquW3sVxuICog5Yaz5a6a77yIZHNoLWNsaWVudC11aS1zZXR0aW5ncy1nZW5lcmFsIOeahCBuYXZJY29u77yJ77yM56ys5LiJ5pa55rKh5pyJ5o+S5Y+j44CC5omA5Lul6L+Z6YeMXG4gKiDnu5njgIzoh6rlt7HpgqPkuIDooYzjgI3miZPkuIDkuKrlsZ7mgKfmoIforrDvvIzlho3nlKggQ1NTIG1hc2sg5oqK5YWc5bqV55qE6b2/6L2u5o2i5oiQ55So6YeP5Zu+5qCH77yaXG4gKiDkuI3mm7/mjaLoioLngrnjgIHkuI3norAgUmVhY3Qg566h55qEIHN2Z++8iOabv+aNouS8muiuqSBSZWFjdCDljbjovb3ml7bmipsgTm90Rm91bmRFcnJvcu+8ie+8jFxuICog5Y+q5Yqg5bGe5oCn44CB5Y+q55SoIDo6YmVmb3JlIOeUu+Wtl+W9ouOAglxuICpcbiAqIOiupOihjOWPquiDveaMieWPr+ingeaWh+acrO+8muexu+WQjeaYryBDU1MgTW9kdWxlcyDlk4jluIzvvIzotKblj7fooYzov5jkvJrmnaHku7blh7rnjrDjgIJcbiAqIOWumOaWueS4gOaXpue7mSBzZXR0aW5ncy5zZWN0aW9uIOWKoOS4iiBpY29uIOWtl+aute+8jOi/meS4quaooeWdl+W6lOaVtOS9k+WIoOmZpOOAglxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgTkFWX0lDT05fTUFTSyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KFxuICAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPidcbiAgKyAnPHJlY3QgeD1cIjIuNVwiIHk9XCI5XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI1XCIgcng9XCIxXCIvPidcbiAgKyAnPHJlY3QgeD1cIjYuNzVcIiB5PVwiNS41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI4LjVcIiByeD1cIjFcIi8+J1xuICArICc8cmVjdCB4PVwiMTFcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCIxMS41XCIgcng9XCIxXCIvPjwvc3ZnPicsXG4pXG4vLyBtYXNrIOWPquivuyBhbHBoYSDpgJrpgZPvvIzmiYDku6XlrZflvaLlv4XpobvmmK/nuq/oibLlrp7lv4PvvIhpY29uLnN2ZyDnmoTmuJDlj5jkuI7ljYrpgI/mmI7lnKjov5nph4zkvJrkuKLvvIlcbmNvbnN0IE5BVl9JQ09OX0NTUyA9IFtcbiAgJ1tkYXRhLXRzZC1uYXZdID4gc3ZnIHsgZGlzcGxheTogbm9uZTsgfScsXG4gICdbZGF0YS10c2QtbmF2XTo6YmVmb3JlIHsnLFxuICBcIiAgY29udGVudDogJyc7XCIsXG4gICcgIGZsZXg6IG5vbmU7JyxcbiAgJyAgd2lkdGg6IDE2cHg7JyxcbiAgJyAgaGVpZ2h0OiAxNnB4OycsXG4gICcgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsnLFxuICAnICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcIicgKyBOQVZfSUNPTl9NQVNLICsgJ1wiKTsnLFxuICAnICBtYXNrLWltYWdlOiB1cmwoXCInICsgTkFWX0lDT05fTUFTSyArICdcIik7JyxcbiAgJyAgLXdlYmtpdC1tYXNrLXNpemU6IDE2cHggMTZweDsnLFxuICAnICBtYXNrLXNpemU6IDE2cHggMTZweDsnLFxuICAnICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7JyxcbiAgJyAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDsnLFxuICAnfScsXG5dLmpvaW4oJ1xcbicpXG5cbi8qKiDorqTkuI3lh7rooYzjgIHmi7/kuI3liLAgRE9N77yM6YO95Y+q5piv6YCA5YyW5oiQ6b2/6L2u77yM57ud5LiN5oqb5Ye644CC6L+U5ZueIGRpc3Bvc2Vy44CCICovXG5mdW5jdGlvbiBpbnN0YWxsU2V0dGluZ3NOYXZJY29uKGxhYmVsKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbFxuICBsZXQgc3R5bGVFbCA9IG51bGxcbiAgdHJ5IHtcbiAgICBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgIHN0eWxlRWwuc2V0QXR0cmlidXRlKCdkYXRhLXBsdWdpbicsICdkc2gtcGx1Z2luLXVzYWdlJylcbiAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gTkFWX0lDT05fQ1NTXG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdbdXNhZ2VdIHNldHRpbmdzIG5hdiBpY29uOiBzdHlsZXMgdW5hdmFpbGFibGUnKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgbWFyayA9ICgpID0+IHtcbiAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJkaWFsb2dcIl0gYnV0dG9uJylcbiAgICBjb25zdCB3YW50ID0gbGFiZWwoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXVxuICAgICAgaWYgKHJvdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHNkLW5hdicpICE9PSBudWxsKSBjb250aW51ZVxuICAgICAgaWYgKCFyb3cucXVlcnlTZWxlY3Rvcignc3ZnJykpIGNvbnRpbnVlIC8vIOWPquagh+W4puWbvuagh+eahOWvvOiIquihjO+8jOWIq+ivr+agh+aZrumAmuaMiemSrlxuICAgICAgaWYgKChyb3cudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKSAhPT0gd2FudCkgY29udGludWVcbiAgICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdHNkLW5hdicsICcnKVxuICAgIH1cbiAgfVxuICBsZXQgb2JzZXJ2ZXIgPSBudWxsXG4gIHRyeSB7XG4gICAgbWFyaygpXG4gICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7IHRyeSB7IG1hcmsoKSB9IGNhdGNoIChlKSB7fSB9KVxuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignW3VzYWdlXSBzZXR0aW5ncyBuYXYgaWNvbjogb2JzZXJ2ZXIgdW5hdmFpbGFibGUnLCBlKVxuICB9XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKG9ic2VydmVyKSBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICBpZiAoc3R5bGVFbCkgc3R5bGVFbC5yZW1vdmUoKVxuICAgIGNvbnN0IG1hcmtlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRzZC1uYXZdJylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlZC5sZW5ndGg7IGkrKykgbWFya2VkW2ldLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10c2QtbmF2JylcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOi+k+WFpeWMuuaIkOacrCBwaWxs77yIY29tcG9zZXIgZG9ja++8iVxuICpcbiAqIERTSCAwLjIuMS1yYy4xIOaKiui+k+WFpeWMuue7n+iuoeaLhuaIkCBgYWN0aXZpdHlgIC8gYHVzYWdlYCDkuKTkuKogY29tcG9zZXIgZG9jayDmnaHnm67vvIxcbiAqIOWuv+S4u+iHquW3seeahCBgdXNhZ2VgIHBpbGwg5pi+56S6IHRva2VuIOaVsO+8iOivu+WumOaWuSBgdG9rZW5Vc2FnZWAg5oqV5b2x77yJ44CC5a6Y5pa55oqV5b2x5Y+q5pyJXG4gKiDkvJror53lhoXlkIjorqHjgIEqKuS4jeW4puaooeWei+W9kuWboCoq77yM6ICM5oiQ5pys5b+F6aG75oyJ5qih5Z6L5Y2V5Lu3566X77yI5pys5o+S5Lu26IeqIHYwLjMg6LW35Z2a5oyBXG4gKiDkuI3mt7fku7fvvInvvIzmiYDku6Xov5nph4zkuI3otbDmipXlvbHvvIzmlLnotbDmnKzmj5Lku7boh6rlt7HnmoQgYHF1ZXJ5YO+8muiusOW9lemHjOW4piBwcm92aWRlci9tb2RlbO+8jFxuICog5a6/5Li75L6n5oyJ5qih5Z6L57K+56Gu6K6h5Lu344CCXG4gKlxuICog5Y+j5b6E5Y+W44CM5LuK5pel44CN6ICM5LiN5piv44CM5pys5Lya6K+d44CN77yaZG9jayDmnaHnm67mi7/kuI3liLDkvJror53moIfor4bvvIjlrr/kuLvmuLLmn5Pov5nkuKogc2xvdCDml7ZcbiAqIOaYryBgcmVuZGVyU2xvdChcImNvbnZlcnNhdGlvbi5jb21wb3Nlci5kb2NrXCIsIHt9KWDvvIzkuI3kvKAgcHJvcHPvvInvvIzogIzku4rml6XmiJDmnKzkuI5cbiAqIOWuv+S4u+eahCB0b2tlbiBwaWxsIOato+WlveS6kuihpeOAglxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgRE9DS19SRUZSRVNIX01TID0gMzAwMDBcbi8qKiDlm57loavvvIhiYWNrZmlsbO+8iei/m+ihjOS4reeahOW/q+mHjeivlemXtOmalO+8jOS4juiuvue9rumhteS4gOiHtOOAgiAqL1xuY29uc3QgRE9DS19CQUNLRklMTF9SRVRSWV9NUyA9IDMwMDBcblxuZnVuY3Rpb24gQ29zdFBpbGwocHJvcHMpIHtcbiAgY29uc3QgdHIgPSBwcm9wcyAmJiB0eXBlb2YgcHJvcHMudCA9PT0gJ2Z1bmN0aW9uJyA/IHByb3BzLnQgOiBmYWxsYmFja1RcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBSZWFjdC51c2VTdGF0ZSh7IHN0YXR1czogJ2xvYWRpbmcnIH0pXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGFsaXZlID0gdHJ1ZVxuICAgIGxldCB0aW1lciA9IG51bGxcbiAgICBjb25zdCBzY2hlZHVsZSA9IChtcykgPT4ge1xuICAgICAgaWYgKHRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQobG9hZCwgbXMpXG4gICAgfVxuICAgIGNvbnN0IGxvYWQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWFsaXZlKSByZXR1cm5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICAgIGhvc3RDYWxsKCd1c2FnZS9xdWVyeScsIHtcbiAgICAgICAgZnJvbTogc3RhcnRPZkRheShub3cpLmdldFRpbWUoKSxcbiAgICAgICAgdG86IG5vdy5nZXRUaW1lKCksXG4gICAgICAgIC8vIOOAjOS7iuaXpeOAjeaYr+aciemZkOWMuumXtO+8jOS9huS4jemcgOmbtuWhq+WFhe+8muepuuahtuWvueaIkOacrOayoeaEj+S5ieOAglxuICAgICAgICBmaWxsOiBmYWxzZSxcbiAgICAgICAgZ3JhbnVsYXJpdHk6ICdkYXknLFxuICAgICAgICBjdXJyZW5jeTogcmVhZFN0b3JlZEN1cnJlbmN5KCksXG4gICAgICB9KVxuICAgICAgICAudGhlbigocikgPT4ge1xuICAgICAgICAgIGlmICghYWxpdmUpIHJldHVyblxuICAgICAgICAgIGNvbnN0IHRvdGFsID0gKHIgJiYgci50b3RhbCkgfHwgbnVsbFxuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIHN0YXR1czogJ3JlYWR5JyxcbiAgICAgICAgICAgIGNhbGxzOiB0b3RhbCA/IHRvdGFsLmNhbGxzIDogMCxcbiAgICAgICAgICAgIHRva2VuczogdG90YWwgPyB0b3RhbC50b3RhbFRva2VucyA6IDAsXG4gICAgICAgICAgICBjb3N0OiB0b3RhbCA/IHRvdGFsLmNvc3QgOiAwLFxuICAgICAgICAgICAgc3ltYm9sOiAociAmJiByLmN1cnJlbmN5ICYmIHIuY3VycmVuY3kuc3ltYm9sKVxuICAgICAgICAgICAgICB8fCBDVVJSRU5DWV9TWU1CT0xTW3JlYWRTdG9yZWRDdXJyZW5jeSgpXVxuICAgICAgICAgICAgICB8fCAnwqUnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgYmFja2ZpbGxpbmcgPSBCb29sZWFuKHIgJiYgci5iYWNrZmlsbCAmJiByLmJhY2tmaWxsLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKVxuICAgICAgICAgIHNjaGVkdWxlKGJhY2tmaWxsaW5nID8gRE9DS19CQUNLRklMTF9SRVRSWV9NUyA6IERPQ0tfUkVGUkVTSF9NUylcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyDot6/nlLHkuI3lj6/nlKggLyDlrr/kuLvmnKrlsLHnu6rvvJrkuI3njJzmlbDlrZfvvIzkuZ/kuI3miqXplJnlvLnnqpfvvIhkb2NrIOW4uOmpu++8jOS4jeiDveWIt+Wxj++8ieOAglxuICAgICAgICAgIGlmIChhbGl2ZSkge1xuICAgICAgICAgICAgc2V0U3RhdGUoeyBzdGF0dXM6ICdlcnJvcicgfSlcbiAgICAgICAgICAgIHNjaGVkdWxlKERPQ0tfUkVGUkVTSF9NUylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgIGxvYWQoKVxuICAgIGNvbnN0IG9uVmlzaWJsZSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSBsb2FkKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2libGUpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFsaXZlID0gZmFsc2VcbiAgICAgIGlmICh0aW1lciAhPT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2libGUpXG4gICAgfVxuICB9LCBbXSlcbiAgLy8g5LuK5pel5peg6LCD55So77yI5oiW6L+Y5rKh5p+l5Yiw77yJ5bCx5LiN5Y2g5L2N77yaZG9jayDmmK/luLjpqbvljLrvvIznqbogcGlsbCDmr5TmsqHmnInmm7TlkLXjgIJcbiAgaWYgKHN0YXRlLnN0YXR1cyAhPT0gJ3JlYWR5JyB8fCAhc3RhdGUuY2FsbHMpIHJldHVybiBudWxsXG4gIGNvbnN0IHByaWNlZCA9IHN0YXRlLmNvc3QgPiAwXG4gIGNvbnN0IHZhbHVlID0gcHJpY2VkID8gc3RhdGUuc3ltYm9sICsgY29zdERpZ2l0cyhzdGF0ZS5jb3N0KSA6IHRyKCdkb2NrVW5wcmljZWQnKVxuICBjb25zdCBoaW50ID0gdHIoJ2RvY2tIaW50Jywge1xuICAgIGNvc3Q6IHZhbHVlLFxuICAgIGNhbGxzOiBmb3JtYXRJbnQoc3RhdGUuY2FsbHMpLFxuICAgIHRva2VuczogZm9ybWF0SW50KHN0YXRlLnRva2VucyksXG4gIH0pXG4gIHJldHVybiBoKCdzcGFuJywge1xuICAgIGNsYXNzTmFtZTogJ3RzZC1kb2NrJyxcbiAgICB0aXRsZTogaGludCxcbiAgICAnYXJpYS1sYWJlbCc6IGhpbnQsXG4gICAgJ2RhdGEtdXNhZ2UtY29zdCc6IHRydWUsXG4gIH0sXG4gICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWRvY2stbGFiZWwnIH0sIHRyKCd0b2RheScpKSxcbiAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtZG9jay12YWx1ZScgfSwgdmFsdWUpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOazqOWGjO+8mnNldHRpbmdzLnNlY3Rpb24g6aG16Z2iXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBhcHBseShjdHgpIHtcbiAgdXNhZ2VDdHggPSBjdHhcbiAgX3VzYWdlUHJpY2VzU2NvcGUgPSBudWxsIC8vIOavj+asoea/gOa0u+mHjee7ke+8jOmBv+WFjeWkjeeUqOW3sumHiuaUvueahCBzY29wZVxuICBjdHguZWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHN0eWxlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgc3R5bGVzICYmIHR5cGVvZiBzdHlsZXMuaW5zZXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc3R5bGVzLmluc2VydChDU1MpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wbHVnaW4nLCAnZHNoLXBsdWdpbi11c2FnZScpXG4gICAgICBlbC50ZXh0Q29udGVudCA9IENTU1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbClcbiAgICAgIHJldHVybiAoKSA9PiB7IGVsLnJlbW92ZSgpIH1cbiAgICB9XG4gIH0sICd1c2FnZTogc3R5bGVzJylcbiAgY3R4LmVmZmVjdCgoKSA9PiBjdHgubG9jYWxlLnJlZ2lzdGVyKE5TLCB7IHpoOiBaSCwgZW46IEVOIH0pLCAndXNhZ2U6IGRpY3Rpb25hcmllcycpXG4gIGNvbnN0IHQwID0gY3R4LmxvY2FsZSA/IGN0eC5sb2NhbGUuYmluZChOUykgOiBmYWxsYmFja1RcbiAgY3R4LmVmZmVjdCgoKSA9PiBpbnN0YWxsU2V0dGluZ3NOYXZJY29uKCgpID0+IHQwKCduYXYnKSksICd1c2FnZTogbmF2LWljb24nKVxuICAvLyBjb3JkaXMgY3R4IGlzIGEgc3RyaWN0IHByb3h5OiBESVJFQ1QgcHJvcGVydHkgYWNjZXNzIG9uIGFuIHVuLWluamVjdGVkXG4gIC8vIHNlcnZpY2UgdGhyb3dzIChcImNhbm5vdCBnZXQgcHJvcGVydHkgWCB3aXRob3V0IGluamVjdFwiKSwgc28gYSBiYXJlXG4gIC8vIGBjdHguc2xvdHMgPz8gLi4uYCB3b3VsZCB0aHJvdyBhbmQgc2tpcCB0aGUgZmFsbGJhY2suIFByb2JlIHZpYSB0aGUgc2FmZVxuICAvLyBjdHguZ2V0KCkgZmlyc3Q7IGZhbGwgYmFjayB0byB0aGUgaW5qZWN0ZWQgcHJvcGVydHkgKGF2YWlsYWJsZSBvbmNlXG4gIC8vICdzbG90cycgaXMgZGVjbGFyZWQgaW4gdGhlIGluamVjdCBsaXN0IGJlbG93KS5cbiAgbGV0IHNsb3RzID0gbnVsbFxuICB0cnkge1xuICAgIHNsb3RzID0gdHlwZW9mIGN0eC5nZXQgPT09ICdmdW5jdGlvbicgPyBjdHguZ2V0KCdzbG90cycpIDogbnVsbFxuICB9IGNhdGNoIChlKSB7XG4gICAgc2xvdHMgPSBudWxsXG4gIH1cbiAgaWYgKCFzbG90cyB8fCB0eXBlb2Ygc2xvdHMuaW5qZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjdHguc2xvdHMgJiYgdHlwZW9mIGN0eC5zbG90cy5pbmplY3QgPT09ICdmdW5jdGlvbicpIHNsb3RzID0gY3R4LnNsb3RzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2xvdHMgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmICghc2xvdHMgfHwgdHlwZW9mIHNsb3RzLmluamVjdCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2Ygc2xvdHMucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLndhcm4oJ1t1c2FnZV0gc2V0dGluZ3Muc2VjdGlvbiBzbG90IHVuYXZhaWxhYmxlJylcbiAgICByZXR1cm5cbiAgfVxuICBzbG90cy5pbmplY3QoJ3NldHRpbmdzLnNlY3Rpb24nLCAoKSA9PiBzbG90cy5yZWdpc3RlcihcbiAgICB7IG5hbWU6ICdzZXR0aW5ncy5zZWN0aW9uJywgaWQ6ICd0b2tlbi1zdGF0cycsIG9yZGVyOiAyMCwgbGFiZWw6ICgpID0+IHQwKCduYXYnKSwgbG9jYWxlOiBOUyB9LFxuICAgIChwcm9wcykgPT4gaChTdGF0c0Rhc2hib2FyZCwgcHJvcHMpLFxuICApKVxuXG4gIC8vIOi+k+WFpeWMuuaIkOacrCBwaWxs44CCMC4yLjEg55qEIGNvbXBvc2VyIGRvY2sg5pivIGxpc3Qgc2xvdO+8jOWuv+S4u+iHquW3seWNoOS6hiBhY3Rpdml0eSgwKVxuICAvLyDkuI4gdXNhZ2UoMSnvvIzmj5Lku7bmjpLlnKjlroPku6zkuYvlkI7vvJswLjIuMCDmsqHmnInov5nkuKogc2xvdO+8jOazqOWFpeWksei0peS4jeiDveaLluWeruiuvue9rumhteOAglxuICB0cnkge1xuICAgIHNsb3RzLmluamVjdCgnY29udmVyc2F0aW9uLmNvbXBvc2VyLmRvY2snLCAoKSA9PiBzbG90cy5yZWdpc3RlcihcbiAgICAgIHsgbmFtZTogJ2NvbnZlcnNhdGlvbi5jb21wb3Nlci5kb2NrJywgaWQ6ICd1c2FnZS1jb3N0Jywgb3JkZXI6IDIsIGxvY2FsZTogTlMgfSxcbiAgICAgIChwcm9wcykgPT4gaChDb3N0UGlsbCwgcHJvcHMpLFxuICAgICkpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1t1c2FnZV0gY29tcG9zZXIgZG9jayBzbG90IHVuYXZhaWxhYmxlJywgZSlcbiAgfVxufVxuXG5yZXR1cm4geyBpbmplY3Q6IFsnbG9jYWxlJywgJ3Nsb3RzJ10sIGFwcGx5IH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|