wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { delegateEvents as _$delegateEvents } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { memo as _$memo } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { addEventListener as _$addEventListener } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { setAttribute as _$setAttribute } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { effect as _$effect } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { className as _$className } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
const _tmpl$ = /*#__PURE__*/_$template(`<span>`),
  _tmpl$2 = /*#__PURE__*/_$template(`<div class="flex h-full flex-col gap-2"><div class="join w-full"><input type=search class="input join-item input-primary input-sm flex-1 flex-shrink-0 sm:input-md"></div><div class="overflow-x-auto whitespace-nowrap rounded-md bg-base-300"><table><thead class="sticky top-0 z-10"></thead><tbody>`),
  _tmpl$3 = /*#__PURE__*/_$template(`<tr>`),
  _tmpl$4 = /*#__PURE__*/_$template(`<th class=bg-base-200><div class="flex items-center"><div>`),
  _tmpl$5 = /*#__PURE__*/_$template(`<tr class="hover:!bg-primary hover:text-primary-content">`),
  _tmpl$6 = /*#__PURE__*/_$template(`<td class=py-2>`);
import { makePersisted } from "/node_modules/.vite/deps/@solid-primitives_storage.js?v=6c3abd28";
import { IconSettings, IconSortAscending, IconSortDescending } from "/node_modules/.vite/deps/@tabler_icons-solidjs.js?v=000c47cd";
import { rankItem } from "/node_modules/.vite/deps/@tanstack_match-sorter-utils.js?v=406d8158";
import { createSolidTable, flexRender, getCoreRowModel, getFilteredRowModel, getSortedRowModel } from "/node_modules/@tanstack/solid-table/build/lib/index.mjs?v=d99f92c7";
import { For, Index, createEffect, createSignal } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { twMerge } from "/node_modules/.vite/deps/tailwind-merge.js?v=d1b42b68";
import { Button, LogsSettingsModal } from "/src/components/index.ts";
import { LOG_LEVEL } from "/src/constants/index.ts";
import { useI18n } from "/src/i18n/index.tsx";
import { logsTableSize, tableSizeClassName, useWsRequest } from "/src/signals/index.ts";
import { logLevel, logMaxRows } from "/src/signals/config.ts";
const fuzzyFilter = (row, columnId, value, addMeta) => {
  // Rank the item
  const itemRank = rankItem(row.getValue(columnId), value);
 
  // Store the itemRank info
  addMeta({
    itemRank
  });
 
  // Return if the item should be filtered in/out
  return itemRank.passed;
};
export default (() => {
  let logsSettingsModalRef;
  const [t] = useI18n();
  let seq = 1;
  const [logs, setLogs] = createSignal([]);
  const logsData = useWsRequest('logs', {
    level: logLevel()
  });
  createEffect(() => {
    const data = logsData();
    if (!data) {
      return;
    }
    setLogs(logs => [{
      ...data,
      seq
    }, ...logs].slice(0, logMaxRows()));
    seq++;
  });
  const [globalFilter, setGlobalFilter] = createSignal('');
  const [sorting, setSorting] = makePersisted(createSignal([]), {
    name: 'logsTableSorting',
    storage: localStorage
  });
  const columns = [{
    header: t('sequence'),
    accessorFn: row => row.seq
  }, {
    header: t('type'),
    accessorFn: row => row.type,
    cell: ({
      row
    }) => {
      const type = row.original.type;
      let className = '';
      switch (type) {
        case LOG_LEVEL.Error:
          className = 'text-error';
          break;
        case LOG_LEVEL.Warning:
          className = 'text-warning';
          break;
        case LOG_LEVEL.Info:
          className = 'text-info';
          break;
        case LOG_LEVEL.Debug:
          className = 'text-success';
          break;
      }
      return (() => {
        const _el$ = _tmpl$();
        _$className(_el$, className);
        _$insert(_el$, () => `[${row.original.type}]`);
        return _el$;
      })();
    }
  }, {
    header: t('payload'),
    accessorFn: row => row.payload
  }];
  const table = createSolidTable({
    filterFns: {
      fuzzy: fuzzyFilter
    },
    state: {
      get globalFilter() {
        return globalFilter();
      },
      get sorting() {
        return sorting();
      }
    },
    get data() {
      return logs();
    },
    sortDescFirst: true,
    columns,
    onGlobalFilterChange: setGlobalFilter,
    onSortingChange: setSorting,
    globalFilterFn: fuzzyFilter,
    getFilteredRowModel: getFilteredRowModel(),
    getSortedRowModel: getSortedRowModel(),
    getCoreRowModel: getCoreRowModel()
  });
  return (() => {
    const _el$2 = _tmpl$2(),
      _el$3 = _el$2.firstChild,
      _el$4 = _el$3.firstChild,
      _el$5 = _el$3.nextSibling,
      _el$6 = _el$5.firstChild,
      _el$7 = _el$6.firstChild,
      _el$8 = _el$7.nextSibling;
    _el$4.$$input = e => setGlobalFilter(e.target.value);
    _$insert(_el$3, _$createComponent(Button, {
      "class": "join-item btn-sm sm:btn-md",
      onClick: () => logsSettingsModalRef?.showModal(),
      get icon() {
        return _$createComponent(IconSettings, {});
      }
    }), null);
    _$insert(_el$7, _$createComponent(Index, {
      get each() {
        return table.getHeaderGroups();
      },
      children: keyedHeaderGroup => {
        const headerGroup = keyedHeaderGroup();
        return (() => {
          const _el$9 = _tmpl$3();
          _$insert(_el$9, _$createComponent(Index, {
            get each() {
              return headerGroup.headers;
            },
            children: keyedHeader => {
              const header = keyedHeader();
              return (() => {
                const _el$10 = _tmpl$4(),
                  _el$11 = _el$10.firstChild,
                  _el$12 = _el$11.firstChild;
                _$addEventListener(_el$12, "click", header.column.getToggleSortingHandler(), true);
                _$insert(_el$12, () => flexRender(header.column.columnDef.header, header.getContext()));
                _$insert(_el$11, () => ({
                  asc: _$createComponent(IconSortAscending, {}),
                  desc: _$createComponent(IconSortDescending, {})
                })[header.column.getIsSorted()] ?? null, null);
                _$effect(() => _$className(_el$12, twMerge(header.column.getCanSort() && 'cursor-pointer select-none', 'flex-1')));
                return _el$10;
              })();
            }
          }));
          return _el$9;
        })();
      }
    }));
    _$insert(_el$8, _$createComponent(For, {
      get each() {
        return table.getRowModel().rows;
      },
      children: row => (() => {
        const _el$13 = _tmpl$5();
        _$insert(_el$13, _$createComponent(For, {
          get each() {
            return row.getVisibleCells();
          },
          children: cell => (() => {
            const _el$14 = _tmpl$6();
            _$insert(_el$14, () => flexRender(cell.column.columnDef.cell, cell.getContext()));
            return _el$14;
          })()
        }));
        return _el$13;
      })()
    }));
    _$insert(_el$2, _$createComponent(LogsSettingsModal, {
      ref: el => logsSettingsModalRef = el
    }), null);
    _$effect(_p$ => {
      const _v$ = t('search'),
        _v$2 = twMerge(tableSizeClassName(logsTableSize()), 'table relative rounded-none');
      _v$ !== _p$._v$ && _$setAttribute(_el$4, "placeholder", _p$._v$ = _v$);
      _v$2 !== _p$._v$2 && _$className(_el$6, _p$._v$2 = _v$2);
      return _p$;
    }, {
      _v$: undefined,
      _v$2: undefined
    });
    return _el$2;
  })();
});
_$delegateEvents(["input", "click"]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWtlUGVyc2lzdGVkIiwiSWNvblNldHRpbmdzIiwiSWNvblNvcnRBc2NlbmRpbmciLCJJY29uU29ydERlc2NlbmRpbmciLCJyYW5rSXRlbSIsImNyZWF0ZVNvbGlkVGFibGUiLCJmbGV4UmVuZGVyIiwiZ2V0Q29yZVJvd01vZGVsIiwiZ2V0RmlsdGVyZWRSb3dNb2RlbCIsImdldFNvcnRlZFJvd01vZGVsIiwiRm9yIiwiSW5kZXgiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVTaWduYWwiLCJ0d01lcmdlIiwiQnV0dG9uIiwiTG9nc1NldHRpbmdzTW9kYWwiLCJMT0dfTEVWRUwiLCJ1c2VJMThuIiwibG9nc1RhYmxlU2l6ZSIsInRhYmxlU2l6ZUNsYXNzTmFtZSIsInVzZVdzUmVxdWVzdCIsImxvZ0xldmVsIiwibG9nTWF4Um93cyIsImZ1enp5RmlsdGVyIiwicm93IiwiY29sdW1uSWQiLCJ2YWx1ZSIsImFkZE1ldGEiLCJpdGVtUmFuayIsImdldFZhbHVlIiwicGFzc2VkIiwibG9nc1NldHRpbmdzTW9kYWxSZWYiLCJ0Iiwic2VxIiwibG9ncyIsInNldExvZ3MiLCJsb2dzRGF0YSIsImxldmVsIiwiZGF0YSIsInNsaWNlIiwiZ2xvYmFsRmlsdGVyIiwic2V0R2xvYmFsRmlsdGVyIiwic29ydGluZyIsInNldFNvcnRpbmciLCJuYW1lIiwic3RvcmFnZSIsImxvY2FsU3RvcmFnZSIsImNvbHVtbnMiLCJoZWFkZXIiLCJhY2Nlc3NvckZuIiwidHlwZSIsImNlbGwiLCJvcmlnaW5hbCIsImNsYXNzTmFtZSIsIkVycm9yIiwiV2FybmluZyIsIkluZm8iLCJEZWJ1ZyIsIl9lbCQiLCJfdG1wbCQiLCJfJGNsYXNzTmFtZSIsIl8kaW5zZXJ0IiwicGF5bG9hZCIsInRhYmxlIiwiZmlsdGVyRm5zIiwiZnV6enkiLCJzdGF0ZSIsInNvcnREZXNjRmlyc3QiLCJvbkdsb2JhbEZpbHRlckNoYW5nZSIsIm9uU29ydGluZ0NoYW5nZSIsImdsb2JhbEZpbHRlckZuIiwiX2VsJDIiLCJfdG1wbCQyIiwiX2VsJDMiLCJmaXJzdENoaWxkIiwiX2VsJDQiLCJfZWwkNSIsIm5leHRTaWJsaW5nIiwiX2VsJDYiLCJfZWwkNyIsIl9lbCQ4IiwiJCRpbnB1dCIsImUiLCJ0YXJnZXQiLCJfJGNyZWF0ZUNvbXBvbmVudCIsIm9uQ2xpY2siLCJzaG93TW9kYWwiLCJpY29uIiwiZWFjaCIsImdldEhlYWRlckdyb3VwcyIsImNoaWxkcmVuIiwia2V5ZWRIZWFkZXJHcm91cCIsImhlYWRlckdyb3VwIiwiX2VsJDkiLCJfdG1wbCQzIiwiaGVhZGVycyIsImtleWVkSGVhZGVyIiwiX2VsJDEwIiwiX3RtcGwkNCIsIl9lbCQxMSIsIl9lbCQxMiIsIl8kYWRkRXZlbnRMaXN0ZW5lciIsImNvbHVtbiIsImdldFRvZ2dsZVNvcnRpbmdIYW5kbGVyIiwiY29sdW1uRGVmIiwiZ2V0Q29udGV4dCIsImFzYyIsImRlc2MiLCJnZXRJc1NvcnRlZCIsIl8kZWZmZWN0IiwiZ2V0Q2FuU29ydCIsImdldFJvd01vZGVsIiwicm93cyIsIl9lbCQxMyIsIl90bXBsJDUiLCJnZXRWaXNpYmxlQ2VsbHMiLCJfZWwkMTQiLCJfdG1wbCQ2IiwicmVmIiwiZWwiLCJfcCQiLCJfdiQiLCJfdiQyIiwiXyRzZXRBdHRyaWJ1dGUiLCJ1bmRlZmluZWQiLCJfJGRlbGVnYXRlRXZlbnRzIl0sInNvdXJjZXMiOlsiTG9ncy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZVBlcnNpc3RlZCB9IGZyb20gJ0Bzb2xpZC1wcmltaXRpdmVzL3N0b3JhZ2UnXHJcbmltcG9ydCB7XHJcbiAgSWNvblNldHRpbmdzLFxyXG4gIEljb25Tb3J0QXNjZW5kaW5nLFxyXG4gIEljb25Tb3J0RGVzY2VuZGluZyxcclxufSBmcm9tICdAdGFibGVyL2ljb25zLXNvbGlkanMnXHJcbmltcG9ydCB7IHJhbmtJdGVtIH0gZnJvbSAnQHRhbnN0YWNrL21hdGNoLXNvcnRlci11dGlscydcclxuaW1wb3J0IHtcclxuICBDb2x1bW5EZWYsXHJcbiAgRmlsdGVyRm4sXHJcbiAgU29ydGluZ1N0YXRlLFxyXG4gIGNyZWF0ZVNvbGlkVGFibGUsXHJcbiAgZmxleFJlbmRlcixcclxuICBnZXRDb3JlUm93TW9kZWwsXHJcbiAgZ2V0RmlsdGVyZWRSb3dNb2RlbCxcclxuICBnZXRTb3J0ZWRSb3dNb2RlbCxcclxufSBmcm9tICdAdGFuc3RhY2svc29saWQtdGFibGUnXHJcbmltcG9ydCB7IEZvciwgSW5kZXgsIGNyZWF0ZUVmZmVjdCwgY3JlYXRlU2lnbmFsIH0gZnJvbSAnc29saWQtanMnXHJcbmltcG9ydCB7IHR3TWVyZ2UgfSBmcm9tICd0YWlsd2luZC1tZXJnZSdcclxuaW1wb3J0IHsgQnV0dG9uLCBMb2dzU2V0dGluZ3NNb2RhbCB9IGZyb20gJ34vY29tcG9uZW50cydcclxuaW1wb3J0IHsgTE9HX0xFVkVMIH0gZnJvbSAnfi9jb25zdGFudHMnXHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tICd+L2kxOG4nXHJcbmltcG9ydCB7IGxvZ3NUYWJsZVNpemUsIHRhYmxlU2l6ZUNsYXNzTmFtZSwgdXNlV3NSZXF1ZXN0IH0gZnJvbSAnfi9zaWduYWxzJ1xyXG5pbXBvcnQgeyBsb2dMZXZlbCwgbG9nTWF4Um93cyB9IGZyb20gJ34vc2lnbmFscy9jb25maWcnXHJcbmltcG9ydCB7IExvZyB9IGZyb20gJ34vdHlwZXMnXHJcblxyXG50eXBlIExvZ1dpdGhTZXEgPSBMb2cgJiB7IHNlcTogbnVtYmVyIH1cclxuXHJcbmNvbnN0IGZ1enp5RmlsdGVyOiBGaWx0ZXJGbjxMb2dXaXRoU2VxPiA9IChyb3csIGNvbHVtbklkLCB2YWx1ZSwgYWRkTWV0YSkgPT4ge1xyXG4gIC8vIFJhbmsgdGhlIGl0ZW1cclxuICBjb25zdCBpdGVtUmFuayA9IHJhbmtJdGVtKHJvdy5nZXRWYWx1ZShjb2x1bW5JZCksIHZhbHVlKVxyXG5cclxuICAvLyBTdG9yZSB0aGUgaXRlbVJhbmsgaW5mb1xyXG4gIGFkZE1ldGEoe1xyXG4gICAgaXRlbVJhbmssXHJcbiAgfSlcclxuXHJcbiAgLy8gUmV0dXJuIGlmIHRoZSBpdGVtIHNob3VsZCBiZSBmaWx0ZXJlZCBpbi9vdXRcclxuICByZXR1cm4gaXRlbVJhbmsucGFzc2VkXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcclxuICBsZXQgbG9nc1NldHRpbmdzTW9kYWxSZWY6IEhUTUxEaWFsb2dFbGVtZW50IHwgdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IFt0XSA9IHVzZUkxOG4oKVxyXG5cclxuICBsZXQgc2VxID0gMVxyXG4gIGNvbnN0IFtsb2dzLCBzZXRMb2dzXSA9IGNyZWF0ZVNpZ25hbDxMb2dXaXRoU2VxW10+KFtdKVxyXG5cclxuICBjb25zdCBsb2dzRGF0YSA9IHVzZVdzUmVxdWVzdDxMb2c+KCdsb2dzJywgeyBsZXZlbDogbG9nTGV2ZWwoKSB9KVxyXG5cclxuICBjcmVhdGVFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9IGxvZ3NEYXRhKClcclxuXHJcbiAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TG9ncygobG9ncykgPT4gW3sgLi4uZGF0YSwgc2VxIH0sIC4uLmxvZ3NdLnNsaWNlKDAsIGxvZ01heFJvd3MoKSkpXHJcblxyXG4gICAgc2VxKytcclxuICB9KVxyXG5cclxuICBjb25zdCBbZ2xvYmFsRmlsdGVyLCBzZXRHbG9iYWxGaWx0ZXJdID0gY3JlYXRlU2lnbmFsKCcnKVxyXG5cclxuICBjb25zdCBbc29ydGluZywgc2V0U29ydGluZ10gPSBtYWtlUGVyc2lzdGVkKGNyZWF0ZVNpZ25hbDxTb3J0aW5nU3RhdGU+KFtdKSwge1xyXG4gICAgbmFtZTogJ2xvZ3NUYWJsZVNvcnRpbmcnLFxyXG4gICAgc3RvcmFnZTogbG9jYWxTdG9yYWdlLFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IGNvbHVtbnM6IENvbHVtbkRlZjxMb2dXaXRoU2VxPltdID0gW1xyXG4gICAge1xyXG4gICAgICBoZWFkZXI6IHQoJ3NlcXVlbmNlJyksXHJcbiAgICAgIGFjY2Vzc29yRm46IChyb3cpID0+IHJvdy5zZXEsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBoZWFkZXI6IHQoJ3R5cGUnKSxcclxuICAgICAgYWNjZXNzb3JGbjogKHJvdykgPT4gcm93LnR5cGUsXHJcbiAgICAgIGNlbGw6ICh7IHJvdyB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHJvdy5vcmlnaW5hbC50eXBlIGFzIExPR19MRVZFTFxyXG5cclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gJydcclxuXHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIExPR19MRVZFTC5FcnJvcjpcclxuICAgICAgICAgICAgY2xhc3NOYW1lID0gJ3RleHQtZXJyb3InXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIExPR19MRVZFTC5XYXJuaW5nOlxyXG4gICAgICAgICAgICBjbGFzc05hbWUgPSAndGV4dC13YXJuaW5nJ1xyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSBMT0dfTEVWRUwuSW5mbzpcclxuICAgICAgICAgICAgY2xhc3NOYW1lID0gJ3RleHQtaW5mbydcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgTE9HX0xFVkVMLkRlYnVnOlxyXG4gICAgICAgICAgICBjbGFzc05hbWUgPSAndGV4dC1zdWNjZXNzJ1xyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDxzcGFuIGNsYXNzPXtjbGFzc05hbWV9PntgWyR7cm93Lm9yaWdpbmFsLnR5cGV9XWB9PC9zcGFuPlxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgaGVhZGVyOiB0KCdwYXlsb2FkJyksXHJcbiAgICAgIGFjY2Vzc29yRm46IChyb3cpID0+IHJvdy5wYXlsb2FkLFxyXG4gICAgfSxcclxuICBdXHJcblxyXG4gIGNvbnN0IHRhYmxlID0gY3JlYXRlU29saWRUYWJsZSh7XHJcbiAgICBmaWx0ZXJGbnM6IHtcclxuICAgICAgZnV6enk6IGZ1enp5RmlsdGVyLFxyXG4gICAgfSxcclxuICAgIHN0YXRlOiB7XHJcbiAgICAgIGdldCBnbG9iYWxGaWx0ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbEZpbHRlcigpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBzb3J0aW5nKCkge1xyXG4gICAgICAgIHJldHVybiBzb3J0aW5nKClcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBnZXQgZGF0YSgpIHtcclxuICAgICAgcmV0dXJuIGxvZ3MoKVxyXG4gICAgfSxcclxuICAgIHNvcnREZXNjRmlyc3Q6IHRydWUsXHJcbiAgICBjb2x1bW5zLFxyXG4gICAgb25HbG9iYWxGaWx0ZXJDaGFuZ2U6IHNldEdsb2JhbEZpbHRlcixcclxuICAgIG9uU29ydGluZ0NoYW5nZTogc2V0U29ydGluZyxcclxuICAgIGdsb2JhbEZpbHRlckZuOiBmdXp6eUZpbHRlcixcclxuICAgIGdldEZpbHRlcmVkUm93TW9kZWw6IGdldEZpbHRlcmVkUm93TW9kZWwoKSxcclxuICAgIGdldFNvcnRlZFJvd01vZGVsOiBnZXRTb3J0ZWRSb3dNb2RlbCgpLFxyXG4gICAgZ2V0Q29yZVJvd01vZGVsOiBnZXRDb3JlUm93TW9kZWwoKSxcclxuICB9KVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJqb2luIHctZnVsbFwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cInNlYXJjaFwiXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGpvaW4taXRlbSBpbnB1dC1wcmltYXJ5IGlucHV0LXNtIGZsZXgtMSBmbGV4LXNocmluay0wIHNtOmlucHV0LW1kXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPXt0KCdzZWFyY2gnKX1cclxuICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiBzZXRHbG9iYWxGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDxCdXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiam9pbi1pdGVtIGJ0bi1zbSBzbTpidG4tbWRcIlxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gbG9nc1NldHRpbmdzTW9kYWxSZWY/LnNob3dNb2RhbCgpfVxyXG4gICAgICAgICAgaWNvbj17PEljb25TZXR0aW5ncyAvPn1cclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvdmVyZmxvdy14LWF1dG8gd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC1tZCBiZy1iYXNlLTMwMFwiPlxyXG4gICAgICAgIDx0YWJsZVxyXG4gICAgICAgICAgY2xhc3M9e3R3TWVyZ2UoXHJcbiAgICAgICAgICAgIHRhYmxlU2l6ZUNsYXNzTmFtZShsb2dzVGFibGVTaXplKCkpLFxyXG4gICAgICAgICAgICAndGFibGUgcmVsYXRpdmUgcm91bmRlZC1ub25lJyxcclxuICAgICAgICAgICl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRoZWFkIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTBcIj5cclxuICAgICAgICAgICAgPEluZGV4IGVhY2g9e3RhYmxlLmdldEhlYWRlckdyb3VwcygpfT5cclxuICAgICAgICAgICAgICB7KGtleWVkSGVhZGVyR3JvdXApID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckdyb3VwID0ga2V5ZWRIZWFkZXJHcm91cCgpXHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxJbmRleCBlYWNoPXtoZWFkZXJHcm91cC5oZWFkZXJzfT5cclxuICAgICAgICAgICAgICAgICAgICAgIHsoa2V5ZWRIZWFkZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0ga2V5ZWRIZWFkZXIoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJiZy1iYXNlLTIwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5jb2x1bW4uZ2V0Q2FuU29ydCgpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3ItcG9pbnRlciBzZWxlY3Qtbm9uZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmxleC0xJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hlYWRlci5jb2x1bW4uZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXIoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmbGV4UmVuZGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmNvbHVtbi5jb2x1bW5EZWYuaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmdldENvbnRleHQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjOiA8SWNvblNvcnRBc2NlbmRpbmcgLz4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogPEljb25Tb3J0RGVzY2VuZGluZyAvPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVtoZWFkZXIuY29sdW1uLmdldElzU29ydGVkKCkgYXMgc3RyaW5nXSA/PyBudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L0luZGV4PlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIDwvSW5kZXg+XHJcbiAgICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPEZvciBlYWNoPXt0YWJsZS5nZXRSb3dNb2RlbCgpLnJvd3N9PlxyXG4gICAgICAgICAgICAgIHsocm93KSA9PiAoXHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJob3ZlcjohYmctcHJpbWFyeSBob3Zlcjp0ZXh0LXByaW1hcnktY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICA8Rm9yIGVhY2g9e3Jvdy5nZXRWaXNpYmxlQ2VsbHMoKX0+XHJcbiAgICAgICAgICAgICAgICAgICAgeyhjZWxsKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtmbGV4UmVuZGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuY29sdW1uLmNvbHVtbkRlZi5jZWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuZ2V0Q29udGV4dCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8L0Zvcj5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPC9Gb3I+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPExvZ3NTZXR0aW5nc01vZGFsIHJlZj17KGVsKSA9PiAobG9nc1NldHRpbmdzTW9kYWxSZWYgPSBlbCl9IC8+XHJcbiAgICA8L2Rpdj5cclxuICApXHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxhQUFhLFFBQVEsMkJBQTJCO0FBQ3pELFNBQ0VDLFlBQVksRUFDWkMsaUJBQWlCLEVBQ2pCQyxrQkFBa0IsUUFDYix1QkFBdUI7QUFDOUIsU0FBU0MsUUFBUSxRQUFRLDhCQUE4QjtBQUN2RCxTQUlFQyxnQkFBZ0IsRUFDaEJDLFVBQVUsRUFDVkMsZUFBZSxFQUNmQyxtQkFBbUIsRUFDbkJDLGlCQUFpQixRQUNaLHVCQUF1QjtBQUM5QixTQUFTQyxHQUFHLEVBQUVDLEtBQUssRUFBRUMsWUFBWSxFQUFFQyxZQUFZLFFBQVEsVUFBVTtBQUNqRSxTQUFTQyxPQUFPLFFBQVEsZ0JBQWdCO0FBQ3hDLFNBQVNDLE1BQU0sRUFBRUMsaUJBQWlCLFFBQVEsY0FBYztBQUN4RCxTQUFTQyxTQUFTLFFBQVEsYUFBYTtBQUN2QyxTQUFTQyxPQUFPLFFBQVEsUUFBUTtBQUNoQyxTQUFTQyxhQUFhLEVBQUVDLGtCQUFrQixFQUFFQyxZQUFZLFFBQVEsV0FBVztBQUMzRSxTQUFT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