{"page":1,"pageSize":1,"total":52,"totalPages":52,"versions":[{"changelog":"","comfy_node_extract_status":"pending","createdAt":"2026-09-13T12:13:57.591372Z","dependencies":["pillow\u003e=10.3.0","color-matcher","matplotlib"],"deprecated":false,"downloadUrl":"https://cdn.comfy.org/kijai/comfyui-kjnodes/1.5.2/node.zip","id":"61c9722d-c060-4c44-a643-75a258dc40a9","node_id":"comfyui-kjnodes","status":"NodeVersionStatusFlagged","status_reason":"[\n    {\n        \"admin_tags\": [\n            \"any-code-execute\",\n            \"obfuscated-code\"\n        ],\n        \"code_snippet\": \"4538 |     @classmethod\\n4539 |     def __init__(cls):\\n4540 |         try:\\n4541 |             cls.vhs_nodes = importlib.import_module(\\\"ComfyUI-VideoHelperSuite.videohelpersuite\\\")\\n4542 |         except ImportError:\\n4543 |             try:\\n4544 |                 cls.vhs_nodes = importlib.import_module(\\\"comfyui-videohelpersuite.videohelpersuite\\\")\",\n        \"description\": \"Detects bytecode manipulation and import evasion techniques\",\n        \"file_path\": \"nodes/image_nodes.py\",\n        \"issue_type\": \"python_bytecode_manipulation\",\n        \"line_number\": 4541,\n        \"line_snippet\": \"cls.vhs_nodes = importlib.import_module(\\\"ComfyUI-VideoHelperSuite.videohelpersuite\\\")\",\n        \"metadata\": {\n            \"confidence\": 95,\n            \"matched_patterns\": [\n                \"$importlib_direct\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"nodes/image_nodes.py\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$importlib_direct\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"            cls.vhs_nodes = importlib.import_module(\\\"ComfyUI-VideoHelperSuite.videohelpersuite\\\")\\n\",\n                                    \"line_number\": 4541,\n                                    \"matched_data\": \"importlib.import_module(\\\"ComfyUI-VideoHelperSuite.videohelpersuite\\\")\",\n                                    \"matched_length\": 68,\n                                    \"offset\": 34\n                                },\n                                {\n                                    \"line\": \"                cls.vhs_nodes = importlib.import_module(\\\"comfyui-videohelpersuite.videohelpersuite\\\")\\n\",\n                                    \"line_number\": 4544,\n                                    \"matched_data\": \"importlib.import_module(\\\"comfyui-videohelpersuite.videohelpersuite\\\")\",\n                                    \"matched_length\": 68,\n                                    \"offset\": 38\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1027 Obfuscated Files or Information\",\n                \"attack_id2\": \"T1055.001 Dynamic-link Library Injection\",\n                \"category\": \"Defense Evasion\",\n                \"confidence_note\": \"All patterns in this rule have high confidence (90-100%) as they target specific bytecode/import manipulation APIs.\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects bytecode manipulation and import evasion techniques\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1027/\",\n                \"severity\": \"3\",\n                \"version\": \"1.1\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-code-execute\",\n            \"obfuscated-code\"\n        ],\n        \"code_snippet\": \"1714 | \\n1715 | def _resolve_qattn(arch):\\n1716 |     try:\\n1717 |         core = importlib.import_module(\\\"sageattention.core\\\")\\n1718 |     except Exception:\\n1719 |         return None\\n1720 |     candidates = [getattr(core, f\\\"_qattn_{arch}\\\", None), getattr(core, f\\\"{arch}_compile\\\", None)]\",\n        \"description\": \"Detects bytecode manipulation and import evasion techniques\",\n        \"file_path\": \"nodes/ltxv_nodes.py\",\n        \"issue_type\": \"python_bytecode_manipulation\",\n        \"line_number\": 1717,\n        \"line_snippet\": \"core = importlib.import_module(\\\"sageattention.core\\\")\",\n        \"metadata\": {\n            \"confidence\": 95,\n            \"matched_patterns\": [\n                \"$importlib_direct\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"nodes/ltxv_nodes.py\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$importlib_direct\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"        core = importlib.import_module(\\\"sageattention.core\\\")\\n\",\n                                    \"line_number\": 1717,\n                                    \"matched_data\": \"importlib.import_module(\\\"sageattention.core\\\")\",\n                                    \"matched_length\": 45,\n                                    \"offset\": 15\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1027 Obfuscated Files or Information\",\n                \"attack_id2\": \"T1055.001 Dynamic-link Library Injection\",\n                \"category\": \"Defense Evasion\",\n                \"confidence_note\": \"All patterns in this rule have high confidence (90-100%) as they target specific bytecode/import manipulation APIs.\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects bytecode manipulation and import evasion techniques\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1027/\",\n                \"severity\": \"3\",\n                \"version\": \"1.1\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-code-execute\",\n            \"obfuscated-code\"\n        ],\n        \"code_snippet\": \"2074 |     def load_weights(self, list_of_floats: list[float],\\n2075 |                      uncond_multiplier: float=1.0, cn_extras: dict[str]={}):\\n2076 |         \\n2077 |         adv_control = importlib.import_module(\\\"ComfyUI-Advanced-ControlNet.adv_control\\\")\\n2078 |         ControlWeights = adv_control.utils.ControlWeights\\n2079 |         TimestepKeyframeGroup = adv_control.utils.TimestepKeyframeGroup\\n2080 |         TimestepKeyframe = adv_control.utils.TimestepKeyframe\",\n        \"description\": \"Detects bytecode manipulation and import evasion techniques\",\n        \"file_path\": \"nodes/nodes.py\",\n        \"issue_type\": \"python_bytecode_manipulation\",\n        \"line_number\": 2077,\n        \"line_snippet\": \"adv_control = importlib.import_module(\\\"ComfyUI-Advanced-ControlNet.adv_control\\\")\",\n        \"metadata\": {\n            \"confidence\": 95,\n            \"matched_patterns\": [\n                \"$importlib_direct\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"nodes/nodes.py\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$importlib_direct\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"        adv_control = importlib.import_module(\\\"ComfyUI-Advanced-ControlNet.adv_control\\\")\\n\",\n                                    \"line_number\": 2077,\n                                    \"matched_data\": \"importlib.import_module(\\\"ComfyUI-Advanced-ControlNet.adv_control\\\")\",\n                                    \"matched_length\": 66,\n                                    \"offset\": 22\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1027 Obfuscated Files or Information\",\n                \"attack_id2\": \"T1055.001 Dynamic-link Library Injection\",\n                \"category\": \"Defense Evasion\",\n                \"confidence_note\": \"All patterns in this rule have high confidence (90-100%) as they target specific bytecode/import manipulation APIs.\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects bytecode manipulation and import evasion techniques\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1027/\",\n                \"severity\": \"3\",\n                \"version\": \"1.1\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"system-modification\"\n        ],\n        \"code_snippet\": \"24 | \\n25 | import comfy.ops\\n26 | \\n27 | PROFILE = os.environ.get(\\\"KJNODES_TRITON_PROFILE\\\", \\\"\\\") == \\\"1\\\"\\n28 | CL3D = torch.channels_last_3d\\n29 | \\n30 | import comfy.model_patcher\",\n        \"description\": \"Detects environment variable manipulation and reading\",\n        \"file_path\": \"nodes/triton_vae.py\",\n        \"issue_type\": \"python_environment_manipulation\",\n        \"line_number\": 27,\n        \"line_snippet\": \"PROFILE = os.environ.get(\\\"KJNODES_TRITON_PROFILE\\\", \\\"\\\") == \\\"1\\\"\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$env_read2\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"nodes/triton_vae.py\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$env_read2\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"PROFILE = os.environ.get(\\\"KJNODES_TRITON_PROFILE\\\", \\\"\\\") == \\\"1\\\"\\n\",\n                                    \"line_number\": 27,\n                                    \"matched_data\": \"os.environ.get(\",\n                                    \"matched_length\": 15,\n                                    \"offset\": 10\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1574.007 Environment Variable Hijacking\",\n                \"category\": \"Defense Evasion\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects environment variable manipulation and reading\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1574/007/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"18 | \\t\\t\\tfor (let i = 0; i \\u003c nextTo.inputs.length; i++) {\\n19 | \\t\\t\\t\\tif (!nextTo.inputs[i].link) {\\n20 | \\t\\t\\t\\t\\tnode.pos[1] += i * (node.size[1] + 32);\\n21 | \\t\\t\\t\\t\\tnode.connect(0, nextTo, i);\\n22 | \\t\\t\\t\\t\\tbreak;\\n23 | \\t\\t\\t\\t}\\n24 | \\t\\t\\t}\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/contextmenu.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 21,\n        \"line_snippet\": \"node.connect(0, nextTo, i);\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\",\n                \"$socket4\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/contextmenu.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\tnode.connect(0, nextTo, i);\\n\",\n                                    \"line_number\": 21,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 9\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\t\\t\\tnextTo.connect(o, node, i);\\n\",\n                                    \"line_number\": 35,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 13\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\t\\t\\t\\toptPass.nodeFrom.connect(slotIdx, node, 0);\\n\",\n                                    \"line_number\": 157,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 24\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\t\\t\\t\\tnode.connect(0, optPass.nodeTo, slotIdx);\\n\",\n                                    \"line_number\": 162,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 12\n                                }\n                            ]\n                        },\n                        {\n                            \"identifier\": \"$socket4\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\tconst origShowConnectionMenu = app.canvas.showConnectionMenu.bind(app.canvas);\\n\",\n                                    \"line_number\": 124,\n                                    \"matched_data\": \".bind(\",\n                                    \"matched_length\": 6,\n                                    \"offset\": 62\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"162 | \\n163 | function connectPlanned(planned, graph) {\\n164 | \\tfor (const p of planned) {\\n165 | \\t\\tp.sourceNode.connect(p.outIdx, p.targetNode, p.inIdx);\\n166 | \\t}\\n167 | \\tgraph.change();\\n168 | }\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/fillconnect.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 165,\n        \"line_snippet\": \"p.sourceNode.connect(p.outIdx, p.targetNode, p.inIdx);\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/fillconnect.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\tp.sourceNode.connect(p.outIdx, p.targetNode, p.inIdx);\\n\",\n                                    \"line_number\": 165,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 14\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"62 |             const src = app.graph.getNodeById(link.origin_id);\\n63 |             const newSlot = newNode.findInputSlot?.(inp.name);\\n64 |             if (!src || newSlot == null || newSlot \\u003c 0) continue;\\n65 |             try { src.connect(link.origin_slot, newNode, newSlot); } catch {}\\n66 |         }\\n67 | \\n68 |         // Reconnect outputs by name.\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/fix_node.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 65,\n        \"line_snippet\": \"try { src.connect(link.origin_slot, newNode, newSlot); } catch {}\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/fix_node.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"            try { src.connect(link.origin_slot, newNode, newSlot); } catch {}\\n\",\n                                    \"line_number\": 65,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 21\n                                },\n                                {\n                                    \"line\": \"                try { newNode.connect(i, tgt, link.target_slot); } catch {}\\n\",\n                                    \"line_number\": 77,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 29\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"313 | \\t\\t\\t\\t\\t\\tnavigator.mediaDevices.getUserMedia({ audio: true }).then(stream =\\u003e {\\n314 | \\t\\t\\t\\t\\t\\t\\tmicrophoneStream = stream;\\n315 | \\t\\t\\t\\t\\t\\t\\tconst microphone = audioContext.createMediaStreamSource(stream);\\n316 | \\t\\t\\t\\t\\t\\t\\tmicrophone.connect(analyser);\\n317 | \\t\\t\\t\\t\\t\\t\\tupdateWidgetValueInRealTime();\\n318 | \\t\\t\\t\\t\\t\\t}).catch(error =\\u003e {\\n319 | \\t\\t\\t\\t\\t\\t\\tconsole.error('Access to microphone was denied or an error occurred:', error);\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/jsnodes.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 316,\n        \"line_snippet\": \"microphone.connect(analyser);\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/jsnodes.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\t\\t\\tmicrophone.connect(analyser);\\n\",\n                                    \"line_number\": 316,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 17\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"121 | \\tconst targetSlot = link.target_slot;\\n122 | \\n123 | \\ttargetNode.disconnectInput(targetSlot);\\n124 | \\toriginNode.connect(originSlot, node, slots.inputSlot);\\n125 | \\tnode.connect(slots.outputSlot, targetNode, targetSlot);\\n126 | \\n127 | \\tgraph.change();\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/node_insert.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 124,\n        \"line_snippet\": \"originNode.connect(originSlot, node, slots.inputSlot);\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/node_insert.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\toriginNode.connect(originSlot, node, slots.inputSlot);\\n\",\n                                    \"line_number\": 124,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 11\n                                },\n                                {\n                                    \"line\": \"\\tnode.connect(slots.outputSlot, targetNode, targetSlot);\\n\",\n                                    \"line_number\": 125,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 5\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"151 | \\t\\tif (!inputAssignments.has(inp)) continue;\\n152 | \\t\\tconst originNode = graph.getNodeById(inp.originNodeId);\\n153 | \\t\\tif (!originNode) continue;\\n154 | \\t\\toriginNode.connect(inp.originSlot, newNode, inputAssignments.get(inp));\\n155 | \\t}\\n156 | \\n157 | \\tconst outputAssignments = resolveAssignments(\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/nodeswap.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 154,\n        \"line_snippet\": \"originNode.connect(inp.originSlot, newNode, inputAssignments.get(inp));\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/nodeswap.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\toriginNode.connect(inp.originSlot, newNode, inputAssignments.get(inp));\\n\",\n                                    \"line_number\": 154,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 12\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tnewNode.connect(bestSlot, targetNode, tgt.targetSlot);\\n\",\n                                    \"line_number\": 168,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 10\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tsrcNode.connect(out.slotIndex, dstNode, tgt.targetSlot);\\n\",\n                                    \"line_number\": 182,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 10\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"287 | \\t\\tfor (const linkId of linksToRemove) graph.removeLink(linkId);\\n288 | \\n289 | \\t\\t// Connect source → Set node input\\n290 | \\t\\tnode.connect(slotIdx, setNode, 0);\\n291 | \\n292 | \\t\\t// Set the name widget\\n293 | \\t\\tsetNode.widgets[0].value = linkName;\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/setgetnodes.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 290,\n        \"line_snippet\": \"node.connect(slotIdx, setNode, 0);\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\",\n                \"$socket4\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/setgetnodes.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\tnode.connect(slotIdx, setNode, 0);\\n\",\n                                    \"line_number\": 290,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 6\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tgetNode.connect(0, targetNode, target.targetSlot);\\n\",\n                                    \"line_number\": 316,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 10\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tsourceNode.connect(sourceSlot, sgNodeForGetter, inputIndex);\\n\",\n                                    \"line_number\": 437,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 15\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\t\\t\\t\\t\\tsourceNode.connect(sourceSlot, parentTarget, parentLink.target_slot);\\n\",\n                                    \"line_number\": 450,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 21\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\t\\tnewInput.connect(targetNode.inputs[conn.targetSlot], targetNode);\\n\",\n                                    \"line_number\": 463,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 16\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tnewOutput.connect(sourceNode.outputs[sourceSlot], sourceNode);\\n\",\n                                    \"line_number\": 483,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 14\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\t\\t\\tsgNodeForSetter.connect(outputIndex, targetNode, conn.targetSlot);\\n\",\n                                    \"line_number\": 489,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 22\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tsourceNode.connect(sourceSlot, targetNode, conn.targetSlot);\\n\",\n                                    \"line_number\": 555,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 15\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\tif (isFrom) sourceNode.connect(slotIndex, newNode, 0);\\n\",\n                                    \"line_number\": 1557,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 27\n                                },\n                                {\n                                    \"line\": \"\\t\\t\\telse newNode.connect(0, sourceNode, slotIndex);\\n\",\n                                    \"line_number\": 1558,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 17\n                                }\n                            ]\n                        },\n                        {\n                            \"identifier\": \"$socket4\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\t\\t\\tconst origOnClick = constantWidget.onClick?.bind(constantWidget);\\n\",\n                                    \"line_number\": 954,\n                                    \"matched_data\": \".bind(\",\n                                    \"matched_length\": 6,\n                                    \"offset\": 49\n                                },\n                                {\n                                    \"line\": \"\\t\\tconst originalGraphToPrompt = app.graphToPrompt.bind(app);\\n\",\n                                    \"line_number\": 1573,\n                                    \"matched_data\": \".bind(\",\n                                    \"matched_length\": 6,\n                                    \"offset\": 51\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [\n            \"any-network-requests\"\n        ],\n        \"code_snippet\": \"90 | \\t\\t} else {\\n91 | \\t\\t\\tconst outNode = graph.getNodeById(outLink.target_id);\\n92 | \\t\\t\\tif (outNode) {\\n93 | \\t\\t\\t\\tinNode.connect(inLink.origin_slot, outNode, outLink.target_slot, inLink.parentId);\\n94 | \\t\\t\\t}\\n95 | \\t\\t}\\n96 | \\t}\",\n        \"description\": \"Detects network operations and potential data exfiltration patterns\",\n        \"file_path\": \"web/js/shake_to_disconnect.js\",\n        \"issue_type\": \"python_network_operations\",\n        \"line_number\": 93,\n        \"line_snippet\": \"inNode.connect(inLink.origin_slot, outNode, outLink.target_slot, inLink.parentId);\",\n        \"metadata\": {\n            \"confidence\": 90,\n            \"matched_patterns\": [\n                \"$socket3\"\n            ],\n            \"yara_matches\": [\n                {\n                    \"filepath\": \"web/js/shake_to_disconnect.js\",\n                    \"strings\": [\n                        {\n                            \"identifier\": \"$socket3\",\n                            \"instances\": [\n                                {\n                                    \"line\": \"\\t\\t\\t\\tinNode.connect(inLink.origin_slot, outNode, outLink.target_slot, inLink.parentId);\\n\",\n                                    \"line_number\": 93,\n                                    \"matched_data\": \".connect(\",\n                                    \"matched_length\": 9,\n                                    \"offset\": 10\n                                }\n                            ]\n                        }\n                    ]\n                }\n            ],\n            \"yara_meta\": {\n                \"attack_id1\": \"T1041 Exfiltration Over C2 Channel\",\n                \"attack_id2\": \"T1048 Exfiltration Over Alternative Protocol\",\n                \"category\": \"Exfiltration\",\n                \"date\": \"2025-06-30\",\n                \"description\": \"Detects network operations and potential data exfiltration patterns\",\n                \"reference\": \"https://attack.mitre.org/techniques/T1041/\",\n                \"severity\": \"3\",\n                \"version\": \"1.0\"\n            }\n        },\n        \"recommendation\": \"\",\n        \"scanner\": \"yara_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [],\n        \"code_snippet\": \"/**\\n * marked v12.0.1 - a markdown parser\\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\\n * https://github.com/markedjs/marked\\n */\\n\",\n        \"description\": \"Vendored file identified (upstream known, hash not verified)\",\n        \"file_path\": \"kjweb_async/marked.min.js\",\n        \"issue_type\": \"vendored_known\",\n        \"line_number\": 1,\n        \"line_snippet\": \"/**\",\n        \"metadata\": {\n            \"detection_reason\": \"minified JS file\",\n            \"ecosystem\": \"js\",\n            \"identification_method\": \"header_comment\",\n            \"upstream_package\": \"marked\",\n            \"upstream_version\": \"12.0.1\"\n        },\n        \"recommendation\": null,\n        \"scanner\": \"provenance_scan\",\n        \"severity\": \"info\"\n    },\n    {\n        \"admin_tags\": [],\n        \"code_snippet\": \"/*! @license DOMPurify 3.0.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.11/LICENSE */\\n!function(e,t){\\\"object\\\"==typeof exports\\u0026\\u0026\\\"undefined\\\"!=typeof module?module.exports=t():\\\"function\\\"==typeof define\\u0026\\u0026define.amd?define(t):(e=\\\"undefined\\\"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){\\\"use strict\\\";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}=\\\"undefined\\\"!=typeof Reflect\\u0026\\u0026Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=b(Array.prototype.forEach),m=b(Array.prototype.pop),p=b(Array.prototype.push),f=b(String.prototype.toLowerCase),d=b(String.prototype.toString),h=b(String.prototype.match),g=b(String.prototype.replace),T=b(String.prototype.indexOf),y=b(String.prototype.trim),E=b(Object.prototype.hasOwnProperty),A=b(RegExp.prototype.test),_=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n\\u003ce;n++)t[n]=arguments[n];return s(N,t)});var N;function b(e){return function(t){for(var n=arguments.length,o=new Array(n\\u003e1?n-1:0),r=1;r\\u003cn;r++)o[r-1]=arguments[r];return c(e,t,o)}}function S(e,o){let r=arguments.length\\u003e2\\u0026\\u0026void 0!==arguments[2]?arguments[2]:f;t\\u0026\\u0026t(e,null);let i=o.length;for(;i--;){let t=o[i];if(\\\"string\\\"==typeof t){const e=r(t);e!==t\\u0026\\u0026(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function R(e){for(let t=0;t\\u003ce.length;t++){E(e,t)||(e[t]=null)}return e}function w(t){const n=l(null);for(const[o,r]of e(t)){E(t,o)\\u0026\\u0026(Array.isArray(r)?n[o]=R(r):r\\u0026\\u0026\\\"object\\\"==typeof r\\u0026\\u0026r.constructor===Object?n[o]=w(r):n[o]=r)}return n}function L(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return b(n.get);if(\\\"function\\\"==typeof n.value)return b(n.value)}e=o(e)}return function(){return null}}const D=i([\\\"a\\\",\\\"abbr\\\",\\\"acronym\\\",\\\"address\\\",\\\"area\\\",\\\"article\\\",\\\"aside\\\",\\\"audio\\\",\\\"b\\\",\\\"bdi\\\",\\\"bdo\\\",\\\"big\\\",\\\"blink\\\",\\\"blockquote\\\",\\\"body\\\",\\\"br\\\",\\\"button\\\",\\\"canvas\\\",\\\"caption\\\",\\\"center\\\",\\\"cite\\\",\\\"code\\\",\\\"col\\\",\\\"colgroup\\\",\\\"content\\\",\\\"data\\\",\\\"datalist\\\",\\\"dd\\\",\\\"decorator\\\",\\\"del\\\",\\\"details\\\",\\\"dfn\\\",\\\"dialog\\\",\\\"dir\\\",\\\"div\\\",\\\"dl\\\",\\\"dt\\\",\\\"element\\\",\\\"em\\\",\\\"fieldset\\\",\\\"figcaption\\\",\\\"figure\\\",\\\"font\\\",\\\"footer\\\",\\\"form\\\",\\\"h1\\\",\\\"h2\\\",\\\"h3\\\",\\\"h4\\\",\\\"h5\\\",\\\"h6\\\",\\\"head\\\",\\\"header\\\",\\\"hgroup\\\",\\\"hr\\\",\\\"html\\\",\\\"i\\\",\\\"img\\\",\\\"input\\\",\\\"ins\\\",\\\"kbd\\\",\\\"label\\\",\\\"legend\\\",\\\"li\\\",\\\"main\\\",\\\"map\\\",\\\"mark\\\",\\\"marquee\\\",\\\"menu\\\",\\\"menuitem\\\",\\\"meter\\\",\\\"nav\\\",\\\"nobr\\\",\\\"ol\\\",\\\"optgroup\\\",\\\"option\\\",\\\"output\\\",\\\"p\\\",\\\"picture\\\",\\\"pre\\\",\\\"progress\\\",\\\"q\\\",\\\"rp\\\",\\\"rt\\\",\\\"ruby\\\",\\\"s\\\",\\\"samp\\\",\\\"section\\\",\\\"select\\\",\\\"shadow\\\",\\\"small\\\",\\\"source\\\",\\\"spacer\\\",\\\"span\\\",\\\"strike\\\",\\\"strong\\\",\\\"style\\\",\\\"sub\\\",\\\"summary\\\",\\\"sup\\\",\\\"table\\\",\\\"tbody\\\",\\\"td\\\",\\\"template\\\",\\\"textarea\\\",\\\"tfoot\\\",\\\"th\\\",\\\"thead\\\",\\\"time\\\",\\\"tr\\\",\\\"track\\\",\\\"tt\\\",\\\"u\\\",\\\"ul\\\",\\\"var\\\",\\\"video\\\",\\\"wbr\\\"]),C=i([\\\"svg\\\",\\\"a\\\",\\\"altglyph\\\",\\\"altglyphdef\\\",\\\"altglyphitem\\\",\\\"animatecolor\\\",\\\"animatemotion\\\",\\\"animatetransform\\\",\\\"circle\\\",\\\"clippath\\\",\\\"defs\\\",\\\"desc\\\",\\\"ellipse\\\",\\\"filter\\\",\\\"font\\\",\\\"g\\\",\\\"glyph\\\",\\\"glyphref\\\",\\\"hkern\\\",\\\"image\\\",\\\"line\\\",\\\"lineargradient\\\",\\\"marker\\\",\\\"mask\\\",\\\"metadata\\\",\\\"mpath\\\",\\\"path\\\",\\\"pattern\\\",\\\"polygon\\\",\\\"polyline\\\",\\\"radialgradient\\\",\\\"rect\\\",\\\"stop\\\",\\\"style\\\",\\\"switch\\\",\\\"symbol\\\",\\\"text\\\",\\\"textpath\\\",\\\"title\\\",\\\"tref\\\",\\\"tspan\\\",\\\"view\\\",\\\"vkern\\\"]),O=i([\\\"feBlend\\\",\\\"feColorMatrix\\\",\\\"feComponentTransfer\\\",\\\"feComposite\\\",\\\"feConvolveMatrix\\\",\\\"feDiffuseLighting\\\",\\\"feDisplacementMap\\\",\\\"feDistantLight\\\",\\\"feDropShadow\\\",\\\"feFlood\\\",\\\"feFuncA\\\",\\\"feFuncB\\\",\\\"feFuncG\\\",\\\"feFuncR\\\",\\\"feGaussianBlur\\\",\\\"feImage\\\",\\\"feMerge\\\",\\\"feMergeNode\\\",\\\"feMorphology\\\",\\\"feOffset\\\",\\\"fePointLight\\\",\\\"feSpecularLighting\\\",\\\"feSpotLight\\\",\\\"feTile\\\",\\\"feTurbulence\\\"]),x=i([\\\"animate\\\",\\\"color-profile\\\",\\\"cursor\\\",\\\"discard\\\",\\\"font-face\\\",\\\"font-face-format\\\",\\\"font-face-name\\\",\\\"font-face-src\\\",\\\"font-face-uri\\\",\\\"foreignobject\\\",\\\"hatch\\\",\\\"hatchpath\\\",\\\"mesh\\\",\\\"meshgradient\\\",\\\"meshpatch\\\",\\\"meshrow\\\",\\\"missing-glyph\\\",\\\"script\\\",\\\"set\\\",\\\"solidcolor\\\",\\\"unknown\\\",\\\"use\\\"]),v=i([\\\"math\\\",\\\"menclose\\\",\\\"merror\\\",\\\"mfenced\\\",\\\"mfrac\\\",\\\"mglyph\\\",\\\"mi\\\",\\\"mlabeledtr\\\",\\\"mmultiscripts\\\",\\\"mn\\\",\\\"mo\\\",\\\"mover\\\",\\\"mpadded\\\",\\\"mphantom\\\",\\\"mroot\\\",\\\"mrow\\\",\\\"ms\\\",\\\"mspace\\\",\\\"msqrt\\\",\\\"mstyle\\\",\\\"msub\\\",\\\"msup\\\",\\\"msubsup\\\",\\\"mtable\\\",\\\"mtd\\\",\\\"mtext\\\",\\\"mtr\\\",\\\"munder\\\",\\\"munderover\\\",\\\"mprescripts\\\"]),k=i([\\\"maction\\\",\\\"maligngroup\\\",\\\"malignmark\\\",\\\"mlongdiv\\\",\\\"mscarries\\\",\\\"mscarry\\\",\\\"msgroup\\\",\\\"mstack\\\",\\\"msline\\\",\\\"msrow\\\",\\\"semantics\\\",\\\"annotation\\\",\\\"annotation-xml\\\",\\\"mprescripts\\\",\\\"none\\\"]),M=i([\\\"#text\\\"]),I=i([\\\"accept\\\",\\\"action\\\",\\\"align\\\",\\\"alt\\\",\\\"autocapitalize\\\",\\\"autocomplete\\\",\\\"autopictureinpicture\\\",\\\"autoplay\\\",\\\"background\\\",\\\"bgcolor\\\",\\\"border\\\",\\\"capture\\\",\\\"cellpadding\\\",\\\"cellspacing\\\",\\\"checked\\\",\\\"cite\\\",\\\"class\\\",\\\"clear\\\",\\\"color\\\",\\\"cols\\\",\\\"colspan\\\",\\\"controls\\\",\\\"controlslist\\\",\\\"coords\\\",\\\"crossorigin\\\",\\\"datetime\\\",\\\"decoding\\\",\\\"default\\\",\\\"dir\\\",\\\"disabled\\\",\\\"disablepictureinpicture\\\",\\\"disableremoteplayback\\\",\\\"download\\\",\\\"draggable\\\",\\\"enctype\\\",\\\"enterkeyhint\\\",\\\"face\\\",\\\"for\\\",\\\"headers\\\",\\\"height\\\",\\\"hidden\\\",\\\"high\\\",\\\"href\\\",\\\"hreflang\\\",\\\"id\\\",\\\"inputmode\\\",\\\"integrity\\\",\\\"ismap\\\",\\\"kind\\\",\\\"label\\\",\\\"lang\\\",\\\"list\\\",\\\"loading\\\",\\\"loop\\\",\\\"low\\\",\\\"max\\\",\\\"maxlength\\\",\\\"media\\\",\\\"method\\\",\\\"min\\\",\\\"minlength\\\",\\\"multiple\\\",\\\"muted\\\",\\\"name\\\",\\\"nonce\\\",\\\"noshade\\\",\\\"novalidate\\\",\\\"nowrap\\\",\\\"open\\\",\\\"optimum\\\",\\\"pattern\\\",\\\"placeholder\\\",\\\"playsinline\\\",\\\"poster\\\",\\\"preload\\\",\\\"pubdate\\\",\\\"radiogroup\\\",\\\"readonly\\\",\\\"rel\\\",\\\"required\\\",\\\"rev\\\",\\\"reversed\\\",\\\"role\\\",\\\"rows\\\",\\\"rowspan\\\",\\\"spellcheck\\\",\\\"scope\\\",\\\"selected\\\",\\\"shape\\\",\\\"size\\\",\\\"sizes\\\",\\\"span\\\",\\\"srclang\\\",\\\"start\\\",\\\"src\\\",\\\"srcset\\\",\\\"step\\\",\\\"style\\\",\\\"summary\\\",\\\"tabindex\\\",\\\"title\\\",\\\"translate\\\",\\\"type\\\",\\\"usemap\\\",\\\"valign\\\",\\\"value\\\",\\\"width\\\",\\\"wrap\\\",\\\"xmlns\\\",\\\"slot\\\"]),U=i([\\\"accent-height\\\",\\\"accumulate\\\",\\\"additive\\\",\\\"alignment-baseline\\\",\\\"ascent\\\",\\\"attributename\\\",\\\"attributetype\\\",\\\"azimuth\\\",\\\"basefrequency\\\",\\\"baseline-shift\\\",\\\"begin\\\",\\\"bias\\\",\\\"by\\\",\\\"class\\\",\\\"clip\\\",\\\"clippathunits\\\",\\\"clip-path\\\",\\\"clip-rule\\\",\\\"color\\\",\\\"color-interpolation\\\",\\\"color-interpolation-filters\\\",\\\"color-profile\\\",\\\"color-rendering\\\",\\\"cx\\\",\\\"cy\\\",\\\"d\\\",\\\"dx\\\",\\\"dy\\\",\\\"diffuseconstant\\\",\\\"direction\\\",\\\"display\\\",\\\"divisor\\\",\\\"dur\\\",\\\"edgemode\\\",\\\"elevation\\\",\\\"end\\\",\\\"fill\\\",\\\"fill-opacity\\\",\\\"fill-rule\\\",\\\"filter\\\",\\\"filterunits\\\",\\\"flood-color\\\",\\\"flood-opacity\\\",\\\"font-family\\\",\\\"font-size\\\",\\\"font-size-adjust\\\",\\\"font-stretch\\\",\\\"font-style\\\",\\\"font-variant\\\",\\\"font-weight\\\",\\\"fx\\\",\\\"fy\\\",\\\"g1\\\",\\\"g2\\\",\\\"glyph-name\\\",\\\"glyphref\\\",\\\"gradientunits\\\",\\\"gradienttransform\\\",\\\"height\\\",\\\"href\\\",\\\"id\\\",\\\"image-rendering\\\",\\\"in\\\",\\\"in2\\\",\\\"k\\\",\\\"k1\\\",\\\"k2\\\",\\\"k3\\\",\\\"k4\\\",\\\"kerning\\\",\\\"keypoints\\\",\\\"keysplines\\\",\\\"keytimes\\\",\\\"lang\\\",\\\"lengthadjust\\\",\\\"letter-spacing\\\",\\\"kernelmatrix\\\",\\\"kernelunitlength\\\",\\\"lighting-color\\\",\\\"local\\\",\\\"marker-end\\\",\\\"marker-mid\\\",\\\"marker-start\\\",\\\"markerheight\\\",\\\"markerunits\\\",\\\"markerwidth\\\",\\\"maskcontentunits\\\",\\\"maskunits\\\",\\\"max\\\",\\\"mask\\\",\\\"media\\\",\\\"method\\\",\\\"mode\\\",\\\"min\\\",\\\"name\\\",\\\"numoctaves\\\",\\\"offset\\\",\\\"operator\\\",\\\"opacity\\\",\\\"order\\\",\\\"orient\\\",\\\"orientation\\\",\\\"origin\\\",\\\"overflow\\\",\\\"paint-order\\\",\\\"path\\\",\\\"pathlength\\\",\\\"patterncontentunits\\\",\\\"patterntransform\\\",\\\"patternunits\\\",\\\"points\\\",\\\"preservealpha\\\",\\\"preserveaspectratio\\\",\\\"primitiveunits\\\",\\\"r\\\",\\\"rx\\\",\\\"ry\\\",\\\"radius\\\",\\\"refx\\\",\\\"refy\\\",\\\"repeatcount\\\",\\\"repeatdur\\\",\\\"restart\\\",\\\"result\\\",\\\"rotate\\\",\\\"scale\\\",\\\"seed\\\",\\\"shape-rendering\\\",\\\"specularconstant\\\",\\\"specularexponent\\\",\\\"spreadmethod\\\",\\\"startoffset\\\",\\\"stddeviation\\\",\\\"stitchtiles\\\",\\\"stop-color\\\",\\\"stop-opacity\\\",\\\"stroke-dasharray\\\",\\\"stroke-dashoffset\\\",\\\"stroke-linecap\\\",\\\"stroke-linejoin\\\",\\\"stroke-miterlimit\\\",\\\"stroke-opacity\\\",\\\"stroke\\\",\\\"stroke-width\\\",\\\"style\\\",\\\"surfacescale\\\",\\\"systemlanguage\\\",\\\"tabindex\\\",\\\"targetx\\\",\\\"targety\\\",\\\"transform\\\",\\\"transform-origin\\\",\\\"text-anchor\\\",\\\"text-decoration\\\",\\\"text-rendering\\\",\\\"textlength\\\",\\\"type\\\",\\\"u1\\\",\\\"u2\\\",\\\"unicode\\\",\\\"values\\\",\\\"viewbox\\\",\\\"visibility\\\",\\\"version\\\",\\\"vert-adv-y\\\",\\\"vert-origin-x\\\",\\\"vert-origin-y\\\",\\\"width\\\",\\\"word-spacing\\\",\\\"wrap\\\",\\\"writing-mode\\\",\\\"xchannelselector\\\",\\\"ychannelselector\\\",\\\"x\\\",\\\"x1\\\",\\\"x2\\\",\\\"xmlns\\\",\\\"y\\\",\\\"y1\\\",\\\"y2\\\",\\\"z\\\",\\\"zoomandpan\\\"]),P=i([\\\"accent\\\",\\\"accentunder\\\",\\\"align\\\",\\\"bevelled\\\",\\\"close\\\",\\\"columnsalign\\\",\\\"columnlines\\\",\\\"columnspan\\\",\\\"denomalign\\\",\\\"depth\\\",\\\"dir\\\",\\\"display\\\",\\\"displaystyle\\\",\\\"encoding\\\",\\\"fence\\\",\\\"frame\\\",\\\"height\\\",\\\"href\\\",\\\"id\\\",\\\"largeop\\\",\\\"length\\\",\\\"linethickness\\\",\\\"lspace\\\",\\\"lquote\\\",\\\"mathbackground\\\",\\\"mathcolor\\\",\\\"mathsize\\\",\\\"mathvariant\\\",\\\"maxsize\\\",\\\"minsize\\\",\\\"movablelimits\\\",\\\"notation\\\",\\\"numalign\\\",\\\"open\\\",\\\"rowalign\\\",\\\"rowlines\\\",\\\"rowspacing\\\",\\\"rowspan\\\",\\\"rspace\\\",\\\"rquote\\\",\\\"scriptlevel\\\",\\\"scriptminsize\\\",\\\"scriptsizemultiplier\\\",\\\"selection\\\",\\\"separator\\\",\\\"separators\\\",\\\"stretchy\\\",\\\"subscriptshift\\\",\\\"supscriptshift\\\",\\\"symmetric\\\",\\\"voffset\\\",\\\"width\\\",\\\"xmlns\\\"]),F=i([\\\"xlink:href\\\",\\\"xml:id\\\",\\\"xlink:title\\\",\\\"xml:space\\\",\\\"xmlns:xlink\\\"]),H=a(/\\\\{\\\\{[\\\\w\\\\W]*|[\\\\w\\\\W]*\\\\}\\\\}/gm),z=a(/\\u003c%[\\\\w\\\\W]*|[\\\\w\\\\W]*%\\u003e/gm),B=a(/\\\\${[\\\\w\\\\W]*}/gm),W=a(/^data-[\\\\-\\\\w.\\\\u00B7-\\\\uFFFF]/),G=a(/^aria-[\\\\-\\\\w]+$/),Y=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\\\-]+(?:[^a-z+.\\\\-:]|$))/i),j=a(/^(?:\\\\w+script|data):/i),X=a(/[\\\\u0000-\\\\u0020\\\\u00A0\\\\u1680\\\\u180E\\\\u2000-\\\\u2029\\\\u205F\\\\u3000]/g),q=a(/^html$/i),$=a(/^[a-z][.\\\\w]*(-[.\\\\w]+)+$/i);var K=Object.freeze({__proto__:null,MUSTACHE_EXPR:H,ERB_EXPR:z,TMPLIT_EXPR:B,DATA_ATTR:W,ARIA_ATTR:G,IS_ALLOWED_URI:Y,IS_SCRIPT_OR_DATA:j,ATTR_WHITESPACE:X,DOCTYPE_NAME:q,CUSTOM_ELEMENT:$});const V=function(){return\\\"undefined\\\"==typeof window?null:window},Z=function(e,t){if(\\\"object\\\"!=typeof e||\\\"function\\\"!=typeof e.createPolicy)return null;let n=null;const o=\\\"data-tt-policy-suffix\\\";t\\u0026\\u0026t.hasAttribute(o)\\u0026\\u0026(n=t.getAttribute(o));const r=\\\"dompurify\\\"+(n?\\\"#\\\"+n:\\\"\\\");try{return e.createPolicy(r,{createHTML:e=\\u003ee,createScriptURL:e=\\u003ee})}catch(e){return console.warn(\\\"TrustedTypes policy \\\"+r+\\\" could not be created.\\\"),null}};var J=function t(){let n=arguments.length\\u003e0\\u0026\\u0026void 0!==arguments[0]?arguments[0]:V();const o=e=\\u003et(e);if(o.version=\\\"3.0.11\\\",o.removed=[],!n||!n.document||9!==n.document.nodeType)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:b,Element:R,NodeFilter:H,NamedNodeMap:z=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:B,DOMParser:W,trustedTypes:G}=n,j=R.prototype,X=L(j,\\\"cloneNode\\\"),$=L(j,\\\"nextSibling\\\"),J=L(j,\\\"childNodes\\\"),Q=L(j,\\\"parentNode\\\");if(\\\"function\\\"==typeof N){const e=r.createElement(\\\"template\\\");e.content\\u0026\\u0026e.content.ownerDocument\\u0026\\u0026(r=e.content.ownerDocument)}let ee,te=\\\"\\\";const{implementation:ne,createNodeIterator:oe,createDocumentFragment:re,getElementsByTagName:ie}=r,{importNode:ae}=a;let le={};o.isSupported=\\\"function\\\"==typeof e\\u0026\\u0026\\\"function\\\"==typeof Q\\u0026\\u0026ne\\u0026\\u0026void 0!==ne.createHTMLDocument;const{MUSTACHE_EXPR:ce,ERB_EXPR:se,TMPLIT_EXPR:ue,DATA_ATTR:me,ARIA_ATTR:pe,IS_SCRIPT_OR_DATA:fe,ATTR_WHITESPACE:de,CUSTOM_ELEMENT:he}=K;let{IS_ALLOWED_URI:ge}=K,Te=null;const ye=S({},[...D,...C,...O,...v,...M]);let Ee=null;const Ae=S({},[...I,...U,...P,...F]);let _e=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ne=null,be=null,Se=!0,Re=!0,we=!1,Le=!0,De=!1,Ce=!0,Oe=!1,xe=!1,ve=!1,ke=!1,Me=!1,Ie=!1,Ue=!0,Pe=!1;const Fe=\\\"user-content-\\\";let He=!0,ze=!1,Be={},We=null;const Ge=S({},[\\\"annotation-xml\\\",\\\"audio\\\",\\\"colgroup\\\",\\\"desc\\\",\\\"foreignobject\\\",\\\"head\\\",\\\"iframe\\\",\\\"math\\\",\\\"mi\\\",\\\"mn\\\",\\\"mo\\\",\\\"ms\\\",\\\"mtext\\\",\\\"noembed\\\",\\\"noframes\\\",\\\"noscript\\\",\\\"plaintext\\\",\\\"script\\\",\\\"style\\\",\\\"svg\\\",\\\"template\\\",\\\"thead\\\",\\\"title\\\",\\\"video\\\",\\\"xmp\\\"]);let Ye=null;const je=S({},[\\\"audio\\\",\\\"video\\\",\\\"img\\\",\\\"source\\\",\\\"image\\\",\\\"track\\\"]);let Xe=null;const qe=S({},[\\\"alt\\\",\\\"class\\\",\\\"for\\\",\\\"id\\\",\\\"label\\\",\\\"name\\\",\\\"pattern\\\",\\\"placeholder\\\",\\\"role\\\",\\\"summary\\\",\\\"title\\\",\\\"value\\\",\\\"style\\\",\\\"xmlns\\\"]),$e=\\\"http://www.w3.org/1998/Math/MathML\\\",Ke=\\\"http://www.w3.org/2000/svg\\\",Ve=\\\"http://www.w3.org/1999/xhtml\\\";let Ze=Ve,Je=!1,Qe=null;const et=S({},[$e,Ke,Ve],d);let tt=null;const nt=[\\\"application/xhtml+xml\\\",\\\"text/html\\\"],ot=\\\"text/html\\\";let rt=null,it=null;const at=r.createElement(\\\"form\\\"),lt=function(e){return e instanceof RegExp||e instanceof Function},ct=function(){let e=arguments.length\\u003e0\\u0026\\u0026void 0!==arguments[0]?arguments[0]:{};if(!it||it!==e){if(e\\u0026\\u0026\\\"object\\\"==typeof e||(e={}),e=w(e),tt=-1===nt.indexOf(e.PARSER_MEDIA_TYPE)?ot:e.PARSER_MEDIA_TYPE,rt=\\\"application/xhtml+xml\\\"===tt?d:f,Te=E(e,\\\"ALLOWED_TAGS\\\")?S({},e.ALLOWED_TAGS,rt):ye,Ee=E(e,\\\"ALLOWED_ATTR\\\")?S({},e.ALLOWED_ATTR,rt):Ae,Qe=E(e,\\\"ALLOWED_NAMESPACES\\\")?S({},e.ALLOWED_NAMESPACES,d):et,Xe=E(e,\\\"ADD_URI_SAFE_ATTR\\\")?S(w(qe),e.ADD_URI_SAFE_ATTR,rt):qe,Ye=E(e,\\\"ADD_DATA_URI_TAGS\\\")?S(w(je),e.ADD_DATA_URI_TAGS,rt):je,We=E(e,\\\"FORBID_CONTENTS\\\")?S({},e.FORBID_CONTENTS,rt):Ge,Ne=E(e,\\\"FORBID_TAGS\\\")?S({},e.FORBID_TAGS,rt):{},be=E(e,\\\"FORBID_ATTR\\\")?S({},e.FORBID_ATTR,rt):{},Be=!!E(e,\\\"USE_PROFILES\\\")\\u0026\\u0026e.USE_PROFILES,Se=!1!==e.ALLOW_ARIA_ATTR,Re=!1!==e.ALLOW_DATA_ATTR,we=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Le=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,De=e.SAFE_FOR_TEMPLATES||!1,Ce=!1!==e.SAFE_FOR_XML,Oe=e.WHOLE_DOCUMENT||!1,ke=e.RETURN_DOM||!1,Me=e.RETURN_DOM_FRAGMENT||!1,Ie=e.RETURN_TRUSTED_TYPE||!1,ve=e.FORCE_BODY||!1,Ue=!1!==e.SANITIZE_DOM,Pe=e.SANITIZE_NAMED_PROPS||!1,He=!1!==e.KEEP_CONTENT,ze=e.IN_PLACE||!1,ge=e.ALLOWED_URI_REGEXP||Y,Ze=e.NAMESPACE||Ve,_e=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING\\u0026\\u0026lt(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)\\u0026\\u0026(_e.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING\\u0026\\u0026lt(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)\\u0026\\u0026(_e.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING\\u0026\\u0026\\\"boolean\\\"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements\\u0026\\u0026(_e.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),De\\u0026\\u0026(Re=!1),Me\\u0026\\u0026(ke=!0),Be\\u0026\\u0026(Te=S({},M),Ee=[],!0===Be.html\\u0026\\u0026(S(Te,D),S(Ee,I)),!0===Be.svg\\u0026\\u0026(S(Te,C),S(Ee,U),S(Ee,F)),!0===Be.svgFilters\\u0026\\u0026(S(Te,O),S(Ee,U),S(Ee,F)),!0===Be.mathMl\\u0026\\u0026(S(Te,v),S(Ee,P),S(Ee,F))),e.ADD_TAGS\\u0026\\u0026(Te===ye\\u0026\\u0026(Te=w(Te)),S(Te,e.ADD_TAGS,rt)),e.ADD_ATTR\\u0026\\u0026(Ee===Ae\\u0026\\u0026(Ee=w(Ee)),S(Ee,e.ADD_ATTR,rt)),e.ADD_URI_SAFE_ATTR\\u0026\\u0026S(Xe,e.ADD_URI_SAFE_ATTR,rt),e.FORBID_CONTENTS\\u0026\\u0026(We===Ge\\u0026\\u0026(We=w(We)),S(We,e.FORBID_CONTENTS,rt)),He\\u0026\\u0026(Te[\\\"#text\\\"]=!0),Oe\\u0026\\u0026S(Te,[\\\"html\\\",\\\"head\\\",\\\"body\\\"]),Te.table\\u0026\\u0026(S(Te,[\\\"tbody\\\"]),delete Ne.tbody),e.TRUSTED_TYPES_POLICY){if(\\\"function\\\"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw _('TRUSTED_TYPES_POLICY configuration option must provide a \\\"createHTML\\\" hook.');if(\\\"function\\\"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw _('TRUSTED_TYPES_POLICY configuration option must provide a \\\"createScriptURL\\\" hook.');ee=e.TRUSTED_TYPES_POLICY,te=ee.createHTML(\\\"\\\")}else void 0===ee\\u0026\\u0026(ee=Z(G,c)),null!==ee\\u0026\\u0026\\\"string\\\"==typeof te\\u0026\\u0026(te=ee.createHTML(\\\"\\\"));i\\u0026\\u0026i(e),it=e}},st=S({},[\\\"mi\\\",\\\"mo\\\",\\\"mn\\\",\\\"ms\\\",\\\"mtext\\\"]),ut=S({},[\\\"foreignobject\\\",\\\"desc\\\",\\\"title\\\",\\\"annotation-xml\\\"]),mt=S({},[\\\"title\\\",\\\"style\\\",\\\"font\\\",\\\"a\\\",\\\"script\\\"]),pt=S({},[...C,...O,...x]),ft=S({},[...v,...k]),dt=function(e){let t=Q(e);t\\u0026\\u0026t.tagName||(t={namespaceURI:Ze,tagName:\\\"template\\\"});const n=f(e.tagName),o=f(t.tagName);return!!Qe[e.namespaceURI]\\u0026\\u0026(e.namespaceURI===Ke?t.namespaceURI===Ve?\\\"svg\\\"===n:t.namespaceURI===$e?\\\"svg\\\"===n\\u0026\\u0026(\\\"annotation-xml\\\"===o||st[o]):Boolean(pt[n]):e.namespaceURI===$e?t.namespaceURI===Ve?\\\"math\\\"===n:t.namespaceURI===Ke?\\\"math\\\"===n\\u0026\\u0026ut[o]:Boolean(ft[n]):e.namespaceURI===Ve?!(t.namespaceURI===Ke\\u0026\\u0026!ut[o])\\u0026\\u0026(!(t.namespaceURI===$e\\u0026\\u0026!st[o])\\u0026\\u0026(!ft[n]\\u0026\\u0026(mt[n]||!pt[n]))):!(\\\"application/xhtml+xml\\\"!==tt||!Qe[e.namespaceURI]))},ht=function(e){p(o.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},gt=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),\\\"is\\\"===e\\u0026\\u0026!Ee[e])if(ke||Me)try{ht(t)}catch(e){}else try{t.setAttribute(e,\\\"\\\")}catch(e){}},Tt=function(e){let t=null,n=null;if(ve)e=\\\"\\u003cremove\\u003e\\u003c/remove\\u003e\\\"+e;else{const t=h(e,/^[\\\\r\\\\n\\\\t ]+/);n=t\\u0026\\u0026t[0]}\\\"application/xhtml+xml\\\"===tt\\u0026\\u0026Ze===Ve\\u0026\\u0026(e='\\u003chtml xmlns=\\\"http://www.w3.org/1999/xhtml\\\"\\u003e\\u003chead\\u003e\\u003c/head\\u003e\\u003cbody\\u003e'+e+\\\"\\u003c/body\\u003e\\u003c/html\\u003e\\\");const o=ee?ee.createHTML(e):e;if(Ze===Ve)try{t=(new W).parseFromString(o,tt)}catch(e){}if(!t||!t.documentElement){t=ne.createDocument(Ze,\\\"template\\\",null);try{t.documentElement.innerHTML=Je?te:o}catch(e){}}const i=t.body||t.documentElement;return e\\u0026\\u0026n\\u0026\\u0026i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Ze===Ve?ie.call(t,Oe?\\\"html\\\":\\\"body\\\")[0]:Oe?t.documentElement:i},yt=function(e){return oe.call(e.ownerDocument||e,e,H.SHOW_ELEMENT|H.SHOW_COMMENT|H.SHOW_TEXT|H.SHOW_PROCESSING_INSTRUCTION|H.SHOW_CDATA_SECTION,null)},Et=function(e){return e instanceof B\\u0026\\u0026(\\\"string\\\"!=typeof e.nodeName||\\\"string\\\"!=typeof e.textContent||\\\"function\\\"!=typeof e.removeChild||!(e.attributes instanceof z)||\\\"function\\\"!=typeof e.removeAttribute||\\\"function\\\"!=typeof e.setAttribute||\\\"string\\\"!=typeof e.namespaceURI||\\\"function\\\"!=typeof e.insertBefore||\\\"function\\\"!=typeof e.hasChildNodes)},At=function(e){return\\\"function\\\"==typeof b\\u0026\\u0026e instanceof b},_t=function(e,t,n){le[e]\\u0026\\u0026u(le[e],(e=\\u003e{e.call(o,t,n,it)}))},Nt=function(e){let t=null;if(_t(\\\"beforeSanitizeElements\\\",e,null),Et(e))return ht(e),!0;const n=rt(e.nodeName);if(_t(\\\"uponSanitizeElement\\\",e,{tagName:n,allowedTags:Te}),e.hasChildNodes()\\u0026\\u0026!At(e.firstElementChild)\\u0026\\u0026A(/\\u003c[/\\\\w]/g,e.innerHTML)\\u0026\\u0026A(/\\u003c[/\\\\w]/g,e.textContent))return ht(e),!0;if(7===e.nodeType)return ht(e),!0;if(Ce\\u0026\\u00268===e.nodeType\\u0026\\u0026A(/\\u003c[/\\\\w]/g,e.data))return ht(e),!0;if(!Te[n]||Ne[n]){if(!Ne[n]\\u0026\\u0026St(n)){if(_e.tagNameCheck instanceof RegExp\\u0026\\u0026A(_e.tagNameCheck,n))return!1;if(_e.tagNameCheck instanceof Function\\u0026\\u0026_e.tagNameCheck(n))return!1}if(He\\u0026\\u0026!We[n]){const t=Q(e)||e.parentNode,n=J(e)||e.childNodes;if(n\\u0026\\u0026t){for(let o=n.length-1;o\\u003e=0;--o)t.insertBefore(X(n[o],!0),$(e))}}return ht(e),!0}return e instanceof R\\u0026\\u0026!dt(e)?(ht(e),!0):\\\"noscript\\\"!==n\\u0026\\u0026\\\"noembed\\\"!==n\\u0026\\u0026\\\"noframes\\\"!==n||!A(/\\u003c\\\\/no(script|embed|frames)/i,e.innerHTML)?(De\\u0026\\u00263===e.nodeType\\u0026\\u0026(t=e.textContent,u([ce,se,ue],(e=\\u003e{t=g(t,e,\\\" \\\")})),e.textContent!==t\\u0026\\u0026(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),_t(\\\"afterSanitizeElements\\\",e,null),!1):(ht(e),!0)},bt=function(e,t,n){if(Ue\\u0026\\u0026(\\\"id\\\"===t||\\\"name\\\"===t)\\u0026\\u0026(n in r||n in at))return!1;if(Re\\u0026\\u0026!be[t]\\u0026\\u0026A(me,t));else if(Se\\u0026\\u0026A(pe,t));else if(!Ee[t]||be[t]){if(!(St(e)\\u0026\\u0026(_e.tagNameCheck instanceof RegExp\\u0026\\u0026A(_e.tagNameCheck,e)||_e.tagNameCheck instanceof Function\\u0026\\u0026_e.tagNameCheck(e))\\u0026\\u0026(_e.attributeNameCheck instanceof RegExp\\u0026\\u0026A(_e.attributeNameCheck,t)||_e.attributeNameCheck instanceof Function\\u0026\\u0026_e.attributeNameCheck(t))||\\\"is\\\"===t\\u0026\\u0026_e.allowCustomizedBuiltInElements\\u0026\\u0026(_e.tagNameCheck instanceof RegExp\\u0026\\u0026A(_e.tagNameCheck,n)||_e.tagNameCheck instanceof Function\\u0026\\u0026_e.tagNameCheck(n))))return!1}else if(Xe[t]);else if(A(ge,g(n,de,\\\"\\\")));else if(\\\"src\\\"!==t\\u0026\\u0026\\\"xlink:href\\\"!==t\\u0026\\u0026\\\"href\\\"!==t||\\\"script\\\"===e||0!==T(n,\\\"data:\\\")||!Ye[e]){if(we\\u0026\\u0026!A(fe,g(n,de,\\\"\\\")));else if(n)return!1}else;return!0},St=function(e){return\\\"annotation-xml\\\"!==e\\u0026\\u0026h(e,he)},Rt=function(e){_t(\\\"beforeSanitizeAttributes\\\",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:\\\"\\\",attrValue:\\\"\\\",keepAttr:!0,allowedAttributes:Ee};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=rt(a);let p=\\\"value\\\"===a?c:y(c);if(n.attrName=s,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,_t(\\\"uponSanitizeAttribute\\\",e,n),p=n.attrValue,n.forceKeepAttr)continue;if(gt(a,e),!n.keepAttr)continue;if(!Le\\u0026\\u0026A(/\\\\/\\u003e/i,p)){gt(a,e);continue}De\\u0026\\u0026u([ce,se,ue],(e=\\u003e{p=g(p,e,\\\" \\\")}));const f=rt(e.nodeName);if(bt(f,s,p)){if(!Pe||\\\"id\\\"!==s\\u0026\\u0026\\\"name\\\"!==s||(gt(a,e),p=Fe+p),ee\\u0026\\u0026\\\"object\\\"==typeof G\\u0026\\u0026\\\"function\\\"==typeof G.getAttributeType)if(l);else switch(G.getAttributeType(f,s)){case\\\"TrustedHTML\\\":p=ee.createHTML(p);break;case\\\"TrustedScriptURL\\\":p=ee.createScriptURL(p)}try{l?e.setAttributeNS(l,a,p):e.setAttribute(a,p),m(o.removed)}catch(e){}}}_t(\\\"afterSanitizeAttributes\\\",e,null)},wt=function e(t){let n=null;const o=yt(t);for(_t(\\\"beforeSanitizeShadowDOM\\\",t,null);n=o.nextNode();)_t(\\\"uponSanitizeShadowNode\\\",n,null),Nt(n)||(n.content instanceof s\\u0026\\u0026e(n.content),Rt(n));_t(\\\"afterSanitizeShadowDOM\\\",t,null)};return o.sanitize=function(e){let t=arguments.length\\u003e1\\u0026\\u0026void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(Je=!e,Je\\u0026\\u0026(e=\\\"\\\\x3c!--\\\\x3e\\\"),\\\"string\\\"!=typeof e\\u0026\\u0026!At(e)){if(\\\"function\\\"!=typeof e.toString)throw _(\\\"toString is not a function\\\");if(\\\"string\\\"!=typeof(e=e.toString()))throw _(\\\"dirty is not a string, aborting\\\")}if(!o.isSupported)return e;if(xe||ct(t),o.removed=[],\\\"string\\\"==typeof e\\u0026\\u0026(ze=!1),ze){if(e.nodeName){const t=rt(e.nodeName);if(!Te[t]||Ne[t])throw _(\\\"root node is forbidden and cannot be sanitized in-place\\\")}}else if(e instanceof b)n=Tt(\\\"\\\\x3c!----\\\\x3e\\\"),r=n.ownerDocument.importNode(e,!0),1===r.nodeType\\u0026\\u0026\\\"BODY\\\"===r.nodeName||\\\"HTML\\\"===r.nodeName?n=r:n.appendChild(r);else{if(!ke\\u0026\\u0026!De\\u0026\\u0026!Oe\\u0026\\u0026-1===e.indexOf(\\\"\\u003c\\\"))return ee\\u0026\\u0026Ie?ee.createHTML(e):e;if(n=Tt(e),!n)return ke?null:Ie?te:\\\"\\\"}n\\u0026\\u0026ve\\u0026\\u0026ht(n.firstChild);const c=yt(ze?e:n);for(;i=c.nextNode();)Nt(i)||(i.content instanceof s\\u0026\\u0026wt(i.content),Rt(i));if(ze)return e;if(ke){if(Me)for(l=re.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Ee.shadowroot||Ee.shadowrootmode)\\u0026\\u0026(l=ae.call(a,l,!0)),l}let m=Oe?n.outerHTML:n.innerHTML;return Oe\\u0026\\u0026Te[\\\"!doctype\\\"]\\u0026\\u0026n.ownerDocument\\u0026\\u0026n.ownerDocument.doctype\\u0026\\u0026n.ownerDocument.doctype.name\\u0026\\u0026A(q,n.ownerDocument.doctype.name)\\u0026\\u0026(m=\\\"\\u003c!DOCTYPE \\\"+n.ownerDocument.doctype.name+\\\"\\u003e\\\\n\\\"+m),De\\u0026\\u0026u([ce,se,ue],(e=\\u003e{m=g(m,e,\\\" \\\")})),ee\\u0026\\u0026Ie?ee.createHTML(m):m},o.setConfig=function(){let e=arguments.length\\u003e0\\u0026\\u0026void 0!==arguments[0]?arguments[0]:{};ct(e),xe=!0},o.clearConfig=function(){it=null,xe=!1},o.isValidAttribute=function(e,t,n){it||ct({});const o=rt(e),r=rt(t);return bt(o,r,n)},o.addHook=function(e,t){\\\"function\\\"==typeof t\\u0026\\u0026(le[e]=le[e]||[],p(le[e],t))},o.removeHook=function(e){if(le[e])return m(le[e])},o.removeHooks=function(e){le[e]\\u0026\\u0026(le[e]=[])},o.removeAllHooks=function(){le={}},o}();return J}));\\n//# sourceMappingURL=purify.min.js.map\\n\",\n        \"description\": \"Vendored file identified (upstream known, hash not verified)\",\n        \"file_path\": \"kjweb_async/purify.min.js\",\n        \"issue_type\": \"vendored_known\",\n        \"line_number\": 1,\n        \"line_snippet\": \"/*! @license DOMPurify 3.0.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.11/LICENSE */\",\n        \"metadata\": {\n            \"detection_reason\": \"minified JS file\",\n            \"ecosystem\": \"js\",\n            \"identification_method\": \"header_comment\",\n            \"upstream_package\": \"DOMPurify\",\n            \"upstream_version\": \"3.0.11\"\n        },\n        \"recommendation\": null,\n        \"scanner\": \"provenance_scan\",\n        \"severity\": \"info\"\n    }\n]","supported_accelerators":[],"supported_comfyui_frontend_version":"","supported_comfyui_version":"","supported_os":[],"tags":[],"tags_admin":[],"version":"1.5.2"}]}
