PageSourceSearch

https://search.sharesamadhan.com/src/features/admin/pages/SupportPartnerTickets.tsx

js sharesamadhan.com collected 2026-10-04 05:55:51 UTC 51,253 bytes, 301 lines download raw bytes

1import __vite__cjsImport0_react_jsxRuntime from "/node_modules/.vite/deps/react_jsx-runtime.js?v=f660f992"; const jsx = __vite__cjsImport0_react_jsxRuntime["jsx"]; const jsxs = __vite__cjsImport0_react_jsxRuntime["jsxs"];
2import __vite__cjsImport1_react from "/node_modules/.vite/deps/react.js?v=f660f992"; const React = __vite__cjsImport1_react.__esModule ? __vite__cjsImport1_react.default : __vite__cjsImport1_react; const useEffect = __vite__cjsImport1_react["useEffect"]; const useState = __vite__cjsImport1_react["useState"];
3import { adminService } from "/src/api/endpoints/admin.ts";
4import { handleAdminError } from "/src/utils/errorHandling.ts";
5import { useAdminAuth } from "/src/features/admin/context/AdminAuthContext.tsx";
6import { Button } from "/src/components/ui/Button.tsx";
7import { Card } from "/src/features/admin/components/Card.tsx";
8import { cn } from "/src/utils/cn.ts";
9import toast from "/node_modules/.vite/deps/react-hot-toast.js?v=f660f992";
10export const SupportPartnerTickets = () => {
11  const { isPartnerTenantAdmin } = useAdminAuth();
12  const [tickets, setTickets] = useState([]);
13  const [total, setTotal] = useState(0);
14  const [page, setPage] = useState(1);
15  const [status, setStatus] = useState("");
16  const [partnerId, setPartnerId] = useState("");
17  const [partners, setPartners] = useState([]);
18  const [loading, setLoading] = useState(true);
19  const [detail, setDetail] = useState(null);
20  const [showNew, setShowNew] = useState(false);
21  const [subject, setSubject] = useState("");
22  const [body, setBody] = useState("");
23  const [relatedUserId, setRelatedUserId] = useState("");
24  const [saving, setSaving] = useState(false);
25  const limit = 20;
26  useEffect(() => {
27    if (isPartnerTenantAdmin) return;
28    void (async () => {
29      try {
30        const list = await adminService.getPartners();
31        setPartners(list.map((p) => ({ id: p.id, partner_name: p.partner_name })));
32      } catch (e) {
33        handleAdminError(e, "Failed to load partners");
34      }
35    })();
36  }, [isPartnerTenantAdmin]);
37  const load = async () => {
38    setLoading(true);
39    try {
40      const pid = !isPartnerTenantAdmin && partnerId ? Number(partnerId) : void 0;
41      const res = await adminService.getSupportPartnerTickets(
42        page,
43        limit,
44        status || void 0,
45        pid
46      );
47      setTickets(res.tickets);
48      setTotal(res.total_count);
49    } catch (e) {
50      handleAdminError(e, "Failed to load escalations");
51    } finally {
52      setLoading(false);
53    }
54  };
55  useEffect(() => {
56    void load();
57  }, [page, status, partnerId, isPartnerTenantAdmin]);
58  const openRow = async (t) => {
59    try {
60      const full = await adminService.getSupportTicketDetail(t.id);
61      setDetail(full);
62    } catch (e) {
63      handleAdminError(e, "Failed to load ticket");
64    }
65  };
66  const setStatusRemote = async (id, next) => {
67    try {
68      await adminService.patchSupportTicketStatus(id, next);
69      toast.success(next === "closed" ? "Ticket closed" : "Ticket reopened");
70      setDetail((d) => d && d.id === id ? { ...d, status: next } : d);
71      await load();
72    } catch (e) {
73      handleAdminError(e, "Could not update status");
74    }
75  };
76  const submitEscalation = async (e) => {
77    e.preventDefault();
78    if (!isPartnerTenantAdmin) return;
79    if (subject.trim().length < 2 || body.trim().length < 10) {
80      toast.error("Subject and message (10+ chars) required");
81      return;
82    }
83    setSaving(true);
84    try {
85      let rid;
86      if (relatedUserId.trim()) {
87        const n = Number(relatedUserId.trim());
88        if (Number.isNaN(n)) {
89          toast.error("Related user id must be a number");
90          setSaving(false);
91          return;
92        }
93        rid = n;
94      }
95      await adminService.createSupportPartnerTicket({
96        subject: subject.trim(),
97        body: body.trim(),
98        related_user_id: rid
99      });
100      toast.success("Ticket sent to platform team");
101      setShowNew(false);
102      setSubject("");
103      setBody("");
104      setRelatedUserId("");
105      setPage(1);
106      await load();
107    } catch (e2) {
108      handleAdminError(e2, "Could not create ticket");
109    } finally {
110      setSaving(false);
111    }
112  };
113  const totalPages = Math.max(1, Math.ceil(total / limit));
114  const colCount = isPartnerTenantAdmin ? 6 : 7;
115  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
116    /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
117      /* @__PURE__ */ jsxs("div", { children: [
118        /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-slate-900 dark:text-white", children: isPartnerTenantAdmin ? "Requests to platform" : "Partner escalations" }),
119        /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: isPartnerTenantAdmin ? "Raise issues about your partner or a specific user. Vealthx platform admins manage status." : "Tickets opened by partner administrators to the platform team." })
120      ] }),
121      isPartnerTenantAdmin && /* @__PURE__ */ jsx(Button, { type: "button", variant: "primary", onClick: () => setShowNew(true), children: "New request" })
122    ] }),
123    /* @__PURE__ */ jsxs(Card, { className: "p-0 overflow-hidden", children: [
124      /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-3 border-b border-slate-200 p-4 dark:border-slate-800", children: [
125        /* @__PURE__ */ jsxs(
126          "select",
127          {
128            value: status,
129            onChange: (e) => {
130              setPage(1);
131              setStatus(e.target.value);
132            },
133            className: "rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm dark:border-slate-700 dark:bg-slate-900 dark:text-white",
134            children: [
135              /* @__PURE__ */ jsx("option", { value: "", children: "All statuses" }),
136              /* @__PURE__ */ jsx("option", { value: "open", children: "Open" }),
137              /* @__PURE__ */ jsx("option", { value: "closed", children: "Closed" })
138            ]
139          }
140        ),
141        !isPartnerTenantAdmin && /* @__PURE__ */ jsxs(
142          "select",
143          {
144            value: partnerId,
145            onChange: (e) => {
146              setPage(1);
147              setPartnerId(e.target.value);
148            },
149            className: "rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm dark:border-slate-700 dark:bg-slate-900 dark:text-white",
150            children: [
151              /* @__PURE__ */ jsx("option", { value: "", children: "All partners" }),
152              partners.map((p) => /* @__PURE__ */ jsx("option", { value: String(p.id), children: p.partner_name }, p.id))
153            ]
154          }
155        )
156      ] }),
157      /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left text-sm", children: [
158        /* @__PURE__ */ jsx("thead", { className: "border-b border-slate-200 bg-slate-50/80 dark:border-slate-800 dark:bg-slate-800/40", children: /* @__PURE__ */ jsxs("tr", { children: [
159          /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "ID" }),
160          /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Subject" }),
161          !isPartnerTenantAdmin && /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Partner" }),
162          /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "From" }),
163          /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Related user" }),
164          /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Status" }),
165          /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Created" })
166        ] }) }),
167        /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-slate-100 dark:divide-slate-800", children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: colCount, className: "px-4 py-10 text-center text-slate-500", children: "Loading…" }) }) : tickets.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: colCount, className: "px-4 py-10 text-center text-slate-500", children: "No tickets." }) }) : tickets.map((t) => /* @__PURE__ */ jsxs(
168          "tr",
169          {
170            className: "cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/40",
171            onClick: () => void openRow(t),
172            children: [
173              /* @__PURE__ */ jsx("td", { className: "px-4 py-3 font-mono text-xs", children: t.id }),
174              /* @__PURE__ */ jsx("td", { className: "px-4 py-3 font-medium text-slate-900 dark:text-white", children: t.subject }),
175              !isPartnerTenantAdmin && /* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-xs text-slate-600 dark:text-slate-400", children: t.partner_name || t.partner_id }),
176              /* @__PURE__ */ jsx("td", { className: "max-w-[120px] truncate px-4 py-3 text-xs text-slate-500", children: t.creator_label || "—" }),
177              /* @__PURE__ */ jsx("td", { className: "max-w-[120px] truncate px-4 py-3 text-xs text-slate-500", children: t.related_user_label || (t.related_user_id ? `#${t.related_user_id}` : "—") }),
178              /* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx(
179                "span",
180                {
181                  className: cn(
182                    "rounded-full px-2 py-0.5 text-[10px] font-bold uppercase",
183                    t.status === "open" ? "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200" : "bg-slate-200 text-slate-600 dark:bg-slate-700 dark:text-slate-300"
184                  ),
185                  children: t.status
186                }
187              ) }),
188              /* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-xs text-slate-500", children: t.created_at ? new Date(t.created_at).toLocaleString() : "—" })
189            ]
190          },
191          t.id
192        )) })
193      ] }) }),
194      totalPages > 1 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t border-slate-200 p-4 dark:border-slate-800", children: [
195        /* @__PURE__ */ jsx(
196          Button,
197          {
198            variant: "outline",
199            size: "sm",
200            disabled: page <= 1,
201            onClick: () => setPage((p) => Math.max(1, p - 1)),
202            children: "Previous"
203          }
204        ),
205        /* @__PURE__ */ jsx(
206          Button,
207          {
208            variant: "outline",
209            size: "sm",
210            disabled: page >= totalPages,
211            onClick: () => setPage((p) => Math.min(totalPages, p + 1)),
212            children: "Next"
213          }
214        )
215      ] })
216    ] }),
217    detail && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[100] flex items-end justify-center bg-slate-900/55 p-4 sm:items-center", children: /* @__PURE__ */ jsxs("div", { className: "max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-2xl border border-slate-200 bg-white p-6 shadow-xl dark:border-slate-700 dark:bg-slate-900", children: [
218      /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [
219        /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold text-slate-900 dark:text-white", children: detail.subject }),
220        /* @__PURE__ */ jsx(
221          "button",
222          {
223            type: "button",
224            onClick: () => setDetail(null),
225            className: "text-sm text-slate-500 hover:text-slate-800 dark:hover:text-slate-200",
226            children: "Close"
227          }
228        )
229      ] }),
230      /* @__PURE__ */ jsxs("p", { className: "mt-2 text-xs text-slate-500", children: [
231        "#",
232        detail.id,
233        " · ",
234        detail.partner_name || `Partner ${detail.partner_id}`,
235        " ·",
236        " ",
237        /* @__PURE__ */ jsx("span", { className: "font-semibold uppercase", children: detail.status })
238      ] }),
239      detail.related_user_label && /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-slate-500", children: [
240        "Related user: ",
241        detail.related_user_label
242      ] }),
243      /* @__PURE__ */ jsx("p", { className: "mt-4 whitespace-pre-wrap text-sm text-slate-700 dark:text-slate-200", children: detail.body }),
244      !isPartnerTenantAdmin && /* @__PURE__ */ jsx("div", { className: "mt-6 flex flex-wrap gap-2 border-t border-slate-100 pt-4 dark:border-slate-800", children: detail.status === "open" ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => void setStatusRemote(detail.id, "closed"), children: "Mark closed" }) : /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => void setStatusRemote(detail.id, "open"), children: "Reopen" }) })
245    ] }) }),
246    showNew && isPartnerTenantAdmin && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[110] flex items-end justify-center bg-slate-900/55 p-4 sm:items-center", children: /* @__PURE__ */ jsxs(
247      "form",
248      {
249        onSubmit: submitEscalation,
250        className: "w-full max-w-md rounded-2xl border border-slate-200 bg-white p-6 shadow-xl dark:border-slate-700 dark:bg-slate-900",
251        children: [
252          /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold text-slate-900 dark:text-white", children: "New request to platform" }),
253          /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-3", children: [
254            /* @__PURE__ */ jsxs("div", { children: [
255              /* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-semibold text-slate-600 dark:text-slate-300", children: "Subject" }),
256              /* @__PURE__ */ jsx(
257                "input",
258                {
259                  value: subject,
260                  onChange: (e) => setSubject(e.target.value),
261                  className: "w-full rounded-lg border border-slate-200 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-800 dark:text-white"
262                }
263              )
264            ] }),
265            /* @__PURE__ */ jsxs("div", { children: [
266              /* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-semibold text-slate-600 dark:text-slate-300", children: "Details" }),
267              /* @__PURE__ */ jsx(
268                "textarea",
269                {
270                  value: body,
271                  onChange: (e) => setBody(e.target.value),
272                  rows: 5,
273                  className: "w-full rounded-lg border border-slate-200 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-800 dark:text-white"
274                }
275              )
276            ] }),
277            /* @__PURE__ */ jsxs("div", { children: [
278              /* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-semibold text-slate-600 dark:text-slate-300", children: "Related user id (optional)" }),
279              /* @__PURE__ */ jsx(
280                "input",
281                {
282                  value: relatedUserId,
283                  onChange: (e) => setRelatedUserId(e.target.value),
284                  placeholder: "e.g. 12345",
285                  className: "w-full rounded-lg border border-slate-200 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-800 dark:text-white"
286                }
287              ),
288              /* @__PURE__ */ jsx("p", { className: "mt-1 text-[10px] text-slate-500", children: "Must be a user under your partner." })
289            ] })
290          ] }),
291          /* @__PURE__ */ jsxs("div", { className: "mt-6 flex justify-end gap-2", children: [
292            /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => setShowNew(false), children: "Cancel" }),
293            /* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", loading: saving, children: "Submit" })
294          ] })
295        ]
296      }
297    ) })
298  ] });
299};
300
301//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN1cHBvcnRQYXJ0bmVyVGlja2V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBhZG1pblNlcnZpY2UsIHR5cGUgU3VwcG9ydFRpY2tldCB9IGZyb20gJy4uLy4uLy4uL2FwaS9lbmRwb2ludHMvYWRtaW4nO1xuaW1wb3J0IHsgaGFuZGxlQWRtaW5FcnJvciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Vycm9ySGFuZGxpbmcnO1xuaW1wb3J0IHsgdXNlQWRtaW5BdXRoIH0gZnJvbSAnLi4vY29udGV4dC9BZG1pbkF1dGhDb250ZXh0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvdWkvQnV0dG9uJztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhcmQnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi91dGlscy9jbic7XG5pbXBvcnQgdG9hc3QgZnJvbSAncmVhY3QtaG90LXRvYXN0JztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRQYXJ0bmVyVGlja2V0czogUmVhY3QuRkMgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBpc1BhcnRuZXJUZW5hbnRBZG1pbiB9ID0gdXNlQWRtaW5BdXRoKCk7XG4gICAgY29uc3QgW3RpY2tldHMsIHNldFRpY2tldHNdID0gdXNlU3RhdGU8U3VwcG9ydFRpY2tldFtdPihbXSk7XG4gICAgY29uc3QgW3RvdGFsLCBzZXRUb3RhbF0gPSB1c2VTdGF0ZSgwKTtcbiAgICBjb25zdCBbcGFnZSwgc2V0UGFnZV0gPSB1c2VTdGF0ZSgxKTtcbiAgICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG4gICAgY29uc3QgW3BhcnRuZXJJZCwgc2V0UGFydG5lcklkXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICAgIGNvbnN0IFtwYXJ0bmVycywgc2V0UGFydG5lcnNdID0gdXNlU3RhdGU8eyBpZDogbnVtYmVyOyBwYXJ0bmVyX25hbWU6IHN0cmluZyB9W10+KFtdKTtcbiAgICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgICBjb25zdCBbZGV0YWlsLCBzZXREZXRhaWxdID0gdXNlU3RhdGU8U3VwcG9ydFRpY2tldCB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IFtzaG93TmV3LCBzZXRTaG93TmV3XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbc3ViamVjdCwgc2V0U3ViamVjdF0gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW2JvZHksIHNldEJvZHldID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtyZWxhdGVkVXNlcklkLCBzZXRSZWxhdGVkVXNlcklkXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgbGltaXQgPSAyMDtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChpc1BhcnRuZXJUZW5hbnRBZG1pbikgcmV0dXJuO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBhd2FpdCBhZG1pblNlcnZpY2UuZ2V0UGFydG5lcnMoKTtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0bmVycyhsaXN0Lm1hcCgocCkgPT4gKHsgaWQ6IHAuaWQsIHBhcnRuZXJfbmFtZTogcC5wYXJ0bmVyX25hbWUgfSkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVBZG1pbkVycm9yKGUsICdGYWlsZWQgdG8gbG9hZCBwYXJ0bmVycycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH0sIFtpc1BhcnRuZXJUZW5hbnRBZG1pbl0pO1xuXG4gICAgY29uc3QgbG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBpZCA9ICFpc1BhcnRuZXJUZW5hbnRBZG1pbiAmJiBwYXJ0bmVySWQgPyBOdW1iZXIocGFydG5lcklkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFkbWluU2VydmljZS5nZXRTdXBwb3J0UGFydG5lclRpY2tldHMoXG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgICAgICBzdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBpZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzZXRUaWNrZXRzKHJlcy50aWNrZXRzKTtcbiAgICAgICAgICAgIHNldFRvdGFsKHJlcy50b3RhbF9jb3VudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGhhbmRsZUFkbWluRXJyb3IoZSwgJ0ZhaWxlZCB0byBsb2FkIGVzY2FsYXRpb25zJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2b2lkIGxvYWQoKTtcbiAgICB9LCBbcGFnZSwgc3RhdHVzLCBwYXJ0bmVySWQsIGlzUGFydG5lclRlbmFudEFkbWluXSk7XG5cbiAgICBjb25zdCBvcGVuUm93ID0gYXN5bmMgKHQ6IFN1cHBvcnRUaWNrZXQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGwgPSBhd2FpdCBhZG1pblNlcnZpY2UuZ2V0U3VwcG9ydFRpY2tldERldGFpbCh0LmlkKTtcbiAgICAgICAgICAgIHNldERldGFpbChmdWxsKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaGFuZGxlQWRtaW5FcnJvcihlLCAnRmFpbGVkIHRvIGxvYWQgdGlja2V0Jyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0U3RhdHVzUmVtb3RlID0gYXN5bmMgKGlkOiBudW1iZXIsIG5leHQ6ICdvcGVuJyB8ICdjbG9zZWQnKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBhZG1pblNlcnZpY2UucGF0Y2hTdXBwb3J0VGlja2V0U3RhdHVzKGlkLCBuZXh0KTtcbiAgICAgICAgICAgI
301HRvYXN0LnN1Y2Nlc3MobmV4dCA9PT0gJ2Nsb3NlZCcgPyAnVGlja2V0IGNsb3NlZCcgOiAnVGlja2V0IHJlb3BlbmVkJyk7XG4gICAgICAgICAgICBzZXREZXRhaWwoKGQpID0+IChkICYmIGQuaWQgPT09IGlkID8geyAuLi5kLCBzdGF0dXM6IG5leHQgfSA6IGQpKTtcbiAgICAgICAgICAgIGF3YWl0IGxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaGFuZGxlQWRtaW5FcnJvcihlLCAnQ291bGQgbm90IHVwZGF0ZSBzdGF0dXMnKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBzdWJtaXRFc2NhbGF0aW9uID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghaXNQYXJ0bmVyVGVuYW50QWRtaW4pIHJldHVybjtcbiAgICAgICAgaWYgKHN1YmplY3QudHJpbSgpLmxlbmd0aCA8IDIgfHwgYm9keS50cmltKCkubGVuZ3RoIDwgMTApIHtcbiAgICAgICAgICAgIHRvYXN0LmVycm9yKCdTdWJqZWN0IGFuZCBtZXNzYWdlICgxMCsgY2hhcnMpIHJlcXVpcmVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2F2aW5nKHRydWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJpZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRVc2VySWQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IE51bWJlcihyZWxhdGVkVXNlcklkLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihuKSkge1xuICAgICAgICAgICAgICAgICAgICB0b2FzdC5lcnJvcignUmVsYXRlZCB1c2VyIGlkIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByaWQgPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYWRtaW5TZXJ2aWNlLmNyZWF0ZVN1cHBvcnRQYXJ0bmVyVGlja2V0KHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0LnRyaW0oKSxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LnRyaW0oKSxcbiAgICAgICAgICAgICAgICByZWxhdGVkX3VzZXJfaWQ6IHJpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG9hc3Quc3VjY2VzcygnVGlja2V0IHNlbnQgdG8gcGxhdGZvcm0gdGVhbScpO1xuICAgICAgICAgICAgc2V0U2hvd05ldyhmYWxzZSk7XG4gICAgICAgICAgICBzZXRTdWJqZWN0KCcnKTtcbiAgICAgICAgICAgIHNldEJvZHkoJycpO1xuICAgICAgICAgICAgc2V0UmVsYXRlZFVzZXJJZCgnJyk7XG4gICAgICAgICAgICBzZXRQYWdlKDEpO1xuICAgICAgICAgICAgYXdhaXQgbG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBoYW5kbGVBZG1pbkVycm9yKGUsICdDb3VsZCBub3QgY3JlYXRlIHRpY2tldCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gbGltaXQpKTtcbiAgICBjb25zdCBjb2xDb3VudCA9IGlzUGFydG5lclRlbmFudEFkbWluID8gNiA6IDc7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtc2xhdGUtOTAwIGRhcms6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzUGFydG5lclRlbmFudEFkbWluID8gJ1JlcXVlc3RzIHRvIHBsYXRmb3JtJyA6ICdQYXJ0bmVyIGVzY2FsYXRpb25zJ31cbiAgICAgICAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXNtIHRleHQtc2xhdGUtNTAwIGRhcms6dGV4dC1zbGF0ZS00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1BhcnRuZXJUZW5hbnRBZG1pblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ1JhaXNlIGlzc3VlcyBhYm91dCB5b3VyIHBhcnRuZXIgb3IgYSBzcGVjaWZpYyB1c2VyLiBWZWFsdGh4IHBsYXRmb3JtIGFkbWlucyBtYW5hZ2Ugc3RhdHVzLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdUaWNrZXRzIG9wZW5lZCBieSBwYXJ0bmVyIGFkbWluaXN0cmF0b3JzIHRvIHRoZSBwbGF0Zm9ybSB0ZWFtLid9XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7aXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwicHJpbWFyeVwiIG9uQ2xpY2s9eygpID0+IHNldFNob3dOZXcodHJ1ZSl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgTmV3IHJlcXVlc3RcbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJwLTAgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMyBib3JkZXItYiBib3JkZXItc2xhdGUtMjAwIHAtNCBkYXJrOmJvcmRlci1zbGF0ZS04MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdHVzKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
301H19XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHB4LTMgcHktMiB0ZXh0LXNtIGRhcms6Ym9yZGVyLXNsYXRlLTcwMCBkYXJrOmJnLXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIHN0YXR1c2VzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3BlblwiPk9wZW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjbG9zZWRcIj5DbG9zZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIHshaXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwYXJ0bmVySWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhcnRuZXJJZChlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHB4LTMgcHktMiB0ZXh0LXNtIGRhcms6Ym9yZGVyLXNsYXRlLTcwMCBkYXJrOmJnLXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgcGFydG5lcnM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydG5lcnMubWFwKChwKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtwLmlkfSB2YWx1ZT17U3RyaW5nKHAuaWQpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwLnBhcnRuZXJfbmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwidy1mdWxsIHRleHQtbGVmdCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXNsYXRlLTIwMCBiZy1zbGF0ZS01MC84MCBkYXJrOmJvcmRlci1zbGF0ZS04MDAgZGFyazpiZy1zbGF0ZS04MDAvNDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+SUQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtNCBweS0zIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPlN1YmplY3Q8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IWlzUGFydG5lclRlbmFudEFkbWluICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+UGFydG5lcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+RnJvbTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+UmVsYXRlZCB1c2VyPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LXNlbWlib2xkIHRleHQtc2xhdGUtNjAwIGRhcms6dGV4dC1zbGF0ZS0zMDBcIj5TdGF0dXM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtNCBweS0zIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPkNyZWF0ZWQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzTmFtZT1cImRpdmlkZS15IGRpdmlkZS1zbGF0ZS0xMDAgZGFyazpkaXZpZGUtc2xhdGUtODAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xTcGFuPXtjb2xDb3VudH0gY2xhc3NOYW1lPVwicHgtNCBweS0xMCB0ZXh0LWNlbnRlciB0ZXh0LXNsYXRlLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRpbmfigKZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IHRpY2tldHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sU3Bhbj17Y29sQ291bnR9IGNsYXNzTmFtZT1cInB4LTQgcHktMTAgdGV4dC1jZW50ZXIgdGV4dC1zbGF0ZS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyB0aWNrZXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRzLm1hcCgodCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXNsYXRlLTUwIGRhcms6aG92ZXI6Ymctc2xhdGUtODAwLzQwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG9wZW5Sb3codCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1vbm8gdGV4dC14c1wiPnt0LmlkfTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1lZGl1bSB0ZXh0LXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIj57dC5zdWJqZWN0fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyFpc1BhcnRuZXJUZW5hbnRBZG1pbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTMgdGV4dC14cyB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dC5wYXJ0bmVyX25hbWUgfHwgdC5wYXJ0bmVyX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cIm1heC13LVsxMjBweF0gdHJ1bmNhdGUgcHgtNCBweS0zIHRleHQteHMgdGV4dC1zbGF0ZS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QuY3JlYXRvcl9sYWJlbC
301B8fCAn4oCUJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJtYXgtdy1bMTIwcHhdIHRydW5jYXRlIHB4LTQgcHktMyB0ZXh0LXhzIHRleHQtc2xhdGUtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0LnJlbGF0ZWRfdXNlcl9sYWJlbCB8fCAodC5yZWxhdGVkX3VzZXJfaWQgPyBgIyR7dC5yZWxhdGVkX3VzZXJfaWR9YCA6ICfigJQnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvdW5kZWQtZnVsbCBweC0yIHB5LTAuNSB0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXR1cyA9PT0gJ29wZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWVtZXJhbGQtMTAwIHRleHQtZW1lcmFsZC04MDAgZGFyazpiZy1lbWVyYWxkLTkwMC80MCBkYXJrOnRleHQtZW1lcmFsZC0yMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLXNsYXRlLTIwMCB0ZXh0LXNsYXRlLTYwMCBkYXJrOmJnLXNsYXRlLTcwMCBkYXJrOnRleHQtc2xhdGUtMzAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0LnN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktMyB0ZXh0LXhzIHRleHQtc2xhdGUtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0LmNyZWF0ZWRfYXQgPyBuZXcgRGF0ZSh0LmNyZWF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAn4oCUJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7dG90YWxQYWdlcyA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci10IGJvcmRlci1zbGF0ZS0yMDAgcC00IGRhcms6Ym9yZGVyLXNsYXRlLTgwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtwYWdlIDw9IDF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFnZSgocCkgPT4gTWF0aC5tYXgoMSwgcCAtIDEpKX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3BhZ2UgPj0gdG90YWxQYWdlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQYWdlKChwKSA9PiBNYXRoLm1pbih0b3RhbFBhZ2VzLCBwICsgMSkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9DYXJkPlxuXG4gICAgICAgICAgICB7ZGV0YWlsICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGluc2V0LTAgei1bMTAwXSBmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWNlbnRlciBiZy1zbGF0ZS05MDAvNTUgcC00IHNtOml0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC1oLVs5MHZoXSB3LWZ1bGwgbWF4LXctbGcgb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHAtNiBzaGFkb3cteGwgZGFyazpib3JkZXItc2xhdGUtNzAwIGRhcms6Ymctc2xhdGUtOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1ib2xkIHRleHQtc2xhdGUtOTAwIGRhcms6dGV4dC13aGl0ZVwiPntkZXRhaWwuc3ViamVjdH08L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldERldGFpbChudWxsKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTUwMCBob3Zlcjp0ZXh0LXNsYXRlLTgwMCBkYXJrOmhvdmVyOnRleHQtc2xhdGUtMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC14cyB0ZXh0LXNsYXRlLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICN7ZGV0YWlsLmlkfSDCtyB7ZGV0YWlsLnBhcnRuZXJfbmFtZSB8fCBgUGFydG5lciAke2RldGFpbC5wYXJ0bmVyX2lkfWB9IMK3eycgJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHVwcGVyY2FzZVwiPntkZXRhaWwuc3RhdHVzfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgI
301HtkZXRhaWwucmVsYXRlZF91c2VyX2xhYmVsICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC1zbGF0ZS01MDBcIj5SZWxhdGVkIHVzZXI6IHtkZXRhaWwucmVsYXRlZF91c2VyX2xhYmVsfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC00IHdoaXRlc3BhY2UtcHJlLXdyYXAgdGV4dC1zbSB0ZXh0LXNsYXRlLTcwMCBkYXJrOnRleHQtc2xhdGUtMjAwXCI+e2RldGFpbC5ib2R5fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNiBmbGV4IGZsZXgtd3JhcCBnYXAtMiBib3JkZXItdCBib3JkZXItc2xhdGUtMTAwIHB0LTQgZGFyazpib3JkZXItc2xhdGUtODAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtkZXRhaWwuc3RhdHVzID09PSAnb3BlbicgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgc2V0U3RhdHVzUmVtb3RlKGRldGFpbC5pZCwgJ2Nsb3NlZCcpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIGNsb3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgc2V0U3RhdHVzUmVtb3RlKGRldGFpbC5pZCwgJ29wZW4nKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVvcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge3Nob3dOZXcgJiYgaXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgaW5zZXQtMCB6LVsxMTBdIGZsZXggaXRlbXMtZW5kIGp1c3RpZnktY2VudGVyIGJnLXNsYXRlLTkwMC81NSBwLTQgc206aXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Ym1pdD17c3VibWl0RXNjYWxhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBtYXgtdy1tZCByb3VuZGVkLTJ4bCBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCBiZy13aGl0ZSBwLTYgc2hhZG93LXhsIGRhcms6Ym9yZGVyLXNsYXRlLTcwMCBkYXJrOmJnLXNsYXRlLTkwMFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIj5OZXcgcmVxdWVzdCB0byBwbGF0Zm9ybTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgc3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm1iLTEgYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtc2xhdGUtNjAwIGRhcms6dGV4dC1zbGF0ZS0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c3ViamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U3ViamVjdChlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCBweC0zIHB5LTIgdGV4dC1zbSBkYXJrOmJvcmRlci1zbGF0ZS02MDAgZGFyazpiZy1zbGF0ZS04MDAgZGFyazp0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibWItMSBibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtib2R5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCb2R5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M9ezV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCBweC0zIHB5LTIgdGV4dC1zbSBkYXJrOmJvcmRlci1zbGF0ZS02MDAgZGFyazpiZy1zbGF0ZS04MDAgZGFyazp0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibWItMSBibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRlZCB1c2VyIGlkIChvcHRpb25hbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cmVsYXRlZFVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UmVsYXRlZFVzZXJJZChlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gMTIzNDVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgcHgtMyBweS0yIHRleHQtc20gZGFyazpib3JkZXItc2xhdGUtNjAwIGRhcms6Ymctc2xhdGUtODAwIGRhcms6dGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC1bMTBweF0gdGV4dC1zbGF0ZS01MDBcIj5NdXN0IGJlIGEgdXNlciB1bmRlciB5b3VyIHBhcnRuZXIuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTYgZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lXCIgb25DbGljaz17KCkgPT4gc2V0U2hvd05ldyhmYWxzZSl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIiB2YXJpYW50PVwicHJpbWFyeVwiIGxvYWRpbmc9e3NhdmluZ30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUE4SGdCLFNBQ0ksS0FESjtBQTlIaEIsT0FBTyxTQUFTLFdBQVcsZ0JBQWdCO0FBQzNDLFNBQVMsb0JBQXdDO0FBQ2pELFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxVQUFVO0FBQ25CLE9BQU8sV0FBVztBQUVYLGFBQU0sd0JBQWtDLE1BQU07QUFDakQsUUFBTSxFQUFFLHFCQUFxQixJQUFJLGFBQWE7QUFDOUMsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQTBCLENBQUMsQ0FBQztBQUMxRCxRQUFNLENBQUMsT0FBTyxRQUFRLElBQUksU0FBUyxDQUFDO0FBQ3BDLFFBQU0sQ0FBQyxNQUFNLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDbEMsUUFBTSxDQUFDLFFBQVEsU0FBUyxJQUFJLFNBQWlCLEVBQUU7QUFDL0MsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJLFNBQWlCLEVBQUU7QUFDckQsUUFBTSxDQUFDLFVBQVUsV0FBVyxJQUFJLFNBQWlELENBQUMsQ0FBQztBQUNuRixRQUFNLENBQUMsU0FBUyxVQUFVLElBQUksU0FBUyxJQUFJO0FBQzNDLFFBQU0sQ0FBQyxRQUFRLFNBQVMsSUFBSSxTQUErQixJQUFJO0FBQy9ELFFBQU0sQ0FBQyxTQUFTLFVBQVUsSUFBSSxTQUFTLEtBQUs7QUFDNUMsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQVMsRUFBRTtBQUN6QyxRQUFNLENBQUMsTUFBTSxPQUFPLElBQUksU0FBUyxFQUFFO0FBQ25DLFFBQU0sQ0FBQyxlQUFlLG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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.