PageSourceSearch

https://mesca-submittal.onrender.com/resources/js/pages/TICModels.tsx

js mesca-submittal.onrender.com collected 2026-10-03 11:41:50 UTC 64,106 bytes, 451 lines download raw bytes

1import __vite__cjsImport0_react from "/node_modules/.vite/deps/react.js?v=47cb5776"; const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; const useState = __vite__cjsImport0_react["useState"]; const useEffect = __vite__cjsImport0_react["useEffect"];
2import axios from "/node_modules/.vite/deps/axios.js?v=a22cc16d";
3const TICModelItem = ({ model, onEdit, onDelete }) => {
4  const getModelTypeColor = (type) => {
5    switch (type) {
6      case "indoor":
7        return "bg-green-100 text-green-800 border-green-300";
8      case "outdoor":
9        return "bg-blue-100 text-blue-800 border-blue-300";
10      case "both":
11        return "bg-purple-100 text-purple-800 border-purple-300";
12      default:
13        return "bg-gray-100 text-gray-800 border-gray-300";
14    }
15  };
16  return /* @__PURE__ */ React.createElement("div", { className: "border border-gray-200 rounded-lg p-4 hover:bg-gray-50 transition-colors" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-3 mb-2" }, /* @__PURE__ */ React.createElement("h3", { className: "text-lg font-semibold text-gray-900 font-mono" }, model.modelNumber), /* @__PURE__ */ React.createElement(
17    "span",
18    {
19      className: `px-2 py-1 text-xs font-medium rounded-full border ${getModelTypeColor(model.modelType)}`
20    },
21    model.modelType
22  )), model.description && /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-600 mb-2" }, model.description), /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-400" }, "ID: ", model.id, " • Created: ", new Date(model.createdAt).toLocaleDateString())), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 ml-4" }, /* @__PURE__ */ React.createElement(
23    "button",
24    {
25      onClick: () => onEdit(model),
26      className: "px-3 py-1 text-sm bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500"
27    },
28    "Edit"
29  ), /* @__PURE__ */ React.createElement(
30    "button",
31    {
32      onClick: () => onDelete(model),
33      className: "px-3 py-1 text-sm bg-red-600 text-white rounded-md hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500"
34    },
35    "Delete"
36  ))));
37};
38const TICModels = () => {
39  const [models, setModels] = useState([]);
40  const [filteredModels, setFilteredModels] = useState([]);
41  const [loading, setLoading] = useState(true);
42  const [error, setError] = useState(null);
43  const [success, setSuccess] = useState(null);
44  const [isModalOpen, setIsModalOpen] = useState(false);
45  const [isEditModalOpen, setIsEditModalOpen] = useState(false);
46  const [formLoading, setFormLoading] = useState(false);
47  const [editingModel, setEditingModel] = useState(null);
48  const [searchQuery, setSearchQuery] = useState("");
49  const [filterType, setFilterType] = useState("all");
50  const [sortBy, setSortBy] = useState("modelNumber");
51  const availableModelTypes = React.useMemo(() => {
52    const types = new Set(models.map((model) => model.modelType));
53    return Array.from(types).sort();
54  }, [models]);
55  const [formData, setFormData] = useState({
56    modelNumber: "",
57    description: "",
58    modelType: ""
59  });
60  useEffect(() => {
61    fetchModels();
62  }, []);
63  useEffect(() => {
64    let filtered = models;
65    if (searchQuery.trim()) {
66      const query = searchQuery.toLowerCase();
67      filtered = filtered.filter(
68        (model) => model.modelNumber.toLowerCase().includes(query) || model.description && model.description.toLowerCase().includes(query)
69      );
70    }
71    if (filterType !== "all") {
72      filtered = filtered.filter((model) => model.modelType === filterType);
73    }
74    filtered = [...filtered].sort((a, b) => {
75      switch (sortBy) {
76        case "id":
77          return a.id - b.id;
78        case "modelNumber":
79          return a.modelNumber.localeCompare(b.modelNumber);
80        case "modelType":
81          return a.modelType.localeCompare(b.modelType);
82        default:
83          return 0;
84      }
85    });
86    setFilteredModels(filtered);
87  }, [models, searchQuery, filterType, sortBy]);
88  useEffect(() => {
89    if (success || error) {
90      const timer = setTimeout(() => {
91        setSuccess(null);
92        setError(null);
93      }, 5e3);
94      return () => clearTimeout(timer);
95    }
96  }, [success, error]);
97  const fetchModels = async () => {
98    setLoading(true);
99    setError(null);
100    try {
101      const response = await axios.get("/api/tic-models");
102      setModels(response.data);
103      setFilteredModels(response.data);
104    } catch (err) {
105      console.error("Error fetching TIC models:", err);
106      setError(err.response?.data?.error || "Failed to load TIC models");
107    } finally {
108      setLoading(false);
109    }
110  };
111  const handleInputChange = (e) => {
112    const { name, value } = e.target;
113    setFormData((prev) => ({
114      ...prev,
115      [name]: value
116    }));
117  };
118  const handleSubmit = async (e) => {
119    e.preventDefault();
120    setFormLoading(true);
121    setError(null);
122    setSuccess(null);
123    try {
124      await axios.post("/api/tic-models", {
125        modelNumber: formData.modelNumber,
126        description: formData.description || null,
127        modelType: formData.modelType
128      });
129      setSuccess("TIC Model created successfully!");
130      handleReset();
131      closeModal();
132      fetchModels();
133    } catch (err) {
134      console.error("Error creating TIC model:", err);
135      setError(err.response?.data?.error || "Failed to create TIC model");
136    } finally {
137      setFormLoading(false);
138    }
139  };
140  const handleReset = () => {
141    setFormData({
142      modelNumber: "",
143      description: "",
144      modelType: "indoor"
145    });
146  };
147  const openModal = () => {
148    handleReset();
149    setIsModalOpen(true);
150  };
151  const closeModal = () => {
152    setIsModalOpen(false);
153    handleReset();
154  };
155  const handleEdit = (model) => {
156    setEditingModel(model);
157    setFormData({
158      modelNumber: model.modelNumber,
159      description: model.description || "",
160      modelType: model.modelType
161    });
162    setIsEditModalOpen(true);
163  };
164  const handleUpdate = async (e) => {
165    e.preventDefault();
166    if (!editingModel) return;
167    setFormLoading(true);
168    setError(null);
169    setSuccess(null);
170    try {
171      await axios.put(`/api/tic-models/${editingModel.id}`, {
172        modelNumber: formData.modelNumber,
173        description: formData.description || null,
174        modelType: formData.modelType
175      });
176      setSuccess("TIC Model updated successfully!");
177      closeEditModal();
178      fetchModels();
179    } catch (err) {
180      console.error("Error updating TIC model:", err);
181      setError(err.response?.data?.error || "Failed to update TIC model");
182    } finally {
183      setFormLoading(false);
184    }
185  };
186  const closeEditModal = () => {
187    setIsEditModalOpen(false);
188    setEditingModel(null);
189    handleReset();
190  };
191  const handleDelete = async (model) => {
192    if (!confirm(`Are you sure you want to delete model "${model.modelNumber}"?`)) {
193      return;
194    }
195    setError(null);
196    setSuccess(null);
197    try {
198      await axios.delete(`/api/tic-models/${model.id}`);
199      setSuccess("TIC Model deleted successfully!");
200      fetchModels();
201    } catch (err) {
202      console.error("Error deleting TIC model:", err);
203      setError(err.response?.data?.error || "Failed to delete TIC model");
204    }
205  };
206  if (loading) {
207    return /* @__PURE__ */ React.createElement("div", { className: "container mx-auto px-4 py-8" }
207, /* @__PURE__ */ React.createElement("div", { className: "text-center py-10" }, /* @__PURE__ */ React.createElement("div", { className: "animate-spin h-10 w-10 text-blue-500 mx-auto mb-4" }, /* @__PURE__ */ React.createElement("svg", { className: "w-full h-full", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ React.createElement(
208      "circle",
209      {
210        className: "opacity-25",
211        cx: "12",
212        cy: "12",
213        r: "10",
214        stroke: "currentColor",
215        strokeWidth: "4"
216      }
217    ), /* @__PURE__ */ React.createElement(
218      "path",
219      {
220        className: "opacity-75",
221        fill: "currentColor",
222        d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
223      }
224    ))), /* @__PURE__ */ React.createElement("p", { className: "text-gray-600" }, "Loading TIC Models...")));
225  }
226  return /* @__PURE__ */ React.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "mb-6 flex justify-between items-center" }, /* @__PURE__ */ React.createElement("h1", { className: "text-3xl font-bold text-gray-900" }, "TIC Models"), /* @__PURE__ */ React.createElement(
227    "button",
228    {
229      onClick: openModal,
230      className: "px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
231    },
232    "Create TIC Model"
233  )), error && /* @__PURE__ */ React.createElement("div", { className: "mb-6 p-4 bg-red-100 border border-red-400 text-red-700 rounded-md" }
233, error), success && /* @__PURE__ */ React.createElement("div", { className: "mb-6 p-4 bg-green-100 border border-green-400 text-green-700 rounded-md" }, success), /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-md p-6 mb-6" }, /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("label", { htmlFor: "search", className: "block text-sm font-medium text-gray-700 mb-1" }, "Search Models"), /* @__PURE__ */ React.createElement(
234    "input",
235    {
236      type: "text",
237      id: "search",
238      value: searchQuery,
239      onChange: (e) => setSearchQuery(e.target.value),
240      placeholder: "Search by model number or description...",
241      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
242    }
243  )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("label", { htmlFor: "filterType", className: "block text-sm font-medium text-gray-700 mb-1" }, "Filter by Type"), /* @__PURE__ */ React.createElement(
244    "select",
245    {
246      id: "filterType",
247      value: filterType,
248      onChange: (e) => setFilterType(e.target.value),
249      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
250    },
251    /* @__PURE__ */ React.createElement("option", { value: "all" }, "All Types"),
252    availableModelTypes.map((type) => /* @__PURE__ */ React.createElement("option", { key: type, value: type }, type))
253  )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("label", { htmlFor: "sortBy", className: "block text-sm font-medium text-gray-700 mb-1" }, "Sort By"), /* @__PURE__ */ React.createElement(
254    "select",
255    {
256      id: "sortBy",
257      value: sortBy,
258      onChange: (e) => setSortBy(e.target.value),
259      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
260    },
261    /* @__PURE__ */ React.createElement("option", { value: "modelNumber" }, "Model Number"),
262    /* @__PURE__ */ React.createElement("option", { value: "id" }, "ID"),
263    /* @__PURE__ */ React.createElement("option", { value: "modelType" }, "Model Type")
264  ))), /* @__PURE__ */ React.createElement("div", { className: "mt-4 text-sm text-gray-600" }, "Showing ", filteredModels.length, " of ", models.length, " models")), /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-md p-6" }, filteredModels.length > 0 ? /* @__PURE__ */ React.createElement("div", { className: "space-y-4" }, filteredModels.map((model) => /* @__PURE__ */ React.createElement(
265    TICModelItem,
266    {
267      key: model.id,
268      model,
269      onEdit: handleEdit,
270      onDelete: handleDelete
271    }
272  ))) : /* @__PURE__ */ React.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React.createElement("div", { className: "text-gray-400 mb-4" }, /* @__PURE__ */ React.createElement(
273    "svg",
274    {
275      className: "w-16 h-16 mx-auto",
276      fill: "none",
277      viewBox: "0 0 24 24",
278      stroke: "currentColor"
279    },
280    /* @__PURE__ */ React.createElement(
281      "path",
282      {
283        strokeLinecap: "round",
284        strokeLinejoin: "round",
285        strokeWidth: 1,
286        d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
287      }
288    )
289  )), /* @__PURE__ */ React.createElement("h3", { className: "text-lg font-medium text-gray-900 mb-2" }, "No Models Found"), /* @__PURE__ */ React.createElement("p", { className: "text-gray-600" }, searchQuery || filterType !== "all" ? "No models match your filters. Try adjusting your search." : "Get started by creating your first TIC model."))), isModalOpen && /* @__PURE__ */ React.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4" }, /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-xl w-full max-w-2xl" }, /* @__PURE__ */ React.createElement("div", { className: "p-6" }, /* @__PURE__ */ React.createElement("div", { className: "flex justify-between items-center mb-6" }, /* @__PURE__ */ React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "Create TIC Model"), /* @__PURE__ */ React.createElement(
290    "button",
291    {
292      onClick: closeModal,
293      className: "text-gray-400 hover:text-gray-600 text-2xl font-bold"
294    },
295    "×"
296  )), /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit, className: "space-y-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
297    "label",
298    {
299      htmlFor: "modelNumber",
300      className: "block text-sm font-medium text-gray-700 mb-1"
301    },
302    "Model Number *"
303  ), /* @__PURE__ */ React.createElement(
304    "input",
305    {
306      type: "text",
307      id: "modelNumber",
308      name: "modelNumber",
309      value: formData.modelNumber,
310      onChange: handleInputChange,
311      required: true,
312      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono",
313      placeholder: "Enter model number (e.g., MXZ-2C20NAHZ)"
314    }
315  )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
316    "label",
317    {
318      htmlFor: "description",
319      className: "block text-sm font-medium text-gray-700 mb-1"
320    },
321    "Description"
322  ), /* @__PURE__ */ React.createElement(
323    "textarea",
324    {
325      id: "description",
326      name: "description",
327      value: formData.description,
328      onChange: handleInputChange,
329      rows: 3,
330      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
331      placeholder: "Enter model description (optional)"
332    }
333  )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
334    "label",
335    {
336      htmlFor: "modelType",
337      className: "block text-sm font-medium text-gray-700 mb-1"
338    },
339    "Model Type *"
340  ), /* @__PURE__ */ React.createElement(
341    "input",
342    {
343      type: "text",
344      id: "modelType",
345      name: "modelType",
346      value: formData.modelType,
347      onChange: handleInputChange,
348      required: true,
349      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
350      placeholder: "e.g., indoor, outdoor, both, etc."
351    }
352  ), /* @__PURE__ */ React.createElement("p", { className: "mt-1 text-sm text-gray-500" }, "Enter the model type (e.g., indoor, outdoor, both)")), /* @__PURE__ */ React.createElement("div", { className: "flex space-x-4 pt-4" }, /* @__PURE__ */ React.createElement(
353    "button",
354    {
355      type: "submit",
356      disabled: formLoading,
357      className: `flex-1 py-2 px-4 rounded-md text-white font-medium ${formLoading ? "bg-gray-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"}`
358    },
359    formLoading ? "Creating..." : "Create Model"
360  ), /* @__PURE__ */ React.createElement(
361    "button",
362    {
363      type: "button",
364      onClick: closeModal,
365      className: "px-4 py-2 border border-gray-300 rounded-md text-gray-700 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
366    },
367    "Cancel"
368  )))))), isEditModalOpen && editingModel && /* @__PURE__ */ React.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4" }, /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-xl w-full max-w-2xl" }, /* @__PURE__ */ React.createElement("div", { className: "p-6" }, /* @__PURE__ */ React.createElement("div", { className: "flex justify-between items-center mb-6" }, /* @__PURE__ */ React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "Edit TIC Model"), /* @__PURE__ */ React.createElement(
369    "button",
370    {
371      onClick: closeEditModal,
372      className: "text-gray-400 hover:text-gray-600 text-2xl font-bold"
373    },
374    "×"
375  )), /* @__PURE__ */ React.createElement("form", { onSubmit: handleUpdate, className: "space-y-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
376    "label",
377    {
378      htmlFor: "editModelNumber",
379      className: "block text-sm font-medium text-gray-700 mb-1"
380    },
381    "Model Number *"
382  ), /* @__PURE__ */ React.createElement(
383    "input",
384    {
385      type: "text",
386      id: "editModelNumber",
387      name: "modelNumber",
388      value: formData.modelNumber,
389      onChange: handleInputChange,
390      required: true,
391      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono",
392      placeholder: "Enter model number"
393    }
394  )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
395    "label",
396    {
397      htmlFor: "editDescription",
398      className: "block text-sm font-medium text-gray-700 mb-1"
399    },
400    "Description"
401  ), /* @__PURE__ */ React.createElement(
402    "textarea",
403    {
404      id: "editDescription",
405      name: "description",
406      value: formData.description,
407      onChange: handleInputChange,
408      rows: 3,
409      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
410      placeholder: "Enter model description (optional)"
411    }
412  )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
413    "label",
414    {
415      htmlFor: "editModelType",
416      className: "block text-sm font-medium text-gray-700 mb-1"
417    },
418    "Model Type *"
419  ), /* @__PURE__ */ React.createElement(
420    "input",
421    {
422      type: "text",
423      id: "editModelType",
424      name: "modelType",
425      value: formData.modelType,
426      onChange: handleInputChange,
427      required: true,
428      className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
429      placeholder: "e.g., indoor, outdoor, both, etc."
430    }
431  )), /* @__PURE__ */ React.createElement("div", { className: "flex space-x-4 pt-4" }, /* @__PURE__ */ React.createElement(
432    "button",
433    {
434      type: "submit",
435      disabled: formLoading,
436      className: `flex-1 py-2 px-4 rounded-md text-white font-medium ${formLoading ? "bg-gray-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"}`
437    },
438    formLoading ? "Updating..." : "Update Model"
439  ), /* @__PURE__ */ React.createElement(
440    "button",
441    {
442      type: "button",
443      onClick: closeEditModal,
444      className: "px-4 py-2 border border-gray-300 rounded-md text-gray-700 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
445    },
446    "Cancel"
447  )))))));
448};
449export default TICModels;
450
451//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRJQ01vZGVscy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcblxuaW50ZXJmYWNlIFRJQ01vZGVsIHtcbiAgaWQ6IG51bWJlclxuICBtb2RlbE51bWJlcjogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsXG4gIG1vZGVsVHlwZTogc3RyaW5nXG4gIGNyZWF0ZWRBdDogc3RyaW5nXG4gIHVwZGF0ZWRBdDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBUSUNNb2RlbEl0ZW1Qcm9wcyB7XG4gIG1vZGVsOiBUSUNNb2RlbFxuICBvbkVkaXQ6IChtb2RlbDogVElDTW9kZWwpID0+IHZvaWRcbiAgb25EZWxldGU6IChtb2RlbDogVElDTW9kZWwpID0+IHZvaWRcbn1cblxuY29uc3QgVElDTW9kZWxJdGVtOiBSZWFjdC5GQzxUSUNNb2RlbEl0ZW1Qcm9wcz4gPSAoeyBtb2RlbCwgb25FZGl0LCBvbkRlbGV0ZSB9KSA9PiB7XG4gIGNvbnN0IGdldE1vZGVsVHlwZUNvbG9yID0gKHR5cGU6IHN0cmluZykgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaW5kb29yJzpcbiAgICAgICAgcmV0dXJuICdiZy1ncmVlbi0xMDAgdGV4dC1ncmVlbi04MDAgYm9yZGVyLWdyZWVuLTMwMCdcbiAgICAgIGNhc2UgJ291dGRvb3InOlxuICAgICAgICByZXR1cm4gJ2JnLWJsdWUtMTAwIHRleHQtYmx1ZS04MDAgYm9yZGVyLWJsdWUtMzAwJ1xuICAgICAgY2FzZSAnYm90aCc6XG4gICAgICAgIHJldHVybiAnYmctcHVycGxlLTEwMCB0ZXh0LXB1cnBsZS04MDAgYm9yZGVyLXB1cnBsZS0zMDAnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2JnLWdyYXktMTAwIHRleHQtZ3JheS04MDAgYm9yZGVyLWdyYXktMzAwJ1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbGcgcC00IGhvdmVyOmJnLWdyYXktNTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgbWItMlwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGZvbnQtbW9ub1wiPnttb2RlbC5tb2RlbE51bWJlcn08L2gzPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMiBweS0xIHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1mdWxsIGJvcmRlciAke2dldE1vZGVsVHlwZUNvbG9yKG1vZGVsLm1vZGVsVHlwZSl9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge21vZGVsLm1vZGVsVHlwZX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7bW9kZWwuZGVzY3JpcHRpb24gJiYgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG1iLTJcIj57bW9kZWwuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1ncmF5LTQwMFwiPlxuICAgICAgICAgICAgSUQ6IHttb2RlbC5pZH0g4oCiIENyZWF0ZWQ6IHtuZXcgRGF0ZShtb2RlbC5jcmVhdGVkQXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBtbC00XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25FZGl0KG1vZGVsKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTMgcHktMSB0ZXh0LXNtIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBob3ZlcjpiZy1ibHVlLTcwMCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkRlbGV0ZShtb2RlbCl9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJweC0zIHB5LTEgdGV4dC1zbSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBob3ZlcjpiZy1yZWQtNzAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1yZWQtNTAwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBEZWxldGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5jb25zdCBUSUNNb2RlbHM6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbbW9kZWxzLCBzZXRNb2RlbHNdID0gdXNlU3RhdGU8VElDTW9kZWxbXT4oW10pXG4gIGNvbnN0IFtmaWx0ZXJlZE1vZGVscywgc2V0RmlsdGVyZWRNb2RlbHNdID0gdXNlU3RhdGU8VElDTW9kZWxbXT4oW10pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3N1Y2Nlc3MsIHNldFN1Y2Nlc3NdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICAvLyBNb2RhbCBzdGF0ZXNcbiAgY29uc3QgW2lzTW9kYWxPcGVuLCBzZXRJc01vZGFsT3Blbl0gP
451SB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzRWRpdE1vZGFsT3Blbiwgc2V0SXNFZGl0TW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZm9ybUxvYWRpbmcsIHNldEZvcm1Mb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZWRpdGluZ01vZGVsLCBzZXRFZGl0aW5nTW9kZWxdID0gdXNlU3RhdGU8VElDTW9kZWwgfCBudWxsPihudWxsKVxuXG4gIC8vIEZpbHRlciBzdGF0ZXNcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW2ZpbHRlclR5cGUsIHNldEZpbHRlclR5cGVdID0gdXNlU3RhdGU8c3RyaW5nPignYWxsJylcbiAgY29uc3QgW3NvcnRCeSwgc2V0U29ydEJ5XSA9IHVzZVN0YXRlPHN0cmluZz4oJ21vZGVsTnVtYmVyJylcblxuICAvLyBBdmFpbGFibGUgbW9kZWwgdHlwZXMgZnJvbSBkYXRhXG4gIGNvbnN0IGF2YWlsYWJsZU1vZGVsVHlwZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQobW9kZWxzLm1hcCgobW9kZWwpID0+IG1vZGVsLm1vZGVsVHlwZSkpXG4gICAgcmV0dXJuIEFycmF5LmZyb20odHlwZXMpLnNvcnQoKVxuICB9LCBbbW9kZWxzXSlcblxuICAvLyBGb3JtIGRhdGFcbiAgY29uc3QgW2Zvcm1EYXRhLCBzZXRGb3JtRGF0YV0gPSB1c2VTdGF0ZSh7XG4gICAgbW9kZWxOdW1iZXI6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICBtb2RlbFR5cGU6ICcnLFxuICB9KVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmV0Y2hNb2RlbHMoKVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEFwcGx5IGZpbHRlcnMgd2hlbmV2ZXIgbW9kZWxzLCBzZWFyY2hRdWVyeSwgZmlsdGVyVHlwZSwgb3Igc29ydEJ5IGNoYW5nZXNcbiAgICBsZXQgZmlsdGVyZWQgPSBtb2RlbHNcblxuICAgIC8vIEZpbHRlciBieSBzZWFyY2ggcXVlcnlcbiAgICBpZiAoc2VhcmNoUXVlcnkudHJpbSgpKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKClcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKFxuICAgICAgICAobW9kZWwpID0+XG4gICAgICAgICAgbW9kZWwubW9kZWxOdW1iZXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHxcbiAgICAgICAgICAobW9kZWwuZGVzY3JpcHRpb24gJiYgbW9kZWwuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IHR5cGVcbiAgICBpZiAoZmlsdGVyVHlwZSAhPT0gJ2FsbCcpIHtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChtb2RlbCkgPT4gbW9kZWwubW9kZWxUeXBlID09PSBmaWx0ZXJUeXBlKVxuICAgIH1cblxuICAgIC8vIFNvcnQgcmVzdWx0c1xuICAgIGZpbHRlcmVkID0gWy4uLmZpbHRlcmVkXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgICBjYXNlICdpZCc6XG4gICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkXG4gICAgICAgIGNhc2UgJ21vZGVsTnVtYmVyJzpcbiAgICAgICAgICByZXR1cm4gYS5tb2RlbE51bWJlci5sb2NhbGVDb21wYXJlKGIubW9kZWxOdW1iZXIpXG4gICAgICAgIGNhc2UgJ21vZGVsVHlwZSc6XG4gICAgICAgICAgcmV0dXJuIGEubW9kZWxUeXBlLmxvY2FsZUNvbXBhcmUoYi5tb2RlbFR5cGUpXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2V0RmlsdGVyZWRNb2RlbHMoZmlsdGVyZWQpXG4gIH0sIFttb2RlbHMsIHNlYXJjaFF1ZXJ5LCBmaWx0ZXJUeXBlLCBzb3J0QnldKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN1Y2Nlc3MgfHwgZXJyb3IpIHtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHNldFN1Y2Nlc3MobnVsbClcbiAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgIH0sIDUwMDApXG4gICAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIH1cbiAgfSwgW3N1Y2Nlc3MsIGVycm9yXSlcblxuICBjb25zdCBmZXRjaE1vZGVscyA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCgnL2FwaS90aWMtbW9kZWxzJylcbiAgICAgIHNldE1vZGVscyhyZXNwb25zZS5kYXRhKVxuICAgICAgc2V0RmlsdGVyZWRNb2RlbHMocmVzcG9uc2UuZGF0YSlcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgVElDIG1vZGVsczonLCBlcnIpXG4gICAgICBzZXRFcnJvcihlcnIucmVzcG9uc2U/LmRhdGE/LmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBUSUMgbW9kZWxzJylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChcbiAgICBlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50PlxuICApID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIHZhbHVlIH0gPSBlLnRhcmdldFxuICAgIHNldEZvcm1EYXRhKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtuYW1lXTogdmFsdWUsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoZTogUmVhY3QuRm9ybUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgc2V0Rm9ybUxvYWRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIHNldFN1Y2Nlc3MobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBheGlvcy5wb3N0KCcvYXBpL3RpYy1tb2RlbHMnLCB7XG4gICAgICAgIG1vZGVsTnVtYmVyOiBmb3JtRGF0YS5tb2RlbE51bWJlcixcbiAgICAgICAgZGVzY3JpcHRpb246IGZvcm1EYXRhLmRlc2NyaXB0aW9uIHx8IG51bGwsXG4gICAgICAgIG1vZGVsVHlwZTogZm9ybURhdGEubW9kZWxUeXBlLFxuICAgICAgfSlcblxuICAgICAgc2V0U3VjY2VzcygnVElDIE1vZGVsIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IScpXG4gICAgICBoYW5kbGVSZXNldCgpXG4gICAgICBjbG9zZU1vZGFsKClcbiAgICAgIGZldGNoTW9kZWxzKClcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgVElDIG1vZGVsOicsIGVycilcbiAgICAgIHNldEVycm9yKGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBjcmVhdGUgVElDIG1vZGVsJylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Rm9ybUxvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUmVzZXQgP
451SAoKSA9PiB7XG4gICAgc2V0Rm9ybURhdGEoe1xuICAgICAgbW9kZWxOdW1iZXI6ICcnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgbW9kZWxUeXBlOiAnaW5kb29yJyxcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgb3Blbk1vZGFsID0gKCkgPT4ge1xuICAgIGhhbmRsZVJlc2V0KClcbiAgICBzZXRJc01vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgY29uc3QgY2xvc2VNb2RhbCA9ICgpID0+IHtcbiAgICBzZXRJc01vZGFsT3BlbihmYWxzZSlcbiAgICBoYW5kbGVSZXNldCgpXG4gIH1cblxuICBjb25zdCBoYW5kbGVFZGl0ID0gKG1vZGVsOiBUSUNNb2RlbCkgPT4ge1xuICAgIHNldEVkaXRpbmdNb2RlbChtb2RlbClcbiAgICBzZXRGb3JtRGF0YSh7XG4gICAgICBtb2RlbE51bWJlcjogbW9kZWwubW9kZWxOdW1iZXIsXG4gICAgICBkZXNjcmlwdGlvbjogbW9kZWwuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBtb2RlbFR5cGU6IG1vZGVsLm1vZGVsVHlwZSxcbiAgICB9KVxuICAgIHNldElzRWRpdE1vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlVXBkYXRlID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGlmICghZWRpdGluZ01vZGVsKSByZXR1cm5cblxuICAgIHNldEZvcm1Mb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcbiAgICBzZXRTdWNjZXNzKG51bGwpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXhpb3MucHV0KGAvYXBpL3RpYy1tb2RlbHMvJHtlZGl0aW5nTW9kZWwuaWR9YCwge1xuICAgICAgICBtb2RlbE51bWJlcjogZm9ybURhdGEubW9kZWxOdW1iZXIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtRGF0YS5kZXNjcmlwdGlvbiB8fCBudWxsLFxuICAgICAgICBtb2RlbFR5cGU6IGZvcm1EYXRhLm1vZGVsVHlwZSxcbiAgICAgIH0pXG5cbiAgICAgIHNldFN1Y2Nlc3MoJ1RJQyBNb2RlbCB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnKVxuICAgICAgY2xvc2VFZGl0TW9kYWwoKVxuICAgICAgZmV0Y2hNb2RlbHMoKVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBUSUMgbW9kZWw6JywgZXJyKVxuICAgICAgc2V0RXJyb3IoZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCAnRmFpbGVkIHRvIHVwZGF0ZSBUSUMgbW9kZWwnKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRGb3JtTG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBjbG9zZUVkaXRNb2RhbCA9ICgpID0+IHtcbiAgICBzZXRJc0VkaXRNb2RhbE9wZW4oZmFsc2UpXG4gICAgc2V0RWRpdGluZ01vZGVsKG51bGwpXG4gICAgaGFuZGxlUmVzZXQoKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlID0gYXN5bmMgKG1vZGVsOiBUSUNNb2RlbCkgPT4ge1xuICAgIGlmICghY29uZmlybShgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBtb2RlbCBcIiR7bW9kZWwubW9kZWxOdW1iZXJ9XCI/YCkpIHtcbiAgICAgIHJldHVyblxuICAgI
451H1cblxuICAgIHNldEVycm9yKG51bGwpXG4gICAgc2V0U3VjY2VzcyhudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF4aW9zLmRlbGV0ZShgL2FwaS90aWMtbW9kZWxzLyR7bW9kZWwuaWR9YClcbiAgICAgIHNldFN1Y2Nlc3MoJ1RJQyBNb2RlbCBkZWxldGVkIHN1Y2Nlc3NmdWxseSEnKVxuICAgICAgZmV0Y2hNb2RlbHMoKVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWxldGluZyBUSUMgbW9kZWw6JywgZXJyKVxuICAgICAgc2V0RXJyb3IoZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCAnRmFpbGVkIHRvIGRlbGV0ZSBUSUMgbW9kZWwnKVxuICAgIH1cbiAgfVxuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyIG14LWF1dG8gcHgtNCBweS04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgcHktMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiBoLTEwIHctMTAgdGV4dC1ibHVlLTUwMCBteC1hdXRvIG1iLTRcIj5cbiAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3BhY2l0eS0yNVwiXG4gICAgICAgICAgICAgICAgY3g9XCIxMlwiXG4gICAgICAgICAgICAgICAgY3k9XCIxMlwiXG4gICAgICAgICAgICAgICAgcj1cIjEwXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3BhY2l0eS03NVwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwXCI+TG9hZGluZyBUSUMgTW9kZWxzLi4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBweC00IHB5LThcIj5cbiAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTYgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTN4bCBmb250LWJvbGQgdGV4dC1ncmF5LTkwMFwiPlRJQyBNb2RlbHM8L2gxPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17b3Blbk1vZGFsfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgcHktMiBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgaG92ZXI6YmctYmx1ZS03MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOnJpbmctb2Zmc2V0LTJcIlxuICAgICAgICA+XG4gICAgICAgICAgQ3JlYXRlIFRJQyBNb2RlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogR2xvYmFsIE1lc3NhZ2VzICovfVxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IHAtNCBiZy1yZWQtMTAwIGJvcmRlciBib3JkZXItcmVkLTQwMCB0ZXh0LXJlZC03MDAgcm91bmRlZC1tZFwiPlxuICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7c3VjY2VzcyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNiBwLTQgYmctZ3JlZW4tMTAwIGJvcmRlciBib3JkZXItZ3JlZW4tNDAwIHRleHQtZ3JlZW4tNzAw
451IHJvdW5kZWQtbWRcIj5cbiAgICAgICAgICB7c3VjY2Vzc31cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7LyogRmlsdGVycyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2hpdGUgcm91bmRlZC1sZyBzaGFkb3ctbWQgcC02IG1iLTZcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0zIGdhcC00XCI+XG4gICAgICAgICAgey8qIFNlYXJjaCAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzZWFyY2hcIiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTZWFyY2ggTW9kZWxzXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgaWQ9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBtb2RlbCBudW1iZXIgb3IgZGVzY3JpcHRpb24uLi5cIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFR5cGUgRmlsdGVyICovfVxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cImZpbHRlclR5cGVcIiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiPlxuICAgICAgICAgICAgICBGaWx0ZXIgYnkgVHlwZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXJUeXBlXCJcbiAgICAgICAgICAgICAgdmFsdWU9e2ZpbHRlclR5cGV9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0RmlsdGVyVHlwZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBUeXBlczwvb3B0aW9uPlxuICAgICAgICAgICAgICB7YXZhaWxhYmxlTW9kZWxUeXBlcy5tYXAoKHR5cGUpID0+IChcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17dHlwZX0gdmFsdWU9e3R5cGV9PlxuICAgICAgICAgICAgICAgICAge3R5cGV9XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogU29ydCBCeSAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0QnlcIiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTb3J0IEJ5XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBpZD1cInNvcnRCeVwiXG4gICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9kZWxOdW1iZXJcIj5Nb2RlbCBOdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlkXCI+SUQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vZGVsVHlwZVwiPk1vZGVsIFR5cGU8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgdGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgU2hvd2luZyB7ZmlsdGVyZWRNb2RlbHMubGVuZ3RofSBvZiB7bW9kZWxzLmxlbmd0aH0gbW9kZWxzXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBNb2RlbHMgTGlzdCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
451pdGUgcm91bmRlZC1sZyBzaGFkb3ctbWQgcC02XCI+XG4gICAgICAgIHtmaWx0ZXJlZE1vZGVscy5sZW5ndGggPiAwID8gKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICB7ZmlsdGVyZWRNb2RlbHMubWFwKChtb2RlbCkgPT4gKFxuICAgICAgICAgICAgICA8VElDTW9kZWxJdGVtXG4gICAgICAgICAgICAgICAga2V5PXttb2RlbC5pZH1cbiAgICAgICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICAgICAgb25FZGl0PXtoYW5kbGVFZGl0fVxuICAgICAgICAgICAgICAgIG9uRGVsZXRlPXtoYW5kbGVEZWxldGV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTEyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtZ3JheS00MDAgbWItNFwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy0xNiBoLTE2IG14LWF1dG9cIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoP
451XsxfVxuICAgICAgICAgICAgICAgICAgZD1cIk05IDEyaDZtLTYgNGg2bTIgNUg3YTIgMiAwIDAxLTItMlY1YTIgMiAwIDAxMi0yaDUuNTg2YTEgMSAwIDAxLjcwNy4yOTNsNS40MTQgNS40MTRhMSAxIDAgMDEuMjkzLjcwN1YxOWEyIDIgMCAwMS0yIDJ6XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBtYi0yXCI+Tm8gTW9kZWxzIEZvdW5kPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAge3NlYXJjaFF1ZXJ5IHx8IGZpbHRlclR5cGUgIT09ICdhbGwnXG4gICAgICAgICAgICAgICAgPyAnTm8gbW9kZWxzIG1hdGNoIHlvdXIgZmlsdGVycy4gVHJ5IGFkanVzdGluZyB5b3VyIHNlYXJjaC4nXG4gICAgICAgICAgICAgICAgOiAnR2V0IHN0YXJ0ZWQgYnkgY3JlYXRpbmcgeW91ciBmaXJzdCBUSUMgbW9kZWwuJ31cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ3JlYXRlIE1vZGFsICovfVxuICAgICAge2lzTW9kYWxPcGVuICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCBpbnNldC0wIGJnLWJsYWNrIGJnLW9wYWNpdHktNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgei01MCBwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtbGcgc2hhZG93LXhsIHctZnVsbCBtYXgtdy0yeGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC02XCI+XG4gICAgICAgICAgICAgIHsvKiBNb2RhbCBIZWFkZXIgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIG1iLTZcIj5cbiAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtZ3JheS05MDBcIj5DcmVhdGUgVElDIE1vZGVsPC9oMj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtjbG9zZU1vZGFsfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTQwMCBob3Zlcjp0ZXh0LWdyYXktNjAwIHRleHQtMnhsIGZvbnQtYm9sZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICAgIHsvKiBNb2RlbCBOdW1iZXIgKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwibW9kZWxOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIE1vZGVsIE51bWJlciAqXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJtb2RlbE51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJtb2RlbE51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5tb2RlbE51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMCBmb250LW1vbm9cIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG1vZGVsIG51bWJlciAoZS5nLiwgTVhaLTJDMjBOQUhaKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIERlc2NyaXB0aW9uICovfVxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICBpZD1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1EYXRhLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIHJvd3M9ezN9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBtb2RlbCBkZXNjcmlwdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7LyogTW9kZWwgVHlwZSAqL31cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJtb2RlbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIE1vZGVsIFR5cGUgKlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eX
451BlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwibW9kZWxUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm1vZGVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5tb2RlbFR5cGV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIGluZG9vciwgb3V0ZG9vciwgYm90aCwgZXRjLlwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgRW50ZXIgdGhlIG1vZGVsIHR5cGUgKGUuZy4sIGluZG9vciwgb3V0ZG9vciwgYm90aClcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIHsvKiBGb3JtIEFjdGlvbnMgKi99XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtNCBwdC00XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Zm9ybUxvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSBweS0yIHB4LTQgcm91bmRlZC1tZCB0ZXh0LXdoaXRlIGZvbnQtbWVkaXVtICR7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUxvYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWdyYXktNDAwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLWJsdWUtNjAwIGhvdmVyOmJnLWJsdWUtNzAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpyaW5nLW9mZnNldC0yJ1xuICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2Zvcm1Mb2FkaW5nID8gJ0NyZWF0aW5nLi4uJyA6ICdDcmVhdGUgTW9kZWwnfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2Nsb3NlTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgdGV4dC1ncmF5LTcwMCBmb250LW1lZGl1bSBob3ZlcjpiZy1ncmF5LTUwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpyaW5nLW9mZnNldC0yXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEVkaXQgTW9kYWwgKi99XG4gICAgICB7aXNFZGl0TW9kYWxPcGVuICYmIGVkaXRpbmdNb2RlbCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgaW5zZXQtMCBiZy1ibGFjayBiZy1vcGFjaXR5LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHotNTAgcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy14bCB3LWZ1bGwgbWF4LXctMnhsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICB7LyogTW9kYWwgSGVhZGVyICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBtYi02XCI+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwXCI+RWRpdCBUSUMgTW9kZWw8L2gyPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2Nsb3NlRWRpdE1vZGFsfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTQwMCBob3Zlcjp0ZXh0LWdyYXktNjAwIHRleHQtMnhsIGZvbnQtYm9sZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVVcGRhdGV9IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICAgIHsvKiBNb2RlbCBOdW1iZXIgKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiZWRpdE1vZGVsTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBNb2RlbCBOdW1iZXIgKlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdE1vZGVsTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm1vZGVsTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1EYXRhLm1vZGVsTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgI
451HJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwIGZvbnQtbW9ub1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbW9kZWwgbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7LyogRGVzY3JpcHRpb24gKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiZWRpdERlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICBpZD1cImVkaXREZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICByb3dzPXszfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbW9kZWwgZGVzY3JpcHRpb24gKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIE1vZGVsIFR5cGUgKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiZWRpdE1vZGVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBtYi0xXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgTW9kZWwgVHlwZSAqXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJlZGl0TW9kZWxUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm1vZGVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5tb2RlbFR5cGV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIGluZG9vciwgb3V0ZG9vciwgYm90aCwgZXRjLlwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIEZvcm0gQWN0aW9ucyAqL31cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggc3BhY2UteC00IHB0LTRcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtmb3JtTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZmxleC0xIHB5LTIgcHgtNCByb3VuZGVkLW1kIHRleHQtd2hpdGUgZm9udC1tZWRpdW0gJHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtTG9hZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctZ3JheS00MDAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctYmx1ZS02MDAgaG92ZXI6YmctYmx1ZS03MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOnJpbmctb2Zmc2V0LTInXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7Zm9ybUxvYWRpbmcgPyAnVXBkYXRpbmcuLi4nIDogJ1VwZGF0ZSBNb2RlbCd9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17Y2xvc2VFZGl0TW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgdGV4dC1ncmF5LTcwMCBmb250LW1lZGl1bSBob3ZlcjpiZy1ncmF5LTUwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpyaW5nLW9mZnNldC0yXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBUSUNNb2RlbHNcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxTQUFTLFVBQVUsaUJBQWlCO0FBQzNDLE9BQU8sV0FBVztBQWlCbEIsTUFBTSxlQUE0QyxDQUFDLEVBQUUsT0FBTyxRQUFRLFNBQVMsTUFBTTtBQUNqRixRQUFNLG9CQUFvQixDQUFDLFNBQWlCO0F
451BQzFDLFlBQVEsTUFBTTtBQUFBLE1BQ1osS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1Q7QUFDRSxlQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFFQSxTQUNFLG9DQUFDLFNBQUksV0FBVSw4RUFDYixvQ0FBQyxTQUFJLFdBQVUsc0NBQ2Isb0NBQUMsU0FBSSxXQUFVLG9CQUNiLG9DQUFDLFNBQUksV0FBVSxrQ0FDYixvQ0FBQyxRQUFHLFdBQVUsbURBQWlELE1BQU0sV0FBWSxHQUNqRjtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsV0FBVyxxREFBcUQsa0JBQWtCLE1BQU0sU0FBUyxDQUFDO0FBQUE7QUFBQSxJQUVqRyxNQUFNO0FBQUEsRUFDVCxDQUNGLEdBQ0MsTUFBTSxlQUFlLG9DQUFDLE9BQUUsV0FBVSxnQ0FBOEIsTUFBTSxXQUFZLEdBQ25GLG9DQUFDLFNBQUksV0FBVSwyQkFBd0IsUUFDaEMsTUFBTSxJQUFHLGdCQUFhLElBQUksS0FBSyxNQUFNLFNBQVMsRUFBRSxtQkFBbUIsQ0FDMUUsQ0FDRixHQUNBLG9DQUFDLFNBQUksV0FBVSxrQ0FDYjtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsU0FBUyxNQUFNLE9BQU8sS0FBSztBQUFBLE1BQzNCLFdBQVU7QUFBQTtBQUFBLElBQ1g7QUFBQSxFQUVELEdBQ0E7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLFNBQVMsTUFBTSxTQUFTLEtBQUs7QUFBQSxNQUM3QixXQUFVO0FBQUE7QUFBQSxJQUNYO0FBQUEsRUFFRCxDQUNGLENBQ0YsQ0FDRjtBQUVKO0FBRUEsTUFBTSxZQUFzQixNQUFNO0FBQ2hDLFFBQU0sQ0FBQyxRQUFRLFNBQVMsSUFBSSxTQUFxQixDQUFDLENBQUM7QUFDbkQsUUFBTSxDQUFDLGdCQUFnQixpQkFBaUIsSUFBSSxTQUFxQixDQUFDLENBQUM7QUFDbkUsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQVMsSUFBSTtBQUMzQyxRQUFN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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.