dsh-plugin-usage 0.2.0 → 0.3.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.
@@ -58,13 +58,13 @@ const CSS = `
58
58
  display: inline-flex;
59
59
  align-items: center;
60
60
  justify-content: center;
61
- width: 34px;
62
- height: 34px;
61
+ width: 28px;
62
+ height: 28px;
63
63
  padding: 0;
64
- border: 1px solid var(--dsw-alias-border-l2);
65
- background: var(--dsw-alias-bg-layer-1);
64
+ border: 1px solid transparent;
65
+ background: transparent;
66
66
  color: var(--dsw-alias-label-secondary);
67
- border-radius: 8px;
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;
@@ -975,8 +1135,35 @@ const CSS = `
975
1135
  }
976
1136
  `
977
1137
 
1138
+ // 0.2+ host transport: POST /api/<channel>/<endpoint>, args as the JSON body,
1139
+ // answering { ok, value } | { ok, error } (see src/host/rpc.js). The route is
1140
+ // mounted on Connection's shared API channel, so it never needs the plugin's
1141
+ // fiber to own `webServer`.
1142
+ function callFetch(channel, endpoint, args) {
1143
+ const path = '/api/' + String(channel).replace(/^\/+/, '') + '/' + endpoint
1144
+ return fetch(path, {
1145
+ method: 'POST',
1146
+ credentials: 'same-origin',
1147
+ headers: { 'content-type': 'application/json' },
1148
+ body: JSON.stringify(args === undefined ? null : args),
1149
+ }).then((res) => {
1150
+ const type = res.headers.get('content-type') || ''
1151
+ // Route missing on this host: 404/405 from the shared dispatcher, or the
1152
+ // SPA HTML when no transport route matched the path at all.
1153
+ if (res.status === 404 || res.status === 405 || type.indexOf('application/json') === -1) {
1154
+ const error = new Error('usage Fetch route unavailable (HTTP ' + res.status + ')')
1155
+ error.code = 'usage-route-missing'
1156
+ throw error
1157
+ }
1158
+ return res.json().then((body) => {
1159
+ if (body && body.ok) return body.value
1160
+ throw new Error((body && body.error && body.error.message) || ('RPC ' + endpoint + ' failed'))
1161
+ })
1162
+ })
1163
+ }
1164
+
978
1165
  // RPC bridge: dynamic-plugin runs provide a `host` global; static (bundle)
979
- // installs provide ctx.get('connection').rpc. Keep one UI source for both.
1166
+ // installs provide ctx.get('connection'). Keep one UI source for both.
980
1167
  function hostCall(method, args) {
981
1168
  // P0-3: prefer the official `remote` service when it exposes the usage API;
982
1169
  // otherwise fall through to the host/connection fallbacks unchanged.
@@ -1015,23 +1202,36 @@ function hostCall(method, args) {
1015
1202
  if (scope === null || typeof scope.get !== 'function') {
1016
1203
  return Promise.reject(new Error('context unavailable'))
1017
1204
  }
1018
- const connection = scope.get('connection')
1019
- if (connection === undefined || connection.rpc === undefined) {
1020
- return Promise.reject(new Error('connection service unavailable'))
1021
- }
1022
1205
  const name = String(method)
1023
1206
  const slash = name.indexOf('/')
1024
1207
  const channel = slash === -1 ? name : name.slice(0, slash)
1025
1208
  const endpoint = slash === -1 ? name : name.slice(slash + 1)
1026
- return connection.rpc.call('/' + channel.replace(/^\/+/, ''), endpoint, args).then((res) => {
1027
- if (res && res.ok) return res.value
1028
- throw new Error((res && res.error && res.error.message) || ('RPC ' + method + ' failed'))
1209
+ // Legacy pre-0.2 transport: a `/usage` prefix RPC channel owned by the host
1210
+ // plugin itself.
1211
+ const callRpc = () => {
1212
+ const connection = scope.get('connection')
1213
+ if (connection === undefined || connection.rpc === undefined) {
1214
+ return Promise.reject(new Error('connection service unavailable'))
1215
+ }
1216
+ return connection.rpc.call('/' + channel.replace(/^\/+/, ''), endpoint, args).then((res) => {
1217
+ if (res && res.ok) return res.value
1218
+ throw new Error((res && res.error && res.error.message) || ('RPC ' + method + ' failed'))
1219
+ })
1220
+ }
1221
+ // Prefer the shared-channel Fetch route; an older host answers "route
1222
+ // missing" and we fall back to the legacy channel it does implement.
1223
+ const fetchUsable = typeof fetch === 'function'
1224
+ && !(typeof location !== 'undefined' && location.protocol === 'file:')
1225
+ if (!fetchUsable) return callRpc()
1226
+ return callFetch(channel, endpoint, args).catch((error) => {
1227
+ if (error && error.code === 'usage-route-missing') return callRpc()
1228
+ throw error
1029
1229
  })
1030
1230
  }
1031
1231
 
1032
1232
  /* ---------------------------------------------------------------------------
1033
- * 设置域定价:官方 ctx.settingsScope(dsh-client-ui-settings)优先,
1034
- * 不可用时回退 usage/prices RPC。绑定只做一次,读写共用同一 scope。
1233
+ * 设置域定价:官方 `ctx.configForms.get('usage')`(dsh-client-ui-settings)优先,
1234
+ * 不可用时回退 usage/prices RPC。绑定只做一次,读写共用同一 form。
1035
1235
  * ------------------------------------------------------------------------- */
1036
1236
  let usageCtx = null
1037
1237
  let _usagePricesScope = null
@@ -1047,9 +1247,12 @@ function getUsagePricesScope() {
1047
1247
  const c = resolveUsageCtx()
1048
1248
  if (!c || typeof c.get !== 'function') return null
1049
1249
  try {
1050
- const binder = c.get('settingsScope')
1051
- if (!binder || typeof binder.bind !== 'function') return null
1052
- _usagePricesScope = binder.bind({ namespace: 'usage.prices' })
1250
+ // 0.2.x: the official config-form surface for this plugin's entry id
1251
+ // (`usage`, the bundle patch row id). `settingsScope` from 0.1.x does not
1252
+ // exist in the shipped client, so probing it only ever returned null.
1253
+ const forms = c.get('configForms')
1254
+ if (!forms || typeof forms.get !== 'function') return null
1255
+ _usagePricesScope = forms.get('usage')
1053
1256
  return _usagePricesScope
1054
1257
  } catch (e) {
1055
1258
  return null
@@ -1094,10 +1297,14 @@ const ZH = {
1094
1297
  nav: '用量统计',
1095
1298
  subtitle: '查看 AI 模型的使用情况和成本统计',
1096
1299
  refresh: '刷新',
1300
+ currencyHint: '参考成本币种(固定汇率 1 USD = 7 CNY)',
1301
+ currencyCNY: '人民币',
1302
+ currencyUSD: '美元',
1097
1303
  today: '今日',
1098
1304
  last7d: '近7天',
1099
1305
  last30d: '近30天',
1100
1306
  custom: '自定义',
1307
+ all: '全部',
1101
1308
  allModels: '全部模型',
1102
1309
  selectedModels: '已选 {count} 个模型',
1103
1310
  selectAll: '全选',
@@ -1110,7 +1317,7 @@ const ZH = {
1110
1317
  startTime: '开始时间',
1111
1318
  endTime: '结束时间',
1112
1319
  rangeInvalid: '开始时间不能晚于结束时间',
1113
- rangeHint: '支持选择日期,最长 30 天',
1320
+ rangeHint: '支持选择任意日期范围,不限跨度',
1114
1321
  cancel: '取消',
1115
1322
  confirm: '确定',
1116
1323
  dateRangeGroup: '日期范围',
@@ -1120,7 +1327,7 @@ const ZH = {
1120
1327
  inputTokens: '输入 Token',
1121
1328
  outputTokens: '输出 Token',
1122
1329
  calls: '调用次数',
1123
- cost: '成本',
1330
+ cost: '参考成本',
1124
1331
  approxIO: '≈ 输入+输出',
1125
1332
  unpricedNote: '{count} 次调用未定价',
1126
1333
  dailyTrend: '每日用量趋势',
@@ -1151,8 +1358,10 @@ const ZH = {
1151
1358
  colInput: '输入 Token',
1152
1359
  colOutput: '输出 Token',
1153
1360
  colTotal: '总 Token',
1154
- colCost: '成本',
1361
+ colCost: '参考成本',
1155
1362
  colShare: '占比',
1363
+ modelShare: '模型占比',
1364
+ shareOther: '其它',
1156
1365
  unpriced: '未定价',
1157
1366
  unpricedRowHint: '该模型未配置定价,按 0 计价',
1158
1367
  noData: '暂无数据',
@@ -1177,10 +1386,14 @@ const EN = {
1177
1386
  nav: 'Usage Stats',
1178
1387
  subtitle: 'View AI model usage and cost statistics',
1179
1388
  refresh: 'Refresh',
1389
+ currencyHint: 'Reference-cost currency (fixed rate: 1 USD = 7 CNY)',
1390
+ currencyCNY: 'CNY',
1391
+ currencyUSD: 'USD',
1180
1392
  today: 'Today',
1181
1393
  last7d: 'Last 7 days',
1182
1394
  last30d: 'Last 30 days',
1183
1395
  custom: 'Custom',
1396
+ all: 'All',
1184
1397
  allModels: 'All models',
1185
1398
  selectedModels: '{count} models selected',
1186
1399
  selectAll: 'Select all',
@@ -1193,7 +1406,7 @@ const EN = {
1193
1406
  startTime: 'Start',
1194
1407
  endTime: 'End',
1195
1408
  rangeInvalid: 'Start must not be later than end',
1196
- rangeHint: 'Date only, up to 30 days',
1409
+ rangeHint: 'Any date range — no length limit',
1197
1410
  cancel: 'Cancel',
1198
1411
  confirm: 'OK',
1199
1412
  dateRangeGroup: 'Date range',
@@ -1203,7 +1416,7 @@ const EN = {
1203
1416
  inputTokens: 'Input Tokens',
1204
1417
  outputTokens: 'Output Tokens',
1205
1418
  calls: 'Calls',
1206
- cost: 'Cost',
1419
+ cost: 'Est. cost',
1207
1420
  approxIO: '≈ input+output',
1208
1421
  unpricedNote: '{count} calls unpriced',
1209
1422
  dailyTrend: 'Daily usage trend',
@@ -1234,8 +1447,10 @@ const EN = {
1234
1447
  colInput: 'Input Tokens',
1235
1448
  colOutput: 'Output Tokens',
1236
1449
  colTotal: 'Total Tokens',
1237
- colCost: 'Cost',
1450
+ colCost: 'Est. cost',
1238
1451
  colShare: 'Share',
1452
+ modelShare: 'Model share',
1453
+ shareOther: 'Others',
1239
1454
  unpriced: 'Unpriced',
1240
1455
  unpricedRowHint: 'No pricing configured; counted as 0',
1241
1456
  noData: 'No data',
@@ -1281,9 +1496,16 @@ function formatTokensShort(n) {
1281
1496
  function formatInt(n) {
1282
1497
  return Number.isFinite(n) ? Math.round(n).toLocaleString() : '--'
1283
1498
  }
1284
- function formatCost(n, cur) {
1499
+ /** 只要数字部分:成本卡的符号由币种切换器自己画,再带一次就成了「¥ ¥14.78」。 */
1500
+ function costDigits(n) {
1285
1501
  if (!Number.isFinite(n)) return '--'
1286
- return (cur || '¥') + n.toFixed(2)
1502
+ // Below half a cent there is nothing to show at 2 decimals; say so instead of
1503
+ // printing a misleading 0.00 (a $0.03 CNY cost becomes $0.004).
1504
+ if (n > 0 && n < 0.005) return '<0.01'
1505
+ return n.toFixed(2)
1506
+ }
1507
+ function formatCost(n, cur) {
1508
+ return (cur || '¥') + costDigits(n)
1287
1509
  }
1288
1510
  function dayLabel(key) {
1289
1511
  const [, m, d] = String(key || '').split('-')
@@ -1322,13 +1544,17 @@ function fmtDateSlash(s) {
1322
1544
  return m[1] + '/' + m[2] + '/' + m[3]
1323
1545
  }
1324
1546
  // 预设 / 自定义 → { from, to }(Unix 毫秒)
1325
- // 今日 = 当天 00:00 至今;近7/30天 = 含今天往前 N 个自然日 00:00 起;自定义 = 起日 00:00 ~ 止日 23:59:59.999
1547
+ // 今日 = 当天 00:00 至今;近7/30天 = 含今天往前 N 个自然日 00:00 起;全部 = 不限起点;
1548
+ // 自定义 = 起日 00:00 ~ 止日 23:59:59.999
1326
1549
  function rangeFor(preset, custom) {
1327
1550
  const now = new Date()
1328
1551
  const today = startOfDay(now)
1329
1552
  if (preset === 'today') return { from: today.getTime(), to: now.getTime() }
1330
1553
  if (preset === '7d') return { from: addDays(today, -6).getTime(), to: now.getTime() }
1331
1554
  if (preset === '30d') return { from: addDays(today, -29).getTime(), to: now.getTime() }
1555
+ // 全量:0 是有限值,宿主的 fill 判定认它;调用方必须同时传 fill:false,
1556
+ // 否则会去零填充 1970 年至今、撞上 MAX_BUCKETS 退化成只看有数据的桶。
1557
+ if (preset === 'all') return { from: 0, to: now.getTime() }
1332
1558
  const from = new Date(custom.from + 'T00:00:00').getTime()
1333
1559
  const to = new Date(custom.to + 'T23:59:59.999').getTime()
1334
1560
  if (!Number.isFinite(from) || !Number.isFinite(to)) {
@@ -1405,26 +1631,44 @@ const ICON_PATHS = {
1405
1631
  up: 'M12 21V9m0 0l-4.5 4.5M12 9l4.5 4.5M4 3h16',
1406
1632
  activity: 'M2 12h4l2.5-8 5 16 2.5-8h6',
1407
1633
  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',
1408
- refresh: 'M21 12a9 9 0 11-2.64-6.36M21 4v6h-6',
1634
+ // 刷新图标取自 DSH 原生图形(16 网格、stroke 1.5),与设置页其它图标同一观感;
1635
+ // 其余图标仍是 24 网格(stroke 2),SvgIcon 两种定义都吃。
1636
+ refresh: {
1637
+ viewBox: '0 0 16 16',
1638
+ strokeWidth: 1.5,
1639
+ paths: [
1640
+ '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',
1641
+ 'M14.4999 1.5V5.1H10.8999',
1642
+ ],
1643
+ },
1409
1644
  chevron: 'M6 9l6 6 6-6',
1410
1645
  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',
1411
1646
  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',
1412
1647
  search: 'M21 21l-4.35-4.35M17 10.5a6.5 6.5 0 11-13 0 6.5 6.5 0 0113 0z',
1648
+ // 饼图(占比):外圈 + 楔形,与卡片标题的「占比」语义一致
1649
+ share: 'M21.21 15.89A10 10 0 118 2.83M22 12A10 10 0 0012 2v10z',
1650
+ check: 'M20 6L9 17l-5-5',
1413
1651
  }
1414
1652
  function SvgIcon(props) {
1415
1653
  const { name, size, className } = props
1654
+ // 一个名字对应「一串 path + 自己的 viewBox/线宽」;字符串是 24 网格的简写,
1655
+ // 调用方(31 处)无需关心差别。
1656
+ const spec = ICON_PATHS[name] || ICON_PATHS.activity
1657
+ const icon = typeof spec === 'string'
1658
+ ? { viewBox: '0 0 24 24', strokeWidth: 2, paths: [spec] }
1659
+ : spec
1416
1660
  return h('svg', {
1417
1661
  className: className || 'tsd-icon',
1418
1662
  width: size || 16,
1419
1663
  height: size || 16,
1420
- viewBox: '0 0 24 24',
1664
+ viewBox: icon.viewBox || '0 0 24 24',
1421
1665
  fill: 'none',
1422
1666
  stroke: 'currentColor',
1423
- strokeWidth: 2,
1667
+ strokeWidth: icon.strokeWidth || 2,
1424
1668
  strokeLinecap: 'round',
1425
1669
  strokeLinejoin: 'round',
1426
1670
  'aria-hidden': true,
1427
- }, h('path', { d: ICON_PATHS[name] || ICON_PATHS.activity }))
1671
+ }, icon.paths.map((d, i) => h('path', { key: i, d })))
1428
1672
  }
1429
1673
 
1430
1674
  /* ---------------------------------------------------------------------------
@@ -1441,6 +1685,58 @@ function useOutsideClick(open, ref, onClose) {
1441
1685
  }, [open, onClose, ref])
1442
1686
  }
1443
1687
 
1688
+ /* ---------------------------------------------------------------------------
1689
+ * 通用 Hook:浮层定位(viewport 定位 + 空间不足上翻 + 高度封顶)
1690
+ *
1691
+ * 设置面板本身是 `overflow: hidden` 的裁剪容器,贴着过滤栏右端的 absolute
1692
+ * 浮层会被整条裁掉(右侧的「清空」看不见)。CSS 无法感知祖先裁剪,只能量一次
1693
+ * 视口再定位;滚动或缩放时重算,避免浮层留在原地。
1694
+ * ------------------------------------------------------------------------- */
1695
+ const PANEL_MIN_ROOM = 240 // 下方空间小于它且上方更宽裕时上翻
1696
+ const PANEL_MIN_HEIGHT = 160
1697
+
1698
+ function useFixedPanel(anchorRef, open, width, gap = 6, margin = 12) {
1699
+ const [style, setStyle] = React.useState(null)
1700
+ React.useEffect(() => {
1701
+ if (!open) {
1702
+ setStyle(null)
1703
+ return undefined
1704
+ }
1705
+ function measure() {
1706
+ const el = anchorRef.current
1707
+ if (!el) return
1708
+ const r = el.getBoundingClientRect()
1709
+ const boxW = Math.min(width, window.innerWidth - margin * 2)
1710
+ const left = Math.max(margin, Math.min(r.left, window.innerWidth - margin - boxW))
1711
+ const below = window.innerHeight - r.bottom - gap - margin
1712
+ const above = r.top - gap - margin
1713
+ const flip = below < PANEL_MIN_ROOM && above > below
1714
+ setStyle({
1715
+ position: 'fixed',
1716
+ left,
1717
+ width: boxW,
1718
+ maxHeight: Math.max(PANEL_MIN_HEIGHT, flip ? above : below),
1719
+ ...(flip
1720
+ ? { bottom: window.innerHeight - r.top + gap }
1721
+ : { top: r.bottom + gap }),
1722
+ display: 'flex',
1723
+ flexDirection: 'column',
1724
+ zIndex: 40,
1725
+ })
1726
+ }
1727
+ measure()
1728
+ window.addEventListener('resize', measure)
1729
+ window.addEventListener('scroll', measure, true)
1730
+ return () => {
1731
+ window.removeEventListener('resize', measure)
1732
+ window.removeEventListener('scroll', measure, true)
1733
+ }
1734
+ }, [open, anchorRef, width, gap, margin])
1735
+ if (!open) return null
1736
+ // 首帧还没量到尺寸:先藏起来,否则会闪到左上角
1737
+ return style || { position: 'fixed', top: 0, left: 0, visibility: 'hidden' }
1738
+ }
1739
+
1444
1740
  /* ---------------------------------------------------------------------------
1445
1741
  * Header:标题 + 副标题 + 刷新按钮
1446
1742
  * ------------------------------------------------------------------------- */
@@ -1455,6 +1751,8 @@ function StatsHeader(props) {
1455
1751
  type: 'button',
1456
1752
  className: 'tsd-icon-btn' + (busy ? ' tsd-spinning' : ''),
1457
1753
  onClick: onRefresh,
1754
+ disabled: busy,
1755
+ 'aria-busy': busy || undefined,
1458
1756
  title: t('refresh'),
1459
1757
  'aria-label': t('refresh'),
1460
1758
  }, h(SvgIcon, { name: 'refresh' })))
@@ -1464,8 +1762,9 @@ function StatsHeader(props) {
1464
1762
  * 自定义日期范围浮层
1465
1763
  * ------------------------------------------------------------------------- */
1466
1764
  function CustomRangePopover(props) {
1467
- const { custom, onApply, onClose } = props
1765
+ const { custom, onApply, onClose, anchorRef } = props
1468
1766
  const t = useT()
1767
+ const panelStyle = useFixedPanel(anchorRef, true, 300)
1469
1768
  const [from, setFrom] = React.useState(custom.from)
1470
1769
  const [to, setTo] = React.useState(custom.to)
1471
1770
  const invalid = !from || !to || from > to
@@ -1479,6 +1778,7 @@ function CustomRangePopover(props) {
1479
1778
  }, [onClose])
1480
1779
  return h('div', {
1481
1780
  className: 'tsd-popover tsd-range-popover',
1781
+ style: panelStyle,
1482
1782
  role: 'dialog',
1483
1783
  'aria-label': t('customRangeAria'),
1484
1784
  },
@@ -1518,6 +1818,7 @@ function ModelDropdown(props) {
1518
1818
  const [open, setOpen] = React.useState(false)
1519
1819
  const [query, setQuery] = React.useState('')
1520
1820
  const anchorRef = React.useRef(null)
1821
+ const panelStyle = useFixedPanel(anchorRef, open, 320)
1521
1822
 
1522
1823
  React.useEffect(() => {
1523
1824
  if (!open) return undefined
@@ -1536,8 +1837,10 @@ function ModelDropdown(props) {
1536
1837
  }, [open])
1537
1838
 
1538
1839
  // 只列出当前范围有数据的模型;已选但掉出候选列表的「补回」,保证可渲染、可清除
1840
+ // 候选键直接用宿主给好的 `key`(compositeModelKey 的结果):客户端不再自己拼
1841
+ // `provider + '/' + model`,provider 为空时那种拼法会得到 `/model` 而永远选不中。
1539
1842
  const candidates = React.useMemo(() => {
1540
- const set = new Set((options || []).map((m) => m.provider + '/' + m.model))
1843
+ const set = new Set((options || []).map((m) => m.key || (m.provider ? m.provider + '/' + m.model : m.model)))
1541
1844
  ;(selected || []).forEach((m) => set.add(m))
1542
1845
  const list = Array.from(set)
1543
1846
  list.sort()
@@ -1562,6 +1865,7 @@ function ModelDropdown(props) {
1562
1865
  open
1563
1866
  ? h('div', {
1564
1867
  className: 'tsd-popover tsd-model-popover',
1868
+ style: panelStyle,
1565
1869
  role: 'listbox',
1566
1870
  'aria-label': t('modelFilterGroup'),
1567
1871
  'aria-multiselectable': true,
@@ -1611,6 +1915,7 @@ function FilterBar(props) {
1611
1915
  } = props
1612
1916
  const t = useT()
1613
1917
  const segRef = React.useRef(null)
1918
+ const customBtnRef = React.useRef(null)
1614
1919
  useOutsideClick(customOpen, segRef, onCustomClose)
1615
1920
 
1616
1921
  const customLabel = fmtDateSlash(custom.from) + ' - ' + fmtDateSlash(custom.to)
@@ -1618,6 +1923,7 @@ function FilterBar(props) {
1618
1923
  { key: 'today', label: t('today') },
1619
1924
  { key: '7d', label: t('last7d') },
1620
1925
  { key: '30d', label: t('last30d') },
1926
+ { key: 'all', label: t('all') },
1621
1927
  { key: 'custom', label: t('custom') },
1622
1928
  ]
1623
1929
 
@@ -1631,6 +1937,7 @@ function FilterBar(props) {
1631
1937
  return h('button', {
1632
1938
  key: p.key,
1633
1939
  type: 'button',
1940
+ ref: isCustom ? customBtnRef : undefined,
1634
1941
  className: 'tsd-seg-btn' + (active ? ' tsd-seg-active' : '') + (isCustom ? ' tsd-seg-custom' : ''),
1635
1942
  'aria-pressed': active,
1636
1943
  title: isCustom && active ? customLabel : undefined,
@@ -1638,15 +1945,232 @@ function FilterBar(props) {
1638
1945
  },
1639
1946
  h('span', { className: 'tsd-seg-label' }, label))
1640
1947
  })),
1641
- customOpen ? h(CustomRangePopover, { custom, onApply: onCustomApply, onClose: onCustomClose }) : null),
1948
+ customOpen
1949
+ ? h(CustomRangePopover, { custom, onApply: onCustomApply, onClose: onCustomClose, anchorRef: customBtnRef })
1950
+ : null),
1642
1951
  h(ModelDropdown, { options: modelOptions, selected: models, onChange: onModelsChange }))
1643
1952
  }
1644
1953
 
1645
1954
  /* ---------------------------------------------------------------------------
1646
- * 汇总指标卡 ×5
1955
+ * 参考成本币种切换(人民币 / 美元,固定 1 USD = 7 CNY)
1956
+ *
1957
+ * 换算在宿主侧完成(价目表是美元价,绝不回写),所以这里只负责选择与持久化:
1958
+ * 换币种即换查询,不重查数字不会变。
1959
+ * ------------------------------------------------------------------------- */
1960
+ const CURRENCY_SYMBOLS = { CNY: '¥', USD: '$' }
1961
+ const CURRENCY_STORE_KEY = 'dsh-plugin-usage:display-currency'
1962
+
1963
+ function readStoredCurrency() {
1964
+ try {
1965
+ return window.localStorage.getItem(CURRENCY_STORE_KEY) === 'USD' ? 'USD' : 'CNY'
1966
+ } catch (e) {
1967
+ return 'CNY' // 无痕模式 / 存储被禁:退回默认
1968
+ }
1969
+ }
1970
+ function storeCurrency(code) {
1971
+ try {
1972
+ window.localStorage.setItem(CURRENCY_STORE_KEY, code)
1973
+ } catch (e) {
1974
+ // 存不下就只影响下次打开,不影响本次显示
1975
+ }
1976
+ }
1977
+
1978
+ function CurrencyPicker(props) {
1979
+ const { code, onChange } = props
1980
+ const t = useT()
1981
+ const [open, setOpen] = React.useState(false)
1982
+ const ref = React.useRef(null)
1983
+ const panelStyle = useFixedPanel(ref, open, 180)
1984
+ useOutsideClick(open, ref, () => setOpen(false))
1985
+ const active = CURRENCY_SYMBOLS[code] ? code : 'CNY'
1986
+ const options = ['CNY', 'USD']
1987
+ // 收起时 ↑↓ 直接换值(像原生 select),展开时在两项间移动;Esc 关菜单。
1988
+ const move = (step) => {
1989
+ const i = options.indexOf(active)
1990
+ onChange(options[(i + step + options.length) % options.length])
1991
+ }
1992
+ const onKeyDown = (e) => {
1993
+ if (e.key === 'Escape') { setOpen(false); return }
1994
+ if (!open) {
1995
+ if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { e.preventDefault(); move(e.key === 'ArrowDown' ? 1 : -1); return }
1996
+ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpen(true) }
1997
+ return
1998
+ }
1999
+ if (e.key === 'ArrowDown') { e.preventDefault(); move(1) }
2000
+ else if (e.key === 'ArrowUp') { e.preventDefault(); move(-1) }
2001
+ }
2002
+ return h('span', { className: 'tsd-cur-anchor', ref },
2003
+ h('button', {
2004
+ type: 'button',
2005
+ className: 'tsd-cur-btn' + (open ? ' tsd-cur-btn-open' : ''),
2006
+ title: t('currencyHint'),
2007
+ 'aria-label': t('currencyHint'),
2008
+ 'aria-haspopup': 'listbox',
2009
+ 'aria-expanded': open,
2010
+ onClick: () => setOpen((v) => !v),
2011
+ onKeyDown,
2012
+ },
2013
+ h('span', null, CURRENCY_SYMBOLS[active]),
2014
+ h(SvgIcon, { name: 'chevron', size: 10, className: 'tsd-cur-chevron' })),
2015
+ open
2016
+ ? h('div', {
2017
+ className: 'tsd-popover tsd-cur-popover',
2018
+ style: panelStyle,
2019
+ role: 'listbox',
2020
+ 'aria-label': t('currencyHint'),
2021
+ onKeyDown,
2022
+ },
2023
+ options.map((c) => h('button', {
2024
+ key: c,
2025
+ type: 'button',
2026
+ role: 'option',
2027
+ 'aria-selected': c === active,
2028
+ className: 'tsd-cur-option' + (c === active ? ' tsd-cur-option-active' : ''),
2029
+ onClick: () => { onChange(c); setOpen(false) },
2030
+ },
2031
+ h('span', { className: 'tsd-cur-symbol' }, CURRENCY_SYMBOLS[c]),
2032
+ h('span', { className: 'tsd-cur-name' }, t(c === 'CNY' ? 'currencyCNY' : 'currencyUSD')),
2033
+ c === active ? h(SvgIcon, { name: 'check', size: 12, className: 'tsd-cur-check' }) : null)),
2034
+ h('div', { className: 'tsd-popover-note' }, t('currencyHint')))
2035
+ : null)
2036
+ }
2037
+
2038
+ /* ---------------------------------------------------------------------------
2039
+ * 模型占比(KPI 网格里的第 6 格)
2040
+ *
2041
+ * 数据直接吃宿主 `byModel` 的行(与「按模型明细」表同一份),不另算一遍。
2042
+ * 明细放在各段的原生 title 上而不是浮层:KPI 卡贴着设置面板的裁剪边界,
2043
+ * 再叠一层浮层只会把之前修好的裁剪问题带回来。
2044
+ * ------------------------------------------------------------------------- */
2045
+ const SHARE_COLORS = [
2046
+ // 只用主题里真实存在、且彼此分得开的彩色族:深蓝、绿、琥珀、红。
2047
+ // 不用 neutral / 白 / 黑 —— 它们在深浅两套主题里一边会糊进背景,一边会被读成禁用态。
2048
+ 'var(--dsw-static-deepseek-500)',
2049
+ 'var(--dsw-static-green-500)',
2050
+ 'var(--dsw-static-amber-500)',
2051
+ 'var(--dsw-static-red-400)',
2052
+ ]
2053
+ const SHARE_TOP = 4
2054
+ const SHARE_REST_KEY = '__rest__'
2055
+
2056
+ /** `provider/model` → 裸模型名;色带格位放不下全名,全名留给 title 与 aria。 */
2057
+ function shortModelName(key) {
2058
+ const s = String(key == null ? '' : key)
2059
+ const i = s.lastIndexOf('/')
2060
+ return i === -1 ? s : s.slice(i + 1)
2061
+ }
2062
+ /** 宿主行是 `totalTokens`;兼容已映射成 `total` 的形状,空行也不能抛。 */
2063
+ function rowTotal(r) {
2064
+ return r ? (r.totalTokens || r.total || 0) : 0
2065
+ }
2066
+ /** 降序取前 4 段,其余并成「其它」;无数据时返回空段。 */
2067
+ function shareSegments(rows) {
2068
+ const list = (rows || []).slice().sort((a, b) => rowTotal(b) - rowTotal(a))
2069
+ const total = list.reduce((s, r) => s + rowTotal(r), 0)
2070
+ if (total <= 0) return { total: 0, segs: [] }
2071
+ const numbers = (r) => ({
2072
+ tokens: rowTotal(r),
2073
+ calls: r.calls || 0,
2074
+ // 与明细表同一口径:输入含缓存读写
2075
+ input: (r.inputTokens || 0) + (r.cacheReadTokens || 0) + (r.cacheWriteTokens || 0),
2076
+ output: r.outputTokens || 0,
2077
+ cost: r.cost || 0,
2078
+ })
2079
+ const segs = list.slice(0, SHARE_TOP).map((r, i) => Object.assign({
2080
+ key: String(r.key),
2081
+ label: shortModelName(r.key),
2082
+ pct: rowTotal(r) / total,
2083
+ color: SHARE_COLORS[i % SHARE_COLORS.length],
2084
+ }, numbers(r)))
2085
+ const restRows = list.slice(SHARE_TOP)
2086
+ const restTokens = restRows.reduce((s, r) => s + rowTotal(r), 0)
2087
+ if (restTokens > 0) {
2088
+ const agg = restRows.reduce((a, r) => {
2089
+ const n = numbers(r)
2090
+ return {
2091
+ tokens: a.tokens + n.tokens,
2092
+ calls: a.calls + n.calls,
2093
+ input: a.input + n.input,
2094
+ output: a.output + n.output,
2095
+ cost: a.cost + n.cost,
2096
+ }
2097
+ }, { tokens: 0, calls: 0, input: 0, output: 0, cost: 0 })
2098
+ segs.push(Object.assign({
2099
+ key: SHARE_REST_KEY,
2100
+ label: null, // 「其它」的文案由渲染层取词典
2101
+ pct: restTokens / total,
2102
+ // 「其它」用同色系的淡色(浅蓝),不用灰/白:那两种在深色卡片上会被读成禁用
2103
+ color: 'var(--dsw-static-deepseek-300)',
2104
+ }, agg))
2105
+ }
2106
+ return { total, segs }
2107
+ }
2108
+
2109
+ function ModelShareBar(props) {
2110
+ const { rows, currency } = props
2111
+ const t = useT()
2112
+ const [tip, setTip] = React.useState(null) // { key, left, top } in viewport coords
2113
+ const occ = shareSegments(rows)
2114
+ if (occ.total <= 0) return h('div', { className: 'tsd-card-value tsd-share-empty' }, t('noData'))
2115
+ const find = (key) => occ.segs.filter((s) => s.key === key)[0] || null
2116
+ const shown = (tip && find(tip.key)) || occ.segs[0]
2117
+ const labelOf = (s) => (s.key === SHARE_REST_KEY ? t('shareOther') : s.label)
2118
+ const fullOf = (s) => (s.key === SHARE_REST_KEY ? t('shareOther') : s.key)
2119
+ const costOf = (s) => (s.tokens > 0 && !(s.cost > 0) ? t('unpriced') : formatCost(s.cost, currency))
2120
+ // 悬停/聚焦:从段的视口矩形推开,fixed 定位不受设置面板 overflow 裁剪
2121
+ const showTip = (e, s) => {
2122
+ const r = e.currentTarget.getBoundingClientRect()
2123
+ setTip({ key: s.key, left: r.left + r.width / 2, top: r.top })
2124
+ }
2125
+ const hideTip = () => setTip(null)
2126
+ const tipBox = shown && tip
2127
+ ? h('div', {
2128
+ className: 'tsd-tooltip tsd-share-tip',
2129
+ style: { position: 'fixed', left: tip.left + 'px', top: tip.top + 'px', transform: 'translate(-50%, -110%)' },
2130
+ },
2131
+ h('div', { className: 'tsd-tooltip-date' }, fullOf(shown)),
2132
+ h('div', { className: 'tsd-tooltip-row' },
2133
+ h('span', { className: 'tsd-tooltip-dot', style: { background: shown.color } }),
2134
+ h('span', null, t('totalTokens')),
2135
+ h('span', { className: 'tsd-tooltip-val' }, formatInt(shown.tokens))),
2136
+ h('div', { className: 'tsd-tooltip-row' },
2137
+ h('span', null, t('legendInput')),
2138
+ h('span', { className: 'tsd-tooltip-val' }, formatInt(shown.input))),
2139
+ h('div', { className: 'tsd-tooltip-row' },
2140
+ h('span', null, t('legendOutput')),
2141
+ h('span', { className: 'tsd-tooltip-val' }, formatInt(shown.output))),
2142
+ h('div', { className: 'tsd-tooltip-row' },
2143
+ h('span', null, t('cost')),
2144
+ h('span', { className: 'tsd-tooltip-val' }, costOf(shown))))
2145
+ : null
2146
+ return h('div', { className: 'tsd-card-share-body' },
2147
+ h('div', { className: 'tsd-share-track', onMouseLeave: hideTip },
2148
+ occ.segs.map((s) => h('div', {
2149
+ key: s.key,
2150
+ className: 'tsd-share-seg',
2151
+ 'data-share-key': s.key,
2152
+ 'data-active': shown && shown.key === s.key ? 'true' : undefined,
2153
+ style: { width: s.pct * 100 + '%', background: s.color },
2154
+ role: 'img',
2155
+ tabIndex: 0,
2156
+ 'aria-label': fullOf(s) + ' · ' + fmtPct(s.pct) + ' · ' + formatInt(s.tokens) + ' ' + t('totalTokens'),
2157
+ onMouseEnter: (e) => showTip(e, s),
2158
+ onFocus: (e) => showTip(e, s),
2159
+ onBlur: hideTip,
2160
+ }))),
2161
+ // 条下只留一行低调脚注(当前悬浮的那段,否则最大的那段);
2162
+ // 全名与明细都在悬浮卡片里,所以这里不挂 title。
2163
+ h('div', { className: 'tsd-share-caption' },
2164
+ h('span', { className: 'tsd-share-cap-name' }, labelOf(shown)),
2165
+ h('span', { className: 'tsd-share-cap-pct' }, fmtPct(shown.pct))),
2166
+ tipBox)
2167
+ }
2168
+
2169
+ /* ---------------------------------------------------------------------------
2170
+ * 汇总指标卡 ×6
1647
2171
  * ------------------------------------------------------------------------- */
1648
2172
  function SummaryCards(props) {
1649
- const { total, currency, unpricedCalls } = props
2173
+ const { total, currency, unpricedCalls, currencyCode, onCurrencyChange, byModel } = props
1650
2174
  const tt = useT()
1651
2175
  const d = total || {}
1652
2176
  const inputTotal = (d.inputTokens || 0) + (d.cacheReadTokens || 0) + (d.cacheWriteTokens || 0)
@@ -1673,8 +2197,15 @@ function SummaryCards(props) {
1673
2197
  },
1674
2198
  {
1675
2199
  key: 'cost', icon: 'coins', label: tt('cost'),
1676
- value: formatCost(d.cost, currency), title: formatCost(d.cost, currency),
2200
+ // 符号由 prefix 的币种切换器画(它显示当前币种符号),这里只给数字
2201
+ value: costDigits(d.cost), title: formatCost(d.cost, currency),
1677
2202
  color: 'var(--dsw-static-green-500)',
2203
+ prefix: h(CurrencyPicker, { code: currencyCode, onChange: onCurrencyChange }),
2204
+ },
2205
+ {
2206
+ key: 'share', icon: 'share', label: tt('modelShare'),
2207
+ color: 'var(--dsw-alias-brand-primary)',
2208
+ content: h(ModelShareBar, { rows: byModel, currency }),
1678
2209
  },
1679
2210
  ]
1680
2211
  return h('div', { className: 'tsd-cards' },
@@ -1684,7 +2215,9 @@ function SummaryCards(props) {
1684
2215
  h('span', { className: 'tsd-card-icon', style: { color: c.color } },
1685
2216
  h(SvgIcon, { name: c.icon, size: 14 })),
1686
2217
  h('span', { className: 'tsd-card-label' }, c.label)),
1687
- h('div', { className: 'tsd-card-value', title: c.title }, c.value),
2218
+ c.content
2219
+ ? c.content
2220
+ : h('div', { className: 'tsd-card-value', title: c.title }, c.prefix || null, c.value),
1688
2221
  c.sub ? h('div', { className: 'tsd-card-sub' }, c.sub) : null,
1689
2222
  c.key === 'cost' && unpricedCalls > 0
1690
2223
  ? h('div', { className: 'tsd-card-note' }, tt('unpricedNote', { count: formatInt(unpricedCalls) }))
@@ -2224,6 +2757,9 @@ function StatsDashboard(props) {
2224
2757
  const [data, setData] = React.useState(null)
2225
2758
  const [error, setError] = React.useState(null)
2226
2759
  const [prices, setPrices] = React.useState({ prices: {}, currency: '¥' })
2760
+ // 展示币种:宿主按它换算成本,所以换币种必须重查;选择记在本地(展示偏好,
2761
+ // 不写插件设置,免得每次取数都在改写用户配置)。
2762
+ const [displayCurrency, setDisplayCurrency] = React.useState(readStoredCurrency)
2227
2763
  // P1-6 backfill 轮询状态:queryKey 变化时重置,仅对同一查询串轮询
2228
2764
  const queryKeyRef = React.useRef(null)
2229
2765
  const backfillSeenRef = React.useRef(false)
@@ -2241,7 +2777,7 @@ function StatsDashboard(props) {
2241
2777
  React.useEffect(() => {
2242
2778
  let current = true
2243
2779
  let backfillTimer = null
2244
- const queryKey = eff.from + '|' + eff.to + '|' + models.join(',') + '|' + effGran + '|' + stepDays
2780
+ const queryKey = eff.from + '|' + eff.to + '|' + models.join(',') + '|' + effGran + '|' + stepDays + '|' + displayCurrency
2245
2781
  if (queryKeyRef.current !== queryKey) {
2246
2782
  queryKeyRef.current = queryKey
2247
2783
  backfillSeenRef.current = false
@@ -2254,10 +2790,12 @@ function StatsDashboard(props) {
2254
2790
  from: eff.from,
2255
2791
  to: eff.to,
2256
2792
  models: models.slice(),
2257
- fill: true,
2793
+ // 「全部」不做零填充:真实边界是输出桶数(宿主 MAX_BUCKETS),不是天数。
2794
+ fill: range !== 'all',
2258
2795
  granularity: effGran,
2259
2796
  stepDays,
2260
2797
  heatmap: true,
2798
+ currency: displayCurrency,
2261
2799
  })
2262
2800
  .then((r) => {
2263
2801
  if (!current) return
@@ -2285,7 +2823,7 @@ function StatsDashboard(props) {
2285
2823
  current = false
2286
2824
  if (backfillTimer !== null) clearTimeout(backfillTimer)
2287
2825
  }
2288
- }, [eff.from, eff.to, models, effGran, stepDays, retry])
2826
+ }, [eff.from, eff.to, models, effGran, stepDays, displayCurrency, retry])
2289
2827
 
2290
2828
  // 价格表:进入页面拉一次 + 每次刷新同步。
2291
2829
  // P0-1:优先官方 settings scope(usage.prices 命名空间),不可用时回退 RPC。
@@ -2336,6 +2874,15 @@ function StatsDashboard(props) {
2336
2874
  setRange('today')
2337
2875
  }, [])
2338
2876
 
2877
+ const changeCurrency = React.useCallback((code) => {
2878
+ storeCurrency(code)
2879
+ setDisplayCurrency(code)
2880
+ }, [])
2881
+ // 符号以宿主回传的实际币种为准(切换后立刻重查,不会出现「换了标志没换数字」);
2882
+ // 老宿主没有该字段时按本地选择兜底。
2883
+ const currencySymbol = (data && data.currency && data.currency.symbol)
2884
+ || CURRENCY_SYMBOLS[displayCurrency] || prices.currency || '¥'
2885
+
2339
2886
  const busy = status === 'loading' || status === 'refreshing'
2340
2887
  const ready = data !== null
2341
2888
  const isError = status === 'error'
@@ -2374,8 +2921,11 @@ function StatsDashboard(props) {
2374
2921
  ? h('div', { className: 'tsd-content', 'data-busy': busy ? 'true' : undefined },
2375
2922
  h(SummaryCards, {
2376
2923
  total: data.total,
2377
- currency: prices.currency || '¥',
2924
+ currency: currencySymbol,
2378
2925
  unpricedCalls: data.unpricedCalls || 0,
2926
+ currencyCode: displayCurrency,
2927
+ onCurrencyChange: changeCurrency,
2928
+ byModel: data.byModel,
2379
2929
  }),
2380
2930
  h(DailyChart, {
2381
2931
  daily: data.daily,
@@ -2384,10 +2934,86 @@ function StatsDashboard(props) {
2384
2934
  granLabel,
2385
2935
  }),
2386
2936
  h(HeatmapCard, { days: data.heatmap || [] }),
2387
- h(ModelTable, { rows: data.byModel, currency: prices.currency || '¥' }))
2937
+ h(ModelTable, { rows: data.byModel, currency: currencySymbol }))
2388
2938
  : null))
2389
2939
  }
2390
2940
 
2941
+ /* ---------------------------------------------------------------------------
2942
+ * 设置页导航图标
2943
+ *
2944
+ * `settings.section` 只投影 id/order/label,导航图标由设置页按 id 白名单自己
2945
+ * 决定(dsh-client-ui-settings-general 的 navIcon),第三方没有插口。所以这里
2946
+ * 给「自己那一行」打一个属性标记,再用 CSS mask 把兜底的齿轮换成用量图标:
2947
+ * 不替换节点、不碰 React 管的 svg(替换会让 React 卸载时抛 NotFoundError),
2948
+ * 只加属性、只用 ::before 画字形。
2949
+ *
2950
+ * 认行只能按可见文本:类名是 CSS Modules 哈希,账号行还会条件出现。
2951
+ * 官方一旦给 settings.section 加上 icon 字段,这个模块应整体删除。
2952
+ * ------------------------------------------------------------------------- */
2953
+ const NAV_ICON_MASK = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(
2954
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">'
2955
+ + '<rect x="2.5" y="9" width="2.5" height="5" rx="1"/>'
2956
+ + '<rect x="6.75" y="5.5" width="2.5" height="8.5" rx="1"/>'
2957
+ + '<rect x="11" y="2.5" width="2.5" height="11.5" rx="1"/></svg>',
2958
+ )
2959
+ // mask 只读 alpha 通道,所以字形必须是纯色实心(icon.svg 的渐变与半透明在这里会丢)
2960
+ const NAV_ICON_CSS = [
2961
+ '[data-tsd-nav] > svg { display: none; }',
2962
+ '[data-tsd-nav]::before {',
2963
+ " content: '';",
2964
+ ' flex: none;',
2965
+ ' width: 16px;',
2966
+ ' height: 16px;',
2967
+ ' background: currentColor;',
2968
+ ' -webkit-mask-image: url("' + NAV_ICON_MASK + '");',
2969
+ ' mask-image: url("' + NAV_ICON_MASK + '");',
2970
+ ' -webkit-mask-size: 16px 16px;',
2971
+ ' mask-size: 16px 16px;',
2972
+ ' -webkit-mask-repeat: no-repeat;',
2973
+ ' mask-repeat: no-repeat;',
2974
+ '}',
2975
+ ].join('\n')
2976
+
2977
+ /** 认不出行、拿不到 DOM,都只是退化成齿轮,绝不抛出。返回 disposer。 */
2978
+ function installSettingsNavIcon(label) {
2979
+ if (typeof document === 'undefined' || typeof MutationObserver !== 'function') return null
2980
+ let styleEl = null
2981
+ try {
2982
+ styleEl = document.createElement('style')
2983
+ styleEl.setAttribute('data-plugin', 'dsh-plugin-usage')
2984
+ styleEl.textContent = NAV_ICON_CSS
2985
+ document.head.appendChild(styleEl)
2986
+ } catch (e) {
2987
+ console.warn('[usage] settings nav icon: styles unavailable')
2988
+ return null
2989
+ }
2990
+ const mark = () => {
2991
+ const rows = document.querySelectorAll('[role="dialog"] button')
2992
+ const want = label()
2993
+ for (let i = 0; i < rows.length; i++) {
2994
+ const row = rows[i]
2995
+ if (row.getAttribute('data-tsd-nav') !== null) continue
2996
+ if (!row.querySelector('svg')) continue // 只标带图标的导航行,别误标普通按钮
2997
+ if ((row.textContent || '').trim() !== want) continue
2998
+ row.setAttribute('data-tsd-nav', '')
2999
+ }
3000
+ }
3001
+ let observer = null
3002
+ try {
3003
+ mark()
3004
+ observer = new MutationObserver(() => { try { mark() } catch (e) {} })
3005
+ observer.observe(document.body, { childList: true, subtree: true })
3006
+ } catch (e) {
3007
+ console.warn('[usage] settings nav icon: observer unavailable', e)
3008
+ }
3009
+ return () => {
3010
+ if (observer) observer.disconnect()
3011
+ if (styleEl) styleEl.remove()
3012
+ const marked = document.querySelectorAll('[data-tsd-nav]')
3013
+ for (let i = 0; i < marked.length; i++) marked[i].removeAttribute('data-tsd-nav')
3014
+ }
3015
+ }
3016
+
2391
3017
  /* ---------------------------------------------------------------------------
2392
3018
  * 注册:settings.section 页面
2393
3019
  * ------------------------------------------------------------------------- */
@@ -2408,6 +3034,7 @@ function apply(ctx) {
2408
3034
  }, 'usage: styles')
2409
3035
  ctx.effect(() => ctx.locale.register(NS, { zh: ZH, en: EN }), 'usage: dictionaries')
2410
3036
  const t0 = ctx.locale ? ctx.locale.bind(NS) : fallbackT
3037
+ ctx.effect(() => installSettingsNavIcon(() => t0('nav')), 'usage: nav-icon')
2411
3038
  // cordis ctx is a strict proxy: DIRECT property access on an un-injected
2412
3039
  // service throws ("cannot get property X without inject"), so a bare
2413
3040
  // `ctx.slots ?? ...` would throw and skip the fallback. Probe via the safe
@@ -2447,4 +3074,4 @@ return { inject: ['locale', 'slots'], apply }
2447
3074
  return module.exports;
2448
3075
  }
2449
3076
  });
2450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9ydWFuYncvcHJvamVjdHMvdXNhZ2Uvc3JjL2NsaWVudC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUb2tlbiDnlKjph4/nu5/orqEg4oCUIHNldHRpbmdzLnNlY3Rpb24gQ2xpZW50IFVJ77yI57qvIEpT77yM5Yqo5oCB5o+S5Lu25rKZ566x77yJXG4vLyDlj6/nlKjlhajlsYDvvJpSZWFjdCAvIGN0eCAvIHN0eWxlcyAvIGhvc3QgLyBjb25zb2xl77yb5rWP6KeI5Zmo5YWo5bGAIERhdGUgLyBJbnRsIOetieOAglxuLy8gQ1NTIOW4uOmHj+WGheiBlOiHqiBzdHlsZXMuanPvvIjliqjmgIHmj5Lku7bmspnnrrHml6AgaW1wb3J077yM5qC35byP6ZqP5pys5paH5Lu25Yqg6L2977yJ44CCXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBDU1MgPSBgXG4vKiA9PT09PT09PT09PT0g5biD5bGAID09PT09PT09PT09PSAqL1xuLnRzZC1zZWN0aW9uIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYW5pbWF0aW9uOiB0c2QtZmFkZS1pbiAwLjRzIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbkBrZXlmcmFtZXMgdHNkLWZhZGUtaW4ge1xuICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cbiAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7IH1cbn1cblxuLyogPT09PT09PT09PT09IEhlYWRlciA9PT09PT09PT09PT0gKi9cbi50c2QtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGdhcDogMTJweDtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuLnRzZC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAyNHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2Qtc3VidGl0bGUge1xuICBtYXJnaW46IDRweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xufVxuLnRzZC1pY29uLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDM0cHg7XG4gIGhlaWdodDogMzRweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udDogaW5oZXJpdDtcbn1cbi50c2QtaWNvbi1idG46aG92ZXIge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpO1xufVxuLnRzZC1zcGlubmluZyBzdmcge1xuICBhbmltYXRpb246IHRzZC1zcGluIDAuOXMgbGluZWFyIGluZmluaXRlO1xufVxuQGtleWZyYW1lcyB0c2Qtc3BpbiB7XG4gIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0g562b6YCJ5qCPID09PT09PT09PT09PSAqL1xuLnRzZC1maWx0ZXJiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuLnRzZC1zZWctd3JhcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLXNlZyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KSAxMiUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2Qtc2VnLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDI4cHg7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2Qtc2VnLWJ0bjpob3ZlciB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7XG59XG4udHNkLXNlZy1hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctYmFzZSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2Qtc2VnLWN1c3RvbSB7XG4gIG1heC13aWR0aDogMjIwcHg7XG59XG4udHNkLXNlZy1jdXN0b20gLnRzZC1zZWctbGFiZWwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2Qtc2VnLWN1c3RvbS50c2Qtc2VnLWFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5LWludmVydGVkLCAjZmZmKTtcbn1cbi50c2Qtc2VnLWN1c3RvbS50c2Qtc2VnLWFjdGl2ZTpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1idXR0b24tcHJpbWFyeS1ob3Zlcik7XG59XG5cbi8qID09PT09PT09PT09PSDpgJrnlKjmjInpkq4gPT09PT09PT09PT09ICovXG4udHNkLWJ0biB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogMCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLWJ0bjpkaXNhYmxlZCB7IG9wYWNpdHk6IDAuNTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgfVxuLnRzZC1idG4tcHJpbWFyeSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1idXR0b24tcHJpbWFyeS1maWxsKTtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5LWludmVydGVkLCAjZmZmKTtcbn1cbi50c2QtYnRuLXByaW1hcnk6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktaG92ZXIpOyB9XG4udHNkLWJ0bi1naG9zdCB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4udHNkLWJ0bi1naG9zdDpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cblxuLyogPT09PT09PT09PT09IOa1ruWxgiBQb3BvdmVyID09PT09PT09PT09PSAqL1xuLnRzZC1wb3BvdmVyLWFuY2hvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLXBvcG92ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogY2FsYygxMDAlICsgNnB4KTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogNDA7XG4gIHBhZGRpbmc6IDEycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctb3ZlcmxheSk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYzKTtcbn1cbi50c2QtbW9kZWwtcG9wb3ZlciB7XG4gIHdpZHRoOiAzMjBweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMjRweCk7XG59XG4udHNkLXJhbmdlLXBvcG92ZXIge1xuICB3aWR0aDogMzAwcHg7XG4gIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDI0cHgpO1xufVxuLnRzZC1wb3BvdmVyLXRpdGxlIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBtYXJnaW46IDAgMCAxMHB4O1xufVxuLnRzZC1wb3BvdmVyLXRvb2xzIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLWxpbmstYnRuIHtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMnB4IDRweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnRzZC1saW5rLWJ0bjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtcG9wb3Zlci1hY3Rpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgZ2FwOiA4cHg7XG4gIG1hcmdpbi10b3A6IDEycHg7XG59XG4udHNkLXBvcG92ZXItbm90ZSB7XG4gIG1hcmdpbjogOHB4IDAgMDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cbi50c2QtcG9wb3Zlci1lbXB0eSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTBweCAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDmqKHlnovkuIvmi4nmkJzntKIgPT09PT09PT09PT09ICovXG4udHNkLXNlbGVjdC1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIG1pbi13aWR0aDogMTIwcHg7XG4gIG1heC13aWR0aDogMjYwcHg7XG4gIGhlaWdodDogMzZweDtcbiAgcGFkZGluZzogMCAxMHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnRzZC1zZWxlY3QtYnRuOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwzKTsgfVxuLnRzZC1zZWxlY3QtaGFzIHsgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpIDQ1JSwgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMikpOyB9XG4udHNkLXNlbGVjdC1sYWJlbCB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLWNoZXZyb24ge1xuICBmbGV4OiBub25lO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZHMtdHJhbnNpdGlvbi1kdXJhdGlvbi1mYXN0KSB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG4udHNkLWNoZXZyb24tb3BlbiB7IHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbi50c2Qtc2VhcmNoIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLXNlYXJjaC1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiA4cHg7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2Qtc2VhcmNoIGlucHV0IHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCA4cHggMCAyOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3V0bGluZTogbm9uZTtcbn1cbi50c2Qtc2VhcmNoIGlucHV0OmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSk7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpIDE4JSwgdHJhbnNwYXJlbnQpO1xufVxuLnRzZC1tb2RlbC1saXN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG4gIG1heC1oZWlnaHQ6IDI0MHB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItYmctbDIpO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWItaG92ZXI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItaG92ZXItbDIpO1xufVxuLnRzZC1tb2RlbC1pdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIHBhZGRpbmc6IDVweCA2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIG1pbi13aWR0aDogMDtcbn1cbi50c2QtbW9kZWwtaXRlbTpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtbW9kZWwtaXRlbSBpbnB1dCB7IG1hcmdpbjogMDsgYWNjZW50LWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7IH1cbi50c2QtbW9kZWwtbmFtZSB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1kcy1mb250LWZhbWlseS1jb2RlKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWluLXdpZHRoOiAwO1xufVxuXG4vKiA9PT09PT09PT09PT0g6Ieq5a6a5LmJ5pel5pyf5rWu5bGCID09PT09PT09PT09PSAqL1xuLnRzZC1yYW5nZS1maWVsZHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG4udHNkLWZpZWxkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA0cHg7XG59XG4udHNkLWZpZWxkLWxhYmVsIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWZpZWxkIGlucHV0IHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCA4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdXRsaW5lOiBub25lO1xufVxuLnRzZC1maWVsZCBpbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KSAxOCUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2QtZmllbGQtZXJyb3Ige1xuICBtYXJnaW46IDZweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KTtcbn1cbi50c2QtZmllbGQtaGludCB7XG4gIG1hcmdpbjogNnB4IDAgMDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLyogPT09PT09PT09PT09IOaxh+aAu+aMh+agh+WNoSA9PT09PT09PT09PT0gKi9cbi50c2QtY2FyZHMge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE1MHB4LCAxZnIpKTtcbiAgZ2FwOiAxMHB4O1xufVxuLnRzZC1jYXJkIHtcbiAgbWluLXdpZHRoOiAwO1xuICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMyk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2QtY2FyZC1oZWFkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG59XG4udHNkLWNhcmQtaWNvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1jYXJkLWxhYmVsIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1jYXJkLXZhbHVlIHtcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtY2FyZC1zdWIge1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG4udHNkLWNhcmQtbm90ZSB7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLXdhcm4tcHJpbWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDljaHniYflpLTpg6jvvIjlm77ooaggLyDooajmoLzlhbHnlKjvvIkgPT09PT09PT09PT09ICovXG4udHNkLWNhcmQtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBnYXA6IDhweDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cbi50c2QtY2FyZC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1jYXJkLXRhZyB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4vKiA9PT09PT09PT09PT0g5q+P5pel55So6YeP5p+x54q25Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1jaGFydC1jYXJkIHsgcGFkZGluZzogMTRweCAxNnB4IDEwcHg7IH1cbi50c2QtbGVnZW5kIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLWxlZ2VuZC1pdGVtIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbn1cbi50c2QtbGVnZW5kLWRvdCxcbi50c2QtdG9vbHRpcC1kb3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgZmxleDogbm9uZTtcbn1cbi50c2QtbGVnZW5kLWluIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApOyB9XG4udHNkLWxlZ2VuZC1vdXQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGVnZW5kLXRvdGFsIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7IH1cblxuLnRzZC1jaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIGdhcDogMnB4O1xuICBoZWlnaHQ6IDI0MHB4O1xuICBwYWRkaW5nOiAwIDRweDtcbn1cbi50c2QtY2hhcnQtY29sIHtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY2hhcnQtY29sOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuLnRzZC1jaGFydDpob3ZlciAudHNkLWNoYXJ0LWNvbCB7IG9wYWNpdHk6IDAuNDsgfVxuLnRzZC1jaGFydDpob3ZlciAudHNkLWNoYXJ0LWNvbDpob3Zlcixcbi50c2QtY2hhcnQ6Zm9jdXMtd2l0aGluIC50c2QtY2hhcnQtY29sOmZvY3VzIHsgb3BhY2l0eTogMTsgfVxuXG4udHNkLWNoYXJ0LXBsb3Qge1xuICBmbGV4OiAxO1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwxKSAxcHgsIHRyYW5zcGFyZW50IDFweCk7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAyNSU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG4udHNkLWNoYXJ0LXN0YWNrIHtcbiAgd2lkdGg6IDYyJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxuLnRzZC1jaGFydC1zZWcge1xuICB3aWR0aDogMTAwJTtcbn1cbi50c2Qtc2VnLWluIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApO1xufVxuLnRzZC1zZWctb3V0IHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDtcbn1cbi50c2QtY2hhcnQtbGFiZWwge1xuICBoZWlnaHQ6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICBtYXJnaW4tdG9wOiA2cHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLWNoYXJ0LWxhYmVsLWhpZGRlbiB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuXG4vKiB0b29sdGlwICovXG4udHNkLXRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTBweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB6LWluZGV4OiA2O1xuICBtaW4td2lkdGg6IDE1NnB4O1xuICBwYWRkaW5nOiA4cHggMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1vdmVybGF5KTtcbiAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHN3LXNoYWRvdy1sdjMpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtdG9vbHRpcC1kYXRlIHtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXRvb2x0aXAtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIG1hcmdpbjogMnB4IDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuLnRzZC10b29sdGlwLXZhbCB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXRvb2x0aXAtdG90YWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi10b3A6IDZweDtcbiAgcGFkZGluZy10b3A6IDZweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG5cbi8qID09PT09PT09PT09PSDmjInmqKHlnovmmI7nu4booaggPT09PT09PT09PT09ICovXG4udHNkLXRhYmxlLWNhcmQgeyBwYWRkaW5nOiAwOyB9XG4udHNkLXRhYmxlLWNhcmQgLnRzZC1jYXJkLWhlYWRlciB7IHBhZGRpbmc6IDE0cHggMTZweCAwOyB9XG4udHNkLXRhYmxlLXdyYXAge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItYmctbDIpO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWItaG92ZXI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItaG92ZXItbDIpO1xufVxuLnRzZC10YWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4udHNkLXRoIHtcbiAgcGFkZGluZzogMTBweCAxMnB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC10aC1udW0geyB0ZXh0LWFsaWduOiByaWdodDsgfVxuLnRzZC1zb3J0LWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLXNvcnQtYnRuOmhvdmVyIHsgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTsgfVxuLnRzZC1zb3J0LWFjdGl2ZSB7IGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7IH1cbi50c2Qtc29ydC1hcnJvdyB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG4udHNkLXRyOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC10ZCB7XG4gIHBhZGRpbmc6IDlweCAxMnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtdGQtbW9kZWwgeyBtYXgtd2lkdGg6IDI0MHB4OyB9XG4udHNkLW1vZGVsLW1vbm8ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWF4LXdpZHRoOiAyMjBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1kcy1mb250LWZhbWlseS1jb2RlKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1udW0ge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbi50c2QtdG90YWwge1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC11bnByaWNlZCB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG4udHNkLXRkLXJhdGlvIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50c2QtcmF0aW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgZ2FwOiA4cHg7XG59XG4udHNkLXJhdGlvLWJhciB7XG4gIHdpZHRoOiA2MHB4O1xuICBoZWlnaHQ6IDZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLXJhdGlvLWZpbGwge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCksIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCkgNTUlLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTMwMCkpKTtcbn1cbi50c2QtcmF0aW8tcGN0IHtcbiAgbWluLXdpZHRoOiA0MnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG5cbi8qID09PT09PT09PT09PSDkuInmgIHvvJrnqbogLyDplJnor68gLyDliqDovb0gPT09PT09PT09PT09ICovXG4udHNkLWVtcHR5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIHBhZGRpbmc6IDQwcHggMTZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnRzZC1lbXB0eS1pY29uIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbn1cbi50c2QtZW1wdHktdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtZW1wdHktZGVzYyB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWVtcHR5LWJsb2NrIHtcbiAgcGFkZGluZzogMjRweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuXG4udHNkLWVycm9yIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxMnB4O1xuICBwYWRkaW5nOiAyMHB4IDE2cHg7XG4gIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KSA0MCUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1zZWNvbmRhcnkpIDMwJSwgdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpKTtcbn1cbi50c2QtZXJyb3ItaWNvbiB7XG4gIGZsZXg6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSk7XG59XG4udHNkLWVycm9yLXRleHQge1xuICBmbGV4OiAxO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLWVycm9yLXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLWVycm9yLWRldGFpbCB7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udHNkLWFsZXJ0LWJhbm5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgcGFkZGluZzogMTBweCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpIDQwJSwgdHJhbnNwYXJlbnQpO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXNlY29uZGFyeSkgMzAlLCB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMykpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG5cbi50c2QtbG9hZGluZyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbn1cbi50c2QtY2FyZC1za2VsZXRvbiB7IG1pbi1oZWlnaHQ6IDg0cHg7IH1cbi50c2Qtc2tlbGV0b24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctc2tlbGV0b24pO1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGFuaW1hdGlvbjogdHNkLXB1bHNlIDEuNnMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuLnRzZC1za2VsZXRvbi1yb3cge1xuICBoZWlnaHQ6IDE0cHg7XG4gIG1hcmdpbjogMTJweCAwO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctc2tlbGV0b24pO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGFuaW1hdGlvbjogdHNkLXB1bHNlIDEuNnMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuQGtleWZyYW1lcyB0c2QtcHVsc2Uge1xuICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgNTAlIHsgb3BhY2l0eTogMC40NTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0g5Yi35paw5pe255qE5YaF5a655oCBID09PT09PT09PT09PSAqL1xuLnRzZC1jb250ZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxNnB4O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24pIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY29udGVudFtkYXRhLWJ1c3k9dHJ1ZV0geyBvcGFjaXR5OiAwLjU1OyB9XG5cbi8qID09PT09PT09PT09PSDml6Dpmpznoo0gPT09PT09PT09PT09ICovXG4udHNkLXZpc3VhbGx5LWhpZGRlbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgYm9yZGVyOiAwO1xufVxuLnRzZC1pY29uIHtcbiAgZmxleDogbm9uZTtcbn1cbi50c2Qtc2VnLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1zZWxlY3QtYnRuOmZvY3VzLXZpc2libGUsXG4udHNkLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1pY29uLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1saW5rLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1zb3J0LWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cbi8qID09PT09PT09PT09PSDnspLluqbliIfmjaIgPT09PT09PT09PT09ICovXG4udHNkLWNhcmQtYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbn1cbi50c2QtZ3JhbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogMnB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbn1cbi50c2QtZ3Jhbi1idG4ge1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBsaW5lLWhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBwYWRkaW5nOiAycHggOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLWdyYW4tYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0zKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHN3LXNoYWRvdy1sdjEpO1xufVxuLnRzZC1ncmFuLWJ0bjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi8qID09PT09PT09PT09PSDmipjnur/lm74gPT09PT09PT09PT09ICovXG4udHNkLWxpbmVjaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogNnB4IDEwcHggOHB4O1xufVxuLnRzZC1saW5lY2hhcnQgc3ZnIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtZ3JpZCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWF4aXMge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBzdHJva2Utd2lkdGg6IDE7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaW4ge1xuICBzdHJva2U6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTtcbiAgc3Ryb2tlLXdpZHRoOiAyO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLW91dCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBzdHJva2Utd2lkdGg6IDI7XG4gIGZpbGw6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdG90YWwge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogNCAzO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWRvdCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKTtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgc3Ryb2tlLXdpZHRoOiAxO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWhvdmVyIHtcbiAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWN1cnNvciB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMyk7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtaW4geyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC1vdXQgeyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC10b3RhbCB7IGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdGV4dCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cbi8qID09PT09PT09PT09PSDlubTluqbng63lipvlm74gPT09PT09PT09PT09ICovXG4udHNkLWhlYXRtYXAge1xuICBwYWRkaW5nOiA2cHggMTRweCAxNHB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxuLnRzZC1oZWF0bWFwLWlubmVyIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBtaW4td2lkdGg6IG1pbi1jb250ZW50O1xufVxuLnRzZC1oZWF0bWFwLW1vbnRocyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi1sZWZ0OiAyNnB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50c2QtaGVhdG1hcC1tb250aCB7XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xufVxuLnRzZC1oZWF0bWFwLWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1kYXlzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG4gIHdpZHRoOiAyMnB4O1xuICBmbGV4OiBub25lO1xufVxuLnRzZC1oZWF0bWFwLWRheSB7XG4gIGhlaWdodDogMTBweDtcbiAgZm9udC1zaXplOiA5cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1ncmlkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY29sIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY2VsbCB7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpLCBib3gtc2hhZG93IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuLnRzZC1oZWF0bWFwLWNlbGw6aG92ZXIge1xuICBvdXRsaW5lOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYyKTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xufVxuLnRzZC1oZWF0bWFwLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNHB4O1xuICBtYXJnaW46IDhweCAxNHB4IDA7XG4gIHBhZGRpbmctdG9wOiA4cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cbmBcblxuLy8gUlBDIGJyaWRnZTogZHluYW1pYy1wbHVnaW4gcnVucyBwcm92aWRlIGEgYGhvc3RgIGdsb2JhbDsgc3RhdGljIChidW5kbGUpXG4vLyBpbnN0YWxscyBwcm92aWRlIGN0eC5nZXQoJ2Nvbm5lY3Rpb24nKS5ycGMuIEtlZXAgb25lIFVJIHNvdXJjZSBmb3IgYm90aC5cbmZ1bmN0aW9uIGhvc3RDYWxsKG1ldGhvZCwgYXJncykge1xuICAvLyBQMC0zOiBwcmVmZXIgdGhlIG9mZmljaWFsIGByZW1vdGVgIHNlcnZpY2Ugd2hlbiBpdCBleHBvc2VzIHRoZSB1c2FnZSBBUEk7XG4gIC8vIG90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIGhvc3QvY29ubmVjdGlvbiBmYWxsYmFja3MgdW5jaGFuZ2VkLlxuICBjb25zdCByZW1vdGVTY29wZSA9ICh0eXBlb2YgY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBjdHggJiYgdHlwZW9mIGN0eC5nZXQgPT09ICdmdW5jdGlvbicpXG4gICAgPyBjdHhcbiAgICA6ICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicgPyBfdXNhZ2VDdHggOiBudWxsKVxuICBpZiAocmVtb3RlU2NvcGUgJiYgdHlwZW9mIHJlbW90ZVNjb3BlLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdGUgPSByZW1vdGVTY29wZS5nZXQoJ3JlbW90ZScpXG4gICAgICBpZiAocmVtb3RlICYmIHJlbW90ZS51c2FnZSkge1xuICAgICAgICBjb25zdCByTmFtZSA9IFN0cmluZyhtZXRob2QpXG4gICAgICAgIGNvbnN0IHJTbGFzaCA9IHJOYW1lLmluZGV4T2YoJy8nKVxuICAgICAgICBjb25zdCByRXAgPSByU2xhc2ggPT09IC0xID8gck5hbWUgOiByTmFtZS5zbGljZShyU2xhc2ggKyAxKVxuICAgICAgICBjb25zdCByQ2FtZWwgPSByRXAucmVwbGFjZSgvLShbYS16XSkvZywgKG0sIGMpID0+IGMudG9VcHBlckNhc2UoKSlcbiAgICAgICAgY29uc3QgZm4gPSAodHlwZW9mIHJlbW90ZS51c2FnZVtyQ2FtZWxdID09PSAnZnVuY3Rpb24nICYmIHJlbW90ZS51c2FnZVtyQ2FtZWxdKVxuICAgICAgICAgIHx8ICh0eXBlb2YgcmVtb3RlLnVzYWdlW3JFcF0gPT09ICdmdW5jdGlvbicgJiYgcmVtb3RlLnVzYWdlW3JFcF0pXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGZuKGFyZ3MpKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLm9rKSByZXR1cm4gcmVzLnZhbHVlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKHJlcyAmJiByZXMuZXJyb3IgJiYgcmVzLmVycm9yLm1lc3NhZ2UpIHx8ICgnUlBDICcgKyBtZXRob2QgKyAnIGZhaWxlZCcpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyByZW1vdGUgcHJvYmluZyBmYWlsZWQg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgZXhpc3RpbmcgZmFsbGJhY2tzXG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgaG9zdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaG9zdCAmJiB0eXBlb2YgaG9zdC5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShob3N0LmNhbGwobWV0aG9kLCBhcmdzKSlcbiAgfVxuICAvLyBTdGF0aWMgYnVuZGxlIGluc3RhbGxzIGhhdmUgbm8gY3R4L2hvc3QgZ2xvYmFsczogdGhlIGVudHJ5IGFwcGx5KCkgc3RvcmVzXG4gIC8vIHRoZSByZWFsIGNvbnRleHQgaW4gX3VzYWdlQ3R4IChkZWNsYXJlZCBieSB0aGUgYnVpbGQgd3JhcHBlcikuXG4gIGNvbnN0IHNjb3BlID0gKHR5cGVvZiBjdHggIT09ICd1bmRlZmluZWQnICYmIGN0eCAmJiB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IGN0eFxuICAgIDogKHR5cGVvZiBfdXNhZ2VDdHggIT09ICd1bmRlZmluZWQnID8gX3VzYWdlQ3R4IDogbnVsbClcbiAgaWYgKHNjb3BlID09PSBudWxsIHx8IHR5cGVvZiBzY29wZS5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdjb250ZXh0IHVuYXZhaWxhYmxlJykpXG4gIH1cbiAgY29uc3QgY29ubmVjdGlvbiA9IHNjb3BlLmdldCgnY29ubmVjdGlvbicpXG4gIGlmIChjb25uZWN0aW9uID09PSB1bmRlZmluZWQgfHwgY29ubmVjdGlvbi5ycGMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Nvbm5lY3Rpb24gc2VydmljZSB1bmF2YWlsYWJsZScpKVxuICB9XG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcobWV0aG9kKVxuICBjb25zdCBzbGFzaCA9IG5hbWUuaW5kZXhPZignLycpXG4gIGNvbnN0IGNoYW5uZWwgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZSgwLCBzbGFzaClcbiAgY29uc3QgZW5kcG9pbnQgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZShzbGFzaCArIDEpXG4gIHJldHVybiBjb25uZWN0aW9uLnJwYy5jYWxsKCcvJyArIGNoYW5uZWwucmVwbGFjZSgvXlxcLysvLCAnJyksIGVuZHBvaW50LCBhcmdzKS50aGVuKChyZXMpID0+IHtcbiAgICBpZiAocmVzICYmIHJlcy5vaykgcmV0dXJuIHJlcy52YWx1ZVxuICAgIHRocm93IG5ldyBFcnJvcigocmVzICYmIHJlcy5lcnJvciAmJiByZXMuZXJyb3IubWVzc2FnZSkgfHwgKCdSUEMgJyArIG1ldGhvZCArICcgZmFpbGVkJykpXG4gIH0pXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog6K6+572u5Z+f5a6a5Lu377ya5a6Y5pa5IGN0eC5zZXR0aW5nc1Njb3Bl77yIZHNoLWNsaWVudC11aS1zZXR0aW5nc++8ieS8mOWFiO+8jFxuICog5LiN5Y+v55So5pe25Zue6YCAIHVzYWdlL3ByaWNlcyBSUEPjgILnu5Hlrprlj6rlgZrkuIDmrKHvvIzor7vlhpnlhbHnlKjlkIzkuIAgc2NvcGXjgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmxldCB1c2FnZUN0eCA9IG51bGxcbmxldCBfdXNhZ2VQcmljZXNTY29wZSA9IG51bGxcblxuZnVuY3Rpb24gcmVzb2x2ZVVzYWdlQ3R4KCkge1xuICBpZiAodXNhZ2VDdHggJiYgdHlwZW9mIHVzYWdlQ3R4LmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVzYWdlQ3R4XG4gIGlmICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicpIHJldHVybiBfdXNhZ2VDdHhcbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0VXNhZ2VQcmljZXNTY29wZSgpIHtcbiAgaWYgKF91c2FnZVByaWNlc1Njb3BlKSByZXR1cm4gX3VzYWdlUHJpY2VzU2NvcGVcbiAgY29uc3QgYyA9IHJlc29sdmVVc2FnZUN0eCgpXG4gIGlmICghYyB8fCB0eXBlb2YgYy5nZXQgIT09ICdmdW5jdGlvbicpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3QgYmluZGVyID0gYy5nZXQoJ3NldHRpbmdzU2NvcGUnKVxuICAgIGlmICghYmluZGVyIHx8IHR5cGVvZiBiaW5kZXIuYmluZCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGxcbiAgICBfdXNhZ2VQcmljZXNTY29wZSA9IGJpbmRlci5iaW5kKHsgbmFtZXNwYWNlOiAndXNhZ2UucHJpY2VzJyB9KVxuICAgIHJldHVybiBfdXNhZ2VQcmljZXNTY29wZVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vLyDku7fmoLzlhpnlhaXlj6PvvJpzZXR0aW5ncyBzY29wZSDlj6/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==
3077
+ //# 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/lm74gPT09PT09PT09PT09ICovXG4udHNkLWxpbmVjaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogNnB4IDEwcHggOHB4O1xufVxuLnRzZC1saW5lY2hhcnQgc3ZnIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtZ3JpZCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWF4aXMge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBzdHJva2Utd2lkdGg6IDE7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaW4ge1xuICBzdHJva2U6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTtcbiAgc3Ryb2tlLXdpZHRoOiAyO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLW91dCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBzdHJva2Utd2lkdGg6IDI7XG4gIGZpbGw6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdG90YWwge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogNCAzO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWRvdCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKTtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgc3Ryb2tlLXdpZHRoOiAxO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWhvdmVyIHtcbiAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWN1cnNvciB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMyk7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtaW4geyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC1vdXQgeyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC10b3RhbCB7IGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdGV4dCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cbi8qID09PT09PT09PT09PSDlubTluqbng63lipvlm74gPT09PT09PT09PT09ICovXG4udHNkLWhlYXRtYXAge1xuICBwYWRkaW5nOiA2cHggMTRweCAxNHB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxuLnRzZC1oZWF0bWFwLWlubmVyIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBtaW4td2lkdGg6IG1pbi1jb250ZW50O1xufVxuLnRzZC1oZWF0bWFwLW1vbnRocyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi1sZWZ0OiAyNnB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50c2QtaGVhdG1hcC1tb250aCB7XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xufVxuLnRzZC1oZWF0bWFwLWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1kYXlzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG4gIHdpZHRoOiAyMnB4O1xuICBmbGV4OiBub25lO1xufVxuLnRzZC1oZWF0bWFwLWRheSB7XG4gIGhlaWdodDogMTBweDtcbiAgZm9udC1zaXplOiA5cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1ncmlkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY29sIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY2VsbCB7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpLCBib3gtc2hhZG93IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuLnRzZC1oZWF0bWFwLWNlbGw6aG92ZXIge1xuICBvdXRsaW5lOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYyKTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xufVxuLnRzZC1oZWF0bWFwLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNHB4O1xuICBtYXJnaW46IDhweCAxNHB4IDA7XG4gIHBhZGRpbmctdG9wOiA4cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cbmBcblxuLy8gMC4yKyBob3N0IHRyYW5zcG9ydDogUE9TVCAvYXBpLzxjaGFubmVsPi88ZW5kcG9pbnQ+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+S6uuawkeW4gScsXG4gIGN1cnJlbmN5VVNEOiAn576O5YWDJyxcbiAgdG9kYXk6ICfku4rml6UnLFxuICBsYXN0N2Q6ICfov5E35aSpJyxcbiAgbGFzdDMwZDogJ+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++8jHtjb3VudH0g5qyh6LCD55SoJyxcbiAgd2QwOiAn5ZGo5pelJyxcbiAgd2QxOiAn5ZGo5LiAJyxcbiAgd2QyOiAn5ZGo5LqMJyxcbiAgd2QzOiAn5ZGo5LiJJyxcbiAgd2Q0OiAn5ZGo5ZubJyxcbiAgd2Q1OiAn5ZGo5LqUJyxcbiAgd2Q2OiAn5ZGo5YWtJyxcbn1cbmNvbnN0IEVOID0ge1xuICBuYXY6ICdVc2FnZSBTdGF0cycsXG4gIHN1YnRpdGxlOiAnVmlldyBBSSBtb2RlbCB1c2FnZSBhbmQgY29zdCBzdGF0aXN0aWNzJyxcbiAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuICBjdXJyZW5jeUhpbnQ6ICdSZWZlcmVuY2UtY29zdCBjdXJyZW5jeSAoZml4ZWQgcmF0ZTogMSBVU0QgPSA3IENOWSknLFxuICBjdXJyZW5jeUNOWTogJ0NOWScsXG4gIGN1cnJlbmN5VVNEOiAnVVNEJyxcbiAgdG9kYXk6ICdUb2RheScsXG4gIGxhc3Q3ZDogJ0xhc3QgNyBkYXlzJyxcbiAgbGFzdDMwZDogJ0xhc3QgMzAgZGF5cycsXG4gIGN1c3RvbTogJ0N1c3RvbScsXG4gIGFsbDogJ0FsbCcsXG4gIGFsbE1vZGVsczogJ0FsbCBtb2RlbHMnLFxuICBzZWxlY3RlZE1vZGVsczogJ3tjb3VudH0gbW9kZWxzIHNlbGVjdGVkJyxcbiAgc2VsZWN0QWxsOiAnU2VsZWN0IGFsbCcsXG4gIGNsZWFyOiAnQ2xlYXInLFxuICBzZWFyY2hNb2RlbHM6ICdTZWFyY2ggbW9kZWxzJyxcbiAgbm9NYXRjaE1vZGVsczogJ05vIG1hdGNoaW5nIG1vZGVscycsXG4gIG1vZGVsRmlsdGVySGludDogJ0FwcGxpZXMgaW5zdGFudGx5OyBsaXN0cyBvbmx5IG1vZGVscyB3aXRoIGRhdGEgaW4gdGhlIHJhbmdlJyxcbiAgY3VzdG9tUmFuZ2VUaXRsZTogJ0N1c3RvbSB0aW1lIHJhbmdlJyxcbiAgY3VzdG9tUmFuZ2VBcmlhOiAnQ3VzdG9tIGRhdGUgcmFuZ2UnLFxuICBzdGFydFRpbWU6ICdTdGFydCcsXG4gIGVuZFRpbWU6ICdFbmQnLFxuICByYW5nZUludmFsaWQ6ICdTdGFydCBtdXN0IG5vdCBiZSBsYXRlciB0aGFuIGVuZCcsXG4gIHJhbmdlSGludDogJ0FueSBkYXRlIHJhbmdlIOKAlCBubyBsZW5ndGggbGltaXQnLFxuICBjYW5jZWw6ICdDYW5jZWwnLFxuICBjb25maXJtOiAnT0snLFxuICBkYXRlUmFuZ2VHcm91cDogJ0RhdGUgcmFuZ2UnLFxuICBtb2RlbEZpbHRlckdyb3VwOiAnTW9kZWwgZmlsdGVyJyxcbiAgY2hhcnRUeXBlR3JvdXA6ICdDaGFydCB0eXBlJyxcbiAgdG90YWxUb2tlbnM6ICdUb3RhbCBUb2tlbnMnLFxuICBpbnB1dFRva2VuczogJ0lucHV0IFRva2VucycsXG4gIG91dHB1dFRva2VuczogJ091dHB1dCBUb2tlbnMnLFxuICBjYWxsczogJ0NhbGxzJyxcbiAgY29zdDogJ0VzdC4gY29zdCcsXG4gIGFwcHJveElPOiAn4omIIGlucHV0K291dHB1dCcsXG4gIHVucHJpY2VkTm90ZTogJ3tjb3VudH0gY2FsbHMgdW5wcmljZWQnLFxuICBkYWlseVRyZW5kOiAnRGFpbHkgdXNhZ2UgdHJlbmQnLFxuICBiYXJWaWV3OiAnQmFycycsXG4gIGxpbmVWaWV3OiAnTGluZScsXG4gIGJ5SG91cjogJ0hvdXJseScsXG4gIGJ5RGF5OiAnRGFpbHknLFxuICBldmVyeU5EYXlzOiAnRXZlcnkge259IGRheXMnLFxuICBsZWdlbmRJbnB1dDogJ0lucHV0JyxcbiAgbGVnZW5kT3V0cHV0OiAnT3V0cHV0JyxcbiAgbGVnZW5kVG90YWw6ICdUb3RhbCcsXG4gIHRvb2x0aXBUb3RhbDogJ1RvdGFsJyxcbiAgc3RhcnRORGF5czogJ2ZvciB7bn0gZGF5cycsXG4gIGxpbmVDaGFydEFyaWE6ICdUb2tlbiB1c2FnZSB0cmVuZCBsaW5lIGNoYXJ0JyxcbiAgeWVhcmx5SGVhdG1hcDogJ1llYXJseSBoZWF0bWFwJyxcbiAgeWVhckRhaWx5OiAnRGFpbHkgdG9rZW5zIGluIHt5ZWFyfScsXG4gIG1vbnRoTGFiZWw6ICd7bn0nLFxuICB3ZWVrZGF5TW9uOiAnTW9uJyxcbiAgd2Vla2RheVdlZDogJ1dlZCcsXG4gIHdlZWtkYXlGcmk6ICdGcmknLFxuICBsZXNzOiAnTGVzcycsXG4gIG1vcmU6ICdNb3JlJyxcbiAgYnlNb2RlbFRpdGxlOiAnQnkgbW9kZWwnLFxuICBtb2RlbENvdW50OiAne259IG1vZGVscycsXG4gIG1vZGVsVGFibGVDYXB0aW9uOiAnVG9rZW4gdXNhZ2UgYnkgbW9kZWwnLFxuICBjb2xNb2RlbDogJ01vZGVsJyxcbiAgY29sQ2FsbHM6ICdDYWxscycsXG4gIGNvbElucHV0OiAnSW5wdXQgVG9rZW5zJyxcbiAgY29sT3V0cHV0OiAnT3V0cHV0IFRva2VucycsXG4gIGNvbFRvdGFsOiAnVG90YWwgVG9rZW5zJyxcbiAgY29sQ29zdDogJ0VzdC4gY29zdCcsXG4gIGNvbFNoYXJlOiAnU2hhcmUnLFxuICBtb2RlbFNoYXJlOiAnTW9kZWwgc2hhcmUnLFxuICBzaGFyZU90aGVyOiAnT3RoZXJzJyxcbiAgdW5wcmljZWQ6ICdVbnByaWNlZCcsXG4gIHVucHJpY2VkUm93SGludDogJ05vIHByaWNpbmcgY29uZmlndXJlZDsgY291bnRlZCBhcyAwJyxcbiAgbm9EYXRhOiAnTm8gZGF0YScsXG4gIGVtcHR5RGVzYzogJ05vIGNhbGxzIGluIHRoaXMgcGVyaW9kJyxcbiAgZW1wdHlGaWx0ZXJlZDogJ05vIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZpbHRlcnMsIHRyeSBhZGp1c3RpbmcgdGhlIHJhbmdlIG9yIG1vZGVscycsXG4gIHJlc2V0RmlsdGVyczogJ1Jlc2V0IGZpbHRlcnMnLFxuICBsb2FkRmFpbGVkOiAnRmFpbGVkIHRvIGxvYWQgZGF0YToge21lc3NhZ2V9JyxcbiAgbG9hZEZhaWxlZFRpdGxlOiAnRmFpbGVkIHRvIGxvYWQgZGF0YScsXG4gIHJldHJ5OiAnUmV0cnknLFxuICBiYXJBcmlhOiAne2tleX0sIGlucHV0IHtpbn0gdG9rZW5zLCBvdXRwdXQge291dH0gdG9rZW5zLCB0b3RhbCB7dG90fSB0b2tlbnMnLFxuICBobVRpdGxlOiAne2tleX06IHt0b2tlbnN9IHRva2Vuc3tjYWxsc30nLFxuICBobUNhbGxzOiAnLCB7Y291bnR9IGNhbGxzJyxcbiAgd2QwOiAnU3VuJyxcbiAgd2QxOiAnTW9uJyxcbiAgd2QyOiAnVHVlJyxcbiAgd2QzOiAnV2VkJyxcbiAgd2Q0OiAnVGh1JyxcbiAgd2Q1OiAnRnJpJyxcbiAgd2Q2OiAnU2F0Jyxcbn1cbmNvbnN0IFQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpXG5mdW5jdGlvbiB1c2VUKCkge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChUKVxufVxuZnVuY3Rpb24gZmFsbGJhY2tUKGtleSwgcGFyYW1zKSB7XG4gIGxldCBzID0gWkhba2V5XVxuICBpZiAocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4ga2V5XG4gIGlmIChwYXJhbXMpIHtcbiAgICBzID0gcy5yZXBsYWNlKC9cXHsoXFx3KylcXH0vZywgKG0sIG4pID0+IChwYXJhbXNbbl0gIT09IHVuZGVmaW5lZCA/IFN0cmluZyhwYXJhbXNbbl0pIDogbSkpXG4gIH1cbiAgcmV0dXJuIHNcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmlbDlrZfmoLzlvI/ljJbvvIjop4TmoLznrKwgNSDoioLvvIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIGZvcm1hdFRva2Vuc1Nob3J0KG4pIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikpIHJldHVybiAnLS0nXG4gIGlmIChuID49IDFlNikgcmV0dXJuIE1hdGgucm91bmQobiAvIDFlNCkgLyAxMDAgKyAnTScgLy8gMS4yM01cbiAgaWYgKG4gPj0gMWUzKSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMWUyKSAvIDEwICsgJ0snIC8vIDEyLjNLXG4gIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZChuKSlcbn1cbmZ1bmN0aW9uIGZvcm1hdEludChuKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBNYXRoLnJvdW5kKG4pLnRvTG9jYWxlU3RyaW5nKCkgOiAnLS0nXG59XG4vKiog5Y+q6KaB5pWw5a2X6YOo5YiG77ya5oiQ5pys5Y2h55qE56ym5Y+355Sx5biB56eN5YiH5o2i5Zmo6Ieq5bex55S777yM5YaN5bim5LiA5qyh5bCx5oiQ5LqG44CMwqUgwqUxNC43OOOAjeOAgiAqL1xuZnVuY3Rpb24gY29zdERpZ2l0cyhuKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSByZXR1cm4gJy0tJ1xuICAvLyBCZWxvdyBoYWxmIGEgY2VudCB0aGVyZSBpcyBub3RoaW5nIHRvIHNob3cgYXQgMiBkZWNpbWFsczsgc2F5IHNvIGluc3RlYWQgb2ZcbiAgLy8gcHJpbnRpbmcgYSBtaXNsZWFkaW5nIDAuMDAgKGEgJDAuMDMgQ05ZIGNvc3QgYmVjb21lcyAkMC4wMDQpLlxuICBpZiAobiA+IDAgJiYgbiA8IDAuMDA1KSByZXR1cm4gJzwwLjAxJ1xuICByZXR1cm4gbi50b0ZpeGVkKDIpXG59XG5mdW5jdGlvbiBmb3JtYXRDb3N0KG4sIGN1cikge1xuICByZXR1cm4gKGN1ciB8fCAnwqUnKSArIGNvc3REaWdpdHMobilcbn1cbmZ1bmN0aW9uIGRheUxhYmVsKGtleSkge1xuICBjb25zdCBbLCBtLCBkXSA9IFN0cmluZyhrZXkgfHwgJycpLnNwbGl0KCctJylcbiAgaWYgKG0gPT09IHVuZGVmaW5lZCB8fCBkID09PSB1bmRlZmluZWQpIHJldHVybiAnLS0nXG4gIHJldHVybiBtICsgJy0nICsgZFxufVxuZnVuY3Rpb24gZm10UGN0KHJhdGlvKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHJhdGlvKSkgcmV0dXJuICcwJSdcbiAgY29uc3QgcCA9IHJhdGlvICogMTAwXG4gIGlmIChwID49IDk5Ljk1KSByZXR1cm4gJzEwMCUnXG4gIHJldHVybiBwLnRvRml4ZWQoMSkgKyAnJSdcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDml6XmnJ/lt6XlhbdcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZCkge1xuICBjb25zdCB4ID0gbmV3IERhdGUoZClcbiAgeC5zZXRIb3VycygwLCAwLCAwLCAwKVxuICByZXR1cm4geFxufVxuZnVuY3Rpb24gYWRkRGF5cyhkLCBuKSB7XG4gIGNvbnN0IHggPSBuZXcgRGF0ZShkKVxuICB4LnNldERhdGUoeC5nZXREYXRlKCkgKyBuKVxuICByZXR1cm4geFxufVxuZnVuY3Rpb24gZm10RGF0ZUlucHV0KGQpIHtcbiAgY29uc3QgeSA9IGQuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZGF5ID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpXG4gIHJldHVybiB5ICsgJy0nICsgbSArICctJyArIGRheVxufVxuZnVuY3Rpb24gZm10RGF0ZVNsYXNoKHMpIHtcbiAgY29uc3QgbSA9IFN0cmluZyhzIHx8ICcnKS5tYXRjaCgvXihcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8pXG4gIGlmICghbSkgcmV0dXJuICctLSdcbiAgcmV0dXJuIG1bMV0gKyAnLycgKyBtWzJdICsgJy8nICsgbVszXVxufVxuLy8g6aKE6K6+IC8g6Ieq5a6a5LmJIOKGkiB7IGZyb20sIHRvIH3vvIhVbml4IOavq+enku+8iVxuLy8g5LuK5pelID0g5b2T5aSpIDAwOjAwIOiHs+S7iu+8m+i/kTcvMzDlpKkgPSDlkKvku4rlpKnlvoDliY0gTiDkuKroh6rnhLbml6UgMDA6MDAg6LW377yb5YWo6YOoID0g5LiN6ZmQ6LW354K577ybXG4vLyDoh6rlrprkuYkgPSDotbfml6UgMDA6MDAgfiDmraLml6UgMjM6NTk6NTkuOTk5XG5mdW5jdGlvbiByYW5nZUZvcihwcmVzZXQsIGN1c3RvbSkge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IHRvZGF5ID0gc3RhcnRPZkRheShub3cpXG4gIGlmIChwcmVzZXQgPT09ICd0b2RheScpIHJldHVybiB7IGZyb206IHRvZGF5LmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBpZiAocHJlc2V0ID09PSAnN2QnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtNikuZ2V0VGltZSgpLCB0bzogbm93LmdldFRpbWUoKSB9XG4gIGlmIChwcmVzZXQgPT09ICczMGQnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtMjkpLmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICAvLyDlhajph4/vvJowIOaYr+aciemZkOWAvO+8jOWuv+S4u+eahCBmaWxsIOWIpOWumuiupOWug++8m+iwg+eUqOaWueW/hemhu+WQjOaXtuS8oCBmaWxsOmZhbHNl77yMXG4gIC8vIOWQpuWImeS8muWOu+mbtuWhq+WFhSAxOTcwIOW5tOiHs+S7iuOAgeaSnuS4iiBNQVhfQlVDS0VUUyDpgIDljJbmiJDlj6rnnIvmnInmlbDmja7nmoTmobbjgIJcbiAgaWYgKHByZXNldCA9PT0gJ2FsbCcpIHJldHVybiB7IGZyb206IDAsIHRvOiBub3cuZ2V0VGltZSgpIH1cbiAgY29uc3QgZnJvbSA9IG5ldyBEYXRlKGN1c3RvbS5mcm9tICsgJ1QwMDowMDowMCcpLmdldFRpbWUoKVxuICBjb25zdCB0byA9IG5ldyBEYXRlKGN1c3RvbS50byArICdUMjM6NTk6NTkuOTk5JykuZ2V0VGltZSgpXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGZyb20pIHx8ICFOdW1iZXIuaXNGaW5pdGUodG8pKSB7XG4gICAgcmV0dXJuIHsgZnJvbTogdG9kYXkuZ2V0VGltZSgpLCB0bzogbm93LmdldFRpbWUoKSB9XG4gIH1cbiAgcmV0dXJuIHsgZnJvbSwgdG8gfVxufVxuZnVuY3Rpb24gd2Vla2RheU9mKGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZShrZXkgKyAnVDAwOjAwOjAwJykudG9Mb2NhbGVEYXRlU3RyaW5nKCd6aC1DTicsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cbi8qKiBXZWVrZGF5IGZvciBhIGRheS9ob3VyL21pbnV0ZSBidWNrZXQga2V5IChgWVlZWS1NTS1ERGAgb3IgYFlZWVktTU0tREQgSEg6bW1gKS4gKi9cbmZ1bmN0aW9uIHdlZWtkYXlOYW1lKGtleSwgdCkge1xuICB0cnkge1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShTdHJpbmcoa2V5KS5yZXBsYWNlKCcgJywgJ1QnKSlcbiAgICByZXR1cm4gdChbJ3dkMCcsICd3ZDEnLCAnd2QyJywgJ3dkMycsICd3ZDQnLCAnd2Q1JywgJ3dkNiddW2QuZ2V0RGF5KCldIHx8ICd3ZDAnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cbi8qKiBYLWF4aXMgbGFiZWwgZm9yIGEgYnVja2V0IGtleSB1bmRlciBhIGdyYW51bGFyaXR5LiAqL1xuZnVuY3Rpb24geExhYmVsKGtleSwgZykge1xuICBjb25zdCBzID0gU3RyaW5nKGtleSlcbiAgY29uc3Qgc3AgPSBzLnNwbGl0KCcgJylcbiAgaWYgKGcgPT09ICdtaW51dGUnKSByZXR1cm4gc3AubGVuZ3RoID4gMSA/IHNwWzFdLnNsaWNlKDAsIDUpIDogcy5zbGljZSg1KVxuICBpZiAoZyA9PT0gJ2hvdXInKSByZXR1cm4gc3AubGVuZ3RoID4gMSA/IHNwWzFdLnNsaWNlKDAsIDIpICsgJzowMCcgOiBzLnNsaWNlKDUpXG4gIHJldHVybiBkYXlMYWJlbChrZXkpXG59XG4vKiogRml4ZWQgZ3JhbnVsYXJpdHkgcG9saWN5OiB0b2RheSBpcyBob3VybHksIGV2ZXJ5dGhpbmcgZWxzZSBpcyBkYWlseS4gKi9cbmZ1bmN0aW9uIGVmZkdyYW51bGFyaXR5KHJhbmdlKSB7XG4gIHJldHVybiByYW5nZSA9PT0gJ3RvZGF5JyA/ICdob3VyJyA6ICdkYXknO1xufVxuLyoqIFN0YWJsZSBzdGVwIHN0cmF0ZWd5IGZvciBjdXN0b20gcmFuZ2VzOiB0YXJnZXQgfjE1LTI1IGJ1Y2tldHMuICovXG5mdW5jdGlvbiBwaWNrU3RlcERheXMoc3Bhbk1zKSB7XG4gIGNvbnN0IGRheXMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChzcGFuTXMgfHwgMCkgLyA4NjQwMDAwMCkpXG4gIGlmIChkYXlzIDw9IDMxKSByZXR1cm4gMVxuICBpZiAoZGF5cyA8PSA2MikgcmV0dXJuIDNcbiAgaWYgKGRheXMgPD0gMTUwKSByZXR1cm4gNVxuICByZXR1cm4gN1xufVxuLyoqIEh1bWFuIGxhYmVsIGZvciB0aGUgY3VycmVudCBzdGVwIHBvbGljeS4gKi9cbmZ1bmN0aW9uIHN0ZXBMYWJlbCh0LCByYW5nZSwgc3RlcERheXMpIHtcbiAgaWYgKHJhbmdlID09PSAndG9kYXknKSByZXR1cm4gdCgnYnlIb3VyJylcbiAgcmV0dXJuIHN0ZXBEYXlzID4gMSA/IHQoJ2V2ZXJ5TkRheXMnLCB7IG46IHN0ZXBEYXlzIH0pIDogdCgnYnlEYXknKVxufVxuLyoqIEhlYXRtYXAgY2VsbCBjb2xvciBieSByZWxhdGl2ZSB0b2tlbiB2b2x1bWUuICovXG5mdW5jdGlvbiBoZWF0Q29sb3IodG90YWwsIG1heCkge1xuICBpZiAoIXRvdGFsKSByZXR1cm4gJ3ZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3ZlciknXG4gIGNvbnN0IHIgPSB0b3RhbCAvIG1heFxuICBjb25zdCBwY3QgPSByIDwgMC4yNSA/IDIyIDogciA8IDAuNSA/IDQ1IDogciA8IDAuNzUgPyA3MCA6IDEwMFxuICByZXR1cm4gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCkgJyArIHBjdCArICclLCB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMikpJ1xufVxuZnVuY3Rpb24gbmljZUNlaWwodikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSB8fCB2IDw9IDApIHJldHVybiAxXG4gIGNvbnN0IG1hZyA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAodikpKVxuICBjb25zdCBub3JtID0gdiAvIG1hZ1xuICBjb25zdCBuaWNlID0gbm9ybSA8PSAxID8gMSA6IG5vcm0gPD0gMiA/IDIgOiBub3JtIDw9IDUgPyA1IDogMTBcbiAgcmV0dXJuIG5pY2UgKiBtYWdcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDdXN0b20oKSB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgcmV0dXJuIHsgZnJvbTogZm10RGF0ZUlucHV0KGFkZERheXMobm93LCAtNikpLCB0bzogZm10RGF0ZUlucHV0KG5vdykgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOWGheiBlCBTVkcg5Zu+5qCH77yI5peg5Zu+5qCH5bqT77yM5omL5YaZIGZlYXRoZXIg6aOO5qC8IHN0cm9rZSDlm77moIfvvIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IElDT05fUEFUSFMgPSB7XG4gIGxheWVyczogJ00xMiAybDggNC41LTggNC41LTgtNC41TDEyIDJ6bTAgOGw4IDQuNS04IDQuNS04LTQuNUwxMiAxMHptMCA4bDggNC41LTggNC41LTgtNC41TDEyIDE4eicsXG4gIGRvd246ICdNMTIgM3YxMm0wIDBsLTQuNS00LjVNMTIgMTVsNC41LTQuNU00IDIxaDE2JyxcbiAgdXA6ICdNMTIgMjFWOW0wIDBsLTQuNSA0LjVNMTIgOWw0LjUgNC41TTQgM2gxNicsXG4gIGFjdGl2aXR5OiAnTTIgMTJoNGwyLjUtOCA1IDE2IDIuNS04aDYnLFxuICBjb2luczogJ00zIDlhMiAyIDAgMDEyLTJoMTRhMiAyIDAgMDEyIDJ2OWEyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJWOXptMCA1aDE4TTggNS41VjRhMiAyIDAgMDEyLTJoNGEyIDIgMCAwMTIgMnYxLjUnLFxuICAvLyDliLfmlrDlm77moIflj5boh6ogRFNIIOWOn+eUn+WbvuW9ou+8iDE2IOe9keagvOOAgXN0cm9rZSAxLjXvvInvvIzkuI7orr7nva7pobXlhbblroPlm77moIflkIzkuIDop4LmhJ/vvJtcbiAgLy8g5YW25L2Z5Zu+5qCH5LuN5pivIDI0IOe9keagvO+8iHN0cm9rZSAy77yJ77yMU3ZnSWNvbiDkuKTnp43lrprkuYnpg73lkIPjgIJcbiAgcmVmcmVzaDoge1xuICAgIHZpZXdCb3g6ICcwIDAgMTYgMTYnLFxuICAgIHN0cm9rZVdpZHRoOiAxLjUsXG4gICAgcGF0aHM6IFtcbiAgICAgICdNMTQuNTAwMSA4QzE0LjUgOS4yODU1MiAxNC4xMTg4IDEwLjU0MjIgMTMuNDA0NSAxMS42MTFDMTIuNjkwMyAxMi42Nzk5IDExLjY3NTIgMTMuNTEyOSAxMC40ODc1IDE0LjAwNDlDOS4yOTk4MiAxNC40OTY4IDcuOTkyOTUgMTQuNjI1NSA2LjczMjEyIDE0LjM3NDdDNS40NzEzIDE0LjEyNCA0LjMxMzE0IDEzLjUwNSAzLjQwNDEgMTIuNTk2QzIuNDk1MTQgMTEuNjg3IDEuODc2MTQgMTAuNTI4OCAxLjYyNTM3IDkuMjY3OThDMS4zNzQ1OSA4LjAwNzE2IDEuNTAzMzEgNi43MDAyOCAxLjk5NTI1IDUuNTEyNjFDMi40ODcxOSA0LjMyNDk0IDMuMzIwMjUgMy4zMDk4MSA0LjM4OTEgMi41OTU1N0M1LjQ1Nzk1IDEuODgxMzQgNi43MTQ1OCAxLjUwMDA4IDguMDAwMSAxLjVDOS45MDAxIDEuNSAxMS43MDAxIDIuMyAxMy4wMDAxIDMuNkwxNC41MDAxIDUuMScsXG4gICAgICAnTTE0LjQ5OTkgMS41VjUuMUgxMC44OTk5JyxcbiAgICBdLFxuICB9LFxuICBjaGV2cm9uOiAnTTYgOWw2IDYgNi02JyxcbiAgaW5ib3g6ICdNMjIgMTJoLTZsLTIgM2gtNGwtMi0zSDJtMy41LTYuNUwyIDEydjZhMiAyIDAgMDAyIDJoMTZhMiAyIDAgMDAyLTJ2LTZsLTMuNS02LjVBMiAyIDAgMDAxNi43NiA1SDcuMjRhMiAyIDAgMDAtMS43NCAxLjV6JyxcbiAgYWxlcnQ6ICdNMTIgOXY0bTAgNGguMDFNMTAuMyAzLjg2TDEuODIgMThhMiAyIDAgMDAxLjcxIDNoMTYuOTRhMiAyIDAgMDAxLjcxLTNMMTMuNyAzLjg2YTIgMiAwIDAwLTMuNCAweicsXG4gIHNlYXJjaDogJ00yMSAyMWwtNC4zNS00LjM1TTE3IDEwLjVhNi41IDYuNSAwIDExLTEzIDAgNi41IDYuNSAwIDAxMTMgMHonLFxuICAvLyDppbzlm77vvIjljaDmr5TvvInvvJrlpJblnIggKyDmpZTlvaLvvIzkuI7ljaHniYfmoIfpopjnmoTjgIzljaDmr5TjgI3or63kuYnkuIDoh7RcbiAgc2hhcmU6ICdNMjEuMjEgMTUuODlBMTAgMTAgMCAxMTggMi44M00yMiAxMkExMCAxMCAwIDAwMTIgMnYxMHonLFxuICBjaGVjazogJ00yMCA2TDkgMTdsLTUtNScsXG59XG5mdW5jdGlvbiBTdmdJY29uKHByb3BzKSB7XG4gIGNvbnN0IHsgbmFtZSwgc2l6ZSwgY2xhc3NOYW1lIH0gPSBwcm9wc1xuICAvLyDkuIDkuKrlkI3lrZflr7nlupTjgIzkuIDkuLIgcGF0aCArIOiHquW3seeahCB2aWV3Qm94L+e6v+WuveOAje+8m+Wtl+espuS4suaYryAyNCDnvZHmoLznmoTnroDlhpnvvIxcbiAgLy8g6LCD55So5pa577yIMzEg5aSE77yJ5peg6ZyA5YWz5b+D5beu5Yir44CCXG4gIGNvbnN0IHNwZWMgPSBJQ09OX1BBVEhTW25hbWVdIHx8IElDT05fUEFUSFMuYWN0aXZpdHlcbiAgY29uc3QgaWNvbiA9IHR5cGVvZiBzcGVjID09PSAnc3RyaW5nJ1xuICAgID8geyB2aWV3Qm94OiAnMCAwIDI0IDI0Jywgc3Ryb2tlV2lkdGg6IDIsIHBhdGhzOiBbc3BlY10gfVxuICAgIDogc3BlY1xuICByZXR1cm4gaCgnc3ZnJywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lIHx8ICd0c2QtaWNvbicsXG4gICAgd2lkdGg6IHNpemUgfHwgMTYsXG4gICAgaGVpZ2h0OiBzaXplIHx8IDE2LFxuICAgIHZpZXdCb3g6IGljb24udmlld0JveCB8fCAnMCAwIDI0IDI0JyxcbiAgICBmaWxsOiAnbm9uZScsXG4gICAgc3Ryb2tlOiAnY3VycmVudENvbG9yJyxcbiAgICBzdHJva2VXaWR0aDogaWNvbi5zdHJva2VXaWR0aCB8fCAyLFxuICAgIHN0cm9rZUxpbmVjYXA6ICdyb3VuZCcsXG4gICAgc3Ryb2tlTGluZWpvaW46ICdyb3VuZCcsXG4gICAgJ2FyaWEtaGlkZGVuJzogdHJ1ZSxcbiAgfSwgaWNvbi5wYXRocy5tYXAoKGQsIGkpID0+IGgoJ3BhdGgnLCB7IGtleTogaSwgZCB9KSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog6YCa55SoIEhvb2vvvJrlpJbpg6jngrnlh7vlhbPpl61cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIHVzZU91dHNpZGVDbGljayhvcGVuLCByZWYsIG9uQ2xvc2UpIHtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHJldHVybiB1bmRlZmluZWRcbiAgICBmdW5jdGlvbiBoYW5kbGVyKGUpIHtcbiAgICAgIGlmIChyZWYuY3VycmVudCAmJiAhcmVmLmN1cnJlbnQuY29udGFpbnMoZS50YXJnZXQpKSBvbkNsb3NlKClcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gIH0sIFtvcGVuLCBvbkNsb3NlLCByZWZdKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmAmueUqCBIb29r77ya5rWu5bGC5a6a5L2N77yIdmlld3BvcnQg5a6a5L2NICsg56m66Ze05LiN6Laz5LiK57+7ICsg6auY5bqm5bCB6aG277yJXG4gKlxuICog6K6+572u6Z2i5p2/5pys6Lqr5pivIGBvdmVyZmxvdzogaGlkZGVuYCDnmoToo4HliarlrrnlmajvvIzotLTnnYDov4fmu6TmoI/lj7Pnq6/nmoQgYWJzb2x1dGVcbiAqIOa1ruWxguS8muiiq+aVtOadoeijgeaOie+8iOWPs+S+p+eahOOAjOa4heepuuOAjeeci+S4jeinge+8ieOAgkNTUyDml6Dms5XmhJ/nn6XnpZblhYjoo4HliarvvIzlj6rog73ph4/kuIDmrKFcbiAqIOinhuWPo+WGjeWumuS9je+8m+a7muWKqOaIlue8qeaUvuaXtumHjeeul++8jOmBv+WFjea1ruWxgueVmeWcqOWOn+WcsOOAglxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgUEFORUxfTUlOX1JPT00gPSAyNDAgLy8g5LiL5pa556m66Ze05bCP5LqO5a6D5LiU5LiK5pa55pu05a696KOV5pe25LiK57+7XG5jb25zdCBQQU5FTF9NSU5fSEVJR0hUID0gMTYwXG5cbmZ1bmN0aW9uIHVzZUZpeGVkUGFuZWwoYW5jaG9yUmVmLCBvcGVuLCB3aWR0aCwgZ2FwID0gNiwgbWFyZ2luID0gMTIpIHtcbiAgY29uc3QgW3N0eWxlLCBzZXRTdHlsZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3Blbikge1xuICAgICAgc2V0U3R5bGUobnVsbClcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgZnVuY3Rpb24gbWVhc3VyZSgpIHtcbiAgICAgIGNvbnN0IGVsID0gYW5jaG9yUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHJldHVyblxuICAgICAgY29uc3QgciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCBib3hXID0gTWF0aC5taW4od2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIC0gbWFyZ2luICogMilcbiAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heChtYXJnaW4sIE1hdGgubWluKHIubGVmdCwgd2luZG93LmlubmVyV2lkdGggLSBtYXJnaW4gLSBib3hXKSlcbiAgICAgIGNvbnN0IGJlbG93ID0gd2luZG93LmlubmVySGVpZ2h0IC0gci5ib3R0b20gLSBnYXAgLSBtYXJnaW5cbiAgICAgIGNvbnN0IGFib3ZlID0gci50b3AgLSBnYXAgLSBtYXJnaW5cbiAgICAgIGNvbnN0IGZsaXAgPSBiZWxvdyA8IFBBTkVMX01JTl9ST09NICYmIGFib3ZlID4gYmVsb3dcbiAgICAgIHNldFN0eWxlKHtcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHdpZHRoOiBib3hXLFxuICAgICAgICBtYXhIZWlnaHQ6IE1hdGgubWF4KFBBTkVMX01JTl9IRUlHSFQsIGZsaXAgPyBhYm92ZSA6IGJlbG93KSxcbiAgICAgICAgLi4uKGZsaXBcbiAgICAgICAgICA/IHsgYm90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHQgLSByLnRvcCArIGdhcCB9XG4gICAgICAgICAgOiB7IHRvcDogci5ib3R0b20gKyBnYXAgfSksXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgIHpJbmRleDogNDAsXG4gICAgICB9KVxuICAgIH1cbiAgICBtZWFzdXJlKClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbWVhc3VyZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgbWVhc3VyZSwgdHJ1ZSlcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG1lYXN1cmUpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgbWVhc3VyZSwgdHJ1ZSlcbiAgICB9XG4gIH0sIFtvcGVuLCBhbmNob3JSZWYsIHdpZHRoLCBnYXAsIG1hcmdpbl0pXG4gIGlmICghb3BlbikgcmV0dXJuIG51bGxcbiAgLy8g6aaW5bin6L+Y5rKh6YeP5Yiw5bC65a+477ya5YWI6JeP6LW35p2l77yM5ZCm5YiZ5Lya6Zeq5Yiw5bem5LiK6KeSXG4gIHJldHVybiBzdHlsZSB8fCB7IHBvc2l0aW9uOiAnZml4ZWQnLCB0b3A6IDAsIGxlZnQ6IDAsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBIZWFkZXLvvJrmoIfpopggKyDlia/moIfpopggKyDliLfmlrDmjInpkq5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIFN0YXRzSGVhZGVyKHByb3BzKSB7XG4gIGNvbnN0IHsgYnVzeSwgb25SZWZyZXNoIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWFkZXInIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhZGVyLXRleHQnIH0sXG4gICAgICBoKCdoMicsIHsgY2xhc3NOYW1lOiAndHNkLXRpdGxlJyB9LCB0KCduYXYnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2Qtc3VidGl0bGUnIH0sIHQoJ3N1YnRpdGxlJykpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1pY29uLWJ0bicgKyAoYnVzeSA/ICcgdHNkLXNwaW5uaW5nJyA6ICcnKSxcbiAgICAgIG9uQ2xpY2s6IG9uUmVmcmVzaCxcbiAgICAgIGRpc2FibGVkOiBidXN5LFxuICAgICAgJ2FyaWEtYnVzeSc6IGJ1c3kgfHwgdW5kZWZpbmVkLFxuICAgICAgdGl0bGU6IHQoJ3JlZnJlc2gnKSxcbiAgICAgICdhcmlhLWxhYmVsJzogdCgncmVmcmVzaCcpLFxuICAgIH0sIGgoU3ZnSWNvbiwgeyBuYW1lOiAncmVmcmVzaCcgfSkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOiHquWumuS5ieaXpeacn+iMg+WbtOa1ruWxglxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gQ3VzdG9tUmFuZ2VQb3BvdmVyKHByb3BzKSB7XG4gIGNvbnN0IHsgY3VzdG9tLCBvbkFwcGx5LCBvbkNsb3NlLCBhbmNob3JSZWYgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgcGFuZWxTdHlsZSA9IHVzZUZpeGVkUGFuZWwoYW5jaG9yUmVmLCB0cnVlLCAzMDApXG4gIGNvbnN0IFtmcm9tLCBzZXRGcm9tXSA9IFJlYWN0LnVzZVN0YXRlKGN1c3RvbS5mcm9tKVxuICBjb25zdCBbdG8sIHNldFRvXSA9IFJlYWN0LnVzZVN0YXRlKGN1c3RvbS50bylcbiAgY29uc3QgaW52YWxpZCA9ICFmcm9tIHx8ICF0byB8fCBmcm9tID4gdG9cbiAgLy8gUDItMTHvvJpkaWFsb2cg5LulIEVzY2FwZSDlhbPpl61cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBmdW5jdGlvbiBvbktleShlKSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJykgb25DbG9zZSgpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5KVxuICB9LCBbb25DbG9zZV0pXG4gIHJldHVybiBoKCdkaXYnLCB7XG4gICAgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXIgdHNkLXJhbmdlLXBvcG92ZXInLFxuICAgIHN0eWxlOiBwYW5lbFN0eWxlLFxuICAgIHJvbGU6ICdkaWFsb2cnLFxuICAgICdhcmlhLWxhYmVsJzogdCgnY3VzdG9tUmFuZ2VBcmlhJyksXG4gIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci10aXRsZScgfSwgdCgnY3VzdG9tUmFuZ2VUaXRsZScpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1yYW5nZS1maWVsZHMnIH0sXG4gICAgICBoKCdsYWJlbCcsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkJyB9LFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtZmllbGQtbGFiZWwnIH0sIHQoJ3N0YXJ0VGltZScpKSxcbiAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgdHlwZTogJ2RhdGUnLCB2YWx1ZTogZnJvbSwgJ2FyaWEtbGFiZWwnOiB0KCdzdGFydFRpbWUnKSxcbiAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHNldEZyb20oZS50YXJnZXQudmFsdWUpLFxuICAgICAgICB9KSksXG4gICAgICBoKCdsYWJlbCcsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkJyB9LFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtZmllbGQtbGFiZWwnIH0sIHQoJ2VuZFRpbWUnKSksXG4gICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgIHR5cGU6ICdkYXRlJywgdmFsdWU6IHRvLCAnYXJpYS1sYWJlbCc6IHQoJ2VuZFRpbWUnKSxcbiAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHNldFRvKGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgfSkpKSxcbiAgICBpbnZhbGlkXG4gICAgICA/IGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZC1lcnJvcicsIHJvbGU6ICdhbGVydCcgfSwgdCgncmFuZ2VJbnZhbGlkJykpXG4gICAgICA6IG51bGwsXG4gICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWhpbnQnIH0sIHQoJ3JhbmdlSGludCcpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLWFjdGlvbnMnIH0sXG4gICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tZ2hvc3QnLCBvbkNsaWNrOiBvbkNsb3NlIH0sIHQoJ2NhbmNlbCcpKSxcbiAgICAgIGgoJ2J1dHRvbicsIHtcbiAgICAgICAgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1wcmltYXJ5JyxcbiAgICAgICAgZGlzYWJsZWQ6IGludmFsaWQsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgaWYgKCFpbnZhbGlkKSBvbkFwcGx5KHsgZnJvbSwgdG8gfSkgfSxcbiAgICAgIH0sIHQoJ2NvbmZpcm0nKSkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaooeWei+WkmumAieS4i+aLiVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gTW9kZWxEcm9wZG93bihwcm9wcykge1xuICBjb25zdCB7IG9wdGlvbnMsIHNlbGVjdGVkLCBvbkNoYW5nZSB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3F1ZXJ5LCBzZXRRdWVyeV0gPSBSZWFjdC51c2VTdGF0ZSgnJylcbiAgY29uc3QgYW5jaG9yUmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIGNvbnN0IHBhbmVsU3R5bGUgPSB1c2VGaXhlZFBhbmVsKGFuY2hvclJlZiwgb3BlbiwgMzIwKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAoYW5jaG9yUmVmLmN1cnJlbnQgJiYgIWFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgc2V0T3BlbihmYWxzZSlcbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIHNldE9wZW4oZmFsc2UpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgICB9XG4gIH0sIFtvcGVuXSlcblxuICAvLyDlj6rliJflh7rlvZPliY3ojIPlm7TmnInmlbDmja7nmoTmqKHlnovvvJvlt7LpgInkvYbmjonlh7rlgJnpgInliJfooajnmoTjgIzooaXlm57jgI3vvIzkv53or4Hlj6/muLLmn5PjgIHlj6/muIXpmaRcbiAgLy8g5YCZ6YCJ6ZSu55u05o6l55So5a6/5Li757uZ5aW955qEIGBrZXlg77yIY29tcG9zaXRlTW9kZWxLZXkg55qE57uT5p6c77yJ77ya5a6i5oi356uv5LiN5YaN6Ieq5bex5ou8XG4gIC8vIGBwcm92aWRlciArICcvJyArIG1vZGVsYO+8jHByb3ZpZGVyIOS4uuepuuaXtumCo+enjeaLvOazleS8muW+l+WIsCBgL21vZGVsYCDogIzmsLjov5zpgInkuI3kuK3jgIJcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKG9wdGlvbnMgfHwgW10pLm1hcCgobSkgPT4gbS5rZXkgfHwgKG0ucHJvdmlkZXIgPyBtLnByb3ZpZGVyICsgJy8nICsgbS5tb2RlbCA6IG0ubW9kZWwpKSlcbiAgICA7KHNlbGVjdGVkIHx8IFtdKS5mb3JFYWNoKChtKSA9PiBzZXQuYWRkKG0pKVxuICAgIGNvbnN0IGxpc3QgPSBBcnJheS5mcm9tKHNldClcbiAgICBsaXN0LnNvcnQoKVxuICAgIHJldHVybiBsaXN0XG4gIH0sIFtvcHRpb25zLCBzZWxlY3RlZF0pXG5cbiAgY29uc3QgcSA9IHF1ZXJ5LnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gIGNvbnN0IGZpbHRlcmVkID0gcSA9PT0gJycgPyBjYW5kaWRhdGVzIDogY2FuZGlkYXRlcy5maWx0ZXIoKGMpID0+IGMudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKHEpID49IDApXG4gIGNvbnN0IGxhYmVsID0gc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gdCgnYWxsTW9kZWxzJykgOiB0KCdzZWxlY3RlZE1vZGVscycsIHsgY291bnQ6IHNlbGVjdGVkLmxlbmd0aCB9KVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLWFuY2hvcicsIHJlZjogYW5jaG9yUmVmIH0sXG4gICAgaCgnYnV0dG9uJywge1xuICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICBjbGFzc05hbWU6ICd0c2Qtc2VsZWN0LWJ0bicgKyAoc2VsZWN0ZWQubGVuZ3RoID4gMCA/ICcgdHNkLXNlbGVjdC1oYXMnIDogJycpLFxuICAgICAgb25DbGljazogKCkgPT4geyBzZXRPcGVuKCh2KSA9PiAhdik7IHNldFF1ZXJ5KCcnKSB9LFxuICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuLFxuICAgICAgJ2FyaWEtaGFzcG9wdXAnOiAnbGlzdGJveCcsXG4gICAgICB0aXRsZTogbGFiZWwsXG4gICAgfSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWxlY3QtbGFiZWwnIH0sIGxhYmVsKSxcbiAgICAgIGgoU3ZnSWNvbiwgeyBuYW1lOiAnY2hldnJvbicsIHNpemU6IDE0LCBjbGFzc05hbWU6ICd0c2QtY2hldnJvbicgKyAob3BlbiA/ICcgdHNkLWNoZXZyb24tb3BlbicgOiAnJykgfSkpLFxuICAgIG9wZW5cbiAgICAgID8gaCgnZGl2Jywge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyIHRzZC1tb2RlbC1wb3BvdmVyJyxcbiAgICAgICAgICBzdHlsZTogcGFuZWxTdHlsZSxcbiAgICAgICAgICByb2xlOiAnbGlzdGJveCcsXG4gICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0KCdtb2RlbEZpbHRlckdyb3VwJyksXG4gICAgICAgICAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLXRvb2xzJyB9LFxuICAgICAgICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWxpbmstYnRuJywgb25DbGljazogKCkgPT4gb25DaGFuZ2UoY2FuZGlkYXRlcy5zbGljZSgpKSB9LCB0KCdzZWxlY3RBbGwnKSksXG4gICAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtbGluay1idG4nLCBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShbXSkgfSwgdCgnY2xlYXInKSkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNlYXJjaCcgfSxcbiAgICAgICAgICAgIGgoU3ZnSWNvbiwgeyBuYW1lOiAnc2VhcmNoJywgc2l6ZTogMTQsIGNsYXNzTmFtZTogJ3RzZC1zZWFyY2gtaWNvbicgfSksXG4gICAgICAgICAgICBoKCdpbnB1dCcsIHtcbiAgICAgICAgICAgICAgdHlwZTogJ3NlYXJjaCcsIHZhbHVlOiBxdWVyeSwgcGxhY2Vob2xkZXI6IHQoJ3NlYXJjaE1vZGVscycpLFxuICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQoJ3NlYXJjaE1vZGVscycpLFxuICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHNldFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1saXN0JyB9LFxuICAgICAgICAgICAgZmlsdGVyZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgID8gaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItZW1wdHknIH0sIHQoJ25vTWF0Y2hNb2RlbHMnKSlcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgZmlsdGVyZWQubWFwKChrZXkpID0+XG4gICAgICAgICAgICAgIGgoJ2xhYmVsJywgeyBrZXksIGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1pdGVtJyB9LFxuICAgICAgICAgICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkLmluZGV4T2Yoa2V5KSA+PSAwLFxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBzZWxlY3RlZC5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuaW5kZXhPZihrZXkpIDwgMCkgbmV4dC5wdXNoKGtleSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gbmV4dC5pbmRleE9mKGtleSlcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSBuZXh0LnNwbGljZShpLCAxKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKG5leHQpIC8vIOWLvumAieWNs+aXtueUn+aViFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbW9kZWwtbmFtZScsIHRpdGxlOiBrZXkgfSwga2V5KSkpKSxcbiAgICAgICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1ub3RlJyB9LCB0KCdtb2RlbEZpbHRlckhpbnQnKSkpXG4gICAgICA6IG51bGwpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog562b6YCJ5qCP77ya5pel5pyf6aKE6K6+77yI5YiG5q615oyJ6ZKu77yJKyDoh6rlrprkuYnmta7lsYIgKyDmqKHlnovlpJrpgIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEZpbHRlckJhcihwcm9wcykge1xuICBjb25zdCB7XG4gICAgcmFuZ2UsIGN1c3RvbSwgbW9kZWxzLCBjdXN0b21PcGVuLCBtb2RlbE9wdGlvbnMsXG4gICAgb25QcmVzZXQsIG9uQ3VzdG9tT3Blbiwgb25DdXN0b21BcHBseSwgb25DdXN0b21DbG9zZSwgb25Nb2RlbHNDaGFuZ2UsXG4gIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIGNvbnN0IHNlZ1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBjdXN0b21CdG5SZWYgPSBSZWFjdC51c2VSZWYobnVsbClcbiAgdXNlT3V0c2lkZUNsaWNrKGN1c3RvbU9wZW4sIHNlZ1JlZiwgb25DdXN0b21DbG9zZSlcblxuICBjb25zdCBjdXN0b21MYWJlbCA9IGZtdERhdGVTbGFzaChjdXN0b20uZnJvbSkgKyAnIC0gJyArIGZtdERhdGVTbGFzaChjdXN0b20udG8pXG4gIGNvbnN0IHByZXNldHMgPSBbXG4gICAgeyBrZXk6ICd0b2RheScsIGxhYmVsOiB0KCd0b2RheScpIH0sXG4gICAgeyBrZXk6ICc3ZCcsIGxhYmVsOiB0KCdsYXN0N2QnKSB9LFxuICAgIHsga2V5OiAnMzBkJywgbGFiZWw6IHQoJ2xhc3QzMGQnKSB9LFxuICAgIHsga2V5OiAnYWxsJywgbGFiZWw6IHQoJ2FsbCcpIH0sXG4gICAgeyBrZXk6ICdjdXN0b20nLCBsYWJlbDogdCgnY3VzdG9tJykgfSxcbiAgXVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWx0ZXJiYXInIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2VnLXdyYXAnLCByZWY6IHNlZ1JlZiB9LFxuICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2VnJywgcm9sZTogJ2dyb3VwJywgJ2FyaWEtbGFiZWwnOiB0KCdkYXRlUmFuZ2VHcm91cCcpIH0sXG4gICAgICAgIHByZXNldHMubWFwKChwKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aXZlID0gcmFuZ2UgPT09IHAua2V5XG4gICAgICAgICAgY29uc3QgaXNDdXN0b20gPSBwLmtleSA9PT0gJ2N1c3RvbSdcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IGlzQ3VzdG9tICYmIGFjdGl2ZSA/IGN1c3RvbUxhYmVsIDogcC5sYWJlbFxuICAgICAgICAgIHJldHVybiBoKCdidXR0b24nLCB7XG4gICAgICAgICAgICBrZXk6IHAua2V5LFxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICByZWY6IGlzQ3VzdG9tID8gY3VzdG9tQnRuUmVmIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXNlZy1idG4nICsgKGFjdGl2ZSA/ICcgdHNkLXNlZy1hY3RpdmUnIDogJycpICsgKGlzQ3VzdG9tID8gJyB0c2Qtc2VnLWN1c3RvbScgOiAnJyksXG4gICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogYWN0aXZlLFxuICAgICAgICAgICAgdGl0bGU6IGlzQ3VzdG9tICYmIGFjdGl2ZSA/IGN1c3RvbUxhYmVsIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb25DbGljazogKCkgPT4geyBpZiAoaXNDdXN0b20pIG9uQ3VzdG9tT3BlbighY3VzdG9tT3Blbik7IGVsc2Ugb25QcmVzZXQocC5rZXkpIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWctbGFiZWwnIH0sIGxhYmVsKSlcbiAgICAgICAgfSkpLFxuICAgICAgY3VzdG9tT3BlblxuICAgICAgICA/IGgoQ3VzdG9tUmFuZ2VQb3BvdmVyLCB7IGN1c3RvbSwgb25BcHBseTogb25DdXN0b21BcHBseSwgb25DbG9zZTogb25DdXN0b21DbG9zZSwgYW5jaG9yUmVmOiBjdXN0b21CdG5SZWYgfSlcbiAgICAgICAgOiBudWxsKSxcbiAgICBoKE1vZGVsRHJvcGRvd24sIHsgb3B0aW9uczogbW9kZWxPcHRpb25zLCBzZWxlY3RlZDogbW9kZWxzLCBvbkNoYW5nZTogb25Nb2RlbHNDaGFuZ2UgfSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5Y+C6ICD5oiQ5pys5biB56eN5YiH5o2i77yI5Lq65rCR5biBIC8g576O5YWD77yM5Zu65a6aIDEgVVNEID0gNyBDTlnvvIlcbiAqXG4gKiDmjaLnrpflnKjlrr/kuLvkvqflrozmiJDvvIjku7fnm67ooajmmK/nvo7lhYPku7fvvIznu53kuI3lm57lhpnvvInvvIzmiYDku6Xov5nph4zlj6rotJ/otKPpgInmi6nkuI7mjIHkuYXljJbvvJpcbiAqIOaNouW4geenjeWNs+aNouafpeivou+8jOS4jemHjeafpeaVsOWtl+S4jeS8muWPmOOAglxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgQ1VSUkVOQ1lfU1lNQk9MUyA9IHsgQ05ZOiAnwqUnLCBVU0Q6ICckJyB9XG5jb25zdCBDVVJSRU5DWV9TVE9SRV9LRVkgPSAnZHNoLXBsdWdpbi11c2FnZTpkaXNwbGF5LWN1cnJlbmN5J1xuXG5mdW5jdGlvbiByZWFkU3RvcmVkQ3VycmVuY3koKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShDVVJSRU5DWV9TVE9SRV9LRVkpID09PSAnVVNEJyA/ICdVU0QnIDogJ0NOWSdcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAnQ05ZJyAvLyDml6Dnl5XmqKHlvI8gLyDlrZjlgqjooqvnpoHvvJrpgIDlm57pu5jorqRcbiAgfVxufVxuZnVuY3Rpb24gc3RvcmVDdXJyZW5jeShjb2RlKSB7XG4gIHRyeSB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKENVUlJFTkNZX1NUT1JFX0tFWSwgY29kZSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIOWtmOS4jeS4i+WwseWPquW9seWTjeS4i+asoeaJk+W8gO+8jOS4jeW9seWTjeacrOasoeaYvuekulxuICB9XG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5UGlja2VyKHByb3BzKSB7XG4gIGNvbnN0IHsgY29kZSwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBwYW5lbFN0eWxlID0gdXNlRml4ZWRQYW5lbChyZWYsIG9wZW4sIDE4MClcbiAgdXNlT3V0c2lkZUNsaWNrKG9wZW4sIHJlZiwgKCkgPT4gc2V0T3BlbihmYWxzZSkpXG4gIGNvbnN0IGFjdGl2ZSA9IENVUlJFTkNZX1NZTUJPTFNbY29kZV0gPyBjb2RlIDogJ0NOWSdcbiAgY29uc3Qgb3B0aW9ucyA9IFsnQ05ZJywgJ1VTRCddXG4gIC8vIOaUtui1t+aXtiDihpHihpMg55u05o6l5o2i5YC877yI5YOP5Y6f55SfIHNlbGVjdO+8ie+8jOWxleW8gOaXtuWcqOS4pOmhuemXtOenu+WKqO+8m0VzYyDlhbPoj5zljZXjgIJcbiAgY29uc3QgbW92ZSA9IChzdGVwKSA9PiB7XG4gICAgY29uc3QgaSA9IG9wdGlvbnMuaW5kZXhPZihhY3RpdmUpXG4gICAgb25DaGFuZ2Uob3B0aW9uc1soaSArIHN0ZXAgKyBvcHRpb25zLmxlbmd0aCkgJSBvcHRpb25zLmxlbmd0aF0pXG4gIH1cbiAgY29uc3Qgb25LZXlEb3duID0gKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7IHNldE9wZW4oZmFsc2UpOyByZXR1cm4gfVxuICAgIGlmICghb3Blbikge1xuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJyB8fCBlLmtleSA9PT0gJ0Fycm93VXAnKSB7IGUucHJldmVudERlZmF1bHQoKTsgbW92ZShlLmtleSA9PT0gJ0Fycm93RG93bicgPyAxIDogLTEpOyByZXR1cm4gfVxuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzZXRPcGVuKHRydWUpIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nKSB7IGUucHJldmVudERlZmF1bHQoKTsgbW92ZSgxKSB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IG1vdmUoLTEpIH1cbiAgfVxuICByZXR1cm4gaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWN1ci1hbmNob3InLCByZWYgfSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1jdXItYnRuJyArIChvcGVuID8gJyB0c2QtY3VyLWJ0bi1vcGVuJyA6ICcnKSxcbiAgICAgIHRpdGxlOiB0KCdjdXJyZW5jeUhpbnQnKSxcbiAgICAgICdhcmlhLWxhYmVsJzogdCgnY3VycmVuY3lIaW50JyksXG4gICAgICAnYXJpYS1oYXNwb3B1cCc6ICdsaXN0Ym94JyxcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogb3BlbixcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHNldE9wZW4oKHYpID0+ICF2KSxcbiAgICAgIG9uS2V5RG93bixcbiAgICB9LFxuICAgICAgaCgnc3BhbicsIG51bGwsIENVUlJFTkNZX1NZTUJPTFNbYWN0aXZlXSksXG4gICAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2NoZXZyb24nLCBzaXplOiAxMCwgY2xhc3NOYW1lOiAndHNkLWN1ci1jaGV2cm9uJyB9KSksXG4gICAgb3BlblxuICAgICAgPyBoKCdkaXYnLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXIgdHNkLWN1ci1wb3BvdmVyJyxcbiAgICAgICAgICBzdHlsZTogcGFuZWxTdHlsZSxcbiAgICAgICAgICByb2xlOiAnbGlzdGJveCcsXG4gICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0KCdjdXJyZW5jeUhpbnQnKSxcbiAgICAgICAgICBvbktleURvd24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMubWFwKChjKSA9PiBoKCdidXR0b24nLCB7XG4gICAgICAgICAga2V5OiBjLFxuICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgIHJvbGU6ICdvcHRpb24nLFxuICAgICAgICAgICdhcmlhLXNlbGVjdGVkJzogYyA9PT0gYWN0aXZlLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1jdXItb3B0aW9uJyArIChjID09PSBhY3RpdmUgPyAnIHRzZC1jdXItb3B0aW9uLWFjdGl2ZScgOiAnJyksXG4gICAgICAgICAgb25DbGljazogKCkgPT4geyBvbkNoYW5nZShjKTsgc2V0T3BlbihmYWxzZSkgfSxcbiAgICAgICAgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY3VyLXN5bWJvbCcgfSwgQ1VSUkVOQ1lfU1lNQk9MU1tjXSksXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWN1ci1uYW1lJyB9LCB0KGMgPT09ICdDTlknID8gJ2N1cnJlbmN5Q05ZJyA6ICdjdXJyZW5jeVVTRCcpKSxcbiAgICAgICAgICBjID09PSBhY3RpdmUgPyBoKFN2Z0ljb24sIHsgbmFtZTogJ2NoZWNrJywgc2l6ZTogMTIsIGNsYXNzTmFtZTogJ3RzZC1jdXItY2hlY2snIH0pIDogbnVsbCkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLW5vdGUnIH0sIHQoJ2N1cnJlbmN5SGludCcpKSlcbiAgICAgIDogbnVsbClcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmqKHlnovljaDmr5TvvIhLUEkg572R5qC86YeM55qE56ysIDYg5qC877yJXG4gKlxuICog5pWw5o2u55u05o6l5ZCD5a6/5Li7IGBieU1vZGVsYCDnmoTooYzvvIjkuI7jgIzmjInmqKHlnovmmI7nu4bjgI3ooajlkIzkuIDku73vvInvvIzkuI3lj6bnrpfkuIDpgY3jgIJcbiAqIOaYjue7huaUvuWcqOWQhOauteeahOWOn+eUnyB0aXRsZSDkuIrogIzkuI3mmK/mta7lsYLvvJpLUEkg5Y2h6LS0552A6K6+572u6Z2i5p2/55qE6KOB5Ymq6L6555WM77yMXG4gKiDlho3lj6DkuIDlsYLmta7lsYLlj6rkvJrmiorkuYvliY3kv67lpb3nmoToo4Hliarpl67popjluKblm57mnaXjgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFNIQVJFX0NPTE9SUyA9IFtcbiAgLy8g5Y+q55So5Li76aKY6YeM55yf5a6e5a2Y5Zyo44CB5LiU5b285q2k5YiG5b6X5byA55qE5b2p6Imy5peP77ya5rex6JOd44CB57u/44CB55Cl54+A44CB57qi44CCXG4gIC8vIOS4jeeUqCBuZXV0cmFsIC8g55m9IC8g6buRIOKAlOKAlCDlroPku6zlnKjmt7HmtYXkuKTlpZfkuLvpopjph4zkuIDovrnkvJrns4rov5vog4zmma/vvIzkuIDovrnkvJrooqvor7vmiJDnpoHnlKjmgIHjgIJcbiAgJ3ZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKScsXG4gICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAndmFyKC0tZHN3LXN0YXRpYy1hbWJlci01MDApJyxcbiAgJ3ZhcigtLWRzdy1zdGF0aWMtcmVkLTQwMCknLFxuXVxuY29uc3QgU0hBUkVfVE9QID0gNFxuY29uc3QgU0hBUkVfUkVTVF9LRVkgPSAnX19yZXN0X18nXG5cbi8qKiBgcHJvdmlkZXIvbW9kZWxgIOKGkiDoo7jmqKHlnovlkI3vvJvoibLluKbmoLzkvY3mlL7kuI3kuIvlhajlkI3vvIzlhajlkI3nlZnnu5kgdGl0bGUg5LiOIGFyaWHjgIIgKi9cbmZ1bmN0aW9uIHNob3J0TW9kZWxOYW1lKGtleSkge1xuICBjb25zdCBzID0gU3RyaW5nKGtleSA9PSBudWxsID8gJycgOiBrZXkpXG4gIGNvbnN0IGkgPSBzLmxhc3RJbmRleE9mKCcvJylcbiAgcmV0dXJuIGkgPT09IC0xID8gcyA6IHMuc2xpY2UoaSArIDEpXG59XG4vKiog5a6/5Li76KGM5pivIGB0b3RhbFRva2Vuc2DvvJvlhbzlrrnlt7LmmKDlsITmiJAgYHRvdGFsYCDnmoTlvaLnirbvvIznqbrooYzkuZ/kuI3og73mipvjgIIgKi9cbmZ1bmN0aW9uIHJvd1RvdGFsKHIpIHtcbiAgcmV0dXJuIHIgPyAoci50b3RhbFRva2VucyB8fCByLnRvdGFsIHx8IDApIDogMFxufVxuLyoqIOmZjeW6j+WPluWJjSA0IOaute+8jOWFtuS9meW5tuaIkOOAjOWFtuWug+OAje+8m+aXoOaVsOaNruaXtui/lOWbnuepuuauteOAgiAqL1xuZnVuY3Rpb24gc2hhcmVTZWdtZW50cyhyb3dzKSB7XG4gIGNvbnN0IGxpc3QgPSAocm93cyB8fCBbXSkuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiByb3dUb3RhbChiKSAtIHJvd1RvdGFsKGEpKVxuICBjb25zdCB0b3RhbCA9IGxpc3QucmVkdWNlKChzLCByKSA9PiBzICsgcm93VG90YWwociksIDApXG4gIGlmICh0b3RhbCA8PSAwKSByZXR1cm4geyB0b3RhbDogMCwgc2VnczogW10gfVxuICBjb25zdCBudW1iZXJzID0gKHIpID0+ICh7XG4gICAgdG9rZW5zOiByb3dUb3RhbChyKSxcbiAgICBjYWxsczogci5jYWxscyB8fCAwLFxuICAgIC8vIOS4juaYjue7huihqOWQjOS4gOWPo+W+hO+8mui+k+WFpeWQq+e8k+WtmOivu+WGmVxuICAgIGlucHV0OiAoci5pbnB1dFRva2VucyB8fCAwKSArIChyLmNhY2hlUmVhZFRva2VucyB8fCAwKSArIChyLmNhY2hlV3JpdGVUb2tlbnMgfHwgMCksXG4gICAgb3V0cHV0OiByLm91dHB1dFRva2VucyB8fCAwLFxuICAgIGNvc3Q6IHIuY29zdCB8fCAwLFxuICB9KVxuICBjb25zdCBzZWdzID0gbGlzdC5zbGljZSgwLCBTSEFSRV9UT1ApLm1hcCgociwgaSkgPT4gT2JqZWN0LmFzc2lnbih7XG4gICAga2V5OiBTdHJpbmcoci5rZXkpLFxuICAgIGxhYmVsOiBzaG9ydE1vZGVsTmFtZShyLmtleSksXG4gICAgcGN0OiByb3dUb3RhbChyKSAvIHRvdGFsLFxuICAgIGNvbG9yOiBTSEFSRV9DT0xPUlNbaSAlIFNIQVJFX0NPTE9SUy5sZW5ndGhdLFxuICB9LCBudW1iZXJzKHIpKSlcbiAgY29uc3QgcmVzdFJvd3MgPSBsaXN0LnNsaWNlKFNIQVJFX1RPUClcbiAgY29uc3QgcmVzdFRva2VucyA9IHJlc3RSb3dzLnJlZHVjZSgocywgcikgPT4gcyArIHJvd1RvdGFsKHIpLCAwKVxuICBpZiAocmVzdFRva2VucyA+IDApIHtcbiAgICBjb25zdCBhZ2cgPSByZXN0Um93cy5yZWR1Y2UoKGEsIHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSBudW1iZXJzKHIpXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbnM6IGEudG9rZW5zICsgbi50b2tlbnMsXG4gICAgICAgIGNhbGxzOiBhLmNhbGxzICsgbi5jYWxscyxcbiAgICAgICAgaW5wdXQ6IGEuaW5wdXQgKyBuLmlucHV0LFxuICAgICAgICBvdXRwdXQ6IGEub3V0cHV0ICsgbi5vdXRwdXQsXG4gICAgICAgIGNvc3Q6IGEuY29zdCArIG4uY29zdCxcbiAgICAgIH1cbiAgICB9LCB7IHRva2VuczogMCwgY2FsbHM6IDAsIGlucHV0OiAwLCBvdXRwdXQ6IDAsIGNvc3Q6IDAgfSlcbiAgICBzZWdzLnB1c2goT2JqZWN0LmFzc2lnbih7XG4gICAgICBrZXk6IFNIQVJFX1JFU1RfS0VZLFxuICAgICAgbGFiZWw6IG51bGwsIC8vIOOAjOWFtuWug+OAjeeahOaWh+ahiOeUsea4suafk+WxguWPluivjeWFuFxuICAgICAgcGN0OiByZXN0VG9rZW5zIC8gdG90YWwsXG4gICAgICAvLyDjgIzlhbblroPjgI3nlKjlkIzoibLns7vnmoTmt6HoibLvvIjmtYXok53vvInvvIzkuI3nlKjngbAv55m977ya6YKj5Lik56eN5Zyo5rex6Imy5Y2h54mH5LiK5Lya6KKr6K+75oiQ56aB55SoXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstMzAwKScsXG4gICAgfSwgYWdnKSlcbiAgfVxuICByZXR1cm4geyB0b3RhbCwgc2VncyB9XG59XG5cbmZ1bmN0aW9uIE1vZGVsU2hhcmVCYXIocHJvcHMpIHtcbiAgY29uc3QgeyByb3dzLCBjdXJyZW5jeSB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbdGlwLCBzZXRUaXBdID0gUmVhY3QudXNlU3RhdGUobnVsbCkgLy8geyBrZXksIGxlZnQsIHRvcCB9IGluIHZpZXdwb3J0IGNvb3Jkc1xuICBjb25zdCBvY2MgPSBzaGFyZVNlZ21lbnRzKHJvd3MpXG4gIGlmIChvY2MudG90YWwgPD0gMCkgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdmFsdWUgdHNkLXNoYXJlLWVtcHR5JyB9LCB0KCdub0RhdGEnKSlcbiAgY29uc3QgZmluZCA9IChrZXkpID0+IG9jYy5zZWdzLmZpbHRlcigocykgPT4gcy5rZXkgPT09IGtleSlbMF0gfHwgbnVsbFxuICBjb25zdCBzaG93biA9ICh0aXAgJiYgZmluZCh0aXAua2V5KSkgfHwgb2NjLnNlZ3NbMF1cbiAgY29uc3QgbGFiZWxPZiA9IChzKSA9PiAocy5rZXkgPT09IFNIQVJFX1JFU1RfS0VZID8gdCgnc2hhcmVPdGhlcicpIDogcy5sYWJlbClcbiAgY29uc3QgZnVsbE9mID0gKHMpID0+IChzLmtleSA9PT0gU0hBUkVfUkVTVF9LRVkgPyB0KCdzaGFyZU90aGVyJykgOiBzLmtleSlcbiAgY29uc3QgY29zdE9mID0gKHMpID0+IChzLnRva2VucyA+IDAgJiYgIShzLmNvc3QgPiAwKSA/IHQoJ3VucHJpY2VkJykgOiBmb3JtYXRDb3N0KHMuY29zdCwgY3VycmVuY3kpKVxuICAvLyDmgqzlgZwv6IGa54Sm77ya5LuO5q6155qE6KeG5Y+j55+p5b2i5o6o5byA77yMZml4ZWQg5a6a5L2N5LiN5Y+X6K6+572u6Z2i5p2/IG92ZXJmbG93IOijgeWJqlxuICBjb25zdCBzaG93VGlwID0gKGUsIHMpID0+IHtcbiAgICBjb25zdCByID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgc2V0VGlwKHsga2V5OiBzLmtleSwgbGVmdDogci5sZWZ0ICsgci53aWR0aCAvIDIsIHRvcDogci50b3AgfSlcbiAgfVxuICBjb25zdCBoaWRlVGlwID0gKCkgPT4gc2V0VGlwKG51bGwpXG4gIGNvbnN0IHRpcEJveCA9IHNob3duICYmIHRpcFxuICAgID8gaCgnZGl2Jywge1xuICAgICAgICBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcCB0c2Qtc2hhcmUtdGlwJyxcbiAgICAgICAgc3R5bGU6IHsgcG9zaXRpb246ICdmaXhlZCcsIGxlZnQ6IHRpcC5sZWZ0ICsgJ3B4JywgdG9wOiB0aXAudG9wICsgJ3B4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC0xMTAlKScgfSxcbiAgICAgIH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZGF0ZScgfSwgZnVsbE9mKHNob3duKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCcsIHN0eWxlOiB7IGJhY2tncm91bmQ6IHNob3duLmNvbG9yIH0gfSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ3RvdGFsVG9rZW5zJykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KHNob3duLnRva2VucykpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KHNob3duLmlucHV0KSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KHNob3duLm91dHB1dCkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2Nvc3QnKSksXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBjb3N0T2Yoc2hvd24pKSkpXG4gICAgOiBudWxsXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXNoYXJlLWJvZHknIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2hhcmUtdHJhY2snLCBvbk1vdXNlTGVhdmU6IGhpZGVUaXAgfSxcbiAgICAgIG9jYy5zZWdzLm1hcCgocykgPT4gaCgnZGl2Jywge1xuICAgICAgICBrZXk6IHMua2V5LFxuICAgICAgICBjbGFzc05hbWU6ICd0c2Qtc2hhcmUtc2VnJyxcbiAgICAgICAgJ2RhdGEtc2hhcmUta2V5Jzogcy5rZXksXG4gICAgICAgICdkYXRhLWFjdGl2ZSc6IHNob3duICYmIHNob3duLmtleSA9PT0gcy5rZXkgPyAndHJ1ZScgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0eWxlOiB7IHdpZHRoOiBzLnBjdCAqIDEwMCArICclJywgYmFja2dyb3VuZDogcy5jb2xvciB9LFxuICAgICAgICByb2xlOiAnaW1nJyxcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICdhcmlhLWxhYmVsJzogZnVsbE9mKHMpICsgJyDCtyAnICsgZm10UGN0KHMucGN0KSArICcgwrcgJyArIGZvcm1hdEludChzLnRva2VucykgKyAnICcgKyB0KCd0b3RhbFRva2VucycpLFxuICAgICAgICBvbk1vdXNlRW50ZXI6IChlKSA9PiBzaG93VGlwKGUsIHMpLFxuICAgICAgICBvbkZvY3VzOiAoZSkgPT4gc2hvd1RpcChlLCBzKSxcbiAgICAgICAgb25CbHVyOiBoaWRlVGlwLFxuICAgICAgfSkpKSxcbiAgICAvLyDmnaHkuIvlj6rnlZnkuIDooYzkvY7osIPohJrms6jvvIjlvZPliY3mgqzmta7nmoTpgqPmrrXvvIzlkKbliJnmnIDlpKfnmoTpgqPmrrXvvInvvJtcbiAgICAvLyDlhajlkI3kuI7mmI7nu4bpg73lnKjmgqzmta7ljaHniYfph4zvvIzmiYDku6Xov5nph4zkuI3mjIIgdGl0bGXjgIJcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zaGFyZS1jYXB0aW9uJyB9LFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNoYXJlLWNhcC1uYW1lJyB9LCBsYWJlbE9mKHNob3duKSksXG4gICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2Qtc2hhcmUtY2FwLXBjdCcgfSwgZm10UGN0KHNob3duLnBjdCkpKSxcbiAgICB0aXBCb3gpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5rGH5oC75oyH5qCH5Y2hIMOXNlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3VtbWFyeUNhcmRzKHByb3BzKSB7XG4gIGNvbnN0IHsgdG90YWwsIGN1cnJlbmN5LCB1bnByaWNlZENhbGxzLCBjdXJyZW5jeUNvZGUsIG9uQ3VycmVuY3lDaGFuZ2UsIGJ5TW9kZWwgfSA9IHByb3BzXG4gIGNvbnN0IHR0ID0gdXNlVCgpXG4gIGNvbnN0IGQgPSB0b3RhbCB8fCB7fVxuICBjb25zdCBpbnB1dFRvdGFsID0gKGQuaW5wdXRUb2tlbnMgfHwgMCkgKyAoZC5jYWNoZVJlYWRUb2tlbnMgfHwgMCkgKyAoZC5jYWNoZVdyaXRlVG9rZW5zIHx8IDApXG4gIGNvbnN0IGNhcmRzID0gW1xuICAgIHtcbiAgICAgIGtleTogJ3RvdGFsJywgaWNvbjogJ2xheWVycycsIGxhYmVsOiB0dCgndG90YWxUb2tlbnMnKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRUb2tlbnNTaG9ydChkLnRvdGFsVG9rZW5zKSwgdGl0bGU6IGZvcm1hdEludChkLnRvdGFsVG9rZW5zKSxcbiAgICAgIHN1YjogdHQoJ2FwcHJveElPJyksIGNvbG9yOiAndmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2lucHV0JywgaWNvbjogJ2Rvd24nLCBsYWJlbDogdHQoJ2lucHV0VG9rZW5zJyksXG4gICAgICB2YWx1ZTogZm9ybWF0VG9rZW5zU2hvcnQoaW5wdXRUb3RhbCksIHRpdGxlOiBmb3JtYXRJbnQoaW5wdXRUb3RhbCksXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdvdXRwdXQnLCBpY29uOiAndXAnLCBsYWJlbDogdHQoJ291dHB1dFRva2VucycpLFxuICAgICAgdmFsdWU6IGZvcm1hdFRva2Vuc1Nob3J0KGQub3V0cHV0VG9rZW5zKSwgdGl0bGU6IGZvcm1hdEludChkLm91dHB1dFRva2VucyksXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzdy1zdGF0aWMtZ3JlZW4tNTAwKScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdjYWxscycsIGljb246ICdhY3Rpdml0eScsIGxhYmVsOiB0dCgnY2FsbHMnKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRJbnQoZC5jYWxscyksIHRpdGxlOiBmb3JtYXRJbnQoZC5jYWxscyksXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdjb3N0JywgaWNvbjogJ2NvaW5zJywgbGFiZWw6IHR0KCdjb3N0JyksXG4gICAgICAvLyDnrKblj7fnlLEgcHJlZml4IOeahOW4geenjeWIh+aNouWZqOeUu++8iOWug+aYvuekuuW9k+WJjeW4geenjeespuWPt++8ie+8jOi/memHjOWPque7meaVsOWtl1xuICAgICAgdmFsdWU6IGNvc3REaWdpdHMoZC5jb3N0KSwgdGl0bGU6IGZvcm1hdENvc3QoZC5jb3N0LCBjdXJyZW5jeSksXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzdy1zdGF0aWMtZ3JlZW4tNTAwKScsXG4gICAgICBwcmVmaXg6IGgoQ3VycmVuY3lQaWNrZXIsIHsgY29kZTogY3VycmVuY3lDb2RlLCBvbkNoYW5nZTogb25DdXJyZW5jeUNoYW5nZSB9KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ3NoYXJlJywgaWNvbjogJ3NoYXJlJywgbGFiZWw6IHR0KCdtb2RlbFNoYXJlJyksXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KScsXG4gICAgICBjb250ZW50OiBoKE1vZGVsU2hhcmVCYXIsIHsgcm93czogYnlNb2RlbCwgY3VycmVuY3kgfSksXG4gICAgfSxcbiAgXVxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZHMnIH0sXG4gICAgY2FyZHMubWFwKChjKSA9PlxuICAgICAgaCgnZGl2JywgeyBrZXk6IGMua2V5LCBjbGFzc05hbWU6ICd0c2QtY2FyZCcgfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1oZWFkJyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWljb24nLCBzdHlsZTogeyBjb2xvcjogYy5jb2xvciB9IH0sXG4gICAgICAgICAgICBoKFN2Z0ljb24sIHsgbmFtZTogYy5pY29uLCBzaXplOiAxNCB9KSksXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtbGFiZWwnIH0sIGMubGFiZWwpKSxcbiAgICAgICAgYy5jb250ZW50XG4gICAgICAgICAgPyBjLmNvbnRlbnRcbiAgICAgICAgICA6IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdmFsdWUnLCB0aXRsZTogYy50aXRsZSB9LCBjLnByZWZpeCB8fCBudWxsLCBjLnZhbHVlKSxcbiAgICAgICAgYy5zdWIgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXN1YicgfSwgYy5zdWIpIDogbnVsbCxcbiAgICAgICAgYy5rZXkgPT09ICdjb3N0JyAmJiB1bnByaWNlZENhbGxzID4gMFxuICAgICAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1ub3RlJyB9LCB0dCgndW5wcmljZWROb3RlJywgeyBjb3VudDogZm9ybWF0SW50KHVucHJpY2VkQ2FsbHMpIH0pKVxuICAgICAgICAgIDogbnVsbCkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOavj+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+WxgFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3RhdHNEYXNoYm9hcmQocHJvcHMpIHtcbiAgY29uc3QgdCA9IHByb3BzLnQgfHwgZmFsbGJhY2tUXG4gIGNvbnN0IFtyYW5nZSwgc2V0UmFuZ2VdID0gUmVhY3QudXNlU3RhdGUoJ3RvZGF5JykgLy8gdG9kYXkgfCA3ZCB8IDMwZCB8IGN1c3RvbVxuICBjb25zdCBbY3VzdG9tLCBzZXRDdXN0b21dID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdEN1c3RvbSlcbiAgY29uc3QgW21vZGVscywgc2V0TW9kZWxzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKSAvLyBbXSA9IOWFqOmDqOaooeWei1xuICBjb25zdCBbY3VzdG9tT3Blbiwgc2V0Q3VzdG9tT3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JldHJ5LCBzZXRSZXRyeV0gPSBSZWFjdC51c2VTdGF0ZSgwKVxuICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gUmVhY3QudXNlU3RhdGUoJ2xvYWRpbmcnKSAvLyBsb2FkaW5nIHwgcmVmcmVzaGluZyB8IHJlYWR5IHwgZXJyb3JcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gUmVhY3QudXNlU3RhdGUobnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKVxuICBjb25zdCBbcHJpY2VzLCBzZXRQcmljZXNdID0gUmVhY3QudXNlU3RhdGUoeyBwcmljZXM6IHt9LCBjdXJyZW5jeTogJ8KlJyB9KVxuICAvLyDlsZXnpLrluIHnp43vvJrlrr/kuLvmjInlroPmjaLnrpfmiJDmnKzvvIzmiYDku6XmjaLluIHnp43lv4Xpobvph43mn6XvvJvpgInmi6norrDlnKjmnKzlnLDvvIjlsZXnpLrlgY/lpb3vvIxcbiAgLy8g5LiN5YaZ5o+S5Lu26K6+572u77yM5YWN5b6X5q+P5qyh5Y+W5pWw6YO95Zyo5pS55YaZ55So5oi36YWN572u77yJ44CCXG4gIGNvbnN0IFtkaXNwbGF5Q3VycmVuY3ksIHNldERpc3BsYXlDdXJyZW5jeV0gPSBSZWFjdC51c2VTdGF0ZShyZWFkU3RvcmVkQ3VycmVuY3kpXG4gIC8vIFAxLTYgYmFja2ZpbGwg6L2u6K+i54q25oCB77yacXVlcnlLZXkg5Y+Y5YyW5pe26YeN572u77yM5LuF5a+55ZCM5LiA5p+l6K+i5Liy6L2u6K+iXG4gIGNvbnN0IHF1ZXJ5S2V5UmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIGNvbnN0IGJhY2tmaWxsU2VlblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcbiAgY29uc3QgZmluYWxSZWZyZXNoUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKVxuXG4gIGNvbnN0IGVmZiA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gcmFuZ2VGb3IocmFuZ2UsIGN1c3RvbSksIFtyYW5nZSwgY3VzdG9tXSlcbiAgLy8gRml4ZWQgc3RlcCBwb2xpY3k6IHRvZGF5ID0gaG91cmx5OyA3ZC8zMGQvY3VzdG9tID0gZGFpbHksIGN1c3RvbSB1c2VzIGFcbiAgLy8gc3RhYmxlIHN0ZXAgKDEvMy81LzcgZGF5cykgY2hvc2VuIGJ5IHRoZSByYW5nZSBsZW5ndGguXG4gIGNvbnN0IGVmZkdyYW4gPSBlZmZHcmFudWxhcml0eShyYW5nZSlcbiAgY29uc3Qgc3RlcERheXMgPSByYW5nZSA9PT0gJ2N1c3RvbScgPyBwaWNrU3RlcERheXMoKGVmZi50byB8fCAwKSAtIChlZmYuZnJvbSB8fCAwKSkgOiAxXG4gIGNvbnN0IGdyYW5MYWJlbCA9IHN0ZXBMYWJlbCh0LCByYW5nZSwgc3RlcERheXMpXG5cbiAgLy8g5p+l6K+i57uf6K6h77yI6aaW6L296aqo5p6277yb5Yi35paw5L+d55WZ5pen5pWw5o2u6L2sIHJlZnJlc2hpbmfvvJtmaWxsIDAg5aGr5YWFICsg5bm05bqm54Ot5Yqb5Zu+77yJXG4gIC8vIFAxLTbvvJpiYWNrZmlsbCBydW5uaW5nIOaXtuavjyAzcyDoh6rliqjph43mn6XvvJtkb25lIOWQjuihpeS4gOasoeaUtuWwvuafpeivouWNs+WBnOOAglxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdHJ1ZVxuICAgIGxldCBiYWNrZmlsbFRpbWVyID0gbnVsbFxuICAgIGNvbnN0IHF1ZXJ5S2V5ID0gZWZmLmZyb20gKyAnfCcgKyBlZmYudG8gKyAnfCcgKyBtb2RlbHMuam9pbignLCcpICsgJ3wnICsgZWZmR3JhbiArICd8JyArIHN0ZXBEYXlzICsgJ3wnICsgZGlzcGxheUN1cnJlbmN5XG4gICAgaWYgKHF1ZXJ5S2V5UmVmLmN1cnJlbnQgIT09IHF1ZXJ5S2V5KSB7XG4gICAgICBxdWVyeUtleVJlZi5jdXJyZW50ID0gcXVlcnlLZXlcbiAgICAgIGJhY2tmaWxsU2VlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgaXNGaW5hbFJ1biA9IGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50XG4gICAgZmluYWxSZWZyZXNoUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNldFN0YXR1cygocykgPT4gKHMgPT09ICdyZWFkeScgJiYgZGF0YSAhPT0gbnVsbCA/ICdyZWZyZXNoaW5nJyA6ICdsb2FkaW5nJykpXG4gICAgaG9zdENhbGwoJ3VzYWdlL3F1ZXJ5Jywge1xuICAgICAgZnJvbTogZWZmLmZyb20sXG4gICAgICB0bzogZWZmLnRvLFxuICAgICAgbW9kZWxzOiBtb2RlbHMuc2xpY2UoKSxcbiAgICAgIC8vIOOAjOWFqOmDqOOAjeS4jeWBmumbtuWhq+WFhe+8muecn+Wunui+ueeVjOaYr+i+k+WHuuahtuaVsO+8iOWuv+S4uyBNQVhfQlVDS0VUU++8ie+8jOS4jeaYr+WkqeaVsOOAglxuICAgICAgZmlsbDogcmFuZ2UgIT09ICdhbGwnLFxuICAgICAgZ3JhbnVsYXJpdHk6IGVmZkdyYW4sXG4gICAgICBzdGVwRGF5cyxcbiAgICAgIGhlYXRtYXA6IHRydWUsXG4gICAgICBjdXJyZW5jeTogZGlzcGxheUN1cnJlbmN5LFxuICAgIH0pXG4gICAgICAudGhlbigocikgPT4ge1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVyblxuICAgICAgICBzZXREYXRhKHIpXG4gICAgICAgIHNldFN0YXR1cygncmVhZHknKVxuICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICBjb25zdCBicyA9IHIgJiYgci5iYWNrZmlsbCA/IHIuYmFja2ZpbGwuc3RhdHVzIDogbnVsbFxuICAgICAgICBpZiAoYnMgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgIGJhY2tmaWxsU2VlblJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIC8vIOWQjOS4gCBlZmZlY3Qg6Iez5aSa5oyC5LiA5Liq5a6a5pe25Zmo77yb6YeN5p+l5aSN55SoIHJldHJ5IOiuoeaVsOWZqOinpuWPkSBlZmZlY3Qg6YeN6LeRXG4gICAgICAgICAgYmFja2ZpbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHNldFJldHJ5KCh2KSA9PiB2ICsgMSlcbiAgICAgICAgICB9LCAzMDAwKVxuICAgICAgICB9IGVsc2UgaWYgKGJzID09PSAnZG9uZScgJiYgYmFja2ZpbGxTZWVuUmVmLmN1cnJlbnQgJiYgIWlzRmluYWxSdW4pIHtcbiAgICAgICAgICAvLyDlm57loavmlLblsL7vvJrmgbDlpb3lho3mn6XkuIDmrKHmi7/liLDlrozmlbTmlbDmja7lkI7lgZzmraJcbiAgICAgICAgICBmaW5hbFJlZnJlc2hSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgICBzZXRSZXRyeSgodikgPT4gdiArIDEpXG4gICAgICAgIH1cbiAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldEVycm9yKGUpXG4gICAgICAgIHNldFN0YXR1cygnZXJyb3InKVxuICAgICAgfSlcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY3VycmVudCA9IGZhbHNlXG4gICAgICBpZiAoYmFja2ZpbGxUaW1lciAhPT0gbnVsbCkgY2xlYXJUaW1lb3V0KGJhY2tmaWxsVGltZXIpXG4gICAgfVxuICB9LCBbZWZmLmZyb20sIGVmZi50bywgbW9kZWxzLCBlZmZHcmFuLCBzdGVwRGF5cywgZGlzcGxheUN1cnJlbmN5LCByZXRyeV0pXG5cbiAgLy8g5Lu35qC86KGo77ya6L+b5YWl6aG16Z2i5ouJ5LiA5qyhICsg5q+P5qyh5Yi35paw5ZCM5q2l44CCXG4gIC8vIFAwLTHvvJrkvJjlhYjlrpjmlrkgc2V0dGluZ3Mgc2NvcGXvvIh1c2FnZS5wcmljZXMg5ZG95ZCN56m66Ze077yJ77yM5LiN5Y+v55So5pe25Zue6YCAIFJQQ+OAglxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdHJ1ZVxuICAgIGxldCBzY29wZURpc3Bvc2UgPSBudWxsXG4gICAgY29uc3QgbG9hZFJwYyA9ICgpID0+IHtcbiAgICAgIGhvc3RDYWxsKCd1c2FnZS9wcmljZXMnKS50aGVuKChwKSA9PiB7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHAgJiYgcC5wcmljZXMpIHNldFByaWNlcyhwKVxuICAgICAgfSwgKCkgPT4ge30pXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY29wZSA9IGdldFVzYWdlUHJpY2VzU2NvcGUoKVxuICAgICAgaWYgKHNjb3BlICYmIHR5cGVvZiBzY29wZS5nZXRTbmFwc2hvdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2NvcGUuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCBhZG9wdGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgYWRvcHQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgICBjb25zdCBzbmFwID0gc2NvcGUuZ2V0U25hcHNob3QoKVxuICAgICAgICAgIGNvbnN0IHYgPSBzbmFwICYmIHNuYXAudmFsdWVcbiAgICAgICAgICBpZiAoc25hcCAmJiBzbmFwLnN0YXR1cyA9PT0gJ3VuYXZhaWxhYmxlJykgcmV0dXJuXG4gICAgICAgICAgaWYgKHYgJiYgKHYucHJpY2VzIHx8IHYuY3VycmVuY3kpKSB7XG4gICAgICAgICAgICBhZG9wdGVkID0gdHJ1ZVxuICAgICAgICAgICAgc2V0UHJpY2VzKHsgcHJpY2VzOiB2LnByaWNlcyB8fCB7fSwgY3VycmVuY3k6IHYuY3VycmVuY3kgfHwgJ8KlJyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZG9wdCgpXG4gICAgICAgIHNjb3BlRGlzcG9zZSA9IHNjb3BlLnN1YnNjcmliZShhZG9wdClcbiAgICAgICAgaWYgKCFhZG9wdGVkKSBsb2FkUnBjKCkgLy8gc2NvcGUg5pyq5bCx57uqL+aXoOWAvO+8muWFiOi1sCBSUEPvvIzorqLpmIXlsLHnu6rlkI4gc2NvcGUg5LyY5YWI6KaG55uWXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkUnBjKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2FkUnBjKCkgLy8g5o6i5rWLL+e7keWumuW8guW4uO+8muWujOaVtOWbnumAgCBSUEPvvIznu53kuI3mipvlh7pcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKHNjb3BlRGlzcG9zZSkge1xuICAgICAgICB0cnkgeyBzY29wZURpc3Bvc2UoKSB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3JldHJ5XSlcblxuICBjb25zdCByZWxvYWQgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZXRSZXRyeSgodikgPT4gdiArIDEpLCBbXSlcblxuICBjb25zdCByZXNldEZpbHRlcnMgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0TW9kZWxzKFtdKVxuICAgIHNldEN1c3RvbShkZWZhdWx0Q3VzdG9tKCkpXG4gICAgc2V0UmFuZ2UoJ3RvZGF5JylcbiAgfSwgW10pXG5cbiAgY29uc3QgY2hhbmdlQ3VycmVuY3kgPSBSZWFjdC51c2VDYWxsYmFjaygoY29kZSkgPT4ge1xuICAgIHN0b3JlQ3VycmVuY3koY29kZSlcbiAgICBzZXREaXNwbGF5Q3VycmVuY3koY29kZSlcbiAgfSwgW10pXG4gIC8vIOespuWPt+S7peWuv+S4u+WbnuS8oOeahOWunumZheW4geenjeS4uuWHhu+8iOWIh+aNouWQjueri+WIu+mHjeafpe+8jOS4jeS8muWHuueOsOOAjOaNouS6huagh+W/l+ayoeaNouaVsOWtl+OAje+8ie+8m1xuICAvLyDogIHlrr/kuLvmsqHmnInor6XlrZfmrrXml7bmjInmnKzlnLDpgInmi6nlhZzlupXjgIJcbiAgY29uc3QgY3VycmVuY3lTeW1ib2wgPSAoZGF0YSAmJiBkYXRhLmN1cnJlbmN5ICYmIGRhdGEuY3VycmVuY3kuc3ltYm9sKVxuICAgIHx8IENVUlJFTkNZX1NZTUJPTFNbZGlzcGxheUN1cnJlbmN5XSB8fCBwcmljZXMuY3VycmVuY3kgfHwgJ8KlJ1xuXG4gIGNvbnN0IGJ1c3kgPSBzdGF0dXMgPT09ICdsb2FkaW5nJyB8fCBzdGF0dXMgPT09ICdyZWZyZXNoaW5nJ1xuICBjb25zdCByZWFkeSA9IGRhdGEgIT09IG51bGxcbiAgY29uc3QgaXNFcnJvciA9IHN0YXR1cyA9PT0gJ2Vycm9yJ1xuICBjb25zdCBpc0VtcHR5ID0gcmVhZHkgJiYgZGF0YS5kYWlseS5sZW5ndGggPT09IDAgJiYgZGF0YS5ieU1vZGVsLmxlbmd0aCA9PT0gMFxuXG4gIHJldHVybiBoKFQuUHJvdmlkZXIsIHsgdmFsdWU6IHQgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWN0aW9uJywgJ2FyaWEtYnVzeSc6IGJ1c3kgfHwgdW5kZWZpbmVkIH0sXG4gICAgaChTdGF0c0hlYWRlciwgeyBidXN5LCBvblJlZnJlc2g6IHJlbG9hZCB9KSxcbiAgICBoKEZpbHRlckJhciwge1xuICAgICAgcmFuZ2UsXG4gICAgICBjdXN0b20sXG4gICAgICBtb2RlbHMsXG4gICAgICBjdXN0b21PcGVuLFxuICAgICAgbW9kZWxPcHRpb25zOiBkYXRhID8gZGF0YS5tb2RlbHMgOiBbXSxcbiAgICAgIG9uUHJlc2V0OiAocCkgPT4geyBzZXRSYW5nZShwKTsgc2V0Q3VzdG9tT3BlbihmYWxzZSkgfSxcbiAgICAgIG9uQ3VzdG9tT3BlbjogKG9wZW4pID0+IHsgc2V0UmFuZ2UoJ2N1c3RvbScpOyBzZXRDdXN0b21PcGVuKG9wZW4pIH0sXG4gICAgICBvbkN1c3RvbUFwcGx5OiAoYykgPT4geyBzZXRDdXN0b20oYyk7IHNldEN1c3RvbU9wZW4oZmFsc2UpIH0sXG4gICAgICBvbkN1c3RvbUNsb3NlOiAoKSA9PiBzZXRDdXN0b21PcGVuKGZhbHNlKSxcbiAgICAgIG9uTW9kZWxzQ2hhbmdlOiBzZXRNb2RlbHMsXG4gICAgfSksXG4gICAgaXNFcnJvciAmJiAhcmVhZHlcbiAgICAgID8gaChFcnJvclN0YXRlLCB7IGVycm9yLCBvblJldHJ5OiByZWxvYWQgfSlcbiAgICAgIDogbnVsbCxcbiAgICAhcmVhZHkgJiYgIWlzRXJyb3JcbiAgICAgID8gaChMb2FkaW5nU3RhdGUsIG51bGwpXG4gICAgICA6IG51bGwsXG4gICAgcmVhZHkgJiYgaXNFcnJvclxuICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1hbGVydC1iYW5uZXInLCByb2xlOiAnYWxlcnQnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xvYWRGYWlsZWQnLCB7IG1lc3NhZ2U6IFN0cmluZygoZXJyb3IgJiYgZXJyb3IubWVzc2FnZSkgfHwgZXJyb3IpIH0pKSxcbiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tZ2hvc3QnLCBvbkNsaWNrOiByZWxvYWQgfSwgdCgncmV0cnknKSkpXG4gICAgICA6IG51bGwsXG4gICAgcmVhZHkgJiYgIWlzRXJyb3IgJiYgaXNFbXB0eVxuICAgICAgPyBoKEVtcHR5U3RhdGUsIHsgZmlsdGVyZWQ6IG1vZGVscy5sZW5ndGggPiAwLCBvblJlc2V0OiByZXNldEZpbHRlcnMgfSlcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiAhaXNFcnJvciAmJiAhaXNFbXB0eVxuICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jb250ZW50JywgJ2RhdGEtYnVzeSc6IGJ1c3kgPyAndHJ1ZScgOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICBoKFN1bW1hcnlDYXJkcywge1xuICAgICAgICAgICAgdG90YWw6IGRhdGEudG90YWwsXG4gICAgICAgICAgICBjdXJyZW5jeTogY3VycmVuY3lTeW1ib2wsXG4gICAgICAgICAgICB1bnByaWNlZENhbGxzOiBkYXRhLnVucHJpY2VkQ2FsbHMgfHwgMCxcbiAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogZGlzcGxheUN1cnJlbmN5LFxuICAgICAgICAgICAgb25DdXJyZW5jeUNoYW5nZTogY2hhbmdlQ3VycmVuY3ksXG4gICAgICAgICAgICBieU1vZGVsOiBkYXRhLmJ5TW9kZWwsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaChEYWlseUNoYXJ0LCB7XG4gICAgICAgICAgICBkYWlseTogZGF0YS5kYWlseSxcbiAgICAgICAgICAgIGdyYW46IGVmZkdyYW4sXG4gICAgICAgICAgICBzdGVwRGF5cyxcbiAgICAgICAgICAgIGdyYW5MYWJlbCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBoKEhlYXRtYXBDYXJkLCB7IGRheXM6IGRhdGEuaGVhdG1hcCB8fCBbXSB9KSxcbiAgICAgICAgICBoKE1vZGVsVGFibGUsIHsgcm93czogZGF0YS5ieU1vZGVsLCBjdXJyZW5jeTogY3VycmVuY3lTeW1ib2wgfSkpXG4gICAgICA6IG51bGwpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOiuvue9rumhteWvvOiIquWbvuagh1xuICpcbiAqIGBzZXR0aW5ncy5zZWN0aW9uYCDlj6rmipXlvbEgaWQvb3JkZXIvbGFiZWzvvIzlr7zoiKrlm77moIfnlLHorr7nva7pobXmjIkgaWQg55m95ZCN5Y2V6Ieq5bexXG4gKiDlhrPlrprvvIhkc2gtY2xpZW50LXVpLXNldHRpbmdzLWdlbmVyYWwg55qEIG5hdkljb27vvInvvIznrKzkuInmlrnmsqHmnInmj5Llj6PjgILmiYDku6Xov5nph4xcbiAqIOe7meOAjOiHquW3semCo+S4gOihjOOAjeaJk+S4gOS4quWxnuaAp+agh+iusO+8jOWGjeeUqCBDU1MgbWFzayDmiorlhZzlupXnmoTpvb/ova7mjaLmiJDnlKjph4/lm77moIfvvJpcbiAqIOS4jeabv+aNouiKgueCueOAgeS4jeeisCBSZWFjdCDnrqHnmoQgc3Zn77yI5pu/5o2i5Lya6K6pIFJlYWN0IOWNuOi9veaXtuaKmyBOb3RGb3VuZEVycm9y77yJ77yMXG4gKiDlj6rliqDlsZ7mgKfjgIHlj6rnlKggOjpiZWZvcmUg55S75a2X5b2i44CCXG4gKlxuICog6K6k6KGM5Y+q6IO95oyJ5Y+v6KeB5paH5pys77ya57G75ZCN5pivIENTUyBNb2R1bGVzIOWTiOW4jO+8jOi0puWPt+ihjOi/mOS8muadoeS7tuWHuueOsOOAglxuICog5a6Y5pa55LiA5pem57uZIHNldHRpbmdzLnNlY3Rpb24g5Yqg5LiKIGljb24g5a2X5q6177yM6L+Z5Liq5qih5Z2X5bqU5pW05L2T5Yig6Zmk44CCXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBOQVZfSUNPTl9NQVNLID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQoXG4gICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+J1xuICArICc8cmVjdCB4PVwiMi41XCIgeT1cIjlcIiB3aWR0aD1cIjIuNVwiIGhlaWdodD1cIjVcIiByeD1cIjFcIi8+J1xuICArICc8cmVjdCB4PVwiNi43NVwiIHk9XCI1LjVcIiB3aWR0aD1cIjIuNVwiIGhlaWdodD1cIjguNVwiIHJ4PVwiMVwiLz4nXG4gICsgJzxyZWN0IHg9XCIxMVwiIHk9XCIyLjVcIiB3aWR0aD1cIjIuNVwiIGhlaWdodD1cIjExLjVcIiByeD1cIjFcIi8+PC9zdmc+Jyxcbilcbi8vIG1hc2sg5Y+q6K+7IGFscGhhIOmAmumBk++8jOaJgOS7peWtl+W9ouW/hemhu+aYr+e6r+iJsuWunuW/g++8iGljb24uc3ZnIOeahOa4kOWPmOS4juWNiumAj+aYjuWcqOi/memHjOS8muS4ou+8iVxuY29uc3QgTkFWX0lDT05fQ1NTID0gW1xuICAnW2RhdGEtdHNkLW5hdl0gPiBzdmcgeyBkaXNwbGF5OiBub25lOyB9JyxcbiAgJ1tkYXRhLXRzZC1uYXZdOjpiZWZvcmUgeycsXG4gIFwiICBjb250ZW50OiAnJztcIixcbiAgJyAgZmxleDogbm9uZTsnLFxuICAnICB3aWR0aDogMTZweDsnLFxuICAnICBoZWlnaHQ6IDE2cHg7JyxcbiAgJyAgYmFja2dyb3VuZDogY3VycmVudENvbG9yOycsXG4gICcgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKFwiJyArIE5BVl9JQ09OX01BU0sgKyAnXCIpOycsXG4gICcgIG1hc2staW1hZ2U6IHVybChcIicgKyBOQVZfSUNPTl9NQVNLICsgJ1wiKTsnLFxuICAnICAtd2Via2l0LW1hc2stc2l6ZTogMTZweCAxNnB4OycsXG4gICcgIG1hc2stc2l6ZTogMTZweCAxNnB4OycsXG4gICcgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDsnLFxuICAnICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0OycsXG4gICd9Jyxcbl0uam9pbignXFxuJylcblxuLyoqIOiupOS4jeWHuuihjOOAgeaLv+S4jeWIsCBET03vvIzpg73lj6rmmK/pgIDljJbmiJDpvb/ova7vvIznu53kuI3mipvlh7rjgILov5Tlm54gZGlzcG9zZXLjgIIgKi9cbmZ1bmN0aW9uIGluc3RhbGxTZXR0aW5nc05hdkljb24obGFiZWwpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiBudWxsXG4gIGxldCBzdHlsZUVsID0gbnVsbFxuICB0cnkge1xuICAgIHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgc3R5bGVFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1Z2luJywgJ2RzaC1wbHVnaW4tdXNhZ2UnKVxuICAgIHN0eWxlRWwudGV4dENvbnRlbnQgPSBOQVZfSUNPTl9DU1NcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWwpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1t1c2FnZV0gc2V0dGluZ3MgbmF2IGljb246IHN0eWxlcyB1bmF2YWlsYWJsZScpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBtYXJrID0gKCkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cImRpYWxvZ1wiXSBidXR0b24nKVxuICAgIGNvbnN0IHdhbnQgPSBsYWJlbCgpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldXG4gICAgICBpZiAocm93LmdldEF0dHJpYnV0ZSgnZGF0YS10c2QtbmF2JykgIT09IG51bGwpIGNvbnRpbnVlXG4gICAgICBpZiAoIXJvdy5xdWVyeVNlbGVjdG9yKCdzdmcnKSkgY29udGludWUgLy8g5Y+q5qCH5bim5Zu+5qCH55qE5a+86Iiq6KGM77yM5Yir6K+v5qCH5pmu6YCa5oyJ6ZKuXG4gICAgICBpZiAoKHJvdy50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpICE9PSB3YW50KSBjb250aW51ZVxuICAgICAgcm93LnNldEF0dHJpYnV0ZSgnZGF0YS10c2QtbmF2JywgJycpXG4gICAgfVxuICB9XG4gIGxldCBvYnNlcnZlciA9IG51bGxcbiAgdHJ5IHtcbiAgICBtYXJrKClcbiAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsgdHJ5IHsgbWFyaygpIH0gY2F0Y2ggKGUpIHt9IH0pXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdbdXNhZ2VdIHNldHRpbmdzIG5hdiBpY29uOiBvYnNlcnZlciB1bmF2YWlsYWJsZScsIGUpXG4gIH1cbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAob2JzZXJ2ZXIpIG9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIGlmIChzdHlsZUVsKSBzdHlsZUVsLnJlbW92ZSgpXG4gICAgY29uc3QgbWFya2VkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdHNkLW5hdl0nKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2VkLmxlbmd0aDsgaSsrKSBtYXJrZWRbaV0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRzZC1uYXYnKVxuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5rOo5YaM77yac2V0dGluZ3Muc2VjdGlvbiDpobXpnaJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIGFwcGx5KGN0eCkge1xuICB1c2FnZUN0eCA9IGN0eFxuICBfdXNhZ2VQcmljZXNTY29wZSA9IG51bGwgLy8g5q+P5qyh5r+A5rS76YeN57uR77yM6YG/5YWN5aSN55So5bey6YeK5pS+55qEIHNjb3BlXG4gIGN0eC5lZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc3R5bGVzICE9PSAndW5kZWZpbmVkJyAmJiBzdHlsZXMgJiYgdHlwZW9mIHN0eWxlcy5pbnNlcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzdHlsZXMuaW5zZXJ0KENTUylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXBsdWdpbicsICdkc2gtcGx1Z2luLXVzYWdlJylcbiAgICAgIGVsLnRleHRDb250ZW50ID0gQ1NTXG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGVsKVxuICAgICAgcmV0dXJuICgpID0+IHsgZWwucmVtb3ZlKCkgfVxuICAgIH1cbiAgfSwgJ3VzYWdlOiBzdHlsZXMnKVxuICBjdHguZWZmZWN0KCgpID0+IGN0eC5sb2NhbGUucmVnaXN0ZXIoTlMsIHsgemg6IFpILCBlbjogRU4gfSksICd1c2FnZTogZGljdGlvbmFyaWVzJylcbiAgY29uc3QgdDAgPSBjdHgubG9jYWxlID8gY3R4LmxvY2FsZS5iaW5kKE5TKSA6IGZhbGxiYWNrVFxuICBjdHguZWZmZWN0KCgpID0+IGluc3RhbGxTZXR0aW5nc05hdkljb24oKCkgPT4gdDAoJ25hdicpKSwgJ3VzYWdlOiBuYXYtaWNvbicpXG4gIC8vIGNvcmRpcyBjdHggaXMgYSBzdHJpY3QgcHJveHk6IERJUkVDVCBwcm9wZXJ0eSBhY2Nlc3Mgb24gYW4gdW4taW5qZWN0ZWRcbiAgLy8gc2VydmljZSB0aHJvd3MgKFwiY2Fubm90IGdldCBwcm9wZXJ0eSBYIHdpdGhvdXQgaW5qZWN0XCIpLCBzbyBhIGJhcmVcbiAgLy8gYGN0eC5zbG90cyA/PyAuLi5gIHdvdWxkIHRocm93IGFuZCBza2lwIHRoZSBmYWxsYmFjay4gUHJvYmUgdmlhIHRoZSBzYWZlXG4gIC8vIGN0eC5nZXQoKSBmaXJzdDsgZmFsbCBiYWNrIHRvIHRoZSBpbmplY3RlZCBwcm9wZXJ0eSAoYXZhaWxhYmxlIG9uY2VcbiAgLy8gJ3Nsb3RzJyBpcyBkZWNsYXJlZCBpbiB0aGUgaW5qZWN0IGxpc3QgYmVsb3cpLlxuICBsZXQgc2xvdHMgPSBudWxsXG4gIHRyeSB7XG4gICAgc2xvdHMgPSB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJyA/IGN0eC5nZXQoJ3Nsb3RzJykgOiBudWxsXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzbG90cyA9IG51bGxcbiAgfVxuICBpZiAoIXNsb3RzIHx8IHR5cGVvZiBzbG90cy5pbmplY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGN0eC5zbG90cyAmJiB0eXBlb2YgY3R4LnNsb3RzLmluamVjdCA9PT0gJ2Z1bmN0aW9uJykgc2xvdHMgPSBjdHguc2xvdHNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzbG90cyA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKCFzbG90cyB8fCB0eXBlb2Ygc2xvdHMuaW5qZWN0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBzbG90cy5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUud2FybignW3VzYWdlXSBzZXR0aW5ncy5zZWN0aW9uIHNsb3QgdW5hdmFpbGFibGUnKVxuICAgIHJldHVyblxuICB9XG4gIHNsb3RzLmluamVjdCgnc2V0dGluZ3Muc2VjdGlvbicsICgpID0+IHNsb3RzLnJlZ2lzdGVyKFxuICAgIHsgbmFtZTogJ3NldHRpbmdzLnNlY3Rpb24nLCBpZDogJ3Rva2VuLXN0YXRzJywgb3JkZXI6IDIwLCBsYWJlbDogKCkgPT4gdDAoJ25hdicpLCBsb2NhbGU6IE5TIH0sXG4gICAgKHByb3BzKSA9PiBoKFN0YXRzRGFzaGJvYXJkLCBwcm9wcyksXG4gICkpXG59XG5cbnJldHVybiB7IGluamVjdDogWydsb2NhbGUnLCAnc2xvdHMnXSwgYXBwbHkgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==